{"matchId":"30101233","creationMatch":"exact_match","runtimeMatch":"exact_match","verifiedAt":"2026-05-27T23:48:14Z","creationBytecode":{"onchainBytecode":"0x608060405234801561000f575f5ffd5b5060405161071838038061071883398101604081905261002e916100c3565b600180546001600160a01b0319166001600160a01b03831617905561005282610059565b50506100f4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100be575f5ffd5b919050565b5f5f604083850312156100d4575f5ffd5b6100dd836100a8565b91506100eb602084016100a8565b90509250929050565b610617806101015f395ff3fe608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033000000000000000000000000461b62cb3a7e9df8f800ae058ae92f855f2c27ca000000000000000000000000536d4e9c0944de2ac6657d610aa99fa5e97ce493","recompiledBytecode":"0x608060405234801561000f575f5ffd5b5060405161071838038061071883398101604081905261002e916100c3565b600180546001600160a01b0319166001600160a01b03831617905561005282610059565b50506100f4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100be575f5ffd5b919050565b5f5f604083850312156100d4575f5ffd5b6100dd836100a8565b91506100eb602084016100a8565b90509250929050565b610617806101015f395ff3fe608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","sourceMap":"382:2870:3:-:0;;;736:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;796:11;:26;;-1:-1:-1;;;;;;796:26:3;-1:-1:-1;;;;;796:26:3;;;;;832;851:6;832:18;:26::i;:::-;736:129;;382:2870;;1213:185:4;1286:16;1305:5;;-1:-1:-1;;;;;1320:16:4;;;-1:-1:-1;;;;;;1320:16:4;;;;;;1351:40;;1305:5;;;;;;;1351:40;;1286:16;1351:40;1276:122;1213:185;:::o;14:177:9:-;93:13;;-1:-1:-1;;;;;135:31:9;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;:::-;382:2870:3;;;;;;","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","offset":1763}},"transformations":[{"type":"insert","offset":1816,"reason":"constructorArguments"}],"transformationValues":{"constructorArguments":"0x000000000000000000000000461b62cb3a7e9df8f800ae058ae92f855f2c27ca000000000000000000000000536d4e9c0944de2ac6657d610aa99fa5e97ce493"}},"runtimeBytecode":{"onchainBytecode":"0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","recompiledBytecode":"0x608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","sourceMap":"382:2870:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;528:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;571:14:9;;564:22;546:41;;534:2;519:18;528:50:3;;;;;;;;585:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;441:26;;;;;;;;;;;;774:42:9;762:55;;;744:74;;732:2;717:18;441:26:3;598:226:9;3085:165:3;;;;;;:::i;:::-;;:::i;:::-;;102:20:4;;;;;;;;;1946:225:3;;;;;;:::i;:::-;;:::i;2527:252::-;;;;;;:::i;:::-;;:::i;1461:151::-;;;;;;:::i;:::-;;:::i;844:215:4:-;;;;;;:::i;:::-;;:::i;474:47:3:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3085:165;435:13:4;:11;:13::i;:::-;3168:17:3::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;;:29;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;3212:31;;1349:74:9;;;1439:18;;;1432:50;3212:31:3::1;::::0;1322:18:9;3212:31:3::1;;;;;;;;3085:165:::0;;:::o;1946:225::-;435:13:4;:11;:13::i;:::-;2049:30:3::1;::::0;::::1;;::::0;;;:15:::1;:30;::::0;;;;;;;;:49;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;2113:51;;1349:74:9;;;1439:18;;;1432:50;2113:51:3::1;::::0;1322:18:9;2113:51:3::1;1181:307:9::0;2527:252:3;435:13:4;:11;:13::i;:::-;2639:36:3::1;::::0;::::1;;::::0;;;:18:::1;:36;::::0;;;;;;;;:58;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;2712:60;;1349:74:9;;;1439:18;;;1432:50;2712:60:3::1;::::0;1322:18:9;2712:60:3::1;1181:307:9::0;1461:151:3;435:13:4;:11;:13::i;:::-;1536:11:3::1;:26:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;1577:28:::1;::::0;744:74:9;;;1577:28:3::1;::::0;732:2:9;717:18;1577:28:3::1;;;;;;;1461:151:::0;:::o;844:215:4:-;435:13;:11;:13::i;:::-;928:22:::1;::::0;::::1;924:91;;973:31;::::0;::::1;::::0;;1001:1:::1;973:31;::::0;::::1;744:74:9::0;717:18;;973:31:4::1;;;;;;;;924:91;1024:28;1043:8;1024:18;:28::i;:::-;844:215:::0;:::o;539:156::-;598:5;;:19;:5;607:10;598:19;594:95;;640:38;;;;;667:10;640:38;;;744:74:9;717:18;;640:38:4;598:226:9;594:95:4;539:156::o;1213:185::-;1286:16;1305:5;;;1320:16;;;;;;;;;;1351:40;;1305:5;;;;;;;1351:40;;1286:16;1351:40;1276:122;1213:185;:::o;14:196:9:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;:::-;356:39;215:186;-1:-1:-1;;;215:186:9:o;829:347::-;894:6;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;:::-;984:39;;1073:2;1062:9;1058:18;1045:32;1120:5;1113:13;1106:21;1099:5;1096:32;1086:60;;1142:1;1139;1132:12;1086:60;1165:5;1155:15;;;829:347;;;;;:::o","linkReferences":{},"cborAuxdata":{"1":{"value":"0xa2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","offset":1506}},"immutableReferences":{},"transformations":[],"transformationValues":{}},"deployment":{"transactionHash":"0x5dc592ff0a050ca4767810f354597f55c5c4b2b65608ec4cd6c5241f7fe71d4a","blockNumber":"24442024","transactionIndex":"201","deployer":"0xe08c2512F87cF63fb7D2325EDd08aEC7920aC2f6"},"sources":{"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"src/interfaces/internals/USG/IControlTower.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IERC20, IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\nimport {IDebtIR} from \"./IDebtIR.sol\";\n\ninterface IControlTower {\n    function isMarketCreator(address marketCreator) external view returns (bool);\n\n    function isPositionMigrator(address migrator) external view returns (bool);\n\n    function isPauser(address pauser) external view returns (bool);\n\n    function feeTreasury() external view returns (address);\n}\n"},"src/interfaces/internals/USG/IDebtIR.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IIRCalculator} from \"./IIRCalculator.sol\";\n\ninterface IDebtIR {\n    function maxMarketDebt() external view returns (uint256);\n    function irCalculator() external view returns (IIRCalculator);\n    function minimumLoan() external view returns (uint256);\n    function userDebtShares(address user) external view returns (uint256);\n    function totalDebtShares() external view returns (uint256);\n    function badDebt() external view returns (uint256);\n}\n"},"src/interfaces/internals/USG/IIRCalculator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nstruct IRParams {\n    /// @dev Flag to determine if a Market is HEC or LEC\n    bool isHEC;\n    /// @dev Minimum IR reached at pMax.\n    ///      1_000 <=> 1% / 100_000 <=> 100%.\n    uint24 rMin;\n    /// @dev Maximum IR reached at pMin.\n    ///      1_000 <=> 1% / 100_000 <=> 100%.\n    uint32 rMax;\n    /// @dev Minimum price of USG where rMax is reached.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pMin;\n    /// @dev Inflexion price of USG where IR starts to increases more significantly.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pInf;\n    /// @dev Maximum price of USG where IR increases more significantly.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pMax;\n    /// @dev Convexity of the curve before pInf\n    ///      2_000 <=> 2 / 4_500 <=> 4.5\n    uint32 a1;\n    /// @dev Convexity of the curve after pInf\n    ///      2_000 <=> 2 / 4_500 <=> 4.5\n    uint32 a2;\n    /// @dev Velocity of the transition between a1 and a2\n    ///      It's an integer. 250 <=> 250\n    uint32 k;\n}\n\nstruct IRCheckpoint {\n    uint216 ir;\n    uint40 timestamp;\n}\ninterface IIRCalculator {\n    function initializeMarket(address market, IRParams calldata _irParam) external;\n\n    function simulateIR(uint256 USGPrice, IRParams memory irParam) external view returns (uint256);\n\n    function computeIRForMarket(address market) external returns (uint256);\n\n    function checkpointIR(address market) external returns (uint256);\n\n    function newDebtIndex(address market) external view returns (uint256);\n\n    function irCheckpoints(address market) external view returns (uint216, uint40);\n\n    function debtIndexes(address market) external view returns (uint256);\n\n    function indexDelta(address market) external view returns (uint256);\n\n    function mintableInterests() external view returns (uint256);\n\n    function getIRParams(address market) external view returns (IRParams memory);\n\n    function getIRCheckpoint(address market) external view returns (IRCheckpoint memory);\n}\n"},"src/interfaces/internals/USG/IUSG.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\n\ninterface IUSG is IERC20 {\n    function mintDebt(address to, uint256 amount) external;\n\n    function burnDebt(address from, uint256 amount) external;\n\n    function mintIR(uint256 amount) external;\n\n    function initializeMarket(address market) external;\n}\n"},"src/USG/Utilities/abstract/LightOwnable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.22;\n\nabstract contract LightOwnable {\n    address public owner;\n\n    error OwnableUnauthorizedAccount(address account);\n\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner != msg.sender) {\n            revert OwnableUnauthorizedAccount(msg.sender);\n        }\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = owner;\n        owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"src/USG/Utilities/ControlTower.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.22;\n\nimport {LightOwnable} from \"../Utilities/abstract/LightOwnable.sol\";\nimport {IUSG} from \"../../interfaces/internals/USG/IUSG.sol\";\nimport {IControlTower} from \"../../interfaces/internals/USG/IControlTower.sol\";\n\n/// @title ControlTower\n/// @author Tangent Finance\n/// @notice Owns the access control of the protocol.\ncontract ControlTower is LightOwnable, IControlTower {\n    address public feeTreasury;\n\n    mapping(address => bool) public isMarketCreator;\n\n    mapping(address => bool) public isPositionMigrator;\n\n    mapping(address => bool) public isPauser;\n\n    error NotIRProducer(address irProducer);\n\n    error CallerNotOwnerOrMarketCreator(address caller);\n\n    constructor(address _owner, address _feeTreasury) {\n        feeTreasury = _feeTreasury;\n        _transferOwnership(_owner);\n    }\n\n    event SetFeeTreasury(address feeTreasury);\n    event SetIsMarketCreator(address marketCreator, bool _isMarketCreator);\n    event SetIsPositionMigrator(address migrator, bool _isPositionMigrator);\n    event SetIsPauser(address pauser, bool _isPauser);\n\n    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\n                        OWNER ACTIONS \n    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */\n\n    /**\n     *  @notice Sets the receiver of the protocol fees\n     *  @dev    Callable only by the owner.\n     *  @param  _feeTreasury  New feeTreasury to setup\n     */\n    function setFeeTreasury(address _feeTreasury) external onlyOwner {\n        feeTreasury = _feeTreasury;\n        emit SetFeeTreasury(_feeTreasury);\n    }\n\n    /**\n     * @notice Sets or removes the market creator flag for a given address\n     * @dev    Restricted to the contract owner.\n     * @param marketCreator     The address to update the market status for\n     * @param _isMarketCreator  Whether the address should be flagged as a market creator (true) or not (false)\n     */\n    function setIsMarketCreator(address marketCreator, bool _isMarketCreator) external onlyOwner {\n        isMarketCreator[marketCreator] = _isMarketCreator;\n        emit SetIsMarketCreator(marketCreator, _isMarketCreator);\n    }\n\n    /**\n     * @notice Sets or removes the position migrator flag for a given address\n     * @dev    Restricted to the contract owner\n     * @param positionMigrator     The address to update the position migrator status for\n     * @param _isPositionMigrator  Whether the address should be flagged as a position migrator (true) or not (false)\n     */\n    function setIsPositionMigrator(address positionMigrator, bool _isPositionMigrator) external onlyOwner {\n        isPositionMigrator[positionMigrator] = _isPositionMigrator;\n        emit SetIsPositionMigrator(positionMigrator, _isPositionMigrator);\n    }\n\n    /**\n     * @notice Sets or removes the pauser flag for a given address\n     * @dev    Restricted to the contract owner.\n     * @param _pauser     The address to update the pauser status for\n     * @param _isPauser   Whether the address should be flagged as a pauser (true) or not (false)\n     */\n    function setIsPauser(address _pauser, bool _isPauser) external onlyOwner {\n        isPauser[_pauser] = _isPauser;\n        emit SetIsPauser(_pauser, _isPauser);\n    }\n}\n"}},"compilation":{"language":"Solidity","compiler":"solc","compilerVersion":"0.8.28+commit.7893614a","compilerSettings":{"optimizer":{"runs":1000000,"enabled":true},"evmVersion":"cancun"},"name":"ControlTower","fullyQualifiedName":"src/USG/Utilities/ControlTower.sol:ControlTower"},"abi":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_feeTreasury","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"CallerNotOwnerOrMarketCreator","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"}]},{"name":"NotIRProducer","type":"error","inputs":[{"name":"irProducer","type":"address","internalType":"address"}]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"SetFeeTreasury","type":"event","inputs":[{"name":"feeTreasury","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SetIsMarketCreator","type":"event","inputs":[{"name":"marketCreator","type":"address","indexed":false,"internalType":"address"},{"name":"_isMarketCreator","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"SetIsPauser","type":"event","inputs":[{"name":"pauser","type":"address","indexed":false,"internalType":"address"},{"name":"_isPauser","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"SetIsPositionMigrator","type":"event","inputs":[{"name":"migrator","type":"address","indexed":false,"internalType":"address"},{"name":"_isPositionMigrator","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"feeTreasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isMarketCreator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPauser","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPositionMigrator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setFeeTreasury","type":"function","inputs":[{"name":"_feeTreasury","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsMarketCreator","type":"function","inputs":[{"name":"marketCreator","type":"address","internalType":"address"},{"name":"_isMarketCreator","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsPauser","type":"function","inputs":[{"name":"_pauser","type":"address","internalType":"address"},{"name":"_isPauser","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsPositionMigrator","type":"function","inputs":[{"name":"positionMigrator","type":"address","internalType":"address"},{"name":"_isPositionMigrator","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":{"compiler":{"version":"0.8.28+commit.7893614a"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_feeTreasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"CallerNotOwnerOrMarketCreator","type":"error"},{"inputs":[{"internalType":"address","name":"irProducer","type":"address"}],"name":"NotIRProducer","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeTreasury","type":"address"}],"name":"SetFeeTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"marketCreator","type":"address"},{"indexed":false,"internalType":"bool","name":"_isMarketCreator","type":"bool"}],"name":"SetIsMarketCreator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"pauser","type":"address"},{"indexed":false,"internalType":"bool","name":"_isPauser","type":"bool"}],"name":"SetIsPauser","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"migrator","type":"address"},{"indexed":false,"internalType":"bool","name":"_isPositionMigrator","type":"bool"}],"name":"SetIsPositionMigrator","type":"event"},{"inputs":[],"name":"feeTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMarketCreator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPauser","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isPositionMigrator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTreasury","type":"address"}],"name":"setFeeTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"marketCreator","type":"address"},{"internalType":"bool","name":"_isMarketCreator","type":"bool"}],"name":"setIsMarketCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_pauser","type":"address"},{"internalType":"bool","name":"_isPauser","type":"bool"}],"name":"setIsPauser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"positionMigrator","type":"address"},{"internalType":"bool","name":"_isPositionMigrator","type":"bool"}],"name":"setIsPositionMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"Tangent Finance","kind":"dev","methods":{"setFeeTreasury(address)":{"details":"Callable only by the owner.","params":{"_feeTreasury":"New feeTreasury to setup"}},"setIsMarketCreator(address,bool)":{"details":"Restricted to the contract owner.","params":{"_isMarketCreator":"Whether the address should be flagged as a market creator (true) or not (false)","marketCreator":"The address to update the market status for"}},"setIsPauser(address,bool)":{"details":"Restricted to the contract owner.","params":{"_isPauser":"Whether the address should be flagged as a pauser (true) or not (false)","_pauser":"The address to update the pauser status for"}},"setIsPositionMigrator(address,bool)":{"details":"Restricted to the contract owner","params":{"_isPositionMigrator":"Whether the address should be flagged as a position migrator (true) or not (false)","positionMigrator":"The address to update the position migrator status for"}},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."}},"title":"ControlTower","version":1},"userdoc":{"kind":"user","methods":{"setFeeTreasury(address)":{"notice":"Sets the receiver of the protocol fees"},"setIsMarketCreator(address,bool)":{"notice":"Sets or removes the market creator flag for a given address"},"setIsPauser(address,bool)":{"notice":"Sets or removes the pauser flag for a given address"},"setIsPositionMigrator(address,bool)":{"notice":"Sets or removes the position migrator flag for a given address"}},"notice":"Owns the access control of the protocol.","version":1}},"settings":{"compilationTarget":{"src/USG/Utilities/ControlTower.sol":"ControlTower"},"evmVersion":"cancun","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":1000000},"remappings":[]},"sources":{"@openzeppelin/contracts/interfaces/IERC20.sol":{"keccak256":"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c","license":"MIT","urls":["bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba","dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1"]},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"keccak256":"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7","license":"MIT","urls":["bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db","dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9"]},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"keccak256":"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330","license":"MIT","urls":["bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf","dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r"]},"src/USG/Utilities/ControlTower.sol":{"keccak256":"0xb8e0c03a26b29e9cf15afffbce3790b737c5ab255cde482587c492ccf69653e1","license":"UNLICENSED","urls":["bzz-raw://493866c4973ed14db5b3460da4a73218c4369f061be39ba85d8b833fbbed2447","dweb:/ipfs/QmVVvFTt6UV7L9q6houw7cFhGiTzjAV1uw8oncEq4Af5yi"]},"src/USG/Utilities/abstract/LightOwnable.sol":{"keccak256":"0x88c4c115ff0ba91e7d911c9d4dace8626f4622f56c1ee19dfbd612aff283e3b7","license":"UNLICENSED","urls":["bzz-raw://29ca7e825aca8d14f45c6ac7a17cb3995a9167b091fb8acf555bd501e8f65c90","dweb:/ipfs/QmfEAaoxwwnELfg3VW5yDu9rV3Q9hdXUCKkcvwQo9HCbyq"]},"src/interfaces/internals/USG/IControlTower.sol":{"keccak256":"0xa762b09652859e007148df15d5fe60b6678197c2f1aea19e53b453bd53d96eaf","license":"MIT","urls":["bzz-raw://cf3e1494e9e6df32bb48ac64e404341c626aad0d9dd633c958b07c085f3ededc","dweb:/ipfs/QmYhYCghWLjv8WzExcigYhPCANgyx67njKxisNj9tbjBjT"]},"src/interfaces/internals/USG/IDebtIR.sol":{"keccak256":"0xf1b17238a3c8a96ce1ad44f5e772016a7a35722f7a76bb4f552516f949295943","license":"MIT","urls":["bzz-raw://e556853a4f5be1dd697de721a258e0183c5c6cb691eafbfc461884dca2b17026","dweb:/ipfs/QmXhbrRBFTpYKKBR9GiLQuL5n1c9hedZkfAC1W5RNRfJch"]},"src/interfaces/internals/USG/IIRCalculator.sol":{"keccak256":"0xec390b63b76bfdbf7165e66d652210b6774427d6cce7a38346babd016dc6c275","license":"MIT","urls":["bzz-raw://b83dfe894d175e626c4f6004f841b3817603e83bc08439ce6da9e94fdfe89efb","dweb:/ipfs/Qme99R42frMKaizYzo36FFLmWnNRiywnD8n6GsrEbaK6LK"]},"src/interfaces/internals/USG/IUSG.sol":{"keccak256":"0x39eb5da91c763740799025f16e060d8347a9c1bccbe8875c3a2d2942f9c600df","license":"MIT","urls":["bzz-raw://35c366e2978750d024de951ccf256d497c1d1b595084f1f785f4a860cb579a07","dweb:/ipfs/QmQpgHN6ub6H7DhYzGjAc4pzTjmpfmSzcj4xYcVnJo6rf7"]}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":268,"label":"owner","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"1","type":"t_address","astId":122,"label":"feeTreasury","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"2","type":"t_mapping(t_address,t_bool)","astId":126,"label":"isMarketCreator","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"3","type":"t_mapping(t_address,t_bool)","astId":130,"label":"isPositionMigrator","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"4","type":"t_mapping(t_address,t_bool)","astId":134,"label":"isPauser","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"}]},"transientStorageLayout":{"types":null,"storage":[]},"userdoc":{"kind":"user","notice":"Owns the access control of the protocol.","methods":{"setFeeTreasury(address)":{"notice":"Sets the receiver of the protocol fees"},"setIsPauser(address,bool)":{"notice":"Sets or removes the pauser flag for a given address"},"setIsMarketCreator(address,bool)":{"notice":"Sets or removes the market creator flag for a given address"},"setIsPositionMigrator(address,bool)":{"notice":"Sets or removes the position migrator flag for a given address"}},"version":1},"devdoc":{"kind":"dev","title":"ControlTower","author":"Tangent Finance","methods":{"setFeeTreasury(address)":{"params":{"_feeTreasury":"New feeTreasury to setup"},"details":"Callable only by the owner."},"setIsPauser(address,bool)":{"params":{"_pauser":"The address to update the pauser status for","_isPauser":"Whether the address should be flagged as a pauser (true) or not (false)"},"details":"Restricted to the contract owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"setIsMarketCreator(address,bool)":{"params":{"marketCreator":"The address to update the market status for","_isMarketCreator":"Whether the address should be flagged as a market creator (true) or not (false)"},"details":"Restricted to the contract owner."},"setIsPositionMigrator(address,bool)":{"params":{"positionMigrator":"The address to update the position migrator status for","_isPositionMigrator":"Whether the address should be flagged as a position migrator (true) or not (false)"},"details":"Restricted to the contract owner"}},"version":1},"sourceIds":{"src/USG/Utilities/ControlTower.sol":{"id":3},"src/interfaces/internals/USG/IUSG.sol":{"id":8},"src/interfaces/internals/USG/IDebtIR.sol":{"id":6},"src/USG/Utilities/abstract/LightOwnable.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":0},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":1},"src/interfaces/internals/USG/IControlTower.sol":{"id":5},"src/interfaces/internals/USG/IIRCalculator.sol":{"id":7},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":2}},"additionalInput":null,"stdJsonInput":{"sources":{"src/USG/Utilities/ControlTower.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.22;\n\nimport {LightOwnable} from \"../Utilities/abstract/LightOwnable.sol\";\nimport {IUSG} from \"../../interfaces/internals/USG/IUSG.sol\";\nimport {IControlTower} from \"../../interfaces/internals/USG/IControlTower.sol\";\n\n/// @title ControlTower\n/// @author Tangent Finance\n/// @notice Owns the access control of the protocol.\ncontract ControlTower is LightOwnable, IControlTower {\n    address public feeTreasury;\n\n    mapping(address => bool) public isMarketCreator;\n\n    mapping(address => bool) public isPositionMigrator;\n\n    mapping(address => bool) public isPauser;\n\n    error NotIRProducer(address irProducer);\n\n    error CallerNotOwnerOrMarketCreator(address caller);\n\n    constructor(address _owner, address _feeTreasury) {\n        feeTreasury = _feeTreasury;\n        _transferOwnership(_owner);\n    }\n\n    event SetFeeTreasury(address feeTreasury);\n    event SetIsMarketCreator(address marketCreator, bool _isMarketCreator);\n    event SetIsPositionMigrator(address migrator, bool _isPositionMigrator);\n    event SetIsPauser(address pauser, bool _isPauser);\n\n    /* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-=\n                        OWNER ACTIONS \n    =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--=-=-=-= */\n\n    /**\n     *  @notice Sets the receiver of the protocol fees\n     *  @dev    Callable only by the owner.\n     *  @param  _feeTreasury  New feeTreasury to setup\n     */\n    function setFeeTreasury(address _feeTreasury) external onlyOwner {\n        feeTreasury = _feeTreasury;\n        emit SetFeeTreasury(_feeTreasury);\n    }\n\n    /**\n     * @notice Sets or removes the market creator flag for a given address\n     * @dev    Restricted to the contract owner.\n     * @param marketCreator     The address to update the market status for\n     * @param _isMarketCreator  Whether the address should be flagged as a market creator (true) or not (false)\n     */\n    function setIsMarketCreator(address marketCreator, bool _isMarketCreator) external onlyOwner {\n        isMarketCreator[marketCreator] = _isMarketCreator;\n        emit SetIsMarketCreator(marketCreator, _isMarketCreator);\n    }\n\n    /**\n     * @notice Sets or removes the position migrator flag for a given address\n     * @dev    Restricted to the contract owner\n     * @param positionMigrator     The address to update the position migrator status for\n     * @param _isPositionMigrator  Whether the address should be flagged as a position migrator (true) or not (false)\n     */\n    function setIsPositionMigrator(address positionMigrator, bool _isPositionMigrator) external onlyOwner {\n        isPositionMigrator[positionMigrator] = _isPositionMigrator;\n        emit SetIsPositionMigrator(positionMigrator, _isPositionMigrator);\n    }\n\n    /**\n     * @notice Sets or removes the pauser flag for a given address\n     * @dev    Restricted to the contract owner.\n     * @param _pauser     The address to update the pauser status for\n     * @param _isPauser   Whether the address should be flagged as a pauser (true) or not (false)\n     */\n    function setIsPauser(address _pauser, bool _isPauser) external onlyOwner {\n        isPauser[_pauser] = _isPauser;\n        emit SetIsPauser(_pauser, _isPauser);\n    }\n}\n"},"src/interfaces/internals/USG/IUSG.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\nimport {IERC20} from \"@openzeppelin/contracts/interfaces/IERC20.sol\";\n\ninterface IUSG is IERC20 {\n    function mintDebt(address to, uint256 amount) external;\n\n    function burnDebt(address from, uint256 amount) external;\n\n    function mintIR(uint256 amount) external;\n\n    function initializeMarket(address market) external;\n}\n"},"src/interfaces/internals/USG/IDebtIR.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IIRCalculator} from \"./IIRCalculator.sol\";\n\ninterface IDebtIR {\n    function maxMarketDebt() external view returns (uint256);\n    function irCalculator() external view returns (IIRCalculator);\n    function minimumLoan() external view returns (uint256);\n    function userDebtShares(address user) external view returns (uint256);\n    function totalDebtShares() external view returns (uint256);\n    function badDebt() external view returns (uint256);\n}\n"},"src/USG/Utilities/abstract/LightOwnable.sol":{"content":"// SPDX-License-Identifier: UNLICENSED\npragma solidity ^0.8.22;\n\nabstract contract LightOwnable {\n    address public owner;\n\n    error OwnableUnauthorizedAccount(address account);\n\n    error OwnableInvalidOwner(address owner);\n\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n    /**\n     * @dev Throws if called by any account other than the owner.\n     */\n    modifier onlyOwner() {\n        _checkOwner();\n        _;\n    }\n\n    /**\n     * @dev Throws if the sender is not the owner.\n     */\n    function _checkOwner() internal view virtual {\n        if (owner != msg.sender) {\n            revert OwnableUnauthorizedAccount(msg.sender);\n        }\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Can only be called by the current owner.\n     */\n    function transferOwnership(address newOwner) public virtual onlyOwner {\n        if (newOwner == address(0)) {\n            revert OwnableInvalidOwner(address(0));\n        }\n        _transferOwnership(newOwner);\n    }\n\n    /**\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\n     * Internal function without access restriction.\n     */\n    function _transferOwnership(address newOwner) internal virtual {\n        address oldOwner = owner;\n        owner = newOwner;\n        emit OwnershipTransferred(oldOwner, newOwner);\n    }\n}\n"},"@openzeppelin/contracts/interfaces/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../token/ERC20/IERC20.sol\";\n"},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)\n\npragma solidity ^0.8.20;\n\n/**\n * @dev Interface of the ERC-20 standard as defined in the ERC.\n */\ninterface IERC20 {\n    /**\n     * @dev Emitted when `value` tokens are moved from one account (`from`) to\n     * another (`to`).\n     *\n     * Note that `value` may be zero.\n     */\n    event Transfer(address indexed from, address indexed to, uint256 value);\n\n    /**\n     * @dev Emitted when the allowance of a `spender` for an `owner` is set by\n     * a call to {approve}. `value` is the new allowance.\n     */\n    event Approval(address indexed owner, address indexed spender, uint256 value);\n\n    /**\n     * @dev Returns the value of tokens in existence.\n     */\n    function totalSupply() external view returns (uint256);\n\n    /**\n     * @dev Returns the value of tokens owned by `account`.\n     */\n    function balanceOf(address account) external view returns (uint256);\n\n    /**\n     * @dev Moves a `value` amount of tokens from the caller's account to `to`.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transfer(address to, uint256 value) external returns (bool);\n\n    /**\n     * @dev Returns the remaining number of tokens that `spender` will be\n     * allowed to spend on behalf of `owner` through {transferFrom}. This is\n     * zero by default.\n     *\n     * This value changes when {approve} or {transferFrom} are called.\n     */\n    function allowance(address owner, address spender) external view returns (uint256);\n\n    /**\n     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the\n     * caller's tokens.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * IMPORTANT: Beware that changing an allowance with this method brings the risk\n     * that someone may use both the old and the new allowance by unfortunate\n     * transaction ordering. One possible solution to mitigate this race\n     * condition is to first reduce the spender's allowance to 0 and set the\n     * desired value afterwards:\n     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729\n     *\n     * Emits an {Approval} event.\n     */\n    function approve(address spender, uint256 value) external returns (bool);\n\n    /**\n     * @dev Moves a `value` amount of tokens from `from` to `to` using the\n     * allowance mechanism. `value` is then deducted from the caller's\n     * allowance.\n     *\n     * Returns a boolean value indicating whether the operation succeeded.\n     *\n     * Emits a {Transfer} event.\n     */\n    function transferFrom(address from, address to, uint256 value) external returns (bool);\n}\n"},"src/interfaces/internals/USG/IControlTower.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nimport {IERC20, IERC20Metadata} from \"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\";\n\nimport {IDebtIR} from \"./IDebtIR.sol\";\n\ninterface IControlTower {\n    function isMarketCreator(address marketCreator) external view returns (bool);\n\n    function isPositionMigrator(address migrator) external view returns (bool);\n\n    function isPauser(address pauser) external view returns (bool);\n\n    function feeTreasury() external view returns (address);\n}\n"},"src/interfaces/internals/USG/IIRCalculator.sol":{"content":"// SPDX-License-Identifier: MIT\npragma solidity ^0.8.24;\n\nstruct IRParams {\n    /// @dev Flag to determine if a Market is HEC or LEC\n    bool isHEC;\n    /// @dev Minimum IR reached at pMax.\n    ///      1_000 <=> 1% / 100_000 <=> 100%.\n    uint24 rMin;\n    /// @dev Maximum IR reached at pMin.\n    ///      1_000 <=> 1% / 100_000 <=> 100%.\n    uint32 rMax;\n    /// @dev Minimum price of USG where rMax is reached.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pMin;\n    /// @dev Inflexion price of USG where IR starts to increases more significantly.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pInf;\n    /// @dev Maximum price of USG where IR increases more significantly.\n    ///      980_000 <=> 0.98$ / 1_000_000 <=> 1$\n    uint32 pMax;\n    /// @dev Convexity of the curve before pInf\n    ///      2_000 <=> 2 / 4_500 <=> 4.5\n    uint32 a1;\n    /// @dev Convexity of the curve after pInf\n    ///      2_000 <=> 2 / 4_500 <=> 4.5\n    uint32 a2;\n    /// @dev Velocity of the transition between a1 and a2\n    ///      It's an integer. 250 <=> 250\n    uint32 k;\n}\n\nstruct IRCheckpoint {\n    uint216 ir;\n    uint40 timestamp;\n}\ninterface IIRCalculator {\n    function initializeMarket(address market, IRParams calldata _irParam) external;\n\n    function simulateIR(uint256 USGPrice, IRParams memory irParam) external view returns (uint256);\n\n    function computeIRForMarket(address market) external returns (uint256);\n\n    function checkpointIR(address market) external returns (uint256);\n\n    function newDebtIndex(address market) external view returns (uint256);\n\n    function irCheckpoints(address market) external view returns (uint216, uint40);\n\n    function debtIndexes(address market) external view returns (uint256);\n\n    function indexDelta(address market) external view returns (uint256);\n\n    function mintableInterests() external view returns (uint256);\n\n    function getIRParams(address market) external view returns (IRParams memory);\n\n    function getIRCheckpoint(address market) external view returns (IRCheckpoint memory);\n}\n"},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"content":"// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/extensions/IERC20Metadata.sol)\n\npragma solidity ^0.8.20;\n\nimport {IERC20} from \"../IERC20.sol\";\n\n/**\n * @dev Interface for the optional metadata functions from the ERC-20 standard.\n */\ninterface IERC20Metadata is IERC20 {\n    /**\n     * @dev Returns the name of the token.\n     */\n    function name() external view returns (string memory);\n\n    /**\n     * @dev Returns the symbol of the token.\n     */\n    function symbol() external view returns (string memory);\n\n    /**\n     * @dev Returns the decimals places of the token.\n     */\n    function decimals() external view returns (uint8);\n}\n"}},"language":"Solidity","settings":{"optimizer":{"runs":1000000,"enabled":true},"evmVersion":"cancun"}},"stdJsonOutput":{"sources":{"src/USG/Utilities/ControlTower.sol":{"id":3},"src/interfaces/internals/USG/IUSG.sol":{"id":8},"src/interfaces/internals/USG/IDebtIR.sol":{"id":6},"src/USG/Utilities/abstract/LightOwnable.sol":{"id":4},"@openzeppelin/contracts/interfaces/IERC20.sol":{"id":0},"@openzeppelin/contracts/token/ERC20/IERC20.sol":{"id":1},"src/interfaces/internals/USG/IControlTower.sol":{"id":5},"src/interfaces/internals/USG/IIRCalculator.sol":{"id":7},"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol":{"id":2}},"contracts":{"src/USG/Utilities/ControlTower.sol":{"ControlTower":{"abi":[{"type":"constructor","inputs":[{"name":"_owner","type":"address","internalType":"address"},{"name":"_feeTreasury","type":"address","internalType":"address"}],"stateMutability":"nonpayable"},{"name":"CallerNotOwnerOrMarketCreator","type":"error","inputs":[{"name":"caller","type":"address","internalType":"address"}]},{"name":"NotIRProducer","type":"error","inputs":[{"name":"irProducer","type":"address","internalType":"address"}]},{"name":"OwnableInvalidOwner","type":"error","inputs":[{"name":"owner","type":"address","internalType":"address"}]},{"name":"OwnableUnauthorizedAccount","type":"error","inputs":[{"name":"account","type":"address","internalType":"address"}]},{"name":"OwnershipTransferred","type":"event","inputs":[{"name":"previousOwner","type":"address","indexed":true,"internalType":"address"},{"name":"newOwner","type":"address","indexed":true,"internalType":"address"}],"anonymous":false},{"name":"SetFeeTreasury","type":"event","inputs":[{"name":"feeTreasury","type":"address","indexed":false,"internalType":"address"}],"anonymous":false},{"name":"SetIsMarketCreator","type":"event","inputs":[{"name":"marketCreator","type":"address","indexed":false,"internalType":"address"},{"name":"_isMarketCreator","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"SetIsPauser","type":"event","inputs":[{"name":"pauser","type":"address","indexed":false,"internalType":"address"},{"name":"_isPauser","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"SetIsPositionMigrator","type":"event","inputs":[{"name":"migrator","type":"address","indexed":false,"internalType":"address"},{"name":"_isPositionMigrator","type":"bool","indexed":false,"internalType":"bool"}],"anonymous":false},{"name":"feeTreasury","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"isMarketCreator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPauser","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"isPositionMigrator","type":"function","inputs":[{"name":"","type":"address","internalType":"address"}],"outputs":[{"name":"","type":"bool","internalType":"bool"}],"stateMutability":"view"},{"name":"owner","type":"function","inputs":[],"outputs":[{"name":"","type":"address","internalType":"address"}],"stateMutability":"view"},{"name":"setFeeTreasury","type":"function","inputs":[{"name":"_feeTreasury","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsMarketCreator","type":"function","inputs":[{"name":"marketCreator","type":"address","internalType":"address"},{"name":"_isMarketCreator","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsPauser","type":"function","inputs":[{"name":"_pauser","type":"address","internalType":"address"},{"name":"_isPauser","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"setIsPositionMigrator","type":"function","inputs":[{"name":"positionMigrator","type":"address","internalType":"address"},{"name":"_isPositionMigrator","type":"bool","internalType":"bool"}],"outputs":[],"stateMutability":"nonpayable"},{"name":"transferOwnership","type":"function","inputs":[{"name":"newOwner","type":"address","internalType":"address"}],"outputs":[],"stateMutability":"nonpayable"}],"metadata":"{\"compiler\":{\"version\":\"0.8.28+commit.7893614a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_feeTreasury\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"}],\"name\":\"CallerNotOwnerOrMarketCreator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"irProducer\",\"type\":\"address\"}],\"name\":\"NotIRProducer\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"feeTreasury\",\"type\":\"address\"}],\"name\":\"SetFeeTreasury\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"marketCreator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isMarketCreator\",\"type\":\"bool\"}],\"name\":\"SetIsMarketCreator\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"pauser\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isPauser\",\"type\":\"bool\"}],\"name\":\"SetIsPauser\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"migrator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"_isPositionMigrator\",\"type\":\"bool\"}],\"name\":\"SetIsPositionMigrator\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"feeTreasury\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isMarketCreator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isPauser\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"isPositionMigrator\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeTreasury\",\"type\":\"address\"}],\"name\":\"setFeeTreasury\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"marketCreator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isMarketCreator\",\"type\":\"bool\"}],\"name\":\"setIsMarketCreator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_pauser\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isPauser\",\"type\":\"bool\"}],\"name\":\"setIsPauser\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"positionMigrator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_isPositionMigrator\",\"type\":\"bool\"}],\"name\":\"setIsPositionMigrator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Tangent Finance\",\"kind\":\"dev\",\"methods\":{\"setFeeTreasury(address)\":{\"details\":\"Callable only by the owner.\",\"params\":{\"_feeTreasury\":\"New feeTreasury to setup\"}},\"setIsMarketCreator(address,bool)\":{\"details\":\"Restricted to the contract owner.\",\"params\":{\"_isMarketCreator\":\"Whether the address should be flagged as a market creator (true) or not (false)\",\"marketCreator\":\"The address to update the market status for\"}},\"setIsPauser(address,bool)\":{\"details\":\"Restricted to the contract owner.\",\"params\":{\"_isPauser\":\"Whether the address should be flagged as a pauser (true) or not (false)\",\"_pauser\":\"The address to update the pauser status for\"}},\"setIsPositionMigrator(address,bool)\":{\"details\":\"Restricted to the contract owner\",\"params\":{\"_isPositionMigrator\":\"Whether the address should be flagged as a position migrator (true) or not (false)\",\"positionMigrator\":\"The address to update the position migrator status for\"}},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"title\":\"ControlTower\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"setFeeTreasury(address)\":{\"notice\":\"Sets the receiver of the protocol fees\"},\"setIsMarketCreator(address,bool)\":{\"notice\":\"Sets or removes the market creator flag for a given address\"},\"setIsPauser(address,bool)\":{\"notice\":\"Sets or removes the pauser flag for a given address\"},\"setIsPositionMigrator(address,bool)\":{\"notice\":\"Sets or removes the position migrator flag for a given address\"}},\"notice\":\"Owns the access control of the protocol.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/USG/Utilities/ControlTower.sol\":\"ControlTower\"},\"evmVersion\":\"cancun\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":1000000},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/interfaces/IERC20.sol\":{\"keccak256\":\"0xce41876e78d1badc0512229b4d14e4daf83bc1003d7f83978d18e0e56f965b9c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://a2608291cb038b388d80b79a06b6118a42f7894ff67b7da10ec0dbbf5b2973ba\",\"dweb:/ipfs/QmWohqcBLbcxmA4eGPhZDXe5RYMMEEpFq22nfkaUMvTfw1\"]},\"@openzeppelin/contracts/token/ERC20/IERC20.sol\":{\"keccak256\":\"0xe06a3f08a987af6ad2e1c1e774405d4fe08f1694b67517438b467cecf0da0ef7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://df6f0c459663c9858b6cba2cda1d14a7d05a985bed6d2de72bd8e78c25ee79db\",\"dweb:/ipfs/QmeTTxZ7qVk9rjEv2R4CpCwdf8UMCcRqDNMvzNxHc3Fnn9\"]},\"@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol\":{\"keccak256\":\"0x70f2f713b13b7ce4610bcd0ac9fec0f3cc43693b043abcb8dc40a42a726eb330\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c13d13304ac79a83ab1c30168967d19e2203342ebbd6a9bbce4db7550522dcbf\",\"dweb:/ipfs/QmeN5jKMN2vw5bhacr6tkg78afbTTZUeaacNHqjWt4Ew1r\"]},\"src/USG/Utilities/ControlTower.sol\":{\"keccak256\":\"0xb8e0c03a26b29e9cf15afffbce3790b737c5ab255cde482587c492ccf69653e1\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://493866c4973ed14db5b3460da4a73218c4369f061be39ba85d8b833fbbed2447\",\"dweb:/ipfs/QmVVvFTt6UV7L9q6houw7cFhGiTzjAV1uw8oncEq4Af5yi\"]},\"src/USG/Utilities/abstract/LightOwnable.sol\":{\"keccak256\":\"0x88c4c115ff0ba91e7d911c9d4dace8626f4622f56c1ee19dfbd612aff283e3b7\",\"license\":\"UNLICENSED\",\"urls\":[\"bzz-raw://29ca7e825aca8d14f45c6ac7a17cb3995a9167b091fb8acf555bd501e8f65c90\",\"dweb:/ipfs/QmfEAaoxwwnELfg3VW5yDu9rV3Q9hdXUCKkcvwQo9HCbyq\"]},\"src/interfaces/internals/USG/IControlTower.sol\":{\"keccak256\":\"0xa762b09652859e007148df15d5fe60b6678197c2f1aea19e53b453bd53d96eaf\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://cf3e1494e9e6df32bb48ac64e404341c626aad0d9dd633c958b07c085f3ededc\",\"dweb:/ipfs/QmYhYCghWLjv8WzExcigYhPCANgyx67njKxisNj9tbjBjT\"]},\"src/interfaces/internals/USG/IDebtIR.sol\":{\"keccak256\":\"0xf1b17238a3c8a96ce1ad44f5e772016a7a35722f7a76bb4f552516f949295943\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://e556853a4f5be1dd697de721a258e0183c5c6cb691eafbfc461884dca2b17026\",\"dweb:/ipfs/QmXhbrRBFTpYKKBR9GiLQuL5n1c9hedZkfAC1W5RNRfJch\"]},\"src/interfaces/internals/USG/IIRCalculator.sol\":{\"keccak256\":\"0xec390b63b76bfdbf7165e66d652210b6774427d6cce7a38346babd016dc6c275\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://b83dfe894d175e626c4f6004f841b3817603e83bc08439ce6da9e94fdfe89efb\",\"dweb:/ipfs/Qme99R42frMKaizYzo36FFLmWnNRiywnD8n6GsrEbaK6LK\"]},\"src/interfaces/internals/USG/IUSG.sol\":{\"keccak256\":\"0x39eb5da91c763740799025f16e060d8347a9c1bccbe8875c3a2d2942f9c600df\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://35c366e2978750d024de951ccf256d497c1d1b595084f1f785f4a860cb579a07\",\"dweb:/ipfs/QmQpgHN6ub6H7DhYzGjAc4pzTjmpfmSzcj4xYcVnJo6rf7\"]}},\"version\":1}","userdoc":{"kind":"user","notice":"Owns the access control of the protocol.","methods":{"setFeeTreasury(address)":{"notice":"Sets the receiver of the protocol fees"},"setIsPauser(address,bool)":{"notice":"Sets or removes the pauser flag for a given address"},"setIsMarketCreator(address,bool)":{"notice":"Sets or removes the market creator flag for a given address"},"setIsPositionMigrator(address,bool)":{"notice":"Sets or removes the position migrator flag for a given address"}},"version":1},"devdoc":{"kind":"dev","title":"ControlTower","author":"Tangent Finance","methods":{"setFeeTreasury(address)":{"params":{"_feeTreasury":"New feeTreasury to setup"},"details":"Callable only by the owner."},"setIsPauser(address,bool)":{"params":{"_pauser":"The address to update the pauser status for","_isPauser":"Whether the address should be flagged as a pauser (true) or not (false)"},"details":"Restricted to the contract owner."},"transferOwnership(address)":{"details":"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."},"setIsMarketCreator(address,bool)":{"params":{"marketCreator":"The address to update the market status for","_isMarketCreator":"Whether the address should be flagged as a market creator (true) or not (false)"},"details":"Restricted to the contract owner."},"setIsPositionMigrator(address,bool)":{"params":{"positionMigrator":"The address to update the position migrator status for","_isPositionMigrator":"Whether the address should be flagged as a position migrator (true) or not (false)"},"details":"Restricted to the contract owner"}},"version":1},"storageLayout":{"types":{"t_bool":{"label":"bool","encoding":"inplace","numberOfBytes":"1"},"t_address":{"label":"address","encoding":"inplace","numberOfBytes":"20"},"t_mapping(t_address,t_bool)":{"key":"t_address","label":"mapping(address => bool)","value":"t_bool","encoding":"mapping","numberOfBytes":"32"}},"storage":[{"slot":"0","type":"t_address","astId":268,"label":"owner","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"1","type":"t_address","astId":122,"label":"feeTreasury","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"2","type":"t_mapping(t_address,t_bool)","astId":126,"label":"isMarketCreator","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"3","type":"t_mapping(t_address,t_bool)","astId":130,"label":"isPositionMigrator","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"},{"slot":"4","type":"t_mapping(t_address,t_bool)","astId":134,"label":"isPauser","offset":0,"contract":"src/USG/Utilities/ControlTower.sol:ControlTower"}]},"transientStorageLayout":{"types":null,"storage":[]},"evm":{"bytecode":{"object":"608060405234801561000f575f5ffd5b5060405161071838038061071883398101604081905261002e916100c3565b600180546001600160a01b0319166001600160a01b03831617905561005282610059565b50506100f4565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b03811681146100be575f5ffd5b919050565b5f5f604083850312156100d4575f5ffd5b6100dd836100a8565b91506100eb602084016100a8565b90509250929050565b610617806101015f395ff3fe608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","sourceMap":"382:2870:3:-:0;;;736:129;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;796:11;:26;;-1:-1:-1;;;;;;796:26:3;-1:-1:-1;;;;;796:26:3;;;;;832;851:6;832:18;:26::i;:::-;736:129;;382:2870;;1213:185:4;1286:16;1305:5;;-1:-1:-1;;;;;1320:16:4;;;-1:-1:-1;;;;;;1320:16:4;;;;;;1351:40;;1305:5;;;;;;;1351:40;;1286:16;1351:40;1276:122;1213:185;:::o;14:177:9:-;93:13;;-1:-1:-1;;;;;135:31:9;;125:42;;115:70;;181:1;178;171:12;115:70;14:177;;;:::o;196:293::-;275:6;283;336:2;324:9;315:7;311:23;307:32;304:52;;;352:1;349;342:12;304:52;375:40;405:9;375:40;:::i;:::-;365:50;;434:49;479:2;468:9;464:18;434:49;:::i;:::-;424:59;;196:293;;;;;:::o;:::-;382:2870:3;;;;;;","linkReferences":{}},"deployedBytecode":{"object":"608060405234801561000f575f5ffd5b50600436106100b9575f3560e01c806392b3c8f911610072578063bfa37e3711610058578063bfa37e37146101b5578063f2fde38b146101c8578063f97b7a3b146101db575f5ffd5b806392b3c8f91461018f57806395853024146101a2575f5ffd5b806360dc2340116100a257806360dc234014610116578063856852061461015b5780638da5cb5b14610170575f5ffd5b80631622c70f146100bd57806346fbf68e146100f4575b5f5ffd5b6100df6100cb366004610588565b60036020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b6100df610102366004610588565b60046020525f908152604090205460ff1681565b6001546101369073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100eb565b61016e6101693660046105a8565b6101fd565b005b5f546101369073ffffffffffffffffffffffffffffffffffffffff1681565b61016e61019d3660046105a8565b610293565b61016e6101b03660046105a8565b610321565b61016e6101c3366004610588565b6103af565b61016e6101d6366004610588565b610430565b6100df6101e9366004610588565b60026020525f908152604090205460ff1681565b610205610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526004602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527faf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb636891015b60405180910390a15050565b61029b610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526002602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f9101610287565b610329610498565b73ffffffffffffffffffffffffffffffffffffffff82165f8181526003602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168515159081179091558251938452908301527fe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae39101610287565b6103b7610498565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081179091556040519081527f952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb79060200160405180910390a150565b610438610498565b73ffffffffffffffffffffffffffffffffffffffff811661048c576040517f1e4fbdf70000000000000000000000000000000000000000000000000000000081525f60048201526024015b60405180910390fd5b610495816104ec565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146104ea576040517f118cdaa7000000000000000000000000000000000000000000000000000000008152336004820152602401610483565b565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610583575f5ffd5b919050565b5f60208284031215610598575f5ffd5b6105a182610560565b9392505050565b5f5f604083850312156105b9575f5ffd5b6105c283610560565b9150602083013580151581146105d6575f5ffd5b80915050925092905056fea2646970667358221220b6ae42c563d7f2b9866614bf7cbbfdbe2035c2531e452b50365c69474994c61264736f6c634300081c0033","sourceMap":"382:2870:3:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;528:50;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;571:14:9;;564:22;546:41;;534:2;519:18;528:50:3;;;;;;;;585:40;;;;;;:::i;:::-;;;;;;;;;;;;;;;;441:26;;;;;;;;;;;;774:42:9;762:55;;;744:74;;732:2;717:18;441:26:3;598:226:9;3085:165:3;;;;;;:::i;:::-;;:::i;:::-;;102:20:4;;;;;;;;;1946:225:3;;;;;;:::i;:::-;;:::i;2527:252::-;;;;;;:::i;:::-;;:::i;1461:151::-;;;;;;:::i;:::-;;:::i;844:215:4:-;;;;;;:::i;:::-;;:::i;474:47:3:-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3085:165;435:13:4;:11;:13::i;:::-;3168:17:3::1;::::0;::::1;;::::0;;;:8:::1;:17;::::0;;;;;;;;:29;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;3212:31;;1349:74:9;;;1439:18;;;1432:50;3212:31:3::1;::::0;1322:18:9;3212:31:3::1;;;;;;;;3085:165:::0;;:::o;1946:225::-;435:13:4;:11;:13::i;:::-;2049:30:3::1;::::0;::::1;;::::0;;;:15:::1;:30;::::0;;;;;;;;:49;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;2113:51;;1349:74:9;;;1439:18;;;1432:50;2113:51:3::1;::::0;1322:18:9;2113:51:3::1;1181:307:9::0;2527:252:3;435:13:4;:11;:13::i;:::-;2639:36:3::1;::::0;::::1;;::::0;;;:18:::1;:36;::::0;;;;;;;;:58;;;::::1;::::0;::::1;;::::0;;::::1;::::0;;;2712:60;;1349:74:9;;;1439:18;;;1432:50;2712:60:3::1;::::0;1322:18:9;2712:60:3::1;1181:307:9::0;1461:151:3;435:13:4;:11;:13::i;:::-;1536:11:3::1;:26:::0;;;::::1;;::::0;::::1;::::0;;::::1;::::0;;;1577:28:::1;::::0;744:74:9;;;1577:28:3::1;::::0;732:2:9;717:18;1577:28:3::1;;;;;;;1461:151:::0;:::o;844:215:4:-;435:13;:11;:13::i;:::-;928:22:::1;::::0;::::1;924:91;;973:31;::::0;::::1;::::0;;1001:1:::1;973:31;::::0;::::1;744:74:9::0;717:18;;973:31:4::1;;;;;;;;924:91;1024:28;1043:8;1024:18;:28::i;:::-;844:215:::0;:::o;539:156::-;598:5;;:19;:5;607:10;598:19;594:95;;640:38;;;;;667:10;640:38;;;744:74:9;717:18;;640:38:4;598:226:9;594:95:4;539:156::o;1213:185::-;1286:16;1305:5;;;1320:16;;;;;;;;;;1351:40;;1305:5;;;;;;;1351:40;;1286:16;1351:40;1276:122;1213:185;:::o;14:196:9:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:186::-;274:6;327:2;315:9;306:7;302:23;298:32;295:52;;;343:1;340;333:12;295:52;366:29;385:9;366:29;:::i;:::-;356:39;215:186;-1:-1:-1;;;215:186:9:o;829:347::-;894:6;902;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;:::-;984:39;;1073:2;1062:9;1058:18;1045:32;1120:5;1113:13;1106:21;1099:5;1096:32;1086:60;;1142:1;1139;1132:12;1086:60;1165:5;1155:15;;;829:347;;;;;:::o","linkReferences":{},"immutableReferences":{}}}}}}},"signatures":{"function":[{"signature":"feeTreasury()","signatureHash4":"0x60dc2340","signatureHash32":"0x60dc23403965c2c1fb320e1f401e71367f38bed8575b5e377e602740409d0896"},{"signature":"isMarketCreator(address)","signatureHash4":"0xf97b7a3b","signatureHash32":"0xf97b7a3b0970a71125abe951b3dacd0c8b3a91dbafb871c2e0fa7a96f909c879"},{"signature":"isPauser(address)","signatureHash4":"0x46fbf68e","signatureHash32":"0x46fbf68e9af4b174565acc7a5f5256df89a0019864cab4994b666e1897990183"},{"signature":"isPositionMigrator(address)","signatureHash4":"0x1622c70f","signatureHash32":"0x1622c70f65f305688d1a0028d2039246be048febb8cfa3cc9060ac29f23786c8"},{"signature":"owner()","signatureHash4":"0x8da5cb5b","signatureHash32":"0x8da5cb5b36e7f68c1d2e56001220cdbdd3ba2616072f718acfda4a06441a807d"},{"signature":"setFeeTreasury(address)","signatureHash4":"0xbfa37e37","signatureHash32":"0xbfa37e37178224310060afad09c46f36577d8634f9b838352d10698f238c9deb"},{"signature":"setIsMarketCreator(address,bool)","signatureHash4":"0x92b3c8f9","signatureHash32":"0x92b3c8f903daf120d2c3d2daa82cc028263882dcc3e4cf7746e19b80142a73df"},{"signature":"setIsPauser(address,bool)","signatureHash4":"0x85685206","signatureHash32":"0x85685206a1088ff516bb73ce9e6528bb20fd841cd2a5c0378ba43132e556029b"},{"signature":"setIsPositionMigrator(address,bool)","signatureHash4":"0x95853024","signatureHash32":"0x958530244a384943226784b2b6630fd0e3f0fc3fadc97e28831d8b4e88ad77e7"},{"signature":"transferOwnership(address)","signatureHash4":"0xf2fde38b","signatureHash32":"0xf2fde38b092330466c661fc723d5289b90272a3e580e3187d1d7ef788506c557"}],"event":[{"signature":"OwnershipTransferred(address,address)","signatureHash4":"0x8be0079c","signatureHash32":"0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0"},{"signature":"SetFeeTreasury(address)","signatureHash4":"0x952ba3b0","signatureHash32":"0x952ba3b07043e6476b47133289f9f79bf5bfbde4e1e1ed0bd70cc93a83cb0cb7"},{"signature":"SetIsMarketCreator(address,bool)","signatureHash4":"0xd3bc84ac","signatureHash32":"0xd3bc84ac5d426fb5f9731b21c0663b27a82deb84a15859753c129f2561123f8f"},{"signature":"SetIsPauser(address,bool)","signatureHash4":"0xaf71decd","signatureHash32":"0xaf71decd95e1263e2c80cd2a1bc44a608142bb91d5cc51639b376eaffffb6368"},{"signature":"SetIsPositionMigrator(address,bool)","signatureHash4":"0xe233551e","signatureHash32":"0xe233551e887a5a86f00efc15aebd035ed166c5d04bdd34a22ab312a46e629ae3"}],"error":[{"signature":"CallerNotOwnerOrMarketCreator(address)","signatureHash4":"0xebc78791","signatureHash32":"0xebc78791af7ee99b774b12d95be5b8db924ec4da072640531b79610a9d3d9a96"},{"signature":"NotIRProducer(address)","signatureHash4":"0xdbe1b075","signatureHash32":"0xdbe1b0757c307c20b9ecc68a1dee9e6e5fd585a34747b159777c7e4ec8c1fda7"},{"signature":"OwnableInvalidOwner(address)","signatureHash4":"0x1e4fbdf7","signatureHash32":"0x1e4fbdf7f3ef8bcaa855599e3abf48b232380f183f08f6f813d9ffa5bd585188"},{"signature":"OwnableUnauthorizedAccount(address)","signatureHash4":"0x118cdaa7","signatureHash32":"0x118cdaa7a341953d1887a2245fd6665d741c67c8c50581daa59e1d03373fa188"}]},"proxyResolution":{"isProxy":false,"proxyType":null,"implementations":[]},"match":"exact_match","chainId":"1","address":"0xF3f7669dcEED2f985815011C19eD68F667267215"}