diff --git a/artifacts/contracts/p2pix.sol/P2PIX.dbg.json b/artifacts/contracts/p2pix.sol/P2PIX.dbg.json index 4bdcda0..5c5d512 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/e163883cb06c01d261c8d27101a410f2.json" + "buildInfo": "../../build-info/e53d155f4d4e8ba3d5f49011e7166818.json" } diff --git a/artifacts/contracts/p2pix.sol/P2PIX.json b/artifacts/contracts/p2pix.sol/P2PIX.json index f015f6e..81dcb55 100644 --- a/artifacts/contracts/p2pix.sol/P2PIX.json +++ b/artifacts/contracts/p2pix.sol/P2PIX.json @@ -104,11 +104,17 @@ "type": "address" }, { - "indexed": false, + "indexed": true, "internalType": "bytes32", "name": "lockID", "type": "bytes32" }, + { + "indexed": false, + "internalType": "bytes32", + "name": "depositID", + "type": "bytes32" + }, { "indexed": false, "internalType": "uint256", @@ -138,6 +144,25 @@ "name": "LockReleased", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "buyer", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes32", + "name": "lockId", + "type": "bytes32" + } + ], + "name": "LockReturned", + "type": "event" + }, { "inputs": [ { @@ -151,6 +176,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [], + "name": "defaultLockBlocks", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [ { @@ -206,6 +244,11 @@ "internalType": "uint256", "name": "amount", "type": "uint256" + }, + { + "internalType": "bytes32[]", + "name": "expiredLocks", + "type": "bytes32[]" } ], "name": "lock", @@ -277,6 +320,11 @@ "internalType": "bytes32", "name": "depositID", "type": "bytes32" + }, + { + "internalType": "bytes32[]", + "name": "expiredLocks", + "type": "bytes32[]" } ], "name": "withdraw", @@ -285,8 +333,8 @@ "type": "function" } ], - "bytecode": "0x60806040523480156200001157600080fd5b50604051620021853803806200218583398181016040528101906200003791906200030d565b8160008190555060005b81518160ff161015620000db576001806000848460ff16815181106200006c576200006b62000373565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620000d290620003de565b91505062000041565b5050506200040c565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200010d81620000f8565b81146200011957600080fd5b50565b6000815190506200012d8162000102565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001838262000138565b810181811067ffffffffffffffff82111715620001a557620001a462000149565b5b80604052505050565b6000620001ba620000e4565b9050620001c8828262000178565b919050565b600067ffffffffffffffff821115620001eb57620001ea62000149565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022e8262000201565b9050919050565b620002408162000221565b81146200024c57600080fd5b50565b600081519050620002608162000235565b92915050565b60006200027d6200027784620001cd565b620001ae565b90508083825260208201905060208402830185811115620002a357620002a2620001fc565b5b835b81811015620002d05780620002bb88826200024f565b845260208401935050602081019050620002a5565b5050509392505050565b600082601f830112620002f257620002f162000133565b5b81516200030484826020860162000266565b91505092915050565b60008060408385031215620003275762000326620000ee565b5b600062000337858286016200011c565b925050602083015167ffffffffffffffff8111156200035b576200035a620000f3565b5b6200036985828601620002da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b6000620003eb82620003d1565b915060ff8203620004015762000400620003a2565b5b600182019050919050565b611d69806200041c6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c806331404484146100675780634e1389ed146100835780638e19899e1461009f578063b21a99d2146100bb578063b93bd7d4146100eb578063bfe07da61461011b575b600080fd5b610081600480360381019061007c9190610f6c565b61014b565b005b61009d60048036038101906100989190611008565b6102a7565b005b6100b960048036038101906100b49190610f6c565b61054d565b005b6100d560048036038101906100d091906110e1565b610688565b6040516100e2919061116b565b60405180910390f35b61010560048036038101906101009190611186565b610a37565b60405161011291906111ce565b60405180910390f35b6101356004803603810190610130919061124e565b610a57565b604051610142919061116b565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146101f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e790611345565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c8360405161029b919061116b565b60405180910390a25050565b6000600560008781526020019081526020016000209050600060026000836000015481526020019081526020016000206004018260040154876040516020016102f293929190611489565b6040516020818303038152906040528051906020012090506006600082815260200190815260200160002060009054906101000a900460ff161561036b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036290611534565b60405180910390fd5b6000600182858888604051600081526020016040526040516103909493929190611563565b6020604051602081039080840390855afa1580156103b2573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661044a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610441906115f4565b60405180910390fd5b60018360060160006101000a81548160ff02191690831515021790555060016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506104a08360000154610cc8565b600460008560000154815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161053b919061116b565b60405180910390a25050505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e990611345565b60405180910390fd5b6105fb82610cc8565b50600060026000848152602001908152602001600020600201549050600060026000858152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d848360405161067b929190611623565b60405180910390a2505050565b6000806002600088815260200190815260200160002090508060030160009054906101000a900460ff166106f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e890611698565b60405180910390fd5b82816002015411610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90611704565b60405180910390fd5b86838760405160200161074c9392919061178d565b604051602081830303815290604052805190602001209150436005600084815260200190815260200160002060050154106107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b39061183c565b60405180910390fd5b60006040518060e001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200160005443610821919061188b565b815260200160001515815250905080600560008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555090505082600360008a8152602001908152602001600020600460008b815260200190815260200160002060009054906101000a900461ffff1661ffff1681548110610967576109666118bf565b5b906000526020600020018190555060046000898152602001908152602001600020600081819054906101000a900461ffff16809291906109a6906118fc565b91906101000a81548161ffff021916908361ffff16021790555050838260020160008282546109d59190611926565b925050819055508673ffffffffffffffffffffffffffffffffffffffff167f628415da70a2c48a4b0ec6d330bb84602bfa2b9f13415d12e273a7844ec8126b8486604051610a24929190611623565b60405180910390a2505095945050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b6000828285604051602001610a6e9392919061198e565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190611a2a565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610c699190611c1b565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610cb793929190611cfc565b60405180910390a250949350505050565b60008060036000848152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900461ffff1690506000925060005b8161ffff168161ffff161015610f2457600060056000858461ffff1681548110610d3a57610d396118bf565b5b906000526020600020015481526020019081526020016000206040518060e0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050438160a00151118015610e6457508060c00151155b15610ec357838261ffff1681548110610e8057610e7f6118bf565b5b9060005260206000200154848661ffff1681548110610ea257610ea16118bf565b5b90600052602060002001819055508480610ebb906118fc565b955050610f10565b438160a00151108015610ed857508060c00151155b15610f0f578060800151600260008881526020019081526020016000206002016000828254610f07919061188b565b925050819055505b5b508080610f1c906118fc565b915050610d0d565b505050919050565b600080fd5b600080fd5b6000819050919050565b610f4981610f36565b8114610f5457600080fd5b50565b600081359050610f6681610f40565b92915050565b600060208284031215610f8257610f81610f2c565b5b6000610f9084828501610f57565b91505092915050565b6000819050919050565b610fac81610f99565b8114610fb757600080fd5b50565b600081359050610fc981610fa3565b92915050565b600060ff82169050919050565b610fe581610fcf565b8114610ff057600080fd5b50565b60008135905061100281610fdc565b92915050565b600080600080600060a0868803121561102457611023610f2c565b5b600061103288828901610f57565b955050602061104388828901610fba565b945050604061105488828901610f57565b935050606061106588828901610f57565b925050608061107688828901610ff3565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110ae82611083565b9050919050565b6110be816110a3565b81146110c957600080fd5b50565b6000813590506110db816110b5565b92915050565b600080600080600060a086880312156110fd576110fc610f2c565b5b600061110b88828901610f57565b955050602061111c888289016110cc565b945050604061112d888289016110cc565b935050606061113e88828901610fba565b925050608061114f88828901610fba565b9150509295509295909350565b61116581610f36565b82525050565b6000602082019050611180600083018461115c565b92915050565b60006020828403121561119c5761119b610f2c565b5b60006111aa848285016110cc565b91505092915050565b60008115159050919050565b6111c8816111b3565b82525050565b60006020820190506111e360008301846111bf565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261120e5761120d6111e9565b5b8235905067ffffffffffffffff81111561122b5761122a6111ee565b5b602083019150836001820283011115611247576112466111f3565b5b9250929050565b6000806000806060858703121561126857611267610f2c565b5b6000611276878288016110cc565b945050602061128787828801610fba565b935050604085013567ffffffffffffffff8111156112a8576112a7610f31565b5b6112b4878288016111f8565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b600061132f602c836112c2565b915061133a826112d3565b604082019050919050565b6000602082019050818103600083015261135e81611322565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806113ac57607f821691505b6020821081036113bf576113be611365565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113f281611394565b6113fc81866113c5565b94506001821660008114611417576001811461142c5761145f565b60ff198316865281151582028601935061145f565b611435856113d0565b60005b8381101561145757815481890152600182019150602081019050611438565b838801955050505b50505092915050565b6000819050919050565b61148361147e82610f99565b611468565b82525050565b600061149582866113e5565b91506114a18285611472565b6020820191506114b18284611472565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b600061151e602b836112c2565b9150611529826114c2565b604082019050919050565b6000602082019050818103600083015261154d81611511565b9050919050565b61155d81610fcf565b82525050565b6000608082019050611578600083018761115c565b6115856020830186611554565b611592604083018561115c565b61159f606083018461115c565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115de601d836112c2565b91506115e9826115a8565b602082019050919050565b6000602082019050818103600083015261160d816115d1565b9050919050565b61161d81610f99565b82525050565b6000604082019050611638600083018561115c565b6116456020830184611614565b9392505050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b60006116826020836112c2565b915061168d8261164c565b602082019050919050565b600060208201905081810360008301526116b181611675565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b60006116ee601b836112c2565b91506116f9826116b8565b602082019050919050565b6000602082019050818103600083015261171d816116e1565b9050919050565b6000819050919050565b61173f61173a82610f36565b611724565b82525050565b60008160601b9050919050565b600061175d82611745565b9050919050565b600061176f82611752565b9050919050565b611787611782826110a3565b611764565b82525050565b6000611799828661172e565b6020820191506117a98285611472565b6020820191506117b98284611776565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006118266033836112c2565b9150611831826117ca565b604082019050919050565b6000602082019050818103600083015261185581611819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061189682610f99565b91506118a183610f99565b92508282019050808211156118b9576118b861185c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff82169050919050565b6000611907826118ee565b915061ffff820361191b5761191a61185c565b5b600182019050919050565b600061193182610f99565b915061193c83610f99565b92508282039050818111156119545761195361185c565b5b92915050565b82818337600083830152505050565b600061197583856113c5565b935061198283858461195a565b82840190509392505050565b600061199b828587611969565b91506119a78284611472565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b6000611a146032836112c2565b9150611a1f826119b8565b604082019050919050565b60006020820190508181036000830152611a4381611a07565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b600060088302611ad17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611a94565b611adb8683611a94565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611b18611b13611b0e84610f99565b611af3565b610f99565b9050919050565b6000819050919050565b611b3283611afd565b611b46611b3e82611b1f565b848454611aa1565b825550505050565b600090565b611b5b611b4e565b611b66818484611b29565b505050565b5b81811015611b8a57611b7f600082611b53565b600181019050611b6c565b5050565b601f821115611bcf57611ba0816113d0565b611ba984611a84565b81016020851015611bb8578190505b611bcc611bc485611a84565b830182611b6b565b50505b505050565b600082821c905092915050565b6000611bf260001984600802611bd4565b1980831691505092915050565b6000611c0b8383611be1565b9150826002028217905092915050565b611c2482611a4a565b67ffffffffffffffff811115611c3d57611c3c611a55565b5b611c478254611394565b611c52828285611b8e565b600060209050601f831160018114611c855760008415611c73578287015190505b611c7d8582611bff565b865550611ce5565b601f198416611c93866113d0565b60005b82811015611cbb57848901518255600182019150602085019450602081019050611c96565b86831015611cd85784890151611cd4601f891682611be1565b8355505b6001600288020188555050505b505050505050565b611cf6816110a3565b82525050565b6000606082019050611d11600083018661115c565b611d1e6020830185611ced565b611d2b6040830184611614565b94935050505056fea2646970667358221220fe9ff1e9a517a7b010e12ac35c5ea0c1d6330b7c228192d600f1a49e6213c01664736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c806331404484146100675780634e1389ed146100835780638e19899e1461009f578063b21a99d2146100bb578063b93bd7d4146100eb578063bfe07da61461011b575b600080fd5b610081600480360381019061007c9190610f6c565b61014b565b005b61009d60048036038101906100989190611008565b6102a7565b005b6100b960048036038101906100b49190610f6c565b61054d565b005b6100d560048036038101906100d091906110e1565b610688565b6040516100e2919061116b565b60405180910390f35b61010560048036038101906101009190611186565b610a37565b60405161011291906111ce565b60405180910390f35b6101356004803603810190610130919061124e565b610a57565b604051610142919061116b565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146101f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016101e790611345565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c8360405161029b919061116b565b60405180910390a25050565b6000600560008781526020019081526020016000209050600060026000836000015481526020019081526020016000206004018260040154876040516020016102f293929190611489565b6040516020818303038152906040528051906020012090506006600082815260200190815260200160002060009054906101000a900460ff161561036b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161036290611534565b60405180910390fd5b6000600182858888604051600081526020016040526040516103909493929190611563565b6020604051602081039080840390855afa1580156103b2573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1661044a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610441906115f4565b60405180910390fd5b60018360060160006101000a81548160ff02191690831515021790555060016006600084815260200190815260200160002060006101000a81548160ff0219169083151502179055506104a08360000154610cc8565b600460008560000154815260200190815260200160002060006101000a81548161ffff021916908361ffff1602179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161053b919061116b565b60405180910390a25050505050505050565b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146105f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e990611345565b60405180910390fd5b6105fb82610cc8565b50600060026000848152602001908152602001600020600201549050600060026000858152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d848360405161067b929190611623565b60405180910390a2505050565b6000806002600088815260200190815260200160002090508060030160009054906101000a900460ff166106f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e890611698565b60405180910390fd5b82816002015411610737576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161072e90611704565b60405180910390fd5b86838760405160200161074c9392919061178d565b604051602081830303815290604052805190602001209150436005600084815260200190815260200160002060050154106107bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b39061183c565b60405180910390fd5b60006040518060e001604052808981526020018873ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200185815260200160005443610821919061188b565b815260200160001515815250905080600560008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a0820151816005015560c08201518160060160006101000a81548160ff02191690831515021790555090505082600360008a8152602001908152602001600020600460008b815260200190815260200160002060009054906101000a900461ffff1661ffff1681548110610967576109666118bf565b5b906000526020600020018190555060046000898152602001908152602001600020600081819054906101000a900461ffff16809291906109a6906118fc565b91906101000a81548161ffff021916908361ffff16021790555050838260020160008282546109d59190611926565b925050819055508673ffffffffffffffffffffffffffffffffffffffff167f628415da70a2c48a4b0ec6d330bb84602bfa2b9f13415d12e273a7844ec8126b8486604051610a24929190611623565b60405180910390a2505095945050505050565b60016020528060005260406000206000915054906101000a900460ff1681565b6000828285604051602001610a6e9392919061198e565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610aea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae190611a2a565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610c699190611c1b565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610cb793929190611cfc565b60405180910390a250949350505050565b60008060036000848152602001908152602001600020905060006004600085815260200190815260200160002060009054906101000a900461ffff1690506000925060005b8161ffff168161ffff161015610f2457600060056000858461ffff1681548110610d3a57610d396118bf565b5b906000526020600020015481526020019081526020016000206040518060e0016040529081600082015481526020016001820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016002820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016003820154815260200160048201548152602001600582015481526020016006820160009054906101000a900460ff1615151515815250509050438160a00151118015610e6457508060c00151155b15610ec357838261ffff1681548110610e8057610e7f6118bf565b5b9060005260206000200154848661ffff1681548110610ea257610ea16118bf565b5b90600052602060002001819055508480610ebb906118fc565b955050610f10565b438160a00151108015610ed857508060c00151155b15610f0f578060800151600260008881526020019081526020016000206002016000828254610f07919061188b565b925050819055505b5b508080610f1c906118fc565b915050610d0d565b505050919050565b600080fd5b600080fd5b6000819050919050565b610f4981610f36565b8114610f5457600080fd5b50565b600081359050610f6681610f40565b92915050565b600060208284031215610f8257610f81610f2c565b5b6000610f9084828501610f57565b91505092915050565b6000819050919050565b610fac81610f99565b8114610fb757600080fd5b50565b600081359050610fc981610fa3565b92915050565b600060ff82169050919050565b610fe581610fcf565b8114610ff057600080fd5b50565b60008135905061100281610fdc565b92915050565b600080600080600060a0868803121561102457611023610f2c565b5b600061103288828901610f57565b955050602061104388828901610fba565b945050604061105488828901610f57565b935050606061106588828901610f57565b925050608061107688828901610ff3565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006110ae82611083565b9050919050565b6110be816110a3565b81146110c957600080fd5b50565b6000813590506110db816110b5565b92915050565b600080600080600060a086880312156110fd576110fc610f2c565b5b600061110b88828901610f57565b955050602061111c888289016110cc565b945050604061112d888289016110cc565b935050606061113e88828901610fba565b925050608061114f88828901610fba565b9150509295509295909350565b61116581610f36565b82525050565b6000602082019050611180600083018461115c565b92915050565b60006020828403121561119c5761119b610f2c565b5b60006111aa848285016110cc565b91505092915050565b60008115159050919050565b6111c8816111b3565b82525050565b60006020820190506111e360008301846111bf565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261120e5761120d6111e9565b5b8235905067ffffffffffffffff81111561122b5761122a6111ee565b5b602083019150836001820283011115611247576112466111f3565b5b9250929050565b6000806000806060858703121561126857611267610f2c565b5b6000611276878288016110cc565b945050602061128787828801610fba565b935050604085013567ffffffffffffffff8111156112a8576112a7610f31565b5b6112b4878288016111f8565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b600061132f602c836112c2565b915061133a826112d3565b604082019050919050565b6000602082019050818103600083015261135e81611322565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806113ac57607f821691505b6020821081036113bf576113be611365565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113f281611394565b6113fc81866113c5565b94506001821660008114611417576001811461142c5761145f565b60ff198316865281151582028601935061145f565b611435856113d0565b60005b8381101561145757815481890152600182019150602081019050611438565b838801955050505b50505092915050565b6000819050919050565b61148361147e82610f99565b611468565b82525050565b600061149582866113e5565b91506114a18285611472565b6020820191506114b18284611472565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b600061151e602b836112c2565b9150611529826114c2565b604082019050919050565b6000602082019050818103600083015261154d81611511565b9050919050565b61155d81610fcf565b82525050565b6000608082019050611578600083018761115c565b6115856020830186611554565b611592604083018561115c565b61159f606083018461115c565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115de601d836112c2565b91506115e9826115a8565b602082019050919050565b6000602082019050818103600083015261160d816115d1565b9050919050565b61161d81610f99565b82525050565b6000604082019050611638600083018561115c565b6116456020830184611614565b9392505050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b60006116826020836112c2565b915061168d8261164c565b602082019050919050565b600060208201905081810360008301526116b181611675565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b60006116ee601b836112c2565b91506116f9826116b8565b602082019050919050565b6000602082019050818103600083015261171d816116e1565b9050919050565b6000819050919050565b61173f61173a82610f36565b611724565b82525050565b60008160601b9050919050565b600061175d82611745565b9050919050565b600061176f82611752565b9050919050565b611787611782826110a3565b611764565b82525050565b6000611799828661172e565b6020820191506117a98285611472565b6020820191506117b98284611776565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006118266033836112c2565b9150611831826117ca565b604082019050919050565b6000602082019050818103600083015261185581611819565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061189682610f99565b91506118a183610f99565b92508282019050808211156118b9576118b861185c565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061ffff82169050919050565b6000611907826118ee565b915061ffff820361191b5761191a61185c565b5b600182019050919050565b600061193182610f99565b915061193c83610f99565b92508282039050818111156119545761195361185c565b5b92915050565b82818337600083830152505050565b600061197583856113c5565b935061198283858461195a565b82840190509392505050565b600061199b828587611969565b91506119a78284611472565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b6000611a146032836112c2565b9150611a1f826119b8565b604082019050919050565b60006020820190508181036000830152611a4381611a07565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b600060088302611ad17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82611a94565b611adb8683611a94565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611b18611b13611b0e84610f99565b611af3565b610f99565b9050919050565b6000819050919050565b611b3283611afd565b611b46611b3e82611b1f565b848454611aa1565b825550505050565b600090565b611b5b611b4e565b611b66818484611b29565b505050565b5b81811015611b8a57611b7f600082611b53565b600181019050611b6c565b5050565b601f821115611bcf57611ba0816113d0565b611ba984611a84565b81016020851015611bb8578190505b611bcc611bc485611a84565b830182611b6b565b50505b505050565b600082821c905092915050565b6000611bf260001984600802611bd4565b1980831691505092915050565b6000611c0b8383611be1565b9150826002028217905092915050565b611c2482611a4a565b67ffffffffffffffff811115611c3d57611c3c611a55565b5b611c478254611394565b611c52828285611b8e565b600060209050601f831160018114611c855760008415611c73578287015190505b611c7d8582611bff565b865550611ce5565b601f198416611c93866113d0565b60005b82811015611cbb57848901518255600182019150602085019450602081019050611c96565b86831015611cd85784890151611cd4601f891682611be1565b8355505b6001600288020188555050505b505050505050565b611cf6816110a3565b82525050565b6000606082019050611d11600083018661115c565b611d1e6020830185611ced565b611d2b6040830184611614565b94935050505056fea2646970667358221220fe9ff1e9a517a7b010e12ac35c5ea0c1d6330b7c228192d600f1a49e6213c01664736f6c63430008110033", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620021a4380380620021a483398181016040528101906200003791906200030d565b8160008190555060005b81518160ff161015620000db576001806000848460ff16815181106200006c576200006b62000373565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080620000d290620003de565b91505062000041565b5050506200040c565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b6200010d81620000f8565b81146200011957600080fd5b50565b6000815190506200012d8162000102565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001838262000138565b810181811067ffffffffffffffff82111715620001a557620001a462000149565b5b80604052505050565b6000620001ba620000e4565b9050620001c8828262000178565b919050565b600067ffffffffffffffff821115620001eb57620001ea62000149565b5b602082029050602081019050919050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200022e8262000201565b9050919050565b620002408162000221565b81146200024c57600080fd5b50565b600081519050620002608162000235565b92915050565b60006200027d6200027784620001cd565b620001ae565b90508083825260208201905060208402830185811115620002a357620002a2620001fc565b5b835b81811015620002d05780620002bb88826200024f565b845260208401935050602081019050620002a5565b5050509392505050565b600082601f830112620002f257620002f162000133565b5b81516200030484826020860162000266565b91505092915050565b60008060408385031215620003275762000326620000ee565b5b600062000337858286016200011c565b925050602083015167ffffffffffffffff8111156200035b576200035a620000f3565b5b6200036985828601620002da565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600060ff82169050919050565b6000620003eb82620003d1565b915060ff8203620004015762000400620003a2565b5b600182019050919050565b611d88806200041c6000396000f3fe608060405234801561001057600080fd5b506004361061007d5760003560e01c8063708ace651161005b578063708ace65146100d65780639872dbfe14610106578063b93bd7d414610124578063bfe07da6146101545761007d565b806331404484146100825780634b83a7be1461009e5780634e1389ed146100ba575b600080fd5b61009c60048036038101906100979190610df4565b610184565b005b6100b860048036038101906100b39190610e86565b6102e0565b005b6100d460048036038101906100cf9190610f55565b610450565b005b6100f060048036038101906100eb919061102e565b6106a5565b6040516100fd91906110ec565b60405180910390f35b61010e610994565b60405161011b9190611116565b60405180910390f35b61013e60048036038101906101399190611131565b61099a565b60405161014b9190611179565b60405180910390f35b61016e600480360381019061016991906111ea565b6109ba565b60405161017b91906110ec565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610220906112e1565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102d491906110ec565b60405180910390a25050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037c906112e1565b60405180910390fd5b61038f8383610c2b565b6002600085815260200190815260200160002060030160009054906101000a900460ff16156103c2576103c184610184565b5b600060026000868152602001908152602001600020600201549050600060026000878152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8683604051610441929190611301565b60405180910390a25050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002060040182600401548760405160200161049b9392919061144e565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b906114f9565b60405180910390fd5b6000600182858888604051600081526020016040526040516105399493929190611528565b6020604051602081039080840390855afa15801561055b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166105f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ea906115b9565b60405180910390fd5b6000836004018190555060016004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161069391906110ec565b60405180910390a25050505050505050565b60006106b18383610c2b565b6000600260008a815260200190815260200160002090508060030160009054906101000a900460ff16610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611625565b60405180910390fd5b8481600201541161075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690611691565b60405180910390fd5b8885896040516020016107749392919061171a565b604051602081830303815290604052805190602001209150436003600084815260200190815260200160002060050154106107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db906117c9565b60405180910390fd5b60006040518060c001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001600054436108499190611818565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501559050508582600201600082825461092f919061184c565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c8960405161097f929190611301565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b60008282856040516020016109d1939291906118b4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490611950565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610bcc9190611b41565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610c1a93929190611c22565b60405180910390a250949350505050565b600082829050905060005b818161ffff161015610dae5760006003600086868561ffff16818110610c5f57610c5e611c59565b5b9050602002013581526020019081526020016000209050438160050154108015610c8d575060008160040154115b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390611cfa565b60405180910390fd5b806004015460026000836000015481526020019081526020016000206002016000828254610cfa9190611818565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff16818110610d7e57610d7d611c59565b5b90506020020135604051610d9291906110ec565b60405180910390a2508080610da690611d28565b915050610c36565b50505050565b600080fd5b600080fd5b6000819050919050565b610dd181610dbe565b8114610ddc57600080fd5b50565b600081359050610dee81610dc8565b92915050565b600060208284031215610e0a57610e09610db4565b5b6000610e1884828501610ddf565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610e4657610e45610e21565b5b8235905067ffffffffffffffff811115610e6357610e62610e26565b5b602083019150836020820283011115610e7f57610e7e610e2b565b5b9250929050565b600080600060408486031215610e9f57610e9e610db4565b5b6000610ead86828701610ddf565b935050602084013567ffffffffffffffff811115610ece57610ecd610db9565b5b610eda86828701610e30565b92509250509250925092565b6000819050919050565b610ef981610ee6565b8114610f0457600080fd5b50565b600081359050610f1681610ef0565b92915050565b600060ff82169050919050565b610f3281610f1c565b8114610f3d57600080fd5b50565b600081359050610f4f81610f29565b92915050565b600080600080600060a08688031215610f7157610f70610db4565b5b6000610f7f88828901610ddf565b9550506020610f9088828901610f07565b9450506040610fa188828901610ddf565b9350506060610fb288828901610ddf565b9250506080610fc388828901610f40565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ffb82610fd0565b9050919050565b61100b81610ff0565b811461101657600080fd5b50565b60008135905061102881611002565b92915050565b600080600080600080600060c0888a03121561104d5761104c610db4565b5b600061105b8a828b01610ddf565b975050602061106c8a828b01611019565b965050604061107d8a828b01611019565b955050606061108e8a828b01610f07565b945050608061109f8a828b01610f07565b93505060a088013567ffffffffffffffff8111156110c0576110bf610db9565b5b6110cc8a828b01610e30565b925092505092959891949750929550565b6110e681610dbe565b82525050565b600060208201905061110160008301846110dd565b92915050565b61111081610ee6565b82525050565b600060208201905061112b6000830184611107565b92915050565b60006020828403121561114757611146610db4565b5b600061115584828501611019565b91505092915050565b60008115159050919050565b6111738161115e565b82525050565b600060208201905061118e600083018461116a565b92915050565b60008083601f8401126111aa576111a9610e21565b5b8235905067ffffffffffffffff8111156111c7576111c6610e26565b5b6020830191508360018202830111156111e3576111e2610e2b565b5b9250929050565b6000806000806060858703121561120457611203610db4565b5b600061121287828801611019565b945050602061122387828801610f07565b935050604085013567ffffffffffffffff81111561124457611243610db9565b5b61125087828801611194565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006112cb602c8361125e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600060408201905061131660008301856110dd565b6113236020830184611107565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061137157607f821691505b6020821081036113845761138361132a565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113b781611359565b6113c1818661138a565b945060018216600081146113dc57600181146113f157611424565b60ff1983168652811515820286019350611424565b6113fa85611395565b60005b8381101561141c578154818901526001820191506020810190506113fd565b838801955050505b50505092915050565b6000819050919050565b61144861144382610ee6565b61142d565b82525050565b600061145a82866113aa565b91506114668285611437565b6020820191506114768284611437565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b60006114e3602b8361125e565b91506114ee82611487565b604082019050919050565b60006020820190508181036000830152611512816114d6565b9050919050565b61152281610f1c565b82525050565b600060808201905061153d60008301876110dd565b61154a6020830186611519565b61155760408301856110dd565b61156460608301846110dd565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115a3601d8361125e565b91506115ae8261156d565b602082019050919050565b600060208201905081810360008301526115d281611596565b9050919050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b600061160f60208361125e565b915061161a826115d9565b602082019050919050565b6000602082019050818103600083015261163e81611602565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b600061167b601b8361125e565b915061168682611645565b602082019050919050565b600060208201905081810360008301526116aa8161166e565b9050919050565b6000819050919050565b6116cc6116c782610dbe565b6116b1565b82525050565b60008160601b9050919050565b60006116ea826116d2565b9050919050565b60006116fc826116df565b9050919050565b61171461170f82610ff0565b6116f1565b82525050565b600061172682866116bb565b6020820191506117368285611437565b6020820191506117468284611703565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006117b360338361125e565b91506117be82611757565b604082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182382610ee6565b915061182e83610ee6565b9250828201905080821115611846576118456117e9565b5b92915050565b600061185782610ee6565b915061186283610ee6565b925082820390508181111561187a576118796117e9565b5b92915050565b82818337600083830152505050565b600061189b838561138a565b93506118a8838584611880565b82840190509392505050565b60006118c182858761188f565b91506118cd8284611437565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b600061193a60328361125e565b9150611945826118de565b604082019050919050565b600060208201905081810360008301526119698161192d565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119ba565b611a0186836119ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a3e611a39611a3484610ee6565b611a19565b610ee6565b9050919050565b6000819050919050565b611a5883611a23565b611a6c611a6482611a45565b8484546119c7565b825550505050565b600090565b611a81611a74565b611a8c818484611a4f565b505050565b5b81811015611ab057611aa5600082611a79565b600181019050611a92565b5050565b601f821115611af557611ac681611395565b611acf846119aa565b81016020851015611ade578190505b611af2611aea856119aa565b830182611a91565b50505b505050565b600082821c905092915050565b6000611b1860001984600802611afa565b1980831691505092915050565b6000611b318383611b07565b9150826002028217905092915050565b611b4a82611970565b67ffffffffffffffff811115611b6357611b6261197b565b5b611b6d8254611359565b611b78828285611ab4565b600060209050601f831160018114611bab5760008415611b99578287015190505b611ba38582611b25565b865550611c0b565b601f198416611bb986611395565b60005b82811015611be157848901518255600182019150602085019450602081019050611bbc565b86831015611bfe5784890151611bfa601f891682611b07565b8355505b6001600288020188555050505b505050505050565b611c1c81610ff0565b82525050565b6000606082019050611c3760008301866110dd565b611c446020830185611c13565b611c516040830184611107565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b6000611ce460278361125e565b9150611cef82611c88565b604082019050919050565b60006020820190508181036000830152611d1381611cd7565b9050919050565b600061ffff82169050919050565b6000611d3382611d1a565b915061ffff8203611d4757611d466117e9565b5b60018201905091905056fea264697066735822122083b121d799dd64ebc1d8d7a54b7408bb66350a697bdb106ac122bfda032e442064736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b506004361061007d5760003560e01c8063708ace651161005b578063708ace65146100d65780639872dbfe14610106578063b93bd7d414610124578063bfe07da6146101545761007d565b806331404484146100825780634b83a7be1461009e5780634e1389ed146100ba575b600080fd5b61009c60048036038101906100979190610df4565b610184565b005b6100b860048036038101906100b39190610e86565b6102e0565b005b6100d460048036038101906100cf9190610f55565b610450565b005b6100f060048036038101906100eb919061102e565b6106a5565b6040516100fd91906110ec565b60405180910390f35b61010e610994565b60405161011b9190611116565b60405180910390f35b61013e60048036038101906101399190611131565b61099a565b60405161014b9190611179565b60405180910390f35b61016e600480360381019061016991906111ea565b6109ba565b60405161017b91906110ec565b60405180910390f35b803373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610220906112e1565b60405180910390fd5b60006002600084815260200190815260200160002060030160006101000a81548160ff0219169083151502179055506002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f81a84d666c6a692c1cf93ca3b3648cc7bf23d34a1c6afa2e15e346f424baa06c836040516102d491906110ec565b60405180910390a25050565b823373ffffffffffffffffffffffffffffffffffffffff166002600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161037c906112e1565b60405180910390fd5b61038f8383610c2b565b6002600085815260200190815260200160002060030160009054906101000a900460ff16156103c2576103c184610184565b5b600060026000868152602001908152602001600020600201549050600060026000878152602001908152602001600020600201819055503373ffffffffffffffffffffffffffffffffffffffff167fbc44d79619424e05dd4e8ea6a3e67823f43e45cf0c9b52463ec7a8806146991d8683604051610441929190611301565b60405180910390a25050505050565b60006003600087815260200190815260200160002090506000600260008360000154815260200190815260200160002060040182600401548760405160200161049b9392919061144e565b6040516020818303038152906040528051906020012090506004600082815260200190815260200160002060009054906101000a900460ff1615610514576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161050b906114f9565b60405180910390fd5b6000600182858888604051600081526020016040526040516105399493929190611528565b6020604051602081039080840390855afa15801561055b573d6000803e3d6000fd5b505050602060405103519050600160008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff166105f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105ea906115b9565b60405180910390fd5b6000836004018190555060016004600084815260200190815260200160002060006101000a81548160ff0219169083151502179055508260010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f5e420822d2f7281fdc4b763c62c8b7874bf22108a35efe93144d79296aacc67d8960405161069391906110ec565b60405180910390a25050505050505050565b60006106b18383610c2b565b6000600260008a815260200190815260200160002090508060030160009054906101000a900460ff16610719576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161071090611625565b60405180910390fd5b8481600201541161075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161075690611691565b60405180910390fd5b8885896040516020016107749392919061171a565b604051602081830303815290604052805190602001209150436003600084815260200190815260200160002060050154106107e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107db906117c9565b60405180910390fd5b60006040518060c001604052808b81526020018a73ffffffffffffffffffffffffffffffffffffffff1681526020018973ffffffffffffffffffffffffffffffffffffffff168152602001888152602001878152602001600054436108499190611818565b815250905080600360008581526020019081526020016000206000820151816000015560208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a082015181600501559050508582600201600082825461092f919061184c565b92505081905550828973ffffffffffffffffffffffffffffffffffffffff167f51a2e0610065407cec419b292d4e03c1149e2336f34bc3bdab24dba9fe7edbff8c8960405161097f929190611301565b60405180910390a35050979650505050505050565b60005481565b60016020528060005260406000206000915054906101000a900460ff1681565b60008282856040516020016109d1939291906118b4565b6040516020818303038152906040528051906020012090506002600082815260200190815260200160002060030160009054906101000a900460ff1615610a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4490611950565b60405180910390fd5b60006040518060a001604052803373ffffffffffffffffffffffffffffffffffffffff1681526020018773ffffffffffffffffffffffffffffffffffffffff16815260200186815260200160011515815260200185858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508152509050806002600084815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040820151816002015560608201518160030160006101000a81548160ff0219169083151502179055506080820151816004019081610bcc9190611b41565b509050503373ffffffffffffffffffffffffffffffffffffffff167fff446757a2885630e74116c217f433ee3c8ff5e1a60055ca9c30d89f29e6f1b4838888604051610c1a93929190611c22565b60405180910390a250949350505050565b600082829050905060005b818161ffff161015610dae5760006003600086868561ffff16818110610c5f57610c5e611c59565b5b9050602002013581526020019081526020016000209050438160050154108015610c8d575060008160040154115b610ccc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc390611cfa565b60405180910390fd5b806004015460026000836000015481526020019081526020016000206002016000828254610cfa9190611818565b92505081905550600081600401819055508060010160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f67e089478e21dd12c98e69331c4152f6c9b2038b91e0f28268ffa01558c0b4ff86868561ffff16818110610d7e57610d7d611c59565b5b90506020020135604051610d9291906110ec565b60405180910390a2508080610da690611d28565b915050610c36565b50505050565b600080fd5b600080fd5b6000819050919050565b610dd181610dbe565b8114610ddc57600080fd5b50565b600081359050610dee81610dc8565b92915050565b600060208284031215610e0a57610e09610db4565b5b6000610e1884828501610ddf565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610e4657610e45610e21565b5b8235905067ffffffffffffffff811115610e6357610e62610e26565b5b602083019150836020820283011115610e7f57610e7e610e2b565b5b9250929050565b600080600060408486031215610e9f57610e9e610db4565b5b6000610ead86828701610ddf565b935050602084013567ffffffffffffffff811115610ece57610ecd610db9565b5b610eda86828701610e30565b92509250509250925092565b6000819050919050565b610ef981610ee6565b8114610f0457600080fd5b50565b600081359050610f1681610ef0565b92915050565b600060ff82169050919050565b610f3281610f1c565b8114610f3d57600080fd5b50565b600081359050610f4f81610f29565b92915050565b600080600080600060a08688031215610f7157610f70610db4565b5b6000610f7f88828901610ddf565b9550506020610f9088828901610f07565b9450506040610fa188828901610ddf565b9350506060610fb288828901610ddf565b9250506080610fc388828901610f40565b9150509295509295909350565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ffb82610fd0565b9050919050565b61100b81610ff0565b811461101657600080fd5b50565b60008135905061102881611002565b92915050565b600080600080600080600060c0888a03121561104d5761104c610db4565b5b600061105b8a828b01610ddf565b975050602061106c8a828b01611019565b965050604061107d8a828b01611019565b955050606061108e8a828b01610f07565b945050608061109f8a828b01610f07565b93505060a088013567ffffffffffffffff8111156110c0576110bf610db9565b5b6110cc8a828b01610e30565b925092505092959891949750929550565b6110e681610dbe565b82525050565b600060208201905061110160008301846110dd565b92915050565b61111081610ee6565b82525050565b600060208201905061112b6000830184611107565b92915050565b60006020828403121561114757611146610db4565b5b600061115584828501611019565b91505092915050565b60008115159050919050565b6111738161115e565b82525050565b600060208201905061118e600083018461116a565b92915050565b60008083601f8401126111aa576111a9610e21565b5b8235905067ffffffffffffffff8111156111c7576111c6610e26565b5b6020830191508360018202830111156111e3576111e2610e2b565b5b9250929050565b6000806000806060858703121561120457611203610db4565b5b600061121287828801611019565b945050602061122387828801610f07565b935050604085013567ffffffffffffffff81111561124457611243610db9565b5b61125087828801611194565b925092505092959194509250565b600082825260208201905092915050565b7f50325049583a204f6e6c792073656c6c657220636f756c642063616c6c20746860008201527f69732066756e6374696f6e2e0000000000000000000000000000000000000000602082015250565b60006112cb602c8361125e565b91506112d68261126f565b604082019050919050565b600060208201905081810360008301526112fa816112be565b9050919050565b600060408201905061131660008301856110dd565b6113236020830184611107565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061137157607f821691505b6020821081036113845761138361132a565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b600081546113b781611359565b6113c1818661138a565b945060018216600081146113dc57600181146113f157611424565b60ff1983168652811515820286019350611424565b6113fa85611395565b60005b8381101561141c578154818901526001820191506020810190506113fd565b838801955050505b50505092915050565b6000819050919050565b61144861144382610ee6565b61142d565b82525050565b600061145a82866113aa565b91506114668285611437565b6020820191506114768284611437565b602082019150819050949350505050565b7f5472616e73616374696f6e20616c7265616479207573656420746f20756e6c6f60008201527f636b207061796d656e742e000000000000000000000000000000000000000000602082015250565b60006114e3602b8361125e565b91506114ee82611487565b604082019050919050565b60006020820190508181036000830152611512816114d6565b9050919050565b61152281610f1c565b82525050565b600060808201905061153d60008301876110dd565b61154a6020830186611519565b61155760408301856110dd565b61156460608301846110dd565b95945050505050565b7f5369676e6572206973206e6f7420612076616c6964207369676e65722e000000600082015250565b60006115a3601d8361125e565b91506115ae8261156d565b602082019050919050565b600060208201905081810360008301526115d281611596565b9050919050565b7f50325049583a204465706f736974206e6f742076616c696420616e796d6f7265600082015250565b600061160f60208361125e565b915061161a826115d9565b602082019050919050565b6000602082019050818103600083015261163e81611602565b9050919050565b7f50325049583a204e6f7420656e6f7567682072656d61696e696e670000000000600082015250565b600061167b601b8361125e565b915061168682611645565b602082019050919050565b600060208201905081810360008301526116aa8161166e565b9050919050565b6000819050919050565b6116cc6116c782610dbe565b6116b1565b82525050565b60008160601b9050919050565b60006116ea826116d2565b9050919050565b60006116fc826116df565b9050919050565b61171461170f82610ff0565b6116f1565b82525050565b600061172682866116bb565b6020820191506117368285611437565b6020820191506117468284611703565b601482019150819050949350505050565b7f50325049583a20416e6f74686572206c6f636b20776974682073616d6520494460008201527f206973206e6f7420657870697265642079657400000000000000000000000000602082015250565b60006117b360338361125e565b91506117be82611757565b604082019050919050565b600060208201905081810360008301526117e2816117a6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061182382610ee6565b915061182e83610ee6565b9250828201905080821115611846576118456117e9565b5b92915050565b600061185782610ee6565b915061186283610ee6565b925082820390508181111561187a576118796117e9565b5b92915050565b82818337600083830152505050565b600061189b838561138a565b93506118a8838584611880565b82840190509392505050565b60006118c182858761188f565b91506118cd8284611437565b602082019150819050949350505050565b7f50325049583a204465706f73697420616c726561647920657869737420616e6460008201527f206974206973207374696c6c2076616c69640000000000000000000000000000602082015250565b600061193a60328361125e565b9150611945826118de565b604082019050919050565b600060208201905081810360008301526119698161192d565b9050919050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60006020601f8301049050919050565b600082821b905092915050565b6000600883026119f77fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826119ba565b611a0186836119ba565b95508019841693508086168417925050509392505050565b6000819050919050565b6000611a3e611a39611a3484610ee6565b611a19565b610ee6565b9050919050565b6000819050919050565b611a5883611a23565b611a6c611a6482611a45565b8484546119c7565b825550505050565b600090565b611a81611a74565b611a8c818484611a4f565b505050565b5b81811015611ab057611aa5600082611a79565b600181019050611a92565b5050565b601f821115611af557611ac681611395565b611acf846119aa565b81016020851015611ade578190505b611af2611aea856119aa565b830182611a91565b50505b505050565b600082821c905092915050565b6000611b1860001984600802611afa565b1980831691505092915050565b6000611b318383611b07565b9150826002028217905092915050565b611b4a82611970565b67ffffffffffffffff811115611b6357611b6261197b565b5b611b6d8254611359565b611b78828285611ab4565b600060209050601f831160018114611bab5760008415611b99578287015190505b611ba38582611b25565b865550611c0b565b601f198416611bb986611395565b60005b82811015611be157848901518255600182019150602085019450602081019050611bbc565b86831015611bfe5784890151611bfa601f891682611b07565b8355505b6001600288020188555050505b505050505050565b611c1c81610ff0565b82525050565b6000606082019050611c3760008301866110dd565b611c446020830185611c13565b611c516040830184611107565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f50325049583a204c6f636b206e6f742065787069726564206f7220616c72656160008201527f6479207061696400000000000000000000000000000000000000000000000000602082015250565b6000611ce460278361125e565b9150611cef82611c88565b604082019050919050565b60006020820190508181036000830152611d1381611cd7565b9050919050565b600061ffff82169050919050565b6000611d3382611d1a565b915061ffff8203611d4757611d466117e9565b5b60018201905091905056fea264697066735822122083b121d799dd64ebc1d8d7a54b7408bb66350a697bdb106ac122bfda032e442064736f6c63430008110033", "linkReferences": {}, "deployedLinkReferences": {} } diff --git a/contracts/p2pix.sol b/contracts/p2pix.sol index ccc3b4b..42342a4 100644 --- a/contracts/p2pix.sol +++ b/contracts/p2pix.sol @@ -6,8 +6,9 @@ contract P2PIX { event DepositAdded(address indexed seller, bytes32 depositID, address token, uint256 amount); event DepositClosed(address indexed seller, bytes32 depositID); event DepositWithdrawn(address indexed seller, bytes32 depositID, uint256 amount); - event LockAdded(address indexed buyer, bytes32 lockID, uint256 amount); + 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); struct Deposit { address seller; @@ -23,22 +24,19 @@ contract P2PIX { 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 expirationBlock; // IF not paid until this block will be expired - bool paid; + uint256 expirationBlock; // If not paid at this block will be expired } // Default blocks that lock will hold tokens - uint256 internal defaultLockBlocks; + uint256 public defaultLockBlocks; // List of valid Bacen signature addresses mapping(address => bool) public validBacenSigners; // Seller list of deposits mapping(bytes32 => Deposit) mapDeposits; - mapping(bytes32 => bytes32[]) activeDepositLocks; - mapping(bytes32 => uint16) activeLocksPerDeposit; - // ***** ESTA PARTE É A MAIS CRÍTICA VISTO QUE É NECESSÁRIO FORMAS DE TRAVAR DEPOSITOS ***** - // ************ PORÉM SEM A NECESSIDADE DE PERCORRER GRANDES ARRAYS ************************ + // List of Locks mapping(bytes32 => Lock) mapLocks; + // List of Pix transactions already signed mapping(bytes32 => bool) usedTransactions; modifier onlySeller(bytes32 depositID) { @@ -68,6 +66,12 @@ contract P2PIX { emit DepositAdded(msg.sender, depositID, token, amount); } + // Vendedor pode invalidar da ordem de venda impedindo novos locks na mesma (isso não afeta nenhum lock que esteja ativo). + function cancelDeposit(bytes32 depositID) public onlySeller(depositID) { + mapDeposits[depositID].valid = false; + emit DepositClosed(mapDeposits[depositID].seller, depositID); + } + // Relayer interaje adicionando um “lock” na ordem de venda. // O lock precisa incluir address do comprador + address do relayer + reembolso/premio relayer + valor. // **Só poder ter um lock em aberto para cada (ordem de venda, valor)**. @@ -79,8 +83,10 @@ contract P2PIX { address targetAddress, address relayerAddress, uint256 relayerPremium, - uint256 amount + uint256 amount, + bytes32[] calldata expiredLocks ) public returns (bytes32 lockID){ + unlockExpired(expiredLocks); Deposit storage d = mapDeposits[depositID]; require(d.valid, "P2PIX: Deposit not valid anymore"); require(d.remaining > amount, "P2PIX: Not enough remaining"); @@ -89,12 +95,17 @@ contract P2PIX { mapLocks[lockID].expirationBlock < block.number, "P2PIX: Another lock with same ID is not expired yet" ); - Lock memory l = Lock(depositID, targetAddress, relayerAddress, relayerPremium, amount, block.number+defaultLockBlocks, false); + Lock memory l = Lock( + depositID, + targetAddress, + relayerAddress, + relayerPremium, + amount, + block.number+defaultLockBlocks + ); mapLocks[lockID] = l; - activeDepositLocks[depositID][activeLocksPerDeposit[depositID]] = lockID; - activeLocksPerDeposit[depositID]++; d.remaining -= amount; - emit LockAdded(targetAddress, lockID, amount); + emit LockAdded(targetAddress, lockID, depositID, amount); } // Relayer interage com o smart contract, colocando no calldata o comprovante do PIX realizado. @@ -117,40 +128,32 @@ 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 target - l.paid = true; + // TODO Transfer token to l.target + // TODO Transfer relayer fees to relayer + l.amount = 0; usedTransactions[message] = true; - activeLocksPerDeposit[l.depositID] = unlockExpired(l.depositID); emit LockReleased(l.targetAddress, lockID); } // Unlock expired locks - function unlockExpired(bytes32 depositID) internal returns(uint16 locksLength){ - bytes32[] storage locks = activeDepositLocks[depositID]; - uint16 locksPreviousLength = activeLocksPerDeposit[depositID]; - locksLength = 0; - for (uint16 i = 0; i < locksPreviousLength; i++){ - Lock memory l = mapLocks[locks[i]]; - if (l.expirationBlock > block.number && !l.paid) { - locks[locksLength] = locks[i]; - locksLength++; - } else if (l.expirationBlock < block.number && !l.paid) { - mapDeposits[depositID].remaining += l.amount; - } + function unlockExpired(bytes32[] calldata lockIDs) internal { + uint256 locksSize = lockIDs.length; + for (uint16 i = 0; i < locksSize; i++){ + Lock storage l = mapLocks[lockIDs[i]]; + require(l.expirationBlock < block.number && l.amount > 0, "P2PIX: Lock not expired or already paid"); + mapDeposits[l.depositID].remaining += l.amount; + l.amount = 0; + emit LockReturned(l.targetAddress, lockIDs[i]); } - return locksLength; - } - - // Vendedor pode invalidar da ordem de venda impedindo novos locks na mesma (isso não afeta nenhum lock que esteja ativo). - function cancelDeposit(bytes32 depositID) public onlySeller(depositID) { - mapDeposits[depositID].valid = false; - emit DepositClosed(mapDeposits[depositID].seller, depositID); } // Após os locks expirarem, vendedor pode interagir c/ o contrato e recuperar os tokens de um depósito específico. - function withdraw(bytes32 depositID) public onlySeller(depositID) { - // Unlock expired locks at depositID - unlockExpired(depositID); + function withdraw( + bytes32 depositID, + bytes32[] calldata expiredLocks + ) public onlySeller(depositID) { + unlockExpired(expiredLocks); + if (mapDeposits[depositID].valid) cancelDeposit(depositID); // TODO Transfer remaining tokens back to the seller // Withdraw remaining tokens from mapDeposit[depositID] uint256 amount = mapDeposits[depositID].remaining; diff --git a/test/1-deposit.test.js b/test/1-deposit.test.js index f016378..2a30458 100644 --- a/test/1-deposit.test.js +++ b/test/1-deposit.test.js @@ -63,7 +63,7 @@ describe("P2PIX deposit test", function () { }) it("Should allow withdraw the deposit", async function () { - const transaction = await p2pix.withdraw(depositID); + const transaction = await p2pix.withdraw(depositID, []); await expect(transaction).to.emit(p2pix, 'DepositWithdrawn').withArgs( owner.address, depositID,