diff --git a/.gitignore b/.gitignore index 8cb9e36..5e8569d 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ coverage.json #Hardhat files cache artifacts/build-info +artifacts/@openzeppelin \ No newline at end of file diff --git a/artifacts/contracts/mockToken.sol/MockToken.dbg.json b/artifacts/contracts/mockToken.sol/MockToken.dbg.json new file mode 100644 index 0000000..e04d0c5 --- /dev/null +++ b/artifacts/contracts/mockToken.sol/MockToken.dbg.json @@ -0,0 +1,4 @@ +{ + "_format": "hh-sol-dbg-1", + "buildInfo": "../../build-info/5f0db55f399477fd77a196dfab69a373.json" +} diff --git a/artifacts/contracts/mockToken.sol/MockToken.json b/artifacts/contracts/mockToken.sol/MockToken.json new file mode 100644 index 0000000..7b9e0fa --- /dev/null +++ b/artifacts/contracts/mockToken.sol/MockToken.json @@ -0,0 +1,292 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "MockToken", + "sourceName": "contracts/mockToken.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "uint256", + "name": "supply", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "address", + "name": "spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "decimals", + "outputs": [ + { + "internalType": "uint8", + "name": "", + "type": "uint8" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "subtractedValue", + "type": "uint256" + } + ], + "name": "decreaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "spender", + "type": "address" + }, + { + "internalType": "uint256", + "name": "addedValue", + "type": "uint256" + } + ], + "name": "increaseAllowance", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "bytecode": "0x60806040523480156200001157600080fd5b5060405162001990380380620019908339818101604052810190620000379190620002a4565b6040518060400160405280600781526020017f4d6f636b42524c000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4d42524c000000000000000000000000000000000000000000000000000000008152508160039081620000b4919062000546565b508060049081620000c6919062000546565b505050620000db3382620000e260201b60201c565b5062000748565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000154576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200014b906200068e565b60405180910390fd5b62000168600083836200025a60201b60201c565b80600260008282546200017c9190620006df565b92505081905550806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620001d39190620006df565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516200023a91906200072b565b60405180910390a362000256600083836200025f60201b60201c565b5050565b505050565b505050565b600080fd5b6000819050919050565b6200027e8162000269565b81146200028a57600080fd5b50565b6000815190506200029e8162000273565b92915050565b600060208284031215620002bd57620002bc62000264565b5b6000620002cd848285016200028d565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200035857607f821691505b6020821081036200036e576200036d62000310565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620003d87fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000399565b620003e4868362000399565b95508019841693508086168417925050509392505050565b6000819050919050565b600062000427620004216200041b8462000269565b620003fc565b62000269565b9050919050565b6000819050919050565b620004438362000406565b6200045b62000452826200042e565b848454620003a6565b825550505050565b600090565b6200047262000463565b6200047f81848462000438565b505050565b5b81811015620004a7576200049b60008262000468565b60018101905062000485565b5050565b601f821115620004f657620004c08162000374565b620004cb8462000389565b81016020851015620004db578190505b620004f3620004ea8562000389565b83018262000484565b50505b505050565b600082821c905092915050565b60006200051b60001984600802620004fb565b1980831691505092915050565b600062000536838362000508565b9150826002028217905092915050565b6200055182620002d6565b67ffffffffffffffff8111156200056d576200056c620002e1565b5b6200057982546200033f565b62000586828285620004ab565b600060209050601f831160018114620005be5760008415620005a9578287015190505b620005b5858262000528565b86555062000625565b601f198416620005ce8662000374565b60005b82811015620005f857848901518255600182019150602085019450602081019050620005d1565b8683101562000618578489015162000614601f89168262000508565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b600062000676601f836200062d565b915062000683826200063e565b602082019050919050565b60006020820190508181036000830152620006a98162000667565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620006ec8262000269565b9150620006f98362000269565b9250828201905080821115620007145762000713620006b0565b5b92915050565b620007258162000269565b82525050565b60006020820190506200074260008301846200071a565b92915050565b61123880620007586000396000f3fe608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b15565b60405180910390f35b6100e660048036038101906100e19190610bd0565b610308565b6040516100f39190610c2b565b60405180910390f35b61010461032b565b6040516101119190610c55565b60405180910390f35b610134600480360381019061012f9190610c70565b610335565b6040516101419190610c2b565b60405180910390f35b610152610364565b60405161015f9190610cdf565b60405180910390f35b610182600480360381019061017d9190610bd0565b61036d565b60405161018f9190610c2b565b60405180910390f35b6101b260048036038101906101ad9190610cfa565b6103a4565b6040516101bf9190610c55565b60405180910390f35b6101d06103ec565b6040516101dd9190610b15565b60405180910390f35b61020060048036038101906101fb9190610bd0565b61047e565b60405161020d9190610c2b565b60405180910390f35b610230600480360381019061022b9190610bd0565b6104f5565b60405161023d9190610c2b565b60405180910390f35b610260600480360381019061025b9190610d27565b610518565b60405161026d9190610c55565b60405180910390f35b60606003805461028590610d96565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d96565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610df6565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d96565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d96565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e9c565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fc0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c55565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df9061102c565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611150565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111e2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610df6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c55565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae782610a85565b610af18185610a90565b9350610b01818560208601610aa1565b610b0a81610acb565b840191505092915050565b60006020820190508181036000830152610b2f8184610adc565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6782610b3c565b9050919050565b610b7781610b5c565b8114610b8257600080fd5b50565b600081359050610b9481610b6e565b92915050565b6000819050919050565b610bad81610b9a565b8114610bb857600080fd5b50565b600081359050610bca81610ba4565b92915050565b60008060408385031215610be757610be6610b37565b5b6000610bf585828601610b85565b9250506020610c0685828601610bbb565b9150509250929050565b60008115159050919050565b610c2581610c10565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b610c4f81610b9a565b82525050565b6000602082019050610c6a6000830184610c46565b92915050565b600080600060608486031215610c8957610c88610b37565b5b6000610c9786828701610b85565b9350506020610ca886828701610b85565b9250506040610cb986828701610bbb565b9150509250925092565b600060ff82169050919050565b610cd981610cc3565b82525050565b6000602082019050610cf46000830184610cd0565b92915050565b600060208284031215610d1057610d0f610b37565b5b6000610d1e84828501610b85565b91505092915050565b60008060408385031215610d3e57610d3d610b37565b5b6000610d4c85828601610b85565b9250506020610d5d85828601610b85565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dae57607f821691505b602082108103610dc157610dc0610d67565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0182610b9a565b9150610e0c83610b9a565b9250828201905080821115610e2457610e23610dc7565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e86602583610a90565b9150610e9182610e2a565b604082019050919050565b60006020820190508181036000830152610eb581610e79565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f18602483610a90565b9150610f2382610ebc565b604082019050919050565b60006020820190508181036000830152610f4781610f0b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610faa602283610a90565b9150610fb582610f4e565b604082019050919050565b60006020820190508181036000830152610fd981610f9d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611016601d83610a90565b915061102182610fe0565b602082019050919050565b6000602082019050818103600083015261104581611009565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110a8602583610a90565b91506110b38261104c565b604082019050919050565b600060208201905081810360008301526110d78161109b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061113a602383610a90565b9150611145826110de565b604082019050919050565b600060208201905081810360008301526111698161112d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111cc602683610a90565b91506111d782611170565b604082019050919050565b600060208201905081810360008301526111fb816111bf565b905091905056fea26469706673582212204f5e68c47ed8b4f606ef65feaf7efa00f8547ad0f1f01737f0431110f3e74c0d64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b15565b60405180910390f35b6100e660048036038101906100e19190610bd0565b610308565b6040516100f39190610c2b565b60405180910390f35b61010461032b565b6040516101119190610c55565b60405180910390f35b610134600480360381019061012f9190610c70565b610335565b6040516101419190610c2b565b60405180910390f35b610152610364565b60405161015f9190610cdf565b60405180910390f35b610182600480360381019061017d9190610bd0565b61036d565b60405161018f9190610c2b565b60405180910390f35b6101b260048036038101906101ad9190610cfa565b6103a4565b6040516101bf9190610c55565b60405180910390f35b6101d06103ec565b6040516101dd9190610b15565b60405180910390f35b61020060048036038101906101fb9190610bd0565b61047e565b60405161020d9190610c2b565b60405180910390f35b610230600480360381019061022b9190610bd0565b6104f5565b60405161023d9190610c2b565b60405180910390f35b610260600480360381019061025b9190610d27565b610518565b60405161026d9190610c55565b60405180910390f35b60606003805461028590610d96565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d96565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006012905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610df6565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d96565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d96565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e9c565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f2e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fc0565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c55565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df9061102c565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110be565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611150565b60405180910390fd5b6108e5838383610a7b565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111e2565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546109fe9190610df6565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a629190610c55565b60405180910390a3610a75848484610a80565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610abf578082015181840152602081019050610aa4565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ae782610a85565b610af18185610a90565b9350610b01818560208601610aa1565b610b0a81610acb565b840191505092915050565b60006020820190508181036000830152610b2f8184610adc565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b6782610b3c565b9050919050565b610b7781610b5c565b8114610b8257600080fd5b50565b600081359050610b9481610b6e565b92915050565b6000819050919050565b610bad81610b9a565b8114610bb857600080fd5b50565b600081359050610bca81610ba4565b92915050565b60008060408385031215610be757610be6610b37565b5b6000610bf585828601610b85565b9250506020610c0685828601610bbb565b9150509250929050565b60008115159050919050565b610c2581610c10565b82525050565b6000602082019050610c406000830184610c1c565b92915050565b610c4f81610b9a565b82525050565b6000602082019050610c6a6000830184610c46565b92915050565b600080600060608486031215610c8957610c88610b37565b5b6000610c9786828701610b85565b9350506020610ca886828701610b85565b9250506040610cb986828701610bbb565b9150509250925092565b600060ff82169050919050565b610cd981610cc3565b82525050565b6000602082019050610cf46000830184610cd0565b92915050565b600060208284031215610d1057610d0f610b37565b5b6000610d1e84828501610b85565b91505092915050565b60008060408385031215610d3e57610d3d610b37565b5b6000610d4c85828601610b85565b9250506020610d5d85828601610b85565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610dae57607f821691505b602082108103610dc157610dc0610d67565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e0182610b9a565b9150610e0c83610b9a565b9250828201905080821115610e2457610e23610dc7565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e86602583610a90565b9150610e9182610e2a565b604082019050919050565b60006020820190508181036000830152610eb581610e79565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f18602483610a90565b9150610f2382610ebc565b604082019050919050565b60006020820190508181036000830152610f4781610f0b565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610faa602283610a90565b9150610fb582610f4e565b604082019050919050565b60006020820190508181036000830152610fd981610f9d565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b6000611016601d83610a90565b915061102182610fe0565b602082019050919050565b6000602082019050818103600083015261104581611009565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b60006110a8602583610a90565b91506110b38261104c565b604082019050919050565b600060208201905081810360008301526110d78161109b565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b600061113a602383610a90565b9150611145826110de565b604082019050919050565b600060208201905081810360008301526111698161112d565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111cc602683610a90565b91506111d782611170565b604082019050919050565b600060208201905081810360008301526111fb816111bf565b905091905056fea26469706673582212204f5e68c47ed8b4f606ef65feaf7efa00f8547ad0f1f01737f0431110f3e74c0d64736f6c63430008110033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index 5c5d512..51c5d14 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/e53d155f4d4e8ba3d5f49011e7166818.json" + "buildInfo": "../../build-info/5ce31c4ec8418c4fef71a52ed732efd0.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index 81dcb55..ef5cf9d 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -40,6 +40,12 @@ "name": "token", "type": "address" }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, { "indexed": false, "internalType": "uint256", @@ -69,6 +75,25 @@ "name": "DepositClosed", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "depositID", + "type": "bytes32" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "DepositPriceChanged", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -176,6 +201,24 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "depositID", + "type": "bytes32" + }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + } + ], + "name": "changeDepositPrice", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [], "name": "defaultLockBlocks", @@ -201,6 +244,11 @@ "name": "amount", "type": "uint256" }, + { + "internalType": "uint256", + "name": "price", + "type": "uint256" + }, { "internalType": "string", "name": "pixTarget", @@ -333,8 +381,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50604051620021a4380380620021a483398181016040528101906200003791906200030d565b8160008190555060005b81518160ff161015620000db576001806000848460ff16815181106200006c576200006b62000373565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620000d290620003de565b91505062000041565b5050506200040c565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200010d81620000f8565b81146200011957600080fd5b50565b6000815190506200012d8162000102565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001838262000138565b810181811067ffffffffffffffff82111715620001a557620001a462000149565b5b80604052505050565b6000620001ba620000e4565b9050620001c8828262000178565b919050565b600067ffffffffffffffff821115620001eb57620001ea62000149565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022e8262000201565b9050919050565b620002408162000221565b81146200024c57600080fd5b50565b600081519050620002608162000235565b92915050565b60006200027d6200027784620001cd565b620001ae565b90508083825260208201905060208402830185811115620002a357620002a2620001fc565b5b835b81811015620002d05780620002bb88826200024f565b845260208401935050602081019050620002a5565b5050509392505050565b600082601f830112620002f257620002f162000133565b5b81516200030484826020860162000266565b91505092915050565b60008060408385031215620003275762000326620000ee565b5b600062000337858286016200011c565b925050602083015167ffffffffffffffff8111156200035b576200035a620000f3565b5b6200036985828601620002da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b6000620003eb82620003d1565b915060ff8203620004015762000400620003a2565b5b600182019050919050565b611d88806200041c6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063708ace651161005b578063708ace65146100d65780639872dbfe14610106578063b93bd7d414610124578063bfe07da6146101545761007d565b806331404484146100825780634b83a7be1461009e5780634e1389ed146100ba575b600080fd5b61009c60048036038101906100979190610df4565b610184565b005b6100b860048036038101906100b39190610e86565b6102e0565b005b6100d460048036038101906100cf9190610f55565b610450565b005b6100f060048036038101906100eb919061102e565b6106a5565b6040516100fd91906110ec565b60405180910390f35b61010e610994565b60405161011b9190611116565b60405180910390f35b61013e60048036038101906101399190611131565b61099a565b60405161014b9190611179565b60405180910390f35b61016e600480360381019061016991906111ea565b6109ba565b60405161017b91906110ec565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610220906112e1565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102d491906110ec565b60405180910390a25050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037c906112e1565b60405180910390fd5b61038f8383610c2b565b6002600085815260200190815260200160002060030160009054906101000a900460ff16156103c2576103c184610184565b5b600060026000868152602001908152602001600020600201549050600060026000878152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8683604051610441929190611301565b60405180910390a25050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002060040182600401548760405160200161049b9392919061144e565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b906114f9565b60405180910390fd5b6000600182858888604051600081526020016040526040516105399493929190611528565b6020604051602081039080840390855afa15801561055b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166105f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ea906115b9565b60405180910390fd5b6000836004018190555060016004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161069391906110ec565b60405180910390a25050505050505050565b60006106b18383610c2b565b6000600260008a815260200190815260200160002090508060030160009054906101000a900460ff16610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611625565b60405180910390fd5b8481600201541161075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690611691565b60405180910390fd5b8885896040516020016107749392919061171a565b604051602081830303815290604052805190602001209150436003600084815260200190815260200160002060050154106107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db906117c9565b60405180910390fd5b60006040518060c001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001600054436108499190611818565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501559050508582600201600082825461092f919061184c565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c8960405161097f929190611301565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b60008282856040516020016109d1939291906118b4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490611950565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610bcc9190611b41565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610c1a93929190611c22565b60405180910390a250949350505050565b600082829050905060005b818161ffff161015610dae5760006003600086868561ffff16818110610c5f57610c5e611c59565b5b9050602002013581526020019081526020016000209050438160050154108015610c8d575060008160040154115b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390611cfa565b60405180910390fd5b806004015460026000836000015481526020019081526020016000206002016000828254610cfa9190611818565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff16818110610d7e57610d7d611c59565b5b90506020020135604051610d9291906110ec565b60405180910390a2508080610da690611d28565b915050610c36565b50505050565b600080fd5b600080fd5b6000819050919050565b610dd181610dbe565b8114610ddc57600080fd5b50565b600081359050610dee81610dc8565b92915050565b600060208284031215610e0a57610e09610db4565b5b6000610e1884828501610ddf565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610e4657610e45610e21565b5b8235905067ffffffffffffffff811115610e6357610e62610e26565b5b602083019150836020820283011115610e7f57610e7e610e2b565b5b9250929050565b600080600060408486031215610e9f57610e9e610db4565b5b6000610ead86828701610ddf565b935050602084013567ffffffffffffffff811115610ece57610ecd610db9565b5b610eda86828701610e30565b92509250509250925092565b6000819050919050565b610ef981610ee6565b8114610f0457600080fd5b50565b600081359050610f1681610ef0565b92915050565b600060ff82169050919050565b610f3281610f1c565b8114610f3d57600080fd5b50565b600081359050610f4f81610f29565b92915050565b600080600080600060a08688031215610f7157610f70610db4565b5b6000610f7f88828901610ddf565b9550506020610f9088828901610f07565b9450506040610fa188828901610ddf565b9350506060610fb288828901610ddf565b9250506080610fc388828901610f40565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ffb82610fd0565b9050919050565b61100b81610ff0565b811461101657600080fd5b50565b60008135905061102881611002565b92915050565b600080600080600080600060c0888a03121561104d5761104c610db4565b5b600061105b8a828b01610ddf565b975050602061106c8a828b01611019565b965050604061107d8a828b01611019565b955050606061108e8a828b01610f07565b945050608061109f8a828b01610f07565b93505060a088013567ffffffffffffffff8111156110c0576110bf610db9565b5b6110cc8a828b01610e30565b925092505092959891949750929550565b6110e681610dbe565b82525050565b600060208201905061110160008301846110dd565b92915050565b61111081610ee6565b82525050565b600060208201905061112b6000830184611107565b92915050565b60006020828403121561114757611146610db4565b5b600061115584828501611019565b91505092915050565b60008115159050919050565b6111738161115e565b82525050565b600060208201905061118e600083018461116a565b92915050565b60008083601f8401126111aa576111a9610e21565b5b8235905067ffffffffffffffff8111156111c7576111c6610e26565b5b6020830191508360018202830111156111e3576111e2610e2b565b5b9250929050565b6000806000806060858703121561120457611203610db4565b5b600061121287828801611019565b945050602061122387828801610f07565b935050604085013567ffffffffffffffff81111561124457611243610db9565b5b61125087828801611194565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006112cb602c8361125e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600060408201905061131660008301856110dd565b6113236020830184611107565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061137157607f821691505b6020821081036113845761138361132a565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113b781611359565b6113c1818661138a565b945060018216600081146113dc57600181146113f157611424565b60ff1983168652811515820286019350611424565b6113fa85611395565b60005b8381101561141c578154818901526001820191506020810190506113fd565b838801955050505b50505092915050565b6000819050919050565b61144861144382610ee6565b61142d565b82525050565b600061145a82866113aa565b91506114668285611437565b6020820191506114768284611437565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b60006114e3602b8361125e565b91506114ee82611487565b604082019050919050565b60006020820190508181036000830152611512816114d6565b9050919050565b61152281610f1c565b82525050565b600060808201905061153d60008301876110dd565b61154a6020830186611519565b61155760408301856110dd565b61156460608301846110dd565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115a3601d8361125e565b91506115ae8261156d565b602082019050919050565b600060208201905081810360008301526115d281611596565b9050919050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b600061160f60208361125e565b915061161a826115d9565b602082019050919050565b6000602082019050818103600083015261163e81611602565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b600061167b601b8361125e565b915061168682611645565b602082019050919050565b600060208201905081810360008301526116aa8161166e565b9050919050565b6000819050919050565b6116cc6116c782610dbe565b6116b1565b82525050565b60008160601b9050919050565b60006116ea826116d2565b9050919050565b60006116fc826116df565b9050919050565b61171461170f82610ff0565b6116f1565b82525050565b600061172682866116bb565b6020820191506117368285611437565b6020820191506117468284611703565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006117b360338361125e565b91506117be82611757565b604082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182382610ee6565b915061182e83610ee6565b9250828201905080821115611846576118456117e9565b5b92915050565b600061185782610ee6565b915061186283610ee6565b925082820390508181111561187a576118796117e9565b5b92915050565b82818337600083830152505050565b600061189b838561138a565b93506118a8838584611880565b82840190509392505050565b60006118c182858761188f565b91506118cd8284611437565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b600061193a60328361125e565b9150611945826118de565b604082019050919050565b600060208201905081810360008301526119698161192d565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119ba565b611a0186836119ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a3e611a39611a3484610ee6565b611a19565b610ee6565b9050919050565b6000819050919050565b611a5883611a23565b611a6c611a6482611a45565b8484546119c7565b825550505050565b600090565b611a81611a74565b611a8c818484611a4f565b505050565b5b81811015611ab057611aa5600082611a79565b600181019050611a92565b5050565b601f821115611af557611ac681611395565b611acf846119aa565b81016020851015611ade578190505b611af2611aea856119aa565b830182611a91565b50505b505050565b600082821c905092915050565b6000611b1860001984600802611afa565b1980831691505092915050565b6000611b318383611b07565b9150826002028217905092915050565b611b4a82611970565b67ffffffffffffffff811115611b6357611b6261197b565b5b611b6d8254611359565b611b78828285611ab4565b600060209050601f831160018114611bab5760008415611b99578287015190505b611ba38582611b25565b865550611c0b565b601f198416611bb986611395565b60005b82811015611be157848901518255600182019150602085019450602081019050611bbc565b86831015611bfe5784890151611bfa601f891682611b07565b8355505b6001600288020188555050505b505050505050565b611c1c81610ff0565b82525050565b6000606082019050611c3760008301866110dd565b611c446020830185611c13565b611c516040830184611107565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b6000611ce460278361125e565b9150611cef82611c88565b604082019050919050565b60006020820190508181036000830152611d1381611cd7565b9050919050565b600061ffff82169050919050565b6000611d3382611d1a565b915061ffff8203611d4757611d466117e9565b5b60018201905091905056fea264697066735822122083b121d799dd64ebc1d8d7a54b7408bb66350a697bdb106ac122bfda032e442064736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063708ace651161005b578063708ace65146100d65780639872dbfe14610106578063b93bd7d414610124578063bfe07da6146101545761007d565b806331404484146100825780634b83a7be1461009e5780634e1389ed146100ba575b600080fd5b61009c60048036038101906100979190610df4565b610184565b005b6100b860048036038101906100b39190610e86565b6102e0565b005b6100d460048036038101906100cf9190610f55565b610450565b005b6100f060048036038101906100eb919061102e565b6106a5565b6040516100fd91906110ec565b60405180910390f35b61010e610994565b60405161011b9190611116565b60405180910390f35b61013e60048036038101906101399190611131565b61099a565b60405161014b9190611179565b60405180910390f35b61016e600480360381019061016991906111ea565b6109ba565b60405161017b91906110ec565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610220906112e1565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102d491906110ec565b60405180910390a25050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037c906112e1565b60405180910390fd5b61038f8383610c2b565b6002600085815260200190815260200160002060030160009054906101000a900460ff16156103c2576103c184610184565b5b600060026000868152602001908152602001600020600201549050600060026000878152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8683604051610441929190611301565b60405180910390a25050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002060040182600401548760405160200161049b9392919061144e565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b906114f9565b60405180910390fd5b6000600182858888604051600081526020016040526040516105399493929190611528565b6020604051602081039080840390855afa15801561055b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166105f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ea906115b9565b60405180910390fd5b6000836004018190555060016004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161069391906110ec565b60405180910390a25050505050505050565b60006106b18383610c2b565b6000600260008a815260200190815260200160002090508060030160009054906101000a900460ff16610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611625565b60405180910390fd5b8481600201541161075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690611691565b60405180910390fd5b8885896040516020016107749392919061171a565b604051602081830303815290604052805190602001209150436003600084815260200190815260200160002060050154106107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db906117c9565b60405180910390fd5b60006040518060c001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001600054436108499190611818565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501559050508582600201600082825461092f919061184c565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c8960405161097f929190611301565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b60008282856040516020016109d1939291906118b4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490611950565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610bcc9190611b41565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610c1a93929190611c22565b60405180910390a250949350505050565b600082829050905060005b818161ffff161015610dae5760006003600086868561ffff16818110610c5f57610c5e611c59565b5b9050602002013581526020019081526020016000209050438160050154108015610c8d575060008160040154115b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390611cfa565b60405180910390fd5b806004015460026000836000015481526020019081526020016000206002016000828254610cfa9190611818565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff16818110610d7e57610d7d611c59565b5b90506020020135604051610d9291906110ec565b60405180910390a2508080610da690611d28565b915050610c36565b50505050565b600080fd5b600080fd5b6000819050919050565b610dd181610dbe565b8114610ddc57600080fd5b50565b600081359050610dee81610dc8565b92915050565b600060208284031215610e0a57610e09610db4565b5b6000610e1884828501610ddf565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610e4657610e45610e21565b5b8235905067ffffffffffffffff811115610e6357610e62610e26565b5b602083019150836020820283011115610e7f57610e7e610e2b565b5b9250929050565b600080600060408486031215610e9f57610e9e610db4565b5b6000610ead86828701610ddf565b935050602084013567ffffffffffffffff811115610ece57610ecd610db9565b5b610eda86828701610e30565b92509250509250925092565b6000819050919050565b610ef981610ee6565b8114610f0457600080fd5b50565b600081359050610f1681610ef0565b92915050565b600060ff82169050919050565b610f3281610f1c565b8114610f3d57600080fd5b50565b600081359050610f4f81610f29565b92915050565b600080600080600060a08688031215610f7157610f70610db4565b5b6000610f7f88828901610ddf565b9550506020610f9088828901610f07565b9450506040610fa188828901610ddf565b9350506060610fb288828901610ddf565b9250506080610fc388828901610f40565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ffb82610fd0565b9050919050565b61100b81610ff0565b811461101657600080fd5b50565b60008135905061102881611002565b92915050565b600080600080600080600060c0888a03121561104d5761104c610db4565b5b600061105b8a828b01610ddf565b975050602061106c8a828b01611019565b965050604061107d8a828b01611019565b955050606061108e8a828b01610f07565b945050608061109f8a828b01610f07565b93505060a088013567ffffffffffffffff8111156110c0576110bf610db9565b5b6110cc8a828b01610e30565b925092505092959891949750929550565b6110e681610dbe565b82525050565b600060208201905061110160008301846110dd565b92915050565b61111081610ee6565b82525050565b600060208201905061112b6000830184611107565b92915050565b60006020828403121561114757611146610db4565b5b600061115584828501611019565b91505092915050565b60008115159050919050565b6111738161115e565b82525050565b600060208201905061118e600083018461116a565b92915050565b60008083601f8401126111aa576111a9610e21565b5b8235905067ffffffffffffffff8111156111c7576111c6610e26565b5b6020830191508360018202830111156111e3576111e2610e2b565b5b9250929050565b6000806000806060858703121561120457611203610db4565b5b600061121287828801611019565b945050602061122387828801610f07565b935050604085013567ffffffffffffffff81111561124457611243610db9565b5b61125087828801611194565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006112cb602c8361125e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600060408201905061131660008301856110dd565b6113236020830184611107565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061137157607f821691505b6020821081036113845761138361132a565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113b781611359565b6113c1818661138a565b945060018216600081146113dc57600181146113f157611424565b60ff1983168652811515820286019350611424565b6113fa85611395565b60005b8381101561141c578154818901526001820191506020810190506113fd565b838801955050505b50505092915050565b6000819050919050565b61144861144382610ee6565b61142d565b82525050565b600061145a82866113aa565b91506114668285611437565b6020820191506114768284611437565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b60006114e3602b8361125e565b91506114ee82611487565b604082019050919050565b60006020820190508181036000830152611512816114d6565b9050919050565b61152281610f1c565b82525050565b600060808201905061153d60008301876110dd565b61154a6020830186611519565b61155760408301856110dd565b61156460608301846110dd565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115a3601d8361125e565b91506115ae8261156d565b602082019050919050565b600060208201905081810360008301526115d281611596565b9050919050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b600061160f60208361125e565b915061161a826115d9565b602082019050919050565b6000602082019050818103600083015261163e81611602565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b600061167b601b8361125e565b915061168682611645565b602082019050919050565b600060208201905081810360008301526116aa8161166e565b9050919050565b6000819050919050565b6116cc6116c782610dbe565b6116b1565b82525050565b60008160601b9050919050565b60006116ea826116d2565b9050919050565b60006116fc826116df565b9050919050565b61171461170f82610ff0565b6116f1565b82525050565b600061172682866116bb565b6020820191506117368285611437565b6020820191506117468284611703565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006117b360338361125e565b91506117be82611757565b604082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182382610ee6565b915061182e83610ee6565b9250828201905080821115611846576118456117e9565b5b92915050565b600061185782610ee6565b915061186283610ee6565b925082820390508181111561187a576118796117e9565b5b92915050565b82818337600083830152505050565b600061189b838561138a565b93506118a8838584611880565b82840190509392505050565b60006118c182858761188f565b91506118cd8284611437565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b600061193a60328361125e565b9150611945826118de565b604082019050919050565b600060208201905081810360008301526119698161192d565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119ba565b611a0186836119ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a3e611a39611a3484610ee6565b611a19565b610ee6565b9050919050565b6000819050919050565b611a5883611a23565b611a6c611a6482611a45565b8484546119c7565b825550505050565b600090565b611a81611a74565b611a8c818484611a4f565b505050565b5b81811015611ab057611aa5600082611a79565b600181019050611a92565b5050565b601f821115611af557611ac681611395565b611acf846119aa565b81016020851015611ade578190505b611af2611aea856119aa565b830182611a91565b50505b505050565b600082821c905092915050565b6000611b1860001984600802611afa565b1980831691505092915050565b6000611b318383611b07565b9150826002028217905092915050565b611b4a82611970565b67ffffffffffffffff811115611b6357611b6261197b565b5b611b6d8254611359565b611b78828285611ab4565b600060209050601f831160018114611bab5760008415611b99578287015190505b611ba38582611b25565b865550611c0b565b601f198416611bb986611395565b60005b82811015611be157848901518255600182019150602085019450602081019050611bbc565b86831015611bfe5784890151611bfa601f891682611b07565b8355505b6001600288020188555050505b505050505050565b611c1c81610ff0565b82525050565b6000606082019050611c3760008301866110dd565b611c446020830185611c13565b611c516040830184611107565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b6000611ce460278361125e565b9150611cef82611c88565b604082019050919050565b60006020820190508181036000830152611d1381611cd7565b9050919050565b600061ffff82169050919050565b6000611d3382611d1a565b915061ffff8203611d4757611d466117e9565b5b60018201905091905056fea264697066735822122083b121d799dd64ebc1d8d7a54b7408bb66350a697bdb106ac122bfda032e442064736f6c63430008110033", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620026cf380380620026cf83398181016040528101906200003791906200030d565b8160008190555060005b81518160ff161015620000db576001806000848460ff16815181106200006c576200006b62000373565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620000d290620003de565b91505062000041565b5050506200040c565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200010d81620000f8565b81146200011957600080fd5b50565b6000815190506200012d8162000102565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001838262000138565b810181811067ffffffffffffffff82111715620001a557620001a462000149565b5b80604052505050565b6000620001ba620000e4565b9050620001c8828262000178565b919050565b600067ffffffffffffffff821115620001eb57620001ea62000149565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022e8262000201565b9050919050565b620002408162000221565b81146200024c57600080fd5b50565b600081519050620002608162000235565b92915050565b60006200027d6200027784620001cd565b620001ae565b90508083825260208201905060208402830185811115620002a357620002a2620001fc565b5b835b81811015620002d05780620002bb88826200024f565b845260208401935050602081019050620002a5565b5050509392505050565b600082601f830112620002f257620002f162000133565b5b81516200030484826020860162000266565b91505092915050565b60008060408385031215620003275762000326620000ee565b5b600062000337858286016200011c565b925050602083015167ffffffffffffffff8111156200035b576200035a620000f3565b5b6200036985828601620002da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b6000620003eb82620003d1565b915060ff8203620004015762000400620003a2565b5b600182019050919050565b6122b3806200041c6000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c8063708ace651161005b578063708ace65146101115780639872dbfe14610141578063b93bd7d41461015f578063e33f72911461018f57610088565b8063314044841461008d5780633a8cbc38146100a95780634b83a7be146100d95780634e1389ed146100f5575b600080fd5b6100a760048036038101906100a291906111a4565b6101ab565b005b6100c360048036038101906100be91906112ca565b610307565b6040516100d09190611361565b60405180910390f35b6100f360048036038101906100ee91906113d2565b610612565b005b61010f600480360381019061010a919061146b565b610835565b005b61012b600480360381019061012691906114e6565b610c3b565b6040516101389190611361565b60405180910390f35b610149610f58565b60405161015691906115a4565b60405180910390f35b610179600480360381019061017491906115bf565b610f5e565b6040516101869190611607565b60405180910390f35b6101a960048036038101906101a49190611622565b610f7e565b005b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247906116e5565b60405180910390fd5b60006002600084815260200190815260200160002060040160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102fb9190611361565b60405180910390a25050565b600082828660405160200161031e93929190611765565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060040160009054906101000a900460ff161561039a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039190611801565b60405180910390fd5b60008690508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b81526004016103dc93929190611830565b6020604051808303816000875af11580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190611893565b5060006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200160011515815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050190816105af9190611b06565b509050503373ffffffffffffffffffffffffffffffffffffffff167fb2d817df1a92003b7e8b40681145547601989b987e206c6f7d0bc46369652913848a898b6040516105ff9493929190611bd8565b60405180910390a2505095945050505050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae906116e5565b60405180910390fd5b6106c18383610fdb565b60006002600086815260200190815260200160002090508060040160009054906101000a900460ff16156106f9576106f8856101ab565b5b60008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600201546040518363ffffffff1660e01b8152600401610785929190611c1d565b6020604051808303816000875af11580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c89190611893565b50600082600201549050600083600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8883604051610824929190611c46565b60405180910390a250505050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002090506000600260008460000154815260200190815260200160002060050183600401548860405160200161089b93929190611cf2565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90611d9d565b60405180910390fd5b6000600182868989604051600081526020016040526040516109399493929190611dcc565b6020604051602081039080840390855afa15801561095b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ea90611e5d565b60405180910390fd5b60008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8660010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687600301548860050154610a719190611eac565b6040518363ffffffff1660e01b8152600401610a8e929190611c1d565b6020604051808303816000875af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190611893565b50600085600301541115610b87578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687600301546040518363ffffffff1660e01b8152600401610b42929190611c1d565b6020604051808303816000875af1158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b859190611893565b505b6000856004018190555060016004600085815260200190815260200160002060006101000a81548160ff0219169083151502179055508460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8b604051610c279190611361565b60405180910390a250505050505050505050565b6000610c478383610fdb565b6000600260008a815260200190815260200160002090508060040160009054906101000a900460ff16610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690611f2c565b60405180910390fd5b806003015485610cbf9190611f7b565b816002015411610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90611ff8565b60405180910390fd5b888589604051602001610d1993929190612081565b60405160208183030381529060405280519060200120915043600360008481526020019081526020016000206006015410610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090612130565b60405180910390fd5b60006040518060e001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001836003015488610df09190611f7b565b815260200160005443610e039190612150565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505085826002016000828254610ef39190611eac565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c89604051610f43929190611c46565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b6000600260008481526020019081526020016000209050818160030181905550827f42dfc0c297064717f06aefc162216c94dc59f9a1af9ff6ed92f00cadbe9ba80383604051610fce91906115a4565b60405180910390a2505050565b600082829050905060005b818161ffff16101561115e5760006003600086868561ffff1681811061100f5761100e612184565b5b905060200201358152602001908152602001600020905043816006015410801561103d575060008160040154115b61107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390612225565b60405180910390fd5b8060040154600260008360000154815260200190815260200160002060020160008282546110aa9190612150565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff1681811061112e5761112d612184565b5b905060200201356040516111429190611361565b60405180910390a250808061115690612253565b915050610fe6565b50505050565b600080fd5b600080fd5b6000819050919050565b6111818161116e565b811461118c57600080fd5b50565b60008135905061119e81611178565b92915050565b6000602082840312156111ba576111b9611164565b5b60006111c88482850161118f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111fc826111d1565b9050919050565b61120c816111f1565b811461121757600080fd5b50565b60008135905061122981611203565b92915050565b6000819050919050565b6112428161122f565b811461124d57600080fd5b50565b60008135905061125f81611239565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261128a57611289611265565b5b8235905067ffffffffffffffff8111156112a7576112a661126a565b5b6020830191508360018202830111156112c3576112c261126f565b5b9250929050565b6000806000806000608086880312156112e6576112e5611164565b5b60006112f48882890161121a565b955050602061130588828901611250565b945050604061131688828901611250565b935050606086013567ffffffffffffffff81111561133757611336611169565b5b61134388828901611274565b92509250509295509295909350565b61135b8161116e565b82525050565b60006020820190506113766000830184611352565b92915050565b60008083601f84011261139257611391611265565b5b8235905067ffffffffffffffff8111156113af576113ae61126a565b5b6020830191508360208202830111156113cb576113ca61126f565b5b9250929050565b6000806000604084860312156113eb576113ea611164565b5b60006113f98682870161118f565b935050602084013567ffffffffffffffff81111561141a57611419611169565b5b6114268682870161137c565b92509250509250925092565b600060ff82169050919050565b61144881611432565b811461145357600080fd5b50565b6000813590506114658161143f565b92915050565b600080600080600060a0868803121561148757611486611164565b5b60006114958882890161118f565b95505060206114a688828901611250565b94505060406114b78882890161118f565b93505060606114c88882890161118f565b92505060806114d988828901611456565b9150509295509295909350565b600080600080600080600060c0888a03121561150557611504611164565b5b60006115138a828b0161118f565b97505060206115248a828b0161121a565b96505060406115358a828b0161121a565b95505060606115468a828b01611250565b94505060806115578a828b01611250565b93505060a088013567ffffffffffffffff81111561157857611577611169565b5b6115848a828b0161137c565b925092505092959891949750929550565b61159e8161122f565b82525050565b60006020820190506115b96000830184611595565b92915050565b6000602082840312156115d5576115d4611164565b5b60006115e38482850161121a565b91505092915050565b60008115159050919050565b611601816115ec565b82525050565b600060208201905061161c60008301846115f8565b92915050565b6000806040838503121561163957611638611164565b5b60006116478582860161118f565b925050602061165885828601611250565b9150509250929050565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006116cf602c83611662565b91506116da82611673565b604082019050919050565b600060208201905081810360008301526116fe816116c2565b9050919050565b600081905092915050565b82818337600083830152505050565b600061172b8385611705565b9350611738838584611710565b82840190509392505050565b6000819050919050565b61175f61175a8261122f565b611744565b82525050565b600061177282858761171f565b915061177e828461174e565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b60006117eb603283611662565b91506117f68261178f565b604082019050919050565b6000602082019050818103600083015261181a816117de565b9050919050565b61182a816111f1565b82525050565b60006060820190506118456000830186611821565b6118526020830185611821565b61185f6040830184611595565b949350505050565b611870816115ec565b811461187b57600080fd5b50565b60008151905061188d81611867565b92915050565b6000602082840312156118a9576118a8611164565b5b60006118b78482850161187e565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061194157607f821691505b602082108103611954576119536118fa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261197f565b6119c6868361197f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a036119fe6119f98461122f565b6119de565b61122f565b9050919050565b6000819050919050565b611a1d836119e8565b611a31611a2982611a0a565b84845461198c565b825550505050565b600090565b611a46611a39565b611a51818484611a14565b505050565b5b81811015611a7557611a6a600082611a3e565b600181019050611a57565b5050565b601f821115611aba57611a8b8161195a565b611a948461196f565b81016020851015611aa3578190505b611ab7611aaf8561196f565b830182611a56565b50505b505050565b600082821c905092915050565b6000611add60001984600802611abf565b1980831691505092915050565b6000611af68383611acc565b9150826002028217905092915050565b611b0f826118c0565b67ffffffffffffffff811115611b2857611b276118cb565b5b611b328254611929565b611b3d828285611a79565b600060209050601f831160018114611b705760008415611b5e578287015190505b611b688582611aea565b865550611bd0565b601f198416611b7e8661195a565b60005b82811015611ba657848901518255600182019150602085019450602081019050611b81565b86831015611bc35784890151611bbf601f891682611acc565b8355505b6001600288020188555050505b505050505050565b6000608082019050611bed6000830187611352565b611bfa6020830186611821565b611c076040830185611595565b611c146060830184611595565b95945050505050565b6000604082019050611c326000830185611821565b611c3f6020830184611595565b9392505050565b6000604082019050611c5b6000830185611352565b611c686020830184611595565b9392505050565b60008154611c7c81611929565b611c868186611705565b94506001821660008114611ca15760018114611cb657611ce9565b60ff1983168652811515820286019350611ce9565b611cbf8561195a565b60005b83811015611ce157815481890152600182019150602081019050611cc2565b838801955050505b50505092915050565b6000611cfe8286611c6f565b9150611d0a828561174e565b602082019150611d1a828461174e565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b6000611d87602b83611662565b9150611d9282611d2b565b604082019050919050565b60006020820190508181036000830152611db681611d7a565b9050919050565b611dc681611432565b82525050565b6000608082019050611de16000830187611352565b611dee6020830186611dbd565b611dfb6040830185611352565b611e086060830184611352565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b6000611e47601d83611662565b9150611e5282611e11565b602082019050919050565b60006020820190508181036000830152611e7681611e3a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611eb78261122f565b9150611ec28361122f565b9250828203905081811115611eda57611ed9611e7d565b5b92915050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b6000611f16602083611662565b9150611f2182611ee0565b602082019050919050565b60006020820190508181036000830152611f4581611f09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611f868261122f565b9150611f918361122f565b925082611fa157611fa0611f4c565b5b828204905092915050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b6000611fe2601b83611662565b9150611fed82611fac565b602082019050919050565b6000602082019050818103600083015261201181611fd5565b9050919050565b6000819050919050565b61203361202e8261116e565b612018565b82525050565b60008160601b9050919050565b600061205182612039565b9050919050565b600061206382612046565b9050919050565b61207b612076826111f1565b612058565b82525050565b600061208d8286612022565b60208201915061209d828561174e565b6020820191506120ad828461206a565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b600061211a603383611662565b9150612125826120be565b604082019050919050565b600060208201905081810360008301526121498161210d565b9050919050565b600061215b8261122f565b91506121668361122f565b925082820190508082111561217e5761217d611e7d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b600061220f602783611662565b915061221a826121b3565b604082019050919050565b6000602082019050818103600083015261223e81612202565b9050919050565b600061ffff82169050919050565b600061225e82612245565b915061ffff820361227257612271611e7d565b5b60018201905091905056fea2646970667358221220c53996c989fa22a5161ea19229cf4a37bd9ddd0c602f2269f8b7baaaf7c9ff5a64736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100885760003560e01c8063708ace651161005b578063708ace65146101115780639872dbfe14610141578063b93bd7d41461015f578063e33f72911461018f57610088565b8063314044841461008d5780633a8cbc38146100a95780634b83a7be146100d95780634e1389ed146100f5575b600080fd5b6100a760048036038101906100a291906111a4565b6101ab565b005b6100c360048036038101906100be91906112ca565b610307565b6040516100d09190611361565b60405180910390f35b6100f360048036038101906100ee91906113d2565b610612565b005b61010f600480360381019061010a919061146b565b610835565b005b61012b600480360381019061012691906114e6565b610c3b565b6040516101389190611361565b60405180910390f35b610149610f58565b60405161015691906115a4565b60405180910390f35b610179600480360381019061017491906115bf565b610f5e565b6040516101869190611607565b60405180910390f35b6101a960048036038101906101a49190611622565b610f7e565b005b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610250576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610247906116e5565b60405180910390fd5b60006002600084815260200190815260200160002060040160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102fb9190611361565b60405180910390a25050565b600082828660405160200161031e93929190611765565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060040160009054906101000a900460ff161561039a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161039190611801565b60405180910390fd5b60008690508073ffffffffffffffffffffffffffffffffffffffff166323b872dd3330896040518463ffffffff1660e01b81526004016103dc93929190611830565b6020604051808303816000875af11580156103fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061041f9190611893565b5060006040518060c001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff16815260200188815260200187815260200160011515815260200186868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550604082015181600201556060820151816003015560808201518160040160006101000a81548160ff02191690831515021790555060a08201518160050190816105af9190611b06565b509050503373ffffffffffffffffffffffffffffffffffffffff167fb2d817df1a92003b7e8b40681145547601989b987e206c6f7d0bc46369652913848a898b6040516105ff9493929190611bd8565b60405180910390a2505095945050505050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146106b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106ae906116e5565b60405180910390fd5b6106c18383610fdb565b60006002600086815260200190815260200160002090508060040160009054906101000a900460ff16156106f9576106f8856101ab565b5b60008160010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1684600201546040518363ffffffff1660e01b8152600401610785929190611c1d565b6020604051808303816000875af11580156107a4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107c89190611893565b50600082600201549050600083600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8883604051610824929190611c46565b60405180910390a250505050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002090506000600260008460000154815260200190815260200160002060050183600401548860405160200161089b93929190611cf2565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90611d9d565b60405180910390fd5b6000600182868989604051600081526020016040526040516109399493929190611dcc565b6020604051602081039080840390855afa15801561095b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166109f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109ea90611e5d565b60405180910390fd5b60008360010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8660010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687600301548860050154610a719190611eac565b6040518363ffffffff1660e01b8152600401610a8e929190611c1d565b6020604051808303816000875af1158015610aad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ad19190611893565b50600085600301541115610b87578073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1687600301546040518363ffffffff1660e01b8152600401610b42929190611c1d565b6020604051808303816000875af1158015610b61573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b859190611893565b505b6000856004018190555060016004600085815260200190815260200160002060006101000a81548160ff0219169083151502179055508460010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8b604051610c279190611361565b60405180910390a250505050505050505050565b6000610c478383610fdb565b6000600260008a815260200190815260200160002090508060040160009054906101000a900460ff16610caf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca690611f2c565b60405180910390fd5b806003015485610cbf9190611f7b565b816002015411610d04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cfb90611ff8565b60405180910390fd5b888589604051602001610d1993929190612081565b60405160208183030381529060405280519060200120915043600360008481526020019081526020016000206006015410610d89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8090612130565b60405180910390fd5b60006040518060e001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001836003015488610df09190611f7b565b815260200160005443610e039190612150565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c0820151816006015590505085826002016000828254610ef39190611eac565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c89604051610f43929190611c46565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b6000600260008481526020019081526020016000209050818160030181905550827f42dfc0c297064717f06aefc162216c94dc59f9a1af9ff6ed92f00cadbe9ba80383604051610fce91906115a4565b60405180910390a2505050565b600082829050905060005b818161ffff16101561115e5760006003600086868561ffff1681811061100f5761100e612184565b5b905060200201358152602001908152602001600020905043816006015410801561103d575060008160040154115b61107c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107390612225565b60405180910390fd5b8060040154600260008360000154815260200190815260200160002060020160008282546110aa9190612150565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff1681811061112e5761112d612184565b5b905060200201356040516111429190611361565b60405180910390a250808061115690612253565b915050610fe6565b50505050565b600080fd5b600080fd5b6000819050919050565b6111818161116e565b811461118c57600080fd5b50565b60008135905061119e81611178565b92915050565b6000602082840312156111ba576111b9611164565b5b60006111c88482850161118f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006111fc826111d1565b9050919050565b61120c816111f1565b811461121757600080fd5b50565b60008135905061122981611203565b92915050565b6000819050919050565b6112428161122f565b811461124d57600080fd5b50565b60008135905061125f81611239565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261128a57611289611265565b5b8235905067ffffffffffffffff8111156112a7576112a661126a565b5b6020830191508360018202830111156112c3576112c261126f565b5b9250929050565b6000806000806000608086880312156112e6576112e5611164565b5b60006112f48882890161121a565b955050602061130588828901611250565b945050604061131688828901611250565b935050606086013567ffffffffffffffff81111561133757611336611169565b5b61134388828901611274565b92509250509295509295909350565b61135b8161116e565b82525050565b60006020820190506113766000830184611352565b92915050565b60008083601f84011261139257611391611265565b5b8235905067ffffffffffffffff8111156113af576113ae61126a565b5b6020830191508360208202830111156113cb576113ca61126f565b5b9250929050565b6000806000604084860312156113eb576113ea611164565b5b60006113f98682870161118f565b935050602084013567ffffffffffffffff81111561141a57611419611169565b5b6114268682870161137c565b92509250509250925092565b600060ff82169050919050565b61144881611432565b811461145357600080fd5b50565b6000813590506114658161143f565b92915050565b600080600080600060a0868803121561148757611486611164565b5b60006114958882890161118f565b95505060206114a688828901611250565b94505060406114b78882890161118f565b93505060606114c88882890161118f565b92505060806114d988828901611456565b9150509295509295909350565b600080600080600080600060c0888a03121561150557611504611164565b5b60006115138a828b0161118f565b97505060206115248a828b0161121a565b96505060406115358a828b0161121a565b95505060606115468a828b01611250565b94505060806115578a828b01611250565b93505060a088013567ffffffffffffffff81111561157857611577611169565b5b6115848a828b0161137c565b925092505092959891949750929550565b61159e8161122f565b82525050565b60006020820190506115b96000830184611595565b92915050565b6000602082840312156115d5576115d4611164565b5b60006115e38482850161121a565b91505092915050565b60008115159050919050565b611601816115ec565b82525050565b600060208201905061161c60008301846115f8565b92915050565b6000806040838503121561163957611638611164565b5b60006116478582860161118f565b925050602061165885828601611250565b9150509250929050565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006116cf602c83611662565b91506116da82611673565b604082019050919050565b600060208201905081810360008301526116fe816116c2565b9050919050565b600081905092915050565b82818337600083830152505050565b600061172b8385611705565b9350611738838584611710565b82840190509392505050565b6000819050919050565b61175f61175a8261122f565b611744565b82525050565b600061177282858761171f565b915061177e828461174e565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b60006117eb603283611662565b91506117f68261178f565b604082019050919050565b6000602082019050818103600083015261181a816117de565b9050919050565b61182a816111f1565b82525050565b60006060820190506118456000830186611821565b6118526020830185611821565b61185f6040830184611595565b949350505050565b611870816115ec565b811461187b57600080fd5b50565b60008151905061188d81611867565b92915050565b6000602082840312156118a9576118a8611164565b5b60006118b78482850161187e565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061194157607f821691505b602082108103611954576119536118fa565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119bc7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261197f565b6119c6868361197f565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a036119fe6119f98461122f565b6119de565b61122f565b9050919050565b6000819050919050565b611a1d836119e8565b611a31611a2982611a0a565b84845461198c565b825550505050565b600090565b611a46611a39565b611a51818484611a14565b505050565b5b81811015611a7557611a6a600082611a3e565b600181019050611a57565b5050565b601f821115611aba57611a8b8161195a565b611a948461196f565b81016020851015611aa3578190505b611ab7611aaf8561196f565b830182611a56565b50505b505050565b600082821c905092915050565b6000611add60001984600802611abf565b1980831691505092915050565b6000611af68383611acc565b9150826002028217905092915050565b611b0f826118c0565b67ffffffffffffffff811115611b2857611b276118cb565b5b611b328254611929565b611b3d828285611a79565b600060209050601f831160018114611b705760008415611b5e578287015190505b611b688582611aea565b865550611bd0565b601f198416611b7e8661195a565b60005b82811015611ba657848901518255600182019150602085019450602081019050611b81565b86831015611bc35784890151611bbf601f891682611acc565b8355505b6001600288020188555050505b505050505050565b6000608082019050611bed6000830187611352565b611bfa6020830186611821565b611c076040830185611595565b611c146060830184611595565b95945050505050565b6000604082019050611c326000830185611821565b611c3f6020830184611595565b9392505050565b6000604082019050611c5b6000830185611352565b611c686020830184611595565b9392505050565b60008154611c7c81611929565b611c868186611705565b94506001821660008114611ca15760018114611cb657611ce9565b60ff1983168652811515820286019350611ce9565b611cbf8561195a565b60005b83811015611ce157815481890152600182019150602081019050611cc2565b838801955050505b50505092915050565b6000611cfe8286611c6f565b9150611d0a828561174e565b602082019150611d1a828461174e565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b6000611d87602b83611662565b9150611d9282611d2b565b604082019050919050565b60006020820190508181036000830152611db681611d7a565b9050919050565b611dc681611432565b82525050565b6000608082019050611de16000830187611352565b611dee6020830186611dbd565b611dfb6040830185611352565b611e086060830184611352565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b6000611e47601d83611662565b9150611e5282611e11565b602082019050919050565b60006020820190508181036000830152611e7681611e3a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000611eb78261122f565b9150611ec28361122f565b9250828203905081811115611eda57611ed9611e7d565b5b92915050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b6000611f16602083611662565b9150611f2182611ee0565b602082019050919050565b60006020820190508181036000830152611f4581611f09565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000611f868261122f565b9150611f918361122f565b925082611fa157611fa0611f4c565b5b828204905092915050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b6000611fe2601b83611662565b9150611fed82611fac565b602082019050919050565b6000602082019050818103600083015261201181611fd5565b9050919050565b6000819050919050565b61203361202e8261116e565b612018565b82525050565b60008160601b9050919050565b600061205182612039565b9050919050565b600061206382612046565b9050919050565b61207b612076826111f1565b612058565b82525050565b600061208d8286612022565b60208201915061209d828561174e565b6020820191506120ad828461206a565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b600061211a603383611662565b9150612125826120be565b604082019050919050565b600060208201905081810360008301526121498161210d565b9050919050565b600061215b8261122f565b91506121668361122f565b925082820190508082111561217e5761217d611e7d565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b600061220f602783611662565b915061221a826121b3565b604082019050919050565b6000602082019050818103600083015261223e81612202565b9050919050565b600061ffff82169050919050565b600061225e82612245565b915061ffff820361227257612271611e7d565b5b60018201905091905056fea2646970667358221220c53996c989fa22a5161ea19229cf4a37bd9ddd0c602f2269f8b7baaaf7c9ff5a64736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/mockToken.sol b/contracts/mockToken.sol new file mode 100644 index 0000000..f67317f --- /dev/null +++ b/contracts/mockToken.sol @@ -0,0 +1,11 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.9; + +import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract MockToken is ERC20 { + + constructor(uint256 supply) ERC20("MockBRL", "MBRL") { + _mint(msg.sender, supply); + } +} \ No newline at end of file diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index 42342a4..cc27a0f 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -1,11 +1,14 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.9; +import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; + contract P2PIX { - event DepositAdded(address indexed seller, bytes32 depositID, address token, uint256 amount); + event DepositAdded(address indexed seller, bytes32 depositID, address token, uint256 price, uint256 amount); event DepositClosed(address indexed seller, bytes32 depositID); event DepositWithdrawn(address indexed seller, bytes32 depositID, uint256 amount); + event DepositPriceChanged(bytes32 indexed depositID, uint256 price); event LockAdded(address indexed buyer, bytes32 indexed lockID, bytes32 depositID, uint256 amount); event LockReleased(address indexed buyer, bytes32 lockId); event LockReturned(address indexed buyer, bytes32 lockId); @@ -14,6 +17,7 @@ contract P2PIX { address seller; address token; // ERC20 stable token address uint256 remaining; // Remaining tokens available + uint256 price; // Price in R$ per token bool valid; // Could be invalidated by the seller string pixTarget; // The PIX account for the seller receive transactions } @@ -23,7 +27,8 @@ contract P2PIX { address targetAddress; // Where goes the tokens when validated address relayerAddress; // Relayer address that facilitated this transaction uint256 relayerPremium; // Amount to be paid for relayer - uint256 amount; // Amount to be transfered to buyer + uint256 amount; // Amount to be tranfered via PIX + uint256 locked; // Amount locked in tokens from deposit uint256 expirationBlock; // If not paid at this block will be expired } @@ -55,15 +60,16 @@ contract P2PIX { function deposit( address token, uint256 amount, + uint256 price, string calldata pixTarget ) public returns (bytes32 depositID){ depositID = keccak256(abi.encodePacked(pixTarget, amount)); require(!mapDeposits[depositID].valid, 'P2PIX: Deposit already exist and it is still valid'); - // TODO Prevent seller to use same depositID - // TODO Transfer tokens to this address - Deposit memory d = Deposit(msg.sender, token, amount, true, pixTarget); + IERC20 t = IERC20(token); + t.transferFrom(msg.sender, address(this), amount); + Deposit memory d = Deposit(msg.sender, token, amount, price, true, pixTarget); mapDeposits[depositID] = d; - emit DepositAdded(msg.sender, depositID, token, amount); + emit DepositAdded(msg.sender, depositID, token, price, amount); } // Vendedor pode invalidar da ordem de venda impedindo novos locks na mesma (isso não afeta nenhum lock que esteja ativo). @@ -89,7 +95,7 @@ contract P2PIX { unlockExpired(expiredLocks); Deposit storage d = mapDeposits[depositID]; require(d.valid, "P2PIX: Deposit not valid anymore"); - require(d.remaining > amount, "P2PIX: Not enough remaining"); + require(d.remaining > amount/d.price, "P2PIX: Not enough remaining"); lockID = keccak256(abi.encodePacked(depositID, amount, targetAddress)); require( mapLocks[lockID].expirationBlock < block.number, @@ -101,6 +107,7 @@ contract P2PIX { relayerAddress, relayerPremium, amount, + amount/d.price, block.number+defaultLockBlocks ); mapLocks[lockID] = l; @@ -120,6 +127,7 @@ contract P2PIX { // TODO Check if lockID exists and is enabled // TODO **Prevenir que um Pix não relacionado ao APP seja usado pois tem o mesmo destino Lock storage l = mapLocks[lockID]; + Deposit storage d = mapDeposits[l.depositID]; bytes32 message = keccak256(abi.encodePacked( mapDeposits[l.depositID].pixTarget, l.amount, @@ -128,13 +136,21 @@ contract P2PIX { require(!usedTransactions[message], "Transaction already used to unlock payment."); address signer = ecrecover(message, v, r, s); require(validBacenSigners[signer], "Signer is not a valid signer."); - // TODO Transfer token to l.target - // TODO Transfer relayer fees to relayer + IERC20 t = IERC20(d.token); + t.transfer(l.targetAddress, l.locked-l.relayerPremium); + if (l.relayerPremium > 0) t.transfer(l.relayerAddress, l.relayerPremium); l.amount = 0; usedTransactions[message] = true; emit LockReleased(l.targetAddress, lockID); } + // Change price for deposit amount + function changeDepositPrice(bytes32 depositID, uint256 price) public { + Deposit storage d = mapDeposits[depositID]; + d.price = price; + emit DepositPriceChanged(depositID, price); + } + // Unlock expired locks function unlockExpired(bytes32[] calldata lockIDs) internal { uint256 locksSize = lockIDs.length; @@ -153,11 +169,13 @@ contract P2PIX { bytes32[] calldata expiredLocks ) public onlySeller(depositID) { unlockExpired(expiredLocks); - if (mapDeposits[depositID].valid) cancelDeposit(depositID); - // TODO Transfer remaining tokens back to the seller + Deposit storage d = mapDeposits[depositID]; + if (d.valid) cancelDeposit(depositID); + IERC20 token = IERC20(d.token); + token.transfer(d.seller, d.remaining); // Withdraw remaining tokens from mapDeposit[depositID] - uint256 amount = mapDeposits[depositID].remaining; - mapDeposits[depositID].remaining = 0; + uint256 amount = d.remaining; + d.remaining = 0; emit DepositWithdrawn(msg.sender, depositID, amount); } diff --git a/deploys/localhost.json b/deploys/localhost.json new file mode 100644 index 0000000..cf0e5d8 --- /dev/null +++ b/deploys/localhost.json @@ -0,0 +1,8 @@ +{ + "signers": [ + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8" + ], + "p2pix": "0x5FbDB2315678afecb367f032d93F642f64180aa3", + "token": "0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512" +} \ No newline at end of file diff --git a/hardhat.config.js b/hardhat.config.js index cd469dd..acb3ac3 100644 --- a/hardhat.config.js +++ b/hardhat.config.js @@ -3,4 +3,10 @@ require("@nomiclabs/hardhat-waffle"); /** @type import('hardhat/config').HardhatUserConfig */ module.exports = { solidity: "0.8.17", + networks: { + hardhat: { + blockGasLimit: 30000000, + //hardfork: 'london' + } + } }; diff --git a/package-lock.json b/package-lock.json index b2884f2..282502e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,6 +8,9 @@ "name": "p2pix-smart-contracts", "version": "1.0.0", "license": "MIT", + "dependencies": { + "@openzeppelin/contracts": "^4.7.3" + }, "devDependencies": { "@nomiclabs/hardhat-waffle": "^2.0.3", "chai": "^4.3.6", @@ -1756,6 +1759,11 @@ "hardhat": "^2.0.0" } }, + "node_modules/@openzeppelin/contracts": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", + "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" + }, "node_modules/@resolver-engine/core": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", @@ -17914,6 +17922,11 @@ "@types/web3": "1.0.19" } }, + "@openzeppelin/contracts": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/@openzeppelin/contracts/-/contracts-4.7.3.tgz", + "integrity": "sha512-dGRS0agJzu8ybo44pCIf3xBaPQN/65AIXNgK8+4gzKd5kbvlqyxryUYVLJv7fK98Seyd2hDZzVEHSWAh0Bt1Yw==" + }, "@resolver-engine/core": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@resolver-engine/core/-/core-0.3.3.tgz", diff --git a/package.json b/package.json index 82b3bc0..44dfe47 100644 --- a/package.json +++ b/package.json @@ -20,5 +20,8 @@ "@nomiclabs/hardhat-waffle": "^2.0.3", "chai": "^4.3.6", "hardhat": "^2.12.0" + }, + "dependencies": { + "@openzeppelin/contracts": "^4.7.3" } } diff --git a/scripts/1-deploy-p2pix.js b/scripts/1-deploy-p2pix.js new file mode 100644 index 0000000..3f2cef2 --- /dev/null +++ b/scripts/1-deploy-p2pix.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const { network } = require("hardhat"); + +async function main() { + + let deploysJson = {} + + try { + const data = fs.readFileSync(`./deploys/${network.name}.json`, {encoding:"utf-8"}); + deploysJson = JSON.parse(data); + } catch (err) { + console.log('Error loading Master address: ', err); + process.exit(1); + } + + const P2PIX = await ethers.getContractFactory("P2PIX"); + const p2pix = await P2PIX.deploy(2, deploysJson.signers); + await p2pix.deployed(); + + deploysJson.p2pix = p2pix.address + console.log("🚀 P2PIX Deployed:", p2pix.address); + + fs.writeFileSync(`./deploys/${network.name}.json`, JSON.stringify(deploysJson, undefined, 2)); +} + +main() +.then(() => process.exit(0)) +.catch((error) => { + console.error(error); + process.exit(1); +}); \ No newline at end of file diff --git a/scripts/2-deploy-mockToken.js b/scripts/2-deploy-mockToken.js new file mode 100644 index 0000000..5c12043 --- /dev/null +++ b/scripts/2-deploy-mockToken.js @@ -0,0 +1,31 @@ +const fs = require('fs'); +const { network } = require("hardhat"); + +async function main() { + + let deploysJson = {} + + try { + const data = fs.readFileSync(`./deploys/${network.name}.json`, {encoding:"utf-8"}); + deploysJson = JSON.parse(data); + } catch (err) { + console.log('Error loading Master address: ', err); + process.exit(1); + } + + const ERC20Factory = await ethers.getContractFactory("MockToken"); + const erc20 = await ERC20Factory.deploy(ethers.utils.parseEther('20000000', 'wei')); + await erc20.deployed(); + + deploysJson.token = erc20.address + console.log("🚀 Mock Token Deployed:", erc20.address); + + fs.writeFileSync(`./deploys/${network.name}.json`, JSON.stringify(deploysJson, undefined, 2)); +} + +main() +.then(() => process.exit(0)) +.catch((error) => { + console.error(error); + process.exit(1); +}); \ No newline at end of file diff --git a/test/1-deposit.test.js b/test/1-deposit.test.js index 2a30458..7a9e877 100644 --- a/test/1-deposit.test.js +++ b/test/1-deposit.test.js @@ -5,33 +5,61 @@ describe("P2PIX deposit test", function () { let owner, wallet2, wallet3, wallet4; let p2pix; // Contract instance + let erc20; // Token instance let depositID; it("Will deploy contracts", async function () { [owner, wallet2, wallet3, wallet4] = await ethers.getSigners(); + const ERC20Factory = await ethers.getContractFactory("MockToken"); + erc20 = await ERC20Factory.deploy(ethers.utils.parseEther('20000000', 'wei')); + await erc20.deployed(); + + // Check initial balance + expect(await erc20.balanceOf(owner.address)).to.equal(ethers.utils.parseEther('20000000', 'wei')); + const P2PIX = await ethers.getContractFactory("P2PIX"); p2pix = await P2PIX.deploy(2, [owner.address, wallet2.address]); await p2pix.deployed(); + // Verify values at deployment expect(await p2pix.validBacenSigners(owner.address)).to.equal(true); expect(await p2pix.validBacenSigners(wallet2.address)).to.equal(true); }); it("Should allow create a deposit", async function () { - const transaction = await p2pix.deposit(ethers.constants.AddressZero, 1000, 'SELLER PIX KEY'); - depositID = ethers.utils.solidityKeccak256(['string', 'uint256'], ['SELLER PIX KEY', 1000]) + + let transaction = await erc20.approve(p2pix.address,ethers.utils.parseEther('1000')); + await expect(transaction).to.emit(erc20, 'Approval').withArgs( + owner.address, + p2pix.address, + ethers.utils.parseEther('1000') + ) + + transaction = await p2pix.deposit( + erc20.address, + ethers.utils.parseEther('1000'), + ethers.utils.parseEther('0.99'), + 'SELLER PIX KEY' + ); + depositID = ethers.utils.solidityKeccak256(['string', 'uint256'], ['SELLER PIX KEY', ethers.utils.parseEther('1000')]) await expect(transaction).to.emit(p2pix, 'DepositAdded').withArgs( owner.address, depositID, - ethers.constants.AddressZero, - 1000 + erc20.address, + ethers.utils.parseEther('0.99'), + ethers.utils.parseEther('1000') ) }) it("Should prevent create same deposit", async function () { - await expect(p2pix.deposit(ethers.constants.AddressZero, 1000, 'SELLER PIX KEY')) + await expect(p2pix.deposit( + erc20.address, + ethers.utils.parseEther('1000'), + ethers.utils.parseEther('0.99'), + 'SELLER PIX KEY' + )) .to.be.revertedWith('P2PIX: Deposit already exist and it is still valid'); }) @@ -44,13 +72,27 @@ describe("P2PIX deposit test", function () { }) it("Should allow recreate the deposit", async function () { - const transaction = await p2pix.deposit(ethers.constants.AddressZero, 1000, 'SELLER PIX KEY'); - depositID = ethers.utils.solidityKeccak256(['string', 'uint256'], ['SELLER PIX KEY', 1000]) + + let transaction = await erc20.approve(p2pix.address,ethers.utils.parseEther('1000')); + await expect(transaction).to.emit(erc20, 'Approval').withArgs( + owner.address, + p2pix.address, + ethers.utils.parseEther('1000') + ) + + transaction = await p2pix.deposit( + erc20.address, + ethers.utils.parseEther('1000'), + ethers.utils.parseEther('0.99'), + 'SELLER PIX KEY' + ); + depositID = ethers.utils.solidityKeccak256(['string', 'uint256'], ['SELLER PIX KEY', ethers.utils.parseEther('1000')]) await expect(transaction).to.emit(p2pix, 'DepositAdded').withArgs( owner.address, depositID, - ethers.constants.AddressZero, - 1000 + erc20.address, + ethers.utils.parseEther('0.99'), + ethers.utils.parseEther('1000') ) }) @@ -67,7 +109,7 @@ describe("P2PIX deposit test", function () { await expect(transaction).to.emit(p2pix, 'DepositWithdrawn').withArgs( owner.address, depositID, - 1000 + ethers.utils.parseEther('1000') ) }) }) \ No newline at end of file diff --git a/test/2-lock-release.test.js b/test/2-lock-release.test.js new file mode 100644 index 0000000..1649cee --- /dev/null +++ b/test/2-lock-release.test.js @@ -0,0 +1,78 @@ +const { expect } = require("chai"); +const { ethers } = require("hardhat"); + +describe("P2PIX lock/release test", function () { + + let owner, wallet2, wallet3, wallet4; + let p2pix; // Contract instance + let erc20; // Token instance + let depositID; + + it("Will deploy contracts", async function () { + + [owner, wallet2, wallet3, wallet4] = await ethers.getSigners(); + + const ERC20Factory = await ethers.getContractFactory("MockToken"); + erc20 = await ERC20Factory.deploy(ethers.utils.parseEther('20000000', 'wei')); + await erc20.deployed(); + + // Check initial balance + expect(await erc20.balanceOf(owner.address)).to.equal(ethers.utils.parseEther('20000000', 'wei')); + + const P2PIX = await ethers.getContractFactory("P2PIX"); + p2pix = await P2PIX.deploy(2, [owner.address, wallet2.address]); + await p2pix.deployed(); + + // Verify values at deployment + expect(await p2pix.validBacenSigners(owner.address)).to.equal(true); + expect(await p2pix.validBacenSigners(wallet2.address)).to.equal(true); + }); + + it("Should allow create a deposit", async function () { + + let transaction = await erc20.approve(p2pix.address,ethers.utils.parseEther('1000')); + await expect(transaction).to.emit(erc20, 'Approval').withArgs( + owner.address, + p2pix.address, + ethers.utils.parseEther('1000') + ) + + transaction = await p2pix.deposit( + erc20.address, + ethers.utils.parseEther('1000'), + ethers.utils.parseEther('0.99'), + 'SELLER PIX KEY' + ); + depositID = ethers.utils.solidityKeccak256(['string', 'uint256'], ['SELLER PIX KEY', ethers.utils.parseEther('1000')]) + await expect(transaction).to.emit(p2pix, 'DepositAdded').withArgs( + owner.address, + depositID, + erc20.address, + ethers.utils.parseEther('0.99'), + ethers.utils.parseEther('1000') + ) + }) + + it("Should allow create a new lock", async function () { + transaction = await p2pix.connect(wallet3).lock( + depositID, + wallet3.address, + ethers.constants.AddressZero, + '0', + ethers.utils.parseEther('100'), + [] + ) + const lockID = ethers.utils.solidityKeccak256(['bytes32', 'uint256', 'address'], [ + depositID, + ethers.utils.parseEther('100'), + wallet3.address + ]) + await expect(transaction).to.emit(p2pix, 'LockAdded').withArgs( + wallet3.address, + lockID, + depositID, + ethers.utils.parseEther('100') + ) + }) + +}) \ No newline at end of file