From 631c1d5dfb8d2e417dcdc15c845fd26b4bc96505 Mon Sep 17 00:00:00 2001 From: PedroCailleret Date: Mon, 22 May 2023 07:43:47 -0300 Subject: [PATCH] Added support for flatsigs --- .../Reputation.sol/Reputation.dbg.json | 2 +- .../core/BaseUtils.sol/BaseUtils.dbg.json | 2 +- .../core/Constants.sol/Constants.dbg.json | 2 +- .../core/DataTypes.sol/DataTypes.dbg.json | 2 +- .../core/DataTypes.sol/DataTypes.json | 4 +- .../EventAndErrors.dbg.json | 2 +- .../OwnerSettings.sol/OwnerSettings.dbg.json | 2 +- .../lib/auth/Owned.sol/Owned.dbg.json | 2 +- .../IReputation.sol/IReputation.dbg.json | 2 +- .../ERC2771Context.sol/Context.dbg.json | 2 +- .../ERC2771Context.dbg.json | 2 +- .../lib/mock/mockToken.sol/MockToken.dbg.json | 2 +- .../lib/tokens/ERC20.sol/ERC20.dbg.json | 2 +- .../lib/utils/ECDSA.sol/ECDSA.dbg.json | 2 +- .../contracts/lib/utils/ECDSA.sol/ECDSA.json | 4 +- .../MerkleProofLib.dbg.json | 2 +- .../utils/Multicall.sol/Multicall.dbg.json | 2 +- .../ReentrancyGuard.dbg.json | 2 +- .../SafeTransferLib.dbg.json | 2 +- artifacts/contracts/p2pix.sol/P2PIX.dbg.json | 2 +- artifacts/contracts/p2pix.sol/P2PIX.json | 47 +++--- contracts/core/BaseUtils.sol | 10 +- contracts/core/DataTypes.sol | 6 + contracts/core/OwnerSettings.sol | 2 +- contracts/lib/utils/ECDSA.sol | 37 +++-- contracts/p2pix.sol | 15 +- .../factories/lib/utils/ECDSA__factory.ts | 2 +- .../factories/p2pix.sol/P2PIX__factory.ts | 45 +++--- src/types/p2pix.sol/P2PIX.ts | 52 +++---- test/p2pix.test.ts | 145 +++++++++--------- test/utils/fixtures.ts | 8 +- test/utils/interfaces.ts | 6 + 32 files changed, 214 insertions(+), 205 deletions(-) diff --git a/artifacts/contracts/Reputation.sol/Reputation.dbg.json b/artifacts/contracts/Reputation.sol/Reputation.dbg.json index d0e0ae8..b197bb4 100644 --- a/artifacts/contracts/Reputation.sol/Reputation.dbg.json +++ b/artifacts/contracts/Reputation.sol/Reputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/core/BaseUtils.sol/BaseUtils.dbg.json b/artifacts/contracts/core/BaseUtils.sol/BaseUtils.dbg.json index 9772ad4..c008590 100644 --- a/artifacts/contracts/core/BaseUtils.sol/BaseUtils.dbg.json +++ b/artifacts/contracts/core/BaseUtils.sol/BaseUtils.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/core/Constants.sol/Constants.dbg.json b/artifacts/contracts/core/Constants.sol/Constants.dbg.json index 9772ad4..c008590 100644 --- a/artifacts/contracts/core/Constants.sol/Constants.dbg.json +++ b/artifacts/contracts/core/Constants.sol/Constants.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/core/DataTypes.sol/DataTypes.dbg.json b/artifacts/contracts/core/DataTypes.sol/DataTypes.dbg.json index 9772ad4..c008590 100644 --- a/artifacts/contracts/core/DataTypes.sol/DataTypes.dbg.json +++ b/artifacts/contracts/core/DataTypes.sol/DataTypes.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/core/DataTypes.sol/DataTypes.json b/artifacts/contracts/core/DataTypes.sol/DataTypes.json index cf6a67f..e32fedf 100644 --- a/artifacts/contracts/core/DataTypes.sol/DataTypes.json +++ b/artifacts/contracts/core/DataTypes.sol/DataTypes.json @@ -3,8 +3,8 @@ "contractName": "DataTypes", "sourceName": "contracts/core/DataTypes.sol", "abi": [], - "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212201904685203adfcebeda9a1444d5381c24a37e2895e8a7dff26bd8d5af2fafcbc64736f6c63430008130033", - "deployedBytecode": "0x600080fdfea26469706673582212201904685203adfcebeda9a1444d5381c24a37e2895e8a7dff26bd8d5af2fafcbc64736f6c63430008130033", + "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea2646970667358221220cd1f7ebb936fcf31afe01a797870de94db3214655afaa1cb621785aa86bd86e964736f6c63430008130033", + "deployedBytecode": "0x600080fdfea2646970667358221220cd1f7ebb936fcf31afe01a797870de94db3214655afaa1cb621785aa86bd86e964736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/core/EventAndErrors.sol/EventAndErrors.dbg.json b/artifacts/contracts/core/EventAndErrors.sol/EventAndErrors.dbg.json index 9772ad4..c008590 100644 --- a/artifacts/contracts/core/EventAndErrors.sol/EventAndErrors.dbg.json +++ b/artifacts/contracts/core/EventAndErrors.sol/EventAndErrors.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/core/OwnerSettings.sol/OwnerSettings.dbg.json b/artifacts/contracts/core/OwnerSettings.sol/OwnerSettings.dbg.json index 9772ad4..c008590 100644 --- a/artifacts/contracts/core/OwnerSettings.sol/OwnerSettings.dbg.json +++ b/artifacts/contracts/core/OwnerSettings.sol/OwnerSettings.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json +++ b/artifacts/contracts/lib/auth/Owned.sol/Owned.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json +++ b/artifacts/contracts/lib/interfaces/IReputation.sol/IReputation.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/metatx/ERC2771Context.sol/Context.dbg.json b/artifacts/contracts/lib/metatx/ERC2771Context.sol/Context.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/metatx/ERC2771Context.sol/Context.dbg.json +++ b/artifacts/contracts/lib/metatx/ERC2771Context.sol/Context.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/metatx/ERC2771Context.sol/ERC2771Context.dbg.json b/artifacts/contracts/lib/metatx/ERC2771Context.sol/ERC2771Context.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/metatx/ERC2771Context.sol/ERC2771Context.dbg.json +++ b/artifacts/contracts/lib/metatx/ERC2771Context.sol/ERC2771Context.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json +++ b/artifacts/contracts/lib/mock/mockToken.sol/MockToken.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json +++ b/artifacts/contracts/lib/tokens/ERC20.sol/ERC20.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json +++ b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json index f17ddfb..4f8cefd 100644 --- a/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json +++ b/artifacts/contracts/lib/utils/ECDSA.sol/ECDSA.json @@ -9,8 +9,8 @@ "type": "error" } ], - "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033", - "deployedBytecode": "0x600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033", + "bytecode": "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212209602e77b0002730843efd4bf0aab444a6a8daeade7f7f10052351ae288f5aa5264736f6c63430008130033", + "deployedBytecode": "0x600080fdfea26469706673582212209602e77b0002730843efd4bf0aab444a6a8daeade7f7f10052351ae288f5aa5264736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json +++ b/artifacts/contracts/lib/utils/MerkleProofLib.sol/MerkleProofLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json b/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json +++ b/artifacts/contracts/lib/utils/Multicall.sol/Multicall.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json +++ b/artifacts/contracts/lib/utils/ReentrancyGuard.sol/ReentrancyGuard.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json index 83d0a56..fe04b3f 100644 --- a/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json +++ b/artifacts/contracts/lib/utils/SafeTransferLib.sol/SafeTransferLib.dbg.json @@ -1,4 +1,4 @@ { "_format": "hh-sol-dbg-1", - "buildInfo": "../../../../build-info/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index d0e0ae8..b197bb4 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/3d12978eb8a70621f317c36179381ad8.json" + "buildInfo": "../../build-info/811e76435f5423608b4f8fda7811bf8e.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index e6f953d..afa3f8f 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -839,29 +839,26 @@ { "inputs": [ { - "internalType": "uint256", - "name": "lockID", - "type": "uint256" - }, - { - "internalType": "bytes32", - "name": "pixTimestamp", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "r", - "type": "bytes32" - }, - { - "internalType": "bytes32", - "name": "s", - "type": "bytes32" - }, - { - "internalType": "uint8", - "name": "v", - "type": "uint8" + "components": [ + { + "internalType": "uint256", + "name": "lockID", + "type": "uint256" + }, + { + "internalType": "bytes32", + "name": "pixTimestamp", + "type": "bytes32" + }, + { + "internalType": "bytes", + "name": "signature", + "type": "bytes" + } + ], + "internalType": "struct DataTypes.ReleaseArgs", + "name": "args", + "type": "tuple" } ], "name": "release", @@ -1130,8 +1127,8 @@ "type": "receive" } ], - "bytecode": "0x608060405262002d4680380380620000178162000126565b928339810160a0828203126200010b5781516020808401519093916001600160401b03918281116200010b5784620000519185016200017f565b9062000060604085016200016a565b9260608501518181116200010b57866200007c9187016200017f565b9460808101519182116200010b57019480601f870112156200010b578551620000af620000a98262000152565b62000126565b96888089848152019260051b8201019283116200010b578801905b828210620000f157505050620000e19550620001e6565b6040516129049081620004428239f35b815180151581036200010b578152908801908801620000ca565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200014c57604052565b62000110565b6001600160401b0381116200014c5760051b60200190565b51906001600160a01b03821682036200010b57565b9080601f830112156200010b578151906200019e620000a98362000152565b9182938184526020808095019260051b8201019283116200010b578301905b828210620001cc575050505090565b838091620001da846200016a565b815201910190620001bd565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b811562000306575b5050506040519280840191818552518092526040840198925b828110620002e85750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d782620002d593620002db97980390a16001600160a01b031662000337565b62000390565b620002e66001600455565b565b83516001600160a01b03168a52988101989281019260010162000289565b9085826001829697989451600c1b550190838210156200032c5791509493929462000268565b509493929462000270565b6000546001600160a01b0390811633036200037f57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b031633036200037f5782519182156200043457815183036200042757602092919284818080970195019360051b0101925b838103620003df575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003d0565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d5780633c16f0c414610218578063461f3120146101cd57806349ef8448146102135780634b2ae9801461020e578063572b6c0514610209578063574983c8146102045780635fd8c710146101ff57806369cc6af4146101fa5780636d82d9e0146101f55780637f94f65d146101f057806380e1d302146101eb57806384ab1d28146101e65780638da5cb5b146101e15780638db564c2146101dc578063918dff57146101d75780639872dbfe146101d257806398a26871146101cd578063ad8f2eed146101c8578063b0983d39146101c3578063c52164c6146101be578063c593dfd8146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119d1565b611961565b61191a565b611803565b6117f0565b611741565b6115f9565b6112e1565b6112ad565b611279565b611235565b610c81565b611217565b611192565b611151565b61111d565b6110e7565b6110d4565b611083565b610f92565b610f5c565b610ed9565b610e75565b610e25565b610dfb565b610d64565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b19565b9050156107e157604081016105d56105d16105bd83611b6a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b6a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b74565b6bffffffffffffffffffffffff1690565b90611bcf565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611be6565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b19565b36916118b5565b611ae3565b9301611bdc565b906106c785611b6a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b6a565b6107036106248a611b74565b9030903390611c21565b6107176001600455565b611b6a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b74565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107879033612275565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611be6565b6108376108316080830183611d13565b90612092565b61084081611b6a565b9061085b6105d1602083019361085585611b6a565b90612651565b610b8f5761087a61086b82611b6a565b61087484611b6a565b90612617565b6040918281019061089c61088d83611d67565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bbc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ea2565b9290946109716108fa6108eb87611b6a565b6108f486611b6a565b9061268e565b61091b61071c61091561090f60035443611bcf565b95611d67565b96611b6a565b9061092588611b6a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d13565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d13565b929093611b6a565b6374dfee70600c5260005260206000205490565b91611d9b565b61233d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161233d565b90610a08565b15610a84575050610a2092610a6a9161233d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e29565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d7e565b911611918215610b1a575b5050610af157610a2092610a6a9161233d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b34610262576020600319360112610262576020610c796004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610cc2575050505090565b835185529381019392810192600101610cb4565b90610ce990604083526040830190610ca2565b81810360209283015282518082529082019282019160009190825b828110610d1357505050505090565b90919293948551600480821015610d3857508152820194820193929190600101610d04565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257806004013590610da2826102fc565b91610db06040519384610296565b80835260248484019160051b8301019136831161026257602401905b828210610dec57610ddc84612743565b90610a2060405192839283610cd6565b81358152908401908401610dcc565b34610262576020600319360112610262576020600435610e1a81610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff600435610e5781610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461026257600080600319360112610f595773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115610f4c576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610262576020600319360112610262576020610f7e6004356105bd81610314565b6040519015158152f35b8015150361026257565b3461026257604060031936011261026257600435610faf81610314565b602435610fbb81610f88565b610fdb82339060205263739094b1600c5260005260016034600c20015490565b8015611059578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356110a381610314565b60243590612275565b6003196040910112610262576004356110c481610314565b906024356110d181610314565b90565b34610262576020610f7e610855366110ac565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106111825750506000910152565b8181015183820152602001611172565b34610262576111a36108f4366110ac565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040938585526020865261120e84518092816060880152608087019061116f565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610c796108f4366110ac565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff811161026257610831610019913690600401611248565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102625760a06003193601126102625760043560843560ff811681036102625761130a611be6565b61131e826000526006602052604060002090565b6003810180549169ffffffffffffffffffff83169283156115be57600182018054431161159457846004846114437f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89960006114929661143c6114ac9b611414896113d861140461071c9f6002015460405192839160208301956024359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b5190209560643560443588611f17565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b61144b611ea2565b9050156114c7575b019273ffffffffffffffffffffffffffffffffffffffff611488855473ffffffffffffffffffffffffffffffffffffffff1690565b9160501c16612005565b5473ffffffffffffffffffffffffffffffffffffffff1690565b60408051948552602085019290925292a26100196001600455565b8181016114eb61071c825473ffffffffffffffffffffffffffffffffffffffff1690565b33146115715761156a61156261155261154c697fffffffffffffffffff8a60011c169461152533600c1b6000526007602052604060002090565b611530878254611bcf565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bcf565b9055611453565b5061158933600c1b6000526007602052604060002090565b61156a848254611bcf565b60046040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b9060206110d1928181520190610ca2565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761162a903690600401610332565b6024359061163782610314565b600091815191611646836126e0565b935b83811061165d5760405180610a2087826115e8565b8061168a8473ffffffffffffffffffffffffffffffffffffffff6116836001958761272f565b5116612617565b611694828861272f565b5201611648565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116c991600401610332565b926024359081116102625781602382011215610262578060040135916116ee836102fc565b926116fc6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611728575050505090565b838091833561173681610f88565b81520191019061171a565b346102625761174f3661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156117ee57805182036117e15790602084818080970194019260051b0101915b82810361179f578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a301910190611794565b63ff633a3883526004601cfd5bfe5b34610262576020610c79610874366110ac565b34610262576118113661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118a857805182036117e15790602084818080970194019260051b0101915b828103611861578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611856565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d757604051916118fd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610c796106b160209236906024816004013591016118b5565b346102625760206003193601126102625760043561197e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610262576060600319360112610262576004356119ee81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a47611a39611acb933690600401611248565b90611a42611be6565b612092565b611a518433612651565b611ad5575b611a8f3385836b3fffffffffffffffffffffff611a8983339060205263739094b1600c5260005260016034600c20015490565b166125db565b611a9a813386612005565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611ade84611c7a565b611a56565b604051611b0d60208281611b00818301968781519384920161116f565b8101038084520182610296565b516020106117ee575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356110d181610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bca57565b611b8d565b91908201809211611bca57565b356110d181610f88565b600260045414611bf7576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c6c576000606052604052565b637939f4246000526004601cfd5b611c9a81339060205263739094b1600c5260005260016034600c20015490565b8015611059576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bca57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611ded575b505003611dc357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e1e579290611df7565b509150503880611dba565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d7576020926000926040525190600254617530fa906000519115611e9457565b63e10bf1cc6000526004601cfd5b611eaa611ed0565b90600073ffffffffffffffffffffffffffffffffffffffff831633146110d15750600190565b33600052600160205260ff60406000205416600014611f13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b918254611fdb5760806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1948452600094859384927b19457468657265756d205369676e6564204d6573736167653a0a3332845260ff603c600420996040519a865216875260405280606052105afa508051903d15611fce576060526040829052600c1b5415611fa65750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561204157603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561208d5760051b0190565b61204e565b6000905b8282106120b35750106120a557565b63dfb035c96000526004601cfd5b906120d36120c282858561207d565b356000526006602052604060002090565b906120dd826122c4565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061216d69ffffffffffffffffffff6b3fffffffffffffffffffffff6121638b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bcf565b1161078d576121c37f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da59461141460049460019a612239979060205263739094b1600c5260005260016034600c2001908154019055565b016121e561154c825473ffffffffffffffffffffffffffffffffffffffff1690565b6122036121fc826000526007602052604060002090565b5460011c90565b68056bc75e2d63100000811161225a575061222b611492916000526007602052604060002090565b68056bc75e2d631000009055565b9161224584888861207d565b60405190358152921691602090a20190612096565b9061226f906000526007602052604060002090565b55611492565b3381036122b6576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b600181015443106122e6576003015469ffffffffffffffffffff16156115be57565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bca5760010190565b612472907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d61256d94938051600052600660205260406000208151815560208201516001820155604082015160028201556125d6612599612588600384019461253c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561244f612400608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b6124b660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61251e60c08601996124dc8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a16916125db565b61254f61254a600554612310565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126095760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612625575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d1561265f575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d1561269c575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b906126ea826102fc565b6126f76040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061272582946102fc565b0190602036910137565b805182101561208d5760209160051b010190565b908151156128bb576000918281519061275b826126e0565b92612765836126e0565b955b83811061277657505050509190565b6127b761071c600561279c61278b858761272f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6127e957806127c86001928461272f565b516127d3828861272f565b52836127df828a61272f565b5201925b92612767565b69ffffffffffffffffffff612817600361280661278b858761272f565b015469ffffffffffffffffffff1690565b1661284f57806128296001928461272f565b51612834828861272f565b52612848612842828a61272f565b60039052565b01926127e3565b6001908161286061278b838661272f565b015443111561289257612873818461272f565b5161287e828861272f565b5261284861288c828a61272f565b60029052565b61289c818461272f565b516128a7828861272f565b526128486128b5828a61272f565b60019052565b90506128c56126b7565b906110d16126b756fea2646970667358221220ed724ed47bcdef6140dc4a66d86c43ecffa97e169222a98775625d6852ec98f964736f6c63430008130033", - "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d5780633c16f0c414610218578063461f3120146101cd57806349ef8448146102135780634b2ae9801461020e578063572b6c0514610209578063574983c8146102045780635fd8c710146101ff57806369cc6af4146101fa5780636d82d9e0146101f55780637f94f65d146101f057806380e1d302146101eb57806384ab1d28146101e65780638da5cb5b146101e15780638db564c2146101dc578063918dff57146101d75780639872dbfe146101d257806398a26871146101cd578063ad8f2eed146101c8578063b0983d39146101c3578063c52164c6146101be578063c593dfd8146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119d1565b611961565b61191a565b611803565b6117f0565b611741565b6115f9565b6112e1565b6112ad565b611279565b611235565b610c81565b611217565b611192565b611151565b61111d565b6110e7565b6110d4565b611083565b610f92565b610f5c565b610ed9565b610e75565b610e25565b610dfb565b610d64565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b19565b9050156107e157604081016105d56105d16105bd83611b6a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b6a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b74565b6bffffffffffffffffffffffff1690565b90611bcf565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611be6565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b19565b36916118b5565b611ae3565b9301611bdc565b906106c785611b6a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b6a565b6107036106248a611b74565b9030903390611c21565b6107176001600455565b611b6a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b74565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107879033612275565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611be6565b6108376108316080830183611d13565b90612092565b61084081611b6a565b9061085b6105d1602083019361085585611b6a565b90612651565b610b8f5761087a61086b82611b6a565b61087484611b6a565b90612617565b6040918281019061089c61088d83611d67565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bbc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ea2565b9290946109716108fa6108eb87611b6a565b6108f486611b6a565b9061268e565b61091b61071c61091561090f60035443611bcf565b95611d67565b96611b6a565b9061092588611b6a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d13565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d13565b929093611b6a565b6374dfee70600c5260005260206000205490565b91611d9b565b61233d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161233d565b90610a08565b15610a84575050610a2092610a6a9161233d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e29565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d7e565b911611918215610b1a575b5050610af157610a2092610a6a9161233d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b34610262576020600319360112610262576020610c796004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610cc2575050505090565b835185529381019392810192600101610cb4565b90610ce990604083526040830190610ca2565b81810360209283015282518082529082019282019160009190825b828110610d1357505050505090565b90919293948551600480821015610d3857508152820194820193929190600101610d04565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257806004013590610da2826102fc565b91610db06040519384610296565b80835260248484019160051b8301019136831161026257602401905b828210610dec57610ddc84612743565b90610a2060405192839283610cd6565b81358152908401908401610dcc565b34610262576020600319360112610262576020600435610e1a81610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff600435610e5781610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461026257600080600319360112610f595773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115610f4c576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610262576020600319360112610262576020610f7e6004356105bd81610314565b6040519015158152f35b8015150361026257565b3461026257604060031936011261026257600435610faf81610314565b602435610fbb81610f88565b610fdb82339060205263739094b1600c5260005260016034600c20015490565b8015611059578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356110a381610314565b60243590612275565b6003196040910112610262576004356110c481610314565b906024356110d181610314565b90565b34610262576020610f7e610855366110ac565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106111825750506000910152565b8181015183820152602001611172565b34610262576111a36108f4366110ac565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040938585526020865261120e84518092816060880152608087019061116f565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610c796108f4366110ac565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff811161026257610831610019913690600401611248565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102625760a06003193601126102625760043560843560ff811681036102625761130a611be6565b61131e826000526006602052604060002090565b6003810180549169ffffffffffffffffffff83169283156115be57600182018054431161159457846004846114437f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89960006114929661143c6114ac9b611414896113d861140461071c9f6002015460405192839160208301956024359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b5190209560643560443588611f17565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b61144b611ea2565b9050156114c7575b019273ffffffffffffffffffffffffffffffffffffffff611488855473ffffffffffffffffffffffffffffffffffffffff1690565b9160501c16612005565b5473ffffffffffffffffffffffffffffffffffffffff1690565b60408051948552602085019290925292a26100196001600455565b8181016114eb61071c825473ffffffffffffffffffffffffffffffffffffffff1690565b33146115715761156a61156261155261154c697fffffffffffffffffff8a60011c169461152533600c1b6000526007602052604060002090565b611530878254611bcf565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bcf565b9055611453565b5061158933600c1b6000526007602052604060002090565b61156a848254611bcf565b60046040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b9060206110d1928181520190610ca2565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761162a903690600401610332565b6024359061163782610314565b600091815191611646836126e0565b935b83811061165d5760405180610a2087826115e8565b8061168a8473ffffffffffffffffffffffffffffffffffffffff6116836001958761272f565b5116612617565b611694828861272f565b5201611648565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116c991600401610332565b926024359081116102625781602382011215610262578060040135916116ee836102fc565b926116fc6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611728575050505090565b838091833561173681610f88565b81520191019061171a565b346102625761174f3661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156117ee57805182036117e15790602084818080970194019260051b0101915b82810361179f578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a301910190611794565b63ff633a3883526004601cfd5bfe5b34610262576020610c79610874366110ac565b34610262576118113661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118a857805182036117e15790602084818080970194019260051b0101915b828103611861578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611856565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d757604051916118fd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610c796106b160209236906024816004013591016118b5565b346102625760206003193601126102625760043561197e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610262576060600319360112610262576004356119ee81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a47611a39611acb933690600401611248565b90611a42611be6565b612092565b611a518433612651565b611ad5575b611a8f3385836b3fffffffffffffffffffffff611a8983339060205263739094b1600c5260005260016034600c20015490565b166125db565b611a9a813386612005565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611ade84611c7a565b611a56565b604051611b0d60208281611b00818301968781519384920161116f565b8101038084520182610296565b516020106117ee575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356110d181610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bca57565b611b8d565b91908201809211611bca57565b356110d181610f88565b600260045414611bf7576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c6c576000606052604052565b637939f4246000526004601cfd5b611c9a81339060205263739094b1600c5260005260016034600c20015490565b8015611059576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bca57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611ded575b505003611dc357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e1e579290611df7565b509150503880611dba565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d7576020926000926040525190600254617530fa906000519115611e9457565b63e10bf1cc6000526004601cfd5b611eaa611ed0565b90600073ffffffffffffffffffffffffffffffffffffffff831633146110d15750600190565b33600052600160205260ff60406000205416600014611f13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b918254611fdb5760806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1948452600094859384927b19457468657265756d205369676e6564204d6573736167653a0a3332845260ff603c600420996040519a865216875260405280606052105afa508051903d15611fce576060526040829052600c1b5415611fa65750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561204157603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561208d5760051b0190565b61204e565b6000905b8282106120b35750106120a557565b63dfb035c96000526004601cfd5b906120d36120c282858561207d565b356000526006602052604060002090565b906120dd826122c4565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061216d69ffffffffffffffffffff6b3fffffffffffffffffffffff6121638b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bcf565b1161078d576121c37f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da59461141460049460019a612239979060205263739094b1600c5260005260016034600c2001908154019055565b016121e561154c825473ffffffffffffffffffffffffffffffffffffffff1690565b6122036121fc826000526007602052604060002090565b5460011c90565b68056bc75e2d63100000811161225a575061222b611492916000526007602052604060002090565b68056bc75e2d631000009055565b9161224584888861207d565b60405190358152921691602090a20190612096565b9061226f906000526007602052604060002090565b55611492565b3381036122b6576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b600181015443106122e6576003015469ffffffffffffffffffff16156115be57565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bca5760010190565b612472907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d61256d94938051600052600660205260406000208151815560208201516001820155604082015160028201556125d6612599612588600384019461253c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561244f612400608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b6124b660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61251e60c08601996124dc8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a16916125db565b61254f61254a600554612310565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126095760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612625575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d1561265f575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d1561269c575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b906126ea826102fc565b6126f76040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061272582946102fc565b0190602036910137565b805182101561208d5760209160051b010190565b908151156128bb576000918281519061275b826126e0565b92612765836126e0565b955b83811061277657505050509190565b6127b761071c600561279c61278b858761272f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6127e957806127c86001928461272f565b516127d3828861272f565b52836127df828a61272f565b5201925b92612767565b69ffffffffffffffffffff612817600361280661278b858761272f565b015469ffffffffffffffffffff1690565b1661284f57806128296001928461272f565b51612834828861272f565b52612848612842828a61272f565b60039052565b01926127e3565b6001908161286061278b838661272f565b015443111561289257612873818461272f565b5161287e828861272f565b5261284861288c828a61272f565b60029052565b61289c818461272f565b516128a7828861272f565b526128486128b5828a61272f565b60019052565b90506128c56126b7565b906110d16126b756fea2646970667358221220ed724ed47bcdef6140dc4a66d86c43ecffa97e169222a98775625d6852ec98f964736f6c63430008130033", + "bytecode": "0x608060405262002d9680380380620000178162000126565b928339810160a0828203126200010b5781516020808401519093916001600160401b03918281116200010b5784620000519185016200017f565b9062000060604085016200016a565b9260608501518181116200010b57866200007c9187016200017f565b9460808101519182116200010b57019480601f870112156200010b578551620000af620000a98262000152565b62000126565b96888089848152019260051b8201019283116200010b578801905b828210620000f157505050620000e19550620001e6565b6040516129549081620004428239f35b815180151581036200010b578152908801908801620000ca565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200014c57604052565b62000110565b6001600160401b0381116200014c5760051b60200190565b51906001600160a01b03821682036200010b57565b9080601f830112156200010b578151906200019e620000a98362000152565b9182938184526020808095019260051b8201019283116200010b578301905b828210620001cc575050505090565b838091620001da846200016a565b815201910190620001bd565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b811562000306575b5050506040519280840191818552518092526040840198925b828110620002e85750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d782620002d593620002db97980390a16001600160a01b031662000337565b62000390565b620002e66001600455565b565b83516001600160a01b03168a52988101989281019260010162000289565b9085826001829697989451600c1b550190838210156200032c5791509493929462000268565b509493929462000270565b6000546001600160a01b0390811633036200037f57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b031633036200037f5782519182156200043457815183036200042757602092919284818080970195019360051b0101925b838103620003df575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003d0565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d57806337c49d9c146102185780633c16f0c414610213578063461f3120146101c857806349ef84481461020e5780634b2ae98014610209578063572b6c0514610204578063574983c8146101ff5780635fd8c710146101fa57806369cc6af4146101f55780636d82d9e0146101f05780637f94f65d146101eb57806380e1d302146101e657806384ab1d28146101e15780638da5cb5b146101dc5780638db564c2146101d7578063918dff57146101d25780639872dbfe146101cd57806398a26871146101c8578063ad8f2eed146101c3578063b0983d39146101be578063c52164c6146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119f1565b611981565b61193a565b611823565b611810565b611761565b611619565b6115d4565b6115a0565b61155c565b610fa8565b61153e565b6114b9565b611478565b611444565b61140e565b6113fb565b6113aa565b6112b9565b611283565b611200565b61119c565b61114c565b611122565b61108b565b610f7e565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b39565b9050156107e157604081016105d56105d16105bd83611b8a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b8a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b94565b6bffffffffffffffffffffffff1690565b90611bef565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611c06565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b39565b36916118d5565b611b03565b9301611bfc565b906106c785611b8a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b8a565b6107036106248a611b94565b9030903390611c41565b6107176001600455565b611b8a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b94565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b610787903361229b565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611c06565b6108376108316080830183611d33565b906120b8565b61084081611b8a565b9061085b6105d1602083019361085585611b8a565b906126a1565b610b8f5761087a61086b82611b8a565b61087484611b8a565b90612667565b6040918281019061089c61088d83611d87565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bdc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ec0565b9290946109716108fa6108eb87611b8a565b6108f486611b8a565b906126de565b61091b61071c61091561090f60035443611bef565b95611d87565b96611b8a565b9061092588611b8a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d33565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d33565b929093611b8a565b6374dfee70600c5260005260206000205490565b91611dbb565b61238d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161238d565b90610a08565b15610a84575050610a2092610a6a9161238d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e49565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d9e565b911611918215610b1a575b5050610af157610a2092610a6a9161238d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b346102625760031960208136011261026257600490813567ffffffffffffffff811161026257606081840192823603011261026257610c94611c06565b813591610cab836000526006602052604060002090565b600381019283549269ffffffffffffffffffff8416948515610f5557600184019182544311610f2c579260008593610dcf610dd694610da7610da07f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89d9e996044888f610d95610e439f6002015491610d696040519384926024602085019701359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b519020980190611b39565b9087611f35565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b610dde611ec0565b905015610e5f575b01610e2984610e09835473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff809660501c1661202b565b5473ffffffffffffffffffffffffffffffffffffffff1690565b6040805195865260208601939093521692a26100196001600455565b818101610e8361071c825473ffffffffffffffffffffffffffffffffffffffff1690565b3314610f0957610f02610efa610eea610ee4697fffffffffffffffffff8960011c1694610ebd33600c1b6000526007602052604060002090565b610ec8878254611bef565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bef565b9055610de6565b50610f2133600c1b6000526007602052604060002090565b610f02868254611bef565b886040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b876040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576020610fa06004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610fe9575050505090565b835185529381019392810192600101610fdb565b9061101090604083526040830190610fc9565b81810360209283015282518082529082019282019160009190825b82811061103a57505050505090565b9091929394855160048082101561105f5750815282019482019392919060010161102b565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff81116102625736602382011215610262578060040135906110c9826102fc565b916110d76040519384610296565b80835260248484019160051b8301019136831161026257602401905b8282106111135761110384612793565b90610a2060405192839283610ffd565b813581529084019084016110f3565b3461026257602060031936011261026257602060043561114181610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff60043561117e81610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b34610262576000806003193601126112805773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115611273576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b346102625760206003193601126102625760206112a56004356105bd81610314565b6040519015158152f35b8015150361026257565b34610262576040600319360112610262576004356112d681610314565b6024356112e2816112af565b61130282339060205263739094b1600c5260005260016034600c20015490565b8015611380578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356113ca81610314565b6024359061229b565b6003196040910112610262576004356113eb81610314565b906024356113f881610314565b90565b346102625760206112a5610855366113d3565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106114a95750506000910152565b8181015183820152602001611499565b34610262576114ca6108f4366113d3565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409385855260208652611535845180928160608801526080870190611496565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610fa06108f4366113d3565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff81116102625761083161001991369060040161156f565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b9060206113f8928181520190610fc9565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761164a903690600401610332565b6024359061165782610314565b60009181519161166683612730565b935b83811061167d5760405180610a208782611608565b806116aa8473ffffffffffffffffffffffffffffffffffffffff6116a36001958761277f565b5116612667565b6116b4828861277f565b5201611668565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116e991600401610332565b9260243590811161026257816023820112156102625780600401359161170e836102fc565b9261171c6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611748575050505090565b8380918335611756816112af565b81520191019061173a565b346102625761176f366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d57825190811561180e57805182036118015790602084818080970194019260051b0101915b8281036117bf578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a3019101906117b4565b63ff633a3883526004601cfd5bfe5b34610262576020610fa0610874366113d3565b3461026257611831366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118c857805182036118015790602084818080970194019260051b0101915b828103611881578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611876565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d7576040519161191d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610fa06106b160209236906024816004013591016118d5565b346102625760206003193601126102625760043561199e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461026257606060031936011261026257600435611a0e81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a67611a59611aeb93369060040161156f565b90611a62611c06565b6120b8565b611a7184336126a1565b611af5575b611aaf3385836b3fffffffffffffffffffffff611aa983339060205263739094b1600c5260005260016034600c20015490565b1661262b565b611aba81338661202b565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611afe84611c9a565b611a76565b604051611b2d60208281611b208183019687815193849201611496565b8101038084520182610296565b5160201061180e575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356113f881610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bea57565b611bad565b91908201809211611bea57565b356113f8816112af565b600260045414611c17576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c8c576000606052604052565b637939f4246000526004601cfd5b611cba81339060205263739094b1600c5260005260016034600c20015490565b8015611380576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bea57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611e0d575b505003611de357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e3e579290611e17565b509150503880611dda565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d75760209260009260405251906002545afa906000519115611eb257565b63e10bf1cc6000526004601cfd5b611ec8611eee565b90600073ffffffffffffffffffffffffffffffffffffffff831633146113f85750600190565b33600052600160205260ff60406000205416600014611f31577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b91909180546120015760809160209182526000928380927b19457468657265756d205369676e6564204d6573736167653a0a333282526040603c600420978151988282813784520135821a855260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1606051109114165afa508051903d15611ff4576060526040829052600c1b5415611fcc5750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561206757603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156120b35760051b0190565b612074565b6000905b8282106120d95750106120cb57565b63dfb035c96000526004601cfd5b906120f96120e88285856120a3565b356000526006602052604060002090565b90612103826122ea565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061219369ffffffffffffffffffff6b3fffffffffffffffffffffff6121898b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bef565b1161078d576121e97f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da594610da760049460019a61225f979060205263739094b1600c5260005260016034600c2001908154019055565b0161220b610ee4825473ffffffffffffffffffffffffffffffffffffffff1690565b612229612222826000526007602052604060002090565b5460011c90565b68056bc75e2d6310000081116122805750612251610e29916000526007602052604060002090565b68056bc75e2d631000009055565b9161226b8488886120a3565b60405190358152921691602090a201906120bc565b90612295906000526007602052604060002090565b55610e29565b3381036122dc576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b60018101544310612336576003015469ffffffffffffffffffff161561230c57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bea5760010190565b6124c2907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d6125bd94938051600052600660205260406000208151815560208201516001820155604082015160028201556126266125e96125d8600384019461258c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561249f612450608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b61250660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61256e60c086019961252c8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a169161262b565b61259f61259a600554612360565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126595760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612675575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d156126af575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d156126ec575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b9061273a826102fc565b6127476040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061277582946102fc565b0190602036910137565b80518210156120b35760209160051b010190565b9081511561290b57600091828151906127ab82612730565b926127b583612730565b955b8381106127c657505050509190565b61280761071c60056127ec6127db858761277f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b61283957806128186001928461277f565b51612823828861277f565b528361282f828a61277f565b5201925b926127b7565b69ffffffffffffffffffff61286760036128566127db858761277f565b015469ffffffffffffffffffff1690565b1661289f57806128796001928461277f565b51612884828861277f565b52612898612892828a61277f565b60039052565b0192612833565b600190816128b06127db838661277f565b01544311156128e2576128c3818461277f565b516128ce828861277f565b526128986128dc828a61277f565b60029052565b6128ec818461277f565b516128f7828861277f565b52612898612905828a61277f565b60019052565b9050612915612707565b906113f861270756fea264697066735822122020ab01315290857bcc58211103671123a74fc34d0dd26946504db14cf5aac5eb64736f6c63430008130033", + "deployedBytecode": "0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d57806337c49d9c146102185780633c16f0c414610213578063461f3120146101c857806349ef84481461020e5780634b2ae98014610209578063572b6c0514610204578063574983c8146101ff5780635fd8c710146101fa57806369cc6af4146101f55780636d82d9e0146101f05780637f94f65d146101eb57806380e1d302146101e657806384ab1d28146101e15780638da5cb5b146101dc5780638db564c2146101d7578063918dff57146101d25780639872dbfe146101cd57806398a26871146101c8578063ad8f2eed146101c3578063b0983d39146101be578063c52164c6146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119f1565b611981565b61193a565b611823565b611810565b611761565b611619565b6115d4565b6115a0565b61155c565b610fa8565b61153e565b6114b9565b611478565b611444565b61140e565b6113fb565b6113aa565b6112b9565b611283565b611200565b61119c565b61114c565b611122565b61108b565b610f7e565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b39565b9050156107e157604081016105d56105d16105bd83611b8a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b8a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b94565b6bffffffffffffffffffffffff1690565b90611bef565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611c06565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b39565b36916118d5565b611b03565b9301611bfc565b906106c785611b8a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b8a565b6107036106248a611b94565b9030903390611c41565b6107176001600455565b611b8a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b94565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b610787903361229b565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611c06565b6108376108316080830183611d33565b906120b8565b61084081611b8a565b9061085b6105d1602083019361085585611b8a565b906126a1565b610b8f5761087a61086b82611b8a565b61087484611b8a565b90612667565b6040918281019061089c61088d83611d87565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bdc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ec0565b9290946109716108fa6108eb87611b8a565b6108f486611b8a565b906126de565b61091b61071c61091561090f60035443611bef565b95611d87565b96611b8a565b9061092588611b8a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d33565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d33565b929093611b8a565b6374dfee70600c5260005260206000205490565b91611dbb565b61238d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161238d565b90610a08565b15610a84575050610a2092610a6a9161238d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e49565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d9e565b911611918215610b1a575b5050610af157610a2092610a6a9161238d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b346102625760031960208136011261026257600490813567ffffffffffffffff811161026257606081840192823603011261026257610c94611c06565b813591610cab836000526006602052604060002090565b600381019283549269ffffffffffffffffffff8416948515610f5557600184019182544311610f2c579260008593610dcf610dd694610da7610da07f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89d9e996044888f610d95610e439f6002015491610d696040519384926024602085019701359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b519020980190611b39565b9087611f35565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b610dde611ec0565b905015610e5f575b01610e2984610e09835473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff809660501c1661202b565b5473ffffffffffffffffffffffffffffffffffffffff1690565b6040805195865260208601939093521692a26100196001600455565b818101610e8361071c825473ffffffffffffffffffffffffffffffffffffffff1690565b3314610f0957610f02610efa610eea610ee4697fffffffffffffffffff8960011c1694610ebd33600c1b6000526007602052604060002090565b610ec8878254611bef565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bef565b9055610de6565b50610f2133600c1b6000526007602052604060002090565b610f02868254611bef565b886040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b876040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576020610fa06004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610fe9575050505090565b835185529381019392810192600101610fdb565b9061101090604083526040830190610fc9565b81810360209283015282518082529082019282019160009190825b82811061103a57505050505090565b9091929394855160048082101561105f5750815282019482019392919060010161102b565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff81116102625736602382011215610262578060040135906110c9826102fc565b916110d76040519384610296565b80835260248484019160051b8301019136831161026257602401905b8282106111135761110384612793565b90610a2060405192839283610ffd565b813581529084019084016110f3565b3461026257602060031936011261026257602060043561114181610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff60043561117e81610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b34610262576000806003193601126112805773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115611273576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b346102625760206003193601126102625760206112a56004356105bd81610314565b6040519015158152f35b8015150361026257565b34610262576040600319360112610262576004356112d681610314565b6024356112e2816112af565b61130282339060205263739094b1600c5260005260016034600c20015490565b8015611380578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356113ca81610314565b6024359061229b565b6003196040910112610262576004356113eb81610314565b906024356113f881610314565b90565b346102625760206112a5610855366113d3565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106114a95750506000910152565b8181015183820152602001611499565b34610262576114ca6108f4366113d3565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409385855260208652611535845180928160608801526080870190611496565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610fa06108f4366113d3565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff81116102625761083161001991369060040161156f565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b9060206113f8928181520190610fc9565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761164a903690600401610332565b6024359061165782610314565b60009181519161166683612730565b935b83811061167d5760405180610a208782611608565b806116aa8473ffffffffffffffffffffffffffffffffffffffff6116a36001958761277f565b5116612667565b6116b4828861277f565b5201611668565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116e991600401610332565b9260243590811161026257816023820112156102625780600401359161170e836102fc565b9261171c6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611748575050505090565b8380918335611756816112af565b81520191019061173a565b346102625761176f366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d57825190811561180e57805182036118015790602084818080970194019260051b0101915b8281036117bf578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a3019101906117b4565b63ff633a3883526004601cfd5bfe5b34610262576020610fa0610874366113d3565b3461026257611831366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118c857805182036118015790602084818080970194019260051b0101915b828103611881578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611876565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d7576040519161191d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610fa06106b160209236906024816004013591016118d5565b346102625760206003193601126102625760043561199e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461026257606060031936011261026257600435611a0e81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a67611a59611aeb93369060040161156f565b90611a62611c06565b6120b8565b611a7184336126a1565b611af5575b611aaf3385836b3fffffffffffffffffffffff611aa983339060205263739094b1600c5260005260016034600c20015490565b1661262b565b611aba81338661202b565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611afe84611c9a565b611a76565b604051611b2d60208281611b208183019687815193849201611496565b8101038084520182610296565b5160201061180e575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356113f881610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bea57565b611bad565b91908201809211611bea57565b356113f8816112af565b600260045414611c17576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c8c576000606052604052565b637939f4246000526004601cfd5b611cba81339060205263739094b1600c5260005260016034600c20015490565b8015611380576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bea57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611e0d575b505003611de357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e3e579290611e17565b509150503880611dda565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d75760209260009260405251906002545afa906000519115611eb257565b63e10bf1cc6000526004601cfd5b611ec8611eee565b90600073ffffffffffffffffffffffffffffffffffffffff831633146113f85750600190565b33600052600160205260ff60406000205416600014611f31577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b91909180546120015760809160209182526000928380927b19457468657265756d205369676e6564204d6573736167653a0a333282526040603c600420978151988282813784520135821a855260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1606051109114165afa508051903d15611ff4576060526040829052600c1b5415611fcc5750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561206757603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156120b35760051b0190565b612074565b6000905b8282106120d95750106120cb57565b63dfb035c96000526004601cfd5b906120f96120e88285856120a3565b356000526006602052604060002090565b90612103826122ea565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061219369ffffffffffffffffffff6b3fffffffffffffffffffffff6121898b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bef565b1161078d576121e97f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da594610da760049460019a61225f979060205263739094b1600c5260005260016034600c2001908154019055565b0161220b610ee4825473ffffffffffffffffffffffffffffffffffffffff1690565b612229612222826000526007602052604060002090565b5460011c90565b68056bc75e2d6310000081116122805750612251610e29916000526007602052604060002090565b68056bc75e2d631000009055565b9161226b8488886120a3565b60405190358152921691602090a201906120bc565b90612295906000526007602052604060002090565b55610e29565b3381036122dc576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b60018101544310612336576003015469ffffffffffffffffffff161561230c57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bea5760010190565b6124c2907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d6125bd94938051600052600660205260406000208151815560208201516001820155604082015160028201556126266125e96125d8600384019461258c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561249f612450608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b61250660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61256e60c086019961252c8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a169161262b565b61259f61259a600554612360565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126595760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612675575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d156126af575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d156126ec575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b9061273a826102fc565b6127476040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061277582946102fc565b0190602036910137565b80518210156120b35760209160051b010190565b9081511561290b57600091828151906127ab82612730565b926127b583612730565b955b8381106127c657505050509190565b61280761071c60056127ec6127db858761277f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b61283957806128186001928461277f565b51612823828861277f565b528361282f828a61277f565b5201925b926127b7565b69ffffffffffffffffffff61286760036128566127db858761277f565b015469ffffffffffffffffffff1690565b1661289f57806128796001928461277f565b51612884828861277f565b52612898612892828a61277f565b60039052565b0192612833565b600190816128b06127db838661277f565b01544311156128e2576128c3818461277f565b516128ce828861277f565b526128986128dc828a61277f565b60029052565b6128ec818461277f565b516128f7828861277f565b52612898612905828a61277f565b60019052565b9050612915612707565b906113f861270756fea264697066735822122020ab01315290857bcc58211103671123a74fc34d0dd26946504db14cf5aac5eb64736f6c63430008130033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/core/BaseUtils.sol b/contracts/core/BaseUtils.sol index 96216b2..0b5fd68 100644 --- a/contracts/core/BaseUtils.sol +++ b/contracts/core/BaseUtils.sol @@ -35,9 +35,7 @@ abstract contract BaseUtils is function _signerCheck( bytes32 _message, - bytes32 _r, - bytes32 _s, - uint8 _v + bytes calldata _signature ) internal view { if (usedTransactions(_message)) revert TxAlreadyUsed(); @@ -45,13 +43,11 @@ abstract contract BaseUtils is if ( !validBacenSigners( _castAddrToKey( - ECDSA.recover( + ECDSA.recoverCalldata( ECDSA.toEthSignedMessageHash( _message ), - _v, - _r, - _s + _signature ) ) ) diff --git a/contracts/core/DataTypes.sol b/contracts/core/DataTypes.sol index 05316c7..969f3f5 100644 --- a/contracts/core/DataTypes.sol +++ b/contracts/core/DataTypes.sol @@ -20,6 +20,12 @@ library DataTypes { uint256[] expiredLocks; } + struct ReleaseArgs { + uint256 lockID; + bytes32 pixTimestamp; + bytes signature; + } + struct Lock { uint256 counter; uint256 expirationBlock; diff --git a/contracts/core/OwnerSettings.sol b/contracts/core/OwnerSettings.sol index 5f4f7dc..67e4a5c 100644 --- a/contracts/core/OwnerSettings.sol +++ b/contracts/core/OwnerSettings.sol @@ -218,7 +218,7 @@ abstract contract OwnerSettings is assembly { success := staticcall( // gas - 0x7530, + gas(), // address sload(reputation.slot), // argsOffset diff --git a/contracts/lib/utils/ECDSA.sol b/contracts/lib/utils/ECDSA.sol index b2c8ad6..9cf53fb 100644 --- a/contracts/lib/utils/ECDSA.sol +++ b/contracts/lib/utils/ECDSA.sol @@ -15,26 +15,43 @@ library ECDSA { 0x7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0; /// @dev Recovers the signer's address from a message digest `hash`, - /// and the signature defined by `v`, `r`, `s`. - function recover( + /// and the `signature`. + /// + /// This function does NOT accept EIP-2098 short form signatures. + /// Use `recover(bytes32 hash, bytes32 r, bytes32 vs)` for EIP-2098 + /// short form signatures instead. + function recoverCalldata( bytes32 hash, - uint8 v, - bytes32 r, - bytes32 s + bytes calldata signature ) internal view returns (address result) { /// @solidity memory-safe-assembly assembly { // Copy the free memory pointer so that we can restore it later. let m := mload(0x40) + // Directly copy `r` and `s` from the calldata. + calldatacopy(0x40, signature.offset, 0x40) + // Store the `hash` in the scratch space. mstore(0x00, hash) - mstore(0x20, and(v, 0xff)) - mstore(0x40, r) - mstore(0x60, s) + // Compute `v` and store it in the scratch space. + mstore( + 0x20, + byte( + 0, + calldataload(add(signature.offset, 0x40)) + ) + ) pop( staticcall( gas(), // Amount of gas left for the transaction. - // If `s` in lower half order, such that the signature is not malleable. - lt(s, add(_MALLEABILITY_THRESHOLD, 1)), // Address of `ecrecover`. + and( + // If the signature is exactly 65 bytes in length. + eq(signature.length, 65), + // If `s` in lower half order, such that the signature is not malleable. + lt( + mload(0x60), + add(_MALLEABILITY_THRESHOLD, 1) + ) + ), // Address of `ecrecover`. 0x00, // Start of input. 0x80, // Size of input. 0x00, // Start of output. diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index a89c175..b909c2e 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -20,6 +20,7 @@ contract P2PIX is BaseUtils { using DT for DT.DepositArgs; using DT for DT.LockArgs; + using DT for DT.ReleaseArgs; using DT for DT.Lock; using DT for DT.LockStatus; @@ -206,13 +207,9 @@ contract P2PIX is BaseUtils { /// - `release` caller gets accrued with `l.relayerPremium` as userRecord credit; /// @dev Function sighash: 0x4e1389ed. function release( - uint256 lockID, - bytes32 pixTimestamp, - bytes32 r, - bytes32 s, - uint8 v + DT.ReleaseArgs calldata args ) public nonReentrant { - DT.Lock storage l = mapLocks[lockID]; + DT.Lock storage l = mapLocks[args.lockID]; if (l.amount == 0) revert AlreadyReleased(); if (l.expirationBlock < block.number) @@ -222,11 +219,11 @@ contract P2PIX is BaseUtils { abi.encodePacked( l.pixTarget, l.amount, - pixTimestamp + args.pixTimestamp ) ); - _signerCheck(message, r, s, v); + _signerCheck(message, args.signature); ERC20 t = ERC20(l.token); @@ -254,7 +251,7 @@ contract P2PIX is BaseUtils { lockAmount ); - emit LockReleased(l.buyerAddress, lockID, lockAmount); + emit LockReleased(l.buyerAddress, args.lockID, lockAmount); } /// @notice Unlocks expired locks. diff --git a/src/types/factories/lib/utils/ECDSA__factory.ts b/src/types/factories/lib/utils/ECDSA__factory.ts index a1b7140..f6d9605 100644 --- a/src/types/factories/lib/utils/ECDSA__factory.ts +++ b/src/types/factories/lib/utils/ECDSA__factory.ts @@ -15,7 +15,7 @@ const _abi = [ ]; const _bytecode = - "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212201f6fe8a460e1235bb7e19365d8e3cc56b718d44f5db82f5fa3c90d3c7da59ebf64736f6c63430008130033"; + "0x60808060405234601757603a9081601d823930815050f35b600080fdfe600080fdfea26469706673582212209602e77b0002730843efd4bf0aab444a6a8daeade7f7f10052351ae288f5aa5264736f6c63430008130033"; type ECDSAConstructorParams = | [signer?: Signer] diff --git a/src/types/factories/p2pix.sol/P2PIX__factory.ts b/src/types/factories/p2pix.sol/P2PIX__factory.ts index e808325..9d3deb5 100644 --- a/src/types/factories/p2pix.sol/P2PIX__factory.ts +++ b/src/types/factories/p2pix.sol/P2PIX__factory.ts @@ -850,29 +850,26 @@ const _abi = [ { inputs: [ { - internalType: "uint256", - name: "lockID", - type: "uint256", - }, - { - internalType: "bytes32", - name: "pixTimestamp", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "r", - type: "bytes32", - }, - { - internalType: "bytes32", - name: "s", - type: "bytes32", - }, - { - internalType: "uint8", - name: "v", - type: "uint8", + components: [ + { + internalType: "uint256", + name: "lockID", + type: "uint256", + }, + { + internalType: "bytes32", + name: "pixTimestamp", + type: "bytes32", + }, + { + internalType: "bytes", + name: "signature", + type: "bytes", + }, + ], + internalType: "struct DataTypes.ReleaseArgs", + name: "args", + type: "tuple", }, ], name: "release", @@ -1143,7 +1140,7 @@ const _abi = [ ]; const _bytecode = - "0x608060405262002d4680380380620000178162000126565b928339810160a0828203126200010b5781516020808401519093916001600160401b03918281116200010b5784620000519185016200017f565b9062000060604085016200016a565b9260608501518181116200010b57866200007c9187016200017f565b9460808101519182116200010b57019480601f870112156200010b578551620000af620000a98262000152565b62000126565b96888089848152019260051b8201019283116200010b578801905b828210620000f157505050620000e19550620001e6565b6040516129049081620004428239f35b815180151581036200010b578152908801908801620000ca565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200014c57604052565b62000110565b6001600160401b0381116200014c5760051b60200190565b51906001600160a01b03821682036200010b57565b9080601f830112156200010b578151906200019e620000a98362000152565b9182938184526020808095019260051b8201019283116200010b578301905b828210620001cc575050505090565b838091620001da846200016a565b815201910190620001bd565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b811562000306575b5050506040519280840191818552518092526040840198925b828110620002e85750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d782620002d593620002db97980390a16001600160a01b031662000337565b62000390565b620002e66001600455565b565b83516001600160a01b03168a52988101989281019260010162000289565b9085826001829697989451600c1b550190838210156200032c5791509493929462000268565b509493929462000270565b6000546001600160a01b0390811633036200037f57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b031633036200037f5782519182156200043457815183036200042757602092919284818080970195019360051b0101925b838103620003df575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003d0565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d5780633c16f0c414610218578063461f3120146101cd57806349ef8448146102135780634b2ae9801461020e578063572b6c0514610209578063574983c8146102045780635fd8c710146101ff57806369cc6af4146101fa5780636d82d9e0146101f55780637f94f65d146101f057806380e1d302146101eb57806384ab1d28146101e65780638da5cb5b146101e15780638db564c2146101dc578063918dff57146101d75780639872dbfe146101d257806398a26871146101cd578063ad8f2eed146101c8578063b0983d39146101c3578063c52164c6146101be578063c593dfd8146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119d1565b611961565b61191a565b611803565b6117f0565b611741565b6115f9565b6112e1565b6112ad565b611279565b611235565b610c81565b611217565b611192565b611151565b61111d565b6110e7565b6110d4565b611083565b610f92565b610f5c565b610ed9565b610e75565b610e25565b610dfb565b610d64565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b19565b9050156107e157604081016105d56105d16105bd83611b6a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b6a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b74565b6bffffffffffffffffffffffff1690565b90611bcf565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611be6565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b19565b36916118b5565b611ae3565b9301611bdc565b906106c785611b6a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b6a565b6107036106248a611b74565b9030903390611c21565b6107176001600455565b611b6a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b74565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b6107879033612275565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611be6565b6108376108316080830183611d13565b90612092565b61084081611b6a565b9061085b6105d1602083019361085585611b6a565b90612651565b610b8f5761087a61086b82611b6a565b61087484611b6a565b90612617565b6040918281019061089c61088d83611d67565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bbc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ea2565b9290946109716108fa6108eb87611b6a565b6108f486611b6a565b9061268e565b61091b61071c61091561090f60035443611bcf565b95611d67565b96611b6a565b9061092588611b6a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d13565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d13565b929093611b6a565b6374dfee70600c5260005260206000205490565b91611d9b565b61233d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161233d565b90610a08565b15610a84575050610a2092610a6a9161233d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e29565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d7e565b911611918215610b1a575b5050610af157610a2092610a6a9161233d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b34610262576020600319360112610262576020610c796004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610cc2575050505090565b835185529381019392810192600101610cb4565b90610ce990604083526040830190610ca2565b81810360209283015282518082529082019282019160009190825b828110610d1357505050505090565b90919293948551600480821015610d3857508152820194820193929190600101610d04565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257806004013590610da2826102fc565b91610db06040519384610296565b80835260248484019160051b8301019136831161026257602401905b828210610dec57610ddc84612743565b90610a2060405192839283610cd6565b81358152908401908401610dcc565b34610262576020600319360112610262576020600435610e1a81610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff600435610e5781610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b3461026257600080600319360112610f595773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115610f4c576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b34610262576020600319360112610262576020610f7e6004356105bd81610314565b6040519015158152f35b8015150361026257565b3461026257604060031936011261026257600435610faf81610314565b602435610fbb81610f88565b610fdb82339060205263739094b1600c5260005260016034600c20015490565b8015611059578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356110a381610314565b60243590612275565b6003196040910112610262576004356110c481610314565b906024356110d181610314565b90565b34610262576020610f7e610855366110ac565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106111825750506000910152565b8181015183820152602001611172565b34610262576111a36108f4366110ac565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f6040938585526020865261120e84518092816060880152608087019061116f565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610c796108f4366110ac565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff811161026257610831610019913690600401611248565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b346102625760a06003193601126102625760043560843560ff811681036102625761130a611be6565b61131e826000526006602052604060002090565b6003810180549169ffffffffffffffffffff83169283156115be57600182018054431161159457846004846114437f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89960006114929661143c6114ac9b611414896113d861140461071c9f6002015460405192839160208301956024359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b5190209560643560443588611f17565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b61144b611ea2565b9050156114c7575b019273ffffffffffffffffffffffffffffffffffffffff611488855473ffffffffffffffffffffffffffffffffffffffff1690565b9160501c16612005565b5473ffffffffffffffffffffffffffffffffffffffff1690565b60408051948552602085019290925292a26100196001600455565b8181016114eb61071c825473ffffffffffffffffffffffffffffffffffffffff1690565b33146115715761156a61156261155261154c697fffffffffffffffffff8a60011c169461152533600c1b6000526007602052604060002090565b611530878254611bcf565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bcf565b9055611453565b5061158933600c1b6000526007602052604060002090565b61156a848254611bcf565b60046040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b9060206110d1928181520190610ca2565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761162a903690600401610332565b6024359061163782610314565b600091815191611646836126e0565b935b83811061165d5760405180610a2087826115e8565b8061168a8473ffffffffffffffffffffffffffffffffffffffff6116836001958761272f565b5116612617565b611694828861272f565b5201611648565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116c991600401610332565b926024359081116102625781602382011215610262578060040135916116ee836102fc565b926116fc6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611728575050505090565b838091833561173681610f88565b81520191019061171a565b346102625761174f3661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156117ee57805182036117e15790602084818080970194019260051b0101915b82810361179f578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a301910190611794565b63ff633a3883526004601cfd5bfe5b34610262576020610c79610874366110ac565b34610262576118113661169b565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118a857805182036117e15790602084818080970194019260051b0101915b828103611861578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611856565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d757604051916118fd60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610c796106b160209236906024816004013591016118b5565b346102625760206003193601126102625760043561197e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b34610262576060600319360112610262576004356119ee81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a47611a39611acb933690600401611248565b90611a42611be6565b612092565b611a518433612651565b611ad5575b611a8f3385836b3fffffffffffffffffffffff611a8983339060205263739094b1600c5260005260016034600c20015490565b166125db565b611a9a813386612005565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611ade84611c7a565b611a56565b604051611b0d60208281611b00818301968781519384920161116f565b8101038084520182610296565b516020106117ee575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356110d181610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bca57565b611b8d565b91908201809211611bca57565b356110d181610f88565b600260045414611bf7576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c6c576000606052604052565b637939f4246000526004601cfd5b611c9a81339060205263739094b1600c5260005260016034600c20015490565b8015611059576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bca57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611ded575b505003611dc357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e1e579290611df7565b509150503880611dba565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d7576020926000926040525190600254617530fa906000519115611e9457565b63e10bf1cc6000526004601cfd5b611eaa611ed0565b90600073ffffffffffffffffffffffffffffffffffffffff831633146110d15750600190565b33600052600160205260ff60406000205416600014611f13577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b918254611fdb5760806020927f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1948452600094859384927b19457468657265756d205369676e6564204d6573736167653a0a3332845260ff603c600420996040519a865216875260405280606052105afa508051903d15611fce576060526040829052600c1b5415611fa65750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561204157603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b919081101561208d5760051b0190565b61204e565b6000905b8282106120b35750106120a557565b63dfb035c96000526004601cfd5b906120d36120c282858561207d565b356000526006602052604060002090565b906120dd826122c4565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061216d69ffffffffffffffffffff6b3fffffffffffffffffffffff6121638b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bcf565b1161078d576121c37f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da59461141460049460019a612239979060205263739094b1600c5260005260016034600c2001908154019055565b016121e561154c825473ffffffffffffffffffffffffffffffffffffffff1690565b6122036121fc826000526007602052604060002090565b5460011c90565b68056bc75e2d63100000811161225a575061222b611492916000526007602052604060002090565b68056bc75e2d631000009055565b9161224584888861207d565b60405190358152921691602090a20190612096565b9061226f906000526007602052604060002090565b55611492565b3381036122b6576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b600181015443106122e6576003015469ffffffffffffffffffff16156115be57565b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bca5760010190565b612472907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d61256d94938051600052600660205260406000208151815560208201516001820155604082015160028201556125d6612599612588600384019461253c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561244f612400608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b6124b660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61251e60c08601996124dc8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a16916125db565b61254f61254a600554612310565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126095760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612625575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d1561265f575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d1561269c575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b906126ea826102fc565b6126f76040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061272582946102fc565b0190602036910137565b805182101561208d5760209160051b010190565b908151156128bb576000918281519061275b826126e0565b92612765836126e0565b955b83811061277657505050509190565b6127b761071c600561279c61278b858761272f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b6127e957806127c86001928461272f565b516127d3828861272f565b52836127df828a61272f565b5201925b92612767565b69ffffffffffffffffffff612817600361280661278b858761272f565b015469ffffffffffffffffffff1690565b1661284f57806128296001928461272f565b51612834828861272f565b52612848612842828a61272f565b60039052565b01926127e3565b6001908161286061278b838661272f565b015443111561289257612873818461272f565b5161287e828861272f565b5261284861288c828a61272f565b60029052565b61289c818461272f565b516128a7828861272f565b526128486128b5828a61272f565b60019052565b90506128c56126b7565b906110d16126b756fea2646970667358221220ed724ed47bcdef6140dc4a66d86c43ecffa97e169222a98775625d6852ec98f964736f6c63430008130033"; + "0x608060405262002d9680380380620000178162000126565b928339810160a0828203126200010b5781516020808401519093916001600160401b03918281116200010b5784620000519185016200017f565b9062000060604085016200016a565b9260608501518181116200010b57866200007c9187016200017f565b9460808101519182116200010b57019480601f870112156200010b578551620000af620000a98262000152565b62000126565b96888089848152019260051b8201019283116200010b578801905b828210620000f157505050620000e19550620001e6565b6040516129549081620004428239f35b815180151581036200010b578152908801908801620000ca565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b038111838210176200014c57604052565b62000110565b6001600160401b0381116200014c5760051b60200190565b51906001600160a01b03821682036200010b57565b9080601f830112156200010b578151906200019e620000a98362000152565b9182938184526020808095019260051b8201019283116200010b578301905b828210620001cc575050505090565b838091620001da846200016a565b815201910190620001bd565b600080546001600160a01b031916339081178255929695949392817f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768180a3816003556040519182527f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851160208093a18651878301979060051b810183013d1515895b811562000306575b5050506040519280840191818552518092526040840198925b828110620002e85750505050907f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d782620002d593620002db97980390a16001600160a01b031662000337565b62000390565b620002e66001600455565b565b83516001600160a01b03168a52988101989281019260010162000289565b9085826001829697989451600c1b550190838210156200032c5791509493929462000268565b509493929462000270565b6000546001600160a01b0390811633036200037f57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1565b6040516282b42960e81b8152600490fd5b60008054919290916001600160a01b031633036200037f5782519182156200043457815183036200042757602092919284818080970195019360051b0101925b838103620003df575050505050565b84809181600c63cbc9d1c48152825186528651918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8680a301920191620003d0565b63ff633a3890526004601cfd5b63df95788390526004601cfdfe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806304937320146102365780630d2a2d441461023157806313af40351461022c5780631e3c017a146102275780631e9bb57314610222578063367821f01461021d57806337c49d9c146102185780633c16f0c414610213578063461f3120146101c857806349ef84481461020e5780634b2ae98014610209578063572b6c0514610204578063574983c8146101ff5780635fd8c710146101fa57806369cc6af4146101f55780636d82d9e0146101f05780637f94f65d146101eb57806380e1d302146101e657806384ab1d28146101e15780638da5cb5b146101dc5780638db564c2146101d7578063918dff57146101d25780639872dbfe146101cd57806398a26871146101c8578063ad8f2eed146101c3578063b0983d39146101be578063c52164c6146101b9578063d1c07028146101b4578063d1ced2b0146101af578063d4fac45d146101aa578063d6e8b973146101a5578063e449c52a146101a0578063f7d0e04b1461019b5763fb8c5ef00361000e576119f1565b611981565b61193a565b611823565b611810565b611761565b611619565b6115d4565b6115a0565b61155c565b610fa8565b61153e565b6114b9565b611478565b611444565b61140e565b6113fb565b6113aa565b6112b9565b611283565b611200565b61119c565b61114c565b611122565b61108b565b610f7e565b610c57565b610bb9565b61080b565b61058b565b6104c7565b61039a565b346102625760206003193601126102625760043560005260076020526020604060002054604051908152f35b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176102d757604052565b610267565b6040519060e0820182811067ffffffffffffffff8211176102d757604052565b67ffffffffffffffff81116102d75760051b60200190565b73ffffffffffffffffffffffffffffffffffffffff81160361026257565b81601f8201121561026257803591610349836102fc565b926103576040519485610296565b808452602092838086019260051b820101928311610262578301905b828210610381575050505090565b838091833561038f81610314565b815201910190610373565b34610262576020806003193601126102625760043567ffffffffffffffff8111610262576103cc903690600401610332565b9073ffffffffffffffffffffffffffffffffffffffff918260005416330361049d57805181830192849160051b830181013d1515855b8115610469575b50505060405192818401908285525180915260408401949160005b828110610453577f14a422d2412784a5749d03da98921fe468c98577b767851389a9f58ea5a363d786880387a1005b8351851687529581019592810192600101610424565b90838260018298969499979951600c1b55019083821015610491579150959395949294610402565b50959395949294610409565b60046040517f82b42900000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576004356104e481610314565b600090815473ffffffffffffffffffffffffffffffffffffffff808216330361049d577fffffffffffffffffffffffff0000000000000000000000000000000000000000921691829116178255337f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d768380a380f35b60031990602082820112610262576004359167ffffffffffffffff8311610262578260a0920301126102625760040190565b346102625761059936610559565b6105a38180611b39565b9050156107e157604081016105d56105d16105bd83611b8a565b63cbc9d1c4600c526000526020600c205490565b1590565b6107b7576b3fffffffffffffffffffffff61060e6105f283611b8a565b339060205263739094b1600c5260005260016034600c20015490565b169161063b606082019361063561062486611b94565b6bffffffffffffffffffffffff1690565b90611bef565b916a52b7d2dcc80cd2e4000000831161078d5761073561071c61073b926106eb610778957f63d8d7d5e63e9840ec91a12a160d27b7cfab294f6ba070b7359692acfe6b03bf97610689611c06565b60208201358061077d575b506106bd60806106b66106b16106aa8680611b39565b36916118d5565b611b03565b9301611bfc565b906106c785611b8a565b91605f1b1790339060205263739094b1600c526000526034600c2090600182015555565b61070d6106f782611b8a565b6107036106248a611b94565b9030903390611c41565b6107176001600455565b611b8a565b73ffffffffffffffffffffffffffffffffffffffff1690565b93611b94565b6040805173ffffffffffffffffffffffffffffffffffffffff90951685526bffffffffffffffffffffffff90911660208501523393918291820190565b0390a2005b610787903361229b565b38610694565b60046040517ff3fb0eb9000000000000000000000000000000000000000000000000000000008152fd5b60046040517f1578328e000000000000000000000000000000000000000000000000000000008152fd5b60046040517f6a3bc53e000000000000000000000000000000000000000000000000000000008152fd5b346102625761081936610559565b610821611c06565b6108376108316080830183611d33565b906120b8565b61084081611b8a565b9061085b6105d1602083019361085585611b8a565b906126a1565b610b8f5761087a61086b82611b8a565b61087484611b8a565b90612667565b6040918281019061089c61088d83611d87565b69ffffffffffffffffffff1690565b8310610b66576108ad600554611bdc565b9460016108c4876000526006602052604060002090565b0154431115610b3d576109aa906108d9611ec0565b9290946109716108fa6108eb87611b8a565b6108f486611b8a565b906126de565b61091b61071c61091561090f60035443611bef565b95611d87565b96611b8a565b9061092588611b8a565b9361092e6102dc565b9c8d5260208d01528a8c015261095460608c0195869069ffffffffffffffffffff169052565b73ffffffffffffffffffffffffffffffffffffffff1660808b0152565b73ffffffffffffffffffffffffffffffffffffffff861660a08a015273ffffffffffffffffffffffffffffffffffffffff1660c0890152565b60608301916109b98385611d33565b159050610a24575050610a209592826109e76109fb6109df610a0195610a069997611d33565b929093611b8a565b6374dfee70600c5260005260206000205490565b91611dbb565b61238d565b905b610a126001600455565b519081529081906020820190565b0390f35b925092505069ffffffffffffffffffff9068056bc75e2d6310000082610a54855169ffffffffffffffffffff1690565b1611610a7057505050610a2092610a6a9161238d565b90610a08565b15610a84575050610a2092610a6a9161238d565b610ab5610ab0610aa133600c1b6000526007602052604060002090565b54670de0b6b3a7640000900490565b611e49565b81610ad3610acd855169ffffffffffffffffffff1690565b92611d9e565b911611918215610b1a575b5050610af157610a2092610a6a9161238d565b600482517f1c18f846000000000000000000000000000000000000000000000000000000008152fd5b5169d3c21bcecceda1000000925069ffffffffffffffffffff1616113880610ade565b600485517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b600484517f22bbb43c000000000000000000000000000000000000000000000000000000008152fd5b60046040517fb2e532de000000000000000000000000000000000000000000000000000000008152fd5b3461026257602060031936011261026257600480356000908152600660209081526040918290208054600182015460028301546003840154968401546005909401548651938452948301919091529381019390935269ffffffffffffffffffff8416606084015273ffffffffffffffffffffffffffffffffffffffff60509490941c84166080840152831660a08301529190911660c082015260e090f35b346102625760031960208136011261026257600490813567ffffffffffffffff811161026257606081840192823603011261026257610c94611c06565b813591610cab836000526006602052604060002090565b600381019283549269ffffffffffffffffffff8416948515610f5557600184019182544311610f2c579260008593610dcf610dd694610da7610da07f364537f14276f2a0ce9905588413f96454cbb8fb2e4f5308389307c1098bede89d9e996044888f610d95610e439f6002015491610d696040519384926024602085019701359187917fffffffffffffffffffff0000000000000000000000000000000000000000000090604a9492845260b01b166020830152602a8201520190565b037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08101835282610296565b519020980190611b39565b9087611f35565b7fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008154169055565b5560019055565b610dde611ec0565b905015610e5f575b01610e2984610e09835473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff809660501c1661202b565b5473ffffffffffffffffffffffffffffffffffffffff1690565b6040805195865260208601939093521692a26100196001600455565b818101610e8361071c825473ffffffffffffffffffffffffffffffffffffffff1690565b3314610f0957610f02610efa610eea610ee4697fffffffffffffffffff8960011c1694610ebd33600c1b6000526007602052604060002090565b610ec8878254611bef565b90555473ffffffffffffffffffffffffffffffffffffffff1690565b600c1b90565b6000526007602052604060002090565b918254611bef565b9055610de6565b50610f2133600c1b6000526007602052604060002090565b610f02868254611bef565b886040517ff6fafba0000000000000000000000000000000000000000000000000000000008152fd5b876040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b34610262576020600319360112610262576020610fa06004356109e781610314565b604051908152f35b34610262576020600319360112610262576020600435546040519015158152f35b90815180825260208080930193019160005b828110610fe9575050505090565b835185529381019392810192600101610fdb565b9061101090604083526040830190610fc9565b81810360209283015282518082529082019282019160009190825b82811061103a57505050505090565b9091929394855160048082101561105f5750815282019482019392919060010161102b565b8660216024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b34610262576020806003193601126102625760043567ffffffffffffffff81116102625736602382011215610262578060040135906110c9826102fc565b916110d76040519384610296565b80835260248484019160051b8301019136831161026257602401905b8282106111135761110384612793565b90610a2060405192839283610ffd565b813581529084019084016110f3565b3461026257602060031936011261026257602060043561114181610314565b60405190600c1b8152f35b346102625760206003193601126102625773ffffffffffffffffffffffffffffffffffffffff60043561117e81610314565b166000526001602052602060ff604060002054166040519015158152f35b346102625760206003193601126102625760043573ffffffffffffffffffffffffffffffffffffffff60005416330361049d576020817f70fa43ca70216ad905ade86b9e650a691b2ce5a01980d0a81bdd8324141b851192600355604051908152a1005b34610262576000806003193601126112805773ffffffffffffffffffffffffffffffffffffffff815416330361049d57478180808084335af115611273576040805133815260208101929092527feaff4b37086828766ad3268786972c0cd24259d4c87a80f9d3963a3c3d999b0d91a180f35b63b12d13eb82526004601cfd5b80fd5b346102625760206003193601126102625760206112a56004356105bd81610314565b6040519015158152f35b8015150361026257565b34610262576040600319360112610262576004356112d681610314565b6024356112e2816112af565b61130282339060205263739094b1600c5260005260016034600c20015490565b8015611380578260205263739094b1600c52336000526b3fffffffffffffffffffffff82605f1b91161760016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405192168252151560208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2005b60046040517f87138d5c000000000000000000000000000000000000000000000000000000008152fd5b34610262576040600319360112610262576100196004356113ca81610314565b6024359061229b565b6003196040910112610262576004356113eb81610314565b906024356113f881610314565b90565b346102625760206112a5610855366113d3565b3461026257602060031936011261026257602060405173ffffffffffffffffffffffffffffffffffffffff600435600c1c168152f35b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60005416604051908152f35b34610262576000600319360112610262576020600554604051908152f35b60005b8381106114a95750506000910152565b8181015183820152602001611499565b34610262576114ca6108f4366113d3565b604051906020820190815260208252604082019180831067ffffffffffffffff8411176102d7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60409385855260208652611535845180928160608801526080870190611496565b01168101030190f35b34610262576000600319360112610262576020600354604051908152f35b34610262576020610fa06108f4366113d3565b9181601f840112156102625782359167ffffffffffffffff8311610262576020808501948460051b01011161026257565b346102625760206003193601126102625760043567ffffffffffffffff81116102625761083161001991369060040161156f565b3461026257600060031936011261026257602073ffffffffffffffffffffffffffffffffffffffff60025416604051908152f35b9060206113f8928181520190610fc9565b346102625760406003193601126102625760043567ffffffffffffffff81116102625761164a903690600401610332565b6024359061165782610314565b60009181519161166683612730565b935b83811061167d5760405180610a208782611608565b806116aa8473ffffffffffffffffffffffffffffffffffffffff6116a36001958761277f565b5116612667565b6116b4828861277f565b5201611668565b9060406003198301126102625767ffffffffffffffff9160043583811161026257816116e991600401610332565b9260243590811161026257816023820112156102625780600401359161170e836102fc565b9261171c6040519485610296565b80845260209260248486019260051b82010192831161026257602401905b828210611748575050505090565b8380918335611756816112af565b81520191019061173a565b346102625761176f366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d57825190811561180e57805182036118015790602084818080970194019260051b0101915b8281036117bf578380f35b8480916001825280518652835180604088205581517fbee55516e29d3969d3cb8eb01351eb3c52d06f9e2435bd5a8bfe3647e185df928880a3019101906117b4565b63ff633a3883526004601cfd5bfe5b34610262576020610fa0610874366113d3565b3461026257611831366116bb565b60009073ffffffffffffffffffffffffffffffffffffffff825416330361049d5782519081156118c857805182036118015790602084818080970194019260051b0101915b828103611881578380f35b84809181600c63cbc9d1c48152825188528551918291205581517f5d6e86e5341d57a92c49934296c51542a25015c9b1782a1c2722a940131c3d9a8880a301910190611876565b63df95788383526004601cfd5b92919267ffffffffffffffff82116102d7576040519161191d60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8401160184610296565b829481845281830111610262578281602093846000960137010152565b346102625760206003193601126102625760043567ffffffffffffffff8111610262573660238201121561026257610fa06106b160209236906024816004013591016118d5565b346102625760206003193601126102625760043561199e81610314565b73ffffffffffffffffffffffffffffffffffffffff8060005416330361049d57816020917fe127cf589a3879da0156d4a24f43b44f65cfa3570de594806b0bfa2fcf06884f9360025560405191168152a1005b3461026257606060031936011261026257600435611a0e81610314565b60243560443567ffffffffffffffff8111610262577f2cd6435b1b961c13f55202979edd0765a809f69a539d8a477436c94c1211e43e91611a67611a59611aeb93369060040161156f565b90611a62611c06565b6120b8565b611a7184336126a1565b611af5575b611aaf3385836b3fffffffffffffffffffffff611aa983339060205263739094b1600c5260005260016034600c20015490565b1661262b565b611aba81338661202b565b6040805173ffffffffffffffffffffffffffffffffffffffff95909516855260208501919091523393918291820190565b0390a26001600455005b611afe84611c9a565b611a76565b604051611b2d60208281611b208183019687815193849201611496565b8101038084520182610296565b5160201061180e575190565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff82116102625760200191813603831361026257565b356113f881610314565b356bffffffffffffffffffffffff811681036102625790565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b9060018201809211611bea57565b611bad565b91908201809211611bea57565b356113f8816112af565b600260045414611c17576002600455565b60046040517fab143c06000000000000000000000000000000000000000000000000000000008152fd5b601c600060649281946020966040519860605260405260601b602c526f23b872dd000000000000000000000000600c525af13d15600160005114171615611c8c576000606052604052565b637939f4246000526004601cfd5b611cba81339060205263739094b1600c5260005260016034600c20015490565b8015611380576b3fffffffffffffffffffffff908260205263739094b1600c52336000521660016034600c20015573ffffffffffffffffffffffffffffffffffffffff60405191168152600060208201527fca585721b6b442dc9183932f7c84dc2880efb67c4da52cc06873e78971105d4960403392a2565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe181360301821215610262570180359067ffffffffffffffff821161026257602001918160051b3603831361026257565b3569ffffffffffffffffffff811681036102625790565b90670de0b6b3a764000091828102928184041490151715611bea57565b73ffffffffffffffffffffffffffffffffffffffff8293941692611e0d575b505003611de357565b60046040517f3b8474be000000000000000000000000000000000000000000000000000000008152fd5b60059291831b8101915b8135808211851b918252602080921852604060002091019282841015611e3e579290611e17565b509150503880611dda565b6040519060208201907f4d2b1791000000000000000000000000000000000000000000000000000000008252602483015260248252606082019082821067ffffffffffffffff8311176102d75760209260009260405251906002545afa906000519115611eb257565b63e10bf1cc6000526004601cfd5b611ec8611eee565b90600073ffffffffffffffffffffffffffffffffffffffff831633146113f85750600190565b33600052600160205260ff60406000205416600014611f31577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b3390565b91909180546120015760809160209182526000928380927b19457468657265756d205369676e6564204d6573736167653a0a333282526040603c600420978151988282813784520135821a855260417f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a1606051109114165afa508051903d15611ff4576060526040829052600c1b5415611fcc5750565b807f815e1d640000000000000000000000000000000000000000000000000000000060049252fd5b638baa579f90526004601cfd5b60046040517ff490a6ea000000000000000000000000000000000000000000000000000000008152fd5b60109260209260145260345260446000938480936fa9059cbb00000000000000000000000082525af13d15600183511417161561206757603452565b6390b8ec1890526004601cfd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b91908110156120b35760051b0190565b612074565b6000905b8282106120d95750106120cb57565b63dfb035c96000526004601cfd5b906120f96120e88285856120a3565b356000526006602052604060002090565b90612103826122ea565b600582015473ffffffffffffffffffffffffffffffffffffffff166003830180549173ffffffffffffffffffffffffffffffffffffffff92838160501c16956a52b7d2dcc80cd2e400000061219369ffffffffffffffffffff6b3fffffffffffffffffffffff6121898b889060205263739094b1600c5260005260016034600c20015490565b1694168094611bef565b1161078d576121e97f830501e61b8b075e170b22a430e39454bdb12ed3e9620e586430b6ac00079da594610da760049460019a61225f979060205263739094b1600c5260005260016034600c2001908154019055565b0161220b610ee4825473ffffffffffffffffffffffffffffffffffffffff1690565b612229612222826000526007602052604060002090565b5460011c90565b68056bc75e2d6310000081116122805750612251610e29916000526007602052604060002090565b68056bc75e2d631000009055565b9161226b8488886120a3565b60405190358152921691602090a201906120bc565b90612295906000526007602052604060002090565b55610e29565b3381036122dc576374dfee70600c5280600052816020600020557f0b294da292f26e55fd442b5c0164fbb9013036ff00c5cfdde0efd01c1baaf632600080a3565b6385d1f7266000526004601cfd5b60018101544310612336576003015469ffffffffffffffffffff161561230c57565b60046040517f63b4904e000000000000000000000000000000000000000000000000000000008152fd5b60046040517fd0404f85000000000000000000000000000000000000000000000000000000008152fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611bea5760010190565b6124c2907fa8fb61052fec8ed6ed923dd5e14b7d6aaae41d44c8870fc4efebf871389a577d6125bd94938051600052600660205260406000208151815560208201516001820155604082015160028201556126266125e96125d8600384019461258c6005606083019969ffffffffffffffffffff8b5116807fffffffffffffffffffffffffffffffffffffffffffff000000000000000000008b5416178a5561249f612450608087015173ffffffffffffffffffffffffffffffffffffffff1690565b8b547fffff0000000000000000000000000000000000000000ffffffffffffffffffff16605082901b7dffffffffffffffffffffffffffffffffffffffff000000000000000000001617909b55565b61250660a086019d8e5173ffffffffffffffffffffffffffffffffffffffff1690565b60048b019073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b61256e60c086019961252c8b5173ffffffffffffffffffffffffffffffffffffffff1690565b940180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8616179055565b73ffffffffffffffffffffffffffffffffffffffff809a169161262b565b61259f61259a600554612360565b600555565b51998a985173ffffffffffffffffffffffffffffffffffffffff1690565b935173ffffffffffffffffffffffffffffffffffffffff1690565b955169ffffffffffffffffffff1690565b60405193849316958390929169ffffffffffffffffffff60209173ffffffffffffffffffffffffffffffffffffffff604085019616845216910152565b0390a3565b9291909280848103119015176126595760205263739094b1600c5260005260016034600c2001908154039055565b63ce3a3d376000526004601cfd5b600092913d15612675575050565b9091925060205263739094b1600c5260005260016034600c2001546b3fffffffffffffffffffffff1690565b600092913d156126af575050565b9091925060205263739094b1600c5260005260016034600c200154605f1c6b3fffffffffffffffffffffff1690565b600092913d156126ec575050565b9091925060205263739094b1600c526000526034600c205490565b6040516020810181811067ffffffffffffffff8211176102d75760405260008152906000368137565b9061273a826102fc565b6127476040519182610296565b8281527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe061277582946102fc565b0190602036910137565b80518210156120b35760209160051b010190565b9081511561290b57600091828151906127ab82612730565b926127b583612730565b955b8381106127c657505050509190565b61280761071c60056127ec6127db858761277f565b516000526006602052604060002090565b015473ffffffffffffffffffffffffffffffffffffffff1690565b61283957806128186001928461277f565b51612823828861277f565b528361282f828a61277f565b5201925b926127b7565b69ffffffffffffffffffff61286760036128566127db858761277f565b015469ffffffffffffffffffff1690565b1661289f57806128796001928461277f565b51612884828861277f565b52612898612892828a61277f565b60039052565b0192612833565b600190816128b06127db838661277f565b01544311156128e2576128c3818461277f565b516128ce828861277f565b526128986128dc828a61277f565b60029052565b6128ec818461277f565b516128f7828861277f565b52612898612905828a61277f565b60019052565b9050612915612707565b906113f861270756fea264697066735822122020ab01315290857bcc58211103671123a74fc34d0dd26946504db14cf5aac5eb64736f6c63430008130033"; type P2PIXConstructorParams = | [signer?: Signer] diff --git a/src/types/p2pix.sol/P2PIX.ts b/src/types/p2pix.sol/P2PIX.ts index 0cba6a7..23a11b8 100644 --- a/src/types/p2pix.sol/P2PIX.ts +++ b/src/types/p2pix.sol/P2PIX.ts @@ -71,6 +71,18 @@ export declare namespace DataTypes { merkleProof: string[]; expiredLocks: BigNumber[]; }; + + export type ReleaseArgsStruct = { + lockID: PromiseOrValue; + pixTimestamp: PromiseOrValue; + signature: PromiseOrValue; + }; + + export type ReleaseArgsStructOutput = [BigNumber, string, string] & { + lockID: BigNumber; + pixTimestamp: string; + signature: string; + }; } export interface P2PIXInterface extends utils.Interface { @@ -92,7 +104,7 @@ export interface P2PIXInterface extends utils.Interface { "lockCounter()": FunctionFragment; "mapLocks(uint256)": FunctionFragment; "owner()": FunctionFragment; - "release(uint256,bytes32,bytes32,bytes32,uint8)": FunctionFragment; + "release((uint256,bytes32,bytes))": FunctionFragment; "reputation()": FunctionFragment; "sellerAllowList(address)": FunctionFragment; "setDefaultLockBlocks(uint256)": FunctionFragment; @@ -216,13 +228,7 @@ export interface P2PIXInterface extends utils.Interface { encodeFunctionData(functionFragment: "owner", values?: undefined): string; encodeFunctionData( functionFragment: "release", - values: [ - PromiseOrValue, - PromiseOrValue, - PromiseOrValue, - PromiseOrValue, - PromiseOrValue - ] + values: [DataTypes.ReleaseArgsStruct] ): string; encodeFunctionData( functionFragment: "reputation", @@ -706,11 +712,7 @@ export interface P2PIX extends BaseContract { owner(overrides?: CallOverrides): Promise<[string]>; release( - lockID: PromiseOrValue, - pixTimestamp: PromiseOrValue, - r: PromiseOrValue, - s: PromiseOrValue, - v: PromiseOrValue, + args: DataTypes.ReleaseArgsStruct, overrides?: Overrides & { from?: PromiseOrValue } ): Promise; @@ -889,11 +891,7 @@ export interface P2PIX extends BaseContract { owner(overrides?: CallOverrides): Promise; release( - lockID: PromiseOrValue, - pixTimestamp: PromiseOrValue, - r: PromiseOrValue, - s: PromiseOrValue, - v: PromiseOrValue, + args: DataTypes.ReleaseArgsStruct, overrides?: Overrides & { from?: PromiseOrValue } ): Promise; @@ -1072,11 +1070,7 @@ export interface P2PIX extends BaseContract { owner(overrides?: CallOverrides): Promise; release( - lockID: PromiseOrValue, - pixTimestamp: PromiseOrValue, - r: PromiseOrValue, - s: PromiseOrValue, - v: PromiseOrValue, + args: DataTypes.ReleaseArgsStruct, overrides?: CallOverrides ): Promise; @@ -1367,11 +1361,7 @@ export interface P2PIX extends BaseContract { owner(overrides?: CallOverrides): Promise; release( - lockID: PromiseOrValue, - pixTimestamp: PromiseOrValue, - r: PromiseOrValue, - s: PromiseOrValue, - v: PromiseOrValue, + args: DataTypes.ReleaseArgsStruct, overrides?: Overrides & { from?: PromiseOrValue } ): Promise; @@ -1541,11 +1531,7 @@ export interface P2PIX extends BaseContract { owner(overrides?: CallOverrides): Promise; release( - lockID: PromiseOrValue, - pixTimestamp: PromiseOrValue, - r: PromiseOrValue, - s: PromiseOrValue, - v: PromiseOrValue, + args: DataTypes.ReleaseArgsStruct, overrides?: Overrides & { from?: PromiseOrValue } ): Promise; diff --git a/test/p2pix.test.ts b/test/p2pix.test.ts index bc1af8d..5cae606 100644 --- a/test/p2pix.test.ts +++ b/test/p2pix.test.ts @@ -39,6 +39,7 @@ import { randomSigners, createDepositArgs, createLockArgs, + createReleaseArgs } from "./utils/fixtures"; describe("P2PIX", () => { @@ -869,7 +870,7 @@ describe("P2PIX", () => { const flatSig = await acc01.signMessage( messageHashBytes, ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, newPrice); await p2pix.deposit( createDepositArgs( @@ -894,11 +895,11 @@ describe("P2PIX", () => { await p2pix .connect(acc01) .release( - 1, + createReleaseArgs( + ethers.constants.One, endtoendID, - sig.r, - sig.s, - sig.v, + flatSig + ), ); const tx = await p2pix .connect(acc01) @@ -1267,7 +1268,7 @@ describe("P2PIX", () => { const flatSig = await acc01.signMessage( ethers.utils.arrayify(messageToSign), ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, price); await p2pix.deposit( createDepositArgs( @@ -1292,12 +1293,12 @@ describe("P2PIX", () => { const lockID = ethers.constants.One; await mine(13); const fail = p2pix.release( - lockID, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, - ); + createReleaseArgs( + lockID, + ethers.constants.HashZero, + flatSig, + ), + ); await expect(fail).to.be.revertedWithCustomError( p2pix, @@ -1314,7 +1315,7 @@ describe("P2PIX", () => { const flatSig = await acc01.signMessage( ethers.utils.arrayify(messageToSign), ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, price); await p2pix.deposit( createDepositArgs( @@ -1338,18 +1339,18 @@ describe("P2PIX", () => { ); const lockID = ethers.constants.One; await p2pix.release( - lockID, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, - ); + createReleaseArgs( + lockID, + ethers.constants.HashZero, + flatSig + ), + ); const fail = p2pix.release( - lockID, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, + createReleaseArgs( + lockID, + ethers.constants.HashZero, + flatSig, + ), ); await expect(fail).to.be.revertedWithCustomError( @@ -1366,7 +1367,7 @@ describe("P2PIX", () => { const flatSig = await owner.signMessage( ethers.utils.arrayify(messageToSign), ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, price); await p2pix.deposit( createDepositArgs( @@ -1392,12 +1393,12 @@ describe("P2PIX", () => { await p2pix .connect(acc01) .release( - 1, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, - ); + createReleaseArgs( + ethers.constants.One, + ethers.constants.HashZero, + flatSig, + ), + ); await p2pix .connect(acc03) .lock( @@ -1412,11 +1413,11 @@ describe("P2PIX", () => { const fail = p2pix .connect(acc01) .release( - 2, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, + createReleaseArgs( + ethers.constants.Two, + ethers.constants.HashZero, + flatSig, + ), ); await expect(fail).to.be.revertedWithCustomError( @@ -1433,7 +1434,7 @@ describe("P2PIX", () => { const flatSig = await acc03.signMessage( ethers.utils.arrayify(messageToSign), ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, price); await p2pix.deposit( @@ -1459,11 +1460,11 @@ describe("P2PIX", () => { const fail = p2pix .connect(acc01) .release( - 1, - ethers.constants.HashZero, - sig.r, - sig.s, - sig.v, + createReleaseArgs( + ethers.constants.One, + ethers.constants.HashZero, + flatSig, + ), ); await expect(fail).to.be.revertedWithCustomError( @@ -1494,7 +1495,7 @@ describe("P2PIX", () => { const flatSig = await acc01.signMessage( messageHashBytes, ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); const root = ethers.constants.HashZero; await erc20.approve(p2pix.address, price); @@ -1536,12 +1537,12 @@ describe("P2PIX", () => { const tx = await p2pix .connect(acc01) .release( - 1, - endtoendID, - sig.r, - sig.s, - sig.v, - ); + createReleaseArgs( + ethers.constants.One, + endtoendID, + flatSig, + ), + ); const lockStatus1 = await p2pix.callStatic.getLocksStatus([1]); @@ -1650,7 +1651,7 @@ describe("P2PIX", () => { const flatSig1 = await owner.signMessage( ethers.utils.arrayify(messageToSign1), ); - const sig1 = ethers.utils.splitSignature(flatSig1); + // const sig1 = ethers.utils.splitSignature(flatSig1); const messageToSign2 = ethers.utils.solidityKeccak256( ["bytes32", "uint80", "bytes32"], [await p2pix.callStatic.getStr(pixTarget), 50, endtoendID], @@ -1658,7 +1659,7 @@ describe("P2PIX", () => { const flatSig2 = await owner.signMessage( ethers.utils.arrayify(messageToSign2), ); - const sig2 = ethers.utils.splitSignature(flatSig2); + // const sig2 = ethers.utils.splitSignature(flatSig2); const messageToSign3 = ethers.utils.solidityKeccak256( ["bytes32", "uint80", "bytes32"], [await p2pix.callStatic.getStr(pixTarget), 25, endtoendID], @@ -1666,7 +1667,7 @@ describe("P2PIX", () => { const flatSig3 = await owner.signMessage( ethers.utils.arrayify(messageToSign3), ); - const sig3 = ethers.utils.splitSignature(flatSig3); + // const sig3 = ethers.utils.splitSignature(flatSig3); await erc20.approve(p2pix.address, price); await p2pix.deposit( createDepositArgs( @@ -1739,33 +1740,33 @@ describe("P2PIX", () => { const tx = await p2pix .connect(acc01) .release( - lockID, - endtoendID, - sig1.r, - sig1.s, - sig1.v, + createReleaseArgs( + lockID, + endtoendID, + flatSig1, + ), ); // relayerPremium != 0 && // lock's msg.sender != release's msg.sender const tx1 = await p2pix .connect(acc01) .release( - lockID2, - endtoendID, - sig2.r, - sig2.s, - sig2.v, + createReleaseArgs( + lockID2, + endtoendID, + flatSig2, + ), ); // relayerPremium != 0 && // lock's msg.sender == release's msg.sender const tx2 = await p2pix .connect(acc03) .release( + createReleaseArgs( lockID3, endtoendID, - sig3.r, - sig3.s, - sig3.v, + flatSig3, + ), ); const used1 = await p2pix.callStatic.usedTransactions( ethers.utils.arrayify(messageToSign1), @@ -1909,7 +1910,7 @@ describe("P2PIX", () => { const flatSig = await acc01.signMessage( messageHashBytes, ); - const sig = ethers.utils.splitSignature(flatSig); + // const sig = ethers.utils.splitSignature(flatSig); await erc20.approve(p2pix.address, price); await p2pix.deposit( createDepositArgs( @@ -1934,12 +1935,12 @@ describe("P2PIX", () => { const lockID = ethers.constants.One; // await mine(10); await p2pix.release( - lockID, - endtoendID, - sig.r, - sig.s, - sig.v, - ); + createReleaseArgs( + lockID, + endtoendID, + flatSig, + ), + ); const fail = p2pix.unlockExpired([lockID]); await expect(fail).to.be.revertedWithCustomError( diff --git a/test/utils/fixtures.ts b/test/utils/fixtures.ts index 8873405..56c7570 100644 --- a/test/utils/fixtures.ts +++ b/test/utils/fixtures.ts @@ -12,7 +12,7 @@ import { Reputation, } from "../../src/types"; -import { Call, RepFixture, P2PixAndReputation, DepositArgs, LockArgs } from "./interfaces"; +import { Call, RepFixture, P2PixAndReputation, DepositArgs, LockArgs, ReleaseArgs } from "./interfaces"; // exported constants @@ -32,6 +32,12 @@ export const createLockArgs = (seller: string, token: string, amount: BigNumber, expiredLocks, }); +export const createReleaseArgs = (lockID: BigNumber, pixTimestamp: string, signature: string): ReleaseArgs => ({ + lockID, + pixTimestamp, + signature, +}); + export const getSignerAddrs = ( amount: number, addrs: SignerWithAddress[], diff --git a/test/utils/interfaces.ts b/test/utils/interfaces.ts index bb99a6e..4fe7d30 100644 --- a/test/utils/interfaces.ts +++ b/test/utils/interfaces.ts @@ -31,6 +31,12 @@ export interface LockArgs { expiredLocks: BigNumber[]; } +export interface ReleaseArgs { + lockID: BigNumber; + pixTimestamp: string; + signature: string; +} + export interface Lock { counter: BigNumber; expirationBlock: BigNumber;