diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json index 910c92b..2bd7854 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/ce60783a904758b510bc61bc47947601.json" + "buildInfo": "../../build-info/4a0f142c7439e90ed9431fa5c0d6c0c6.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json index 6f9ef56..acbb74f 100644 --- a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json +++ b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json @@ -286,6 +286,25 @@ "name": "ReputationUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + } + ], + "name": "RootUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index e5ded85..2bd7854 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/351fea96dbbd5ddc7250e49d27b4151f.json" + "buildInfo": "../../build-info/4a0f142c7439e90ed9431fa5c0d6c0c6.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index 3d3755d..8838dde 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -341,6 +341,25 @@ "name": "ReputationUpdated", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "seller", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "merkleRoot", + "type": "bytes32" + } + ], + "name": "RootUpdated", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -854,8 +873,8 @@ "type": "receive" } ], - "bytecode": "0x60806040526001805560405162002825380380620028258339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121f580620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611af1565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bfe565b610599565b005b34801561020957600080fd5b506101fb610218366004611c3b565b61068a565b34801561022957600080fd5b50610282610238366004611af1565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c58565b61071e565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611d35565b6108fc565b34801561032957600080fd5b506101c8610338366004611c3b565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611af1565b6109bc565b34801561037457600080fd5b506101fb610a3a565b34801561038957600080fd5b506103ad610398366004611c3b565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611af1565b610ac4565b3480156103e957600080fd5b506101c86103f8366004611af1565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d81565b610b4c565b34801561043657600080fd5b506101fb610445366004611dad565b610b97565b34801561045657600080fd5b506101c8610465366004611e11565b610f65565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611ec5565b6112b8565b3480156104ce57600080fd5b506104e26104dd366004611af1565b611410565b6040516101d2959493929190611f07565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611af1565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f94565b6114da565b34801561058557600080fd5b506101fb610594366004611c3b565b6115b2565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61205e565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612074565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661075957604051630abc194760e11b815260040160405180910390fd5b610761611639565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107d6611689565b83156107e6576107e63385610b4c565b6000838152600760209081526040909120825181558183015180518493610814926001850192910190611a58565b5060408201516002820180546001600160a01b039283166001600160a01b03199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108919080546001019055565b61089d8233308a6116b4565b6108a660018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b610904611689565b61090d8361174b565b61091782826112b8565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109475761094784610ac4565b600381015481546000835560028301546001600160a01b03928316926109709184911683611788565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109b760018055565b505050565b6000546001600160a01b03163314610a055760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a835760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610a8e3382611814565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610acd8161174b565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610b7e57600c9190911b611000600160ac1b03166000908152600a6020526040902055565b6040516342e8fb9360e11b815260040160405180910390fd5b610b9f611689565b6000868152600860205260409020600381015443101580610bc257506002810154155b15610be0576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c1092600186019290918b91016120fc565b604051602081830303815290604052805190602001209050600081604051602001610c6791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610cb557604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d299060019060a0016020604051602081039080840390855afa158015610d0d573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610d5b57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610d82916121b9565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e3d576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610df39084906121d0565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e3291906121d0565b90915550610e839050565b86600201548760010154610e5191906121d0565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e7d9084906121d0565b90915550505b6004870154610e9d9083906001600160a01b031683611788565b600187015415610f095760058701546001600160a01b038d8116911614610efa576005870154600180890154610ee29285926001600160a01b0390911691901c611788565b610ef5828d60018a60010154901c611788565b610f09565b610f09828d8960010154611788565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610f5d60018055565b505050505050565b6000610f6f611689565b610f7983836112b8565b60008a81526007602052604090206003810154600160a01b900460ff16610fb357604051635972996f60e11b815260040160405180910390fd5b8054871115610fd5576040516308aeed0f60e21b815260040160405180910390fd5b610fe08b888c61186f565b915060006040518060e001604052808d81526020018a81526020018981526020016004544361100f91906121d0565b81526001600160a01b03808e1660208301528c1660408201523360609091015290508515611150576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110669088908890336118f3565b60008381526008602090815260408083208451815591840151600183015583015160028201556060830151600382015560808301516004820180546001600160a01b039283166001600160a01b03199182161790915560a085015160058401805491841691831691909117905560c0850151600690930180549390921692169190911790558254899184916110fc9084906121b9565b9091555050805160408051918252602082018a905284916001600160a01b038e16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a350506112a2565b611000600160ac1b0333600c1b166000908152600560205260408120549061117782611925565b905080836040015111806111915750620f42408360400151115b156111af57604051630e0c7c2360e11b815260040160405180910390fd5b60008581526008602090815260408083208651815591860151600183015585015160028201556060850151600382015560808501516004820180546001600160a01b039283166001600160a01b03199182161790915560a087015160058401805491841691831691909117905560c08701516006909301805493909216921691909117905584548b9186916112459084906121b9565b92505081905550848d6001600160a01b03167f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea85600001518d604051611295929190918252602082015260400190565b60405180910390a3505050505b6112ab60018055565b9998505050505050505050565b6000815b808210156113f4576000600860008686868181106112dc576112dc61205e565b90506020020135815260200190815260200160002090506112fc816119e1565b60028101548154600090815260076020526040812080549091906113219084906121d0565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161137557600082815260056020526040902060649055611387565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106113c8576113c861205e565b905060200201356040516113de91815260200190565b60405180910390a28460010194505050506112bc565b8082101561140a5763dfb035c96000526004601cfd5b50505050565b60076020526000908152604090208054600182018054919291611432906120c1565b80601f016020809104026020016040519081016040528092919081815260200182805461145e906120c1565b80156114ab5780601f10611480576101008083540402835291602001916114ab565b820191906000526020600020905b81548152906001019060200180831161148e57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146115235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806115385763df9578836000526004601cfd5b8151811461154e5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610f5d578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061155d565b6000546001600160a01b031633146115fb5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061164460035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156116865760405163c44bd76560e01b815260040160405180910390fd5b90565b600154600214156116ad5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806117445760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611785576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061140a5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109b75760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106118ec5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6119088484846001600160a01b038516611a14565b61140a57604051631dc23a5f60e11b815260040160405180910390fd5b600080634d2b179160e01b8360405160240161194391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119d85763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119f657506002810154155b156117855760405163d0404f8560e01b815260040160405180910390fd5b60008315611a50578360051b8501855b803580851160051b94855260209485185260406000209301818110611a4857611a4d565b611a24565b50505b501492915050565b828054611a64906120c1565b90600052602060002090601f016020900481019282611a865760008555611acc565b82601f10611a9f57805160ff1916838001178555611acc565b82800160010185558215611acc579182015b82811115611acc578251825591602001919060010190611ab1565b50611ad8929150611adc565b5090565b5b80821115611ad85760008155600101611add565b600060208284031215611b0357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4957611b49611b0a565b604052919050565b600067ffffffffffffffff821115611b6b57611b6b611b0a565b5060051b60200190565b6001600160a01b038116811461178557600080fd5b600082601f830112611b9b57600080fd5b81356020611bb0611bab83611b51565b611b20565b82815260059290921b84018101918181019086841115611bcf57600080fd5b8286015b84811015611bf3578035611be681611b75565b8352918301918301611bd3565b509695505050505050565b600060208284031215611c1057600080fd5b813567ffffffffffffffff811115611c2757600080fd5b611c3384828501611b8a565b949350505050565b600060208284031215611c4d57600080fd5b81356118ec81611b75565b600080600080600060808688031215611c7057600080fd5b8535611c7b81611b75565b945060208601359350604086013567ffffffffffffffff80821115611c9f57600080fd5b818801915088601f830112611cb357600080fd5b813581811115611cc257600080fd5b896020828501011115611cd457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cfb57600080fd5b50813567ffffffffffffffff811115611d1357600080fd5b6020830191508360208260051b8501011115611d2e57600080fd5b9250929050565b600080600060408486031215611d4a57600080fd5b83359250602084013567ffffffffffffffff811115611d6857600080fd5b611d7486828701611ce9565b9497909650939450505050565b60008060408385031215611d9457600080fd5b8235611d9f81611b75565b946020939093013593505050565b60008060008060008060c08789031215611dc657600080fd5b863595506020870135611dd881611b75565b945060408701359350606087013592506080870135915060a087013560ff81168114611e0357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e2f57600080fd5b8935985060208a0135611e4181611b75565b975060408a0135611e5181611b75565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e7c57600080fd5b611e888d838e01611ce9565b909650945060c08c0135915080821115611ea157600080fd5b50611eae8c828d01611ce9565b915080935050809150509295985092959850929598565b60008060208385031215611ed857600080fd5b823567ffffffffffffffff811115611eef57600080fd5b611efb85828601611ce9565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f3b5788810183015185820160c001528201611f1f565b81811115611f4d57600060c083870101525b50601f01601f1916830160c0019150611f73905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611fa757600080fd5b823567ffffffffffffffff80821115611fbf57600080fd5b611fcb86838701611b8a565b9350602091508185013581811115611fe257600080fd5b85019050601f81018613611ff557600080fd5b8035612003611bab82611b51565b81815260059190911b8201830190838101908883111561202257600080fd5b928401925b8284101561204f57833580151581146120405760008081fd5b82529284019290840190612027565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120b55783516001600160a01b031683529284019291840191600101612090565b50909695505050505050565b600181811c908216806120d557607f821691505b602082108114156120f657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061211857607f831692505b602080841082141561213857634e487b7160e01b86526022600452602486fd5b81801561214c576001811461215d5761218a565b60ff1986168952848901965061218a565b60008c81526020902060005b868110156121825781548b820152908501908301612169565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121cb576121cb6121a3565b500390565b600082198211156121e3576121e36121a3565b50019056fea164736f6c6343000809000a", - "deployedBytecode": "0x60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611af1565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bfe565b610599565b005b34801561020957600080fd5b506101fb610218366004611c3b565b61068a565b34801561022957600080fd5b50610282610238366004611af1565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c58565b61071e565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611d35565b6108fc565b34801561032957600080fd5b506101c8610338366004611c3b565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611af1565b6109bc565b34801561037457600080fd5b506101fb610a3a565b34801561038957600080fd5b506103ad610398366004611c3b565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611af1565b610ac4565b3480156103e957600080fd5b506101c86103f8366004611af1565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d81565b610b4c565b34801561043657600080fd5b506101fb610445366004611dad565b610b97565b34801561045657600080fd5b506101c8610465366004611e11565b610f65565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611ec5565b6112b8565b3480156104ce57600080fd5b506104e26104dd366004611af1565b611410565b6040516101d2959493929190611f07565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611af1565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f94565b6114da565b34801561058557600080fd5b506101fb610594366004611c3b565b6115b2565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61205e565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612074565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661075957604051630abc194760e11b815260040160405180910390fd5b610761611639565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107d6611689565b83156107e6576107e63385610b4c565b6000838152600760209081526040909120825181558183015180518493610814926001850192910190611a58565b5060408201516002820180546001600160a01b039283166001600160a01b03199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108919080546001019055565b61089d8233308a6116b4565b6108a660018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b610904611689565b61090d8361174b565b61091782826112b8565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109475761094784610ac4565b600381015481546000835560028301546001600160a01b03928316926109709184911683611788565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109b760018055565b505050565b6000546001600160a01b03163314610a055760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a835760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610a8e3382611814565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610acd8161174b565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610b7e57600c9190911b611000600160ac1b03166000908152600a6020526040902055565b6040516342e8fb9360e11b815260040160405180910390fd5b610b9f611689565b6000868152600860205260409020600381015443101580610bc257506002810154155b15610be0576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c1092600186019290918b91016120fc565b604051602081830303815290604052805190602001209050600081604051602001610c6791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610cb557604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d299060019060a0016020604051602081039080840390855afa158015610d0d573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610d5b57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610d82916121b9565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e3d576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610df39084906121d0565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e3291906121d0565b90915550610e839050565b86600201548760010154610e5191906121d0565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e7d9084906121d0565b90915550505b6004870154610e9d9083906001600160a01b031683611788565b600187015415610f095760058701546001600160a01b038d8116911614610efa576005870154600180890154610ee29285926001600160a01b0390911691901c611788565b610ef5828d60018a60010154901c611788565b610f09565b610f09828d8960010154611788565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610f5d60018055565b505050505050565b6000610f6f611689565b610f7983836112b8565b60008a81526007602052604090206003810154600160a01b900460ff16610fb357604051635972996f60e11b815260040160405180910390fd5b8054871115610fd5576040516308aeed0f60e21b815260040160405180910390fd5b610fe08b888c61186f565b915060006040518060e001604052808d81526020018a81526020018981526020016004544361100f91906121d0565b81526001600160a01b03808e1660208301528c1660408201523360609091015290508515611150576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110669088908890336118f3565b60008381526008602090815260408083208451815591840151600183015583015160028201556060830151600382015560808301516004820180546001600160a01b039283166001600160a01b03199182161790915560a085015160058401805491841691831691909117905560c0850151600690930180549390921692169190911790558254899184916110fc9084906121b9565b9091555050805160408051918252602082018a905284916001600160a01b038e16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a350506112a2565b611000600160ac1b0333600c1b166000908152600560205260408120549061117782611925565b905080836040015111806111915750620f42408360400151115b156111af57604051630e0c7c2360e11b815260040160405180910390fd5b60008581526008602090815260408083208651815591860151600183015585015160028201556060850151600382015560808501516004820180546001600160a01b039283166001600160a01b03199182161790915560a087015160058401805491841691831691909117905560c08701516006909301805493909216921691909117905584548b9186916112459084906121b9565b92505081905550848d6001600160a01b03167f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea85600001518d604051611295929190918252602082015260400190565b60405180910390a3505050505b6112ab60018055565b9998505050505050505050565b6000815b808210156113f4576000600860008686868181106112dc576112dc61205e565b90506020020135815260200190815260200160002090506112fc816119e1565b60028101548154600090815260076020526040812080549091906113219084906121d0565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161137557600082815260056020526040902060649055611387565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106113c8576113c861205e565b905060200201356040516113de91815260200190565b60405180910390a28460010194505050506112bc565b8082101561140a5763dfb035c96000526004601cfd5b50505050565b60076020526000908152604090208054600182018054919291611432906120c1565b80601f016020809104026020016040519081016040528092919081815260200182805461145e906120c1565b80156114ab5780601f10611480576101008083540402835291602001916114ab565b820191906000526020600020905b81548152906001019060200180831161148e57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146115235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806115385763df9578836000526004601cfd5b8151811461154e5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610f5d578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061155d565b6000546001600160a01b031633146115fb5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061164460035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156116865760405163c44bd76560e01b815260040160405180910390fd5b90565b600154600214156116ad5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806117445760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611785576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061140a5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109b75760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106118ec5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6119088484846001600160a01b038516611a14565b61140a57604051631dc23a5f60e11b815260040160405180910390fd5b600080634d2b179160e01b8360405160240161194391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119d85763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119f657506002810154155b156117855760405163d0404f8560e01b815260040160405180910390fd5b60008315611a50578360051b8501855b803580851160051b94855260209485185260406000209301818110611a4857611a4d565b611a24565b50505b501492915050565b828054611a64906120c1565b90600052602060002090601f016020900481019282611a865760008555611acc565b82601f10611a9f57805160ff1916838001178555611acc565b82800160010185558215611acc579182015b82811115611acc578251825591602001919060010190611ab1565b50611ad8929150611adc565b5090565b5b80821115611ad85760008155600101611add565b600060208284031215611b0357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4957611b49611b0a565b604052919050565b600067ffffffffffffffff821115611b6b57611b6b611b0a565b5060051b60200190565b6001600160a01b038116811461178557600080fd5b600082601f830112611b9b57600080fd5b81356020611bb0611bab83611b51565b611b20565b82815260059290921b84018101918181019086841115611bcf57600080fd5b8286015b84811015611bf3578035611be681611b75565b8352918301918301611bd3565b509695505050505050565b600060208284031215611c1057600080fd5b813567ffffffffffffffff811115611c2757600080fd5b611c3384828501611b8a565b949350505050565b600060208284031215611c4d57600080fd5b81356118ec81611b75565b600080600080600060808688031215611c7057600080fd5b8535611c7b81611b75565b945060208601359350604086013567ffffffffffffffff80821115611c9f57600080fd5b818801915088601f830112611cb357600080fd5b813581811115611cc257600080fd5b896020828501011115611cd457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cfb57600080fd5b50813567ffffffffffffffff811115611d1357600080fd5b6020830191508360208260051b8501011115611d2e57600080fd5b9250929050565b600080600060408486031215611d4a57600080fd5b83359250602084013567ffffffffffffffff811115611d6857600080fd5b611d7486828701611ce9565b9497909650939450505050565b60008060408385031215611d9457600080fd5b8235611d9f81611b75565b946020939093013593505050565b60008060008060008060c08789031215611dc657600080fd5b863595506020870135611dd881611b75565b945060408701359350606087013592506080870135915060a087013560ff81168114611e0357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e2f57600080fd5b8935985060208a0135611e4181611b75565b975060408a0135611e5181611b75565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e7c57600080fd5b611e888d838e01611ce9565b909650945060c08c0135915080821115611ea157600080fd5b50611eae8c828d01611ce9565b915080935050809150509295985092959850929598565b60008060208385031215611ed857600080fd5b823567ffffffffffffffff811115611eef57600080fd5b611efb85828601611ce9565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f3b5788810183015185820160c001528201611f1f565b81811115611f4d57600060c083870101525b50601f01601f1916830160c0019150611f73905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611fa757600080fd5b823567ffffffffffffffff80821115611fbf57600080fd5b611fcb86838701611b8a565b9350602091508185013581811115611fe257600080fd5b85019050601f81018613611ff557600080fd5b8035612003611bab82611b51565b81815260059190911b8201830190838101908883111561202257600080fd5b928401925b8284101561204f57833580151581146120405760008081fd5b82529284019290840190612027565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120b55783516001600160a01b031683529284019291840191600101612090565b50909695505050505050565b600181811c908216806120d557607f821691505b602082108114156120f657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061211857607f831692505b602080841082141561213857634e487b7160e01b86526022600452602486fd5b81801561214c576001811461215d5761218a565b60ff1986168952848901965061218a565b60008c81526020902060005b868110156121825781548b820152908501908301612169565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121cb576121cb6121a3565b500390565b600082198211156121e3576121e36121a3565b50019056fea164736f6c6343000809000a", + "bytecode": "0x608060405260018055604051620027e1380380620027e18339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121b180620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611aad565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bba565b610599565b005b34801561020957600080fd5b506101fb610218366004611bf7565b61068a565b34801561022957600080fd5b50610282610238366004611aad565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c14565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cf1565b610916565b34801561032957600080fd5b506101c8610338366004611bf7565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611aad565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bf7565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611aad565b610ade565b3480156103e957600080fd5b506101c86103f8366004611aad565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d3d565b610b66565b34801561043657600080fd5b506101fb610445366004611d69565b610bf9565b34801561045657600080fd5b506101c8610465366004611dcd565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e81565b611176565b3480156104ce57600080fd5b506104e26104dd366004611aad565b6112ce565b6040516101d2959493929190611ec3565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611aad565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f50565b611398565b34801561058557600080fd5b506101fb610594366004611bf7565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61201a565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612030565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611547565b83156107f3576107f33385610b66565b6000838152600760209081526040909120825181558183015180518493610821926001850192910190611a14565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611572565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611547565b61092783611609565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611646565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa833826116d2565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae781611609565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611547565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b91016120b8565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612175565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e5590849061218c565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e94919061218c565b90915550610ee59050565b86600201548760010154610eb3919061218c565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf90849061218c565b90915550505b6004870154610eff9083906001600160a01b031683611646565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611646565b610f57828d60018a60010154901c611646565b610f6b565b610f6b828d8960010154611646565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611547565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c61172d565b915060006040518060e001604052808d81526020018a815260200189815260200160045443611071919061218c565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c89088908890336117b1565b6110d38382846117e3565b5050611160565b60648160400151116110f1576110d38382846117e3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118e1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117e3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a61201a565b90506020020135815260200190815260200160002090506111ba8161199d565b60028101548154600090815260076020526040812080549091906111df90849061218c565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112865761128661201a565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f09061207d565b80601f016020809104026020016040519081016040528092919081815260200182805461131c9061207d565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156115445760405163c44bd76560e01b815260040160405180910390fd5b90565b6001546002141561156b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116025760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611643576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117aa5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c68484846001600160a01b0385166119d0565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611889908490612175565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119945763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119b257506002810154155b156116435760405163d0404f8560e01b815260040160405180910390fd5b60008315611a0c578360051b8501855b803580851160051b94855260209485185260406000209301818110611a0457611a09565b6119e0565b50505b501492915050565b828054611a209061207d565b90600052602060002090601f016020900481019282611a425760008555611a88565b82601f10611a5b57805160ff1916838001178555611a88565b82800160010185558215611a88579182015b82811115611a88578251825591602001919060010190611a6d565b50611a94929150611a98565b5090565b5b80821115611a945760008155600101611a99565b600060208284031215611abf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b0557611b05611ac6565b604052919050565b600067ffffffffffffffff821115611b2757611b27611ac6565b5060051b60200190565b6001600160a01b038116811461164357600080fd5b600082601f830112611b5757600080fd5b81356020611b6c611b6783611b0d565b611adc565b82815260059290921b84018101918181019086841115611b8b57600080fd5b8286015b84811015611baf578035611ba281611b31565b8352918301918301611b8f565b509695505050505050565b600060208284031215611bcc57600080fd5b813567ffffffffffffffff811115611be357600080fd5b611bef84828501611b46565b949350505050565b600060208284031215611c0957600080fd5b81356117aa81611b31565b600080600080600060808688031215611c2c57600080fd5b8535611c3781611b31565b945060208601359350604086013567ffffffffffffffff80821115611c5b57600080fd5b818801915088601f830112611c6f57600080fd5b813581811115611c7e57600080fd5b896020828501011115611c9057600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cb757600080fd5b50813567ffffffffffffffff811115611ccf57600080fd5b6020830191508360208260051b8501011115611cea57600080fd5b9250929050565b600080600060408486031215611d0657600080fd5b83359250602084013567ffffffffffffffff811115611d2457600080fd5b611d3086828701611ca5565b9497909650939450505050565b60008060408385031215611d5057600080fd5b8235611d5b81611b31565b946020939093013593505050565b60008060008060008060c08789031215611d8257600080fd5b863595506020870135611d9481611b31565b945060408701359350606087013592506080870135915060a087013560ff81168114611dbf57600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611deb57600080fd5b8935985060208a0135611dfd81611b31565b975060408a0135611e0d81611b31565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e3857600080fd5b611e448d838e01611ca5565b909650945060c08c0135915080821115611e5d57600080fd5b50611e6a8c828d01611ca5565b915080935050809150509295985092959850929598565b60008060208385031215611e9457600080fd5b823567ffffffffffffffff811115611eab57600080fd5b611eb785828601611ca5565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ef75788810183015185820160c001528201611edb565b81811115611f0957600060c083870101525b50601f01601f1916830160c0019150611f2f905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f6357600080fd5b823567ffffffffffffffff80821115611f7b57600080fd5b611f8786838701611b46565b9350602091508185013581811115611f9e57600080fd5b85019050601f81018613611fb157600080fd5b8035611fbf611b6782611b0d565b81815260059190911b82018301908381019088831115611fde57600080fd5b928401925b8284101561200b5783358015158114611ffc5760008081fd5b82529284019290840190611fe3565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120715783516001600160a01b03168352928401929184019160010161204c565b50909695505050505050565b600181811c9082168061209157607f821691505b602082108114156120b257634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120d457607f831692505b60208084108214156120f457634e487b7160e01b86526022600452602486fd5b818015612108576001811461211957612146565b60ff19861689528489019650612146565b60008c81526020902060005b8681101561213e5781548b820152908501908301612125565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121875761218761215f565b500390565b6000821982111561219f5761219f61215f565b50019056fea164736f6c6343000809000a", + "deployedBytecode": "0x60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611aad565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bba565b610599565b005b34801561020957600080fd5b506101fb610218366004611bf7565b61068a565b34801561022957600080fd5b50610282610238366004611aad565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c14565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cf1565b610916565b34801561032957600080fd5b506101c8610338366004611bf7565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611aad565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bf7565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611aad565b610ade565b3480156103e957600080fd5b506101c86103f8366004611aad565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d3d565b610b66565b34801561043657600080fd5b506101fb610445366004611d69565b610bf9565b34801561045657600080fd5b506101c8610465366004611dcd565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e81565b611176565b3480156104ce57600080fd5b506104e26104dd366004611aad565b6112ce565b6040516101d2959493929190611ec3565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611aad565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f50565b611398565b34801561058557600080fd5b506101fb610594366004611bf7565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61201a565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612030565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611547565b83156107f3576107f33385610b66565b6000838152600760209081526040909120825181558183015180518493610821926001850192910190611a14565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611572565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611547565b61092783611609565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611646565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa833826116d2565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae781611609565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611547565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b91016120b8565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612175565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e5590849061218c565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e94919061218c565b90915550610ee59050565b86600201548760010154610eb3919061218c565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf90849061218c565b90915550505b6004870154610eff9083906001600160a01b031683611646565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611646565b610f57828d60018a60010154901c611646565b610f6b565b610f6b828d8960010154611646565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611547565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c61172d565b915060006040518060e001604052808d81526020018a815260200189815260200160045443611071919061218c565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c89088908890336117b1565b6110d38382846117e3565b5050611160565b60648160400151116110f1576110d38382846117e3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118e1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117e3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a61201a565b90506020020135815260200190815260200160002090506111ba8161199d565b60028101548154600090815260076020526040812080549091906111df90849061218c565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112865761128661201a565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f09061207d565b80601f016020809104026020016040519081016040528092919081815260200182805461131c9061207d565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156115445760405163c44bd76560e01b815260040160405180910390fd5b90565b6001546002141561156b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116025760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611643576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117aa5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c68484846001600160a01b0385166119d0565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611889908490612175565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119945763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119b257506002810154155b156116435760405163d0404f8560e01b815260040160405180910390fd5b60008315611a0c578360051b8501855b803580851160051b94855260209485185260406000209301818110611a0457611a09565b6119e0565b50505b501492915050565b828054611a209061207d565b90600052602060002090601f016020900481019282611a425760008555611a88565b82601f10611a5b57805160ff1916838001178555611a88565b82800160010185558215611a88579182015b82811115611a88578251825591602001919060010190611a6d565b50611a94929150611a98565b5090565b5b80821115611a945760008155600101611a99565b600060208284031215611abf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b0557611b05611ac6565b604052919050565b600067ffffffffffffffff821115611b2757611b27611ac6565b5060051b60200190565b6001600160a01b038116811461164357600080fd5b600082601f830112611b5757600080fd5b81356020611b6c611b6783611b0d565b611adc565b82815260059290921b84018101918181019086841115611b8b57600080fd5b8286015b84811015611baf578035611ba281611b31565b8352918301918301611b8f565b509695505050505050565b600060208284031215611bcc57600080fd5b813567ffffffffffffffff811115611be357600080fd5b611bef84828501611b46565b949350505050565b600060208284031215611c0957600080fd5b81356117aa81611b31565b600080600080600060808688031215611c2c57600080fd5b8535611c3781611b31565b945060208601359350604086013567ffffffffffffffff80821115611c5b57600080fd5b818801915088601f830112611c6f57600080fd5b813581811115611c7e57600080fd5b896020828501011115611c9057600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cb757600080fd5b50813567ffffffffffffffff811115611ccf57600080fd5b6020830191508360208260051b8501011115611cea57600080fd5b9250929050565b600080600060408486031215611d0657600080fd5b83359250602084013567ffffffffffffffff811115611d2457600080fd5b611d3086828701611ca5565b9497909650939450505050565b60008060408385031215611d5057600080fd5b8235611d5b81611b31565b946020939093013593505050565b60008060008060008060c08789031215611d8257600080fd5b863595506020870135611d9481611b31565b945060408701359350606087013592506080870135915060a087013560ff81168114611dbf57600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611deb57600080fd5b8935985060208a0135611dfd81611b31565b975060408a0135611e0d81611b31565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e3857600080fd5b611e448d838e01611ca5565b909650945060c08c0135915080821115611e5d57600080fd5b50611e6a8c828d01611ca5565b915080935050809150509295985092959850929598565b60008060208385031215611e9457600080fd5b823567ffffffffffffffff811115611eab57600080fd5b611eb785828601611ca5565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ef75788810183015185820160c001528201611edb565b81811115611f0957600060c083870101525b50601f01601f1916830160c0019150611f2f905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f6357600080fd5b823567ffffffffffffffff80821115611f7b57600080fd5b611f8786838701611b46565b9350602091508185013581811115611f9e57600080fd5b85019050601f81018613611fb157600080fd5b8035611fbf611b6782611b0d565b81815260059190911b82018301908381019088831115611fde57600080fd5b928401925b8284101561200b5783358015158114611ffc5760008081fd5b82529284019290840190611fe3565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120715783516001600160a01b03168352928401929184019160010161204c565b50909695505050505050565b600181811c9082168061209157607f821691505b602082108114156120b257634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120d457607f831692505b60208084108214156120f457634e487b7160e01b86526022600452602486fd5b818015612108576001811461211957612146565b60ff19861689528489019650612146565b60008c81526020902060005b8681101561213e5781548b820152908501908301612125565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121875761218761215f565b500390565b6000821982111561219f5761219f61215f565b50019056fea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/EventAndErrors.sol b/contracts/EventAndErrors.sol index a9ee1f6..d64d114 100644 --- a/contracts/EventAndErrors.sol +++ b/contracts/EventAndErrors.sol @@ -1,6 +1,7 @@ // SPDX-License-Identifier: MIT pragma solidity 0.8.9; +// prettier-ignore interface EventAndErrors { /// ███ Events ████████████████████████████████████████████████████████████ @@ -25,16 +26,29 @@ interface EventAndErrors { uint256 depositID, uint256 amount ); - event LockReleased(address indexed buyer, bytes32 lockId); - event LockReturned(address indexed buyer, bytes32 lockId); - event FundsWithdrawn(address owner, uint256 amount); - event ReputationUpdated(address reputation); - event LockBlocksUpdated(uint256 blocks); - event ValidSignersUpdated(address[] signers); + event LockReleased( + address indexed buyer, + bytes32 lockId + ); + event LockReturned( + address indexed buyer, + bytes32 lockId + ); + event FundsWithdrawn( + address owner, + uint256 amount + ); + event RootUpdated( + address seller, + bytes32 merkleRoot + ); event AllowedERC20Updated( address indexed token, bool indexed state ); + event ReputationUpdated(address reputation); + event LockBlocksUpdated(uint256 blocks); + event ValidSignersUpdated(address[] signers); /// ███ Errors ████████████████████████████████████████████████████████████ diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 18865af..89156eb 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -194,40 +194,29 @@ contract P2PIX is msg.sender ); - mapLocks[lockID] = l; - d.remaining -= _amount; - - emit LockAdded( - _buyerAddress, - lockID, - l.depositID, - _amount - ); + _addLock(lockID, l, d); // Halt execution and output `lockID`. return lockID; } else { - uint256 userCredit = userRecord[ - _castAddrToKey(msg.sender) - ]; - uint256 spendLimit; - (spendLimit) = _limiter(userCredit); + if (l.amount <= 1e2) { + _addLock(lockID, l, d); + // Halt execution and output `lockID`. + return lockID; + } else { + uint256 userCredit = userRecord[ + _castAddrToKey(msg.sender) + ]; + uint256 spendLimit; + (spendLimit) = _limiter(userCredit); - if (l.amount > spendLimit || l.amount > 1e6) - revert AmountNotAllowed(); + if (l.amount > spendLimit || l.amount > 1e6) + revert AmountNotAllowed(); - mapLocks[lockID] = l; - d.remaining -= _amount; - - emit LockAdded( - _buyerAddress, - lockID, - l.depositID, - _amount - ); - - // Halt execution and output `lockID`. - return lockID; + _addLock(lockID, l, d); + // Halt execution and output `lockID`. + return lockID; + } } } @@ -417,6 +406,10 @@ contract P2PIX is sellerAllowList[ _castAddrToKey(addr) ] = merkleroot; + emit RootUpdated( + addr, + merkleroot + ); } else revert OnlySeller(); } @@ -587,6 +580,22 @@ contract P2PIX is revert DepositAlreadyExists(); } + function _addLock( + bytes32 _lockID, + DT.Lock memory _l, + DT.Deposit storage _d + ) internal { + mapLocks[_lockID] = _l; + _d.remaining -= _l.amount; + + emit LockAdded( + _l.buyerAddress, + _lockID, + _l.depositID, + _l.amount + ); + } + /// @notice Private view auxiliar logic that encodes/returns /// the `bytes32` identifier of an lock. /// @dev reverts on a not expired lock with the same ID passed diff --git a/deploys/localhost.json b/deploys/localhost.json index fed3bbb..36c432c 100644 --- a/deploys/localhost.json +++ b/deploys/localhost.json @@ -3,6 +3,6 @@ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" ], - "p2pix": "0x294003F602c321627152c6b7DED3EAb5bEa853Ee", - "token": "0x5BdEa33E2D14E3D4C66f9A7bbbc38Cd785D0C592" -} + "p2pix": "0x37c856F4d5bC2597da60f607b1335738468453F3", + "token": "0x294003F602c321627152c6b7DED3EAb5bEa853Ee" +} \ No newline at end of file diff --git a/package.json b/package.json index 9fe2ecb..0bf95a8 100644 --- a/package.json +++ b/package.json @@ -14,8 +14,8 @@ "compile": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat compile", "typechain": "cross-env TS_NODE_TRANSPILE_ONLY=true hardhat typechain", "test": "hardhat test", - "deploy1:localhost": "hardhat run scripts/1-deploy-p2pix.ts --network localhost", - "deploy2:localhost": "hardhat run scripts/2-deploy-mockToken.ts --network localhost", + "deploy1:localhost": "hardhat run scripts/1-deploy-mockToken.ts --network localhost", + "deploy2:localhost": "hardhat run scripts/2-deploy-p2pix.ts --network localhost", "coverage": "hardhat coverage --solcoverjs ./.solcover.js --temp artifacts --testfiles \"test/**/*.ts\" && yarn typechain", "lint": "yarn lint:sol && yarn lint:ts && yarn prettier:check", "lint:sol": "solhint --config ./.solhint.json --max-warnings 0 \"contracts/**/*.sol\"", @@ -49,6 +49,7 @@ "@typescript-eslint/eslint-plugin": "^5.42.0", "@typescript-eslint/parser": "^5.42.0", "chai": "^4.3.6", + "chalk": "4.x", "commitizen": "^4.2.5", "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", diff --git a/scripts/2-deploy-mockToken.ts b/scripts/1-deploy-mockToken.ts similarity index 100% rename from scripts/2-deploy-mockToken.ts rename to scripts/1-deploy-mockToken.ts diff --git a/scripts/1-deploy-p2pix.ts b/scripts/2-deploy-p2pix.ts similarity index 77% rename from scripts/1-deploy-p2pix.ts rename to scripts/2-deploy-p2pix.ts index b549127..32b8741 100644 --- a/scripts/1-deploy-p2pix.ts +++ b/scripts/2-deploy-p2pix.ts @@ -2,14 +2,8 @@ import "@nomiclabs/hardhat-ethers"; import "@nomiclabs/hardhat-etherscan"; import * as fs from "fs"; import { ethers, network } from "hardhat"; +import { Deploys } from "../test/utils/fixtures"; -// import hre from "hardhat"; - -interface Deploys { - signers: string[]; - p2pix: string; - token: string; -} let deploysJson: Deploys; @@ -28,8 +22,18 @@ const main = async () => { const [deployer] = await ethers.getSigners(); console.log(`Deploying contracts with ${deployer.address}`); + const Reputation = await ethers.getContractFactory("Reputation"); + const reputation = await Reputation.deploy(); + await reputation.deployed(); + const P2PIX = await ethers.getContractFactory("P2PIX"); - const p2pix = await P2PIX.deploy(2, deploysJson.signers); + const p2pix = await P2PIX.deploy( + 10, + deploysJson.signers, + reputation.address, + [deploysJson.token], + [true] + ); await p2pix.deployed(); deploysJson.p2pix = p2pix.address; diff --git a/src/types/EventAndErrors.ts b/src/types/EventAndErrors.ts index 2149584..0e4e70c 100644 --- a/src/types/EventAndErrors.ts +++ b/src/types/EventAndErrors.ts @@ -26,6 +26,7 @@ export interface EventAndErrorsInterface extends utils.Interface { "LockReleased(address,bytes32)": EventFragment; "LockReturned(address,bytes32)": EventFragment; "ReputationUpdated(address)": EventFragment; + "RootUpdated(address,bytes32)": EventFragment; "ValidSignersUpdated(address[])": EventFragment; }; @@ -39,6 +40,7 @@ export interface EventAndErrorsInterface extends utils.Interface { getEvent(nameOrSignatureOrTopic: "LockReleased"): EventFragment; getEvent(nameOrSignatureOrTopic: "LockReturned"): EventFragment; getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment; getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment; } @@ -159,6 +161,17 @@ export type ReputationUpdatedEvent = TypedEvent< export type ReputationUpdatedEventFilter = TypedEventFilter; +export interface RootUpdatedEventObject { + seller: string; + merkleRoot: string; +} +export type RootUpdatedEvent = TypedEvent< + [string, string], + RootUpdatedEventObject +>; + +export type RootUpdatedEventFilter = TypedEventFilter; + export interface ValidSignersUpdatedEventObject { signers: string[]; } @@ -288,6 +301,12 @@ export interface EventAndErrors extends BaseContract { ): ReputationUpdatedEventFilter; ReputationUpdated(reputation?: null): ReputationUpdatedEventFilter; + "RootUpdated(address,bytes32)"( + seller?: null, + merkleRoot?: null + ): RootUpdatedEventFilter; + RootUpdated(seller?: null, merkleRoot?: null): RootUpdatedEventFilter; + "ValidSignersUpdated(address[])"( signers?: null ): ValidSignersUpdatedEventFilter; diff --git a/src/types/factories/EventAndErrors__factory.ts b/src/types/factories/EventAndErrors__factory.ts index c8a443a..a25767b 100644 --- a/src/types/factories/EventAndErrors__factory.ts +++ b/src/types/factories/EventAndErrors__factory.ts @@ -293,6 +293,25 @@ const _abi = [ name: "ReputationUpdated", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "seller", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "RootUpdated", + type: "event", + }, { anonymous: false, inputs: [ diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index 308ed76..f9717b2 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -352,6 +352,25 @@ const _abi = [ name: "ReputationUpdated", type: "event", }, + { + anonymous: false, + inputs: [ + { + indexed: false, + internalType: "address", + name: "seller", + type: "address", + }, + { + indexed: false, + internalType: "bytes32", + name: "merkleRoot", + type: "bytes32", + }, + ], + name: "RootUpdated", + type: "event", + }, { anonymous: false, inputs: [ @@ -867,7 +886,7 @@ const _abi = [ ]; const _bytecode = - "0x60806040526001805560405162002825380380620028258339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121f580620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611af1565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bfe565b610599565b005b34801561020957600080fd5b506101fb610218366004611c3b565b61068a565b34801561022957600080fd5b50610282610238366004611af1565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c58565b61071e565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611d35565b6108fc565b34801561032957600080fd5b506101c8610338366004611c3b565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611af1565b6109bc565b34801561037457600080fd5b506101fb610a3a565b34801561038957600080fd5b506103ad610398366004611c3b565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611af1565b610ac4565b3480156103e957600080fd5b506101c86103f8366004611af1565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d81565b610b4c565b34801561043657600080fd5b506101fb610445366004611dad565b610b97565b34801561045657600080fd5b506101c8610465366004611e11565b610f65565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611ec5565b6112b8565b3480156104ce57600080fd5b506104e26104dd366004611af1565b611410565b6040516101d2959493929190611f07565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611af1565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f94565b6114da565b34801561058557600080fd5b506101fb610594366004611c3b565b6115b2565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61205e565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612074565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b600080546001600160a01b0319166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661075957604051630abc194760e11b815260040160405180910390fd5b610761611639565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107d6611689565b83156107e6576107e63385610b4c565b6000838152600760209081526040909120825181558183015180518493610814926001850192910190611a58565b5060408201516002820180546001600160a01b039283166001600160a01b03199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108919080546001019055565b61089d8233308a6116b4565b6108a660018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b610904611689565b61090d8361174b565b61091782826112b8565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109475761094784610ac4565b600381015481546000835560028301546001600160a01b03928316926109709184911683611788565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109b760018055565b505050565b6000546001600160a01b03163314610a055760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a835760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610a8e3382611814565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610acd8161174b565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610b7e57600c9190911b611000600160ac1b03166000908152600a6020526040902055565b6040516342e8fb9360e11b815260040160405180910390fd5b610b9f611689565b6000868152600860205260409020600381015443101580610bc257506002810154155b15610be0576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c1092600186019290918b91016120fc565b604051602081830303815290604052805190602001209050600081604051602001610c6791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610cb557604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d299060019060a0016020604051602081039080840390855afa158015610d0d573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610d5b57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610d82916121b9565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e3d576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610df39084906121d0565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e3291906121d0565b90915550610e839050565b86600201548760010154610e5191906121d0565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e7d9084906121d0565b90915550505b6004870154610e9d9083906001600160a01b031683611788565b600187015415610f095760058701546001600160a01b038d8116911614610efa576005870154600180890154610ee29285926001600160a01b0390911691901c611788565b610ef5828d60018a60010154901c611788565b610f09565b610f09828d8960010154611788565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610f5d60018055565b505050505050565b6000610f6f611689565b610f7983836112b8565b60008a81526007602052604090206003810154600160a01b900460ff16610fb357604051635972996f60e11b815260040160405180910390fd5b8054871115610fd5576040516308aeed0f60e21b815260040160405180910390fd5b610fe08b888c61186f565b915060006040518060e001604052808d81526020018a81526020018981526020016004544361100f91906121d0565b81526001600160a01b03808e1660208301528c1660408201523360609091015290508515611150576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110669088908890336118f3565b60008381526008602090815260408083208451815591840151600183015583015160028201556060830151600382015560808301516004820180546001600160a01b039283166001600160a01b03199182161790915560a085015160058401805491841691831691909117905560c0850151600690930180549390921692169190911790558254899184916110fc9084906121b9565b9091555050805160408051918252602082018a905284916001600160a01b038e16917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a350506112a2565b611000600160ac1b0333600c1b166000908152600560205260408120549061117782611925565b905080836040015111806111915750620f42408360400151115b156111af57604051630e0c7c2360e11b815260040160405180910390fd5b60008581526008602090815260408083208651815591860151600183015585015160028201556060850151600382015560808501516004820180546001600160a01b039283166001600160a01b03199182161790915560a087015160058401805491841691831691909117905560c08701516006909301805493909216921691909117905584548b9186916112459084906121b9565b92505081905550848d6001600160a01b03167f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea85600001518d604051611295929190918252602082015260400190565b60405180910390a3505050505b6112ab60018055565b9998505050505050505050565b6000815b808210156113f4576000600860008686868181106112dc576112dc61205e565b90506020020135815260200190815260200160002090506112fc816119e1565b60028101548154600090815260076020526040812080549091906113219084906121d0565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161137557600082815260056020526040902060649055611387565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106113c8576113c861205e565b905060200201356040516113de91815260200190565b60405180910390a28460010194505050506112bc565b8082101561140a5763dfb035c96000526004601cfd5b50505050565b60076020526000908152604090208054600182018054919291611432906120c1565b80601f016020809104026020016040519081016040528092919081815260200182805461145e906120c1565b80156114ab5780601f10611480576101008083540402835291602001916114ab565b820191906000526020600020905b81548152906001019060200180831161148e57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146115235760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806115385763df9578836000526004601cfd5b8151811461154e5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610f5d578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061155d565b6000546001600160a01b031633146115fb5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061164460035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156116865760405163c44bd76560e01b815260040160405180910390fd5b90565b600154600214156116ad5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806117445760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611785576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061140a5760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109b75760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106118ec5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6119088484846001600160a01b038516611a14565b61140a57604051631dc23a5f60e11b815260040160405180910390fd5b600080634d2b179160e01b8360405160240161194391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119d85763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119f657506002810154155b156117855760405163d0404f8560e01b815260040160405180910390fd5b60008315611a50578360051b8501855b803580851160051b94855260209485185260406000209301818110611a4857611a4d565b611a24565b50505b501492915050565b828054611a64906120c1565b90600052602060002090601f016020900481019282611a865760008555611acc565b82601f10611a9f57805160ff1916838001178555611acc565b82800160010185558215611acc579182015b82811115611acc578251825591602001919060010190611ab1565b50611ad8929150611adc565b5090565b5b80821115611ad85760008155600101611add565b600060208284031215611b0357600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b4957611b49611b0a565b604052919050565b600067ffffffffffffffff821115611b6b57611b6b611b0a565b5060051b60200190565b6001600160a01b038116811461178557600080fd5b600082601f830112611b9b57600080fd5b81356020611bb0611bab83611b51565b611b20565b82815260059290921b84018101918181019086841115611bcf57600080fd5b8286015b84811015611bf3578035611be681611b75565b8352918301918301611bd3565b509695505050505050565b600060208284031215611c1057600080fd5b813567ffffffffffffffff811115611c2757600080fd5b611c3384828501611b8a565b949350505050565b600060208284031215611c4d57600080fd5b81356118ec81611b75565b600080600080600060808688031215611c7057600080fd5b8535611c7b81611b75565b945060208601359350604086013567ffffffffffffffff80821115611c9f57600080fd5b818801915088601f830112611cb357600080fd5b813581811115611cc257600080fd5b896020828501011115611cd457600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cfb57600080fd5b50813567ffffffffffffffff811115611d1357600080fd5b6020830191508360208260051b8501011115611d2e57600080fd5b9250929050565b600080600060408486031215611d4a57600080fd5b83359250602084013567ffffffffffffffff811115611d6857600080fd5b611d7486828701611ce9565b9497909650939450505050565b60008060408385031215611d9457600080fd5b8235611d9f81611b75565b946020939093013593505050565b60008060008060008060c08789031215611dc657600080fd5b863595506020870135611dd881611b75565b945060408701359350606087013592506080870135915060a087013560ff81168114611e0357600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611e2f57600080fd5b8935985060208a0135611e4181611b75565b975060408a0135611e5181611b75565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e7c57600080fd5b611e888d838e01611ce9565b909650945060c08c0135915080821115611ea157600080fd5b50611eae8c828d01611ce9565b915080935050809150509295985092959850929598565b60008060208385031215611ed857600080fd5b823567ffffffffffffffff811115611eef57600080fd5b611efb85828601611ce9565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611f3b5788810183015185820160c001528201611f1f565b81811115611f4d57600060c083870101525b50601f01601f1916830160c0019150611f73905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611fa757600080fd5b823567ffffffffffffffff80821115611fbf57600080fd5b611fcb86838701611b8a565b9350602091508185013581811115611fe257600080fd5b85019050601f81018613611ff557600080fd5b8035612003611bab82611b51565b81815260059190911b8201830190838101908883111561202257600080fd5b928401925b8284101561204f57833580151581146120405760008081fd5b82529284019290840190612027565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120b55783516001600160a01b031683529284019291840191600101612090565b50909695505050505050565b600181811c908216806120d557607f821691505b602082108114156120f657634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c91508083168061211857607f831692505b602080841082141561213857634e487b7160e01b86526022600452602486fd5b81801561214c576001811461215d5761218a565b60ff1986168952848901965061218a565b60008c81526020902060005b868110156121825781548b820152908501908301612169565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121cb576121cb6121a3565b500390565b600082198211156121e3576121e36121a3565b50019056fea164736f6c6343000809000a"; + "0x608060405260018055604051620027e1380380620027e18339810160408190526200002a916200049d565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000620565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005bb565b60200260200101516200038760201b60201c565b6000908152600660205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005d1565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083016020830282015b8083146200037f578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b611000600160ac1b031690565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003d857620003d862000397565b604052919050565b60006001600160401b03821115620003fc57620003fc62000397565b5060051b60200190565b6001600160a01b03811681146200041c57600080fd5b50565b600082601f8301126200043157600080fd5b815160206200044a6200044483620003e0565b620003ad565b82815260059290921b840181019181810190868411156200046a57600080fd5b8286015b8481101562000492578051620004848162000406565b83529183019183016200046e565b509695505050505050565b600080600080600060a08688031215620004b657600080fd5b8551602080880151919650906001600160401b0380821115620004d857600080fd5b620004e68a838b016200041f565b965060408901519150620004fa8262000406565b6060890151919550808211156200051057600080fd5b6200051e8a838b016200041f565b945060808901519150808211156200053557600080fd5b508701601f810189136200054857600080fd5b8051620005596200044482620003e0565b81815260059190911b8201830190838101908b8311156200057957600080fd5b928401925b82841015620005a95783518015158114620005995760008081fd5b825292840192908401906200057e565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b81811015620006145783516001600160a01b031683529284019291840191600101620005ed565b50909695505050505050565b6121b180620006306000396000f3fe60806040526004361061018f5760003560e01c806377cd38a4116100d65780638e2a3d361161007f578063c52164c611610059578063c52164c614610539578063d6e8b97314610559578063f7d0e04b1461057957600080fd5b80638e2a3d36146104c25780639872dbfe146104f357806398a268711461050957600080fd5b80638652b37e116100b05780638652b37e1461044a5780638da5cb5b1461046a5780638e2749d6146104a257600080fd5b806377cd38a4146103dd5780637f94f65d1461040a5780638642b5c31461042a57600080fd5b806336317972116101385780635fd8c710116101125780635fd8c7101461036857806369cc6af41461037d57806372fada5c146103bd57600080fd5b806336317972146102fd5780634b2ae9801461031d578063574983c81461034857600080fd5b806316d722401161016957806316d722401461021d57806329cc7d10146102c65780632dfdf0b5146102e657600080fd5b8063049373201461019b5780630d2a2d44146101db57806313af4035146101fd57600080fd5b3661019657005b600080fd5b3480156101a757600080fd5b506101c86101b6366004611aad565b60056020526000908152604090205481565b6040519081526020015b60405180910390f35b3480156101e757600080fd5b506101fb6101f6366004611bba565b610599565b005b34801561020957600080fd5b506101fb610218366004611bf7565b61068a565b34801561022957600080fd5b50610282610238366004611aad565b600860205260009081526040902080546001820154600283015460038401546004850154600586015460069096015494959394929391926001600160a01b03918216928216911687565b6040805197885260208801969096529486019390935260608501919091526001600160a01b03908116608085015290811660a08401521660c082015260e0016101d2565b3480156102d257600080fd5b506101c86102e1366004611c14565b61072b565b3480156102f257600080fd5b506003546101c89081565b34801561030957600080fd5b506101fb610318366004611cf1565b610916565b34801561032957600080fd5b506101c8610338366004611bf7565b600c1b611000600160ac1b031690565b34801561035457600080fd5b506101fb610363366004611aad565b6109d6565b34801561037457600080fd5b506101fb610a54565b34801561038957600080fd5b506103ad610398366004611bf7565b600b6020526000908152604090205460ff1681565b60405190151581526020016101d2565b3480156103c957600080fd5b506101fb6103d8366004611aad565b610ade565b3480156103e957600080fd5b506101c86103f8366004611aad565b600a6020526000908152604090205481565b34801561041657600080fd5b506101fb610425366004611d3d565b610b66565b34801561043657600080fd5b506101fb610445366004611d69565b610bf9565b34801561045657600080fd5b506101c8610465366004611dcd565b610fc7565b34801561047657600080fd5b5060005461048a906001600160a01b031681565b6040516001600160a01b0390911681526020016101d2565b3480156104ae57600080fd5b506101fb6104bd366004611e81565b611176565b3480156104ce57600080fd5b506104e26104dd366004611aad565b6112ce565b6040516101d2959493929190611ec3565b3480156104ff57600080fd5b506101c860045481565b34801561051557600080fd5b506103ad610524366004611aad565b60066020526000908152604090205460ff1681565b34801561054557600080fd5b5060025461048a906001600160a01b031681565b34801561056557600080fd5b506101fb610574366004611f50565b611398565b34801561058557600080fd5b506101fb610594366004611bf7565b611470565b6000546001600160a01b031633146105e75760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b80516000905b8082101561064e57600061062784848151811061060c5761060c61201a565b6020026020010151611000600160ac1b03600c9190911b1690565b6000908152600660205260409020805460ff191660019081179091559290920191506105ed565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d78160405161067f9190612030565b60405180910390a150565b6000546001600160a01b031633146106d35760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0383169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b6001600160a01b0385166000908152600b6020526040812054869060ff1661076657604051630abc194760e11b815260040160405180910390fd5b61076e6114f7565b915060006040518060a0016040528088815260200187878080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050908252503360208201526001600160a01b038a166040820152600160609091015290506107e3611547565b83156107f3576107f33385610b66565b6000838152600760209081526040909120825181558183015180518493610821926001850192910190611a14565b5060408201516002820180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199091161790556060830151600392830180546080909501511515600160a01b027fffffffffffffffffffffff0000000000000000000000000000000000000000009095169190921617929092179091556108ab9080546001019055565b6108b78233308a611572565b6108c060018055565b604080518481526001600160a01b038a16602082015290810188905233907f25ac57b911b0f66b64c294827f539545fbc3ddd002cafab117776274f3241e4c9060600160405180910390a2505095945050505050565b61091e611547565b61092783611609565b6109318282611176565b60008381526007602052604090206003810154600160a01b900460ff161515600114156109615761096184610ade565b600381015481546000835560028301546001600160a01b039283169261098a9184911683611646565b604080518781526020810183905233917f7719804546c0185709e60c90d164447ff251a5ba29af0216faa921350f6bebf7910160405180910390a25050506109d160018055565b505050565b6000546001600160a01b03163314610a1f5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b806004557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161067f91815260200190565b6000546001600160a01b03163314610a9d5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b47610aa833826116d2565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d910161067f565b610ae781611609565b6000818152600760209081526040918290206003810180547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556002015491518381526001600160a01b03909216917fb4d98b272597e828d9b172c0d44390d5b267040e918088eac8a0a0fadcb81c70910160405180910390a250565b6001600160a01b038216331415610be057611000600160ac1b03600c83901b166000908152600a602090815260409182902083905581516001600160a01b038516815290810183905281517f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632929181900390910190a15050565b6040516342e8fb9360e11b815260040160405180910390fd5b610c01611547565b6000868152600860205260409020600381015443101580610c2457506002810154155b15610c42576040516331da482760e11b815260040160405180910390fd5b8054600090815260076020908152604080832060028501549151909392610c7292600186019290918b91016120b8565b604051602081830303815290604052805190602001209050600081604051602001610cc991907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f1981840301815291815281516020928301206000858152600990935291205490915060ff16151560011415610d1757604051637a48537560e11b815260040160405180910390fd5b6040805160008082526020820180845284905260ff8816928201929092526060810189905260808101889052610d8b9060019060a0016020604051602081039080840390855afa158015610d6f573d6000803e3d6000fd5b5050604051601f190151600c1b611000600160ac1b0316919050565b60008181526006602052604090205490915060ff16610dbd57604051632057875960e21b815260040160405180910390fd5b6003840154600186015460028701546001600160a01b0390921691600091610de491612175565b60006002890181905560038901819055868152600960205260409020805460ff191660011790556006880154909150336001600160a01b0390911614610e9f576001870154611000600160ac1b0333600c1b1660009081526005602052604081208054909190610e5590849061218c565b909155505060028701546006880154600590600090600c1b611000600160ac1b031681526020019081526020016000206000828254610e94919061218c565b90915550610ee59050565b86600201548760010154610eb3919061218c565b611000600160ac1b0333600c1b1660009081526005602052604081208054909190610edf90849061218c565b90915550505b6004870154610eff9083906001600160a01b031683611646565b600187015415610f6b5760058701546001600160a01b038d8116911614610f5c576005870154600180890154610f449285926001600160a01b0390911691901c611646565b610f57828d60018a60010154901c611646565b610f6b565b610f6b828d8960010154611646565b60048701546040518e81526001600160a01b03909116907f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d9060200160405180910390a250505050505050610fbf60018055565b505050505050565b6000610fd1611547565b610fdb8383611176565b60008a81526007602052604090206003810154600160a01b900460ff1661101557604051635972996f60e11b815260040160405180910390fd5b8054871115611037576040516308aeed0f60e21b815260040160405180910390fd5b6110428b888c61172d565b915060006040518060e001604052808d81526020018a815260200189815260200160045443611071919061218c565b81526001600160a01b03808e1660208301528c16604082015233606090910152905085156110da576002820154600c1b611000600160ac1b03166000908152600a60205260409020546110c89088908890336117b1565b6110d38382846117e3565b5050611160565b60648160400151116110f1576110d38382846117e3565b611000600160ac1b0333600c1b1660009081526005602052604081205490611118826118e1565b905080836040015111806111325750620f42408360400151115b1561115057604051630e0c7c2360e11b815260040160405180910390fd5b61115b8584866117e3565b505050505b61116960018055565b9998505050505050505050565b6000815b808210156112b25760006008600086868681811061119a5761119a61201a565b90506020020135815260200190815260200160002090506111ba8161199d565b60028101548154600090815260076020526040812080549091906111df90849061218c565b90915550506000600282018190556006820154600c1b611000600160ac1b031660008181526005602052604090205490915060011c6064811161123357600082815260056020526040902060649055611245565b60008281526005602052604090208190555b60048301546001600160a01b03167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff8888888181106112865761128661201a565b9050602002013560405161129c91815260200190565b60405180910390a284600101945050505061117a565b808210156112c85763dfb035c96000526004601cfd5b50505050565b600760205260009081526040902080546001820180549192916112f09061207d565b80601f016020809104026020016040519081016040528092919081815260200182805461131c9061207d565b80156113695780601f1061133e57610100808354040283529160200191611369565b820191906000526020600020905b81548152906001019060200180831161134c57829003601f168201915b50505050600283015460039093015491926001600160a01b03908116929081169150600160a01b900460ff1685565b6000546001600160a01b031633146113e15760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b8151806113f65763df9578836000526004601cfd5b8151811461140c5763ff633a386000526004601cfd5b60208301602083016020830282015b808314610fbf578251600052600b60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915061141b565b6000546001600160a01b031633146114b95760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064016105de565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200161067f565b600061150260035490565b600081815260076020526040902060030154909150600160a01b900460ff161515600114156115445760405163c44bd76560e01b815260040160405180910390fd5b90565b6001546002141561156b5760405163558a1e0360e11b815260040160405180910390fd5b6002600155565b60006040516323b872dd60e01b6000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806116025760405162461bcd60e51b815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016105de565b5050505050565b6000818152600760205260409020600201546001600160a01b03163314611643576040516342e8fb9360e11b815260040160405180910390fd5b50565b600060405163a9059cbb60e01b6000528360045282602452602060006044600080895af13d15601f3d11600160005114161716915060006060528060405250806112c85760405162461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016105de565b600080600080600085875af19050806109d15760405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016105de565b6040805160208101859052908101839052606082811b6bffffffffffffffffffffffff191690820152600090607401604051602081830303815290604052805190602001209050436008600083815260200190815260200160002060030154106117aa5760405163d0404f8560e01b815260040160405180910390fd5b9392505050565b6117c68484846001600160a01b0385166119d0565b6112c857604051631dc23a5f60e11b815260040160405180910390fd5b600083815260086020908152604080832085518155918501516001830155840151600282018190556060850151600383015560808501516004830180546001600160a01b0392831673ffffffffffffffffffffffffffffffffffffffff199182161790915560a087015160058501805491841691831691909117905560c08701516006909401805494909216931692909217909155825490918391611889908490612175565b9091555050608082015182516040808501518151928352602083015285926001600160a01b0316917f2a28b2ae47b0bd4b104e7cd29b1dfa72846af8c4cfdc009da2ae29db68cb67ea910160405180910390a3505050565b600080634d2b179160e01b836040516024016118ff91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826119945763e10bf1cc6000526004601cfd5b50505050919050565b4381600301541015806119b257506002810154155b156116435760405163d0404f8560e01b815260040160405180910390fd5b60008315611a0c578360051b8501855b803580851160051b94855260209485185260406000209301818110611a0457611a09565b6119e0565b50505b501492915050565b828054611a209061207d565b90600052602060002090601f016020900481019282611a425760008555611a88565b82601f10611a5b57805160ff1916838001178555611a88565b82800160010185558215611a88579182015b82811115611a88578251825591602001919060010190611a6d565b50611a94929150611a98565b5090565b5b80821115611a945760008155600101611a99565b600060208284031215611abf57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611b0557611b05611ac6565b604052919050565b600067ffffffffffffffff821115611b2757611b27611ac6565b5060051b60200190565b6001600160a01b038116811461164357600080fd5b600082601f830112611b5757600080fd5b81356020611b6c611b6783611b0d565b611adc565b82815260059290921b84018101918181019086841115611b8b57600080fd5b8286015b84811015611baf578035611ba281611b31565b8352918301918301611b8f565b509695505050505050565b600060208284031215611bcc57600080fd5b813567ffffffffffffffff811115611be357600080fd5b611bef84828501611b46565b949350505050565b600060208284031215611c0957600080fd5b81356117aa81611b31565b600080600080600060808688031215611c2c57600080fd5b8535611c3781611b31565b945060208601359350604086013567ffffffffffffffff80821115611c5b57600080fd5b818801915088601f830112611c6f57600080fd5b813581811115611c7e57600080fd5b896020828501011115611c9057600080fd5b96999598505060200195606001359392505050565b60008083601f840112611cb757600080fd5b50813567ffffffffffffffff811115611ccf57600080fd5b6020830191508360208260051b8501011115611cea57600080fd5b9250929050565b600080600060408486031215611d0657600080fd5b83359250602084013567ffffffffffffffff811115611d2457600080fd5b611d3086828701611ca5565b9497909650939450505050565b60008060408385031215611d5057600080fd5b8235611d5b81611b31565b946020939093013593505050565b60008060008060008060c08789031215611d8257600080fd5b863595506020870135611d9481611b31565b945060408701359350606087013592506080870135915060a087013560ff81168114611dbf57600080fd5b809150509295509295509295565b600080600080600080600080600060e08a8c031215611deb57600080fd5b8935985060208a0135611dfd81611b31565b975060408a0135611e0d81611b31565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff80821115611e3857600080fd5b611e448d838e01611ca5565b909650945060c08c0135915080821115611e5d57600080fd5b50611e6a8c828d01611ca5565b915080935050809150509295985092959850929598565b60008060208385031215611e9457600080fd5b823567ffffffffffffffff811115611eab57600080fd5b611eb785828601611ca5565b90969095509350505050565b8581526000602060a08184015286518060a085015260005b81811015611ef75788810183015185820160c001528201611edb565b81811115611f0957600060c083870101525b50601f01601f1916830160c0019150611f2f905060408301866001600160a01b03169052565b6001600160a01b038416606083015282151560808301529695505050505050565b60008060408385031215611f6357600080fd5b823567ffffffffffffffff80821115611f7b57600080fd5b611f8786838701611b46565b9350602091508185013581811115611f9e57600080fd5b85019050601f81018613611fb157600080fd5b8035611fbf611b6782611b0d565b81815260059190911b82018301908381019088831115611fde57600080fd5b928401925b8284101561200b5783358015158114611ffc5760008081fd5b82529284019290840190611fe3565b80955050505050509250929050565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156120715783516001600160a01b03168352928401929184019160010161204c565b50909695505050505050565b600181811c9082168061209157607f821691505b602082108114156120b257634e487b7160e01b600052602260045260246000fd5b50919050565b600080855481600182811c9150808316806120d457607f831692505b60208084108214156120f457634e487b7160e01b86526022600452602486fd5b818015612108576001811461211957612146565b60ff19861689528489019650612146565b60008c81526020902060005b8681101561213e5781548b820152908501908301612125565b505084890196505b5098855250505050938401929092525050604001919050565b634e487b7160e01b600052601160045260246000fd5b6000828210156121875761218761215f565b500390565b6000821982111561219f5761219f61215f565b50019056fea164736f6c6343000809000a"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index 10c65c3..b86b025 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -276,6 +276,7 @@ export interface P2PIXInterface extends utils.Interface { "LockReturned(address,bytes32)": EventFragment; "OwnerUpdated(address,address)": EventFragment; "ReputationUpdated(address)": EventFragment; + "RootUpdated(address,bytes32)": EventFragment; "ValidSignersUpdated(address[])": EventFragment; }; @@ -290,6 +291,7 @@ export interface P2PIXInterface extends utils.Interface { getEvent(nameOrSignatureOrTopic: "LockReturned"): EventFragment; getEvent(nameOrSignatureOrTopic: "OwnerUpdated"): EventFragment; getEvent(nameOrSignatureOrTopic: "ReputationUpdated"): EventFragment; + getEvent(nameOrSignatureOrTopic: "RootUpdated"): EventFragment; getEvent(nameOrSignatureOrTopic: "ValidSignersUpdated"): EventFragment; } @@ -421,6 +423,17 @@ export type ReputationUpdatedEvent = TypedEvent< export type ReputationUpdatedEventFilter = TypedEventFilter; +export interface RootUpdatedEventObject { + seller: string; + merkleRoot: string; +} +export type RootUpdatedEvent = TypedEvent< + [string, string], + RootUpdatedEventObject +>; + +export type RootUpdatedEventFilter = TypedEventFilter; + export interface ValidSignersUpdatedEventObject { signers: string[]; } @@ -985,6 +998,12 @@ export interface P2PIX extends BaseContract { ): ReputationUpdatedEventFilter; ReputationUpdated(reputation?: null): ReputationUpdatedEventFilter; + "RootUpdated(address,bytes32)"( + seller?: null, + merkleRoot?: null + ): RootUpdatedEventFilter; + RootUpdated(seller?: null, merkleRoot?: null): RootUpdatedEventFilter; + "ValidSignersUpdated(address[])"( signers?: null ): ValidSignersUpdatedEventFilter; diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index 9e1d4de..b53b3f4 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -2,13 +2,13 @@ import "@nomicfoundation/hardhat-chai-matchers"; import { loadFixture } from "@nomicfoundation/hardhat-network-helpers"; import { SignerWithAddress } from "@nomiclabs/hardhat-ethers/signers"; import { expect } from "chai"; -import { BigNumber, Wallet } from "ethers"; +import { BigNumber, ContractReceipt, Wallet } from "ethers"; import { ethers, network, /* , tracer */ } from "hardhat"; -import keccak256 from "keccak256"; +// import keccak256 from "keccak256"; import { MockToken, P2PIX, Reputation } from "../src/types"; import { P2PixErrors } from "./utils/errors"; @@ -595,7 +595,7 @@ describe("P2PIX", () => { P2PixErrors.AddressDenied, ); }); - it ("should revert if msg.sender does not have enough credit in his spend limit", async () => { + it("should revert if msg.sender does not have enough credit in his spend limit", async () => { await erc20.approve(p2pix.address, price); await p2pix.deposit( erc20.address, @@ -620,9 +620,246 @@ describe("P2PIX", () => { P2PixErrors.AmountNotAllowed, ); }); - // it ("should create a lock, update storage and emit events via the allowlist path") - // it ("should create a lock, update storage and emit events via the reputation path") - // it ("should create multiple locks") - EDGE CASE TEST + it("should create a lock, update storage and emit events via the allowlist path", async () => { + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + const tx = await p2pix + .connect(acc01) + .lock( + 0, + acc02.address, + acc03.address, + 0, + price, + proof, + [], + ); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, price, acc02.address], + ); + const storage: Lock = await p2pix.callStatic.mapLocks( + lockID, + ); + + const rc: ContractReceipt = await tx.wait(); + const expiration = rc.blockNumber + 10; + + expect(tx).to.be.ok; + expect(storage.depositID).to.eq(0); + expect(storage.relayerPremium).to.eq( + ethers.constants.Zero, + ); + expect(storage.amount).to.eq(price); + expect(storage.expirationBlock).to.eq(expiration); + expect(storage.buyerAddress).to.eq(acc02.address); + expect(storage.relayerTarget).to.eq(acc03.address); + expect(storage.relayerAddress).to.eq(acc01.address); + await expect(tx) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + lockID, + storage.depositID, + storage.amount, + ); + }); + it("should create a lock, update storage and emit events via the reputation path", async () => { + const root = ethers.constants.HashZero; + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + root, + ); + const tx = 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 storage: Lock = await p2pix.callStatic.mapLocks( + lockID, + ); + + const rc: ContractReceipt = await tx.wait(); + const expiration = rc.blockNumber + 10; + + expect(tx).to.be.ok; + expect(storage.depositID).to.eq(0); + expect(storage.relayerPremium).to.eq( + ethers.constants.Zero, + ); + expect(storage.amount).to.eq( + ethers.BigNumber.from(100), + ); + expect(storage.expirationBlock).to.eq(expiration); + expect(storage.buyerAddress).to.eq(acc02.address); + expect(storage.relayerTarget).to.eq(acc03.address); + expect(storage.relayerAddress).to.eq(acc01.address); + await expect(tx) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + lockID, + storage.depositID, + storage.amount, + ); + }); + // edge case test + it("should create multiple locks", async () => { + const newPrice = price.div(ethers.BigNumber.from(2)); + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + const tx1 = await p2pix + .connect(acc01) + .lock( + 0, + acc02.address, + acc03.address, + 0, + newPrice, + proof, + [], + ); + const lockID1 = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, newPrice, acc02.address], + ); + const storage1: Lock = await p2pix.callStatic.mapLocks( + lockID1, + ); + + const rc1: ContractReceipt = await tx1.wait(); + const expiration1 = rc1.blockNumber + 10; + + const tx2 = await p2pix + .connect(acc01) + .lock( + 0, + acc02.address, + acc03.address, + 0, + 100, + [], + [], + ); + const lockID2 = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc02.address], + ); + const storage2: Lock = await p2pix.callStatic.mapLocks( + lockID2, + ); + + const rc2: ContractReceipt = await tx2.wait(); + const expiration2 = rc2.blockNumber + 10; + + const tx3 = await p2pix + .connect(acc03) + .lock( + 0, + acc03.address, + acc03.address, + 0, + 100, + [], + [], + ); + const lockID3 = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 100, acc03.address], + ); + const storage3: Lock = await p2pix.callStatic.mapLocks( + lockID3, + ); + + const rc3: ContractReceipt = await tx3.wait(); + const expiration3 = rc3.blockNumber + 10; + + expect(tx1).to.be.ok; + expect(tx2).to.be.ok; + expect(tx3).to.be.ok; + + expect(0) + .to.eq(storage1.depositID) + .and.to.eq(storage2.depositID) + .and.to.eq(storage3.depositID); + + expect(ethers.constants.Zero) + .to.eq(storage1.relayerPremium) + .and.to.eq(storage2.relayerPremium) + .and.to.eq(storage3.relayerPremium); + + expect(storage1.amount).to.eq(newPrice); + expect(ethers.BigNumber.from(100)) + .to.eq(storage2.amount) + .and.to.eq(storage3.amount); + + expect(storage1.expirationBlock).to.eq(expiration1); + expect(storage2.expirationBlock).to.eq(expiration2); + expect(storage3.expirationBlock).to.eq(expiration3); + + expect(acc02.address) + .to.eq(storage1.buyerAddress) + .and.to.eq(storage2.buyerAddress); + expect(storage3.buyerAddress).to.eq(acc03.address); + + expect(acc03.address) + .to.eq(storage1.relayerTarget) + .and.to.eq(storage2.relayerTarget) + .and.to.eq(storage3.relayerTarget); + + expect(acc01.address) + .to.eq(storage1.relayerAddress) + .and.to.eq(storage2.relayerAddress); + expect(storage3.relayerAddress).to.eq(acc03.address); + + await expect(tx1) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + lockID1, + storage1.depositID, + storage1.amount, + ); + await expect(tx2) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + lockID2, + storage2.depositID, + storage2.amount, + ); + await expect(tx3) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc03.address, + lockID3, + storage3.depositID, + storage3.amount, + ); + }); }); describe("Cancel Deposit", async () => { it("should revert if the msg.sender isn't the deposit's seller", async () => { @@ -634,7 +871,10 @@ describe("P2PIX", () => { merkleRoot, ); const fail = p2pix.connect(acc01).cancelDeposit(0); - await expect(fail).to.be.revertedWithCustomError(p2pix, P2PixErrors.OnlySeller); + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.OnlySeller, + ); }); it("should cancel deposit, update storage and emit events", async () => { await erc20.approve(p2pix.address, price); @@ -644,12 +884,16 @@ describe("P2PIX", () => { "pixTarget", merkleRoot, ); - const state1:Deposit = await p2pix.callStatic.mapDeposits(0); + const state1: Deposit = + await p2pix.callStatic.mapDeposits(0); const tx = await p2pix.cancelDeposit(0); - const state2:Deposit = await p2pix.callStatic.mapDeposits(0); + const state2: Deposit = + await p2pix.callStatic.mapDeposits(0); expect(tx).to.be.ok; - await expect(tx).to.emit(p2pix, "DepositClosed").withArgs(owner.address, 0); + await expect(tx) + .to.emit(p2pix, "DepositClosed") + .withArgs(owner.address, 0); expect(state1.valid).to.be.true; expect(state2.valid).to.be.false; }); @@ -675,22 +919,34 @@ describe("P2PIX", () => { "pixTarget", ethers.constants.HashZero, ); - const oldState1:Deposit = await p2pix.callStatic.mapDeposits(0); - const oldState2:Deposit = await p2pix.callStatic.mapDeposits(1); - const oldState3:Deposit = await p2pix.callStatic.mapDeposits(2); + const oldState1: Deposit = + await p2pix.callStatic.mapDeposits(0); + const oldState2: Deposit = + await p2pix.callStatic.mapDeposits(1); + const oldState3: Deposit = + await p2pix.callStatic.mapDeposits(2); const tx1 = await p2pix.cancelDeposit(0); const tx2 = await p2pix.cancelDeposit(1); const tx3 = await p2pix.cancelDeposit(2); - const newState1:Deposit = await p2pix.callStatic.mapDeposits(0); - const newState2:Deposit = await p2pix.callStatic.mapDeposits(1); - const newState3:Deposit = await p2pix.callStatic.mapDeposits(2); + const newState1: Deposit = + await p2pix.callStatic.mapDeposits(0); + const newState2: Deposit = + await p2pix.callStatic.mapDeposits(1); + const newState3: Deposit = + await p2pix.callStatic.mapDeposits(2); expect(tx1).to.be.ok; expect(tx2).to.be.ok; expect(tx3).to.be.ok; - await expect(tx1).to.emit(p2pix, "DepositClosed").withArgs(owner.address, 0); - await expect(tx2).to.emit(p2pix, "DepositClosed").withArgs(owner.address, 1); - await expect(tx3).to.emit(p2pix, "DepositClosed").withArgs(owner.address, 2); + await expect(tx1) + .to.emit(p2pix, "DepositClosed") + .withArgs(owner.address, 0); + await expect(tx2) + .to.emit(p2pix, "DepositClosed") + .withArgs(owner.address, 1); + await expect(tx3) + .to.emit(p2pix, "DepositClosed") + .withArgs(owner.address, 2); expect(oldState1.valid).to.be.true; expect(oldState2.valid).to.be.true; expect(oldState3.valid).to.be.true; @@ -712,19 +968,104 @@ describe("P2PIX", () => { // )} }); describe("Unexpire Locks", async () => { - // it("should revert if lock isn't expired") - // it("should unlock expired locks, update storage and emit events") - // CHECK FOR userRecord STORAGE UPDATE - // test method through lock fx - // test method through withdraw fx + it("should revert if lock isn't expired", async () => { + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + await p2pix + .connect(acc02) + .lock(0, acc02.address, acc03.address, 0, 1, [], []); + const lockID = ethers.utils.solidityKeccak256( + ["uint256", "uint256", "address"], + [0, 1, acc02.address], + ); + const fail = p2pix.unlockExpired([lockID]); + + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.NotExpired, + ); + }); + it("should unlock expired locks, update storage and emit events", async () => { + // CHECK FOR userRecord STORAGE UPDATE + // test method through lock fx + // test method through withdraw fx + }); }); describe("Seller Withdraw", async () => { - // it("should revert if the msg.sender isn't the deposit's seller") - // it -> withdraw remaining funds from deposit + it("should revert if the msg.sender isn't the deposit's seller", async () => { + await erc20.approve(p2pix.address, price); + await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + const fail = p2pix.connect(acc02).withdraw(0, []); + + await expect(fail).to.be.revertedWithCustomError( + p2pix, + P2PixErrors.OnlySeller, + ); + }); + it("should withdraw remaining funds from deposit, update storage and emit event", async () => { + await erc20.approve(p2pix.address, price); + const dep = await p2pix.deposit( + erc20.address, + price, + "pixTarget", + merkleRoot, + ); + const tx = await p2pix.withdraw(0, []); + + expect(tx).to.be.ok; + await expect(dep) + .to.changeTokenBalance( + erc20, + owner.address, + "-100000000000000000000", + ) + .and.to.changeTokenBalance( + erc20, + p2pix.address, + price, + ); + await expect(tx) + .to.changeTokenBalance(erc20, owner.address, price) + .and.to.changeTokenBalance( + erc20, + p2pix.address, + "-100000000000000000000", + ); + + await expect(tx) + .to.emit(p2pix, "DepositWithdrawn") + .withArgs(owner.address, 0, price); + }); }); describe("Allowlist Settings", async () => { - // it -> set root of seller's allowlist - // (test msg.sender != seller error) - // i.e., set it in the fixture + it(" should revert if the msg.sender differs from deposit's seller", async () => { + const root = ethers.utils.keccak256( + ethers.utils.toUtf8Bytes("root"), + ); + const fail = p2pix.connect(acc02).setRoot(owner.address, root); + + await expect(fail).to.be.revertedWithCustomError(p2pix, P2PixErrors.OnlySeller); + }); + it("should set root of seller's allowlist, update storage and emit event", async () => { + const ownerKey = await p2pix.callStatic._castAddrToKey(owner.address); + const oldState = await p2pix.callStatic.sellerAllowList(ownerKey); + const tx = await p2pix.connect(owner).setRoot(owner.address, merkleRoot); + const newState = await p2pix.callStatic.sellerAllowList(ownerKey); + + expect(tx).to.be.ok; + await expect(tx).to.emit(p2pix, "RootUpdated").withArgs(owner.address, merkleRoot); + expect(oldState).to.eq(ethers.constants.HashZero); + expect(newState).to.eq(merkleRoot); + }); }); }); diff --git a/test/utils/fixtures.ts b/test/utils/fixtures.ts index bd3fae0..ab9d9ed 100644 --- a/test/utils/fixtures.ts +++ b/test/utils/fixtures.ts @@ -11,6 +11,11 @@ import { } from "../../src/types"; // exported interfaces +export interface Deploys { + signers: string[]; + p2pix: string; + token: string; +} export interface Deposit { remaining: BigNumber; @@ -21,10 +26,10 @@ export interface Deposit { } export interface Lock { - depositID: string; - relayerPremium: string; - amount: string; - expirationBlock: string; + depositID: BigNumber; + relayerPremium: BigNumber; + amount: BigNumber; + expirationBlock: BigNumber; buyerAddress: string; relayerTarget: string; relayerAddress: string; @@ -130,7 +135,7 @@ export async function p2pixFixture(): Promise { }); const merkleRoot: string = tree.getHexRoot(); const proof: string[] = tree.getHexProof( - padBuffer(whitelisted[0].address), + padBuffer(whitelisted[1].address), ); return { diff --git a/yarn.lock b/yarn.lock index d73d285..dcdf33f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3495,6 +3495,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:4.x, chalk@npm:^4.1.1": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: ^4.1.0 + supports-color: ^7.1.0 + checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc + languageName: node + linkType: hard + "chalk@npm:^2.0.0, chalk@npm:^2.1.0, chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -3516,16 +3526,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^4.1.1": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: ^4.1.0 - supports-color: ^7.1.0 - checksum: fe75c9d5c76a7a98d45495b91b2172fa3b7a09e0cc9370e5c8feb1c567b85c4288e2b3fded7cfdd7359ac28d6b3844feb8b82b8686842e93d23c827c417e83fc - languageName: node - linkType: hard - "chardet@npm:^0.7.0": version: 0.7.0 resolution: "chardet@npm:0.7.0" @@ -8448,6 +8448,7 @@ fsevents@~2.1.1: "@typescript-eslint/eslint-plugin": ^5.42.0 "@typescript-eslint/parser": ^5.42.0 chai: ^4.3.6 + chalk: 4.x commitizen: ^4.2.5 cross-env: ^7.0.3 cz-conventional-changelog: ^3.3.0