diff --git a/README.md b/README.md index ec6daf7..087ca5b 100644 --- a/README.md +++ b/README.md @@ -50,16 +50,18 @@ ### V2 | Testnet | Token Address | P2pix Address | Reputation Address | |--------- |-------------------------------------------- |-------------------------------------------- |-------------------------------------------- | -| Goerli | 0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00 | 0x2a54667b566B1Aa3779828720E6696AC18ae3f1b | 0x7c4010CFe2B5446f0c9dcc5e9B596534b2D2eB44 | -| Mumbai | 0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29 | 0x7F4680D114B43c4434FB604c7Bc6306125D32f28 | 0xD38D6367f452D097ccBfDe4490b7de570B6A72Db | +| Goerli | 0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00 | 0xefa5cE4351cda51192509cf8De7d8881ADAE95DD | 0x939d3c357dc7017cDbDE681BF8e552b54595318A | +| Mumbai | 0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29 | 0xA9258eBb157E4cf5e756b77FDD0DF09C2F73240b | 0x1fd30b94f20d2f73e9630261342ba68f244da92b | - - + + + - - + + + ## Usage ### Pre Requisites diff --git a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json index c296519..0202b49 100644 --- a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json +++ b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json index c296519..0202b49 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/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/Reputation.sol/Reputation.dbg.json b/artifacts/contracts/Reputation.sol/Reputation.dbg.json index c296519..0202b49 100644 --- a/artifacts/contracts/Reputation.sol/Reputation.dbg.json +++ b/artifacts/contracts/Reputation.sol/Reputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json +++ b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json +++ b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json +++ b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json +++ b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json +++ b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +++ b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json index ff1ed99..b9559f1 100644 --- a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json +++ b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index c296519..0202b49 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/6801f23dfb2a9667d9e89d4173ae1ee7.json" + "buildInfo": "../../build-info/6e32e8b8339868a5a7b642cfedb2d144.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index e4946d4..a7dbe7e 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -561,7 +561,7 @@ "outputs": [ { "internalType": "uint256[]", - "name": "balances", + "name": "", "type": "uint256[]" } ], @@ -1065,8 +1065,8 @@ "type": "receive" } ], - "bytecode": "0x6080604052600180556040516200322a3803806200322a8339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b612c0480620006266000396000f3fe6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610215610203366004612406565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461248d565b6107be565b34801561025457600080fd5b50610268610263366004612674565b610b6d565b005b34801561027657600080fd5b506102686102853660046126b1565b610ca7565b34801561029657600080fd5b506102686102a53660046126ea565b610d98565b3480156102b657600080fd5b506103376102c5366004612406565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be366004612406565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe3660046126b1565b600c1b90565b34801561041057600080fd5b5061026861041f366004612406565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d36104543660046126b1565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461275d565b611151565b3480156104b157600080fd5b506102686104c0366004612792565b611268565b3480156104d157600080fd5b506102156104e0366004612406565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127f6565b611747565b34801561051e57600080fd5b506103d361052d366004612822565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d366004612406565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c366004612406565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461285b565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b50610573610674366004612822565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b4366004612880565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b506107066107013660046128c2565b611a50565b60405161021f9190612909565b34801561071f57600080fd5b5061021561072e366004612822565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461294d565b611b5b565b34801561078a57600080fd5b506102686107993660046126b1565b611c6b565b3480156107aa57600080fd5b506102686107b9366004612a0f565b611d37565b60006107c8611e33565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a9a565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a9a565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e77565b610a4e848c84848988611ecf565b60048054906000610a5e83612ab2565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611ecf565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aeb565b61202a565b9050610ad4670de0b6b3a764000082612b26565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611ecf565b60048054906000610b4783612ab2565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b63565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b92565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a9a565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e33565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a9a565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120e6565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b33826121b0565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e33565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612be0565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a9a565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a9a565b9091555061162b9050565b8187600201546116039190612a9a565b33600c1b60009081526007602052604081208054909190611625908490612a9a565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff168361222a565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61222a565b6116c4838d60018a60020154901c61222a565b6116d8565b6116d8838d896002015461222a565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b63565b9050602002013581526020019081526020016000209050611851816122e9565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a9a565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a9a565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b63565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b606073ffffffffffffffffffffffffffffffffffffffff8216611a9f576040517fdf95788300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611ad7576040517fff633a3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516000905b80821015611b5357611b30858381518110611afa57611afa612b63565b602090810291909101810151600c1b6000908152600b8252604080822088835290925220546b3fffffffffffffffffffffff1690565b838381518110611b4257611b42612b63565b602002602001018181525050611add565b505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bf15763df9578836000526004601cfd5b81518114611c075763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d3f611e33565b611d49828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d7f57611d7f846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611dcd906b3fffffffffffffffffffffff16858784612365565b611dd885338661222a565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e70576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e9984848473ffffffffffffffffffffffffffffffffffffffff85166123c2565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611fbe86868484612365565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261201a92918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161204891815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120dd5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806121a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af1905080612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b4381600401541115612327576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612362576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123785763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906123b7908490612be0565b909155505050505050565b600083156123fe578360051b8501855b803580851160051b948552602094851852604060002093018181106123f6576123fb565b6123d2565b50505b501492915050565b60006020828403121561241857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461236257600080fd5b60008083601f84011261245357600080fd5b50813567ffffffffffffffff81111561246b57600080fd5b6020830191508360208260051b850101111561248657600080fd5b9250929050565b6000806000806000806000806000806101008b8d0312156124ad57600080fd5b8a356124b88161241f565b995060208b01356124c88161241f565b985060408b01356124d88161241f565b975060608b01356124e88161241f565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff8082111561251357600080fd5b61251f8e838f01612441565b909650945060e08d013591508082111561253857600080fd5b506125458d828e01612441565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d4576125d461255e565b604052919050565b600067ffffffffffffffff8211156125f6576125f661255e565b5060051b60200190565b600082601f83011261261157600080fd5b81356020612626612621836125dc565b61258d565b82815260059290921b8401810191818101908684111561264557600080fd5b8286015b8481101561266957803561265c8161241f565b8352918301918301612649565b509695505050505050565b60006020828403121561268657600080fd5b813567ffffffffffffffff81111561269d57600080fd5b6126a984828501612600565b949350505050565b6000602082840312156126c357600080fd5b81356126ce8161241f565b9392505050565b803580151581146126e557600080fd5b919050565b600080600080600060a0868803121561270257600080fd5b853561270d8161241f565b945060208601356bffffffffffffffffffffffff8116811461272e57600080fd5b9350604086013561273e8161241f565b925061274c606087016126d5565b949793965091946080013592915050565b6000806040838503121561277057600080fd5b823561277b8161241f565b9150612789602084016126d5565b90509250929050565b60008060008060008060c087890312156127ab57600080fd5b8635955060208701356127bd8161241f565b945060408701359350606087013592506080870135915060a087013560ff811681146127e857600080fd5b809150509295509295509295565b6000806040838503121561280957600080fd5b82356128148161241f565b946020939093013593505050565b6000806040838503121561283557600080fd5b82356128408161241f565b915060208301356128508161241f565b809150509250929050565b6000806040838503121561286e57600080fd5b8235915060208301356128508161241f565b6000806020838503121561289357600080fd5b823567ffffffffffffffff8111156128aa57600080fd5b6128b685828601612441565b90969095509350505050565b600080604083850312156128d557600080fd5b823567ffffffffffffffff8111156128ec57600080fd5b6128f885828601612600565b92505060208301356128508161241f565b6020808252825182820181905260009190848201906040850190845b8181101561294157835183529284019291840191600101612925565b50909695505050505050565b6000806040838503121561296057600080fd5b823567ffffffffffffffff8082111561297857600080fd5b61298486838701612600565b935060209150818501358181111561299b57600080fd5b85019050601f810186136129ae57600080fd5b80356129bc612621826125dc565b81815260059190911b820183019083810190888311156129db57600080fd5b928401925b82841015612a00576129f1846126d5565b825292840192908401906129e0565b80955050505050509250929050565b60008060008060608587031215612a2557600080fd5b8435612a308161241f565b935060208501359250604085013567ffffffffffffffff811115612a5357600080fd5b612a5f87828801612441565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aad57612aad612a6b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ae457612ae4612a6b565b5060010190565b600082612b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b5e57612b5e612a6b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561294157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bae565b600082821015612bf257612bf2612a6b565b50039056fea164736f6c6343000809000a", - "deployedBytecode": "0x6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610215610203366004612406565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461248d565b6107be565b34801561025457600080fd5b50610268610263366004612674565b610b6d565b005b34801561027657600080fd5b506102686102853660046126b1565b610ca7565b34801561029657600080fd5b506102686102a53660046126ea565b610d98565b3480156102b657600080fd5b506103376102c5366004612406565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be366004612406565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe3660046126b1565b600c1b90565b34801561041057600080fd5b5061026861041f366004612406565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d36104543660046126b1565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461275d565b611151565b3480156104b157600080fd5b506102686104c0366004612792565b611268565b3480156104d157600080fd5b506102156104e0366004612406565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127f6565b611747565b34801561051e57600080fd5b506103d361052d366004612822565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d366004612406565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c366004612406565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461285b565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b50610573610674366004612822565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b4366004612880565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b506107066107013660046128c2565b611a50565b60405161021f9190612909565b34801561071f57600080fd5b5061021561072e366004612822565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461294d565b611b5b565b34801561078a57600080fd5b506102686107993660046126b1565b611c6b565b3480156107aa57600080fd5b506102686107b9366004612a0f565b611d37565b60006107c8611e33565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a9a565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a9a565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e77565b610a4e848c84848988611ecf565b60048054906000610a5e83612ab2565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611ecf565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aeb565b61202a565b9050610ad4670de0b6b3a764000082612b26565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611ecf565b60048054906000610b4783612ab2565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b63565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b92565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a9a565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e33565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a9a565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120e6565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b33826121b0565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e33565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612be0565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a9a565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a9a565b9091555061162b9050565b8187600201546116039190612a9a565b33600c1b60009081526007602052604081208054909190611625908490612a9a565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff168361222a565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61222a565b6116c4838d60018a60020154901c61222a565b6116d8565b6116d8838d896002015461222a565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b63565b9050602002013581526020019081526020016000209050611851816122e9565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a9a565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a9a565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b63565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b606073ffffffffffffffffffffffffffffffffffffffff8216611a9f576040517fdf95788300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611ad7576040517fff633a3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516000905b80821015611b5357611b30858381518110611afa57611afa612b63565b602090810291909101810151600c1b6000908152600b8252604080822088835290925220546b3fffffffffffffffffffffff1690565b838381518110611b4257611b42612b63565b602002602001018181525050611add565b505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bf15763df9578836000526004601cfd5b81518114611c075763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d3f611e33565b611d49828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d7f57611d7f846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611dcd906b3fffffffffffffffffffffff16858784612365565b611dd885338661222a565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e70576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e9984848473ffffffffffffffffffffffffffffffffffffffff85166123c2565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611fbe86868484612365565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261201a92918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161204891815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120dd5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806121a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af1905080612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b4381600401541115612327576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612362576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123785763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906123b7908490612be0565b909155505050505050565b600083156123fe578360051b8501855b803580851160051b948552602094851852604060002093018181106123f6576123fb565b6123d2565b50505b501492915050565b60006020828403121561241857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461236257600080fd5b60008083601f84011261245357600080fd5b50813567ffffffffffffffff81111561246b57600080fd5b6020830191508360208260051b850101111561248657600080fd5b9250929050565b6000806000806000806000806000806101008b8d0312156124ad57600080fd5b8a356124b88161241f565b995060208b01356124c88161241f565b985060408b01356124d88161241f565b975060608b01356124e88161241f565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff8082111561251357600080fd5b61251f8e838f01612441565b909650945060e08d013591508082111561253857600080fd5b506125458d828e01612441565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d4576125d461255e565b604052919050565b600067ffffffffffffffff8211156125f6576125f661255e565b5060051b60200190565b600082601f83011261261157600080fd5b81356020612626612621836125dc565b61258d565b82815260059290921b8401810191818101908684111561264557600080fd5b8286015b8481101561266957803561265c8161241f565b8352918301918301612649565b509695505050505050565b60006020828403121561268657600080fd5b813567ffffffffffffffff81111561269d57600080fd5b6126a984828501612600565b949350505050565b6000602082840312156126c357600080fd5b81356126ce8161241f565b9392505050565b803580151581146126e557600080fd5b919050565b600080600080600060a0868803121561270257600080fd5b853561270d8161241f565b945060208601356bffffffffffffffffffffffff8116811461272e57600080fd5b9350604086013561273e8161241f565b925061274c606087016126d5565b949793965091946080013592915050565b6000806040838503121561277057600080fd5b823561277b8161241f565b9150612789602084016126d5565b90509250929050565b60008060008060008060c087890312156127ab57600080fd5b8635955060208701356127bd8161241f565b945060408701359350606087013592506080870135915060a087013560ff811681146127e857600080fd5b809150509295509295509295565b6000806040838503121561280957600080fd5b82356128148161241f565b946020939093013593505050565b6000806040838503121561283557600080fd5b82356128408161241f565b915060208301356128508161241f565b809150509250929050565b6000806040838503121561286e57600080fd5b8235915060208301356128508161241f565b6000806020838503121561289357600080fd5b823567ffffffffffffffff8111156128aa57600080fd5b6128b685828601612441565b90969095509350505050565b600080604083850312156128d557600080fd5b823567ffffffffffffffff8111156128ec57600080fd5b6128f885828601612600565b92505060208301356128508161241f565b6020808252825182820181905260009190848201906040850190845b8181101561294157835183529284019291840191600101612925565b50909695505050505050565b6000806040838503121561296057600080fd5b823567ffffffffffffffff8082111561297857600080fd5b61298486838701612600565b935060209150818501358181111561299b57600080fd5b85019050601f810186136129ae57600080fd5b80356129bc612621826125dc565b81815260059190911b820183019083810190888311156129db57600080fd5b928401925b82841015612a00576129f1846126d5565b825292840192908401906129e0565b80955050505050509250929050565b60008060008060608587031215612a2557600080fd5b8435612a308161241f565b935060208501359250604085013567ffffffffffffffff811115612a5357600080fd5b612a5f87828801612441565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aad57612aad612a6b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ae457612ae4612a6b565b5060010190565b600082612b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b5e57612b5e612a6b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561294157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bae565b600082821015612bf257612bf2612a6b565b50039056fea164736f6c6343000809000a", + "bytecode": "0x608060405260018055604051620031f9380380620031f98339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b612bd380620006266000396000f3fe6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102156102033660046123d5565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461245c565b6107be565b34801561025457600080fd5b50610268610263366004612643565b610b6d565b005b34801561027657600080fd5b50610268610285366004612680565b610ca7565b34801561029657600080fd5b506102686102a53660046126b9565b610d98565b3480156102b657600080fd5b506103376102c53660046123d5565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be3660046123d5565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe366004612680565b600c1b90565b34801561041057600080fd5b5061026861041f3660046123d5565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d3610454366004612680565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461272c565b611151565b3480156104b157600080fd5b506102686104c0366004612761565b611268565b3480156104d157600080fd5b506102156104e03660046123d5565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127c5565b611747565b34801561051e57600080fd5b506103d361052d3660046127f1565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d3660046123d5565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c3660046123d5565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461282a565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b506105736106743660046127f1565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b436600461284f565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b50610706610701366004612891565b611a50565b60405161021f91906128d8565b34801561071f57600080fd5b5061021561072e3660046127f1565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461291c565b611b2a565b34801561078a57600080fd5b50610268610799366004612680565b611c3a565b3480156107aa57600080fd5b506102686107b93660046129de565b611d06565b60006107c8611e02565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a69565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a69565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e46565b610a4e848c84848988611e9e565b60048054906000610a5e83612a81565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611e9e565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aba565b611ff9565b9050610ad4670de0b6b3a764000082612af5565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611e9e565b60048054906000610b4783612a81565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b32565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b61565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a69565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e02565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a69565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120b5565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b338261217f565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e02565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612baf565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a69565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a69565b9091555061162b9050565b8187600201546116039190612a69565b33600c1b60009081526007602052604081208054909190611625908490612a69565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff16836121f9565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6121f9565b6116c4838d60018a60020154901c6121f9565b6116d8565b6116d8838d89600201546121f9565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b32565b9050602002013581526020019081526020016000209050611851816122b8565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a69565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a69565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b32565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611a7257611a7261252d565b604051908082528060200260200182016040528015611a9b578160200160208202803683370190505b5090505b81831015611b21576000611af4878581518110611abe57611abe612b32565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611b0957611b09612b32565b60200260200101818152505083600101935050611a9f565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bc05763df9578836000526004601cfd5b81518114611bd65763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611be5565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d0e611e02565b611d18828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d4e57611d4e846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611d9c906b3fffffffffffffffffffffff16858784612334565b611da78533866121f9565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e3f576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e6884848473ffffffffffffffffffffffffffffffffffffffff8516612391565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611f8d86868484612334565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6592611fe992918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161201791815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120ac5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af19050806121f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b43816004015411156122f6576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612331576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123475763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281208054859290612386908490612baf565b909155505050505050565b600083156123cd578360051b8501855b803580851160051b948552602094851852604060002093018181106123c5576123ca565b6123a1565b50505b501492915050565b6000602082840312156123e757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461233157600080fd5b60008083601f84011261242257600080fd5b50813567ffffffffffffffff81111561243a57600080fd5b6020830191508360208260051b850101111561245557600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561247c57600080fd5b8a35612487816123ee565b995060208b0135612497816123ee565b985060408b01356124a7816123ee565b975060608b01356124b7816123ee565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156124e257600080fd5b6124ee8e838f01612410565b909650945060e08d013591508082111561250757600080fd5b506125148d828e01612410565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125a3576125a361252d565b604052919050565b600067ffffffffffffffff8211156125c5576125c561252d565b5060051b60200190565b600082601f8301126125e057600080fd5b813560206125f56125f0836125ab565b61255c565b82815260059290921b8401810191818101908684111561261457600080fd5b8286015b8481101561263857803561262b816123ee565b8352918301918301612618565b509695505050505050565b60006020828403121561265557600080fd5b813567ffffffffffffffff81111561266c57600080fd5b612678848285016125cf565b949350505050565b60006020828403121561269257600080fd5b813561269d816123ee565b9392505050565b803580151581146126b457600080fd5b919050565b600080600080600060a086880312156126d157600080fd5b85356126dc816123ee565b945060208601356bffffffffffffffffffffffff811681146126fd57600080fd5b9350604086013561270d816123ee565b925061271b606087016126a4565b949793965091946080013592915050565b6000806040838503121561273f57600080fd5b823561274a816123ee565b9150612758602084016126a4565b90509250929050565b60008060008060008060c0878903121561277a57600080fd5b86359550602087013561278c816123ee565b945060408701359350606087013592506080870135915060a087013560ff811681146127b757600080fd5b809150509295509295509295565b600080604083850312156127d857600080fd5b82356127e3816123ee565b946020939093013593505050565b6000806040838503121561280457600080fd5b823561280f816123ee565b9150602083013561281f816123ee565b809150509250929050565b6000806040838503121561283d57600080fd5b82359150602083013561281f816123ee565b6000806020838503121561286257600080fd5b823567ffffffffffffffff81111561287957600080fd5b61288585828601612410565b90969095509350505050565b600080604083850312156128a457600080fd5b823567ffffffffffffffff8111156128bb57600080fd5b6128c7858286016125cf565b925050602083013561281f816123ee565b6020808252825182820181905260009190848201906040850190845b81811015612910578351835292840192918401916001016128f4565b50909695505050505050565b6000806040838503121561292f57600080fd5b823567ffffffffffffffff8082111561294757600080fd5b612953868387016125cf565b935060209150818501358181111561296a57600080fd5b85019050601f8101861361297d57600080fd5b803561298b6125f0826125ab565b81815260059190911b820183019083810190888311156129aa57600080fd5b928401925b828410156129cf576129c0846126a4565b825292840192908401906129af565b80955050505050509250929050565b600080600080606085870312156129f457600080fd5b84356129ff816123ee565b935060208501359250604085013567ffffffffffffffff811115612a2257600080fd5b612a2e87828801612410565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612a7c57612a7c612a3a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ab357612ab3612a3a565b5060010190565b600082612af0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2d57612b2d612a3a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561291057835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612b7d565b600082821015612bc157612bc1612a3a565b50039056fea164736f6c6343000809000a", + "deployedBytecode": "0x6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102156102033660046123d5565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461245c565b6107be565b34801561025457600080fd5b50610268610263366004612643565b610b6d565b005b34801561027657600080fd5b50610268610285366004612680565b610ca7565b34801561029657600080fd5b506102686102a53660046126b9565b610d98565b3480156102b657600080fd5b506103376102c53660046123d5565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be3660046123d5565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe366004612680565b600c1b90565b34801561041057600080fd5b5061026861041f3660046123d5565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d3610454366004612680565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461272c565b611151565b3480156104b157600080fd5b506102686104c0366004612761565b611268565b3480156104d157600080fd5b506102156104e03660046123d5565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127c5565b611747565b34801561051e57600080fd5b506103d361052d3660046127f1565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d3660046123d5565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c3660046123d5565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461282a565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b506105736106743660046127f1565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b436600461284f565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b50610706610701366004612891565b611a50565b60405161021f91906128d8565b34801561071f57600080fd5b5061021561072e3660046127f1565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461291c565b611b2a565b34801561078a57600080fd5b50610268610799366004612680565b611c3a565b3480156107aa57600080fd5b506102686107b93660046129de565b611d06565b60006107c8611e02565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a69565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a69565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e46565b610a4e848c84848988611e9e565b60048054906000610a5e83612a81565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611e9e565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aba565b611ff9565b9050610ad4670de0b6b3a764000082612af5565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611e9e565b60048054906000610b4783612a81565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b32565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b61565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a69565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e02565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a69565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120b5565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b338261217f565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e02565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612baf565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a69565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a69565b9091555061162b9050565b8187600201546116039190612a69565b33600c1b60009081526007602052604081208054909190611625908490612a69565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff16836121f9565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6121f9565b6116c4838d60018a60020154901c6121f9565b6116d8565b6116d8838d89600201546121f9565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b32565b9050602002013581526020019081526020016000209050611851816122b8565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a69565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a69565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b32565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611a7257611a7261252d565b604051908082528060200260200182016040528015611a9b578160200160208202803683370190505b5090505b81831015611b21576000611af4878581518110611abe57611abe612b32565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611b0957611b09612b32565b60200260200101818152505083600101935050611a9f565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bc05763df9578836000526004601cfd5b81518114611bd65763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611be5565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d0e611e02565b611d18828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d4e57611d4e846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611d9c906b3fffffffffffffffffffffff16858784612334565b611da78533866121f9565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e3f576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e6884848473ffffffffffffffffffffffffffffffffffffffff8516612391565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611f8d86868484612334565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6592611fe992918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161201791815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120ac5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af19050806121f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b43816004015411156122f6576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612331576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123475763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281208054859290612386908490612baf565b909155505050505050565b600083156123cd578360051b8501855b803580851160051b948552602094851852604060002093018181106123c5576123ca565b6123a1565b50505b501492915050565b6000602082840312156123e757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461233157600080fd5b60008083601f84011261242257600080fd5b50813567ffffffffffffffff81111561243a57600080fd5b6020830191508360208260051b850101111561245557600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561247c57600080fd5b8a35612487816123ee565b995060208b0135612497816123ee565b985060408b01356124a7816123ee565b975060608b01356124b7816123ee565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156124e257600080fd5b6124ee8e838f01612410565b909650945060e08d013591508082111561250757600080fd5b506125148d828e01612410565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125a3576125a361252d565b604052919050565b600067ffffffffffffffff8211156125c5576125c561252d565b5060051b60200190565b600082601f8301126125e057600080fd5b813560206125f56125f0836125ab565b61255c565b82815260059290921b8401810191818101908684111561261457600080fd5b8286015b8481101561263857803561262b816123ee565b8352918301918301612618565b509695505050505050565b60006020828403121561265557600080fd5b813567ffffffffffffffff81111561266c57600080fd5b612678848285016125cf565b949350505050565b60006020828403121561269257600080fd5b813561269d816123ee565b9392505050565b803580151581146126b457600080fd5b919050565b600080600080600060a086880312156126d157600080fd5b85356126dc816123ee565b945060208601356bffffffffffffffffffffffff811681146126fd57600080fd5b9350604086013561270d816123ee565b925061271b606087016126a4565b949793965091946080013592915050565b6000806040838503121561273f57600080fd5b823561274a816123ee565b9150612758602084016126a4565b90509250929050565b60008060008060008060c0878903121561277a57600080fd5b86359550602087013561278c816123ee565b945060408701359350606087013592506080870135915060a087013560ff811681146127b757600080fd5b809150509295509295509295565b600080604083850312156127d857600080fd5b82356127e3816123ee565b946020939093013593505050565b6000806040838503121561280457600080fd5b823561280f816123ee565b9150602083013561281f816123ee565b809150509250929050565b6000806040838503121561283d57600080fd5b82359150602083013561281f816123ee565b6000806020838503121561286257600080fd5b823567ffffffffffffffff81111561287957600080fd5b61288585828601612410565b90969095509350505050565b600080604083850312156128a457600080fd5b823567ffffffffffffffff8111156128bb57600080fd5b6128c7858286016125cf565b925050602083013561281f816123ee565b6020808252825182820181905260009190848201906040850190845b81811015612910578351835292840192918401916001016128f4565b50909695505050505050565b6000806040838503121561292f57600080fd5b823567ffffffffffffffff8082111561294757600080fd5b612953868387016125cf565b935060209150818501358181111561296a57600080fd5b85019050601f8101861361297d57600080fd5b803561298b6125f0826125ab565b81815260059190911b820183019083810190888311156129aa57600080fd5b928401925b828410156129cf576129c0846126a4565b825292840192908401906129af565b80955050505050509250929050565b600080600080606085870312156129f457600080fd5b84356129ff816123ee565b935060208501359250604085013567ffffffffffffffff811115612a2257600080fd5b612a2e87828801612410565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612a7c57612a7c612a3a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ab357612ab3612a3a565b5060010190565b600082612af0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2d57612b2d612a3a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561291057835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612b7d565b600082821015612bc157612bc1612a3a565b50039056fea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index fb50051..cff8475 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -332,7 +332,7 @@ contract P2PIX is /// In case of they differing: /// - `lock` caller gets accrued with `l.amount` as userRecord credit; /// - `release` caller gets accrued with `l.relayerPremium` as userRecord credit; - /// @param _relayerTarget Target address entitled to the `relayerPremim`. + /// @param _relayerTarget Target address entitled to the `relayerPremium`. /// @dev Function sighash: 0x4e1389ed. function release( uint256 lockID, @@ -852,17 +852,21 @@ contract P2PIX is ) external view - returns(uint256[] memory balances) + returns(uint256[] memory) { - if(address(token) == address(0x0)) - revert NoTokens(); - if(sellers.length == 0) - revert LengthMismatch(); - uint256 j; - uint256 len = sellers.length; - while (j < len) { balances[j] = - getBalance(sellers[j], token); + uint256 len = + sellers.length; + uint256[] memory balances = + new uint256[](len); + while (j < len) { + uint256 bal = + getBalance( + sellers[j], + token + ); + balances[j] = bal; + unchecked { ++j; } } return balances; diff --git a/deploys/goerli.json b/deploys/goerli.json index a4073bd..3857f9e 100644 --- a/deploys/goerli.json +++ b/deploys/goerli.json @@ -3,6 +3,6 @@ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" ], - "p2pix": "0x2a54667b566B1Aa3779828720E6696AC18ae3f1b", + "p2pix": "0xefa5cE4351cda51192509cf8De7d8881ADAE95DD", "token": "0x4A2886EAEc931e04297ed336Cc55c4eb7C75BA00" } \ No newline at end of file diff --git a/deploys/polygon-mumbai.json b/deploys/polygon-mumbai.json index 733a0da..6ea7d2a 100644 --- a/deploys/polygon-mumbai.json +++ b/deploys/polygon-mumbai.json @@ -3,6 +3,6 @@ "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" ], - "p2pix": "0x7F4680D114B43c4434FB604c7Bc6306125D32f28", + "p2pix": "0xA9258eBb157E4cf5e756b77FDD0DF09C2F73240b", "token": "0xC86042E9F2977C62Da8c9dDF7F9c40fde4796A29" } \ No newline at end of file diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index e3d6536..66092be 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -572,7 +572,7 @@ const _abi = [ outputs: [ { internalType: "uint256[]", - name: "balances", + name: "", type: "uint256[]", }, ], @@ -1078,7 +1078,7 @@ const _abi = [ ]; const _bytecode = - "0x6080604052600180556040516200322a3803806200322a8339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b612c0480620006266000396000f3fe6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b50610215610203366004612406565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461248d565b6107be565b34801561025457600080fd5b50610268610263366004612674565b610b6d565b005b34801561027657600080fd5b506102686102853660046126b1565b610ca7565b34801561029657600080fd5b506102686102a53660046126ea565b610d98565b3480156102b657600080fd5b506103376102c5366004612406565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be366004612406565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe3660046126b1565b600c1b90565b34801561041057600080fd5b5061026861041f366004612406565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d36104543660046126b1565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461275d565b611151565b3480156104b157600080fd5b506102686104c0366004612792565b611268565b3480156104d157600080fd5b506102156104e0366004612406565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127f6565b611747565b34801561051e57600080fd5b506103d361052d366004612822565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d366004612406565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c366004612406565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461285b565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b50610573610674366004612822565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b4366004612880565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b506107066107013660046128c2565b611a50565b60405161021f9190612909565b34801561071f57600080fd5b5061021561072e366004612822565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461294d565b611b5b565b34801561078a57600080fd5b506102686107993660046126b1565b611c6b565b3480156107aa57600080fd5b506102686107b9366004612a0f565b611d37565b60006107c8611e33565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a9a565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a9a565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e77565b610a4e848c84848988611ecf565b60048054906000610a5e83612ab2565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611ecf565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aeb565b61202a565b9050610ad4670de0b6b3a764000082612b26565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611ecf565b60048054906000610b4783612ab2565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b63565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b92565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a9a565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e33565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a9a565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120e6565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b33826121b0565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e33565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612be0565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a9a565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a9a565b9091555061162b9050565b8187600201546116039190612a9a565b33600c1b60009081526007602052604081208054909190611625908490612a9a565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff168361222a565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c61222a565b6116c4838d60018a60020154901c61222a565b6116d8565b6116d8838d896002015461222a565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b63565b9050602002013581526020019081526020016000209050611851816122e9565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a9a565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a9a565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b63565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b606073ffffffffffffffffffffffffffffffffffffffff8216611a9f576040517fdf95788300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251611ad7576040517fff633a3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b82516000905b80821015611b5357611b30858381518110611afa57611afa612b63565b602090810291909101810151600c1b6000908152600b8252604080822088835290925220546b3fffffffffffffffffffffff1690565b838381518110611b4257611b42612b63565b602002602001018181525050611add565b505092915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bdc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bf15763df9578836000526004601cfd5b81518114611c075763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c16565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d3f611e33565b611d49828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d7f57611d7f846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611dcd906b3fffffffffffffffffffffff16858784612365565b611dd885338661222a565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e70576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e9984848473ffffffffffffffffffffffffffffffffffffffff85166123c2565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611fbe86868484612365565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261201a92918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161204891815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120dd5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d11600160005114161716915060006060528060405250806121a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af1905080612225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b4381600401541115612327576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612362576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123785763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906123b7908490612be0565b909155505050505050565b600083156123fe578360051b8501855b803580851160051b948552602094851852604060002093018181106123f6576123fb565b6123d2565b50505b501492915050565b60006020828403121561241857600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461236257600080fd5b60008083601f84011261245357600080fd5b50813567ffffffffffffffff81111561246b57600080fd5b6020830191508360208260051b850101111561248657600080fd5b9250929050565b6000806000806000806000806000806101008b8d0312156124ad57600080fd5b8a356124b88161241f565b995060208b01356124c88161241f565b985060408b01356124d88161241f565b975060608b01356124e88161241f565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff8082111561251357600080fd5b61251f8e838f01612441565b909650945060e08d013591508082111561253857600080fd5b506125458d828e01612441565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125d4576125d461255e565b604052919050565b600067ffffffffffffffff8211156125f6576125f661255e565b5060051b60200190565b600082601f83011261261157600080fd5b81356020612626612621836125dc565b61258d565b82815260059290921b8401810191818101908684111561264557600080fd5b8286015b8481101561266957803561265c8161241f565b8352918301918301612649565b509695505050505050565b60006020828403121561268657600080fd5b813567ffffffffffffffff81111561269d57600080fd5b6126a984828501612600565b949350505050565b6000602082840312156126c357600080fd5b81356126ce8161241f565b9392505050565b803580151581146126e557600080fd5b919050565b600080600080600060a0868803121561270257600080fd5b853561270d8161241f565b945060208601356bffffffffffffffffffffffff8116811461272e57600080fd5b9350604086013561273e8161241f565b925061274c606087016126d5565b949793965091946080013592915050565b6000806040838503121561277057600080fd5b823561277b8161241f565b9150612789602084016126d5565b90509250929050565b60008060008060008060c087890312156127ab57600080fd5b8635955060208701356127bd8161241f565b945060408701359350606087013592506080870135915060a087013560ff811681146127e857600080fd5b809150509295509295509295565b6000806040838503121561280957600080fd5b82356128148161241f565b946020939093013593505050565b6000806040838503121561283557600080fd5b82356128408161241f565b915060208301356128508161241f565b809150509250929050565b6000806040838503121561286e57600080fd5b8235915060208301356128508161241f565b6000806020838503121561289357600080fd5b823567ffffffffffffffff8111156128aa57600080fd5b6128b685828601612441565b90969095509350505050565b600080604083850312156128d557600080fd5b823567ffffffffffffffff8111156128ec57600080fd5b6128f885828601612600565b92505060208301356128508161241f565b6020808252825182820181905260009190848201906040850190845b8181101561294157835183529284019291840191600101612925565b50909695505050505050565b6000806040838503121561296057600080fd5b823567ffffffffffffffff8082111561297857600080fd5b61298486838701612600565b935060209150818501358181111561299b57600080fd5b85019050601f810186136129ae57600080fd5b80356129bc612621826125dc565b81815260059190911b820183019083810190888311156129db57600080fd5b928401925b82841015612a00576129f1846126d5565b825292840192908401906129e0565b80955050505050509250929050565b60008060008060608587031215612a2557600080fd5b8435612a308161241f565b935060208501359250604085013567ffffffffffffffff811115612a5357600080fd5b612a5f87828801612441565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612aad57612aad612a6b565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ae457612ae4612a6b565b5060010190565b600082612b21577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b5e57612b5e612a6b565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561294157835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bae565b600082821015612bf257612bf2612a6b565b50039056fea164736f6c6343000809000a"; + "0x608060405260018055604051620031f9380380620031f98339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b612bd380620006266000396000f3fe6080604052600436106101dc5760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d14610713578063d6e8b9731461075e578063f7d0e04b1461077e578063fb8c5ef01461079e57600080fd5b8063ad8f2eed14610659578063b0983d3914610699578063c52164c6146106b9578063d1c07028146106e657600080fd5b80638db564c2116100d15780638db564c2146105c55780639872dbfe146105db57806398a26871146105f15780639eee8d4b1461062157600080fd5b80637f94f65d146104f257806380e1d3021461051257806384ab1d28146105525780638da5cb5b1461059857600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104695780636d82d9e01461048557806374ba03a0146104a557806377cd38a4146104c557600080fd5b80634b2ae980146103e3578063574983c8146104045780635fd8c7101461042457806369cc6af41461043957600080fd5b806313af4035116101b657806313af40351461026a578063328a71811461028a578063367821f0146102aa578063461f3120146103a357600080fd5b806304937320146101e85780630a98b9bd146102285780630d2a2d441461024857600080fd5b366101e357005b600080fd5b3480156101f457600080fd5b506102156102033660046123d5565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023457600080fd5b5061021561024336600461245c565b6107be565b34801561025457600080fd5b50610268610263366004612643565b610b6d565b005b34801561027657600080fd5b50610268610285366004612680565b610ca7565b34801561029657600080fd5b506102686102a53660046126b9565b610d98565b3480156102b657600080fd5b506103376102c53660046123d5565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161021f565b3480156103af57600080fd5b506103d36103be3660046123d5565b60096020526000908152604090205460ff1681565b604051901515815260200161021f565b3480156103ef57600080fd5b506102156103fe366004612680565b600c1b90565b34801561041057600080fd5b5061026861041f3660046123d5565b610fd9565b34801561043057600080fd5b5061026861108f565b34801561044557600080fd5b506103d3610454366004612680565b600a6020526000908152604090205460ff1681565b34801561047557600080fd5b50610215670de0b6b3a764000081565b34801561049157600080fd5b506102686104a036600461272c565b611151565b3480156104b157600080fd5b506102686104c0366004612761565b611268565b3480156104d157600080fd5b506102156104e03660046123d5565b60066020526000908152604090205481565b3480156104fe57600080fd5b5061026861050d3660046127c5565b611747565b34801561051e57600080fd5b506103d361052d3660046127f1565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561055e57600080fd5b5061057361056d3660046123d5565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161021f565b3480156105a457600080fd5b506000546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105d157600080fd5b5061021560045481565b3480156105e757600080fd5b5061021560035481565b3480156105fd57600080fd5b506103d361060c3660046123d5565b60086020526000908152604090205460ff1681565b34801561062d57600080fd5b5061021561063c36600461282a565b600b60209081526000928352604080842090915290825290205481565b34801561066557600080fd5b506105736106743660046127f1565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106a557600080fd5b506102686106b436600461284f565b61180d565b3480156106c557600080fd5b506002546105739073ffffffffffffffffffffffffffffffffffffffff1681565b3480156106f257600080fd5b50610706610701366004612891565b611a50565b60405161021f91906128d8565b34801561071f57600080fd5b5061021561072e3660046127f1565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b34801561076a57600080fd5b5061026861077936600461291c565b611b2a565b34801561078a57600080fd5b50610268610799366004612680565b611c3a565b3480156107aa57600080fd5b506102686107b93660046129de565b611d06565b60006107c8611e02565b6107d2838361180d565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c61082c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff1687811015610893576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061089f8e600c1b90565b9050600060045460016108b29190612a69565b60008181526005602052604090206004015490915043116108ff576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c8152602001600354436109339190612a69565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610a7057600083815260066020526040902054610a40908b908b9033611e46565b610a4e848c84848988611e9e565b60048054906000610a5e83612a81565b91905055508195505050505050610b56565b68056bc75e2d63100000816060015111610a9257610a4e848c84848988611e9e565b33600c1b60009081526007602052604081205490610ac0610abb670de0b6b3a764000084612aba565b611ff9565b9050610ad4670de0b6b3a764000082612af5565b83606001511180610af2575069d3c21bcecceda10000008360600151115b15610b29576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b37868e86868b8a611e9e565b60048054906000610b4783612a81565b90915550939750505050505050505b610b5f60018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610c6b576000610c26848481518110610c1857610c18612b32565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610bf9565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610c9c9190612b61565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d28576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610dea576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e49576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610eac6bffffffffffffffffffffffff8a1683612a69565b1115610ee4576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610eec611e02565b8415610efc57610efc3386611747565b87878760ff81901b605f83901b610f138587612a69565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f648733306bffffffffffffffffffffffff8f166120b5565b610f6d60018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610c9c91815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314611110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b4761111b338261217f565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610c9c565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091529020548015611230576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611262565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611270611e02565b600086815260056020526040902060038101546112b9576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b43816004015410156112f7576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602083015260348201526054810186905260009060740160405160208183030381529060405280519060200120905060008160405160200161139a91907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561141f576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526114879060019060a0016020604051602081039080840390855afa158015611477573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166114d2576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906115079083612baf565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff909116146115f357600287015433600c1b60009081526007602052604081208054909190611599908490612a69565b9091555050600887015482906007906000906115cb9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546115e89190612a69565b9091555061162b9050565b8187600201546116039190612a69565b33600c1b60009081526007602052604081208054909190611625908490612a69565b90915550505b600687015461165290849073ffffffffffffffffffffffffffffffffffffffff16836121f9565b6002870154156116d857600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146116c957600787015460028801546116b191859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6121f9565b6116c4838d60018a60020154901c6121f9565b6116d8565b6116d8838d89600201546121f9565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a25050505050505061173f60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff82163314156117db57806006600061177485600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611a3a5760006005600086868681811061183157611831612b32565b9050602002013581526020019081526020016000209050611851816122b8565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906118b49083612a69565b11156118ec576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611936908490612a69565b909155505060006003830181905560088301546119699073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d6310000081116119ad57600082815260076020526040902068056bc75e2d6310000090556119bf565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611a0d57611a0d612b32565b90506020020135604051611a2391815260200190565b60405180910390a285600101955050505050611811565b808210156112625763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611a7257611a7261252d565b604051908082528060200260200182016040528015611a9b578160200160208202803683370190505b5090505b81831015611b21576000611af4878581518110611abe57611abe612b32565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611b0957611b09612b32565b60200260200101818152505083600101935050611a9f565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611bab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b815180611bc05763df9578836000526004601cfd5b81518114611bd65763ff633a386000526004601cfd5b60208301602083018260051b82015b80831461173f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611be5565b60005473ffffffffffffffffffffffffffffffffffffffff163314611cbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610bea565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610c9c565b611d0e611e02565b611d18828261180d565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c151560011415611d4e57611d4e846000611151565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff89168452909152902054611d9c906b3fffffffffffffffffffffff16858784612334565b611da78533866121f9565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061126260018055565b60015460021415611e3f576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b611e6884848473ffffffffffffffffffffffffffffffffffffffff8516612391565b611262576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160088401805483169184169190911790556101208601516009909301805490911692909116919091179055611f8d86868484612334565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea6592611fe992918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161201791815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826120ac5763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610bea565b5050505050565b600080600080600085875af19050806121f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610bea565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610bea565b43816004015411156122f6576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6003810154612331576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836123475763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8616845290915281208054859290612386908490612baf565b909155505050505050565b600083156123cd578360051b8501855b803580851160051b948552602094851852604060002093018181106123c5576123ca565b6123a1565b50505b501492915050565b6000602082840312156123e757600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461233157600080fd5b60008083601f84011261242257600080fd5b50813567ffffffffffffffff81111561243a57600080fd5b6020830191508360208260051b850101111561245557600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561247c57600080fd5b8a35612487816123ee565b995060208b0135612497816123ee565b985060408b01356124a7816123ee565b975060608b01356124b7816123ee565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156124e257600080fd5b6124ee8e838f01612410565b909650945060e08d013591508082111561250757600080fd5b506125148d828e01612410565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156125a3576125a361252d565b604052919050565b600067ffffffffffffffff8211156125c5576125c561252d565b5060051b60200190565b600082601f8301126125e057600080fd5b813560206125f56125f0836125ab565b61255c565b82815260059290921b8401810191818101908684111561261457600080fd5b8286015b8481101561263857803561262b816123ee565b8352918301918301612618565b509695505050505050565b60006020828403121561265557600080fd5b813567ffffffffffffffff81111561266c57600080fd5b612678848285016125cf565b949350505050565b60006020828403121561269257600080fd5b813561269d816123ee565b9392505050565b803580151581146126b457600080fd5b919050565b600080600080600060a086880312156126d157600080fd5b85356126dc816123ee565b945060208601356bffffffffffffffffffffffff811681146126fd57600080fd5b9350604086013561270d816123ee565b925061271b606087016126a4565b949793965091946080013592915050565b6000806040838503121561273f57600080fd5b823561274a816123ee565b9150612758602084016126a4565b90509250929050565b60008060008060008060c0878903121561277a57600080fd5b86359550602087013561278c816123ee565b945060408701359350606087013592506080870135915060a087013560ff811681146127b757600080fd5b809150509295509295509295565b600080604083850312156127d857600080fd5b82356127e3816123ee565b946020939093013593505050565b6000806040838503121561280457600080fd5b823561280f816123ee565b9150602083013561281f816123ee565b809150509250929050565b6000806040838503121561283d57600080fd5b82359150602083013561281f816123ee565b6000806020838503121561286257600080fd5b823567ffffffffffffffff81111561287957600080fd5b61288585828601612410565b90969095509350505050565b600080604083850312156128a457600080fd5b823567ffffffffffffffff8111156128bb57600080fd5b6128c7858286016125cf565b925050602083013561281f816123ee565b6020808252825182820181905260009190848201906040850190845b81811015612910578351835292840192918401916001016128f4565b50909695505050505050565b6000806040838503121561292f57600080fd5b823567ffffffffffffffff8082111561294757600080fd5b612953868387016125cf565b935060209150818501358181111561296a57600080fd5b85019050601f8101861361297d57600080fd5b803561298b6125f0826125ab565b81815260059190911b820183019083810190888311156129aa57600080fd5b928401925b828410156129cf576129c0846126a4565b825292840192908401906129af565b80955050505050509250929050565b600080600080606085870312156129f457600080fd5b84356129ff816123ee565b935060208501359250604085013567ffffffffffffffff811115612a2257600080fd5b612a2e87828801612410565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612a7c57612a7c612a3a565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ab357612ab3612a3a565b5060010190565b600082612af0577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b2d57612b2d612a3a565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561291057835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612b7d565b600082821015612bc157612bc1612a3a565b50039056fea164736f6c6343000809000a"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index 27cedde..29276a1 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -575,7 +575,7 @@ export interface P2PIX extends BaseContract { sellers: PromiseOrValue[], token: PromiseOrValue, overrides?: CallOverrides - ): Promise<[BigNumber[]] & { balances: BigNumber[] }>; + ): Promise<[BigNumber[]]>; getPixTarget( seller: PromiseOrValue, diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index 0e648f7..53c95c8 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -284,7 +284,6 @@ describe("P2PIX", () => { ); }); it("should revert if pixTarget is empty", async () => { - // const pTarget = ethers.BigNumber.from(7331); const root = ethers.utils.keccak256( ethers.utils.toUtf8Bytes("root"), ); @@ -338,6 +337,10 @@ describe("P2PIX", () => { owner.address, ); const allowList = await p2pix.sellerAllowList(ownerKey); + const balances = await p2pix.callStatic.getBalances( + [owner.address, acc01.address], + erc20.address, + ); expect(tx).to.be.ok; await expect(tx) @@ -352,6 +355,8 @@ describe("P2PIX", () => { expect(pixTarget).to.eq(pTarget); expect(valid).to.eq(true); expect(allowList).to.eq(root); + expect(balances[0]).to.eq(price); + expect(balances[1]).to.eq(zero); }); // edge case test it("should create multiple deposits", async () => { @@ -380,6 +385,7 @@ describe("P2PIX", () => { const price2 = price.mul(ethers.BigNumber.from(2)); const price3 = price.mul(ethers.BigNumber.from(3)); const price4 = price.mul(ethers.BigNumber.from(4)); + const prices:BigNumber[] = [price, price2, price3, price4]; await erc20.mint( getSignerAddrs(4, await ethers.getSigners()), price4, @@ -410,6 +416,9 @@ describe("P2PIX", () => { .connect(acc03) .deposit(erc20.address, price4, pTarget, false, nullRoot); + const balances = await p2pix.callStatic.getBalances( + [owner.address, acc01.address, acc02.address, acc03.address], erc20.address); + const storage1 = await p2pix.callStatic.getBalance(owner.address, erc20.address); const storage2 = await p2pix.callStatic.getBalance(acc01.address, erc20.address); const storage3 = await p2pix.callStatic.getBalance(acc02.address, erc20.address); @@ -478,6 +487,11 @@ describe("P2PIX", () => { [acc03.address, p2pix.address], ["-400000000000000000000", price4], ); + + expect(prices[0]).to.eq(balances[0]); + expect(prices[1]).to.eq(balances[1]); + expect(prices[2]).to.eq(balances[2]); + expect(prices[3]).to.eq(balances[3]); expect(storage1).to.eq(price); expect(pixTarget1).to.eq(pTarget); @@ -685,35 +699,35 @@ describe("P2PIX", () => { proof, [], ); - // const storage: Lock = await p2pix.callStatic.mapLocks(1); + const storage: Lock = await p2pix.callStatic.mapLocks(1); - // const rc: ContractReceipt = await tx.wait(); - // const expiration = rc.blockNumber + 10; - // const key = await p2pix.callStatic._castAddrToKey(owner.address); + const rc: ContractReceipt = await tx.wait(); + const expiration = rc.blockNumber + 10; + const key = await p2pix.callStatic._castAddrToKey(owner.address); - // await expect(tx) - // .to.emit(p2pix, "LockAdded") - // .withArgs( - // acc02.address, - // ethers.constants.One, - // key, - // price, - // ); - // expect(tx).to.be.ok; - // expect(storage.sellerKey).to.eq(key); - // expect(storage.counter).to.eq(1); - // expect(storage.relayerPremium).to.eq( - // ethers.constants.Zero, - // ); - // expect(storage.amount).to.eq(price); - // expect(storage.expirationBlock).to.eq(expiration); - // expect(storage.pixTarget).to.eq(target); - // expect(storage.buyerAddress).to.eq(acc02.address); - // expect(storage.relayerTarget).to.eq(acc03.address); - // expect(storage.relayerAddress).to.eq(acc01.address); - // expect(storage.token).to.eq(erc20.address); + await expect(tx) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + ethers.constants.One, + key, + price, + ); + expect(tx).to.be.ok; + expect(storage.sellerKey).to.eq(key); + expect(storage.counter).to.eq(1); + expect(storage.relayerPremium).to.eq( + ethers.constants.Zero, + ); + expect(storage.amount).to.eq(price); + expect(storage.expirationBlock).to.eq(expiration); + expect(storage.pixTarget).to.eq(target); + expect(storage.buyerAddress).to.eq(acc02.address); + expect(storage.relayerTarget).to.eq(acc03.address); + expect(storage.relayerAddress).to.eq(acc01.address); + expect(storage.token).to.eq(erc20.address); }); - it("should create a lock, update storage and emit events via the reputation path", async () => { + it("should create a lock, update storage and emit events via the reputation path 1", async () => { const root = ethers.constants.HashZero; const target = ethers.BigNumber.from(101); await erc20.approve(p2pix.address, price); @@ -741,8 +755,10 @@ describe("P2PIX", () => { const rc: ContractReceipt = await tx.wait(); const expiration = rc.blockNumber + 10; const key = await p2pix.callStatic._castAddrToKey(owner.address); + const castBack = await p2pix.callStatic._castKeyToAddr(key); expect(tx).to.be.ok; + expect(castBack).to.eq(owner.address); expect(storage.sellerKey).to.eq(key); expect(storage.counter).to.eq(1); expect(storage.relayerPremium).to.eq( @@ -765,6 +781,94 @@ describe("P2PIX", () => { storage.amount, ); }); + it("should create a lock, update storage and emit events via the reputation path 2", async () => { + const root = ethers.constants.HashZero; + const newPrice = price.mul(ethers.constants.Two).add(ethers.constants.One); + const endtoendID = ethers.constants.HashZero; + const target = ethers.BigNumber.from(101); + const messageToSign = ethers.utils.solidityKeccak256( + ["uint160", "uint256", "bytes32"], + [target, price, endtoendID], + ); + const messageHashBytes = + ethers.utils.arrayify(messageToSign); + const flatSig = await acc01.signMessage( + messageHashBytes, + ); + const sig = ethers.utils.splitSignature(flatSig); + await erc20.approve(p2pix.address, newPrice); + await p2pix.deposit( + erc20.address, + newPrice, + target, + true, + root, + ); + await p2pix + .connect(acc01) + .lock( + owner.address, + erc20.address, + acc02.address, + acc03.address, + price, + price, + [], + [], + ); + await p2pix + .connect(acc01) + .release( + 1, + acc02.address, + endtoendID, + sig.r, + sig.s, + sig.v, + ); + const tx = await p2pix + .connect(acc01) + .lock( + owner.address, + erc20.address, + acc02.address, + acc03.address, + 0, + price.add(ethers.constants.One), + [], + [], + ); + const storage: Lock = await p2pix.callStatic.mapLocks(2); + + const rc: ContractReceipt = await tx.wait(); + const expiration = rc.blockNumber + 10; + const key = await p2pix.callStatic._castAddrToKey(owner.address); + const castBack = await p2pix.callStatic._castKeyToAddr(key); + + expect(tx).to.be.ok; + expect(castBack).to.eq(owner.address); + expect(storage.sellerKey).to.eq(key); + expect(storage.counter).to.eq(2); + expect(storage.relayerPremium).to.eq( + ethers.constants.Zero, + ); + expect(storage.amount).to.eq(price.add(ethers.constants.One)); + expect(storage.expirationBlock).to.eq(expiration); + expect(storage.pixTarget).to.eq(target); + expect(storage.buyerAddress).to.eq(acc02.address); + expect(storage.relayerTarget).to.eq(acc03.address); + expect(storage.relayerAddress).to.eq(acc01.address); + expect(storage.token).to.eq(erc20.address); + + await expect(tx) + .to.emit(p2pix, "LockAdded") + .withArgs( + acc02.address, + 2, + key, + storage.amount, + ); + }); // edge case test it("should create multiple locks", async () => { const newPrice = price.div(ethers.BigNumber.from(2)); @@ -912,14 +1016,8 @@ describe("P2PIX", () => { }); describe("Set sellerBalance Valid State", async () => { it("should revert if sellerBalance hasn't been initialized", async () => { - // await erc20.approve(p2pix.address, price); - // await p2pix.deposit( - // erc20.address, - // price, - // "pixTarget", - // merkleRoot, - // ); const fail = p2pix.setValidState(erc20.address,false); + await expect(fail).to.be.revertedWithCustomError( p2pix, P2PixErrors.NotInitialized,