From 9d14f053d5fd58f34f68a9a10ce287421b4fd173 Mon Sep 17 00:00:00 2001 From: PedroCailleret Date: Sun, 14 May 2023 20:44:18 -0300 Subject: [PATCH] Rearchitected storage :card_file_box: --- .../DataTypes.sol/DataTypes.dbg.json | 2 +- .../EventAndErrors.dbg.json | 2 +- .../EventAndErrors.sol/EventAndErrors.json | 4 +- artifacts/contracts/p2pix.sol/P2PIX.dbg.json | 2 +- artifacts/contracts/p2pix.sol/P2PIX.json | 45 +-- contracts/DataTypes.sol | 3 +- contracts/EventAndErrors.sol | 16 +- contracts/p2pix.sol | 289 ++++++++++++------ src/types/EventAndErrors.ts | 10 +- .../factories/EventAndErrors__factory.ts | 4 +- .../factories/p2pix.sol/P2PIX__factory.ts | 43 +-- src/types/p2pix.sol/P2PIX.ts | 101 +++--- test/p2pix.test.ts | 58 +--- test/utils/fixtures.ts | 1 - 14 files changed, 303 insertions(+), 277 deletions(-) diff --git a/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json b/artifacts/contracts/DataTypes.sol/DataTypes.dbg.json index 66c6e2f..a2700c1 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/e4fd58ee172659ae7bbfbfbb00ad761b.json" + "buildInfo": "../../build-info/577d08e3f9a8a685ac15a7ca46572ea5.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.dbg.json index 66c6e2f..609b61c 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/e4fd58ee172659ae7bbfbfbb00ad761b.json" + "buildInfo": "../../build-info/e522f455f7b0dc000985ae9761f3041a.json" } diff --git a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json index 93e033c..0fc5321 100644 --- a/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json +++ b/artifacts/contracts/EventAndErrors.sol/EventAndErrors.json @@ -291,13 +291,13 @@ "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", "name": "seller", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "bytes32", "name": "merkleRoot", "type": "bytes32" diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index 66c6e2f..a2700c1 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/e4fd58ee172659ae7bbfbfbb00ad761b.json" + "buildInfo": "../../build-info/577d08e3f9a8a685ac15a7ca46572ea5.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index d0712e6..9176223 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -346,13 +346,13 @@ "anonymous": false, "inputs": [ { - "indexed": false, + "indexed": true, "internalType": "address", "name": "seller", "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "bytes32", "name": "merkleRoot", "type": "bytes32" @@ -454,7 +454,7 @@ "inputs": [ { "internalType": "contract ERC20", - "name": "", + "name": "erc20", "type": "address" } ], @@ -462,7 +462,7 @@ "outputs": [ { "internalType": "bool", - "name": "", + "name": "state", "type": "bool" } ], @@ -652,11 +652,6 @@ "name": "_buyerAddress", "type": "address" }, - { - "internalType": "address", - "name": "_relayerTarget", - "type": "address" - }, { "internalType": "uint256", "name": "_relayerPremium", @@ -747,11 +742,6 @@ "name": "buyerAddress", "type": "address" }, - { - "internalType": "address", - "name": "relayerTarget", - "type": "address" - }, { "internalType": "address", "name": "relayerAddress", @@ -786,11 +776,6 @@ "name": "lockID", "type": "uint256" }, - { - "internalType": "address", - "name": "_relayerTarget", - "type": "address" - }, { "internalType": "bytes32", "name": "pixTimestamp", @@ -834,7 +819,7 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "sellerKey", "type": "uint256" } ], @@ -842,7 +827,7 @@ "outputs": [ { "internalType": "bytes32", - "name": "", + "name": "root", "type": "bytes32" } ], @@ -853,12 +838,12 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "sellerKey", "type": "uint256" }, { "internalType": "contract ERC20", - "name": "", + "name": "erc20", "type": "address" } ], @@ -866,7 +851,7 @@ "outputs": [ { "internalType": "uint256", - "name": "", + "name": "packed", "type": "uint256" } ], @@ -996,7 +981,7 @@ "inputs": [ { "internalType": "bytes32", - "name": "", + "name": "message", "type": "bytes32" } ], @@ -1004,7 +989,7 @@ "outputs": [ { "internalType": "bool", - "name": "", + "name": "used", "type": "bool" } ], @@ -1034,7 +1019,7 @@ "inputs": [ { "internalType": "uint256", - "name": "", + "name": "signer", "type": "uint256" } ], @@ -1042,7 +1027,7 @@ "outputs": [ { "internalType": "bool", - "name": "", + "name": "valid", "type": "bool" } ], @@ -1084,8 +1069,8 @@ "type": "receive" } ], - "bytecode": "0x6080604052600180556040516200366e3803806200366e8339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b61304880620006266000396000f3fe6080604052600436106101e75760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d1461074c578063d6e8b97314610797578063f7d0e04b146107b7578063fb8c5ef0146107d757600080fd5b8063ad8f2eed14610692578063b0983d39146106d2578063c52164c6146106f2578063d1c070281461071f57600080fd5b80638db564c2116100d15780638db564c2146105fe5780639872dbfe1461061457806398a268711461062a5780639eee8d4b1461065a57600080fd5b80637f94f65d1461052b57806380e1d3021461054b57806384ab1d281461058b5780638da5cb5b146105d157600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104a25780636d82d9e0146104be57806374ba03a0146104de57806377cd38a4146104fe57600080fd5b80634b2ae9801461041c578063574983c81461043d5780635fd8c7101461045d57806369cc6af41461047257600080fd5b8063328a7181116101b6578063328a718114610295578063367821f0146102b5578063461f3120146103ae57806349ef8448146103ee57600080fd5b806304937320146101f35780630a98b9bd146102335780630d2a2d441461025357806313af40351461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046126f1565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061022061024e366004612778565b6107f7565b34801561025f57600080fd5b5061027361026e36600461295f565b610ba6565b005b34801561028157600080fd5b5061027361029036600461299c565b610ce0565b3480156102a157600080fd5b506102736102b03660046129d5565b610dd1565b3480156102c157600080fd5b506103426102d03660046126f1565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161022a565b3480156103ba57600080fd5b506103de6103c93660046126f1565b60096020526000908152604090205460ff1681565b604051901515815260200161022a565b3480156103fa57600080fd5b5061040e610409366004612a48565b611012565b60405161022a929190612b43565b34801561042857600080fd5b5061022061043736600461299c565b600c1b90565b34801561044957600080fd5b506102736104583660046126f1565b6112f5565b34801561046957600080fd5b506102736113ab565b34801561047e57600080fd5b506103de61048d36600461299c565b600a6020526000908152604090205460ff1681565b3480156104ae57600080fd5b50610220670de0b6b3a764000081565b3480156104ca57600080fd5b506102736104d9366004612bd2565b61146d565b3480156104ea57600080fd5b506102736104f9366004612c07565b611584565b34801561050a57600080fd5b506102206105193660046126f1565b60066020526000908152604090205481565b34801561053757600080fd5b50610273610546366004612c6b565b611a63565b34801561055757600080fd5b506103de610566366004612c97565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561059757600080fd5b506105ac6105a63660046126f1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b3480156105dd57600080fd5b506000546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561060a57600080fd5b5061022060045481565b34801561062057600080fd5b5061022060035481565b34801561063657600080fd5b506103de6106453660046126f1565b60086020526000908152604090205460ff1681565b34801561066657600080fd5b50610220610675366004612cd0565b600b60209081526000928352604080842090915290825290205481565b34801561069e57600080fd5b506105ac6106ad366004612c97565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106de57600080fd5b506102736106ed366004612cf5565b611b29565b3480156106fe57600080fd5b506002546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561072b57600080fd5b5061073f61073a366004612d2b565b611d6c565b60405161022a9190612d72565b34801561075857600080fd5b50610220610767366004612c97565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b3480156107a357600080fd5b506102736107b2366004612d85565b611e46565b3480156107c357600080fd5b506102736107d236600461299c565b611f56565b3480156107e357600080fd5b506102736107f2366004612e47565b612022565b600061080161211e565b61080b8383611b29565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c610865576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff16878110156108cc576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108d88e600c1b90565b9050600060045460016108eb9190612ed2565b6000818152600560205260409020600401549091504311610938576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c81526020016003544361096c9190612ed2565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610aa957600083815260066020526040902054610a79908b908b9033612162565b610a87848c848489886121ba565b60048054906000610a9783612eea565b91905055508195505050505050610b8f565b68056bc75e2d63100000816060015111610acb57610a87848c848489886121ba565b33600c1b60009081526007602052604081205490610af9610af4670de0b6b3a764000084612f23565b612315565b9050610b0d670de0b6b3a764000082612f5e565b83606001511180610b2b575069d3c21bcecceda10000008360600151115b15610b62576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b70868e86868b8a6121ba565b60048054906000610b8083612eea565b90915550939750505050505050505b610b9860018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610ca4576000610c5f848481518110610c5157610c51612f9b565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610c32565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610cd59190612fca565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610e23576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e82576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610ee56bffffffffffffffffffffffff8a1683612ed2565b1115610f1d576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f2561211e565b8415610f3557610f353386611a63565b87878760ff81901b605f83901b610f4c8587612ed2565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f9d8733306bffffffffffffffffffffffff8f166123d1565b610fa660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60608082516000141561103d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff81111561105c5761105c612849565b604051908082528060200260200182016040528015611085578160200160208202803683370190505b50905060008267ffffffffffffffff8111156110a3576110a3612849565b6040519080825280602002602001820160405280156110cc578160200160208202803683370190505b5090505b828410156112e957600560008886815181106110ee576110ee612f9b565b6020026020010151815260200190815260200160002060000154600014156111965786848151811061112257611122612f9b565b602002602001015182858151811061113c5761113c612f9b565b602002602001018181525050600081858151811061115c5761115c612f9b565b6020026020010190600381111561117557611175612b14565b9081600381111561118857611188612b14565b9052506001909301926110d0565b600560008886815181106111ac576111ac612f9b565b60200260200101518152602001908152602001600020600301546000141561121a578684815181106111e0576111e0612f9b565b60200260200101518285815181106111fa576111fa612f9b565b602002602001018181525050600381858151811061115c5761115c612f9b565b436005600089878151811061123157611231612f9b565b6020026020010151815260200190815260200160002060040154101561129d5786848151811061126357611263612f9b565b602002602001015182858151811061127d5761127d612f9b565b602002602001018181525050600281858151811061115c5761115c612f9b565b8684815181106112af576112af612f9b565b60200260200101518285815181106112c9576112c9612f9b565b602002602001018181525050600181858151811061115c5761115c612f9b565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610cd591815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b47611437338261249b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610cd5565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054801561154c576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a25061157e565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61158c61211e565b600086815260056020526040902060038101546115d5576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611613576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016116b691907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561173b576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526117a39060019060a0016020604051602081039080840390855afa158015611793573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166117ee576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118239083613024565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff9091161461190f57600287015433600c1b600090815260076020526040812080549091906118b5908490612ed2565b9091555050600887015482906007906000906118e79073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119049190612ed2565b909155506119479050565b81876002015461191f9190612ed2565b33600c1b60009081526007602052604081208054909190611941908490612ed2565b90915550505b600687015461196e90849073ffffffffffffffffffffffffffffffffffffffff1683612515565b6002870154156119f457600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146119e557600787015460028801546119cd91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c612515565b6119e0838d60018a60020154901c612515565b6119f4565b6119f4838d8960020154612515565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611a5b60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216331415611af7578060066000611a9085600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611d5657600060056000868686818110611b4d57611b4d612f9b565b9050602002013581526020019081526020016000209050611b6d816125d4565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e400000090611bd09083612ed2565b1115611c08576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611c52908490612ed2565b90915550506000600383018190556008830154611c859073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d631000008111611cc957600082815260076020526040902068056bc75e2d631000009055611cdb565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611d2957611d29612f9b565b90506020020135604051611d3f91815260200190565b60405180910390a285600101955050505050611b2d565b8082101561157e5763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611d8e57611d8e612849565b604051908082528060200260200182016040528015611db7578160200160208202803683370190505b5090505b81831015611e3d576000611e10878581518110611dda57611dda612f9b565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611e2557611e25612f9b565b60200260200101818152505083600101935050611dbb565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b815180611edc5763df9578836000526004601cfd5b81518114611ef25763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611a5b578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611f01565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610cd5565b61202a61211e565b6120348282611b29565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c15156001141561206a5761206a84600061146d565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529020546120b8906b3fffffffffffffffffffffff16858784612650565b6120c3853386612515565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061157e60018055565b6001546002141561215b576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b61218484848473ffffffffffffffffffffffffffffffffffffffff85166126ad565b61157e576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e08601516007840180548316918416919091179055610100860151600884018054831691841691909117905561012086015160099093018054909116929091169190911790556122a986868484612650565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261230592918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161233391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826123c85763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610c23565b5050505050565b600080600080600085875af1905080612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610c23565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610c23565b4381600401541115612612576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461264d576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836126635763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906126a2908490613024565b909155505050505050565b600083156126e9578360051b8501855b803580851160051b948552602094851852604060002093018181106126e1576126e6565b6126bd565b50505b501492915050565b60006020828403121561270357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461264d57600080fd5b60008083601f84011261273e57600080fd5b50813567ffffffffffffffff81111561275657600080fd5b6020830191508360208260051b850101111561277157600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561279857600080fd5b8a356127a38161270a565b995060208b01356127b38161270a565b985060408b01356127c38161270a565b975060608b01356127d38161270a565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156127fe57600080fd5b61280a8e838f0161272c565b909650945060e08d013591508082111561282357600080fd5b506128308d828e0161272c565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128bf576128bf612849565b604052919050565b600067ffffffffffffffff8211156128e1576128e1612849565b5060051b60200190565b600082601f8301126128fc57600080fd5b8135602061291161290c836128c7565b612878565b82815260059290921b8401810191818101908684111561293057600080fd5b8286015b848110156129545780356129478161270a565b8352918301918301612934565b509695505050505050565b60006020828403121561297157600080fd5b813567ffffffffffffffff81111561298857600080fd5b612994848285016128eb565b949350505050565b6000602082840312156129ae57600080fd5b81356129b98161270a565b9392505050565b803580151581146129d057600080fd5b919050565b600080600080600060a086880312156129ed57600080fd5b85356129f88161270a565b945060208601356bffffffffffffffffffffffff81168114612a1957600080fd5b93506040860135612a298161270a565b9250612a37606087016129c0565b949793965091946080013592915050565b60006020808385031215612a5b57600080fd5b823567ffffffffffffffff811115612a7257600080fd5b8301601f81018513612a8357600080fd5b8035612a9161290c826128c7565b81815260059190911b82018301908381019087831115612ab057600080fd5b928401925b82841015612ace57833582529284019290840190612ab5565b979650505050505050565b600081518084526020808501945080840160005b83811015612b0957815187529582019590820190600101612aed565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604081526000612b566040830185612ad9565b8281036020848101919091528451808352858201928201906000805b82811015612bc45785516004808210612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612b72565b509198975050505050505050565b60008060408385031215612be557600080fd5b8235612bf08161270a565b9150612bfe602084016129c0565b90509250929050565b60008060008060008060c08789031215612c2057600080fd5b863595506020870135612c328161270a565b945060408701359350606087013592506080870135915060a087013560ff81168114612c5d57600080fd5b809150509295509295509295565b60008060408385031215612c7e57600080fd5b8235612c898161270a565b946020939093013593505050565b60008060408385031215612caa57600080fd5b8235612cb58161270a565b91506020830135612cc58161270a565b809150509250929050565b60008060408385031215612ce357600080fd5b823591506020830135612cc58161270a565b60008060208385031215612d0857600080fd5b823567ffffffffffffffff811115612d1f57600080fd5b6112e98582860161272c565b60008060408385031215612d3e57600080fd5b823567ffffffffffffffff811115612d5557600080fd5b612d61858286016128eb565b9250506020830135612cc58161270a565b6020815260006129b96020830184612ad9565b60008060408385031215612d9857600080fd5b823567ffffffffffffffff80821115612db057600080fd5b612dbc868387016128eb565b9350602091508185013581811115612dd357600080fd5b85019050601f81018613612de657600080fd5b8035612df461290c826128c7565b81815260059190911b82018301908381019088831115612e1357600080fd5b928401925b82841015612e3857612e29846129c0565b82529284019290840190612e18565b80955050505050509250929050565b60008060008060608587031215612e5d57600080fd5b8435612e688161270a565b935060208501359250604085013567ffffffffffffffff811115612e8b57600080fd5b612e978782880161272c565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612ee557612ee5612ea3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f1c57612f1c612ea3565b5060010190565b600082612f59577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f9657612f96612ea3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561301857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612fe6565b50909695505050505050565b60008282101561303657613036612ea3565b50039056fea164736f6c6343000809000a", - "deployedBytecode": "0x6080604052600436106101e75760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d1461074c578063d6e8b97314610797578063f7d0e04b146107b7578063fb8c5ef0146107d757600080fd5b8063ad8f2eed14610692578063b0983d39146106d2578063c52164c6146106f2578063d1c070281461071f57600080fd5b80638db564c2116100d15780638db564c2146105fe5780639872dbfe1461061457806398a268711461062a5780639eee8d4b1461065a57600080fd5b80637f94f65d1461052b57806380e1d3021461054b57806384ab1d281461058b5780638da5cb5b146105d157600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104a25780636d82d9e0146104be57806374ba03a0146104de57806377cd38a4146104fe57600080fd5b80634b2ae9801461041c578063574983c81461043d5780635fd8c7101461045d57806369cc6af41461047257600080fd5b8063328a7181116101b6578063328a718114610295578063367821f0146102b5578063461f3120146103ae57806349ef8448146103ee57600080fd5b806304937320146101f35780630a98b9bd146102335780630d2a2d441461025357806313af40351461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046126f1565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061022061024e366004612778565b6107f7565b34801561025f57600080fd5b5061027361026e36600461295f565b610ba6565b005b34801561028157600080fd5b5061027361029036600461299c565b610ce0565b3480156102a157600080fd5b506102736102b03660046129d5565b610dd1565b3480156102c157600080fd5b506103426102d03660046126f1565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161022a565b3480156103ba57600080fd5b506103de6103c93660046126f1565b60096020526000908152604090205460ff1681565b604051901515815260200161022a565b3480156103fa57600080fd5b5061040e610409366004612a48565b611012565b60405161022a929190612b43565b34801561042857600080fd5b5061022061043736600461299c565b600c1b90565b34801561044957600080fd5b506102736104583660046126f1565b6112f5565b34801561046957600080fd5b506102736113ab565b34801561047e57600080fd5b506103de61048d36600461299c565b600a6020526000908152604090205460ff1681565b3480156104ae57600080fd5b50610220670de0b6b3a764000081565b3480156104ca57600080fd5b506102736104d9366004612bd2565b61146d565b3480156104ea57600080fd5b506102736104f9366004612c07565b611584565b34801561050a57600080fd5b506102206105193660046126f1565b60066020526000908152604090205481565b34801561053757600080fd5b50610273610546366004612c6b565b611a63565b34801561055757600080fd5b506103de610566366004612c97565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561059757600080fd5b506105ac6105a63660046126f1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b3480156105dd57600080fd5b506000546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561060a57600080fd5b5061022060045481565b34801561062057600080fd5b5061022060035481565b34801561063657600080fd5b506103de6106453660046126f1565b60086020526000908152604090205460ff1681565b34801561066657600080fd5b50610220610675366004612cd0565b600b60209081526000928352604080842090915290825290205481565b34801561069e57600080fd5b506105ac6106ad366004612c97565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106de57600080fd5b506102736106ed366004612cf5565b611b29565b3480156106fe57600080fd5b506002546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561072b57600080fd5b5061073f61073a366004612d2b565b611d6c565b60405161022a9190612d72565b34801561075857600080fd5b50610220610767366004612c97565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b3480156107a357600080fd5b506102736107b2366004612d85565b611e46565b3480156107c357600080fd5b506102736107d236600461299c565b611f56565b3480156107e357600080fd5b506102736107f2366004612e47565b612022565b600061080161211e565b61080b8383611b29565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c610865576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff16878110156108cc576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108d88e600c1b90565b9050600060045460016108eb9190612ed2565b6000818152600560205260409020600401549091504311610938576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c81526020016003544361096c9190612ed2565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610aa957600083815260066020526040902054610a79908b908b9033612162565b610a87848c848489886121ba565b60048054906000610a9783612eea565b91905055508195505050505050610b8f565b68056bc75e2d63100000816060015111610acb57610a87848c848489886121ba565b33600c1b60009081526007602052604081205490610af9610af4670de0b6b3a764000084612f23565b612315565b9050610b0d670de0b6b3a764000082612f5e565b83606001511180610b2b575069d3c21bcecceda10000008360600151115b15610b62576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b70868e86868b8a6121ba565b60048054906000610b8083612eea565b90915550939750505050505050505b610b9860018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610ca4576000610c5f848481518110610c5157610c51612f9b565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610c32565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610cd59190612fca565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610e23576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e82576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610ee56bffffffffffffffffffffffff8a1683612ed2565b1115610f1d576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f2561211e565b8415610f3557610f353386611a63565b87878760ff81901b605f83901b610f4c8587612ed2565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f9d8733306bffffffffffffffffffffffff8f166123d1565b610fa660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60608082516000141561103d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff81111561105c5761105c612849565b604051908082528060200260200182016040528015611085578160200160208202803683370190505b50905060008267ffffffffffffffff8111156110a3576110a3612849565b6040519080825280602002602001820160405280156110cc578160200160208202803683370190505b5090505b828410156112e957600560008886815181106110ee576110ee612f9b565b6020026020010151815260200190815260200160002060000154600014156111965786848151811061112257611122612f9b565b602002602001015182858151811061113c5761113c612f9b565b602002602001018181525050600081858151811061115c5761115c612f9b565b6020026020010190600381111561117557611175612b14565b9081600381111561118857611188612b14565b9052506001909301926110d0565b600560008886815181106111ac576111ac612f9b565b60200260200101518152602001908152602001600020600301546000141561121a578684815181106111e0576111e0612f9b565b60200260200101518285815181106111fa576111fa612f9b565b602002602001018181525050600381858151811061115c5761115c612f9b565b436005600089878151811061123157611231612f9b565b6020026020010151815260200190815260200160002060040154101561129d5786848151811061126357611263612f9b565b602002602001015182858151811061127d5761127d612f9b565b602002602001018181525050600281858151811061115c5761115c612f9b565b8684815181106112af576112af612f9b565b60200260200101518285815181106112c9576112c9612f9b565b602002602001018181525050600181858151811061115c5761115c612f9b565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610cd591815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b47611437338261249b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610cd5565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054801561154c576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a25061157e565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61158c61211e565b600086815260056020526040902060038101546115d5576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611613576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016116b691907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561173b576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526117a39060019060a0016020604051602081039080840390855afa158015611793573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166117ee576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118239083613024565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff9091161461190f57600287015433600c1b600090815260076020526040812080549091906118b5908490612ed2565b9091555050600887015482906007906000906118e79073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119049190612ed2565b909155506119479050565b81876002015461191f9190612ed2565b33600c1b60009081526007602052604081208054909190611941908490612ed2565b90915550505b600687015461196e90849073ffffffffffffffffffffffffffffffffffffffff1683612515565b6002870154156119f457600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146119e557600787015460028801546119cd91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c612515565b6119e0838d60018a60020154901c612515565b6119f4565b6119f4838d8960020154612515565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611a5b60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216331415611af7578060066000611a9085600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611d5657600060056000868686818110611b4d57611b4d612f9b565b9050602002013581526020019081526020016000209050611b6d816125d4565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e400000090611bd09083612ed2565b1115611c08576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611c52908490612ed2565b90915550506000600383018190556008830154611c859073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d631000008111611cc957600082815260076020526040902068056bc75e2d631000009055611cdb565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611d2957611d29612f9b565b90506020020135604051611d3f91815260200190565b60405180910390a285600101955050505050611b2d565b8082101561157e5763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611d8e57611d8e612849565b604051908082528060200260200182016040528015611db7578160200160208202803683370190505b5090505b81831015611e3d576000611e10878581518110611dda57611dda612f9b565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611e2557611e25612f9b565b60200260200101818152505083600101935050611dbb565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b815180611edc5763df9578836000526004601cfd5b81518114611ef25763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611a5b578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611f01565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610cd5565b61202a61211e565b6120348282611b29565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c15156001141561206a5761206a84600061146d565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529020546120b8906b3fffffffffffffffffffffff16858784612650565b6120c3853386612515565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061157e60018055565b6001546002141561215b576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b61218484848473ffffffffffffffffffffffffffffffffffffffff85166126ad565b61157e576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e08601516007840180548316918416919091179055610100860151600884018054831691841691909117905561012086015160099093018054909116929091169190911790556122a986868484612650565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261230592918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161233391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826123c85763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610c23565b5050505050565b600080600080600085875af1905080612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610c23565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610c23565b4381600401541115612612576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461264d576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836126635763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906126a2908490613024565b909155505050505050565b600083156126e9578360051b8501855b803580851160051b948552602094851852604060002093018181106126e1576126e6565b6126bd565b50505b501492915050565b60006020828403121561270357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461264d57600080fd5b60008083601f84011261273e57600080fd5b50813567ffffffffffffffff81111561275657600080fd5b6020830191508360208260051b850101111561277157600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561279857600080fd5b8a356127a38161270a565b995060208b01356127b38161270a565b985060408b01356127c38161270a565b975060608b01356127d38161270a565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156127fe57600080fd5b61280a8e838f0161272c565b909650945060e08d013591508082111561282357600080fd5b506128308d828e0161272c565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128bf576128bf612849565b604052919050565b600067ffffffffffffffff8211156128e1576128e1612849565b5060051b60200190565b600082601f8301126128fc57600080fd5b8135602061291161290c836128c7565b612878565b82815260059290921b8401810191818101908684111561293057600080fd5b8286015b848110156129545780356129478161270a565b8352918301918301612934565b509695505050505050565b60006020828403121561297157600080fd5b813567ffffffffffffffff81111561298857600080fd5b612994848285016128eb565b949350505050565b6000602082840312156129ae57600080fd5b81356129b98161270a565b9392505050565b803580151581146129d057600080fd5b919050565b600080600080600060a086880312156129ed57600080fd5b85356129f88161270a565b945060208601356bffffffffffffffffffffffff81168114612a1957600080fd5b93506040860135612a298161270a565b9250612a37606087016129c0565b949793965091946080013592915050565b60006020808385031215612a5b57600080fd5b823567ffffffffffffffff811115612a7257600080fd5b8301601f81018513612a8357600080fd5b8035612a9161290c826128c7565b81815260059190911b82018301908381019087831115612ab057600080fd5b928401925b82841015612ace57833582529284019290840190612ab5565b979650505050505050565b600081518084526020808501945080840160005b83811015612b0957815187529582019590820190600101612aed565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604081526000612b566040830185612ad9565b8281036020848101919091528451808352858201928201906000805b82811015612bc45785516004808210612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612b72565b509198975050505050505050565b60008060408385031215612be557600080fd5b8235612bf08161270a565b9150612bfe602084016129c0565b90509250929050565b60008060008060008060c08789031215612c2057600080fd5b863595506020870135612c328161270a565b945060408701359350606087013592506080870135915060a087013560ff81168114612c5d57600080fd5b809150509295509295509295565b60008060408385031215612c7e57600080fd5b8235612c898161270a565b946020939093013593505050565b60008060408385031215612caa57600080fd5b8235612cb58161270a565b91506020830135612cc58161270a565b809150509250929050565b60008060408385031215612ce357600080fd5b823591506020830135612cc58161270a565b60008060208385031215612d0857600080fd5b823567ffffffffffffffff811115612d1f57600080fd5b6112e98582860161272c565b60008060408385031215612d3e57600080fd5b823567ffffffffffffffff811115612d5557600080fd5b612d61858286016128eb565b9250506020830135612cc58161270a565b6020815260006129b96020830184612ad9565b60008060408385031215612d9857600080fd5b823567ffffffffffffffff80821115612db057600080fd5b612dbc868387016128eb565b9350602091508185013581811115612dd357600080fd5b85019050601f81018613612de657600080fd5b8035612df461290c826128c7565b81815260059190911b82018301908381019088831115612e1357600080fd5b928401925b82841015612e3857612e29846129c0565b82529284019290840190612e18565b80955050505050509250929050565b60008060008060608587031215612e5d57600080fd5b8435612e688161270a565b935060208501359250604085013567ffffffffffffffff811115612e8b57600080fd5b612e978782880161272c565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612ee557612ee5612ea3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f1c57612f1c612ea3565b5060010190565b600082612f59577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f9657612f96612ea3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561301857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612fe6565b50909695505050505050565b60008282101561303657613036612ea3565b50039056fea164736f6c6343000809000a", + "bytecode": "0x6080604052600180556040516200331c3803806200331c8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612d4380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a", + "deployedBytecode": "0x6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/DataTypes.sol b/contracts/DataTypes.sol index 656094c..fa7f678 100644 --- a/contracts/DataTypes.sol +++ b/contracts/DataTypes.sol @@ -14,9 +14,8 @@ library DataTypes { uint160 pixTarget; /// @dev Where the tokens are sent the when order gets validated. address buyerAddress; - /// @dev Relayer's target address that receives `relayerPremium` funds. - address relayerTarget; /// @dev Relayer address (msg.sender) that facilitated this transaction. + /// @dev Relayer's target address that receives `relayerPremium` funds. /// @dev Reputation points accruer. address relayerAddress; address token; diff --git a/contracts/EventAndErrors.sol b/contracts/EventAndErrors.sol index 7f46f4c..d59364f 100644 --- a/contracts/EventAndErrors.sol +++ b/contracts/EventAndErrors.sol @@ -5,51 +5,63 @@ pragma solidity 0.8.9; interface EventAndErrors { /// ███ Events ████████████████████████████████████████████████████████████ + /// @dev 0x63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf event DepositAdded( address indexed seller, // uint256 depositID, address token, uint256 amount ); + /// @dev 0xca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49 event ValidSet( address indexed seller, address token, bool state ); + /// @dev 0x2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e event DepositWithdrawn( address indexed seller, address token, uint256 amount ); + /// @dev 0x8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea65 event LockAdded( address indexed buyer, uint256 indexed lockID, uint256 seller, uint256 amount ); + /// @dev 0x364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8 event LockReleased( address indexed buyer, uint256 lockId, uint256 amount ); + /// @dev 0x830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5 event LockReturned( address indexed buyer, uint256 lockId ); + /// @dev 0xeaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d event FundsWithdrawn( address owner, uint256 amount ); + /// @dev 0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632 event RootUpdated( - address seller, - bytes32 merkleRoot + address indexed seller, + bytes32 indexed merkleRoot ); + /// @dev 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a event AllowedERC20Updated( address indexed token, bool indexed state ); + /// @dev 0xe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f event ReputationUpdated(address reputation); + /// @dev 0x70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511 event LockBlocksUpdated(uint256 blocks); + /// @dev 0x14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7 event ValidSignersUpdated(address[] signers); /// ███ Errors ████████████████████████████████████████████████████████████ diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index bd7ce23..7e3601c 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -30,6 +30,28 @@ contract P2PIX is /// ███ Constants ██████████████████████████████████████████████████████████ + uint256 private constant _ROOT_UPDATED_EVENT_SIGNATURE = + 0x0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632; + uint256 private constant _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE = + 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a; + + /// @dev Seller casted to key => Seller's allowlist merkleroot. + /// mapping(uint256 => bytes32) public sellerAllowList; + uint256 private constant _SELLER_ALLOWLIST_SLOT_SEED = 0x74dfee70; + /// @dev Tokens allowed to serve as the underlying amount of a deposit. + /// mapping(ERC20 => bool) public allowedERC20s; + uint256 private constant _ALLOWED_ERC20_SLOT_SEED = 0xcbc9d1c4; + + // BITS LAYOUT + // `uint96` [0...94] := balance + // `uint160` [95...254] := pixTarget + // `bool` [255] := valid + + /// @dev `balance` max. value = 10**26. + /// @dev `pixTarget` keys are restricted to 160 bits. + // mapping(uint256 => mapping(ERC20 => uint256)) public sellerBalance; + uint256 private constant _SELLER_BALANCE_SLOT_SEED = 0x739094b1; + /// @dev The bitmask of `sellerBalance` entry. uint256 private constant BITMASK_SB_ENTRY = (1 << 94) - 1; /// @dev The bit position of `pixTarget` in `sellerBalance`. @@ -38,11 +60,22 @@ contract P2PIX is uint256 private constant BITPOS_VALID = 255; /// @dev The bitmask of all 256 bits of `sellerBalance` except for the last one. uint256 private constant BITMASK_VALID = (1 << 255) - 1; + /// @dev The scalar of BRZ token. uint256 public constant WAD = 1e18; /// ███ Storage ████████████████████████████████████████████████████████████ + /// @dev List of valid Bacen signature addresses + /// @dev Value in custom storage slot given by: + /// let slot := sload(shl(12, address)). + // mapping(uint256 => bool) public validBacenSigners; + + /// @dev List of Pix transactions already signed. + /// @dev Value in custom storage slot given by: + /// let slot := sload(bytes32). + // mapping(bytes32 => bool) public usedTransactions; + IReputation public reputation; /// @dev Default blocks that lock will hold tokens. @@ -51,26 +84,8 @@ contract P2PIX is /// @dev List of Locks. mapping(uint256 => DT.Lock) public mapLocks; - /// @dev Seller casted to key => Seller's allowlist merkleroot. - mapping(uint256 => bytes32) public sellerAllowList; /// @dev Stores an relayer's last computed credit. mapping(uint256 => uint256) public userRecord; - /// @dev List of valid Bacen signature addresses - mapping(uint256 => bool) public validBacenSigners; - /// @dev List of Pix transactions already signed. - mapping(bytes32 => bool) public usedTransactions; - /// @dev Tokens allowed to serve as the underlying amount of a deposit. - mapping(ERC20 => bool) public allowedERC20s; - - // BITS LAYOUT - // `uint96` [0...94] := balance - // `uint160` [95...254] := pixTarget - // `bool` [255] := valid - - /// @dev `balance` max. value = 10**26. - /// @dev `pixTarget` keys are restricted to 160 bits. - mapping(uint256 => mapping(ERC20 => uint256)) - public sellerBalance; /// ███ Constructor ████████████████████████████████████████████████████████ @@ -107,8 +122,8 @@ contract P2PIX is uint256 k = _castAddrToKey(msg.sender); if (_pixTarget == 0) revert EmptyPixTarget(); - if (!allowedERC20s[t]) revert TokenDenied(); - uint256 _sellerBalance = sellerBalance[k][t]; + if (!allowedERC20s(t)) revert TokenDenied(); + uint256 _sellerBalance = sellerBalance(k,t); uint256 currBal = _sellerBalance & BITMASK_SB_ENTRY; if ((currBal + _amount) > 1e8 ether) @@ -129,10 +144,13 @@ contract P2PIX is validCasted ) = _castToUint(_amount, _pixTarget, _valid); - sellerBalance[k][t] = - (currBal + amountCasted) | + _setSellerBalance( + k, + t, + ((currBal + amountCasted) | (pixTargetCasted << BITPOS_PIXTARGET) | - (validCasted << BITPOS_VALID); + (validCasted << BITPOS_VALID)) + ); SafeTransferLib.safeTransferFrom( t, @@ -152,7 +170,7 @@ contract P2PIX is /// @dev Function sighash: 0x72fada5c. function setValidState(ERC20 token, bool state) public { uint256 key = _castAddrToKey(msg.sender); - uint256 _sellerBalance = sellerBalance[key][token]; + uint256 _sellerBalance = sellerBalance(key, token); if (_sellerBalance != 0) { uint256 _valid; @@ -164,7 +182,7 @@ contract P2PIX is (_sellerBalance & BITMASK_VALID) | (_valid << BITPOS_VALID); - sellerBalance[key][token] = _sellerBalance; + _setSellerBalance(key, token, _sellerBalance); emit ValidSet(msg.sender, address(token), state); } else revert NotInitialized(); @@ -179,7 +197,6 @@ contract P2PIX is /// from the total `remaining` value. /// @dev Locks can only be performed in valid orders. /// @param _buyerAddress The address of the buyer of a `_depositID`. - /// @param _relayerTarget Target address entitled to the `relayerPremium`. /// @param _relayerPremium The refund/premium owed to a relayer. /// @param _amount The deposit's remaining amount wished to be locked. /// @param merkleProof This value should be: @@ -193,7 +210,7 @@ contract P2PIX is address _seller, address _token, address _buyerAddress, - address _relayerTarget, + // address _relayerTarget, uint256 _relayerPremium, uint256 _amount, bytes32[] calldata merkleProof, @@ -221,17 +238,17 @@ contract P2PIX is _relayerPremium, _amount, (block.number + defaultLockBlocks), - uint160(sellerBalance[k][t] >> BITPOS_PIXTARGET), + uint160(sellerBalance(k, t) >> BITPOS_PIXTARGET), _buyerAddress, - _relayerTarget, + // _relayerTarget, msg.sender, address(t) ); if (merkleProof.length != 0) { - merkleVerify( + _merkleVerify( merkleProof, - sellerAllowList[k], + sellerAllowList(k), msg.sender ); @@ -283,11 +300,10 @@ 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 `relayerPremium`. /// @dev Function sighash: 0x4e1389ed. function release( uint256 lockID, - address _relayerTarget, + // address _relayerTarget, bytes32 pixTimestamp, bytes32 r, bytes32 s, @@ -313,14 +329,14 @@ contract P2PIX is ) ); - if (usedTransactions[message] == true) + if (usedTransactions(message) == true) revert TxAlreadyUsed(); uint256 signer = _castAddrToKey( ecrecover(messageDigest, v, r, s) ); - if (!validBacenSigners[signer]) + if (!validBacenSigners(signer)) revert InvalidSigner(); ERC20 t = ERC20(l.token); @@ -331,7 +347,7 @@ contract P2PIX is l.amount = 0; l.expirationBlock = 0; - usedTransactions[message] = true; + _setUsedTransactions(message); if (msg.sender != l.relayerAddress) { userRecord[_castAddrToKey(msg.sender)] += l @@ -352,21 +368,21 @@ contract P2PIX is // Method doesn't check for zero address. if (l.relayerPremium != 0) { - if (_relayerTarget != l.relayerTarget) { + if (msg.sender != l.relayerAddress) { SafeTransferLib.safeTransfer( t, - l.relayerTarget, + l.relayerAddress, (l.relayerPremium >> 1) ); SafeTransferLib.safeTransfer( t, - _relayerTarget, + msg.sender, (l.relayerPremium >> 1) ); } else { SafeTransferLib.safeTransfer( t, - _relayerTarget, + msg.sender, l.relayerPremium ); } @@ -392,15 +408,12 @@ contract P2PIX is _notExpired(l); - uint256 _sellerBalance = sellerBalance[ - l.sellerKey - ][ERC20(l.token)] & BITMASK_SB_ENTRY; + uint256 _sellerBalance = sellerBalance(l.sellerKey, ERC20(l.token)) & BITMASK_SB_ENTRY; if ((_sellerBalance + l.amount) > 1e8 ether) revert MaxBalExceeded(); - sellerBalance[l.sellerKey][ERC20(l.token)] += l - .amount; + _addSellerBalance(l.sellerKey, ERC20(l.token), l.amount); l.amount = 0; @@ -448,7 +461,7 @@ contract P2PIX is uint256 key = _castAddrToKey(msg.sender); _decBal( - (sellerBalance[key][token] & BITMASK_SB_ENTRY), + (sellerBalance(key, token) & BITMASK_SB_ENTRY), amount, token, key @@ -471,14 +484,30 @@ contract P2PIX is function setRoot(address addr, bytes32 merkleroot) public { - if (addr == msg.sender) { - sellerAllowList[ - _castAddrToKey(addr) - ] = merkleroot; - emit RootUpdated(addr, merkleroot); - } else revert OnlySeller(); + assembly { + // if (addr != msg.sender) + if iszero(eq(addr, caller())) { + // revert OnlySeller() + mstore(0x00, 0x85d1f726) + revert(0x1c, 0x04) + } + // sets root to SellerAllowlist's storage slot + mstore(0x0c, _SELLER_ALLOWLIST_SLOT_SEED) + mstore(0x00, addr) + sstore(keccak256(0x00, 0x20), merkleroot) + + // emit RootUpdated(addr, merkleroot); + log3( + 0, + 0, + _ROOT_UPDATED_EVENT_SIGNATURE, + addr, + merkleroot + ) + } } + /// ███ Owner Only █████████████████████████████████████████████████████████ /// @dev Contract's underlying balance withdraw method. @@ -513,15 +542,16 @@ contract P2PIX is public onlyOwner { - unchecked { - uint256 i; - uint256 len = _validSigners.length; - for (i; i < len; ) { - uint256 key = _castAddrToKey( - _validSigners[i] - ); - validBacenSigners[key] = true; - ++i; + assembly { + let i := add(_validSigners, 0x20) + let end := add(i, shl(0x05, mload(_validSigners))) + for {/* */} iszero(returndatasize()) {/* */} { + sstore(shl(12, mload(i)), true) + i := add(i, 0x20) + + if iszero(lt(i, end)) { + break + } } } emit ValidSignersUpdated(_validSigners); @@ -554,15 +584,16 @@ contract P2PIX is sLoc := add(sLoc, 0x20) } { // cache hashmap entry in scratch space + mstore(0x0c, _ALLOWED_ERC20_SLOT_SEED) mstore(0x00, mload(tLoc)) - mstore(0x20, allowedERC20s.slot) - let mapSlot := keccak256(0x00, 0x40) - sstore(mapSlot, mload(sLoc)) + // let mapSlot := keccak256(0x0c, 0x20) + sstore(keccak256(0x0c, 0x20), mload(sLoc)) + + // emit AllowedERC20Updated(address, bool) log3( 0, 0, - // AllowedERC20Updated(address, bool) - 0x5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a, + _ALLOWED_ERC20_UPDATED_EVENT_SIGNATURE, mload(tLoc), mload(sLoc) ) @@ -605,7 +636,7 @@ contract P2PIX is ); } - function merkleVerify( + function _merkleVerify( bytes32[] calldata _merkleProof, bytes32 root, address _addr @@ -631,8 +662,8 @@ contract P2PIX is ); // cast the uninitialized return values to memory bool success; - uint256 returnSize; - uint256 returnValue; + // uint256 returnSize; + // uint256 returnValue; // perform staticcall from the stack w yul assembly { success := staticcall( @@ -649,9 +680,10 @@ contract P2PIX is // retSize 0x20 ) - returnSize := returndatasize() - returnValue := mload(0x00) - _spendLimit := returnValue + // returnSize := returndatasize() + // returnValue := mload(0x00) + // _spendLimit := returnValue + _spendLimit := mload(0x00) // reverts if call does not succeed. if iszero(success) { // StaticCallFailed() @@ -692,7 +724,7 @@ contract P2PIX is iszero( or( iszero(_bal), - lt(sub(_bal, _amount), 0x0) + gt(sub(_bal, _amount), _bal) ) ) ) { @@ -703,7 +735,7 @@ contract P2PIX is } // we can directly dec from packed uint entry value - sellerBalance[_k][_t] -= _amount; + _decSellerBalance(_k,_t, _amount); } function getBalance(address seller, ERC20 token) @@ -717,17 +749,15 @@ contract P2PIX is assembly { for { /* */ - } iszero(0x0) { + } iszero(returndatasize()) { /* */ } { - mstore(0x00, shl(0xC, seller)) - mstore(0x20, sellerBalance.slot) - let sbkslot := keccak256(0x00, 0x40) - mstore(0x00, token) - mstore(0x20, sbkslot) + mstore(0x20, token) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, seller) bal := and( BITMASK_SB_ENTRY, - sload(keccak256(0x00, 0x40)) + sload(keccak256(0x0c, 0x34)) ) break } @@ -746,19 +776,17 @@ contract P2PIX is assembly { for { /* */ - } iszero(0x0) { + } iszero(returndatasize()) { /* */ } { - mstore(0x00, shl(0xC, seller)) - mstore(0x20, sellerBalance.slot) - let sbkslot := keccak256(0x00, 0x40) - mstore(0x00, token) - mstore(0x20, sbkslot) + mstore(0x20, token) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, seller) valid := and( BITMASK_SB_ENTRY, shr( BITPOS_VALID, - sload(keccak256(0x00, 0x40)) + sload(keccak256(0x0c, 0x34)) ) ) break @@ -778,17 +806,15 @@ contract P2PIX is assembly { for { /* */ - } iszero(0) { + } iszero(returndatasize()) { /* */ } { - mstore(0, shl(12, seller)) - mstore(32, sellerBalance.slot) - let sbkslot := keccak256(0, 64) - mstore(0, token) - mstore(32, sbkslot) + mstore(0x20, token) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, seller) pixTarget := shr( BITPOS_PIXTARGET, - sload(keccak256(0, 64)) + sload(keccak256(0x0c, 0x34)) ) break } @@ -862,6 +888,79 @@ contract P2PIX is return (sortedIDs, status); } + function allowedERC20s(ERC20 erc20) public view returns (bool state) { + assembly { + mstore(0x0c, _ALLOWED_ERC20_SLOT_SEED) + mstore(0x00, erc20) + state := sload(keccak256(0x0c, 0x20)) + } + } + + function _setUsedTransactions(bytes32 message) private { + assembly { + sstore(message, true) + } + } + + function usedTransactions(bytes32 message) public view returns(bool used) { + assembly { + used := sload(message) + } + } + + function validBacenSigners(uint256 signer) public view returns(bool valid) { + assembly { + valid := sload(signer) + } + } + + function sellerAllowList(uint256 sellerKey) public view returns(bytes32 root) { + assembly { + mstore(0x0c, _SELLER_ALLOWLIST_SLOT_SEED) + mstore(0x00, shr(12, sellerKey)) + root := sload(keccak256(0x00, 0x20)) + } + } + + function _setSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 packed) private { + assembly { + mstore(0x20, erc20) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, shr(12, sellerKey)) + sstore(keccak256(0x0c, 0x34), packed) + } + } + + function _addSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 amount) private { + assembly { + mstore(0x20, erc20) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, shr(12, sellerKey)) + let slot := keccak256(0x0c, 0x34) + sstore(slot, add(sload(slot), amount)) + } + } + + function _decSellerBalance(uint256 sellerKey, ERC20 erc20, uint256 amount) private { + assembly { + mstore(0x20, erc20) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, shr(12, sellerKey)) + let slot := keccak256(0x0c, 0x34) + sstore(slot, sub(sload(slot), amount)) + } + } + + function sellerBalance(uint256 sellerKey, ERC20 erc20) public view returns(uint256 packed) { + assembly { + mstore(0x20, erc20) + mstore(0x0c, _SELLER_BALANCE_SLOT_SEED) + mstore(0x00, shr(12, sellerKey)) + packed := sload(keccak256(0x0c, 0x34)) + + } + } + /// @notice Public method that handles `address` /// to `uint256` safe type casting. /// @dev Function sighash: 0x4b2ae980. diff --git a/src/types/EventAndErrors.ts b/src/types/EventAndErrors.ts index 10dc788..5780451 100644 --- a/src/types/EventAndErrors.ts +++ b/src/types/EventAndErrors.ts @@ -5,6 +5,7 @@ import type { BaseContract, BigNumber, BigNumberish, + BytesLike, Signer, utils, } from "ethers"; @@ -300,10 +301,13 @@ export interface EventAndErrors extends BaseContract { ReputationUpdated(reputation?: null): ReputationUpdatedEventFilter; "RootUpdated(address,bytes32)"( - seller?: null, - merkleRoot?: null + seller?: PromiseOrValue | null, + merkleRoot?: PromiseOrValue | null + ): RootUpdatedEventFilter; + RootUpdated( + seller?: PromiseOrValue | null, + merkleRoot?: PromiseOrValue | null ): RootUpdatedEventFilter; - RootUpdated(seller?: null, merkleRoot?: null): RootUpdatedEventFilter; "ValidSet(address,address,bool)"( seller?: PromiseOrValue | null, diff --git a/src/types/factories/EventAndErrors__factory.ts b/src/types/factories/EventAndErrors__factory.ts index 135c160..9e9fd81 100644 --- a/src/types/factories/EventAndErrors__factory.ts +++ b/src/types/factories/EventAndErrors__factory.ts @@ -298,13 +298,13 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: false, + indexed: true, internalType: "address", name: "seller", type: "address", }, { - indexed: false, + indexed: true, internalType: "bytes32", name: "merkleRoot", type: "bytes32", diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index c73eb92..a11e158 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -357,13 +357,13 @@ const _abi = [ anonymous: false, inputs: [ { - indexed: false, + indexed: true, internalType: "address", name: "seller", type: "address", }, { - indexed: false, + indexed: true, internalType: "bytes32", name: "merkleRoot", type: "bytes32", @@ -465,7 +465,7 @@ const _abi = [ inputs: [ { internalType: "contract ERC20", - name: "", + name: "erc20", type: "address", }, ], @@ -473,7 +473,7 @@ const _abi = [ outputs: [ { internalType: "bool", - name: "", + name: "state", type: "bool", }, ], @@ -663,11 +663,6 @@ const _abi = [ name: "_buyerAddress", type: "address", }, - { - internalType: "address", - name: "_relayerTarget", - type: "address", - }, { internalType: "uint256", name: "_relayerPremium", @@ -758,11 +753,6 @@ const _abi = [ name: "buyerAddress", type: "address", }, - { - internalType: "address", - name: "relayerTarget", - type: "address", - }, { internalType: "address", name: "relayerAddress", @@ -797,11 +787,6 @@ const _abi = [ name: "lockID", type: "uint256", }, - { - internalType: "address", - name: "_relayerTarget", - type: "address", - }, { internalType: "bytes32", name: "pixTimestamp", @@ -845,7 +830,7 @@ const _abi = [ inputs: [ { internalType: "uint256", - name: "", + name: "sellerKey", type: "uint256", }, ], @@ -853,7 +838,7 @@ const _abi = [ outputs: [ { internalType: "bytes32", - name: "", + name: "root", type: "bytes32", }, ], @@ -864,12 +849,12 @@ const _abi = [ inputs: [ { internalType: "uint256", - name: "", + name: "sellerKey", type: "uint256", }, { internalType: "contract ERC20", - name: "", + name: "erc20", type: "address", }, ], @@ -877,7 +862,7 @@ const _abi = [ outputs: [ { internalType: "uint256", - name: "", + name: "packed", type: "uint256", }, ], @@ -1007,7 +992,7 @@ const _abi = [ inputs: [ { internalType: "bytes32", - name: "", + name: "message", type: "bytes32", }, ], @@ -1015,7 +1000,7 @@ const _abi = [ outputs: [ { internalType: "bool", - name: "", + name: "used", type: "bool", }, ], @@ -1045,7 +1030,7 @@ const _abi = [ inputs: [ { internalType: "uint256", - name: "", + name: "signer", type: "uint256", }, ], @@ -1053,7 +1038,7 @@ const _abi = [ outputs: [ { internalType: "bool", - name: "", + name: "valid", type: "bool", }, ], @@ -1097,7 +1082,7 @@ const _abi = [ ]; const _bytecode = - "0x6080604052600180556040516200366e3803806200366e8339810160408190526200002a9162000493565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b620000988282620002a1565b505050505062000616565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b80516000905b808210156200026e57600062000246848481518110620002325762000232620005b1565b60200260200101516200038760201b60201c565b6000908152600860205260409020805460ff191660019081179091559290920191506200020e565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051620001289190620005c7565b6000546001600160a01b03163314620002ec5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620003025763df9578836000526004601cfd5b81518114620003195763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200037f578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a360208301925060208201915062000328565b505050505050565b600c1b90565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620003ce57620003ce6200038d565b604052919050565b60006001600160401b03821115620003f257620003f26200038d565b5060051b60200190565b6001600160a01b03811681146200041257600080fd5b50565b600082601f8301126200042757600080fd5b81516020620004406200043a83620003d6565b620003a3565b82815260059290921b840181019181810190868411156200046057600080fd5b8286015b84811015620004885780516200047a81620003fc565b835291830191830162000464565b509695505050505050565b600080600080600060a08688031215620004ac57600080fd5b8551602080880151919650906001600160401b0380821115620004ce57600080fd5b620004dc8a838b0162000415565b965060408901519150620004f082620003fc565b6060890151919550808211156200050657600080fd5b620005148a838b0162000415565b945060808901519150808211156200052b57600080fd5b508701601f810189136200053e57600080fd5b80516200054f6200043a82620003d6565b81815260059190911b8201830190838101908b8311156200056f57600080fd5b928401925b828410156200059f57835180151581146200058f5760008081fd5b8252928401929084019062000574565b80955050505050509295509295909350565b634e487b7160e01b600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b818110156200060a5783516001600160a01b031683529284019291840191600101620005e3565b50909695505050505050565b61304880620006266000396000f3fe6080604052600436106101e75760003560e01c80637f94f65d11610102578063ad8f2eed11610095578063d4fac45d11610064578063d4fac45d1461074c578063d6e8b97314610797578063f7d0e04b146107b7578063fb8c5ef0146107d757600080fd5b8063ad8f2eed14610692578063b0983d39146106d2578063c52164c6146106f2578063d1c070281461071f57600080fd5b80638db564c2116100d15780638db564c2146105fe5780639872dbfe1461061457806398a268711461062a5780639eee8d4b1461065a57600080fd5b80637f94f65d1461052b57806380e1d3021461054b57806384ab1d281461058b5780638da5cb5b146105d157600080fd5b80634b2ae9801161017a5780636a146024116101495780636a146024146104a25780636d82d9e0146104be57806374ba03a0146104de57806377cd38a4146104fe57600080fd5b80634b2ae9801461041c578063574983c81461043d5780635fd8c7101461045d57806369cc6af41461047257600080fd5b8063328a7181116101b6578063328a718114610295578063367821f0146102b5578063461f3120146103ae57806349ef8448146103ee57600080fd5b806304937320146101f35780630a98b9bd146102335780630d2a2d441461025357806313af40351461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e3660046126f1565b60076020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061022061024e366004612778565b6107f7565b34801561025f57600080fd5b5061027361026e36600461295f565b610ba6565b005b34801561028157600080fd5b5061027361029036600461299c565b610ce0565b3480156102a157600080fd5b506102736102b03660046129d5565b610dd1565b3480156102c157600080fd5b506103426102d03660046126f1565b6005602081905260009182526040909120805460018201546002830154600384015460048501549585015460068601546007870154600888015460099098015496989597949693959473ffffffffffffffffffffffffffffffffffffffff93841694928416939182169290821691168a565b604080519a8b5260208b0199909952978901969096526060880194909452608087019290925273ffffffffffffffffffffffffffffffffffffffff90811660a087015290811660c086015290811660e0850152908116610100840152166101208201526101400161022a565b3480156103ba57600080fd5b506103de6103c93660046126f1565b60096020526000908152604090205460ff1681565b604051901515815260200161022a565b3480156103fa57600080fd5b5061040e610409366004612a48565b611012565b60405161022a929190612b43565b34801561042857600080fd5b5061022061043736600461299c565b600c1b90565b34801561044957600080fd5b506102736104583660046126f1565b6112f5565b34801561046957600080fd5b506102736113ab565b34801561047e57600080fd5b506103de61048d36600461299c565b600a6020526000908152604090205460ff1681565b3480156104ae57600080fd5b50610220670de0b6b3a764000081565b3480156104ca57600080fd5b506102736104d9366004612bd2565b61146d565b3480156104ea57600080fd5b506102736104f9366004612c07565b611584565b34801561050a57600080fd5b506102206105193660046126f1565b60066020526000908152604090205481565b34801561053757600080fd5b50610273610546366004612c6b565b611a63565b34801561055757600080fd5b506103de610566366004612c97565b600c9190911b6000908152600b60209081526040808320938352929052205460ff1c90565b34801561059757600080fd5b506105ac6105a63660046126f1565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b3480156105dd57600080fd5b506000546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561060a57600080fd5b5061022060045481565b34801561062057600080fd5b5061022060035481565b34801561063657600080fd5b506103de6106453660046126f1565b60086020526000908152604090205460ff1681565b34801561066657600080fd5b50610220610675366004612cd0565b600b60209081526000928352604080842090915290825290205481565b34801561069e57600080fd5b506105ac6106ad366004612c97565b600c9190911b6000908152600b602090815260408083209383529290522054605f1c90565b3480156106de57600080fd5b506102736106ed366004612cf5565b611b29565b3480156106fe57600080fd5b506002546105ac9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561072b57600080fd5b5061073f61073a366004612d2b565b611d6c565b60405161022a9190612d72565b34801561075857600080fd5b50610220610767366004612c97565b600c9190911b6000908152600b6020908152604080832093835292905220546b3fffffffffffffffffffffff1690565b3480156107a357600080fd5b506102736107b2366004612d85565b611e46565b3480156107c357600080fd5b506102736107d236600461299c565b611f56565b3480156107e357600080fd5b506102736107f2366004612e47565b612022565b600061080161211e565b61080b8383611b29565b600c8b901b6000908152600b602090815260408083208d84529091529020548a9060ff1c610865576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600c8c901b6000908152600b602090815260408083208484529091529020546b3fffffffffffffffffffffff16878110156108cc576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006108d88e600c1b90565b9050600060045460016108eb9190612ed2565b6000818152600560205260409020600401549091504311610938576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061014001604052808481526020018381526020018d81526020018c81526020016003544361096c9190612ed2565b8152602001605f600b600087815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c73ffffffffffffffffffffffffffffffffffffffff1681526020018f73ffffffffffffffffffffffffffffffffffffffff1681526020018e73ffffffffffffffffffffffffffffffffffffffff1681526020013373ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff16815250905089899050600014610aa957600083815260066020526040902054610a79908b908b9033612162565b610a87848c848489886121ba565b60048054906000610a9783612eea565b91905055508195505050505050610b8f565b68056bc75e2d63100000816060015111610acb57610a87848c848489886121ba565b33600c1b60009081526007602052604081205490610af9610af4670de0b6b3a764000084612f23565b612315565b9050610b0d670de0b6b3a764000082612f5e565b83606001511180610b2b575069d3c21bcecceda10000008360600151115b15610b62576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b70868e86868b8a6121ba565b60048054906000610b8083612eea565b90915550939750505050505050505b610b9860018055565b9a9950505050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b80516000905b80821015610ca4576000610c5f848481518110610c5157610c51612f9b565b6020026020010151600c1b90565b600090815260086020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155929092019150610c32565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d781604051610cd59190612fca565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610e23576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166000908152600a602052604090205460ff16610e82576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff861684529091529020546b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610ee56bffffffffffffffffffffffff8a1683612ed2565b1115610f1d576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f2561211e565b8415610f3557610f353386611a63565b87878760ff81901b605f83901b610f4c8587612ed2565b6000898152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8e16845290915290209117919091179055610f9d8733306bffffffffffffffffffffffff8f166123d1565b610fa660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b60608082516000141561103d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff81111561105c5761105c612849565b604051908082528060200260200182016040528015611085578160200160208202803683370190505b50905060008267ffffffffffffffff8111156110a3576110a3612849565b6040519080825280602002602001820160405280156110cc578160200160208202803683370190505b5090505b828410156112e957600560008886815181106110ee576110ee612f9b565b6020026020010151815260200190815260200160002060000154600014156111965786848151811061112257611122612f9b565b602002602001015182858151811061113c5761113c612f9b565b602002602001018181525050600081858151811061115c5761115c612f9b565b6020026020010190600381111561117557611175612b14565b9081600381111561118857611188612b14565b9052506001909301926110d0565b600560008886815181106111ac576111ac612f9b565b60200260200101518152602001908152602001600020600301546000141561121a578684815181106111e0576111e0612f9b565b60200260200101518285815181106111fa576111fa612f9b565b602002602001018181525050600381858151811061115c5761115c612f9b565b436005600089878151811061123157611231612f9b565b6020026020010151815260200190815260200160002060040154101561129d5786848151811061126357611263612f9b565b602002602001015182858151811061127d5761127d612f9b565b602002602001018181525050600281858151811061115c5761115c612f9b565b8684815181106112af576112af612f9b565b60200260200101518285815181106112c9576112c9612f9b565b602002602001018181525050600181858151811061115c5761115c612f9b565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851181604051610cd591815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff16331461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b47611437338261249b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610cd5565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152902054801561154c576000828152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff8816808552908352928190207f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9490941660ff87901b1793849055805192835285151591830191909152849133917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a25061157e565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b61158c61211e565b600086815260056020526040902060038101546115d5576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611613576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016116b691907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815291815281516020928301206000858152600990935291205490915060ff1615156001141561173b576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526117a39060019060a0016020604051602081039080840390855afa158015611793573d6000803e3d6000fd5b50505060206040510351600c1b90565b60008181526008602052604090205490915060ff166117ee576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60098401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118239083613024565b6000600389018190556004890181905587815260096020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560088801549091503373ffffffffffffffffffffffffffffffffffffffff9091161461190f57600287015433600c1b600090815260076020526040812080549091906118b5908490612ed2565b9091555050600887015482906007906000906118e79073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119049190612ed2565b909155506119479050565b81876002015461191f9190612ed2565b33600c1b60009081526007602052604081208054909190611941908490612ed2565b90915550505b600687015461196e90849073ffffffffffffffffffffffffffffffffffffffff1683612515565b6002870154156119f457600787015473ffffffffffffffffffffffffffffffffffffffff8d81169116146119e557600787015460028801546119cd91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c612515565b6119e0838d60018a60020154901c612515565b6119f4565b6119f4838d8960020154612515565b6006870154604080518f81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611a5b60018055565b505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216331415611af7578060066000611a9085600c1b90565b8152602080820192909252604090810160002092909255815173ffffffffffffffffffffffffffffffffffffffff851681529081018390527f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632910160405180910390a15050565b6040517f85d1f72600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000815b80821015611d5657600060056000868686818110611b4d57611b4d612f9b565b9050602002013581526020019081526020016000209050611b6d816125d4565b80546000908152600b60209081526040808320600985015473ffffffffffffffffffffffffffffffffffffffff16845290915290205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e400000090611bd09083612ed2565b1115611c08576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600382015482546000908152600b60209081526040808320600987015473ffffffffffffffffffffffffffffffffffffffff16845290915281208054909190611c52908490612ed2565b90915550506000600383018190556008830154611c859073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526007602052604090205490915060011c68056bc75e2d631000008111611cc957600082815260076020526040902068056bc75e2d631000009055611cdb565b60008281526007602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da5898989818110611d2957611d29612f9b565b90506020020135604051611d3f91815260200190565b60405180910390a285600101955050505050611b2d565b8082101561157e5763dfb035c96000526004601cfd5b8151606090600090818167ffffffffffffffff811115611d8e57611d8e612849565b604051908082528060200260200182016040528015611db7578160200160208202803683370190505b5090505b81831015611e3d576000611e10878581518110611dda57611dda612f9b565b602090810291909101810151600c1b6000908152600b825260408082208a835290925220546b3fffffffffffffffffffffff1690565b905080828581518110611e2557611e25612f9b565b60200260200101818152505083600101935050611dbb565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611ec7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b815180611edc5763df9578836000526004601cfd5b81518114611ef25763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611a5b578251600052600a60205260406000208251815550815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611f01565b60005473ffffffffffffffffffffffffffffffffffffffff163314611fd7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a454400000000000000000000000000000000000000006044820152606401610c23565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610cd5565b61202a61211e565b6120348282611b29565b33600c1b6000908152600b6020908152604080832087845290915290205460ff1c15156001141561206a5761206a84600061146d565b33600c1b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff891684529091529020546120b8906b3fffffffffffffffffffffff16858784612650565b6120c3853386612515565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061157e60018055565b6001546002141561215b576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b61218484848473ffffffffffffffffffffffffffffffffffffffff85166126ad565b61157e576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e08601516007840180548316918416919091179055610100860151600884018054831691841691909117905561012086015160099093018054909116929091169190911790556122a986868484612650565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261230592918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b8360405160240161233391815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600080600060206000855160208701600254617530fa92503d91506000519050809450826123c85763e10bf1cc6000526004601cfd5b50505050919050565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c45440000000000000000000000006044820152606401610c23565b5050505050565b600080600080600085875af1905080612510576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606401610c23565b505050565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d116001600051141617169150600060605280604052508061157e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606401610c23565b4381600401541115612612576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600381015461264d576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b836126635763ce3a3d376000526004601cfd5b6000818152600b6020908152604080832073ffffffffffffffffffffffffffffffffffffffff86168452909152812080548592906126a2908490613024565b909155505050505050565b600083156126e9578360051b8501855b803580851160051b948552602094851852604060002093018181106126e1576126e6565b6126bd565b50505b501492915050565b60006020828403121561270357600080fd5b5035919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461264d57600080fd5b60008083601f84011261273e57600080fd5b50813567ffffffffffffffff81111561275657600080fd5b6020830191508360208260051b850101111561277157600080fd5b9250929050565b6000806000806000806000806000806101008b8d03121561279857600080fd5b8a356127a38161270a565b995060208b01356127b38161270a565b985060408b01356127c38161270a565b975060608b01356127d38161270a565b965060808b0135955060a08b0135945060c08b013567ffffffffffffffff808211156127fe57600080fd5b61280a8e838f0161272c565b909650945060e08d013591508082111561282357600080fd5b506128308d828e0161272c565b915080935050809150509295989b9194979a5092959850565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156128bf576128bf612849565b604052919050565b600067ffffffffffffffff8211156128e1576128e1612849565b5060051b60200190565b600082601f8301126128fc57600080fd5b8135602061291161290c836128c7565b612878565b82815260059290921b8401810191818101908684111561293057600080fd5b8286015b848110156129545780356129478161270a565b8352918301918301612934565b509695505050505050565b60006020828403121561297157600080fd5b813567ffffffffffffffff81111561298857600080fd5b612994848285016128eb565b949350505050565b6000602082840312156129ae57600080fd5b81356129b98161270a565b9392505050565b803580151581146129d057600080fd5b919050565b600080600080600060a086880312156129ed57600080fd5b85356129f88161270a565b945060208601356bffffffffffffffffffffffff81168114612a1957600080fd5b93506040860135612a298161270a565b9250612a37606087016129c0565b949793965091946080013592915050565b60006020808385031215612a5b57600080fd5b823567ffffffffffffffff811115612a7257600080fd5b8301601f81018513612a8357600080fd5b8035612a9161290c826128c7565b81815260059190911b82018301908381019087831115612ab057600080fd5b928401925b82841015612ace57833582529284019290840190612ab5565b979650505050505050565b600081518084526020808501945080840160005b83811015612b0957815187529582019590820190600101612aed565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b604081526000612b566040830185612ad9565b8281036020848101919091528451808352858201928201906000805b82811015612bc45785516004808210612bb1577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612b72565b509198975050505050505050565b60008060408385031215612be557600080fd5b8235612bf08161270a565b9150612bfe602084016129c0565b90509250929050565b60008060008060008060c08789031215612c2057600080fd5b863595506020870135612c328161270a565b945060408701359350606087013592506080870135915060a087013560ff81168114612c5d57600080fd5b809150509295509295509295565b60008060408385031215612c7e57600080fd5b8235612c898161270a565b946020939093013593505050565b60008060408385031215612caa57600080fd5b8235612cb58161270a565b91506020830135612cc58161270a565b809150509250929050565b60008060408385031215612ce357600080fd5b823591506020830135612cc58161270a565b60008060208385031215612d0857600080fd5b823567ffffffffffffffff811115612d1f57600080fd5b6112e98582860161272c565b60008060408385031215612d3e57600080fd5b823567ffffffffffffffff811115612d5557600080fd5b612d61858286016128eb565b9250506020830135612cc58161270a565b6020815260006129b96020830184612ad9565b60008060408385031215612d9857600080fd5b823567ffffffffffffffff80821115612db057600080fd5b612dbc868387016128eb565b9350602091508185013581811115612dd357600080fd5b85019050601f81018613612de657600080fd5b8035612df461290c826128c7565b81815260059190911b82018301908381019088831115612e1357600080fd5b928401925b82841015612e3857612e29846129c0565b82529284019290840190612e18565b80955050505050509250929050565b60008060008060608587031215612e5d57600080fd5b8435612e688161270a565b935060208501359250604085013567ffffffffffffffff811115612e8b57600080fd5b612e978782880161272c565b95989497509550505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612ee557612ee5612ea3565b500190565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612f1c57612f1c612ea3565b5060010190565b600082612f59577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f9657612f96612ea3565b500290565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020808252825182820181905260009190848201906040850190845b8181101561301857835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612fe6565b50909695505050505050565b60008282101561303657613036612ea3565b50039056fea164736f6c6343000809000a"; + "0x6080604052600180556040516200331c3803806200331c8339810160408190526200002a916200045c565b600080546001600160a01b031916339081178255604051909182917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a3506200007685620000a3565b620000818362000133565b6200008c84620001bd565b6200009882826200026f565b5050505050620005c9565b6000546001600160a01b03163314620000f25760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b60448201526064015b60405180910390fd5b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b8511816040516200012891815260200190565b60405180910390a150565b6000546001600160a01b031633146200017e5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60028190556040516001600160a01b03821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9060200162000128565b6000546001600160a01b03163314620002085760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b60208101815160051b81015b3d6200023c5760018251600c1b5560208201915080821062000236576200023c565b62000214565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516200012891906200057a565b6000546001600160a01b03163314620002ba5760405162461bcd60e51b815260206004820152600c60248201526b15539055551213d49256915160a21b6044820152606401620000e9565b815180620002d05763df9578836000526004601cfd5b81518114620002e75763ff633a386000526004601cfd5b60208301602083018260051b82015b8083146200034e5763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150620002f6565b505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000397576200039762000356565b604052919050565b60006001600160401b03821115620003bb57620003bb62000356565b5060051b60200190565b6001600160a01b0381168114620003db57600080fd5b50565b600082601f830112620003f057600080fd5b815160206200040962000403836200039f565b6200036c565b82815260059290921b840181019181810190868411156200042957600080fd5b8286015b84811015620004515780516200044381620003c5565b83529183019183016200042d565b509695505050505050565b600080600080600060a086880312156200047557600080fd5b8551602080880151919650906001600160401b03808211156200049757600080fd5b620004a58a838b01620003de565b965060408901519150620004b982620003c5565b606089015191955080821115620004cf57600080fd5b620004dd8a838b01620003de565b94506080890151915080821115620004f457600080fd5b508701601f810189136200050757600080fd5b80516200051862000403826200039f565b81815260059190911b8201830190838101908b8311156200053857600080fd5b928401925b82841015620005685783518015158114620005585760008081fd5b825292840192908401906200053d565b80955050505050509295509295909350565b6020808252825182820181905260009190848201906040850190845b81811015620005bd5783516001600160a01b03168352928401929184019160010162000596565b50909695505050505050565b612d4380620005d96000396000f3fe6080604052600436106101e75760003560e01c806384ab1d2811610102578063b0983d3911610095578063d4fac45d11610064578063d4fac45d146106c0578063d6e8b973146106e0578063f7d0e04b14610700578063fb8c5ef01461072057600080fd5b8063b0983d3914610626578063c52164c614610646578063c593dfd814610673578063d1c070281461069357600080fd5b80639872dbfe116100d15780639872dbfe146105ba57806398a268711461037c5780639eee8d4b146105d0578063ad8f2eed1461060657600080fd5b806384ab1d28146105115780638a006225146105575780638da5cb5b146105775780638db564c2146105a457600080fd5b8063574983c81161017a5780636d82d9e0116101495780636d82d9e01461047e57806377cd38a41461049e5780637f94f65d146104d157806380e1d302146104f157600080fd5b8063574983c8146103fa5780635fd8c7101461041a57806369cc6af41461042f5780636a1460241461046257600080fd5b8063367821f0116101b6578063367821f014610295578063461f31201461037c57806349ef8448146103ab5780634b2ae980146103d957600080fd5b806304937320146101f35780630d2a2d441461023357806313af403514610255578063328a71811461027557600080fd5b366101ee57005b600080fd5b3480156101ff57600080fd5b5061022061020e366004612411565b60066020526000908152604090205481565b6040519081526020015b60405180910390f35b34801561023f57600080fd5b5061025361024e366004612562565b610740565b005b34801561026157600080fd5b5061025361027036600461259f565b610832565b34801561028157600080fd5b506102536102903660046125d8565b610923565b3480156102a157600080fd5b506103196102b0366004612411565b600560208190526000918252604090912080546001820154600283015460038401546004850154958501546006860154600787015460089097015495979496939592949373ffffffffffffffffffffffffffffffffffffffff9283169391831692908116911689565b60408051998a5260208a0198909852968801959095526060870193909352608086019190915273ffffffffffffffffffffffffffffffffffffffff90811660a086015290811660c085015290811660e0840152166101008201526101200161022a565b34801561038857600080fd5b5061039b610397366004612411565b5490565b604051901515815260200161022a565b3480156103b757600080fd5b506103cb6103c636600461264b565b610b32565b60405161022a929190612746565b3480156103e557600080fd5b506102206103f436600461259f565b600c1b90565b34801561040657600080fd5b50610253610415366004612411565b610e15565b34801561042657600080fd5b50610253610ecb565b34801561043b57600080fd5b5061039b61044a36600461259f565b63cbc9d1c4600c908152600091909152602090205490565b34801561046e57600080fd5b50610220670de0b6b3a764000081565b34801561048a57600080fd5b506102536104993660046127d5565b610f8d565b3480156104aa57600080fd5b506102206104b9366004612411565b6374dfee70600c9081521c6000908152602090205490565b3480156104dd57600080fd5b506102536104ec36600461280a565b61109d565b3480156104fd57600080fd5b5061039b61050c366004612836565b6110f0565b34801561051d57600080fd5b5061053261052c366004612411565b600c1c90565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161022a565b34801561056357600080fd5b506102206105723660046128bb565b611127565b34801561058357600080fd5b506000546105329073ffffffffffffffffffffffffffffffffffffffff1681565b3480156105b057600080fd5b5061022060045481565b3480156105c657600080fd5b5061022060035481565b3480156105dc57600080fd5b506102206105eb366004612978565b60205263739094b1600c90815290811c600052603490205490565b34801561061257600080fd5b50610532610621366004612836565b611417565b34801561063257600080fd5b5061025361064136600461299d565b61143d565b34801561065257600080fd5b506002546105329073ffffffffffffffffffffffffffffffffffffffff1681565b34801561067f57600080fd5b5061025361068e3660046129d3565b611673565b34801561069f57600080fd5b506106b36106ae366004612a26565b611ae4565b60405161022a9190612a6d565b3480156106cc57600080fd5b506102206106db366004612836565b611b96565b3480156106ec57600080fd5b506102536106fb366004612a80565b611bc7565b34801561070c57600080fd5b5061025361071b36600461259f565b611ce0565b34801561072c57600080fd5b5061025361073b366004612b42565b611dac565b60005473ffffffffffffffffffffffffffffffffffffffff1633146107c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60208101815160051b81015b3d6107f65760018251600c1b556020820191508082106107f1576107f6565b6107d2565b50507f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d7816040516108279190612b9e565b60405180910390a150565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b8433600c1b73ffffffffffffffffffffffffffffffffffffffff8516610975576040517f6a3bc53e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b63cbc9d1c4600c908152600083905260209020546109bf576040517f1578328e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006109e1828460205263739094b1600c90815290811c600052603490205490565b90506b3fffffffffffffffffffffff81166a52b7d2dcc80cd2e4000000610a166bffffffffffffffffffffffff8a1683612c27565b1115610a4e576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a56611e84565b8415610a6657610a66338661109d565b878787610aa3868860ff84901b605f86901b610a82888a612c27565b17178160205263739094b1600c5282600c1c600052806034600c2055505050565b610abd8733308e6bffffffffffffffffffffffff16611ec8565b610ac660018055565b6040805173ffffffffffffffffffffffffffffffffffffffff8e1681526bffffffffffffffffffffffff8d16602082015233917f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf910160405180910390a2505050505050505050505050565b606080825160001415610b5d5750506040805160008082526020820190815281830190925292909150565b8251600090818167ffffffffffffffff811115610b7c57610b7c61242a565b604051908082528060200260200182016040528015610ba5578160200160208202803683370190505b50905060008267ffffffffffffffff811115610bc357610bc361242a565b604051908082528060200260200182016040528015610bec578160200160208202803683370190505b5090505b82841015610e095760056000888681518110610c0e57610c0e612c3f565b602002602001015181526020019081526020016000206000015460001415610cb657868481518110610c4257610c42612c3f565b6020026020010151828581518110610c5c57610c5c612c3f565b6020026020010181815250506000818581518110610c7c57610c7c612c3f565b60200260200101906003811115610c9557610c95612717565b90816003811115610ca857610ca8612717565b905250600190930192610bf0565b60056000888681518110610ccc57610ccc612c3f565b602002602001015181526020019081526020016000206003015460001415610d3a57868481518110610d0057610d00612c3f565b6020026020010151828581518110610d1a57610d1a612c3f565b6020026020010181815250506003818581518110610c7c57610c7c612c3f565b4360056000898781518110610d5157610d51612c3f565b60200260200101518152602001908152602001600020600401541015610dbd57868481518110610d8357610d83612c3f565b6020026020010151828581518110610d9d57610d9d612c3f565b6020026020010181815250506002818581518110610c7c57610c7c612c3f565b868481518110610dcf57610dcf612c3f565b6020026020010151828581518110610de957610de9612c3f565b6020026020010181815250506001818581518110610c7c57610c7c612c3f565b90969095509350505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e96576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b806003557f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b85118160405161082791815260200190565b60005473ffffffffffffffffffffffffffffffffffffffff163314610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b47610f573382611f8b565b60408051338152602081018390527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d9101610827565b600033600c1b90506000610fb7828560205263739094b1600c90815290811c600052603490205490565b90508015611065577f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1660ff83901b178261100d8386848160205263739094b1600c5282600c1c600052806034600c2055505050565b6040805173ffffffffffffffffffffffffffffffffffffffff87168152851515602082015233917fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d49910160405180910390a250611097565b6040517f87138d5c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b3382146110b2576385d1f7266000526004601cfd5b6374dfee70600c52816000528060206000205580827f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a35050565b60003d611121578160205263739094b1600c52826000526034600c205460ff1c6b3fffffffffffffffffffffff1690505b92915050565b6000611131611e84565b61113b838361143d565b886111468b826110f0565b61117c576040517fb2e532de00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111888c83611b96565b9050878110156111c4576040517f22bbb43c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006111d08d600c1b90565b9050600060045460016111e39190612c27565b6000818152600560205260409020600401549091504311611230576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006040518061012001604052808481526020018381526020018d81526020018c8152602001600354436112649190612c27565b8152602001605f61128b868960205263739094b1600c90815290811c600052603490205490565b73ffffffffffffffffffffffffffffffffffffffff911c811682528f8116602083015233604083015287166060909101529050881561131b576112eb8a8a6112e5866374dfee70600c9081521c6000908152602090205490565b33612005565b6112f9848c8484898861205d565b6004805490600061130983612c6e565b91905055508195505050505050611401565b68056bc75e2d6310000081606001511161133d576112f9848c8484898861205d565b33600c1b6000908152600660205260408120549061136b611366670de0b6b3a764000084612ca7565b6121a1565b905061137f670de0b6b3a764000082612ce2565b8360600151118061139d575069d3c21bcecceda10000008360600151115b156113d4576040517f1c18f84600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113e2868e86868b8a61205d565b600480549060006113f283612c6e565b90915550939750505050505050505b61140a60018055565b9998505050505050505050565b60003d611121575060205263739094b1600c9081526000919091526034902054605f1c90565b6000815b8082101561165d5760006005600086868681811061146157611461612c3f565b905060200201358152602001908152602001600020905061148181612252565b8054600882015473ffffffffffffffffffffffffffffffffffffffff1660205263739094b1600c90815290811c600052603490205460038201546b3fffffffffffffffffffffff909116906a52b7d2dcc80cd2e4000000906114e39083612c27565b111561151b576040517ff3fb0eb900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81546008830154600384015473ffffffffffffffffffffffffffffffffffffffff90911660205263739094b1600c90815291821c600052603490912080549091019055600060038301819055600783015461158c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b60008181526006602052604090205490915060011c68056bc75e2d6310000081116115d057600082815260066020526040902068056bc75e2d6310000090556115e2565b60008281526006602052604090208190555b600684015473ffffffffffffffffffffffffffffffffffffffff167f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da589898981811061163057611630612c3f565b9050602002013560405161164691815260200190565b60405180910390a285600101955050505050611441565b808210156110975763dfb035c96000526004601cfd5b61167b611e84565b600085815260056020526040902060038101546116c4576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b4381600401541015611702576040517ff6fafba000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6005810154600382015460405160609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208301526034820152605481018690526000906074016040516020818303038152906040528051906020012090506000816040516020016117a591907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b6040516020818303038152906040528051906020012090506117c5825490565b151560011415611801576040517ff490a6ea00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805160008082526020820180845284905260ff87169282019290925260608101889052608081018790526118699060019060a0016020604051602081039080840390855afa158015611859573d6000803e3d6000fd5b50505060206040510351600c1b90565b9050611873815490565b6118a9576040517f815e1d6400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60088401546003850154600286015473ffffffffffffffffffffffffffffffffffffffff909216916000906118de9083612d1f565b6000600389018190556004890155600187559050600787015473ffffffffffffffffffffffffffffffffffffffff16331461199457600287015433600c1b6000908152600660205260408120805490919061193a908490612c27565b90915550506007870154829060069060009061196c9073ffffffffffffffffffffffffffffffffffffffff16600c1b90565b815260200190815260200160002060008282546119899190612c27565b909155506119cc9050565b8187600201546119a49190612c27565b33600c1b600090815260066020526040812080549091906119c6908490612c27565b90915550505b60068701546119f390849073ffffffffffffffffffffffffffffffffffffffff16836122ce565b600287015415611a7657600787015473ffffffffffffffffffffffffffffffffffffffff163314611a675760078701546002880154611a4f91859173ffffffffffffffffffffffffffffffffffffffff9091169060011c6122ce565b611a62833360018a60020154901c6122ce565b611a76565b611a76833389600201546122ce565b6006870154604080518e81526020810185905273ffffffffffffffffffffffffffffffffffffffff909216917f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede8910160405180910390a250505050505050611add60018055565b5050505050565b8151606090600090818167ffffffffffffffff811115611b0657611b0661242a565b604051908082528060200260200182016040528015611b2f578160200160208202803683370190505b5090505b81831015611b8d576000611b60878581518110611b5257611b52612c3f565b602002602001015187611b96565b905080828581518110611b7557611b75612c3f565b60200260200101818152505083600101935050611b33565b95945050505050565b60003d611121575060205263739094b1600c90815260009190915260349020546b3fffffffffffffffffffffff1690565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c48576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b815180611c5d5763df9578836000526004601cfd5b81518114611c735763ff633a386000526004601cfd5b60208301602083018260051b82015b808314611cd85763cbc9d1c4600c52825160005281516020600c2055815183517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a600080a3602083019250602082019150611c82565b505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611d61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016107bd565b600281905560405173ffffffffffffffffffffffffffffffffffffffff821681527fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f90602001610827565b611db4611e84565b611dbe828261143d565b611dc833856110f0565b151560011415611ddd57611ddd846000610f8d565b600033600c1b9050611e1e6b3fffffffffffffffffffffff611e15838860205263739094b1600c90815290811c600052603490205490565b1685878461238d565b611e298533866122ce565b6040805173ffffffffffffffffffffffffffffffffffffffff871681526020810186905233917f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e910160405180910390a25061109760018055565b60015460021415611ec1576040517fab143c0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600155565b60006040517f23b872dd000000000000000000000000000000000000000000000000000000006000528460045283602452826044526020600060646000808a5af13d15601f3d1160016000511416171691506000606052806040525080611add576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5452414e534645525f46524f4d5f4641494c454400000000000000000000000060448201526064016107bd565b600080600080600085875af1905080612000576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f4554485f5452414e534645525f4641494c45440000000000000000000000000060448201526064016107bd565b505050565b61202784848473ffffffffffffffffffffffffffffffffffffffff85166123cd565b611097576040517f3b8474be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008481526005602081815260409283902086518155908601516001820155918501516002830155606085015160038301556080850151600483015560a085015190820180547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff9384161790915560c0860151600684018054831691841691909117905560e0860151600784018054831691841691909117905561010086015160089093018054909116929091169190911790556121358686848461238d565b60c083015183516060850151604051879373ffffffffffffffffffffffffffffffffffffffff16927f8fb3989f70bd172a37d15b41b015e48ea09d59329638377304a4198cd0c4ea659261219192918252602082015260400190565b60405180910390a3505050505050565b600080634d2b179160e01b836040516024016121bf91815260200190565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050600060206000835160208501600254617530fa905060005192508061224b5763e10bf1cc6000526004601cfd5b5050919050565b4381600401541115612290576040517fd0404f8500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60038101546122cb576040517f63b4904e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50565b60006040517fa9059cbb000000000000000000000000000000000000000000000000000000006000528360045282602452602060006044600080895af13d15601f3d1160016000511416171691506000606052806040525080611097576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5452414e534645525f4641494c4544000000000000000000000000000000000060448201526064016107bd565b8383850311841517156123a85763ce3a3d376000526004601cfd5b602082905263739094b1600c90815281811c6000526034902080548490039055611097565b60008315612409578360051b8501855b803580851160051b9485526020948518526040600020930181811061240157612406565b6123dd565b50505b501492915050565b60006020828403121561242357600080fd5b5035919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156124a0576124a061242a565b604052919050565b600067ffffffffffffffff8211156124c2576124c261242a565b5060051b60200190565b73ffffffffffffffffffffffffffffffffffffffff811681146122cb57600080fd5b600082601f8301126124ff57600080fd5b8135602061251461250f836124a8565b612459565b82815260059290921b8401810191818101908684111561253357600080fd5b8286015b8481101561255757803561254a816124cc565b8352918301918301612537565b509695505050505050565b60006020828403121561257457600080fd5b813567ffffffffffffffff81111561258b57600080fd5b612597848285016124ee565b949350505050565b6000602082840312156125b157600080fd5b81356125bc816124cc565b9392505050565b803580151581146125d357600080fd5b919050565b600080600080600060a086880312156125f057600080fd5b85356125fb816124cc565b945060208601356bffffffffffffffffffffffff8116811461261c57600080fd5b9350604086013561262c816124cc565b925061263a606087016125c3565b949793965091946080013592915050565b6000602080838503121561265e57600080fd5b823567ffffffffffffffff81111561267557600080fd5b8301601f8101851361268657600080fd5b803561269461250f826124a8565b81815260059190911b820183019083810190878311156126b357600080fd5b928401925b828410156126d1578335825292840192908401906126b8565b979650505050505050565b600081518084526020808501945080840160005b8381101561270c578151875295820195908201906001016126f0565b509495945050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60408152600061275960408301856126dc565b8281036020848101919091528451808352858201928201906000805b828110156127c757855160048082106127b4577f4e487b7100000000000000000000000000000000000000000000000000000000845260218152602484fd5b5084529484019492840192600101612775565b509198975050505050505050565b600080604083850312156127e857600080fd5b82356127f3816124cc565b9150612801602084016125c3565b90509250929050565b6000806040838503121561281d57600080fd5b8235612828816124cc565b946020939093013593505050565b6000806040838503121561284957600080fd5b8235612854816124cc565b91506020830135612864816124cc565b809150509250929050565b60008083601f84011261288157600080fd5b50813567ffffffffffffffff81111561289957600080fd5b6020830191508360208260051b85010111156128b457600080fd5b9250929050565b600080600080600080600080600060e08a8c0312156128d957600080fd5b89356128e4816124cc565b985060208a01356128f4816124cc565b975060408a0135612904816124cc565b965060608a0135955060808a0135945060a08a013567ffffffffffffffff8082111561292f57600080fd5b61293b8d838e0161286f565b909650945060c08c013591508082111561295457600080fd5b506129618c828d0161286f565b915080935050809150509295985092959850929598565b6000806040838503121561298b57600080fd5b823591506020830135612864816124cc565b600080602083850312156129b057600080fd5b823567ffffffffffffffff8111156129c757600080fd5b610e098582860161286f565b600080600080600060a086880312156129eb57600080fd5b85359450602086013593506040860135925060608601359150608086013560ff81168114612a1857600080fd5b809150509295509295909350565b60008060408385031215612a3957600080fd5b823567ffffffffffffffff811115612a5057600080fd5b612a5c858286016124ee565b9250506020830135612864816124cc565b6020815260006125bc60208301846126dc565b60008060408385031215612a9357600080fd5b823567ffffffffffffffff80821115612aab57600080fd5b612ab7868387016124ee565b9350602091508185013581811115612ace57600080fd5b85019050601f81018613612ae157600080fd5b8035612aef61250f826124a8565b81815260059190911b82018301908381019088831115612b0e57600080fd5b928401925b82841015612b3357612b24846125c3565b82529284019290840190612b13565b80955050505050509250929050565b60008060008060608587031215612b5857600080fd5b8435612b63816124cc565b935060208501359250604085013567ffffffffffffffff811115612b8657600080fd5b612b928782880161286f565b95989497509550505050565b6020808252825182820181905260009190848201906040850190845b81811015612bec57835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101612bba565b50909695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008219821115612c3a57612c3a612bf8565b500190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612ca057612ca0612bf8565b5060010190565b600082612cdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612d1a57612d1a612bf8565b500290565b600082821015612d3157612d31612bf8565b50039056fea164736f6c6343000809000a"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index 5d9e230..c7c9a8b 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -40,11 +40,11 @@ export interface P2PIXInterface extends utils.Interface { "getLocksStatus(uint256[])": FunctionFragment; "getPixTarget(address,address)": FunctionFragment; "getValid(address,address)": FunctionFragment; - "lock(address,address,address,address,uint256,uint256,bytes32[],uint256[])": FunctionFragment; + "lock(address,address,address,uint256,uint256,bytes32[],uint256[])": FunctionFragment; "lockCounter()": FunctionFragment; "mapLocks(uint256)": FunctionFragment; "owner()": FunctionFragment; - "release(uint256,address,bytes32,bytes32,bytes32,uint8)": FunctionFragment; + "release(uint256,bytes32,bytes32,bytes32,uint8)": FunctionFragment; "reputation()": FunctionFragment; "sellerAllowList(uint256)": FunctionFragment; "sellerBalance(uint256,address)": FunctionFragment; @@ -152,7 +152,6 @@ export interface P2PIXInterface extends utils.Interface { PromiseOrValue, PromiseOrValue, PromiseOrValue, - PromiseOrValue, PromiseOrValue, PromiseOrValue, PromiseOrValue[], @@ -172,7 +171,6 @@ export interface P2PIXInterface extends utils.Interface { functionFragment: "release", values: [ PromiseOrValue, - PromiseOrValue, PromiseOrValue, PromiseOrValue, PromiseOrValue, @@ -560,9 +558,9 @@ export interface P2PIX extends BaseContract { ): Promise<[string] & { _addr: string }>; allowedERC20s( - arg0: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { state: boolean }>; defaultLockBlocks(overrides?: CallOverrides): Promise<[BigNumber]>; @@ -608,7 +606,6 @@ export interface P2PIX extends BaseContract { _seller: PromiseOrValue, _token: PromiseOrValue, _buyerAddress: PromiseOrValue, - _relayerTarget: PromiseOrValue, _relayerPremium: PromiseOrValue, _amount: PromiseOrValue, merkleProof: PromiseOrValue[], @@ -631,7 +628,6 @@ export interface P2PIX extends BaseContract { BigNumber, string, string, - string, string ] & { sellerKey: BigNumber; @@ -641,7 +637,6 @@ export interface P2PIX extends BaseContract { expirationBlock: BigNumber; pixTarget: BigNumber; buyerAddress: string; - relayerTarget: string; relayerAddress: string; token: string; } @@ -651,7 +646,6 @@ export interface P2PIX extends BaseContract { release( lockID: PromiseOrValue, - _relayerTarget: PromiseOrValue, pixTimestamp: PromiseOrValue, r: PromiseOrValue, s: PromiseOrValue, @@ -662,15 +656,15 @@ export interface P2PIX extends BaseContract { reputation(overrides?: CallOverrides): Promise<[string]>; sellerAllowList( - arg0: PromiseOrValue, + sellerKey: PromiseOrValue, overrides?: CallOverrides - ): Promise<[string]>; + ): Promise<[string] & { root: string }>; sellerBalance( - arg0: PromiseOrValue, - arg1: PromiseOrValue, + sellerKey: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides - ): Promise<[BigNumber]>; + ): Promise<[BigNumber] & { packed: BigNumber }>; setDefaultLockBlocks( _blocks: PromiseOrValue, @@ -716,9 +710,9 @@ export interface P2PIX extends BaseContract { ): Promise; usedTransactions( - arg0: PromiseOrValue, + message: PromiseOrValue, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { used: boolean }>; userRecord( arg0: PromiseOrValue, @@ -726,9 +720,9 @@ export interface P2PIX extends BaseContract { ): Promise<[BigNumber]>; validBacenSigners( - arg0: PromiseOrValue, + signer: PromiseOrValue, overrides?: CallOverrides - ): Promise<[boolean]>; + ): Promise<[boolean] & { valid: boolean }>; withdraw( token: PromiseOrValue, @@ -755,7 +749,7 @@ export interface P2PIX extends BaseContract { ): Promise; allowedERC20s( - arg0: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -803,7 +797,6 @@ export interface P2PIX extends BaseContract { _seller: PromiseOrValue, _token: PromiseOrValue, _buyerAddress: PromiseOrValue, - _relayerTarget: PromiseOrValue, _relayerPremium: PromiseOrValue, _amount: PromiseOrValue, merkleProof: PromiseOrValue[], @@ -826,7 +819,6 @@ export interface P2PIX extends BaseContract { BigNumber, string, string, - string, string ] & { sellerKey: BigNumber; @@ -836,7 +828,6 @@ export interface P2PIX extends BaseContract { expirationBlock: BigNumber; pixTarget: BigNumber; buyerAddress: string; - relayerTarget: string; relayerAddress: string; token: string; } @@ -846,7 +837,6 @@ export interface P2PIX extends BaseContract { release( lockID: PromiseOrValue, - _relayerTarget: PromiseOrValue, pixTimestamp: PromiseOrValue, r: PromiseOrValue, s: PromiseOrValue, @@ -857,13 +847,13 @@ export interface P2PIX extends BaseContract { reputation(overrides?: CallOverrides): Promise; sellerAllowList( - arg0: PromiseOrValue, + sellerKey: PromiseOrValue, overrides?: CallOverrides ): Promise; sellerBalance( - arg0: PromiseOrValue, - arg1: PromiseOrValue, + sellerKey: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -911,7 +901,7 @@ export interface P2PIX extends BaseContract { ): Promise; usedTransactions( - arg0: PromiseOrValue, + message: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -921,7 +911,7 @@ export interface P2PIX extends BaseContract { ): Promise; validBacenSigners( - arg0: PromiseOrValue, + signer: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -950,7 +940,7 @@ export interface P2PIX extends BaseContract { ): Promise; allowedERC20s( - arg0: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -998,7 +988,6 @@ export interface P2PIX extends BaseContract { _seller: PromiseOrValue, _token: PromiseOrValue, _buyerAddress: PromiseOrValue, - _relayerTarget: PromiseOrValue, _relayerPremium: PromiseOrValue, _amount: PromiseOrValue, merkleProof: PromiseOrValue[], @@ -1021,7 +1010,6 @@ export interface P2PIX extends BaseContract { BigNumber, string, string, - string, string ] & { sellerKey: BigNumber; @@ -1031,7 +1019,6 @@ export interface P2PIX extends BaseContract { expirationBlock: BigNumber; pixTarget: BigNumber; buyerAddress: string; - relayerTarget: string; relayerAddress: string; token: string; } @@ -1041,7 +1028,6 @@ export interface P2PIX extends BaseContract { release( lockID: PromiseOrValue, - _relayerTarget: PromiseOrValue, pixTimestamp: PromiseOrValue, r: PromiseOrValue, s: PromiseOrValue, @@ -1052,13 +1038,13 @@ export interface P2PIX extends BaseContract { reputation(overrides?: CallOverrides): Promise; sellerAllowList( - arg0: PromiseOrValue, + sellerKey: PromiseOrValue, overrides?: CallOverrides ): Promise; sellerBalance( - arg0: PromiseOrValue, - arg1: PromiseOrValue, + sellerKey: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1106,7 +1092,7 @@ export interface P2PIX extends BaseContract { ): Promise; usedTransactions( - arg0: PromiseOrValue, + message: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1116,7 +1102,7 @@ export interface P2PIX extends BaseContract { ): Promise; validBacenSigners( - arg0: PromiseOrValue, + signer: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1219,10 +1205,13 @@ export interface P2PIX extends BaseContract { ReputationUpdated(reputation?: null): ReputationUpdatedEventFilter; "RootUpdated(address,bytes32)"( - seller?: null, - merkleRoot?: null + seller?: PromiseOrValue | null, + merkleRoot?: PromiseOrValue | null + ): RootUpdatedEventFilter; + RootUpdated( + seller?: PromiseOrValue | null, + merkleRoot?: PromiseOrValue | null ): RootUpdatedEventFilter; - RootUpdated(seller?: null, merkleRoot?: null): RootUpdatedEventFilter; "ValidSet(address,address,bool)"( seller?: PromiseOrValue | null, @@ -1255,7 +1244,7 @@ export interface P2PIX extends BaseContract { ): Promise; allowedERC20s( - arg0: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1303,7 +1292,6 @@ export interface P2PIX extends BaseContract { _seller: PromiseOrValue, _token: PromiseOrValue, _buyerAddress: PromiseOrValue, - _relayerTarget: PromiseOrValue, _relayerPremium: PromiseOrValue, _amount: PromiseOrValue, merkleProof: PromiseOrValue[], @@ -1322,7 +1310,6 @@ export interface P2PIX extends BaseContract { release( lockID: PromiseOrValue, - _relayerTarget: PromiseOrValue, pixTimestamp: PromiseOrValue, r: PromiseOrValue, s: PromiseOrValue, @@ -1333,13 +1320,13 @@ export interface P2PIX extends BaseContract { reputation(overrides?: CallOverrides): Promise; sellerAllowList( - arg0: PromiseOrValue, + sellerKey: PromiseOrValue, overrides?: CallOverrides ): Promise; sellerBalance( - arg0: PromiseOrValue, - arg1: PromiseOrValue, + sellerKey: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1387,7 +1374,7 @@ export interface P2PIX extends BaseContract { ): Promise; usedTransactions( - arg0: PromiseOrValue, + message: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1397,7 +1384,7 @@ export interface P2PIX extends BaseContract { ): Promise; validBacenSigners( - arg0: PromiseOrValue, + signer: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1427,7 +1414,7 @@ export interface P2PIX extends BaseContract { ): Promise; allowedERC20s( - arg0: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1475,7 +1462,6 @@ export interface P2PIX extends BaseContract { _seller: PromiseOrValue, _token: PromiseOrValue, _buyerAddress: PromiseOrValue, - _relayerTarget: PromiseOrValue, _relayerPremium: PromiseOrValue, _amount: PromiseOrValue, merkleProof: PromiseOrValue[], @@ -1494,7 +1480,6 @@ export interface P2PIX extends BaseContract { release( lockID: PromiseOrValue, - _relayerTarget: PromiseOrValue, pixTimestamp: PromiseOrValue, r: PromiseOrValue, s: PromiseOrValue, @@ -1505,13 +1490,13 @@ export interface P2PIX extends BaseContract { reputation(overrides?: CallOverrides): Promise; sellerAllowList( - arg0: PromiseOrValue, + sellerKey: PromiseOrValue, overrides?: CallOverrides ): Promise; sellerBalance( - arg0: PromiseOrValue, - arg1: PromiseOrValue, + sellerKey: PromiseOrValue, + erc20: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1559,7 +1544,7 @@ export interface P2PIX extends BaseContract { ): Promise; usedTransactions( - arg0: PromiseOrValue, + message: PromiseOrValue, overrides?: CallOverrides ): Promise; @@ -1569,7 +1554,7 @@ export interface P2PIX extends BaseContract { ): Promise; validBacenSigners( - arg0: PromiseOrValue, + signer: PromiseOrValue, overrides?: CallOverrides ): Promise; diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index 2a6aafe..6395b18 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -622,7 +622,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price, [], @@ -632,7 +631,6 @@ describe("P2PIX", () => { zero, zero, zero, - zero, 0, price, [], @@ -664,7 +662,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price.mul(ethers.BigNumber.from(2)), [], @@ -692,7 +689,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 1000, [ @@ -726,7 +722,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price.mul(BigNumber.from("2")), [], @@ -754,7 +749,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price, proof, @@ -788,7 +782,6 @@ describe("P2PIX", () => { 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); }); @@ -809,7 +802,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price, [], @@ -839,7 +831,6 @@ describe("P2PIX", () => { 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); @@ -878,7 +869,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, price, price, [], @@ -888,7 +878,6 @@ describe("P2PIX", () => { .connect(acc01) .release( 1, - acc02.address, endtoendID, sig.r, sig.s, @@ -900,7 +889,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price.add(ethers.constants.One), [], @@ -932,7 +920,6 @@ describe("P2PIX", () => { 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); @@ -958,7 +945,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, newPrice, proof, @@ -977,7 +963,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 100, [], @@ -996,7 +981,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc03.address, - acc03.address, 0, 100, [], @@ -1110,10 +1094,10 @@ describe("P2PIX", () => { .and.to.eq(storage2.buyerAddress); expect(storage3.buyerAddress).to.eq(acc03.address); - expect(acc03.address) - .to.eq(storage1.relayerTarget) - .and.to.eq(storage2.relayerTarget) - .and.to.eq(storage3.relayerTarget); + // expect(acc03.address) + // .to.eq(storage1.relayerTarget) + // .and.to.eq(storage2.relayerTarget) + // .and.to.eq(storage3.relayerTarget); expect(acc01.address) .to.eq(storage1.relayerAddress) @@ -1290,7 +1274,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1300,7 +1283,6 @@ describe("P2PIX", () => { await mine(13); const fail = p2pix.release( lockID, - acc03.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1337,7 +1319,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1346,7 +1327,6 @@ describe("P2PIX", () => { const lockID = ethers.constants.One; await p2pix.release( lockID, - acc03.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1354,7 +1334,6 @@ describe("P2PIX", () => { ); const fail = p2pix.release( lockID, - acc03.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1390,7 +1369,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1401,7 +1379,6 @@ describe("P2PIX", () => { .connect(acc01) .release( 1, - acc02.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1413,7 +1390,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1423,7 +1399,6 @@ describe("P2PIX", () => { .connect(acc01) .release( 2, - acc02.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1460,7 +1435,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1470,7 +1444,6 @@ describe("P2PIX", () => { .connect(acc01) .release( 1, - acc02.address, ethers.constants.HashZero, sig.r, sig.s, @@ -1522,7 +1495,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 100, [], @@ -1547,7 +1519,6 @@ describe("P2PIX", () => { .connect(acc01) .release( 1, - acc02.address, endtoendID, sig.r, sig.s, @@ -1633,8 +1604,8 @@ describe("P2PIX", () => { expect(userRecord2).to.eq(ethers.BigNumber.from(100)); await expect(tx).to.changeTokenBalances( erc20, - [acc03.address, acc02.address], - [3, 97], + [acc03.address, acc01.address, acc02.address ], + [3, 3, 94], // acc02 is acting both as buyer and relayerTarget // (i.e., 94 + 3 = 97) ); @@ -1694,7 +1665,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 100, [], @@ -1706,7 +1676,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 6, 50, [], @@ -1718,7 +1687,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 10, 25, [], @@ -1754,7 +1722,6 @@ describe("P2PIX", () => { .connect(acc01) .release( lockID, - acc02.address, endtoendID, sig1.r, sig1.s, @@ -1766,7 +1733,6 @@ describe("P2PIX", () => { .connect(acc01) .release( lockID2, - acc02.address, endtoendID, sig2.r, sig2.s, @@ -1778,7 +1744,6 @@ describe("P2PIX", () => { .connect(acc03) .release( lockID3, - acc02.address, endtoendID, sig3.r, sig3.s, @@ -1849,8 +1814,8 @@ describe("P2PIX", () => { const balances = [ [0, 100, 0, "-100"], - [0, 47, 3, "-50"], - [0, 20, 5, "-25"], + [3, 44, 3, "-50"], + [0, 15, 10, "-25"], ]; for (let i = 0; i < 3; i++) { @@ -1899,7 +1864,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 1, [], @@ -1940,7 +1904,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 1, [], @@ -1950,7 +1913,6 @@ describe("P2PIX", () => { // await mine(10); await p2pix.release( lockID, - acc03.address, endtoendID, sig.r, sig.s, @@ -1979,7 +1941,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 1, [], @@ -2045,7 +2006,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price, proof, @@ -2087,7 +2047,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, 100, [], @@ -2123,7 +2082,6 @@ describe("P2PIX", () => { owner.address, erc20.address, acc02.address, - acc03.address, 0, price, proof, diff --git a/test/utils/fixtures.ts b/test/utils/fixtures.ts index f4b19a5..6534e2a 100644 --- a/test/utils/fixtures.ts +++ b/test/utils/fixtures.ts @@ -27,7 +27,6 @@ export interface Lock { expirationBlock: BigNumber; pixTarget: BigNumber; buyerAddress: string; - relayerTarget: string; relayerAddress: string; token: string; }