diff --git a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json index 8274933..0176b98 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json index 8274933..cc833b3 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../build-info/10314198dd1b1c93bdb3afe5190d4fa3.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json index acbb74f..0679a99 100644 --- a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json +++ b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json @@ -38,6 +38,11 @@ "name": "LengthMismatch", "type": "error" }, + { + "inputs": [], + "name": "LockExpired", + "type": "error" + }, { "inputs": [], "name": "LoopOverflow", diff --git a/artifacts/contracts/Reputation.sol/Reputation.dbg.json b/artifacts/contracts/Reputation.sol/Reputation.dbg.json index 8274933..0176b98 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/utils/Counters.sol/Counters.dbg.json b/artifacts/contracts/lib/utils/Counters.sol/Counters.dbg.json index 0ff5a8a..ae137ed 100644 --- a/artifacts/contracts/lib/utils/Counters.sol/Counters.dbg.json +++ b/artifacts/contracts/lib/utils/Counters.sol/Counters.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json index 0ff5a8a..ae137ed 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/8b1c16bb48b706a49fa1987390ca36fd.json" + "buildInfo": "../../../../build-info/246d885849ebe73a8f97a386ac3822ea.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index a27cfb1..093f0c0 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/43c90b4df62900d52ce9b2809e9d7089.json" + "buildInfo": "../../build-info/a7ece494b4784ac2499b0ced3d2c9c0a.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index 6e1ec8e..9feb860 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -69,6 +69,11 @@ "name": "LengthMismatch", "type": "error" }, + { + "inputs": [], + "name": "LockExpired", + "type": "error" + }, { "inputs": [], "name": "LoopOverflow", @@ -805,6 +810,25 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "name": "usedTransactions", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -873,8 +897,8 @@ "type": "receive" } ], - "bytecode": "0x608060405260018055604051620027b5380380620027b58339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b61218580620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611a81565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611b8e565b610599565b005b34801561020957600080fd5b506101fb610218366004611bcb565b61068a565b34801561022957600080fd5b50610282610238366004611a81565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611be8565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cc5565b610916565b34801561032957600080fd5b506101c8610338366004611bcb565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611a81565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bcb565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611a81565b610ade565b3480156103e957600080fd5b506101c86103f8366004611a81565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d11565b610b66565b34801561043657600080fd5b506101fb610445366004611d3d565b610bf9565b34801561045657600080fd5b506101c8610465366004611da1565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e55565b611176565b3480156104ce57600080fd5b506104e26104dd366004611a81565b6112ce565b6040516101d2959493929190611e97565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611a81565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f24565b611398565b34801561058557600080fd5b506101fb610594366004611bcb565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c611fee565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612004565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611507565b83156107f3576107f33385610b66565b60008381526007602090815260409091208251815581830151805184936108219260018501929101906119e8565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611532565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611507565b610927836115c9565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611606565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa83382611692565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae7816115c9565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611507565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b910161208c565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612149565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e55908490612160565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e949190612160565b90915550610ee59050565b86600201548760010154610eb39190612160565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf908490612160565b90915550505b6004870154610eff9083906001600160a01b031683611606565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611606565b610f57828d60018a60010154901c611606565b610f6b565b610f6b828d8960010154611606565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611507565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c6116ed565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110719190612160565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c8908890889033611771565b6110d38382846117a3565b5050611160565b60648160400151116110f1576110d38382846117a3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118a1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117a3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a611fee565b90506020020135815260200190815260200160002090506111ba8161195d565b60028101548154600090815260076020526040812080549091906111df908490612160565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff88888881811061128657611286611fee565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f090612051565b80601f016020809104026020016040519081016040528092919081815260200182805461131c90612051565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b905090565b6001546002141561152b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806115c25760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611603576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff1916908201526000906074016040516020818303038152906040528051906020012090504360086000838152602001908152602001600020600301541061176a5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117868484846001600160a01b0385166119a4565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611849908490612149565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119545763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119825760405163d0404f8560e01b815260040160405180910390fd5b6002810154611603576040516331da482760e11b815260040160405180910390fd5b600083156119e0578360051b8501855b803580851160051b948552602094851852604060002093018181106119d8576119dd565b6119b4565b50505b501492915050565b8280546119f490612051565b90600052602060002090601f016020900481019282611a165760008555611a5c565b82601f10611a2f57805160ff1916838001178555611a5c565b82800160010185558215611a5c579182015b82811115611a5c578251825591602001919060010190611a41565b50611a68929150611a6c565b5090565b5b80821115611a685760008155600101611a6d565b600060208284031215611a9357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ad957611ad9611a9a565b604052919050565b600067ffffffffffffffff821115611afb57611afb611a9a565b5060051b60200190565b6001600160a01b038116811461160357600080fd5b600082601f830112611b2b57600080fd5b81356020611b40611b3b83611ae1565b611ab0565b82815260059290921b84018101918181019086841115611b5f57600080fd5b8286015b84811015611b83578035611b7681611b05565b8352918301918301611b63565b509695505050505050565b600060208284031215611ba057600080fd5b813567ffffffffffffffff811115611bb757600080fd5b611bc384828501611b1a565b949350505050565b600060208284031215611bdd57600080fd5b813561176a81611b05565b600080600080600060808688031215611c0057600080fd5b8535611c0b81611b05565b945060208601359350604086013567ffffffffffffffff80821115611c2f57600080fd5b818801915088601f830112611c4357600080fd5b813581811115611c5257600080fd5b896020828501011115611c6457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611c8b57600080fd5b50813567ffffffffffffffff811115611ca357600080fd5b6020830191508360208260051b8501011115611cbe57600080fd5b9250929050565b600080600060408486031215611cda57600080fd5b83359250602084013567ffffffffffffffff811115611cf857600080fd5b611d0486828701611c79565b9497909650939450505050565b60008060408385031215611d2457600080fd5b8235611d2f81611b05565b946020939093013593505050565b60008060008060008060c08789031215611d5657600080fd5b863595506020870135611d6881611b05565b945060408701359350606087013592506080870135915060a087013560ff81168114611d9357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611dbf57600080fd5b8935985060208a0135611dd181611b05565b975060408a0135611de181611b05565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e0c57600080fd5b611e188d838e01611c79565b909650945060c08c0135915080821115611e3157600080fd5b50611e3e8c828d01611c79565b915080935050809150509295985092959850929598565b60008060208385031215611e6857600080fd5b823567ffffffffffffffff811115611e7f57600080fd5b611e8b85828601611c79565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ecb5788810183015185820160c001528201611eaf565b81811115611edd57600060c083870101525b50601f01601f1916830160c0019150611f03905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f3757600080fd5b823567ffffffffffffffff80821115611f4f57600080fd5b611f5b86838701611b1a565b9350602091508185013581811115611f7257600080fd5b85019050601f81018613611f8557600080fd5b8035611f93611b3b82611ae1565b81815260059190911b82018301908381019088831115611fb257600080fd5b928401925b82841015611fdf5783358015158114611fd05760008081fd5b82529284019290840190611fb7565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120455783516001600160a01b031683529284019291840191600101612020565b50909695505050505050565b600181811c9082168061206557607f821691505b6020821081141561208657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120a857607f831692505b60208084108214156120c857634e487b7160e01b86526022600452602486fd5b8180156120dc57600181146120ed5761211a565b60ff1986168952848901965061211a565b60008c81526020902060005b868110156121125781548b8201529085019083016120f9565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561215b5761215b612133565b500390565b6000821982111561217357612173612133565b50019056fea164736f6c6343000809000a", - "deployedBytecode": "0x60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611a81565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611b8e565b610599565b005b34801561020957600080fd5b506101fb610218366004611bcb565b61068a565b34801561022957600080fd5b50610282610238366004611a81565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611be8565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cc5565b610916565b34801561032957600080fd5b506101c8610338366004611bcb565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611a81565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bcb565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611a81565b610ade565b3480156103e957600080fd5b506101c86103f8366004611a81565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d11565b610b66565b34801561043657600080fd5b506101fb610445366004611d3d565b610bf9565b34801561045657600080fd5b506101c8610465366004611da1565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e55565b611176565b3480156104ce57600080fd5b506104e26104dd366004611a81565b6112ce565b6040516101d2959493929190611e97565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611a81565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f24565b611398565b34801561058557600080fd5b506101fb610594366004611bcb565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c611fee565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612004565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611507565b83156107f3576107f33385610b66565b60008381526007602090815260409091208251815581830151805184936108219260018501929101906119e8565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611532565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611507565b610927836115c9565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611606565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa83382611692565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae7816115c9565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611507565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b910161208c565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612149565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e55908490612160565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e949190612160565b90915550610ee59050565b86600201548760010154610eb39190612160565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf908490612160565b90915550505b6004870154610eff9083906001600160a01b031683611606565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611606565b610f57828d60018a60010154901c611606565b610f6b565b610f6b828d8960010154611606565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611507565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c6116ed565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110719190612160565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c8908890889033611771565b6110d38382846117a3565b5050611160565b60648160400151116110f1576110d38382846117a3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118a1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117a3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a611fee565b90506020020135815260200190815260200160002090506111ba8161195d565b60028101548154600090815260076020526040812080549091906111df908490612160565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff88888881811061128657611286611fee565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f090612051565b80601f016020809104026020016040519081016040528092919081815260200182805461131c90612051565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b905090565b6001546002141561152b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806115c25760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611603576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff1916908201526000906074016040516020818303038152906040528051906020012090504360086000838152602001908152602001600020600301541061176a5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117868484846001600160a01b0385166119a4565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611849908490612149565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119545763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119825760405163d0404f8560e01b815260040160405180910390fd5b6002810154611603576040516331da482760e11b815260040160405180910390fd5b600083156119e0578360051b8501855b803580851160051b948552602094851852604060002093018181106119d8576119dd565b6119b4565b50505b501492915050565b8280546119f490612051565b90600052602060002090601f016020900481019282611a165760008555611a5c565b82601f10611a2f57805160ff1916838001178555611a5c565b82800160010185558215611a5c579182015b82811115611a5c578251825591602001919060010190611a41565b50611a68929150611a6c565b5090565b5b80821115611a685760008155600101611a6d565b600060208284031215611a9357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ad957611ad9611a9a565b604052919050565b600067ffffffffffffffff821115611afb57611afb611a9a565b5060051b60200190565b6001600160a01b038116811461160357600080fd5b600082601f830112611b2b57600080fd5b81356020611b40611b3b83611ae1565b611ab0565b82815260059290921b84018101918181019086841115611b5f57600080fd5b8286015b84811015611b83578035611b7681611b05565b8352918301918301611b63565b509695505050505050565b600060208284031215611ba057600080fd5b813567ffffffffffffffff811115611bb757600080fd5b611bc384828501611b1a565b949350505050565b600060208284031215611bdd57600080fd5b813561176a81611b05565b600080600080600060808688031215611c0057600080fd5b8535611c0b81611b05565b945060208601359350604086013567ffffffffffffffff80821115611c2f57600080fd5b818801915088601f830112611c4357600080fd5b813581811115611c5257600080fd5b896020828501011115611c6457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611c8b57600080fd5b50813567ffffffffffffffff811115611ca357600080fd5b6020830191508360208260051b8501011115611cbe57600080fd5b9250929050565b600080600060408486031215611cda57600080fd5b83359250602084013567ffffffffffffffff811115611cf857600080fd5b611d0486828701611c79565b9497909650939450505050565b60008060408385031215611d2457600080fd5b8235611d2f81611b05565b946020939093013593505050565b60008060008060008060c08789031215611d5657600080fd5b863595506020870135611d6881611b05565b945060408701359350606087013592506080870135915060a087013560ff81168114611d9357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611dbf57600080fd5b8935985060208a0135611dd181611b05565b975060408a0135611de181611b05565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e0c57600080fd5b611e188d838e01611c79565b909650945060c08c0135915080821115611e3157600080fd5b50611e3e8c828d01611c79565b915080935050809150509295985092959850929598565b60008060208385031215611e6857600080fd5b823567ffffffffffffffff811115611e7f57600080fd5b611e8b85828601611c79565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ecb5788810183015185820160c001528201611eaf565b81811115611edd57600060c083870101525b50601f01601f1916830160c0019150611f03905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f3757600080fd5b823567ffffffffffffffff80821115611f4f57600080fd5b611f5b86838701611b1a565b9350602091508185013581811115611f7257600080fd5b85019050601f81018613611f8557600080fd5b8035611f93611b3b82611ae1565b81815260059190911b82018301908381019088831115611fb257600080fd5b928401925b82841015611fdf5783358015158114611fd05760008081fd5b82529284019290840190611fb7565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120455783516001600160a01b031683529284019291840191600101612020565b50909695505050505050565b600181811c9082168061206557607f821691505b6020821081141561208657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120a857607f831692505b60208084108214156120c857634e487b7160e01b86526022600452602486fd5b8180156120dc57600181146120ed5761211a565b60ff1986168952848901965061211a565b60008c81526020902060005b868110156121125781548b8201529085019083016120f9565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561215b5761215b612133565b500390565b6000821982111561217357612173612133565b50019056fea164736f6c6343000809000a", + "bytecode": "0x608060405260018055604051620027f8380380620027f88339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121c880620006306000396000f3fe60806040526004361061019a5760003560e01c806372fada5c116100e15780638e2749d61161008a57806398a268711161006457806398a2687114610544578063c52164c614610574578063d6e8b97314610594578063f7d0e04b146105b457600080fd5b80638e2749d6146104dd5780638e2a3d36146104fd5780639872dbfe1461052e57600080fd5b80638642b5c3116100bb5780638642b5c3146104655780638652b37e146104855780638da5cb5b146104a557600080fd5b806372fada5c146103f857806377cd38a4146104185780637f94f65d1461044557600080fd5b80633631797211610143578063574983c81161011d578063574983c8146103935780635fd8c710146103b357806369cc6af4146103c857600080fd5b80633631797214610308578063461f3120146103285780634b2ae9801461036857600080fd5b806316d722401161017457806316d722401461022857806329cc7d10146102d15780632dfdf0b5146102f157600080fd5b806304937320146101a65780630d2a2d44146101e657806313af40351461020857600080fd5b366101a157005b600080fd5b3480156101b257600080fd5b506101d36101c1366004611ac4565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101f257600080fd5b50610206610201366004611bd1565b6105d4565b005b34801561021457600080fd5b50610206610223366004611c0e565b6106c5565b34801561023457600080fd5b5061028d610243366004611ac4565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101dd565b3480156102dd57600080fd5b506101d36102ec366004611c2b565b610766565b3480156102fd57600080fd5b506003546101d39081565b34801561031457600080fd5b50610206610323366004611d08565b610951565b34801561033457600080fd5b50610358610343366004611ac4565b60096020526000908152604090205460ff1681565b60405190151581526020016101dd565b34801561037457600080fd5b506101d3610383366004611c0e565b600c1b611000600160ac1b031690565b34801561039f57600080fd5b506102066103ae366004611ac4565b610a11565b3480156103bf57600080fd5b50610206610a8f565b3480156103d457600080fd5b506103586103e3366004611c0e565b600b6020526000908152604090205460ff1681565b34801561040457600080fd5b50610206610413366004611ac4565b610b19565b34801561042457600080fd5b506101d3610433366004611ac4565b600a6020526000908152604090205481565b34801561045157600080fd5b50610206610460366004611d54565b610ba1565b34801561047157600080fd5b50610206610480366004611d80565b610c34565b34801561049157600080fd5b506101d36104a0366004611de4565b61100a565b3480156104b157600080fd5b506000546104c5906001600160a01b031681565b6040516001600160a01b0390911681526020016101dd565b3480156104e957600080fd5b506102066104f8366004611e98565b6111b9565b34801561050957600080fd5b5061051d610518366004611ac4565b611311565b6040516101dd959493929190611eda565b34801561053a57600080fd5b506101d360045481565b34801561055057600080fd5b5061035861055f366004611ac4565b60066020526000908152604090205460ff1681565b34801561058057600080fd5b506002546104c5906001600160a01b031681565b3480156105a057600080fd5b506102066105af366004611f67565b6113db565b3480156105c057600080fd5b506102066105cf366004611c0e565b6114b3565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561068957600061066284848151811061064757610647612031565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff19166001908117909155929092019150610628565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516106ba9190612047565b60405180910390a150565b6000546001600160a01b0316331461070e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff166107a157604051630abc194760e11b815260040160405180910390fd5b6107a961153a565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a1660408201526001606090910152905061081e61154a565b831561082e5761082e3385610ba1565b600083815260076020908152604090912082518155818301518051849361085c926001850192910190611a2b565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108e69080546001019055565b6108f28233308a611575565b6108fb60018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61095961154a565b6109628361160c565b61096c82826111b9565b60008381526007602052604090206003810154600160a01b900460ff1615156001141561099c5761099c84610b19565b600381015481546000835560028301546001600160a01b03928316926109c59184911683611649565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a2505050610a0c60018055565b505050565b6000546001600160a01b03163314610a5a5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516106ba91815260200190565b6000546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b47610ae333826116d5565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91016106ba565b610b228161160c565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610c1b57611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c3c61154a565b60008681526008602052604090206002810154610c6c576040516331da482760e11b815260040160405180910390fd5b4381600301541015610c91576040516307b7d7dd60e51b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610cc192600186019290918b91016120cf565b604051602081830303815290604052805190602001209050600081604051602001610d1891907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d6657604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610dda9060019060a0016020604051602081039080840390855afa158015610dbe573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610e0c57604051632057875960e21b815260040160405180910390fd5b6003840154600286015460018701546001600160a01b0390921691600090610e34908361218c565b600060028a0181905560038a01819055878152600960205260409020805460ff191660011790556006890154909150336001600160a01b0390911614610ee5576001880154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610ea59084906121a3565b90915550506006880154600c1b611000600160ac1b031660009081526005602052604081208054849290610eda9084906121a3565b90915550610f279050565b818860010154610ef591906121a3565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610f219084906121a3565b90915550505b6004880154610f419084906001600160a01b031683611649565b600188015415610fad5760058801546001600160a01b038e8116911614610f9e5760058801546001808a0154610f869286926001600160a01b0390911691901c611649565b610f99838e60018b60010154901c611649565b610fad565b610fad838e8a60010154611649565b60048801546040518f81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a2505050505050505061100260018055565b505050505050565b600061101461154a565b61101e83836111b9565b60008a81526007602052604090206003810154600160a01b900460ff1661105857604051635972996f60e11b815260040160405180910390fd5b805487111561107a576040516308aeed0f60e21b815260040160405180910390fd5b6110858b888c611730565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110b491906121a3565b81526001600160a01b03808e1660208301528c166040820152336060909101529050851561111d576002820154600c1b611000600160ac1b03166000908152600a602052604090205461110b9088908890336117b4565b6111168382846117e6565b50506111a3565b6064816040015111611134576111168382846117e6565b611000600160ac1b0333600c1b166000908152600560205260408120549061115b826118e4565b905080836040015111806111755750620f42408360400151115b1561119357604051630e0c7c2360e11b815260040160405180910390fd5b61119e8584866117e6565b505050505b6111ac60018055565b9998505050505050505050565b6000815b808210156112f5576000600860008686868181106111dd576111dd612031565b90506020020135815260200190815260200160002090506111fd816119a0565b60028101548154600090815260076020526040812080549091906112229084906121a3565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161127657600082815260056020526040902060649055611288565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112c9576112c9612031565b905060200201356040516112df91815260200190565b60405180910390a28460010194505050506111bd565b8082101561130b5763dfb035c96000526004601cfd5b50505050565b6007602052600090815260409020805460018201805491929161133390612094565b80601f016020809104026020016040519081016040528092919081815260200182805461135f90612094565b80156113ac5780601f10611381576101008083540402835291602001916113ac565b820191906000526020600020905b81548152906001019060200180831161138f57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146114245760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b8151806114395763df9578836000526004601cfd5b8151811461144f5763ff633a386000526004601cfd5b60208301602083016020830282015b808314611002578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061145e565b6000546001600160a01b031633146114fc5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f906020016106ba565b600061154560035490565b905090565b6001546002141561156e5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116055760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610619565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611646576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061130b5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610619565b600080600080600085875af1905080610a0c5760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610619565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117ad5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c98484846001600160a01b0385166119e7565b61130b57604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c0870151600690940180549490921693169290921790915582549091839161188c90849061218c565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b8360405160240161190291815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119975763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119c55760405163d0404f8560e01b815260040160405180910390fd5b6002810154611646576040516331da482760e11b815260040160405180910390fd5b60008315611a23578360051b8501855b803580851160051b94855260209485185260406000209301818110611a1b57611a20565b6119f7565b50505b501492915050565b828054611a3790612094565b90600052602060002090601f016020900481019282611a595760008555611a9f565b82601f10611a7257805160ff1916838001178555611a9f565b82800160010185558215611a9f579182015b82811115611a9f578251825591602001919060010190611a84565b50611aab929150611aaf565b5090565b5b80821115611aab5760008155600101611ab0565b600060208284031215611ad657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b1c57611b1c611add565b604052919050565b600067ffffffffffffffff821115611b3e57611b3e611add565b5060051b60200190565b6001600160a01b038116811461164657600080fd5b600082601f830112611b6e57600080fd5b81356020611b83611b7e83611b24565b611af3565b82815260059290921b84018101918181019086841115611ba257600080fd5b8286015b84811015611bc6578035611bb981611b48565b8352918301918301611ba6565b509695505050505050565b600060208284031215611be357600080fd5b813567ffffffffffffffff811115611bfa57600080fd5b611c0684828501611b5d565b949350505050565b600060208284031215611c2057600080fd5b81356117ad81611b48565b600080600080600060808688031215611c4357600080fd5b8535611c4e81611b48565b945060208601359350604086013567ffffffffffffffff80821115611c7257600080fd5b818801915088601f830112611c8657600080fd5b813581811115611c9557600080fd5b896020828501011115611ca757600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cce57600080fd5b50813567ffffffffffffffff811115611ce657600080fd5b6020830191508360208260051b8501011115611d0157600080fd5b9250929050565b600080600060408486031215611d1d57600080fd5b83359250602084013567ffffffffffffffff811115611d3b57600080fd5b611d4786828701611cbc565b9497909650939450505050565b60008060408385031215611d6757600080fd5b8235611d7281611b48565b946020939093013593505050565b60008060008060008060c08789031215611d9957600080fd5b863595506020870135611dab81611b48565b945060408701359350606087013592506080870135915060a087013560ff81168114611dd657600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e0257600080fd5b8935985060208a0135611e1481611b48565b975060408a0135611e2481611b48565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e4f57600080fd5b611e5b8d838e01611cbc565b909650945060c08c0135915080821115611e7457600080fd5b50611e818c828d01611cbc565b915080935050809150509295985092959850929598565b60008060208385031215611eab57600080fd5b823567ffffffffffffffff811115611ec257600080fd5b611ece85828601611cbc565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f0e5788810183015185820160c001528201611ef2565b81811115611f2057600060c083870101525b50601f01601f1916830160c0019150611f46905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f7a57600080fd5b823567ffffffffffffffff80821115611f9257600080fd5b611f9e86838701611b5d565b9350602091508185013581811115611fb557600080fd5b85019050601f81018613611fc857600080fd5b8035611fd6611b7e82611b24565b81815260059190911b82018301908381019088831115611ff557600080fd5b928401925b8284101561202257833580151581146120135760008081fd5b82529284019290840190611ffa565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120885783516001600160a01b031683529284019291840191600101612063565b50909695505050505050565b600181811c908216806120a857607f821691505b602082108114156120c957634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120eb57607f831692505b602080841082141561210b57634e487b7160e01b86526022600452602486fd5b81801561211f57600181146121305761215d565b60ff1986168952848901965061215d565b60008c81526020902060005b868110156121555781548b82015290850190830161213c565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561219e5761219e612176565b500390565b600082198211156121b6576121b6612176565b50019056fea164736f6c6343000809000a", + "deployedBytecode": "0x60806040526004361061019a5760003560e01c806372fada5c116100e15780638e2749d61161008a57806398a268711161006457806398a2687114610544578063c52164c614610574578063d6e8b97314610594578063f7d0e04b146105b457600080fd5b80638e2749d6146104dd5780638e2a3d36146104fd5780639872dbfe1461052e57600080fd5b80638642b5c3116100bb5780638642b5c3146104655780638652b37e146104855780638da5cb5b146104a557600080fd5b806372fada5c146103f857806377cd38a4146104185780637f94f65d1461044557600080fd5b80633631797211610143578063574983c81161011d578063574983c8146103935780635fd8c710146103b357806369cc6af4146103c857600080fd5b80633631797214610308578063461f3120146103285780634b2ae9801461036857600080fd5b806316d722401161017457806316d722401461022857806329cc7d10146102d15780632dfdf0b5146102f157600080fd5b806304937320146101a65780630d2a2d44146101e657806313af40351461020857600080fd5b366101a157005b600080fd5b3480156101b257600080fd5b506101d36101c1366004611ac4565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101f257600080fd5b50610206610201366004611bd1565b6105d4565b005b34801561021457600080fd5b50610206610223366004611c0e565b6106c5565b34801561023457600080fd5b5061028d610243366004611ac4565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101dd565b3480156102dd57600080fd5b506101d36102ec366004611c2b565b610766565b3480156102fd57600080fd5b506003546101d39081565b34801561031457600080fd5b50610206610323366004611d08565b610951565b34801561033457600080fd5b50610358610343366004611ac4565b60096020526000908152604090205460ff1681565b60405190151581526020016101dd565b34801561037457600080fd5b506101d3610383366004611c0e565b600c1b611000600160ac1b031690565b34801561039f57600080fd5b506102066103ae366004611ac4565b610a11565b3480156103bf57600080fd5b50610206610a8f565b3480156103d457600080fd5b506103586103e3366004611c0e565b600b6020526000908152604090205460ff1681565b34801561040457600080fd5b50610206610413366004611ac4565b610b19565b34801561042457600080fd5b506101d3610433366004611ac4565b600a6020526000908152604090205481565b34801561045157600080fd5b50610206610460366004611d54565b610ba1565b34801561047157600080fd5b50610206610480366004611d80565b610c34565b34801561049157600080fd5b506101d36104a0366004611de4565b61100a565b3480156104b157600080fd5b506000546104c5906001600160a01b031681565b6040516001600160a01b0390911681526020016101dd565b3480156104e957600080fd5b506102066104f8366004611e98565b6111b9565b34801561050957600080fd5b5061051d610518366004611ac4565b611311565b6040516101dd959493929190611eda565b34801561053a57600080fd5b506101d360045481565b34801561055057600080fd5b5061035861055f366004611ac4565b60066020526000908152604090205460ff1681565b34801561058057600080fd5b506002546104c5906001600160a01b031681565b3480156105a057600080fd5b506102066105af366004611f67565b6113db565b3480156105c057600080fd5b506102066105cf366004611c0e565b6114b3565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561068957600061066284848151811061064757610647612031565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff19166001908117909155929092019150610628565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516106ba9190612047565b60405180910390a150565b6000546001600160a01b0316331461070e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff166107a157604051630abc194760e11b815260040160405180910390fd5b6107a961153a565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a1660408201526001606090910152905061081e61154a565b831561082e5761082e3385610ba1565b600083815260076020908152604090912082518155818301518051849361085c926001850192910190611a2b565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108e69080546001019055565b6108f28233308a611575565b6108fb60018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61095961154a565b6109628361160c565b61096c82826111b9565b60008381526007602052604090206003810154600160a01b900460ff1615156001141561099c5761099c84610b19565b600381015481546000835560028301546001600160a01b03928316926109c59184911683611649565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a2505050610a0c60018055565b505050565b6000546001600160a01b03163314610a5a5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516106ba91815260200190565b6000546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b47610ae333826116d5565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91016106ba565b610b228161160c565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610c1b57611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c3c61154a565b60008681526008602052604090206002810154610c6c576040516331da482760e11b815260040160405180910390fd5b4381600301541015610c91576040516307b7d7dd60e51b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610cc192600186019290918b91016120cf565b604051602081830303815290604052805190602001209050600081604051602001610d1891907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d6657604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610dda9060019060a0016020604051602081039080840390855afa158015610dbe573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610e0c57604051632057875960e21b815260040160405180910390fd5b6003840154600286015460018701546001600160a01b0390921691600090610e34908361218c565b600060028a0181905560038a01819055878152600960205260409020805460ff191660011790556006890154909150336001600160a01b0390911614610ee5576001880154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610ea59084906121a3565b90915550506006880154600c1b611000600160ac1b031660009081526005602052604081208054849290610eda9084906121a3565b90915550610f279050565b818860010154610ef591906121a3565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610f219084906121a3565b90915550505b6004880154610f419084906001600160a01b031683611649565b600188015415610fad5760058801546001600160a01b038e8116911614610f9e5760058801546001808a0154610f869286926001600160a01b0390911691901c611649565b610f99838e60018b60010154901c611649565b610fad565b610fad838e8a60010154611649565b60048801546040518f81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a2505050505050505061100260018055565b505050505050565b600061101461154a565b61101e83836111b9565b60008a81526007602052604090206003810154600160a01b900460ff1661105857604051635972996f60e11b815260040160405180910390fd5b805487111561107a576040516308aeed0f60e21b815260040160405180910390fd5b6110858b888c611730565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110b491906121a3565b81526001600160a01b03808e1660208301528c166040820152336060909101529050851561111d576002820154600c1b611000600160ac1b03166000908152600a602052604090205461110b9088908890336117b4565b6111168382846117e6565b50506111a3565b6064816040015111611134576111168382846117e6565b611000600160ac1b0333600c1b166000908152600560205260408120549061115b826118e4565b905080836040015111806111755750620f42408360400151115b1561119357604051630e0c7c2360e11b815260040160405180910390fd5b61119e8584866117e6565b505050505b6111ac60018055565b9998505050505050505050565b6000815b808210156112f5576000600860008686868181106111dd576111dd612031565b90506020020135815260200190815260200160002090506111fd816119a0565b60028101548154600090815260076020526040812080549091906112229084906121a3565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161127657600082815260056020526040902060649055611288565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112c9576112c9612031565b905060200201356040516112df91815260200190565b60405180910390a28460010194505050506111bd565b8082101561130b5763dfb035c96000526004601cfd5b50505050565b6007602052600090815260409020805460018201805491929161133390612094565b80601f016020809104026020016040519081016040528092919081815260200182805461135f90612094565b80156113ac5780601f10611381576101008083540402835291602001916113ac565b820191906000526020600020905b81548152906001019060200180831161138f57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146114245760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b8151806114395763df9578836000526004601cfd5b8151811461144f5763ff633a386000526004601cfd5b60208301602083016020830282015b808314611002578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061145e565b6000546001600160a01b031633146114fc5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f906020016106ba565b600061154560035490565b905090565b6001546002141561156e5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116055760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610619565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611646576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061130b5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610619565b600080600080600085875af1905080610a0c5760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610619565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117ad5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c98484846001600160a01b0385166119e7565b61130b57604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c0870151600690940180549490921693169290921790915582549091839161188c90849061218c565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b8360405160240161190291815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119975763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119c55760405163d0404f8560e01b815260040160405180910390fd5b6002810154611646576040516331da482760e11b815260040160405180910390fd5b60008315611a23578360051b8501855b803580851160051b94855260209485185260406000209301818110611a1b57611a20565b6119f7565b50505b501492915050565b828054611a3790612094565b90600052602060002090601f016020900481019282611a595760008555611a9f565b82601f10611a7257805160ff1916838001178555611a9f565b82800160010185558215611a9f579182015b82811115611a9f578251825591602001919060010190611a84565b50611aab929150611aaf565b5090565b5b80821115611aab5760008155600101611ab0565b600060208284031215611ad657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b1c57611b1c611add565b604052919050565b600067ffffffffffffffff821115611b3e57611b3e611add565b5060051b60200190565b6001600160a01b038116811461164657600080fd5b600082601f830112611b6e57600080fd5b81356020611b83611b7e83611b24565b611af3565b82815260059290921b84018101918181019086841115611ba257600080fd5b8286015b84811015611bc6578035611bb981611b48565b8352918301918301611ba6565b509695505050505050565b600060208284031215611be357600080fd5b813567ffffffffffffffff811115611bfa57600080fd5b611c0684828501611b5d565b949350505050565b600060208284031215611c2057600080fd5b81356117ad81611b48565b600080600080600060808688031215611c4357600080fd5b8535611c4e81611b48565b945060208601359350604086013567ffffffffffffffff80821115611c7257600080fd5b818801915088601f830112611c8657600080fd5b813581811115611c9557600080fd5b896020828501011115611ca757600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cce57600080fd5b50813567ffffffffffffffff811115611ce657600080fd5b6020830191508360208260051b8501011115611d0157600080fd5b9250929050565b600080600060408486031215611d1d57600080fd5b83359250602084013567ffffffffffffffff811115611d3b57600080fd5b611d4786828701611cbc565b9497909650939450505050565b60008060408385031215611d6757600080fd5b8235611d7281611b48565b946020939093013593505050565b60008060008060008060c08789031215611d9957600080fd5b863595506020870135611dab81611b48565b945060408701359350606087013592506080870135915060a087013560ff81168114611dd657600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e0257600080fd5b8935985060208a0135611e1481611b48565b975060408a0135611e2481611b48565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e4f57600080fd5b611e5b8d838e01611cbc565b909650945060c08c0135915080821115611e7457600080fd5b50611e818c828d01611cbc565b915080935050809150509295985092959850929598565b60008060208385031215611eab57600080fd5b823567ffffffffffffffff811115611ec257600080fd5b611ece85828601611cbc565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f0e5788810183015185820160c001528201611ef2565b81811115611f2057600060c083870101525b50601f01601f1916830160c0019150611f46905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f7a57600080fd5b823567ffffffffffffffff80821115611f9257600080fd5b611f9e86838701611b5d565b9350602091508185013581811115611fb557600080fd5b85019050601f81018613611fc857600080fd5b8035611fd6611b7e82611b24565b81815260059190911b82018301908381019088831115611ff557600080fd5b928401925b8284101561202257833580151581146120135760008081fd5b82529284019290840190611ffa565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120885783516001600160a01b031683529284019291840191600101612063565b50909695505050505050565b600181811c908216806120a857607f821691505b602082108114156120c957634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120eb57607f831692505b602080841082141561210b57634e487b7160e01b86526022600452602486fd5b81801561211f57600181146121305761215d565b60ff1986168952848901965061215d565b60008c81526020902060005b868110156121555781548b82015290850190830161213c565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561219e5761219e612176565b500390565b600082198211156121b6576121b6612176565b50019056fea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/EventAndErrors.sol b/contracts/EventAndErrors.sol index d64d114..20359c6 100644 --- a/contracts/EventAndErrors.sol +++ b/contracts/EventAndErrors.sol @@ -100,4 +100,7 @@ interface EventAndErrors { /// @dev Reverts when success return value returns false. /// @dev 0xe10bf1cc error StaticCallFailed(); + /// @dev Reverts on an expired lock. + /// @dev 0xf6fafba0 + error LockExpired(); } diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 44005bc..40a7790 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -46,7 +46,7 @@ contract P2PIX is /// @dev List of Locks. mapping(bytes32 => DT.Lock) public mapLocks; /// @dev List of Pix transactions already signed. - mapping(bytes32 => bool) private usedTransactions; + mapping(bytes32 => bool) public usedTransactions; /// @dev Seller casted to key => Seller's allowlist merkleroot. mapping(uint256 => bytes32) public sellerAllowList; /// @dev Tokens allowed to serve as the underlying amount of a deposit. @@ -243,9 +243,12 @@ contract P2PIX is ) public nonReentrant { DT.Lock storage l = mapLocks[lockID]; - if ( - l.expirationBlock <= block.number || l.amount <= 0 - ) revert AlreadyReleased(); + // if ( + // l.expirationBlock <= block.number || l.amount <= 0 + // ) revert AlreadyReleased(); + if (l.amount == 0) revert AlreadyReleased(); + if (l.expirationBlock < block.number) + revert LockExpired(); DT.Deposit storage d = mapDeposits[l.depositID]; bytes32 message = keccak256( @@ -275,7 +278,8 @@ contract P2PIX is ERC20 t = ERC20(d.token); // We cache values before zeroing them out. - uint256 totalAmount = (l.amount - l.relayerPremium); + uint256 lockAmount = l.amount; + uint256 totalAmount = (lockAmount - l.relayerPremium); l.amount = 0; l.expirationBlock = 0; @@ -284,11 +288,12 @@ contract P2PIX is if (msg.sender != l.relayerAddress) { userRecord[_castAddrToKey(msg.sender)] += l .relayerPremium; - userRecord[_castAddrToKey(l.relayerAddress)] += l - .amount; + userRecord[ + _castAddrToKey(l.relayerAddress) + ] += lockAmount; } else { userRecord[_castAddrToKey(msg.sender)] += (l - .relayerPremium + l.amount); + .relayerPremium + lockAmount); } SafeTransferLib.safeTransfer( diff --git a/deploys/localhost.json b/deploys/localhost.json index 36c432c..ad0c84f 100644 --- a/deploys/localhost.json +++ b/deploys/localhost.json @@ -5,4 +5,4 @@ ], "p2pix": "0x37c856F4d5bC2597da60f607b1335738468453F3", "token": "0x294003F602c321627152c6b7DED3EAb5bEa853Ee" -} \ No newline at end of file +} diff --git a/src/types/factories/EventAndErrors__factory.ts b/src/types/factories/EventAndErrors__factory.ts index a25767b..817b9b2 100644 --- a/src/types/factories/EventAndErrors__factory.ts +++ b/src/types/factories/EventAndErrors__factory.ts @@ -45,6 +45,11 @@ const _abi = [ name: "LengthMismatch", type: "error", }, + { + inputs: [], + name: "LockExpired", + type: "error", + }, { inputs: [], name: "LoopOverflow", diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index b882e19..befa2c1 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -80,6 +80,11 @@ const _abi = [ name: "LengthMismatch", type: "error", }, + { + inputs: [], + name: "LockExpired", + type: "error", + }, { inputs: [], name: "LoopOverflow", @@ -816,6 +821,25 @@ const _abi = [ stateMutability: "nonpayable", type: "function", }, + { + inputs: [ + { + internalType: "bytes32", + name: "", + type: "bytes32", + }, + ], + name: "usedTransactions", + outputs: [ + { + internalType: "bool", + name: "", + type: "bool", + }, + ], + stateMutability: "view", + type: "function", + }, { inputs: [ { @@ -886,7 +910,7 @@ const _abi = [ ]; const _bytecode = - "0x608060405260018055604051620027b5380380620027b58339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b61218580620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611a81565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611b8e565b610599565b005b34801561020957600080fd5b506101fb610218366004611bcb565b61068a565b34801561022957600080fd5b50610282610238366004611a81565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611be8565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cc5565b610916565b34801561032957600080fd5b506101c8610338366004611bcb565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611a81565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bcb565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611a81565b610ade565b3480156103e957600080fd5b506101c86103f8366004611a81565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d11565b610b66565b34801561043657600080fd5b506101fb610445366004611d3d565b610bf9565b34801561045657600080fd5b506101c8610465366004611da1565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e55565b611176565b3480156104ce57600080fd5b506104e26104dd366004611a81565b6112ce565b6040516101d2959493929190611e97565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611a81565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f24565b611398565b34801561058557600080fd5b506101fb610594366004611bcb565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c611fee565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612004565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611507565b83156107f3576107f33385610b66565b60008381526007602090815260409091208251815581830151805184936108219260018501929101906119e8565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611532565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611507565b610927836115c9565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611606565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa83382611692565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae7816115c9565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611507565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b910161208c565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612149565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e55908490612160565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e949190612160565b90915550610ee59050565b86600201548760010154610eb39190612160565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf908490612160565b90915550505b6004870154610eff9083906001600160a01b031683611606565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611606565b610f57828d60018a60010154901c611606565b610f6b565b610f6b828d8960010154611606565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611507565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c6116ed565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110719190612160565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c8908890889033611771565b6110d38382846117a3565b5050611160565b60648160400151116110f1576110d38382846117a3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118a1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117a3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a611fee565b90506020020135815260200190815260200160002090506111ba8161195d565b60028101548154600090815260076020526040812080549091906111df908490612160565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff88888881811061128657611286611fee565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f090612051565b80601f016020809104026020016040519081016040528092919081815260200182805461131c90612051565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b905090565b6001546002141561152b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806115c25760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611603576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff1916908201526000906074016040516020818303038152906040528051906020012090504360086000838152602001908152602001600020600301541061176a5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117868484846001600160a01b0385166119a4565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611849908490612149565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119545763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119825760405163d0404f8560e01b815260040160405180910390fd5b6002810154611603576040516331da482760e11b815260040160405180910390fd5b600083156119e0578360051b8501855b803580851160051b948552602094851852604060002093018181106119d8576119dd565b6119b4565b50505b501492915050565b8280546119f490612051565b90600052602060002090601f016020900481019282611a165760008555611a5c565b82601f10611a2f57805160ff1916838001178555611a5c565b82800160010185558215611a5c579182015b82811115611a5c578251825591602001919060010190611a41565b50611a68929150611a6c565b5090565b5b80821115611a685760008155600101611a6d565b600060208284031215611a9357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611ad957611ad9611a9a565b604052919050565b600067ffffffffffffffff821115611afb57611afb611a9a565b5060051b60200190565b6001600160a01b038116811461160357600080fd5b600082601f830112611b2b57600080fd5b81356020611b40611b3b83611ae1565b611ab0565b82815260059290921b84018101918181019086841115611b5f57600080fd5b8286015b84811015611b83578035611b7681611b05565b8352918301918301611b63565b509695505050505050565b600060208284031215611ba057600080fd5b813567ffffffffffffffff811115611bb757600080fd5b611bc384828501611b1a565b949350505050565b600060208284031215611bdd57600080fd5b813561176a81611b05565b600080600080600060808688031215611c0057600080fd5b8535611c0b81611b05565b945060208601359350604086013567ffffffffffffffff80821115611c2f57600080fd5b818801915088601f830112611c4357600080fd5b813581811115611c5257600080fd5b896020828501011115611c6457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611c8b57600080fd5b50813567ffffffffffffffff811115611ca357600080fd5b6020830191508360208260051b8501011115611cbe57600080fd5b9250929050565b600080600060408486031215611cda57600080fd5b83359250602084013567ffffffffffffffff811115611cf857600080fd5b611d0486828701611c79565b9497909650939450505050565b60008060408385031215611d2457600080fd5b8235611d2f81611b05565b946020939093013593505050565b60008060008060008060c08789031215611d5657600080fd5b863595506020870135611d6881611b05565b945060408701359350606087013592506080870135915060a087013560ff81168114611d9357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611dbf57600080fd5b8935985060208a0135611dd181611b05565b975060408a0135611de181611b05565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e0c57600080fd5b611e188d838e01611c79565b909650945060c08c0135915080821115611e3157600080fd5b50611e3e8c828d01611c79565b915080935050809150509295985092959850929598565b60008060208385031215611e6857600080fd5b823567ffffffffffffffff811115611e7f57600080fd5b611e8b85828601611c79565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ecb5788810183015185820160c001528201611eaf565b81811115611edd57600060c083870101525b50601f01601f1916830160c0019150611f03905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f3757600080fd5b823567ffffffffffffffff80821115611f4f57600080fd5b611f5b86838701611b1a565b9350602091508185013581811115611f7257600080fd5b85019050601f81018613611f8557600080fd5b8035611f93611b3b82611ae1565b81815260059190911b82018301908381019088831115611fb257600080fd5b928401925b82841015611fdf5783358015158114611fd05760008081fd5b82529284019290840190611fb7565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120455783516001600160a01b031683529284019291840191600101612020565b50909695505050505050565b600181811c9082168061206557607f821691505b6020821081141561208657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120a857607f831692505b60208084108214156120c857634e487b7160e01b86526022600452602486fd5b8180156120dc57600181146120ed5761211a565b60ff1986168952848901965061211a565b60008c81526020902060005b868110156121125781548b8201529085019083016120f9565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561215b5761215b612133565b500390565b6000821982111561217357612173612133565b50019056fea164736f6c6343000809000a"; + "0x608060405260018055604051620027f8380380620027f88339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121c880620006306000396000f3fe60806040526004361061019a5760003560e01c806372fada5c116100e15780638e2749d61161008a57806398a268711161006457806398a2687114610544578063c52164c614610574578063d6e8b97314610594578063f7d0e04b146105b457600080fd5b80638e2749d6146104dd5780638e2a3d36146104fd5780639872dbfe1461052e57600080fd5b80638642b5c3116100bb5780638642b5c3146104655780638652b37e146104855780638da5cb5b146104a557600080fd5b806372fada5c146103f857806377cd38a4146104185780637f94f65d1461044557600080fd5b80633631797211610143578063574983c81161011d578063574983c8146103935780635fd8c710146103b357806369cc6af4146103c857600080fd5b80633631797214610308578063461f3120146103285780634b2ae9801461036857600080fd5b806316d722401161017457806316d722401461022857806329cc7d10146102d15780632dfdf0b5146102f157600080fd5b806304937320146101a65780630d2a2d44146101e657806313af40351461020857600080fd5b366101a157005b600080fd5b3480156101b257600080fd5b506101d36101c1366004611ac4565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101f257600080fd5b50610206610201366004611bd1565b6105d4565b005b34801561021457600080fd5b50610206610223366004611c0e565b6106c5565b34801561023457600080fd5b5061028d610243366004611ac4565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101dd565b3480156102dd57600080fd5b506101d36102ec366004611c2b565b610766565b3480156102fd57600080fd5b506003546101d39081565b34801561031457600080fd5b50610206610323366004611d08565b610951565b34801561033457600080fd5b50610358610343366004611ac4565b60096020526000908152604090205460ff1681565b60405190151581526020016101dd565b34801561037457600080fd5b506101d3610383366004611c0e565b600c1b611000600160ac1b031690565b34801561039f57600080fd5b506102066103ae366004611ac4565b610a11565b3480156103bf57600080fd5b50610206610a8f565b3480156103d457600080fd5b506103586103e3366004611c0e565b600b6020526000908152604090205460ff1681565b34801561040457600080fd5b50610206610413366004611ac4565b610b19565b34801561042457600080fd5b506101d3610433366004611ac4565b600a6020526000908152604090205481565b34801561045157600080fd5b50610206610460366004611d54565b610ba1565b34801561047157600080fd5b50610206610480366004611d80565b610c34565b34801561049157600080fd5b506101d36104a0366004611de4565b61100a565b3480156104b157600080fd5b506000546104c5906001600160a01b031681565b6040516001600160a01b0390911681526020016101dd565b3480156104e957600080fd5b506102066104f8366004611e98565b6111b9565b34801561050957600080fd5b5061051d610518366004611ac4565b611311565b6040516101dd959493929190611eda565b34801561053a57600080fd5b506101d360045481565b34801561055057600080fd5b5061035861055f366004611ac4565b60066020526000908152604090205460ff1681565b34801561058057600080fd5b506002546104c5906001600160a01b031681565b3480156105a057600080fd5b506102066105af366004611f67565b6113db565b3480156105c057600080fd5b506102066105cf366004611c0e565b6114b3565b6000546001600160a01b031633146106225760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561068957600061066284848151811061064757610647612031565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff19166001908117909155929092019150610628565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516106ba9190612047565b60405180910390a150565b6000546001600160a01b0316331461070e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff166107a157604051630abc194760e11b815260040160405180910390fd5b6107a961153a565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a1660408201526001606090910152905061081e61154a565b831561082e5761082e3385610ba1565b600083815260076020908152604090912082518155818301518051849361085c926001850192910190611a2b565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108e69080546001019055565b6108f28233308a611575565b6108fb60018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61095961154a565b6109628361160c565b61096c82826111b9565b60008381526007602052604090206003810154600160a01b900460ff1615156001141561099c5761099c84610b19565b600381015481546000835560028301546001600160a01b03928316926109c59184911683611649565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a2505050610a0c60018055565b505050565b6000546001600160a01b03163314610a5a5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516106ba91815260200190565b6000546001600160a01b03163314610ad85760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b47610ae333826116d5565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91016106ba565b610b228161160c565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610c1b57611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c3c61154a565b60008681526008602052604090206002810154610c6c576040516331da482760e11b815260040160405180910390fd5b4381600301541015610c91576040516307b7d7dd60e51b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610cc192600186019290918b91016120cf565b604051602081830303815290604052805190602001209050600081604051602001610d1891907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d6657604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610dda9060019060a0016020604051602081039080840390855afa158015610dbe573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610e0c57604051632057875960e21b815260040160405180910390fd5b6003840154600286015460018701546001600160a01b0390921691600090610e34908361218c565b600060028a0181905560038a01819055878152600960205260409020805460ff191660011790556006890154909150336001600160a01b0390911614610ee5576001880154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610ea59084906121a3565b90915550506006880154600c1b611000600160ac1b031660009081526005602052604081208054849290610eda9084906121a3565b90915550610f279050565b818860010154610ef591906121a3565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610f219084906121a3565b90915550505b6004880154610f419084906001600160a01b031683611649565b600188015415610fad5760058801546001600160a01b038e8116911614610f9e5760058801546001808a0154610f869286926001600160a01b0390911691901c611649565b610f99838e60018b60010154901c611649565b610fad565b610fad838e8a60010154611649565b60048801546040518f81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a2505050505050505061100260018055565b505050505050565b600061101461154a565b61101e83836111b9565b60008a81526007602052604090206003810154600160a01b900460ff1661105857604051635972996f60e11b815260040160405180910390fd5b805487111561107a576040516308aeed0f60e21b815260040160405180910390fd5b6110858b888c611730565b915060006040518060e001604052808d81526020018a8152602001898152602001600454436110b491906121a3565b81526001600160a01b03808e1660208301528c166040820152336060909101529050851561111d576002820154600c1b611000600160ac1b03166000908152600a602052604090205461110b9088908890336117b4565b6111168382846117e6565b50506111a3565b6064816040015111611134576111168382846117e6565b611000600160ac1b0333600c1b166000908152600560205260408120549061115b826118e4565b905080836040015111806111755750620f42408360400151115b1561119357604051630e0c7c2360e11b815260040160405180910390fd5b61119e8584866117e6565b505050505b6111ac60018055565b9998505050505050505050565b6000815b808210156112f5576000600860008686868181106111dd576111dd612031565b90506020020135815260200190815260200160002090506111fd816119a0565b60028101548154600090815260076020526040812080549091906112229084906121a3565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161127657600082815260056020526040902060649055611288565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112c9576112c9612031565b905060200201356040516112df91815260200190565b60405180910390a28460010194505050506111bd565b8082101561130b5763dfb035c96000526004601cfd5b50505050565b6007602052600090815260409020805460018201805491929161133390612094565b80601f016020809104026020016040519081016040528092919081815260200182805461135f90612094565b80156113ac5780601f10611381576101008083540402835291602001916113ac565b820191906000526020600020905b81548152906001019060200180831161138f57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146114245760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b8151806114395763df9578836000526004601cfd5b8151811461144f5763ff633a386000526004601cfd5b60208301602083016020830282015b808314611002578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061145e565b6000546001600160a01b031633146114fc5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401610619565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f906020016106ba565b600061154560035490565b905090565b6001546002141561156e5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116055760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610619565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611646576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061130b5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610619565b600080600080600085875af1905080610a0c5760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610619565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117ad5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c98484846001600160a01b0385166119e7565b61130b57604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c0870151600690940180549490921693169290921790915582549091839161188c90849061218c565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b8360405160240161190291815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119975763e10bf1cc6000526004601cfd5b50505050919050565b43816003015411156119c55760405163d0404f8560e01b815260040160405180910390fd5b6002810154611646576040516331da482760e11b815260040160405180910390fd5b60008315611a23578360051b8501855b803580851160051b94855260209485185260406000209301818110611a1b57611a20565b6119f7565b50505b501492915050565b828054611a3790612094565b90600052602060002090601f016020900481019282611a595760008555611a9f565b82601f10611a7257805160ff1916838001178555611a9f565b82800160010185558215611a9f579182015b82811115611a9f578251825591602001919060010190611a84565b50611aab929150611aaf565b5090565b5b80821115611aab5760008155600101611ab0565b600060208284031215611ad657600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b1c57611b1c611add565b604052919050565b600067ffffffffffffffff821115611b3e57611b3e611add565b5060051b60200190565b6001600160a01b038116811461164657600080fd5b600082601f830112611b6e57600080fd5b81356020611b83611b7e83611b24565b611af3565b82815260059290921b84018101918181019086841115611ba257600080fd5b8286015b84811015611bc6578035611bb981611b48565b8352918301918301611ba6565b509695505050505050565b600060208284031215611be357600080fd5b813567ffffffffffffffff811115611bfa57600080fd5b611c0684828501611b5d565b949350505050565b600060208284031215611c2057600080fd5b81356117ad81611b48565b600080600080600060808688031215611c4357600080fd5b8535611c4e81611b48565b945060208601359350604086013567ffffffffffffffff80821115611c7257600080fd5b818801915088601f830112611c8657600080fd5b813581811115611c9557600080fd5b896020828501011115611ca757600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cce57600080fd5b50813567ffffffffffffffff811115611ce657600080fd5b6020830191508360208260051b8501011115611d0157600080fd5b9250929050565b600080600060408486031215611d1d57600080fd5b83359250602084013567ffffffffffffffff811115611d3b57600080fd5b611d4786828701611cbc565b9497909650939450505050565b60008060408385031215611d6757600080fd5b8235611d7281611b48565b946020939093013593505050565b60008060008060008060c08789031215611d9957600080fd5b863595506020870135611dab81611b48565b945060408701359350606087013592506080870135915060a087013560ff81168114611dd657600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e0257600080fd5b8935985060208a0135611e1481611b48565b975060408a0135611e2481611b48565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e4f57600080fd5b611e5b8d838e01611cbc565b909650945060c08c0135915080821115611e7457600080fd5b50611e818c828d01611cbc565b915080935050809150509295985092959850929598565b60008060208385031215611eab57600080fd5b823567ffffffffffffffff811115611ec257600080fd5b611ece85828601611cbc565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f0e5788810183015185820160c001528201611ef2565b81811115611f2057600060c083870101525b50601f01601f1916830160c0019150611f46905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f7a57600080fd5b823567ffffffffffffffff80821115611f9257600080fd5b611f9e86838701611b5d565b9350602091508185013581811115611fb557600080fd5b85019050601f81018613611fc857600080fd5b8035611fd6611b7e82611b24565b81815260059190911b82018301908381019088831115611ff557600080fd5b928401925b8284101561202257833580151581146120135760008081fd5b82529284019290840190611ffa565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120885783516001600160a01b031683529284019291840191600101612063565b50909695505050505050565b600181811c908216806120a857607f821691505b602082108114156120c957634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120eb57607f831692505b602080841082141561210b57634e487b7160e01b86526022600452602486fd5b81801561211f57600181146121305761215d565b60ff1986168952848901965061215d565b60008c81526020902060005b868110156121555781548b82015290850190830161213c565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b60008282101561219e5761219e612176565b500390565b600082198211156121b6576121b6612176565b50019056fea164736f6c6343000809000a"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index b86b025..5d578fc 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -49,6 +49,7 @@ export interface P2PIXInterface extends utils.Interface { "setValidSigners(address[])": FunctionFragment; "tokenSettings(address[],bool[])": FunctionFragment; "unlockExpired(bytes32[])": FunctionFragment; + "usedTransactions(bytes32)": FunctionFragment; "userRecord(uint256)": FunctionFragment; "validBacenSigners(uint256)": FunctionFragment; "withdraw(uint256,bytes32[])": FunctionFragment; @@ -77,6 +78,7 @@ export interface P2PIXInterface extends utils.Interface { | "setValidSigners" | "tokenSettings" | "unlockExpired" + | "usedTransactions" | "userRecord" | "validBacenSigners" | "withdraw" @@ -180,6 +182,10 @@ export interface P2PIXInterface extends utils.Interface { functionFragment: "unlockExpired", values: [PromiseOrValue[]] ): string; + encodeFunctionData( + functionFragment: "usedTransactions", + values: [PromiseOrValue] + ): string; encodeFunctionData( functionFragment: "userRecord", values: [PromiseOrValue] @@ -253,6 +259,10 @@ export interface P2PIXInterface extends utils.Interface { functionFragment: "unlockExpired", data: BytesLike ): Result; + decodeFunctionResult( + functionFragment: "usedTransactions", + data: BytesLike + ): Result; decodeFunctionResult(functionFragment: "userRecord", data: BytesLike): Result; decodeFunctionResult( functionFragment: "validBacenSigners", @@ -596,6 +606,11 @@ export interface P2PIX extends BaseContract { overrides?: Overrides & { from?: PromiseOrValue } ): Promise; + usedTransactions( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise<[boolean]>; + userRecord( arg0: PromiseOrValue, overrides?: CallOverrides @@ -739,6 +754,11 @@ export interface P2PIX extends BaseContract { overrides?: Overrides & { from?: PromiseOrValue } ): Promise; + usedTransactions( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + userRecord( arg0: PromiseOrValue, overrides?: CallOverrides @@ -882,6 +902,11 @@ export interface P2PIX extends BaseContract { overrides?: CallOverrides ): Promise; + usedTransactions( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + userRecord( arg0: PromiseOrValue, overrides?: CallOverrides @@ -1115,6 +1140,11 @@ export interface P2PIX extends BaseContract { overrides?: Overrides & { from?: PromiseOrValue } ): Promise; + usedTransactions( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + userRecord( arg0: PromiseOrValue, overrides?: CallOverrides @@ -1241,6 +1271,11 @@ export interface P2PIX extends BaseContract { overrides?: Overrides & { from?: PromiseOrValue } ): Promise; + usedTransactions( + arg0: PromiseOrValue, + overrides?: CallOverrides + ): Promise; + userRecord( arg0: PromiseOrValue, overrides?: CallOverrides diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index 0e7fede..378e38c 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -944,69 +944,345 @@ describe("P2PIX", () => { expect(newState3.valid).to.be.false; }); }); - // describe("Release", async () => { - // // it("should revert if lock has expired or has already been released") - // // it("should revert if signed message has already been used") - // // it("should revert if ecrecovered signer is invalid") - // // // @todo Finish storage and event checks - // // it("should release lock, update storage and emit events", async () => { - // // const endtoendID = "124"; - // // const pixTarget = "pixTarget"; - // // const messageToSign = ethers.utils.solidityKeccak256( - // // ["string", "uint256", "uint256"], - // // [pixTarget, 100, endtoendID], - // // ); - // // const messageHashBytes = - // // ethers.utils.arrayify(messageToSign); - // // const flatSig = await acc01.signMessage( - // // messageHashBytes, - // // ); - // // const sig = ethers.utils.splitSignature(flatSig); - // // const root = ethers.constants.HashZero; + describe("Release", async () => { + it("should revert if lock has expired", async () => { + const messageToSign = ethers.utils.solidityKeccak256( + ["string", "uint256", "uint256"], + ["pixTarget", 100, "1337"], + ); + const flatSig = await acc01.signMessage( + ethers.utils.arrayify(messageToSign), + ); + const sig = ethers.utils.splitSignature(flatSig); + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + await mine(13); + const fail = p2pix.release( + lockID, + acc03.address, + "1337", + sig.r, + sig.s, + sig.v, + ); - // // await erc20.approve(p2pix.address, price); - // // await p2pix.deposit( - // // erc20.address, - // // price, - // // pixTarget, - // // root, - // // ); - // // await p2pix - // // .connect(acc01) - // // .lock( - // // 0, - // // acc02.address, - // // acc03.address, - // // 0, - // // 100, - // // [], - // // [], - // // ); - // // const lockID = ethers.utils.solidityKeccak256( - // // ["uint256", "uint256", "address"], - // // [0, 100, acc02.address], - // // ); - // // const storage1: Lock = await p2pix.callStatic.mapLocks( - // // lockID, - // // ); - // // const tx = await p2pix - // // .connect(acc01) - // // .release( - // // lockID, - // // acc03.address, - // // endtoendID, - // // sig.r, - // // sig.s, - // // sig.v, - // // ); - // // }); - // // it("should release multiple locks") - EDGE CASE TEST { - // // TEST 3 CASES ( - // // EMPTY PREMIUM, - // // LOCK RELAYER != RELEASE RELAYER, (check userRecord storage update) - // // LOCK RELAYER == RELEASE RELAYER (check userRecord storage update) - // // )} - // }); + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.LockExpired, + ); + }); + it("should revert if lock has already been released", async () => { + const messageToSign = ethers.utils.solidityKeccak256( + ["string", "uint256", "uint256"], + ["pixTarget", 100, "1337"], + ); + const flatSig = await acc01.signMessage( + ethers.utils.arrayify(messageToSign), + ); + const sig = ethers.utils.splitSignature(flatSig); + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + await p2pix.release( + lockID, + acc03.address, + "1337", + sig.r, + sig.s, + sig.v, + ); + const fail = p2pix.release( + lockID, + acc03.address, + "1337", + sig.r, + sig.s, + sig.v, + ); + + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.AlreadyReleased, + ); + }); + it("should revert if signed message has already been used", async () => { + const messageToSign = ethers.utils.solidityKeccak256( + ["string", "uint256", "uint256"], + ["pixTarget", 100, "1337"], + ); + const flatSig = await owner.signMessage( + ethers.utils.arrayify(messageToSign), + ); + const sig = ethers.utils.splitSignature(flatSig); + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + ethers.constants.HashZero, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + await p2pix + .connect(acc01) + .release( + lockID, + acc02.address, + "1337", + sig.r, + sig.s, + sig.v, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID2 = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + const fail = p2pix + .connect(acc01) + .release( + lockID2, + acc02.address, + "1337", + sig.r, + sig.s, + sig.v, + ); + + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.TxAlreadyUsed, + ); + }); + it("should revert if ecrecovered signer is invalid", async () => { + const messageToSign = ethers.utils.solidityKeccak256( + ["string", "uint256", "uint256"], + ["pixTarget", 100, "1337"], + ); + const flatSig = await acc03.signMessage( + ethers.utils.arrayify(messageToSign), + ); + const sig = ethers.utils.splitSignature(flatSig); + + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + ethers.constants.HashZero, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + const fail = p2pix + .connect(acc01) + .release( + lockID, + acc02.address, + "1337", + sig.r, + sig.s, + sig.v, + ); + + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.InvalidSigner, + ); + }); + it("should release lock, update storage and emit events", async () => { + const endtoendID = "124"; + const pixTarget = "pixTarget"; + const messageToSign = ethers.utils.solidityKeccak256( + ["string", "uint256", "uint256"], + [pixTarget, 100, endtoendID], + ); + // Note: messageToSign is a string, that is 66-bytes long, to sign the + // binary value, we must convert it to the 32 byte Array that + // the string represents + // + // i.e., + // 66-byte string + // "0x592fa743889fc7f92ac2a37bb1f5ba1daf2a5c84741ca0e0061d243a2e6707ba" + // ... vs ... + // 32 entry Uint8Array + // [ 89, 47, 167, 67, 136, 159, ... 103, 7, 186] + const messageHashBytes = + ethers.utils.arrayify(messageToSign); + const flatSig = await acc01.signMessage( + messageHashBytes, + ); + const sig = ethers.utils.splitSignature(flatSig); + const root = ethers.constants.HashZero; + + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + pixTarget, + root, + ); + await p2pix + .connect(acc03) + .lock( + 0, + acc02.address, + acc03.address, + 6, + 100, + [], + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + const acc01Key = await p2pix.callStatic._castAddrToKey( + acc01.address, + ); + const acc03Key = await p2pix.callStatic._castAddrToKey( + acc03.address, + ); + const userRecordA = await p2pix.callStatic.userRecord( + acc01Key, + ); + const userRecord1 = await p2pix.callStatic.userRecord( + acc03Key, + ); + const storage1: Lock = await p2pix.callStatic.mapLocks( + lockID, + ); + const tx = await p2pix + .connect(acc01) + .release( + lockID, + acc02.address, + endtoendID, + sig.r, + sig.s, + sig.v, + ); + const storage2: Lock = await p2pix.callStatic.mapLocks( + lockID, + ); + const userRecordB = await p2pix.callStatic.userRecord( + acc01Key, + ); + const userRecord2 = await p2pix.callStatic.userRecord( + acc03Key, + ); + const used = await p2pix.callStatic.usedTransactions( + messageHashBytes, + ); + expect(tx).to.be.ok; + await expect(tx) + .to.emit(p2pix, "LockReleased") + .withArgs(acc02.address, lockID); + expect(storage1.expirationBlock).to.eq( + ethers.BigNumber.from(16), + ); + expect(storage1.amount).to.eq( + ethers.BigNumber.from(100), + ); + expect(storage2.expirationBlock).to.eq( + ethers.BigNumber.from(0), + ); + expect(storage2.amount).to.eq(ethers.BigNumber.from(0)); + expect(used).to.eq(true); + expect(userRecordA).to.eq(ethers.constants.Zero); + expect(userRecord1).to.eq(ethers.constants.Zero); + expect(userRecordB).to.eq(ethers.BigNumber.from(6)); + expect(userRecord2).to.eq(ethers.BigNumber.from(100)); + await expect(tx).to.changeTokenBalances( + erc20, + [acc03.address, acc02.address], + [3, 97], + // acc02 is acting both as buyer and relayerTarget + // (i.e., 94 + 3 = 97) + ); + }); + /// @todo + // it("should release multiple locks") - EDGE CASE TEST { + // TEST 3 CASES ( + // EMPTY PREMIUM, + // LOCK RELAYER != RELEASE RELAYER, (check userRecord storage update) + // LOCK RELAYER == RELEASE RELAYER (check userRecord storage update) + // )} + }); describe("Unexpire Locks", async () => { it("should revert if lock isn't expired", async () => { await erc20.approve(p2pix.address, price); @@ -1059,8 +1335,8 @@ describe("P2PIX", () => { ); // await mine(10); await p2pix.release( - lockID, - acc03.address, + lockID, + acc03.address, endtoendID, sig.r, sig.s, @@ -1281,7 +1557,7 @@ describe("P2PIX", () => { }); }); describe("Allowlist Settings", async () => { - it(" should revert if the msg.sender differs from deposit's seller", async () => { + it("should revert if the msg.sender differs from deposit's seller", async () => { const root = ethers.utils.keccak256( ethers.utils.toUtf8Bytes("root"), ); diff --git a/test/utils/errors.ts b/test/utils/errors.ts index d064218..111ff6f 100644 --- a/test/utils/errors.ts +++ b/test/utils/errors.ts @@ -14,4 +14,5 @@ export enum P2PixErrors { LengthMismatch = "LengthMismatch", AddressDenied = "AddressDenied", AmountNotAllowed = "AmountNotAllowed", + LockExpired = "LockExpired", }