diff --git a/README.md b/README.md index e4f6d67..fa83f12 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ ```rs ./contracts/ +├── Constants.sol ├── DataTypes.sol ├── EventAndErrors.sol ├── lib @@ -18,6 +19,7 @@ │ ├── tokens │ │ └── ERC20.sol │ └── utils +│ ├── ECDSA.sol │ ├── MerkleProofLib.sol │ ├── Multicall.sol │ ├── ReentrancyGuard.sol diff --git a/artifacts/contracts/Constants.sol/Constants.dbg.json b/artifacts/contracts/Constants.sol/Constants.dbg.json new file mode 100644 index 0000000..2344260 --- /dev/null +++ b/artifacts/contracts/Constants.sol/Constants.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/249d92249de0943da88155e04b92fb7f.json" +} diff --git a/artifacts/contracts/Constants.sol/Constants.json b/artifacts/contracts/Constants.sol/Constants.json new file mode 100644 index 0000000..07eaf6a --- /dev/null +++ b/artifacts/contracts/Constants.sol/Constants.json @@ -0,0 +1,10 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "Constants", + "sourceName": "contracts/Constants.sol", + "abi": [], + "bytecode": "0x", + "deployedBytecode": "0x", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json index c23cd42..a349655 100644 --- a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json +++ b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../build-info/3511ccc4f632d4fc1741b59d8fb89855.json" } diff --git a/artifacts/contracts/DataTypes.sol/DataTypes.json b/artifacts/contracts/DataTypes.sol/DataTypes.json index c836aa1..3639b3f 100644 --- a/artifacts/contracts/DataTypes.sol/DataTypes.json +++ b/artifacts/contracts/DataTypes.sol/DataTypes.json @@ -3,8 +3,8 @@ "contractName": "DataTypes", "sourceName": "contracts/DataTypes.sol", "abi": [], - "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212206adb3dae064942e78abcd2b6adb116d65e8b719b79e9f02514e62a1b01f8a03b64736f6c63430008130033", - "deployedBytecode": "0x600080fdfea26469706673582212206adb3dae064942e78abcd2b6adb116d65e8b719b79e9f02514e62a1b01f8a03b64736f6c63430008130033", + "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220e2b83942b5818cc4f73c29200b41672c082782c77a5936ed5de9e316913cd2d264736f6c63430008130033", + "deployedBytecode": "0x600080fdfea2646970667358221220e2b83942b5818cc4f73c29200b41672c082782c77a5936ed5de9e316913cd2d264736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json index c23cd42..af16c51 100644 --- a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json +++ b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/Reputation.sol/Reputation.dbg.json b/artifacts/contracts/Reputation.sol/Reputation.dbg.json index 245da94..af16c51 100644 --- a/artifacts/contracts/Reputation.sol/Reputation.dbg.json +++ b/artifacts/contracts/Reputation.sol/Reputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/906fc0dd8b27e18481e135d1f328d0ae.json" + "buildInfo": "../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json index b512f4d..77f4404 100644 --- a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json +++ b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/b608b6eb28957aeb71328924500ce935.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json +++ b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json +++ b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json +++ b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json new file mode 100644 index 0000000..e949d99 --- /dev/null +++ b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../../../build-info/7e64ed907e656944d305af383d70ed0c.json" +} diff --git a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json new file mode 100644 index 0000000..f17ddfb --- /dev/null +++ b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json @@ -0,0 +1,16 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "ECDSA", + "sourceName": "contracts/lib/utils/ECDSA.sol", + "abi": [ + { + "inputs": [], + "name": "InvalidSignature", + "type": "error" + } + ], + "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033", + "deployedBytecode": "0x600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json +++ b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json b/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json +++ b/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +++ b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json index ca3d07f..77f4404 100644 --- a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json +++ b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/cec3ec245aa8292dcd32990ec72987ab.json" + "buildInfo": "../../../../build-info/6c3e670658cfbeb3de636ecbaa8ad53a.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index 9a2b475..2344260 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/b608b6eb28957aeb71328924500ce935.json" + "buildInfo": "../../build-info/249d92249de0943da88155e04b92fb7f.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index 4c03cde..134c423 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -404,19 +404,6 @@ "name": "ValidSignersUpdated", "type": "event" }, - { - "inputs": [], - "name": "WAD", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -658,14 +645,14 @@ "type": "address" }, { - "internalType": "uint256", + "internalType": "uint80", "name": "_relayerPremium", - "type": "uint256" + "type": "uint80" }, { - "internalType": "uint256", + "internalType": "uint80", "name": "_amount", - "type": "uint256" + "type": "uint80" }, { "internalType": "bytes32[]", @@ -682,7 +669,7 @@ "outputs": [ { "internalType": "uint256", - "name": "", + "name": "lockID", "type": "uint256" } ], @@ -722,16 +709,6 @@ "name": "counter", "type": "uint256" }, - { - "internalType": "uint256", - "name": "relayerPremium", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "amount", - "type": "uint256" - }, { "internalType": "uint256", "name": "expirationBlock", @@ -742,6 +719,16 @@ "name": "pixTarget", "type": "uint160" }, + { + "internalType": "uint80", + "name": "relayerPremium", + "type": "uint80" + }, + { + "internalType": "uint80", + "name": "amount", + "type": "uint80" + }, { "internalType": "address", "name": "buyerAddress", @@ -1074,8 +1061,8 @@ "type": "receive" } ], - "bytecode": "0x608060405262002a0f803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516125d99081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033", - "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033", + "bytecode": "0x608060405262002c24803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516127ee9081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102065780630d2a2d441461020157806313af4035146101fc5780632cc0f905146101f7578063328a7181146101f2578063367821f0146101ed578063461f3120146101a757806349ef8448146101e85780634b2ae980146101e3578063574983c8146101de5780635fd8c710146101d957806369cc6af4146101d45780636d82d9e0146101cf57806377cd38a4146101ca5780637f94f65d146101c557806380e1d302146101c057806384ab1d28146101bb5780638da5cb5b146101b65780638db564c2146101b15780639872dbfe146101ac57806398a26871146101a75780639eee8d4b146101a2578063ad8f2eed1461019d578063b0983d3914610198578063c52164c614610193578063c593dfd81461018e578063d1c0702814610189578063d4fac45d14610184578063d6e8b9731461017f578063f7d0e04b1461017a5763fb8c5ef00361000e57611678565b611608565b61155d565b611544565b6114a2565b610f64565b610f30565b610ef6565b610ea0565b610e60565b61093c565b610e42565b610e24565b610df0565b610dba565b610da1565b610d50565b610d18565b610c07565b610bc7565b610b44565b610ae0565b610ab6565b610a1f565b610881565b610651565b61058d565b610498565b61036b565b346102325760206003193601126102325760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102a757604052565b610237565b60405190610120820182811067ffffffffffffffff8211176102a757604052565b67ffffffffffffffff81116102a75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361023257565b81601f820112156102325780359161031a836102cd565b926103286040519485610266565b808452602092838086019260051b820101928311610232578301905b828210610352575050505090565b8380918335610360816102e5565b815201910190610344565b34610232576020806003193601126102325760043567ffffffffffffffff81116102325761039d903690600401610303565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361046e57805181830192849160051b830181013d1515855b811561043a575b50505060405192818401908285525180915260408401949160005b828110610424577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b83518516875295810195928101926001016103f5565b90838260018298969499979951600c1b550190838210156104625791509593959492946103d3565b509593959492946103da565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576004356104b5816102e5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361046e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b6064359069ffffffffffffffffffff8216820361023257565b6084359069ffffffffffffffffffff8216820361023257565b9181601f840112156102325782359167ffffffffffffffff8311610232576020808501948460051b01011161023257565b346102325760e0600319360112610232576004356105aa816102e5565b602435906105b7826102e5565b604435916105c4836102e5565b6105cc61052a565b916105d5610543565b67ffffffffffffffff9360a435858111610232576105f790369060040161055c565b92909160c435968711610232576106319761061961062198369060040161055c565b979096611927565b6040519081529081906020820190565b0390f35b60643590811515820361023257565b3590811515820361023257565b346102325760a06003193601126102325760043561066e816102e5565b6024356bffffffffffffffffffffffff8116908181036102325760443590610695826102e5565b61069d610635565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610857576106e56106e18363cbc9d1c4600c526000526020600c205490565b1590565b61082d576b3fffffffffffffffffffffff61071683839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061072e85846117ce565b1161080357826107ee976107a89661077a8961079f967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61076e6117db565b806107f3575b506117ce565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611816565b6107b160018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107fd9033611fc7565b38610774565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102325760206003193601126102325760048035600090815260056020818152604092839020805460018201546002830154600384015497840154958401546006909401548751938452948301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff808616606086015269ffffffffffffffffffff60a096871c8116608087015284169585019590955260509290921c841660c084015290831660e08301529190911661010082015261012090f35b34610232576020600319360112610232576020600435546040519015158152f35b90815180825260208080930193019160005b82811061097d575050505090565b83518552938101939281019260010161096f565b906109a49060408352604083019061095d565b81810360209283015282518082529082019282019160009190825b8281106109ce57505050505090565b909192939485516004808210156109f3575081528201948201939291906001016109bf565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610232576020806003193601126102325760043567ffffffffffffffff8111610232573660238201121561023257806004013590610a5d826102cd565b91610a6b6040519384610266565b80835260248484019160051b8301019136831161023257602401905b828210610aa757610a9784612654565b9061063160405192839283610991565b81358152908401908401610a87565b34610232576020600319360112610232576020600435610ad5816102e5565b60405190600c1b8152f35b346102325760206003193601126102325760043573ffffffffffffffffffffffffffffffffffffffff60005416330361046e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461023257600080600319360112610bc45773ffffffffffffffffffffffffffffffffffffffff815416330361046e57478180808084335af115610bb7576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610232576020600319360112610232576020610bfd600435610be9816102e5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b3461023257604060031936011261023257600435610c24816102e5565b602435801515908181036102325733600c1b610c5684829060205263739094b1600c52600c1c6000526034600c205490565b918215610cee57610ca5927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576020610d486004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461023257604060031936011261023257610019600435610d70816102e5565b60243590611fc7565b600319604091011261023257600435610d91816102e5565b90602435610d9e816102e5565b90565b34610232576020610bfd610db436610d79565b9061259c565b3461023257602060031936011261023257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610232576000600319360112610232576020600454604051908152f35b34610232576000600319360112610232576020600354604051908152f35b34610232576040600319360112610232576020610d48602435610e82816102e5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461023257610eae36610d79565b6000903d15610ed9575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610eb8565b346102325760206003193601126102325760043567ffffffffffffffff811161023257610f2a61001991369060040161055c565b90611d6d565b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102325760a06003193601126102325760048035906084359060ff8216820361023257610f906117db565b610fa4836000526005602052604060002090565b81810191610fbc835469ffffffffffffffffffff1690565b9169ffffffffffffffffffff908184169586156114685760028201928354431161143f57600383019485549660405161109f816110738b602083019573ffffffffffffffffffffffffffffffffffffffff602435921687917fffffffffffffffffffff00000000000000000000000000000000000000000000907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000603e959360601b16845260b01b166014830152601e8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610266565b519020928354611416576110f56110ef6110fa9260643590604435906110ea896020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b611c7c565b600c1b90565b541590565b6113ee5750926112886005846111b3611161989560006111858e7f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89f9e9b61117a6112ca9f9c600661116191015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b9b60a01c1690611c6f565b8a547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168b55965560019055565b01916111d6611161845473ffffffffffffffffffffffffffffffffffffffff1690565b33146113a95783546112019060a01c69ffffffffffffffffffff165b69ffffffffffffffffffff1690565b61122361121b33600c1b6000526006602052604060002090565b9182546117ce565b90556112596112496110ef855473ffffffffffffffffffffffffffffffffffffffff1690565b6000526006602052604060002090565b6112648a82546117ce565b90555b855460501c73ffffffffffffffffffffffffffffffffffffffff1685611ce0565b81546112a29060a01c69ffffffffffffffffffff166111f2565b806112e4575b505050505473ffffffffffffffffffffffffffffffffffffffff9060501c1690565b60408051948552602085019290925292a261001960018055565b611305611161835473ffffffffffffffffffffffffffffffffffffffff1690565b331461139657506111f261135961138d949361137261133b611385955473ffffffffffffffffffffffffffffffffffffffff1690565b61136b6111f2611359855469ffffffffffffffffffff9060a01c1690565b60011c697fffffffffffffffffff1690565b9087611ce0565b5460a01c69ffffffffffffffffffff1690565b903390611ce0565b388080806112a8565b9150506113a4913390611ce0565b61138d565b6113cd896113c86111f2875469ffffffffffffffffffff9060a01c1690565b6117ce565b6113e761121b33600c1b6000526006602052604060002090565b9055611267565b6040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b506040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b846040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b836040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610d9e92818152019061095d565b346102325760406003193601126102325760043567ffffffffffffffff8111610232576114d3903690600401610303565b602435906114e0826102e5565b6000918151916114ef836125f1565b935b83811061150657604051806106318782611491565b806115338473ffffffffffffffffffffffffffffffffffffffff61152c60019587612640565b5116612565565b61153d8288612640565b52016114f1565b34610232576020610d4861155736610d79565b90612565565b346102325760406003193601126102325767ffffffffffffffff6004358181116102325761158f903690600401610303565b9060243590811161023257366023820112156102325780600401356115b3816102cd565b916115c16040519384610266565b81835260209160248385019160051b8301019136831161023257602401905b8282106115f1576100198587612016565b8380916115fd84610644565b8152019101906115e0565b3461023257602060031936011261023257600435611625816102e5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361046e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461023257606060031936011261023257600435611695816102e5565b60243560443567ffffffffffffffff8111610232577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116ee6116e061177593369060040161055c565b906116e96117db565b611d6d565b6116f8843361259c565b61177e575b61173933600c1b85836b3fffffffffffffffffffffff61173383859060205263739094b1600c52600c1c6000526034600c205490565b16612529565b611744813386611ce0565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6117878461186f565b6116fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90600182018092116117c957565b61178c565b919082018092116117c957565b6002600154146117ec576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611861576000606052604052565b637939f4246000526004601cfd5b33600c1b61189382829060205263739094b1600c52600c1c6000526034600c205490565b908115610cee57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118dc9316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b92949761194e9073ffffffffffffffffffffffffffffffffffffffff9395986116e96117db565b169361195d6106e1868461259c565b611c285761196b8583612565565b9669ffffffffffffffffffff9687811693848a10611bfe57600c1b976119926004546117bb565b9560026119a9886000526005602052604060002090565b0154431115611bd4576003546119bf90436117ce565b976119e08a8c9060205263739094b1600c52600c1c6000526034600c205490565b605f1c611a009073ffffffffffffffffffffffffffffffffffffffff1690565b611a086102ac565b8c8152602081018a9052604081019a909a5273ffffffffffffffffffffffffffffffffffffffff1660608a015269ffffffffffffffffffff16608089015260a0880192611a6190849069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c08801523360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528315611ae4575050611ad89791611ad3913391611acd8a6374dfee70600c52600c1c60005260206000205490565b91612422565b612146565b90611ae260018055565b565b819350809250611b0868056bc75e2d63100000925169ffffffffffffffffffff1690565b1611611b1e575050611b1995612146565b611ad8565b611b4f611b4a611b3b33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6124b0565b81611b6d611b67855169ffffffffffffffffffff1690565b92611c52565b911611918215611bb1575b5050611b8757611b1995612146565b60046040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880611b78565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b90670de0b6b3a7640000918281029281840414901517156117c957565b919082039182116117c957565b9060806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a160ff9796604051966000998a968795865216875260405280606052105afa508251923d15611cd357606052604052565b638baa579f90526004601cfd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611d1c57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611d685760051b0190565b611d29565b6000905b828210611d8e575010611d8057565b63dfb035c96000526004601cfd5b90611dae611d9d828585611d58565b356000526005602052604060002090565b611db7816120cd565b805490611dde611161600683015473ffffffffffffffffffffffffffffffffffffffff1690565b6b3fffffffffffffffffffffff611e0b82859060205263739094b1600c52600c1c6000526034600c205490565b1690600493848401946a52b7d2dcc80cd2e4000000611e41611e3a6111f2895469ffffffffffffffffffff1690565b80966117ce565b11611f9f57506005611f2e94611e7c6001989795611ebd956110ef959060205263739094b1600c52600c1c6000526034600c20908154019055565b84547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168555015473ffffffffffffffffffffffffffffffffffffffff1690565b611edb611ed4826000526006602052604060002090565b5460011c90565b68056bc75e2d631000008111611f845750611f03611f11916000526006602052604060002090565b68056bc75e2d631000009055565b5460501c73ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611f6f848888611d58565b60405190358152921691602090a20190611d71565b90611f99906000526006602052604060002090565b55611f11565b6040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b338103612008576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361046e5782519182156120c057815183036120b357602092919284818080970195019360051b0101925b83810361206c575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a30192019161205e565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60028101544310611bd4576004015469ffffffffffffffffffff16156120ef57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117c95760010190565b9095949391938460005260056020526040600020928451845560208501516001850155604085015160028501556003840160608601516121999073ffffffffffffffffffffffffffffffffffffffff1690565b8154608088015173ffffffffffffffffffffffffffffffffffffffff929092167fffff0000000000000000000000000000000000000000000000000000000000009091161760a091821b7dffffffffffffffffffff0000000000000000000000000000000000000000161790915585018051600486019991959069ffffffffffffffffffff168a547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff909116178a5560c08701998a516122789073ffffffffffffffffffffffffffffffffffffffff1690565b81547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509190911b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617905560e087015173ffffffffffffffffffffffffffffffffffffffff166005820190612329919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61010087015173ffffffffffffffffffffffffffffffffffffffff16906006019061238e919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61239793612529565b6004546123a390612119565b6004558294516123c69073ffffffffffffffffffffffffffffffffffffffff1690565b915190516040805192835269ffffffffffffffffffff909116602083015273ffffffffffffffffffffffffffffffffffffffff909216917f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6591a3565b73ffffffffffffffffffffffffffffffffffffffff8293941692612474575b50500361244a57565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156124a557929061247e565b509150503880612441565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102a7576020926000926040525190600254617530fa90600051911561251b57565b63e10bf1cc6000526004601cfd5b9291909280848103119015176125575760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d15612573575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156125aa575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102a75760405260008152906000368137565b906125fb826102cd565b6126086040519182610266565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061263682946102cd565b0190602036910137565b8051821015611d685760209160051b010190565b908151156127a5576000809280519061266c826125f1565b92612676836125f1565b955b83811061268757505050509190565b806126a861269760019386612640565b516000526005602052604060002090565b546126d8576126b78185612640565b516126c28288612640565b52826126ce828a612640565b5201925b92612678565b69ffffffffffffffffffff61270660046126f56126978589612640565b015469ffffffffffffffffffff1690565b1661273b576127158185612640565b516127208288612640565b5261273461272e828a612640565b60039052565b01926126d2565b600261274a6126978387612640565b015443111561277c5761275d8185612640565b516127688288612640565b52612734612776828a612640565b60029052565b6127868185612640565b516127918288612640565b5261273461279f828a612640565b60019052565b90506127af6125c8565b90610d9e6125c856fea2646970667358221220637ef5dab3f877f94aaa3a47dff24e5d03955b1e35519a927aad5c994df7ece964736f6c63430008130033", + "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102065780630d2a2d441461020157806313af4035146101fc5780632cc0f905146101f7578063328a7181146101f2578063367821f0146101ed578063461f3120146101a757806349ef8448146101e85780634b2ae980146101e3578063574983c8146101de5780635fd8c710146101d957806369cc6af4146101d45780636d82d9e0146101cf57806377cd38a4146101ca5780637f94f65d146101c557806380e1d302146101c057806384ab1d28146101bb5780638da5cb5b146101b65780638db564c2146101b15780639872dbfe146101ac57806398a26871146101a75780639eee8d4b146101a2578063ad8f2eed1461019d578063b0983d3914610198578063c52164c614610193578063c593dfd81461018e578063d1c0702814610189578063d4fac45d14610184578063d6e8b9731461017f578063f7d0e04b1461017a5763fb8c5ef00361000e57611678565b611608565b61155d565b611544565b6114a2565b610f64565b610f30565b610ef6565b610ea0565b610e60565b61093c565b610e42565b610e24565b610df0565b610dba565b610da1565b610d50565b610d18565b610c07565b610bc7565b610b44565b610ae0565b610ab6565b610a1f565b610881565b610651565b61058d565b610498565b61036b565b346102325760206003193601126102325760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102a757604052565b610237565b60405190610120820182811067ffffffffffffffff8211176102a757604052565b67ffffffffffffffff81116102a75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361023257565b81601f820112156102325780359161031a836102cd565b926103286040519485610266565b808452602092838086019260051b820101928311610232578301905b828210610352575050505090565b8380918335610360816102e5565b815201910190610344565b34610232576020806003193601126102325760043567ffffffffffffffff81116102325761039d903690600401610303565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361046e57805181830192849160051b830181013d1515855b811561043a575b50505060405192818401908285525180915260408401949160005b828110610424577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b83518516875295810195928101926001016103f5565b90838260018298969499979951600c1b550190838210156104625791509593959492946103d3565b509593959492946103da565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576004356104b5816102e5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361046e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b6064359069ffffffffffffffffffff8216820361023257565b6084359069ffffffffffffffffffff8216820361023257565b9181601f840112156102325782359167ffffffffffffffff8311610232576020808501948460051b01011161023257565b346102325760e0600319360112610232576004356105aa816102e5565b602435906105b7826102e5565b604435916105c4836102e5565b6105cc61052a565b916105d5610543565b67ffffffffffffffff9360a435858111610232576105f790369060040161055c565b92909160c435968711610232576106319761061961062198369060040161055c565b979096611927565b6040519081529081906020820190565b0390f35b60643590811515820361023257565b3590811515820361023257565b346102325760a06003193601126102325760043561066e816102e5565b6024356bffffffffffffffffffffffff8116908181036102325760443590610695826102e5565b61069d610635565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610857576106e56106e18363cbc9d1c4600c526000526020600c205490565b1590565b61082d576b3fffffffffffffffffffffff61071683839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061072e85846117ce565b1161080357826107ee976107a89661077a8961079f967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61076e6117db565b806107f3575b506117ce565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611816565b6107b160018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107fd9033611fc7565b38610774565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102325760206003193601126102325760048035600090815260056020818152604092839020805460018201546002830154600384015497840154958401546006909401548751938452948301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff808616606086015269ffffffffffffffffffff60a096871c8116608087015284169585019590955260509290921c841660c084015290831660e08301529190911661010082015261012090f35b34610232576020600319360112610232576020600435546040519015158152f35b90815180825260208080930193019160005b82811061097d575050505090565b83518552938101939281019260010161096f565b906109a49060408352604083019061095d565b81810360209283015282518082529082019282019160009190825b8281106109ce57505050505090565b909192939485516004808210156109f3575081528201948201939291906001016109bf565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610232576020806003193601126102325760043567ffffffffffffffff8111610232573660238201121561023257806004013590610a5d826102cd565b91610a6b6040519384610266565b80835260248484019160051b8301019136831161023257602401905b828210610aa757610a9784612654565b9061063160405192839283610991565b81358152908401908401610a87565b34610232576020600319360112610232576020600435610ad5816102e5565b60405190600c1b8152f35b346102325760206003193601126102325760043573ffffffffffffffffffffffffffffffffffffffff60005416330361046e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461023257600080600319360112610bc45773ffffffffffffffffffffffffffffffffffffffff815416330361046e57478180808084335af115610bb7576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610232576020600319360112610232576020610bfd600435610be9816102e5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b3461023257604060031936011261023257600435610c24816102e5565b602435801515908181036102325733600c1b610c5684829060205263739094b1600c52600c1c6000526034600c205490565b918215610cee57610ca5927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576020610d486004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461023257604060031936011261023257610019600435610d70816102e5565b60243590611fc7565b600319604091011261023257600435610d91816102e5565b90602435610d9e816102e5565b90565b34610232576020610bfd610db436610d79565b9061259c565b3461023257602060031936011261023257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610232576000600319360112610232576020600454604051908152f35b34610232576000600319360112610232576020600354604051908152f35b34610232576040600319360112610232576020610d48602435610e82816102e5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461023257610eae36610d79565b6000903d15610ed9575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610eb8565b346102325760206003193601126102325760043567ffffffffffffffff811161023257610f2a61001991369060040161055c565b90611d6d565b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102325760a06003193601126102325760048035906084359060ff8216820361023257610f906117db565b610fa4836000526005602052604060002090565b81810191610fbc835469ffffffffffffffffffff1690565b9169ffffffffffffffffffff908184169586156114685760028201928354431161143f57600383019485549660405161109f816110738b602083019573ffffffffffffffffffffffffffffffffffffffff602435921687917fffffffffffffffffffff00000000000000000000000000000000000000000000907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000603e959360601b16845260b01b166014830152601e8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610266565b519020928354611416576110f56110ef6110fa9260643590604435906110ea896020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b611c7c565b600c1b90565b541590565b6113ee5750926112886005846111b3611161989560006111858e7f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89f9e9b61117a6112ca9f9c600661116191015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b9b60a01c1690611c6f565b8a547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168b55965560019055565b01916111d6611161845473ffffffffffffffffffffffffffffffffffffffff1690565b33146113a95783546112019060a01c69ffffffffffffffffffff165b69ffffffffffffffffffff1690565b61122361121b33600c1b6000526006602052604060002090565b9182546117ce565b90556112596112496110ef855473ffffffffffffffffffffffffffffffffffffffff1690565b6000526006602052604060002090565b6112648a82546117ce565b90555b855460501c73ffffffffffffffffffffffffffffffffffffffff1685611ce0565b81546112a29060a01c69ffffffffffffffffffff166111f2565b806112e4575b505050505473ffffffffffffffffffffffffffffffffffffffff9060501c1690565b60408051948552602085019290925292a261001960018055565b611305611161835473ffffffffffffffffffffffffffffffffffffffff1690565b331461139657506111f261135961138d949361137261133b611385955473ffffffffffffffffffffffffffffffffffffffff1690565b61136b6111f2611359855469ffffffffffffffffffff9060a01c1690565b60011c697fffffffffffffffffff1690565b9087611ce0565b5460a01c69ffffffffffffffffffff1690565b903390611ce0565b388080806112a8565b9150506113a4913390611ce0565b61138d565b6113cd896113c86111f2875469ffffffffffffffffffff9060a01c1690565b6117ce565b6113e761121b33600c1b6000526006602052604060002090565b9055611267565b6040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b506040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b846040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b836040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610d9e92818152019061095d565b346102325760406003193601126102325760043567ffffffffffffffff8111610232576114d3903690600401610303565b602435906114e0826102e5565b6000918151916114ef836125f1565b935b83811061150657604051806106318782611491565b806115338473ffffffffffffffffffffffffffffffffffffffff61152c60019587612640565b5116612565565b61153d8288612640565b52016114f1565b34610232576020610d4861155736610d79565b90612565565b346102325760406003193601126102325767ffffffffffffffff6004358181116102325761158f903690600401610303565b9060243590811161023257366023820112156102325780600401356115b3816102cd565b916115c16040519384610266565b81835260209160248385019160051b8301019136831161023257602401905b8282106115f1576100198587612016565b8380916115fd84610644565b8152019101906115e0565b3461023257602060031936011261023257600435611625816102e5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361046e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461023257606060031936011261023257600435611695816102e5565b60243560443567ffffffffffffffff8111610232577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116ee6116e061177593369060040161055c565b906116e96117db565b611d6d565b6116f8843361259c565b61177e575b61173933600c1b85836b3fffffffffffffffffffffff61173383859060205263739094b1600c52600c1c6000526034600c205490565b16612529565b611744813386611ce0565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6117878461186f565b6116fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90600182018092116117c957565b61178c565b919082018092116117c957565b6002600154146117ec576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611861576000606052604052565b637939f4246000526004601cfd5b33600c1b61189382829060205263739094b1600c52600c1c6000526034600c205490565b908115610cee57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118dc9316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b92949761194e9073ffffffffffffffffffffffffffffffffffffffff9395986116e96117db565b169361195d6106e1868461259c565b611c285761196b8583612565565b9669ffffffffffffffffffff9687811693848a10611bfe57600c1b976119926004546117bb565b9560026119a9886000526005602052604060002090565b0154431115611bd4576003546119bf90436117ce565b976119e08a8c9060205263739094b1600c52600c1c6000526034600c205490565b605f1c611a009073ffffffffffffffffffffffffffffffffffffffff1690565b611a086102ac565b8c8152602081018a9052604081019a909a5273ffffffffffffffffffffffffffffffffffffffff1660608a015269ffffffffffffffffffff16608089015260a0880192611a6190849069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c08801523360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528315611ae4575050611ad89791611ad3913391611acd8a6374dfee70600c52600c1c60005260206000205490565b91612422565b612146565b90611ae260018055565b565b819350809250611b0868056bc75e2d63100000925169ffffffffffffffffffff1690565b1611611b1e575050611b1995612146565b611ad8565b611b4f611b4a611b3b33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6124b0565b81611b6d611b67855169ffffffffffffffffffff1690565b92611c52565b911611918215611bb1575b5050611b8757611b1995612146565b60046040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880611b78565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b90670de0b6b3a7640000918281029281840414901517156117c957565b919082039182116117c957565b9060806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a160ff9796604051966000998a968795865216875260405280606052105afa508251923d15611cd357606052604052565b638baa579f90526004601cfd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611d1c57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611d685760051b0190565b611d29565b6000905b828210611d8e575010611d8057565b63dfb035c96000526004601cfd5b90611dae611d9d828585611d58565b356000526005602052604060002090565b611db7816120cd565b805490611dde611161600683015473ffffffffffffffffffffffffffffffffffffffff1690565b6b3fffffffffffffffffffffff611e0b82859060205263739094b1600c52600c1c6000526034600c205490565b1690600493848401946a52b7d2dcc80cd2e4000000611e41611e3a6111f2895469ffffffffffffffffffff1690565b80966117ce565b11611f9f57506005611f2e94611e7c6001989795611ebd956110ef959060205263739094b1600c52600c1c6000526034600c20908154019055565b84547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168555015473ffffffffffffffffffffffffffffffffffffffff1690565b611edb611ed4826000526006602052604060002090565b5460011c90565b68056bc75e2d631000008111611f845750611f03611f11916000526006602052604060002090565b68056bc75e2d631000009055565b5460501c73ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611f6f848888611d58565b60405190358152921691602090a20190611d71565b90611f99906000526006602052604060002090565b55611f11565b6040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b338103612008576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361046e5782519182156120c057815183036120b357602092919284818080970195019360051b0101925b83810361206c575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a30192019161205e565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60028101544310611bd4576004015469ffffffffffffffffffff16156120ef57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117c95760010190565b9095949391938460005260056020526040600020928451845560208501516001850155604085015160028501556003840160608601516121999073ffffffffffffffffffffffffffffffffffffffff1690565b8154608088015173ffffffffffffffffffffffffffffffffffffffff929092167fffff0000000000000000000000000000000000000000000000000000000000009091161760a091821b7dffffffffffffffffffff0000000000000000000000000000000000000000161790915585018051600486019991959069ffffffffffffffffffff168a547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff909116178a5560c08701998a516122789073ffffffffffffffffffffffffffffffffffffffff1690565b81547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509190911b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617905560e087015173ffffffffffffffffffffffffffffffffffffffff166005820190612329919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61010087015173ffffffffffffffffffffffffffffffffffffffff16906006019061238e919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61239793612529565b6004546123a390612119565b6004558294516123c69073ffffffffffffffffffffffffffffffffffffffff1690565b915190516040805192835269ffffffffffffffffffff909116602083015273ffffffffffffffffffffffffffffffffffffffff909216917f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6591a3565b73ffffffffffffffffffffffffffffffffffffffff8293941692612474575b50500361244a57565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156124a557929061247e565b509150503880612441565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102a7576020926000926040525190600254617530fa90600051911561251b57565b63e10bf1cc6000526004601cfd5b9291909280848103119015176125575760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d15612573575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156125aa575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102a75760405260008152906000368137565b906125fb826102cd565b6126086040519182610266565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061263682946102cd565b0190602036910137565b8051821015611d685760209160051b010190565b908151156127a5576000809280519061266c826125f1565b92612676836125f1565b955b83811061268757505050509190565b806126a861269760019386612640565b516000526005602052604060002090565b546126d8576126b78185612640565b516126c28288612640565b52826126ce828a612640565b5201925b92612678565b69ffffffffffffffffffff61270660046126f56126978589612640565b015469ffffffffffffffffffff1690565b1661273b576127158185612640565b516127208288612640565b5261273461272e828a612640565b60039052565b01926126d2565b600261274a6126978387612640565b015443111561277c5761275d8185612640565b516127688288612640565b52612734612776828a612640565b60029052565b6127868185612640565b516127918288612640565b5261273461279f828a612640565b60019052565b90506127af6125c8565b90610d9e6125c856fea2646970667358221220637ef5dab3f877f94aaa3a47dff24e5d03955b1e35519a927aad5c994df7ece964736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/Constants.sol b/contracts/Constants.sol new file mode 100644 index 0000000..85759f4 --- /dev/null +++ b/contracts/Constants.sol @@ -0,0 +1,49 @@ +// SPDX-License-Identifier: MIT +pragma solidity 0.8.19; + +abstract contract Constants { + /// ███ Constants ██████████████████████████████████████████████████████████ + + uint256 constant _ROOT_UPDATED_EVENT_SIGNATURE = + 0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632; + uint256 constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE = + 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a; + + /// @dev Seller casted to key => Seller's allowlist merkleroot. + /// mapping(uint256 => bytes32) public sellerAllowList; + uint256 constant _SELLER_ALLOWLIST_SLOT_SEED = 0x74dfee70; + /// @dev Tokens allowed to serve as the underlying amount of a deposit. + /// mapping(ERC20 => bool) public allowedERC20s; + uint256 constant _ALLOWED_ERC20_SLOT_SEED = 0xcbc9d1c4; + + /// @dev `balance` max. value = 10**26. + /// @dev `pixTarget` keys are restricted to 160 bits. + /// mapping(uint256 => mapping(ERC20 => uint256)) public sellerBalance; + + /// @dev Bits layout: + /// `uint96` [0...94] := balance + /// `uint160` [95...254] := pixTarget + /// `bool` [255] := valid + + /// @dev Value in custom storage slot given by: + /// mstore(0x20, token) + /// mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + /// mstore(0x00, seller) + /// let value := sload(keccak256(0x0c, 0x34)). + uint256 constant _SELLER_BALANCE_SLOT_SEED = 0x739094b1; + + /// @dev The bitmask of `sellerBalance` entry. + uint256 constant BITMASK_SB_ENTRY = (1 << 94) - 1; + /// @dev The bit position of `pixTarget` in `sellerBalance`. + uint256 constant BITPOS_PIXTARGET = 95; + /// @dev The bit position of `valid` in `sellerBalance`. + uint256 constant BITPOS_VALID = 255; + /// @dev The bitmask of all 256 bits of `sellerBalance` except for the last one. + uint256 constant BITMASK_VALID = (1 << 255) - 1; + + /// @dev The scalar of BRZ token. + uint256 constant WAD = 1e18; + uint256 constant MAXBALANCE_UPPERBOUND = 1e8 ether; + uint256 constant REPUTATION_LOWERBOUND = 1e2 ether; + uint256 constant LOCKAMOUNT_UPPERBOUND = 1e6 ether; +} diff --git a/contracts/DataTypes.sol b/contracts/DataTypes.sol index 64aee3b..564fb48 100644 --- a/contracts/DataTypes.sol +++ b/contracts/DataTypes.sol @@ -5,14 +5,14 @@ library DataTypes { struct Lock { uint256 sellerKey; uint256 counter; - /// @dev Amount to be paid for relayer. - uint256 relayerPremium; - /// @dev Amount to be tranfered via PIX. - uint256 amount; /// @dev If not paid at this block will be expired. uint256 expirationBlock; uint160 pixTarget; + /// @dev Amount to be paid for relayer. + uint80 relayerPremium; /// @dev Where the tokens are sent the when order gets validated. + /// @dev Amount to be tranfered via PIX. + uint80 amount; address buyerAddress; /// @dev Relayer address (msg.sender) that facilitated this transaction. /// @dev Relayer's target address that receives `relayerPremium` funds. diff --git a/contracts/lib/utils/ECDSA.sol b/contracts/lib/utils/ECDSA.sol new file mode 100644 index 0000000..b2c8ad6 --- /dev/null +++ b/contracts/lib/utils/ECDSA.sol @@ -0,0 +1,78 @@ +// SPDX-License-Identifier: MIT +pragma solidity >=0.8.4; + +/// @notice Gas optimized ECDSA wrapper. +/// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/ECDSA.sol) +/// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/ECDSA.sol) +/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/ECDSA.sol) +library ECDSA { + /// @dev The signature is invalid. + error InvalidSignature(); + + /// @dev The number which `s` must not exceed in order for + /// the signature to be non-malleable. + bytes32 private constant _MALLEABILITY_THRESHOLD = + 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0; + + /// @dev Recovers the signer's address from a message digest `hash`, + /// and the signature defined by `v`, `r`, `s`. + function recover( + bytes32 hash, + uint8 v, + bytes32 r, + bytes32 s + ) internal view returns (address result) { + /// @solidity memory-safe-assembly + assembly { + // Copy the free memory pointer so that we can restore it later. + let m := mload(0x40) + mstore(0x00, hash) + mstore(0x20, and(v, 0xff)) + mstore(0x40, r) + mstore(0x60, s) + pop( + staticcall( + gas(), // Amount of gas left for the transaction. + // If `s` in lower half order, such that the signature is not malleable. + lt(s, add(_MALLEABILITY_THRESHOLD, 1)), // Address of `ecrecover`. + 0x00, // Start of input. + 0x80, // Size of input. + 0x00, // Start of output. + 0x20 // Size of output. + ) + ) + result := mload(0x00) + // `returndatasize()` will be `0x20` upon success, and `0x00` otherwise. + if iszero(returndatasize()) { + // Store the function selector of `InvalidSignature()`. + mstore(0x00, 0x8baa579f) + // Revert with (offset, size). + revert(0x1c, 0x04) + } + // Restore the zero slot. + mstore(0x60, 0) + // Restore the free memory pointer. + mstore(0x40, m) + } + } + + /// @dev Returns an Ethereum Signed Message, created from a `hash`. + /// This produces a hash corresponding to the one signed with the + /// [`eth_sign`](https://eth.wiki/json-rpc/API#eth_sign) + /// JSON-RPC method as part of EIP-191. + function toEthSignedMessageHash( + bytes32 hash + ) internal pure returns (bytes32 result) { + /// @solidity memory-safe-assembly + assembly { + // Store into scratch space for keccak256. + mstore(0x20, hash) + mstore( + 0x00, + "\x00\x00\x00\x00\x19Ethereum Signed Message:\n32" + ) + // 0x40 - 0x04 = 0x3c + result := keccak256(0x04, 0x3c) + } + } +} diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 01dc35a..ddc487c 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -12,11 +12,15 @@ import { Owned } from "./lib/auth/Owned.sol"; import { ERC20, SafeTransferLib } from "./lib/utils/SafeTransferLib.sol"; import { IReputation } from "./lib/interfaces/IReputation.sol"; import { MerkleProofLib as Merkle } from "./lib/utils/MerkleProofLib.sol"; +import { ECDSA } from "./lib/utils/ECDSA.sol"; import { ReentrancyGuard } from "./lib/utils/ReentrancyGuard.sol"; import { EventAndErrors } from "./EventAndErrors.sol"; import { DataTypes as DT } from "./DataTypes.sol"; +import { Constants } from "./Constants.sol"; + contract P2PIX is + Constants, EventAndErrors, Owned(msg.sender), ReentrancyGuard @@ -28,53 +32,17 @@ contract P2PIX is using DT for DT.Lock; using DT for DT.LockStatus; - /// ███ Constants ██████████████████████████████████████████████████████████ - - uint256 private constant _ROOT_UPDATED_EVENT_SIGNATURE = - 0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632; - uint256 private constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE = - 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a; - - /// @dev Seller casted to key => Seller's allowlist merkleroot. - /// mapping(uint256 => bytes32) public sellerAllowList; - uint256 private constant _SELLER_ALLOWLIST_SLOT_SEED = 0x74dfee70; - /// @dev Tokens allowed to serve as the underlying amount of a deposit. - /// mapping(ERC20 => bool) public allowedERC20s; - uint256 private constant _ALLOWED_ERC20_SLOT_SEED = 0xcbc9d1c4; - - // BITS LAYOUT - // `uint96` [0...94] := balance - // `uint160` [95...254] := pixTarget - // `bool` [255] := valid - - /// @dev `balance` max. value = 10**26. - /// @dev `pixTarget` keys are restricted to 160 bits. - // mapping(uint256 => mapping(ERC20 => uint256)) public sellerBalance; - uint256 private constant _SELLER_BALANCE_SLOT_SEED = 0x739094b1; - - /// @dev The bitmask of `sellerBalance` entry. - uint256 private constant BITMASK_SB_ENTRY = (1 << 94) - 1; - /// @dev The bit position of `pixTarget` in `sellerBalance`. - uint256 private constant BITPOS_PIXTARGET = 95; - /// @dev The bit position of `valid` in `sellerBalance`. - uint256 private constant BITPOS_VALID = 255; - /// @dev The bitmask of all 256 bits of `sellerBalance` except for the last one. - uint256 private constant BITMASK_VALID = (1 << 255) - 1; - - /// @dev The scalar of BRZ token. - uint256 public constant WAD = 1e18; - /// ███ Storage ████████████████████████████████████████████████████████████ /// @dev List of valid Bacen signature addresses + /// mapping(uint256 => bool) public validBacenSigners; /// @dev Value in custom storage slot given by: - /// let slot := sload(shl(12, address)). - // mapping(uint256 => bool) public validBacenSigners; + /// let value := sload(shl(12, address)). /// @dev List of Pix transactions already signed. + /// mapping(bytes32 => bool) public usedTransactions; /// @dev Value in custom storage slot given by: - /// let slot := sload(bytes32). - // mapping(bytes32 => bool) public usedTransactions; + /// let value := sload(bytes32). IReputation public reputation; @@ -126,7 +94,7 @@ contract P2PIX is uint256 _sellerBalance = sellerBalance(k,t); uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY; - if ((currBal + _amount) > 1e8 ether) + if ((currBal + _amount) > MAXBALANCE_UPPERBOUND) revert MaxBalExceeded(); setReentrancyGuard(); @@ -210,12 +178,11 @@ contract P2PIX is address _seller, address _token, address _buyerAddress, - // address _relayerTarget, - uint256 _relayerPremium, - uint256 _amount, + uint80 _relayerPremium, + uint80 _amount, bytes32[] calldata merkleProof, uint256[] calldata expiredLocks - ) public nonReentrant returns (uint256) { + ) public nonReentrant returns (uint256 lockID) { unlockExpired(expiredLocks); ERC20 t = ERC20(_token); @@ -235,58 +202,32 @@ contract P2PIX is DT.Lock memory l = DT.Lock( k, cCounter, - _relayerPremium, - _amount, (block.number + defaultLockBlocks), uint160(sellerBalance(k, t) >> BITPOS_PIXTARGET), + _relayerPremium, + _amount, _buyerAddress, - // _relayerTarget, msg.sender, address(t) ); if (merkleProof.length != 0) { - _merkleVerify( - merkleProof, - sellerAllowList(k), - msg.sender - ); + _merkleVerify( merkleProof, sellerAllowList(k), msg.sender); + lockID = _addLock(bal, _amount, cCounter, l, t, k); - _addLock(bal, _amount, cCounter, l, t, k); - - lockCounter++; - - // Halt execution and output `lockID`. - return cCounter; } else { - if (l.amount <= 1e2 ether) { - _addLock(bal, _amount, cCounter, l, t, k); + if (l.amount <= REPUTATION_LOWERBOUND) { + lockID = _addLock(bal, _amount, cCounter, l, t, k); - lockCounter++; + } else { + uint256 userCredit = userRecord[_castAddrToKey(msg.sender)]; + uint256 spendLimit; (spendLimit) = _limiter(userCredit / WAD); + if ( + l.amount > (spendLimit * WAD) || l.amount > LOCKAMOUNT_UPPERBOUND + ) revert AmountNotAllowed(); + lockID = _addLock(bal, _amount, cCounter, l, t, k); - // Halt execution and output `lockID`. - return cCounter; - } else { - uint256 userCredit = userRecord[ - _castAddrToKey(msg.sender) - ]; - - uint256 spendLimit; - (spendLimit) = _limiter(userCredit / WAD); - - if ( - l.amount > (spendLimit * WAD) || - l.amount > 1e6 ether - ) revert AmountNotAllowed(); - - _addLock(bal, _amount, cCounter, l, t, k); - - lockCounter++; - - // Halt execution and output `lockID`. - return cCounter; - } - } + /* */}/* */} } /// @notice Lock release method that liquidate lock @@ -294,7 +235,7 @@ contract P2PIX is /// @dev This method can be called by any public actor /// as long the signature provided is valid. /// @dev `relayerPremium` gets splitted equaly - /// if `relayerTarget` addresses differ. + /// if relayer addresses differ. /// @dev If the `msg.sender` of this method and `l.relayerAddress` are the same, /// `msg.sender` accrues both l.amount and l.relayerPremium as userRecord credit. /// In case of they differing: @@ -303,7 +244,6 @@ contract P2PIX is /// @dev Function sighash: 0x4e1389ed. function release( uint256 lockID, - // address _relayerTarget, bytes32 pixTimestamp, bytes32 r, bytes32 s, @@ -322,22 +262,13 @@ contract P2PIX is pixTimestamp ) ); - bytes32 messageDigest = keccak256( - abi.encodePacked( - "\x19Ethereum Signed Message:\n32", - message - ) - ); - if (usedTransactions(message) == true) - revert TxAlreadyUsed(); + if (usedTransactions(message)) revert TxAlreadyUsed(); - uint256 signer = _castAddrToKey( - ecrecover(messageDigest, v, r, s) - ); - - if (!validBacenSigners(signer)) - revert InvalidSigner(); + if (!validBacenSigners(_castAddrToKey( + ECDSA.recover( + ECDSA.toEthSignedMessageHash(message), v, r, s) + ))) revert InvalidSigner(); ERC20 t = ERC20(l.token); @@ -410,7 +341,7 @@ contract P2PIX is uint256 _sellerBalance = sellerBalance(l.sellerKey, ERC20(l.token)) & BITMASK_SB_ENTRY; - if ((_sellerBalance + l.amount) > 1e8 ether) + if ((_sellerBalance + l.amount) > MAXBALANCE_UPPERBOUND) revert MaxBalExceeded(); _addSellerBalance(l.sellerKey, ERC20(l.token), l.amount); @@ -423,8 +354,8 @@ contract P2PIX is uint256 _newUserRecord = (userRecord[userKey] >> 1); - if (_newUserRecord <= 1e2 ether) { - userRecord[userKey] = 1e2 ether; + if (_newUserRecord <= REPUTATION_LOWERBOUND) { + userRecord[userKey] = REPUTATION_LOWERBOUND; } else { userRecord[userKey] = _newUserRecord; } @@ -455,9 +386,8 @@ contract P2PIX is ) public nonReentrant { unlockExpired(expiredLocks); - if (getValid(msg.sender, token) == true) { + if (getValid(msg.sender, token)) setValidState(token, false); - } uint256 key = _castAddrToKey(msg.sender); _decBal( @@ -623,10 +553,12 @@ contract P2PIX is DT.Lock memory _l, ERC20 _t, uint256 _k - ) internal { + ) internal returns(uint256 counter){ mapLocks[_lockID] = _l; _decBal(_bal, _amount, _t, _k); + lockCounter++; + counter = _lockID; emit LockAdded( _l.buyerAddress, @@ -655,16 +587,11 @@ contract P2PIX is view returns (uint256 _spendLimit) { - // enconde the fx sighash and args bytes memory encodedParams = abi.encodeWithSelector( IReputation.limiter.selector, _userCredit ); - // cast the uninitialized return values to memory bool success; - // uint256 returnSize; - // uint256 returnValue; - // perform staticcall from the stack w yul assembly { success := staticcall( // gas @@ -680,11 +607,7 @@ contract P2PIX is // retSize 0x20 ) - // returnSize := returndatasize() - // returnValue := mload(0x00) - // _spendLimit := returnValue _spendLimit := mload(0x00) - // reverts if call does not succeed. if iszero(success) { // StaticCallFailed() mstore(0x00, 0xe10bf1cc) diff --git a/hardhat.config.ts b/hardhat.config.ts index 0af5df4..b2963f1 100644 --- a/hardhat.config.ts +++ b/hardhat.config.ts @@ -113,10 +113,16 @@ const config: HardhatUserConfig = { version: "0.8.19", settings: { viaIR: true, + evmVersion: "paris", optimizer: { enabled: true, runs: 20_000, details: { + deduplicate: true, + cse: true, + constantOptimizer: true, + peephole: true, + jumpdestRemover: true, yul: true, yulDetails: { stackAllocation: true, diff --git a/src/types/factories/lib/utils/ECDSA__factory.ts b/src/types/factories/lib/utils/ECDSA__factory.ts new file mode 100644 index 0000000..a1b7140 --- /dev/null +++ b/src/types/factories/lib/utils/ECDSA__factory.ts @@ -0,0 +1,62 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import { Signer, utils, Contract, ContractFactory, Overrides } from "ethers"; +import type { Provider, TransactionRequest } from "@ethersproject/providers"; +import type { PromiseOrValue } from "../../../common"; +import type { ECDSA, ECDSAInterface } from "../../../lib/utils/ECDSA"; + +const _abi = [ + { + inputs: [], + name: "InvalidSignature", + type: "error", + }, +]; + +const _bytecode = + "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033"; + +type ECDSAConstructorParams = + | [signer?: Signer] + | ConstructorParameters; + +const isSuperArgs = ( + xs: ECDSAConstructorParams +): xs is ConstructorParameters => xs.length > 1; + +export class ECDSA__factory extends ContractFactory { + constructor(...args: ECDSAConstructorParams) { + if (isSuperArgs(args)) { + super(...args); + } else { + super(_abi, _bytecode, args[0]); + } + } + + override deploy( + overrides?: Overrides & { from?: PromiseOrValue } + ): Promise { + return super.deploy(overrides || {}) as Promise; + } + override getDeployTransaction( + overrides?: Overrides & { from?: PromiseOrValue } + ): TransactionRequest { + return super.getDeployTransaction(overrides || {}); + } + override attach(address: string): ECDSA { + return super.attach(address) as ECDSA; + } + override connect(signer: Signer): ECDSA__factory { + return super.connect(signer) as ECDSA__factory; + } + + static readonly bytecode = _bytecode; + static readonly abi = _abi; + static createInterface(): ECDSAInterface { + return new utils.Interface(_abi) as ECDSAInterface; + } + static connect(address: string, signerOrProvider: Signer | Provider): ECDSA { + return new Contract(address, _abi, signerOrProvider) as ECDSA; + } +} diff --git a/src/types/factories/lib/utils/index.ts b/src/types/factories/lib/utils/index.ts index 7dd2d19..4f91906 100644 --- a/src/types/factories/lib/utils/index.ts +++ b/src/types/factories/lib/utils/index.ts @@ -1,6 +1,7 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export { ECDSA__factory } from "./ECDSA__factory"; export { Multicall__factory } from "./Multicall__factory"; export { ReentrancyGuard__factory } from "./ReentrancyGuard__factory"; export { SafeTransferLib__factory } from "./SafeTransferLib__factory"; diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index 0ca0e4a..ed7149d 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -415,19 +415,6 @@ const _abi = [ name: "ValidSignersUpdated", type: "event", }, - { - inputs: [], - name: "WAD", - outputs: [ - { - internalType: "uint256", - name: "", - type: "uint256", - }, - ], - stateMutability: "view", - type: "function", - }, { inputs: [ { @@ -669,14 +656,14 @@ const _abi = [ type: "address", }, { - internalType: "uint256", + internalType: "uint80", name: "_relayerPremium", - type: "uint256", + type: "uint80", }, { - internalType: "uint256", + internalType: "uint80", name: "_amount", - type: "uint256", + type: "uint80", }, { internalType: "bytes32[]", @@ -693,7 +680,7 @@ const _abi = [ outputs: [ { internalType: "uint256", - name: "", + name: "lockID", type: "uint256", }, ], @@ -733,16 +720,6 @@ const _abi = [ name: "counter", type: "uint256", }, - { - internalType: "uint256", - name: "relayerPremium", - type: "uint256", - }, - { - internalType: "uint256", - name: "amount", - type: "uint256", - }, { internalType: "uint256", name: "expirationBlock", @@ -753,6 +730,16 @@ const _abi = [ name: "pixTarget", type: "uint160", }, + { + internalType: "uint80", + name: "relayerPremium", + type: "uint80", + }, + { + internalType: "uint80", + name: "amount", + type: "uint80", + }, { internalType: "address", name: "buyerAddress", @@ -1087,7 +1074,7 @@ const _abi = [ ]; const _bytecode = - "0x608060405262002a0f803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516125d99081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102165780630d2a2d441461021157806313af40351461020c578063328a718114610207578063367821f014610202578063461f3120146101b257806349ef8448146101fd5780634b2ae980146101f8578063574983c8146101f35780635fd8c710146101ee57806369cc6af4146101e95780636a146024146101e45780636d82d9e0146101df57806377cd38a4146101da5780637f94f65d146101d557806380e1d302146101d057806384ab1d28146101cb5780638a006225146101c65780638da5cb5b146101c15780638db564c2146101bc5780639872dbfe146101b757806398a26871146101b25780639eee8d4b146101ad578063ad8f2eed146101a8578063b0983d39146101a3578063c52164c61461019e578063c593dfd814610199578063d1c0702814610194578063d4fac45d1461018f578063d6e8b9731461018a578063f7d0e04b146101855763fb8c5ef00361000e576115af565b61153f565b611494565b61147b565b6113d9565b610f4a565b610f16565b610edc565b610e86565b610e46565b610835565b610e28565b610e0a565b610dd6565b610d3d565b610cd6565b610cbd565b610c6c565b610c34565b610b23565b610b00565b610ac0565b610a3d565b6109d9565b6109af565b610918565b610786565b610556565b6104a8565b61037b565b346102425760206003193601126102425760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102b757604052565b610247565b60405190610120820182811067ffffffffffffffff8211176102b757604052565b67ffffffffffffffff81116102b75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361024257565b81601f820112156102425780359161032a836102dd565b926103386040519485610276565b808452602092838086019260051b820101928311610242578301905b828210610362575050505090565b8380918335610370816102f5565b815201910190610354565b34610242576020806003193601126102425760043567ffffffffffffffff8111610242576103ad903690600401610313565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361047e57805181830192849160051b830181013d1515855b811561044a575b50505060405192818401908285525180915260408401949160005b828110610434577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610405565b90838260018298969499979951600c1b550190838210156104725791509593959492946103e3565b509593959492946103ea565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576004356104c5816102f5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361047e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60643590811515820361024257565b3590811515820361024257565b346102425760a060031936011261024257600435610573816102f5565b6024356bffffffffffffffffffffffff811690818103610242576044359061059a826102f5565b6105a261053a565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b9086161561075c576105ea6105e68363cbc9d1c4600c526000526020600c205490565b1590565b610732576b3fffffffffffffffffffffff61061b83839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e4000000610633858461170a565b1161070857826106f3976106ad9661067f896106a4967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d610673611717565b806106f8575b5061170a565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611752565b6106b660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107029033611e53565b38610679565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b3461024257602060031936011261024257600480356000908152600560208181526040928390208054600182015460028301546003840154978401549584015460068501546007860154600890960154895195865296850193909352968301526060820196909652608081019390935273ffffffffffffffffffffffffffffffffffffffff93841660a084015293831660c083015292821660e0820152911661010082015261012090f35b0390f35b34610242576020600319360112610242576020600435546040519015158152f35b90815180825260208080930193019160005b828110610876575050505090565b835185529381019392810192600101610868565b9061089d90604083526040830190610856565b81810360209283015282518082529082019282019160009190825b8281106108c757505050505090565b909192939485516004808210156108ec575081528201948201939291906001016108b8565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610242576020806003193601126102425760043567ffffffffffffffff8111610242573660238201121561024257806004013590610956826102dd565b916109646040519384610276565b80835260248484019160051b8301019136831161024257602401905b8282106109a0576109908461245d565b906108316040519283928361088a565b81358152908401908401610980565b346102425760206003193601126102425760206004356109ce816102f5565b60405190600c1b8152f35b346102425760206003193601126102425760043573ffffffffffffffffffffffffffffffffffffffff60005416330361047e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461024257600080600319360112610abd5773ffffffffffffffffffffffffffffffffffffffff815416330361047e57478180808084335af115610ab0576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610242576020600319360112610242576020610af6600435610ae2816102f5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b34610242576000600319360112610242576020604051670de0b6b3a76400008152f35b3461024257604060031936011261024257600435610b40816102f5565b602435801515908181036102425733600c1b610b7284829060205263739094b1600c52600c1c6000526034600c205490565b918215610c0a57610bc1927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610242576020600319360112610242576020610c646004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461024257604060031936011261024257610019600435610c8c816102f5565b60243590611e53565b600319604091011261024257600435610cad816102f5565b90602435610cba816102f5565b90565b34610242576020610af6610cd036610c95565b906123a5565b3461024257602060031936011261024257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b9181601f840112156102425782359167ffffffffffffffff8311610242576020808501948460051b01011161024257565b346102425760e060031936011261024257600435610d5a816102f5565b60243590610d67826102f5565b60443590610d74826102f5565b67ffffffffffffffff9160a43583811161024257610d96903690600401610d0c565b9060c4359485116102425761083195610db6610dc6963690600401610d0c565b9590946084359260643592611863565b6040519081529081906020820190565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610242576000600319360112610242576020600454604051908152f35b34610242576000600319360112610242576020600354604051908152f35b34610242576040600319360112610242576020610c64602435610e68816102f5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461024257610e9436610c95565b6000903d15610ebf575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610e9e565b346102425760206003193601126102425760043567ffffffffffffffff811161024257610f10610019913690600401610d0c565b90611c61565b3461024257600060031936011261024257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102425760a0600319360112610242576084356004803560ff8316830361024257610f74611717565b610f88816000526005602052604060002090565b9060038201805492831561139f5784810190815443116113765760058101546040805160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301908152603483018890526024356054840152909790826074810103926110237fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe094858101835282610276565b5190209188516110726020820192826110668786603c917f19457468657265756d205369676e6564204d6573736167653a0a3332000000008252601c8201520190565b03908101835282610276565b5190206001835415151461134e57885190815260ff999099166020808b019190915260443560408b015260643560608b01526000808052998a9060809060015afa15611349576110cb6110c68a51600c1b90565b541590565b611322575085949361125f937f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8978461115d611129958d61114261112960086112489b015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b95816111546002870197885490611bc7565b98555560019055565b61122260066007830192611188611129855473ffffffffffffffffffffffffffffffffffffffff1690565b33146112f65784546111b26111aa33600c1b6000526006602052604060002090565b91825461170a565b90556111ee6111de6111d8865473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526006602052604060002090565b6111f98d825461170a565b90555b019461121c865473ffffffffffffffffffffffffffffffffffffffff1690565b85611bd4565b81548061126e575b505050505473ffffffffffffffffffffffffffffffffffffffff1690565b945191825260208201929092529081906040820190565b0390a261126b60018055565b80f35b61128f611129835473ffffffffffffffffffffffffffffffffffffffff1690565b33146112e357506112da92916112cb6112bf6112d2935473ffffffffffffffffffffffffffffffffffffffff1690565b825460011c9085611bd4565b5460011c90565b903390611bd4565b3880808061122a565b9150506112f1913390611bd4565b6112da565b6113018c865461170a565b61131b6111aa33600c1b6000526006602052604060002090565b90556111fc565b87517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b611bbb565b5087517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b856040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b846040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610cba928181520190610856565b346102425760406003193601126102425760043567ffffffffffffffff81116102425761140a903690600401610313565b60243590611417826102f5565b600091815191611426836123fa565b935b83811061143d576040518061083187826113c8565b8061146a8473ffffffffffffffffffffffffffffffffffffffff61146360019587612449565b511661236e565b6114748288612449565b5201611428565b34610242576020610c6461148e36610c95565b9061236e565b346102425760406003193601126102425767ffffffffffffffff600435818111610242576114c6903690600401610313565b9060243590811161024257366023820112156102425780600401356114ea816102dd565b916114f86040519384610276565b81835260209160248385019160051b8301019136831161024257602401905b828210611528576100198587611ea2565b83809161153484610549565b815201910190611517565b346102425760206003193601126102425760043561155c816102f5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361047e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610242576060600319360112610242576004356115cc816102f5565b60243560443567ffffffffffffffff8111610242577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116256116176116b1933690600401610d0c565b90611620611717565b611c61565b600161163185336123a5565b1515146116ba575b61167533600c1b85836b3fffffffffffffffffffffff61166f83859060205263739094b1600c52600c1c6000526034600c205490565b16612332565b611680813386611bd4565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6116c3846117ab565b611639565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906001820180921161170557565b6116c8565b9190820180921161170557565b600260015414611728576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d1560016000511417161561179d576000606052604052565b637939f4246000526004601cfd5b33600c1b6117cf82829060205263739094b1600c52600c1c6000526034600c205490565b908115610c0a57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118189316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9061187c9897969594939291611877611717565b6118cd565b9060018055565b90670de0b6b3a76400009182810292818404149015171561170557565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117055760010190565b949673ffffffffffffffffffffffffffffffffffffffff92986118f291959495611c61565b16926119016105e685836123a5565b611b915761190f848261236e565b90828210611b6757600c1b9460049661192888546116f7565b988861193e8b6000526005602052604060002090565b0154431115611b3e5790876119ff8b969594936119e261199f6119838c6119676003544361170a565b969060205263739094b1600c52600c1c6000526034600c205490565b605f1c73ffffffffffffffffffffffffffffffffffffffff1690565b6119a76102bc565b9a8d8c528a60208d015260408c015260608b019489865260808c015260a08b019073ffffffffffffffffffffffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c0890152565b3360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528215611a71575092611a669592611a61611a6c999693610cba9b99963391611a5b8a6374dfee70600c52600c1c60005260206000205490565b9161222b565b611fc3565b546118a0565b600455565b805190925068056bc75e2d63100000109050611a9d575092611a6c9592610cba979592611a6695611fc3565b90919250611ad2611acd611abe33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6122b9565b611add825191611883565b10908115611b29575b50611b005792611a669287611a6c9693610cba9896611fc3565b856040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b69d3c21bcecceda10000009150511138611ae6565b886040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b6040513d6000823e3d90fd5b9190820391821161170557565b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611c1057603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611c5c5760051b0190565b611c1d565b9060009182905b828210611c85575010611c785750565b63dfb035c990526004601cfd5b90611ca5611c94828585611c4c565b356000526005602052604060002090565b90611caf82611f59565b8154611cd5611129600885015473ffffffffffffffffffffffffffffffffffffffff1690565b926b3fffffffffffffffffffffff611d0385849060205263739094b1600c52600c1c6000526034600c205490565b169060038101946a52b7d2dcc80cd2e4000000611d228754809561170a565b1161070857600195611d556006948b93611de2979060205263739094b1600c52600c1c6000526034600c20908154019055565b55611d7a6111d8600783015473ffffffffffffffffffffffffffffffffffffffff1690565b611d916112cb826000526006602052604060002090565b68056bc75e2d631000008111611e385750611db9611dc7916000526006602052604060002090565b68056bc75e2d631000009055565b015473ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611e23848888611c4c565b60405190358152921691602090a20190611c68565b90611e4d906000526006602052604060002090565b55611dc7565b338103611e94576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361047e578251918215611f4c5781518303611f3f57602092919284818080970195019360051b0101925b838103611ef8575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191611eea565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60048101544310611f99576003015415611f6f57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b936122077f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6594926121ed73ffffffffffffffffffffffffffffffffffffffff9598612226948a6000526005602052604060002093875185556020880151600186015560408801516002860155606088019a8b516003870155608089015160048701556120ad61206960a08b015173ffffffffffffffffffffffffffffffffffffffff1690565b600588019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b6121e860c08a019661211a6120d6895173ffffffffffffffffffffffffffffffffffffffff1690565b600683019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61218261213e60e08d015173ffffffffffffffffffffffffffffffffffffffff1690565b600783019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b60086121a66101008d015173ffffffffffffffffffffffffffffffffffffffff1690565b91019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b612332565b5173ffffffffffffffffffffffffffffffffffffffff1690565b9151945160405193849316958360209093929193604081019481520152565b0390a3565b73ffffffffffffffffffffffffffffffffffffffff829394169261227d575b50500361225357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156122ae579290612287565b50915050388061224a565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102b7576020926000926040525190600254617530fa90600051911561232457565b63e10bf1cc6000526004601cfd5b9291909280848103119015176123605760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d1561237c575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156123b3575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102b75760405260008152906000368137565b90612404826102dd565b6124116040519182610276565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061243f82946102dd565b0190602036910137565b8051821015611c5c5760209160051b010190565b908151156125905760008092805190612475826123fa565b9261247f836123fa565b955b83811061249057505050509190565b806124b16124a060019386612449565b516000526005602052604060002090565b546124e1576124c08185612449565b516124cb8288612449565b52826124d7828a612449565b5201925b92612481565b60036124f06124a08387612449565b0154612526576125008185612449565b5161250b8288612449565b5261251f612519828a612449565b60039052565b01926124db565b60046125356124a08387612449565b0154431115612567576125488185612449565b516125538288612449565b5261251f612561828a612449565b60029052565b6125718185612449565b5161257c8288612449565b5261251f61258a828a612449565b60019052565b905061259a6123d1565b90610cba6123d156fea264697066735822122072770abf2010315e54b9f1156a4b188132073c40328bd80f480bfc7887c30f8364736f6c63430008130033"; + "0x608060405262002c24803803806200001781620000ce565b928339810160a082820312620000b357815160208301516001600160401b039391929190848111620000b357826200005191830162000124565b604082015191620000628362000112565b6060810151868111620000b357846200007d91830162000124565b936080820151968711620000b357620000a3966200009c920162000193565b93620001fa565b6040516127ee9081620004368239f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b03811183821017620000f457604052565b620000b8565b6001600160401b038111620000f45760051b60200190565b6001600160a01b03811603620000b357565b9080601f83011215620000b357815190620001496200014383620000fa565b620000ce565b9182938184526020808095019260051b820101928311620000b3578301905b82821062000177575050505090565b8380918351620001878162000112565b81520191019062000168565b9080601f83011215620000b357815190620001b26200014383620000fa565b9182938184526020808095019260051b820101928311620000b3578301905b828210620001e0575050505090565b81518015158103620000b3578152908301908301620001d1565b600080546001600160a01b03191633908117825591969594939291817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3600191828055876003556040519788527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208099a160028490556040516001600160a01b0394851681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f908990a18051818901989060051b820181013d15158a5b811562000339575b505050604051948186019282875251809352604086019993905b8382106200032157505050505050807f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7916200031f95960390a162000373565b565b845181168b52998201999382019390850190620002df565b908382600182979896949e999e51600c1b55019083821015620003655791509a959a94939294620002bd565b509a959a94939294620002c5565b60008054919290916001600160a01b03163303620004245782519182156200041757815183036200040a57602092919284818080970195019360051b0101925b838103620003c2575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003b3565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b6040516282b42960e81b8152600490fdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102065780630d2a2d441461020157806313af4035146101fc5780632cc0f905146101f7578063328a7181146101f2578063367821f0146101ed578063461f3120146101a757806349ef8448146101e85780634b2ae980146101e3578063574983c8146101de5780635fd8c710146101d957806369cc6af4146101d45780636d82d9e0146101cf57806377cd38a4146101ca5780637f94f65d146101c557806380e1d302146101c057806384ab1d28146101bb5780638da5cb5b146101b65780638db564c2146101b15780639872dbfe146101ac57806398a26871146101a75780639eee8d4b146101a2578063ad8f2eed1461019d578063b0983d3914610198578063c52164c614610193578063c593dfd81461018e578063d1c0702814610189578063d4fac45d14610184578063d6e8b9731461017f578063f7d0e04b1461017a5763fb8c5ef00361000e57611678565b611608565b61155d565b611544565b6114a2565b610f64565b610f30565b610ef6565b610ea0565b610e60565b61093c565b610e42565b610e24565b610df0565b610dba565b610da1565b610d50565b610d18565b610c07565b610bc7565b610b44565b610ae0565b610ab6565b610a1f565b610881565b610651565b61058d565b610498565b61036b565b346102325760206003193601126102325760043560005260066020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102a757604052565b610237565b60405190610120820182811067ffffffffffffffff8211176102a757604052565b67ffffffffffffffff81116102a75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361023257565b81601f820112156102325780359161031a836102cd565b926103286040519485610266565b808452602092838086019260051b820101928311610232578301905b828210610352575050505090565b8380918335610360816102e5565b815201910190610344565b34610232576020806003193601126102325760043567ffffffffffffffff81116102325761039d903690600401610303565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361046e57805181830192849160051b830181013d1515855b811561043a575b50505060405192818401908285525180915260408401949160005b828110610424577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b83518516875295810195928101926001016103f5565b90838260018298969499979951600c1b550190838210156104625791509593959492946103d3565b509593959492946103da565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576004356104b5816102e5565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361046e577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b6064359069ffffffffffffffffffff8216820361023257565b6084359069ffffffffffffffffffff8216820361023257565b9181601f840112156102325782359167ffffffffffffffff8311610232576020808501948460051b01011161023257565b346102325760e0600319360112610232576004356105aa816102e5565b602435906105b7826102e5565b604435916105c4836102e5565b6105cc61052a565b916105d5610543565b67ffffffffffffffff9360a435858111610232576105f790369060040161055c565b92909160c435968711610232576106319761061961062198369060040161055c565b979096611927565b6040519081529081906020820190565b0390f35b60643590811515820361023257565b3590811515820361023257565b346102325760a06003193601126102325760043561066e816102e5565b6024356bffffffffffffffffffffffff8116908181036102325760443590610695826102e5565b61069d610635565b6084359373ffffffffffffffffffffffffffffffffffffffff8087169033600c1b90861615610857576106e56106e18363cbc9d1c4600c526000526020600c205490565b1590565b61082d576b3fffffffffffffffffffffff61071683839060205263739094b1600c52600c1c6000526034600c205490565b16906a52b7d2dcc80cd2e400000061072e85846117ce565b1161080357826107ee976107a89661077a8961079f967f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf9d61076e6117db565b806107f3575b506117ce565b9060ff1b91605f1b1717919060205263739094b1600c52600c1c6000526034600c2055565b30903390611816565b6107b160018055565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107fd9033611fc7565b38610774565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102325760206003193601126102325760048035600090815260056020818152604092839020805460018201546002830154600384015497840154958401546006909401548751938452948301919091529481019490945273ffffffffffffffffffffffffffffffffffffffff808616606086015269ffffffffffffffffffff60a096871c8116608087015284169585019590955260509290921c841660c084015290831660e08301529190911661010082015261012090f35b34610232576020600319360112610232576020600435546040519015158152f35b90815180825260208080930193019160005b82811061097d575050505090565b83518552938101939281019260010161096f565b906109a49060408352604083019061095d565b81810360209283015282518082529082019282019160009190825b8281106109ce57505050505090565b909192939485516004808210156109f3575081528201948201939291906001016109bf565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610232576020806003193601126102325760043567ffffffffffffffff8111610232573660238201121561023257806004013590610a5d826102cd565b91610a6b6040519384610266565b80835260248484019160051b8301019136831161023257602401905b828210610aa757610a9784612654565b9061063160405192839283610991565b81358152908401908401610a87565b34610232576020600319360112610232576020600435610ad5816102e5565b60405190600c1b8152f35b346102325760206003193601126102325760043573ffffffffffffffffffffffffffffffffffffffff60005416330361046e576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461023257600080600319360112610bc45773ffffffffffffffffffffffffffffffffffffffff815416330361046e57478180808084335af115610bb7576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610232576020600319360112610232576020610bfd600435610be9816102e5565b63cbc9d1c4600c526000526020600c205490565b6040519015158152f35b3461023257604060031936011261023257600435610c24816102e5565b602435801515908181036102325733600c1b610c5684829060205263739094b1600c52600c1c6000526034600c205490565b918215610cee57610ca5927f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff869260ff1b911617919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff6040519216825260208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610232576020600319360112610232576020610d486004356374dfee70600c52600c1c60005260206000205490565b604051908152f35b3461023257604060031936011261023257610019600435610d70816102e5565b60243590611fc7565b600319604091011261023257600435610d91816102e5565b90602435610d9e816102e5565b90565b34610232576020610bfd610db436610d79565b9061259c565b3461023257602060031936011261023257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610232576000600319360112610232576020600454604051908152f35b34610232576000600319360112610232576020600354604051908152f35b34610232576040600319360112610232576020610d48602435610e82816102e5565b6004359060205263739094b1600c52600c1c6000526034600c205490565b3461023257610eae36610d79565b6000903d15610ed9575b60208273ffffffffffffffffffffffffffffffffffffffff60405191168152f35b60205263739094b1600c525260206034600c2054605f1c38610eb8565b346102325760206003193601126102325760043567ffffffffffffffff811161023257610f2a61001991369060040161055c565b90611d6d565b3461023257600060031936011261023257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102325760a06003193601126102325760048035906084359060ff8216820361023257610f906117db565b610fa4836000526005602052604060002090565b81810191610fbc835469ffffffffffffffffffff1690565b9169ffffffffffffffffffff908184169586156114685760028201928354431161143f57600383019485549660405161109f816110738b602083019573ffffffffffffffffffffffffffffffffffffffff602435921687917fffffffffffffffffffff00000000000000000000000000000000000000000000907fffffffffffffffffffffffffffffffffffffffff000000000000000000000000603e959360601b16845260b01b166014830152601e8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610266565b519020928354611416576110f56110ef6110fa9260643590604435906110ea896020527b19457468657265756d205369676e6564204d6573736167653a0a3332600052603c60042090565b611c7c565b600c1b90565b541590565b6113ee5750926112886005846111b3611161989560006111858e7f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89f9e9b61117a6112ca9f9c600661116191015473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b9b60a01c1690611c6f565b8a547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168b55965560019055565b01916111d6611161845473ffffffffffffffffffffffffffffffffffffffff1690565b33146113a95783546112019060a01c69ffffffffffffffffffff165b69ffffffffffffffffffff1690565b61122361121b33600c1b6000526006602052604060002090565b9182546117ce565b90556112596112496110ef855473ffffffffffffffffffffffffffffffffffffffff1690565b6000526006602052604060002090565b6112648a82546117ce565b90555b855460501c73ffffffffffffffffffffffffffffffffffffffff1685611ce0565b81546112a29060a01c69ffffffffffffffffffff166111f2565b806112e4575b505050505473ffffffffffffffffffffffffffffffffffffffff9060501c1690565b60408051948552602085019290925292a261001960018055565b611305611161835473ffffffffffffffffffffffffffffffffffffffff1690565b331461139657506111f261135961138d949361137261133b611385955473ffffffffffffffffffffffffffffffffffffffff1690565b61136b6111f2611359855469ffffffffffffffffffff9060a01c1690565b60011c697fffffffffffffffffff1690565b9087611ce0565b5460a01c69ffffffffffffffffffff1690565b903390611ce0565b388080806112a8565b9150506113a4913390611ce0565b61138d565b6113cd896113c86111f2875469ffffffffffffffffffff9060a01c1690565b6117ce565b6113e761121b33600c1b6000526006602052604060002090565b9055611267565b6040517f815e1d64000000000000000000000000000000000000000000000000000000008152fd5b506040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b846040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b836040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b906020610d9e92818152019061095d565b346102325760406003193601126102325760043567ffffffffffffffff8111610232576114d3903690600401610303565b602435906114e0826102e5565b6000918151916114ef836125f1565b935b83811061150657604051806106318782611491565b806115338473ffffffffffffffffffffffffffffffffffffffff61152c60019587612640565b5116612565565b61153d8288612640565b52016114f1565b34610232576020610d4861155736610d79565b90612565565b346102325760406003193601126102325767ffffffffffffffff6004358181116102325761158f903690600401610303565b9060243590811161023257366023820112156102325780600401356115b3816102cd565b916115c16040519384610266565b81835260209160248385019160051b8301019136831161023257602401905b8282106115f1576100198587612016565b8380916115fd84610644565b8152019101906115e0565b3461023257602060031936011261023257600435611625816102e5565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361046e57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461023257606060031936011261023257600435611695816102e5565b60243560443567ffffffffffffffff8111610232577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e916116ee6116e061177593369060040161055c565b906116e96117db565b611d6d565b6116f8843361259c565b61177e575b61173933600c1b85836b3fffffffffffffffffffffff61173383859060205263739094b1600c52600c1c6000526034600c205490565b16612529565b611744813386611ce0565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a260018055005b6117878461186f565b6116fd565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b90600182018092116117c957565b61178c565b919082018092116117c957565b6002600154146117ec576002600155565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611861576000606052604052565b637939f4246000526004601cfd5b33600c1b61189382829060205263739094b1600c52600c1c6000526034600c205490565b908115610cee57827f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6118dc9316919060205263739094b1600c52600c1c6000526034600c2055565b73ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b92949761194e9073ffffffffffffffffffffffffffffffffffffffff9395986116e96117db565b169361195d6106e1868461259c565b611c285761196b8583612565565b9669ffffffffffffffffffff9687811693848a10611bfe57600c1b976119926004546117bb565b9560026119a9886000526005602052604060002090565b0154431115611bd4576003546119bf90436117ce565b976119e08a8c9060205263739094b1600c52600c1c6000526034600c205490565b605f1c611a009073ffffffffffffffffffffffffffffffffffffffff1690565b611a086102ac565b8c8152602081018a9052604081019a909a5273ffffffffffffffffffffffffffffffffffffffff1660608a015269ffffffffffffffffffff16608089015260a0880192611a6190849069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660c08801523360e088015273ffffffffffffffffffffffffffffffffffffffff88166101008801528315611ae4575050611ad89791611ad3913391611acd8a6374dfee70600c52600c1c60005260206000205490565b91612422565b612146565b90611ae260018055565b565b819350809250611b0868056bc75e2d63100000925169ffffffffffffffffffff1690565b1611611b1e575050611b1995612146565b611ad8565b611b4f611b4a611b3b33600c1b6000526006602052604060002090565b54670de0b6b3a7640000900490565b6124b0565b81611b6d611b67855169ffffffffffffffffffff1690565b92611c52565b911611918215611bb1575b5050611b8757611b1995612146565b60046040517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880611b78565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b60046040517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b90670de0b6b3a7640000918281029281840414901517156117c957565b919082039182116117c957565b9060806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a160ff9796604051966000998a968795865216875260405280606052105afa508251923d15611cd357606052604052565b638baa579f90526004601cfd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d156001835114171615611d1c57603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9190811015611d685760051b0190565b611d29565b6000905b828210611d8e575010611d8057565b63dfb035c96000526004601cfd5b90611dae611d9d828585611d58565b356000526005602052604060002090565b611db7816120cd565b805490611dde611161600683015473ffffffffffffffffffffffffffffffffffffffff1690565b6b3fffffffffffffffffffffff611e0b82859060205263739094b1600c52600c1c6000526034600c205490565b1690600493848401946a52b7d2dcc80cd2e4000000611e41611e3a6111f2895469ffffffffffffffffffff1690565b80966117ce565b11611f9f57506005611f2e94611e7c6001989795611ebd956110ef959060205263739094b1600c52600c1c6000526034600c20908154019055565b84547fffffffffffffffffffffffffffffffffffffffffffff00000000000000000000168555015473ffffffffffffffffffffffffffffffffffffffff1690565b611edb611ed4826000526006602052604060002090565b5460011c90565b68056bc75e2d631000008111611f845750611f03611f11916000526006602052604060002090565b68056bc75e2d631000009055565b5460501c73ffffffffffffffffffffffffffffffffffffffff1690565b7f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da573ffffffffffffffffffffffffffffffffffffffff611f6f848888611d58565b60405190358152921691602090a20190611d71565b90611f99906000526006602052604060002090565b55611f11565b6040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b338103612008576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b9060009073ffffffffffffffffffffffffffffffffffffffff825416330361046e5782519182156120c057815183036120b357602092919284818080970195019360051b0101925b83810361206c575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a30192019161205e565b63ff633a3890526004601cfd5b63df95788390526004601cfd5b60028101544310611bd4576004015469ffffffffffffffffffff16156120ef57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146117c95760010190565b9095949391938460005260056020526040600020928451845560208501516001850155604085015160028501556003840160608601516121999073ffffffffffffffffffffffffffffffffffffffff1690565b8154608088015173ffffffffffffffffffffffffffffffffffffffff929092167fffff0000000000000000000000000000000000000000000000000000000000009091161760a091821b7dffffffffffffffffffff0000000000000000000000000000000000000000161790915585018051600486019991959069ffffffffffffffffffff168a547fffffffffffffffffffffffffffffffffffffffffffff000000000000000000001669ffffffffffffffffffff909116178a5560c08701998a516122789073ffffffffffffffffffffffffffffffffffffffff1690565b81547fffff0000000000000000000000000000000000000000ffffffffffffffffffff1660509190911b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617905560e087015173ffffffffffffffffffffffffffffffffffffffff166005820190612329919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61010087015173ffffffffffffffffffffffffffffffffffffffff16906006019061238e919073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61239793612529565b6004546123a390612119565b6004558294516123c69073ffffffffffffffffffffffffffffffffffffffff1690565b915190516040805192835269ffffffffffffffffffff909116602083015273ffffffffffffffffffffffffffffffffffffffff909216917f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6591a3565b73ffffffffffffffffffffffffffffffffffffffff8293941692612474575b50500361244a57565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b9182526020809218526040600020910192828410156124a557929061247e565b509150503880612441565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102a7576020926000926040525190600254617530fa90600051911561251b57565b63e10bf1cc6000526004601cfd5b9291909280848103119015176125575760205263739094b1600c52600c1c6000526034600c20908154039055565b63ce3a3d376000526004601cfd5b600092913d15612573575050565b9091925060205263739094b1600c526000526034600c20546b3fffffffffffffffffffffff1690565b600092913d156125aa575050565b9091925060205263739094b1600c526000526034600c205460ff1c90565b6040516020810181811067ffffffffffffffff8211176102a75760405260008152906000368137565b906125fb826102cd565b6126086040519182610266565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061263682946102cd565b0190602036910137565b8051821015611d685760209160051b010190565b908151156127a5576000809280519061266c826125f1565b92612676836125f1565b955b83811061268757505050509190565b806126a861269760019386612640565b516000526005602052604060002090565b546126d8576126b78185612640565b516126c28288612640565b52826126ce828a612640565b5201925b92612678565b69ffffffffffffffffffff61270660046126f56126978589612640565b015469ffffffffffffffffffff1690565b1661273b576127158185612640565b516127208288612640565b5261273461272e828a612640565b60039052565b01926126d2565b600261274a6126978387612640565b015443111561277c5761275d8185612640565b516127688288612640565b52612734612776828a612640565b60029052565b6127868185612640565b516127918288612640565b5261273461279f828a612640565b60019052565b90506127af6125c8565b90610d9e6125c856fea2646970667358221220637ef5dab3f877f94aaa3a47dff24e5d03955b1e35519a927aad5c994df7ece964736f6c63430008130033"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/hardhat.d.ts b/src/types/hardhat.d.ts index c7a6011..da4e298 100644 --- a/src/types/hardhat.d.ts +++ b/src/types/hardhat.d.ts @@ -32,6 +32,10 @@ declare module "hardhat/types/runtime" { name: "ERC20", signerOrOptions?: ethers.Signer | FactoryOptions ): Promise; + getContractFactory( + name: "ECDSA", + signerOrOptions?: ethers.Signer | FactoryOptions + ): Promise; getContractFactory( name: "Multicall", signerOrOptions?: ethers.Signer | FactoryOptions @@ -78,6 +82,11 @@ declare module "hardhat/types/runtime" { address: string, signer?: ethers.Signer ): Promise; + getContractAt( + name: "ECDSA", + address: string, + signer?: ethers.Signer + ): Promise; getContractAt( name: "Multicall", address: string, diff --git a/src/types/index.ts b/src/types/index.ts index 03b7ca5..70aec47 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -17,6 +17,8 @@ export type { MockToken } from "./lib/mock/mockToken.sol/MockToken"; export { MockToken__factory } from "./factories/lib/mock/mockToken.sol/MockToken__factory"; export type { ERC20 } from "./lib/tokens/ERC20"; export { ERC20__factory } from "./factories/lib/tokens/ERC20__factory"; +export type { ECDSA } from "./lib/utils/ECDSA"; +export { ECDSA__factory } from "./factories/lib/utils/ECDSA__factory"; export type { Multicall } from "./lib/utils/Multicall"; export { Multicall__factory } from "./factories/lib/utils/Multicall__factory"; export type { ReentrancyGuard } from "./lib/utils/ReentrancyGuard"; diff --git a/src/types/lib/utils/ECDSA.ts b/src/types/lib/utils/ECDSA.ts new file mode 100644 index 0000000..6ed0ddd --- /dev/null +++ b/src/types/lib/utils/ECDSA.ts @@ -0,0 +1,56 @@ +/* Autogenerated file. Do not edit manually. */ +/* tslint:disable */ +/* eslint-disable */ +import type { BaseContract, Signer, utils } from "ethers"; + +import type { Listener, Provider } from "@ethersproject/providers"; +import type { + TypedEventFilter, + TypedEvent, + TypedListener, + OnEvent, + PromiseOrValue, +} from "../../common"; + +export interface ECDSAInterface extends utils.Interface { + functions: {}; + + events: {}; +} + +export interface ECDSA extends BaseContract { + connect(signerOrProvider: Signer | Provider | string): this; + attach(addressOrName: string): this; + deployed(): Promise; + + interface: ECDSAInterface; + + queryFilter( + event: TypedEventFilter, + fromBlockOrBlockhash?: string | number | undefined, + toBlock?: string | number | undefined + ): Promise>; + + listeners( + eventFilter?: TypedEventFilter + ): Array>; + listeners(eventName?: string): Array; + removeAllListeners( + eventFilter: TypedEventFilter + ): this; + removeAllListeners(eventName?: string): this; + off: OnEvent; + on: OnEvent; + once: OnEvent; + removeListener: OnEvent; + + functions: {}; + + callStatic: {}; + + filters: {}; + + estimateGas: {}; + + populateTransaction: {}; +} diff --git a/src/types/lib/utils/index.ts b/src/types/lib/utils/index.ts index 73ea0b4..7c62577 100644 --- a/src/types/lib/utils/index.ts +++ b/src/types/lib/utils/index.ts @@ -1,6 +1,7 @@ /* Autogenerated file. Do not edit manually. */ /* tslint:disable */ /* eslint-disable */ +export type { ECDSA } from "./ECDSA"; export type { Multicall } from "./Multicall"; export type { ReentrancyGuard } from "./ReentrancyGuard"; export type { SafeTransferLib } from "./SafeTransferLib"; diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index c7c9a8b..b4d2f89 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -29,7 +29,6 @@ import type { export interface P2PIXInterface extends utils.Interface { functions: { - "WAD()": FunctionFragment; "_castAddrToKey(address)": FunctionFragment; "_castKeyToAddr(uint256)": FunctionFragment; "allowedERC20s(address)": FunctionFragment; @@ -40,7 +39,7 @@ export interface P2PIXInterface extends utils.Interface { "getLocksStatus(uint256[])": FunctionFragment; "getPixTarget(address,address)": FunctionFragment; "getValid(address,address)": FunctionFragment; - "lock(address,address,address,uint256,uint256,bytes32[],uint256[])": FunctionFragment; + "lock(address,address,address,uint80,uint80,bytes32[],uint256[])": FunctionFragment; "lockCounter()": FunctionFragment; "mapLocks(uint256)": FunctionFragment; "owner()": FunctionFragment; @@ -65,7 +64,6 @@ export interface P2PIXInterface extends utils.Interface { getFunction( nameOrSignatureOrTopic: - | "WAD" | "_castAddrToKey" | "_castKeyToAddr" | "allowedERC20s" @@ -99,7 +97,6 @@ export interface P2PIXInterface extends utils.Interface { | "withdrawBalance" ): FunctionFragment; - encodeFunctionData(functionFragment: "WAD", values?: undefined): string; encodeFunctionData( functionFragment: "_castAddrToKey", values: [PromiseOrValue] @@ -246,7 +243,6 @@ export interface P2PIXInterface extends utils.Interface { values?: undefined ): string; - decodeFunctionResult(functionFragment: "WAD", data: BytesLike): Result; decodeFunctionResult( functionFragment: "_castAddrToKey", data: BytesLike @@ -545,8 +541,6 @@ export interface P2PIX extends BaseContract { removeListener: OnEvent; functions: { - WAD(overrides?: CallOverrides): Promise<[BigNumber]>; - _castAddrToKey( _addr: PromiseOrValue, overrides?: CallOverrides @@ -632,10 +626,10 @@ export interface P2PIX extends BaseContract { ] & { sellerKey: BigNumber; counter: BigNumber; - relayerPremium: BigNumber; - amount: BigNumber; expirationBlock: BigNumber; pixTarget: BigNumber; + relayerPremium: BigNumber; + amount: BigNumber; buyerAddress: string; relayerAddress: string; token: string; @@ -736,8 +730,6 @@ export interface P2PIX extends BaseContract { ): Promise; }; - WAD(overrides?: CallOverrides): Promise; - _castAddrToKey( _addr: PromiseOrValue, overrides?: CallOverrides @@ -823,10 +815,10 @@ export interface P2PIX extends BaseContract { ] & { sellerKey: BigNumber; counter: BigNumber; - relayerPremium: BigNumber; - amount: BigNumber; expirationBlock: BigNumber; pixTarget: BigNumber; + relayerPremium: BigNumber; + amount: BigNumber; buyerAddress: string; relayerAddress: string; token: string; @@ -927,8 +919,6 @@ export interface P2PIX extends BaseContract { ): Promise; callStatic: { - WAD(overrides?: CallOverrides): Promise; - _castAddrToKey( _addr: PromiseOrValue, overrides?: CallOverrides @@ -1014,10 +1004,10 @@ export interface P2PIX extends BaseContract { ] & { sellerKey: BigNumber; counter: BigNumber; - relayerPremium: BigNumber; - amount: BigNumber; expirationBlock: BigNumber; pixTarget: BigNumber; + relayerPremium: BigNumber; + amount: BigNumber; buyerAddress: string; relayerAddress: string; token: string; @@ -1231,8 +1221,6 @@ export interface P2PIX extends BaseContract { }; estimateGas: { - WAD(overrides?: CallOverrides): Promise; - _castAddrToKey( _addr: PromiseOrValue, overrides?: CallOverrides @@ -1401,8 +1389,6 @@ export interface P2PIX extends BaseContract { }; populateTransaction: { - WAD(overrides?: CallOverrides): Promise; - _castAddrToKey( _addr: PromiseOrValue, overrides?: CallOverrides diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index c242324..2e35dc1 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -850,7 +850,7 @@ describe("P2PIX", () => { const endtoendID = ethers.constants.HashZero; const target = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [target, price, endtoendID], ); const messageHashBytes = @@ -1257,7 +1257,7 @@ describe("P2PIX", () => { it("should revert if lock has expired", async () => { const target = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [target, 100, ethers.constants.HashZero], ); const flatSig = await acc01.signMessage( @@ -1302,7 +1302,7 @@ describe("P2PIX", () => { const target = ethers.BigNumber.from("1"); const hashZero = ethers.constants.HashZero; const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [target, 100, hashZero], ); const flatSig = await acc01.signMessage( @@ -1352,7 +1352,7 @@ describe("P2PIX", () => { it("should revert if signed message has already been used", async () => { const target = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [target, 100, ethers.constants.HashZero], ); const flatSig = await owner.signMessage( @@ -1417,7 +1417,7 @@ describe("P2PIX", () => { it("should revert if ecrecovered signer is invalid", async () => { const target = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [target, 100, ethers.constants.HashZero], ); const flatSig = await acc03.signMessage( @@ -1464,7 +1464,7 @@ describe("P2PIX", () => { const endtoendID = ethers.constants.HashZero; const pixTarget = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [pixTarget, 100, endtoendID], ); // Note: messageToSign is a string, that is 66-bytes long, to sign the @@ -1632,7 +1632,7 @@ describe("P2PIX", () => { acc03Key, ); const messageToSign1 = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [pixTarget, 100, endtoendID], ); const flatSig1 = await owner.signMessage( @@ -1640,7 +1640,7 @@ describe("P2PIX", () => { ); const sig1 = ethers.utils.splitSignature(flatSig1); const messageToSign2 = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [pixTarget, 50, endtoendID], ); const flatSig2 = await owner.signMessage( @@ -1648,7 +1648,7 @@ describe("P2PIX", () => { ); const sig2 = ethers.utils.splitSignature(flatSig2); const messageToSign3 = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [pixTarget, 25, endtoendID], ); const flatSig3 = await owner.signMessage( @@ -1885,7 +1885,7 @@ describe("P2PIX", () => { const endtoendID = ethers.constants.HashZero; const pixTarget = ethers.BigNumber.from(101); const messageToSign = ethers.utils.solidityKeccak256( - ["uint160", "uint256", "bytes32"], + ["uint160", "uint80", "bytes32"], [pixTarget, 1, endtoendID], ); const messageHashBytes =