erc20-pool

Permissioned ERC20 swap pool for EVM
Log | Files | Refs | README

commit 618898bd832613bfafa9f8a8e637c711786431ce
parent 725870dfe0da7749dcf1805bf0e5cafa0e87425e
Author: lash <dev@holbrook.no>
Date:   Mon, 15 Apr 2024 13:02:23 +0100

Enable choice in net fee, settable evm version

Diffstat:
Mpython/erc20_pool/data/DecimalQuote.bin | 4++--
Mpython/erc20_pool/data/DecimalQuote.metadata.json | 2+-
Mpython/erc20_pool/data/SwapPool.bin | 4++--
Mpython/erc20_pool/data/SwapPool.json | 2+-
Mpython/erc20_pool/data/SwapPool.metadata.json | 2+-
Mpython/tests/test_fee.py | 11+++++++++--
Msolidity/Makefile | 13+++++++------
Msolidity/SwapPool.sol | 42+++++++++++++++++++++++++++++++++++++++++-
8 files changed, 64 insertions(+), 16 deletions(-)

diff --git a/python/erc20_pool/data/DecimalQuote.bin b/python/erc20_pool/data/DecimalQuote.bin @@ -1 +1 @@ -6080604052348015600f57600080fd5b50610aaa8061001f6000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b578063dbb21d401461006b575b600080fd5b610055600480360381019061005091906104a5565b61009b565b60405161006291906104ed565b60405180910390f35b6100856004803603810190610080919061059c565b610113565b60405161009291906105fe565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036100d3576001905061010e565b63dbb21d4060e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610109576001905061010e565b600090505b919050565b600080600080600060608873ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516101c4919061068a565b6000604051808303816000865af19150503d8060008114610201576040519150601f19603f3d011682016040523d82523d6000602084013e610206565b606091505b5080925081935050508161024f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610246906106fe565b60405180910390fd5b808060200190518101906102639190610757565b94508773ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161030c919061068a565b6000604051808303816000865af19150503d8060008114610349576040519150601f19603f3d011682016040523d82523d6000602084013e61034e565b606091505b50809250819350505081610397576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161038e906107d0565b60405180910390fd5b808060200190518101906103ab9190610757565b93508460ff168460ff16036103c7578695505050505050610441565b8460ff168460ff16111561040d5784846103e1919061081f565b60ff16925082600a6103f39190610987565b925082876104019190610a01565b95505050505050610441565b8385610419919061081f565b60ff16925082600a61042b9190610987565b925082876104399190610a32565b955050505050505b9392505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6104828161044d565b811461048d57600080fd5b50565b60008135905061049f81610479565b92915050565b6000602082840312156104bb576104ba610448565b5b60006104c984828501610490565b91505092915050565b60008115159050919050565b6104e7816104d2565b82525050565b600060208201905061050260008301846104de565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061053382610508565b9050919050565b61054381610528565b811461054e57600080fd5b50565b6000813590506105608161053a565b92915050565b6000819050919050565b61057981610566565b811461058457600080fd5b50565b60008135905061059681610570565b92915050565b6000806000606084860312156105b5576105b4610448565b5b60006105c386828701610551565b93505060206105d486828701610551565b92505060406105e586828701610587565b9150509250925092565b6105f881610566565b82525050565b600060208201905061061360008301846105ef565b92915050565b600081519050919050565b600081905092915050565b60005b8381101561064d578082015181840152602081019050610632565b60008484015250505050565b600061066482610619565b61066e8185610624565b935061067e81856020860161062f565b80840191505092915050565b60006106968284610659565b915081905092915050565b600082825260208201905092915050565b7f4552525f544f4b454e5f4f555400000000000000000000000000000000000000600082015250565b60006106e8600d836106a1565b91506106f3826106b2565b602082019050919050565b60006020820190508181036000830152610717816106db565b9050919050565b600060ff82169050919050565b6107348161071e565b811461073f57600080fd5b50565b6000815190506107518161072b565b92915050565b60006020828403121561076d5761076c610448565b5b600061077b84828501610742565b91505092915050565b7f4552525f544f4b454e5f494e0000000000000000000000000000000000000000600082015250565b60006107ba600c836106a1565b91506107c582610784565b602082019050919050565b600060208201905081810360008301526107e9816107ad565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061082a8261071e565b91506108358361071e565b9250828203905060ff81111561084e5761084d6107f0565b5b92915050565b60008160011c9050919050565b6000808291508390505b60018511156108ab57808604811115610887576108866107f0565b5b60018516156108965780820291505b80810290506108a485610854565b945061086b565b94509492505050565b6000826108c45760019050610980565b816108d25760009050610980565b81600181146108e857600281146108f257610921565b6001915050610980565b60ff841115610904576109036107f0565b5b8360020a91508482111561091b5761091a6107f0565b5b50610980565b5060208310610133831016604e8410600b84101617156109565782820a905083811115610951576109506107f0565b5b610980565b6109638484846001610861565b9250905081840481111561097a576109796107f0565b5b81810290505b9392505050565b600061099282610566565b915061099d83610566565b92506109ca7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff84846108b4565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610a0c82610566565b9150610a1783610566565b925082610a2757610a266109d2565b5b828204905092915050565b6000610a3d82610566565b9150610a4883610566565b9250828202610a5681610566565b91508282048414831517610a6d57610a6c6107f0565b5b509291505056fea26469706673582212200467563bac5ddc57ed952ebe547987881c094cbd6d9c99702dacf1e09184163164736f6c63430008190033 -\ No newline at end of file +608060405234801561001057600080fd5b50610b25806100206000396000f3fe608060405234801561001057600080fd5b5060043610610053576000357c01000000000000000000000000000000000000000000000000000000009004806301ffc9a714610058578063dbb21d4014610088575b600080fd5b610072600480360381019061006d91906104fa565b6100b8565b60405161007f9190610542565b60405180910390f35b6100a2600480360381019061009d91906105f1565b610168565b6040516100af9190610653565b60405180910390f35b60006301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361010c5760019050610163565b63dbb21d407c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361015e5760019050610163565b600090505b919050565b600080600080600060608873ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161021991906106df565b6000604051808303816000865af19150503d8060008114610256576040519150601f19603f3d011682016040523d82523d6000602084013e61025b565b606091505b508092508193505050816102a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161029b90610753565b60405180910390fd5b808060200190518101906102b891906107ac565b94508773ffffffffffffffffffffffffffffffffffffffff166040516024016040516020818303038152906040527f313ce567000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161036191906106df565b6000604051808303816000865af19150503d806000811461039e576040519150601f19603f3d011682016040523d82523d6000602084013e6103a3565b606091505b508092508193505050816103ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103e390610825565b60405180910390fd5b8080602001905181019061040091906107ac565b93508460ff168460ff160361041c578695505050505050610496565b8460ff168460ff1611156104625784846104369190610874565b60ff16925082600a61044891906109dc565b925082876104569190610a56565b95505050505050610496565b838561046e9190610874565b60ff16925082600a61048091906109dc565b9250828761048e9190610a87565b955050505050505b9392505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6104d7816104a2565b81146104e257600080fd5b50565b6000813590506104f4816104ce565b92915050565b6000602082840312156105105761050f61049d565b5b600061051e848285016104e5565b91505092915050565b60008115159050919050565b61053c81610527565b82525050565b60006020820190506105576000830184610533565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105888261055d565b9050919050565b6105988161057d565b81146105a357600080fd5b50565b6000813590506105b58161058f565b92915050565b6000819050919050565b6105ce816105bb565b81146105d957600080fd5b50565b6000813590506105eb816105c5565b92915050565b60008060006060848603121561060a5761060961049d565b5b6000610618868287016105a6565b9350506020610629868287016105a6565b925050604061063a868287016105dc565b9150509250925092565b61064d816105bb565b82525050565b60006020820190506106686000830184610644565b92915050565b600081519050919050565b600081905092915050565b60005b838110156106a2578082015181840152602081019050610687565b60008484015250505050565b60006106b98261066e565b6106c38185610679565b93506106d3818560208601610684565b80840191505092915050565b60006106eb82846106ae565b915081905092915050565b600082825260208201905092915050565b7f4552525f544f4b454e5f4f555400000000000000000000000000000000000000600082015250565b600061073d600d836106f6565b915061074882610707565b602082019050919050565b6000602082019050818103600083015261076c81610730565b9050919050565b600060ff82169050919050565b61078981610773565b811461079457600080fd5b50565b6000815190506107a681610780565b92915050565b6000602082840312156107c2576107c161049d565b5b60006107d084828501610797565b91505092915050565b7f4552525f544f4b454e5f494e0000000000000000000000000000000000000000600082015250565b600061080f600c836106f6565b915061081a826107d9565b602082019050919050565b6000602082019050818103600083015261083e81610802565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061087f82610773565b915061088a83610773565b9250828203905060ff8111156108a3576108a2610845565b5b92915050565b6000600282049050919050565b6000808291508390505b6001851115610900578086048111156108dc576108db610845565b5b60018516156108eb5780820291505b80810290506108f9856108a9565b94506108c0565b94509492505050565b60008261091957600190506109d5565b8161092757600090506109d5565b816001811461093d576002811461094757610976565b60019150506109d5565b60ff84111561095957610958610845565b5b8360020a9150848211156109705761096f610845565b5b506109d5565b5060208310610133831016604e8410600b84101617156109ab5782820a9050838111156109a6576109a5610845565b5b6109d5565b6109b884848460016108b6565b925090508184048111156109cf576109ce610845565b5b81810290505b9392505050565b60006109e7826105bb565b91506109f2836105bb565b9250610a1f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484610909565b905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000610a61826105bb565b9150610a6c836105bb565b925082610a7c57610a7b610a27565b5b828204905092915050565b6000610a92826105bb565b9150610a9d836105bb565b9250828202610aab816105bb565b91508282048414831517610ac257610ac1610845565b5b509291505056fea2646970667358221220db7e5ebbc460d6f37457ba3b4f5ffb1ad5705ab1332ac81ddbce1fac983761ee64736f6c637828302e382e32312d646576656c6f702e323032342e342e31352b636f6d6d69742e64393937346265640059 +\ No newline at end of file diff --git a/python/erc20_pool/data/DecimalQuote.metadata.json b/python/erc20_pool/data/DecimalQuote.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"valueFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"DecimalQuote.sol":"DecimalQuote"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DecimalQuote.sol":{"keccak256":"0x4053ab914f5f3b89b17af0e091de359c808058461d12502cf53d495b5abc31b4","license":"AGPL-3.0-or-later","urls":["bzz-raw://496e4f4a2039dc9447d04db14ce8624b4caf2038cf017c56f632157a50f69cae","dweb:/ipfs/QmWDRaBfANxZrKb73AziafrbB5tZkgYjvd1ym1vGje47Ui"]}},"version":1} +{"compiler":{"version":"0.8.21-develop.2024.4.15+commit.d9974bed"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"valueFor","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"DecimalQuote.sol":"DecimalQuote"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"DecimalQuote.sol":{"keccak256":"0x4053ab914f5f3b89b17af0e091de359c808058461d12502cf53d495b5abc31b4","license":"AGPL-3.0-or-later","urls":["bzz-raw://496e4f4a2039dc9447d04db14ce8624b4caf2038cf017c56f632157a50f69cae","dweb:/ipfs/QmWDRaBfANxZrKb73AziafrbB5tZkgYjvd1ym1vGje47Ui"]}},"version":1} diff --git a/python/erc20_pool/data/SwapPool.bin b/python/erc20_pool/data/SwapPool.bin @@ -1 +1 @@ -60a060405234801561001057600080fd5b5060405161344e38038061344e83398181016040528101906100329190610335565b84600690816100419190610609565b5083600790816100519190610609565b508260ff166080818152505081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505050506106db565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61019082610147565b810181811067ffffffffffffffff821117156101af576101ae610158565b5b80604052505050565b60006101c2610129565b90506101ce8282610187565b919050565b600067ffffffffffffffff8211156101ee576101ed610158565b5b6101f782610147565b9050602081019050919050565b60005b83811015610222578082015181840152602081019050610207565b60008484015250505050565b600061024161023c846101d3565b6101b8565b90508281526020810184848401111561025d5761025c610142565b5b610268848285610204565b509392505050565b600082601f8301126102855761028461013d565b5b815161029584826020860161022e565b91505092915050565b600060ff82169050919050565b6102b48161029e565b81146102bf57600080fd5b50565b6000815190506102d1816102ab565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610302826102d7565b9050919050565b610312816102f7565b811461031d57600080fd5b50565b60008151905061032f81610309565b92915050565b600080600080600060a0868803121561035157610350610133565b5b600086015167ffffffffffffffff81111561036f5761036e610138565b5b61037b88828901610270565b955050602086015167ffffffffffffffff81111561039c5761039b610138565b5b6103a888828901610270565b94505060406103b9888289016102c2565b93505060606103ca88828901610320565b92505060806103db88828901610320565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061043a57607f821691505b60208210810361044d5761044c6103f3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104b57fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82610478565b6104bf8683610478565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006105066105016104fc846104d7565b6104e1565b6104d7565b9050919050565b6000819050919050565b610520836104eb565b61053461052c8261050d565b848454610485565b825550505050565b600090565b61054961053c565b610554818484610517565b505050565b5b818110156105785761056d600082610541565b60018101905061055a565b5050565b601f8211156105bd5761058e81610453565b61059784610468565b810160208510156105a6578190505b6105ba6105b285610468565b830182610559565b50505b505050565b600082821c905092915050565b60006105e0600019846008026105c2565b1980831691505092915050565b60006105f983836105cf565b9150826002028217905092915050565b610612826103e8565b67ffffffffffffffff81111561062b5761062a610158565b5b6106358254610422565b61064082828561057c565b600060209050601f8311600181146106735760008415610661578287015190505b61066b85826105ed565b8655506106d3565b601f19841661068186610453565b60005b828110156106a957848901518255600182019150602085019450602081019050610684565b868310156106c657848901516106c2601f8916826105cf565b8355505b6001600288020188555050505b505050505050565b608051612d586106f660003960006106680152612d586000f3fe608060405234801561001057600080fd5b50600436106101735760003560e01c806386fe212d116100de578063c515ee2311610097578063f2fde38b11610071578063f2fde38b14610440578063f3fef3a314610470578063f912c64b146104a0578063faaebd21146104bc57610173565b8063c515ee23146103d6578063c6bbd5a714610406578063d9caed121461042457610173565b806386fe212d146103125780638705fcd4146103425780638da5cb5b1461035e57806395d89b411461037c5780639d23c4c71461039a578063a534150c146103b857610173565b806331a5995d1161013057806331a5995d14610250578063412753581461026e57806347e7ef241461028c57806351cff8d9146102a857806353799c57146102d857806369fe0e2d146102f657610173565b806301ffc9a71461017857806306fdde03146101a857806318160ddd146101c657806318cbbcfc146101e45780632c1758c114610202578063313ce56714610232575b600080fd5b610192600480360381019061018d919061203f565b6104ec565b60405161019f9190612087565b60405180910390f35b6101b061059a565b6040516101bd9190612132565b60405180910390f35b6101ce610628565b6040516101db919061216d565b60405180910390f35b6101ec61062e565b6040516101f9919061216d565b60405180910390f35b61021c600480360381019061021791906121b4565b610633565b6040516102299190612087565b60405180910390f35b61023a610666565b604051610247919061216d565b60405180910390f35b61025861068a565b604051610265919061216d565b60405180910390f35b610276610690565b6040516102839190612222565b60405180910390f35b6102a660048036038101906102a19190612269565b6106b6565b005b6102c260048036038101906102bd91906122a9565b610729565b6040516102cf919061216d565b60405180910390f35b6102e06107c5565b6040516102ed9190612222565b60405180910390f35b610310600480360381019061030b91906121b4565b6107eb565b005b61032c600480360381019061032791906121b4565b610915565b604051610339919061216d565b60405180910390f35b61035c600480360381019061035791906122a9565b6109fd565b005b610366610b1c565b6040516103739190612222565b60405180910390f35b610384610b40565b6040516103919190612132565b60405180910390f35b6103a2610bce565b6040516103af9190612222565b60405180910390f35b6103c0610bf4565b6040516103cd919061216d565b60405180910390f35b6103f060048036038101906103eb91906122d6565b610bfa565b6040516103fd919061216d565b60405180910390f35b61040e610de8565b60405161041b9190612222565b60405180910390f35b61043e600480360381019061043991906122d6565b610e0e565b005b61045a600480360381019061045591906122a9565b611294565b6040516104679190612087565b60405180910390f35b61048a60048036038101906104859190612269565b6113d6565b604051610497919061216d565b60405180910390f35b6104ba60048036038101906104b591906122a9565b61172e565b005b6104d660048036038101906104d191906122a9565b61184d565b6040516104e3919061216d565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105245760019050610595565b639493f8b260e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361055a5760019050610595565b630d7491f860e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105905760019050610595565b600090505b919050565b600680546105a790612358565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390612358565b80156106205780601f106105f557610100808354040283529160200191610620565b820191906000526020600020905b81548152906001019060200180831161060357829003601f168201915b505050505081565b60085481565b600781565b60006007821061064257600080fd5b60008203610657576007600a54149050610661565b81600a5483161490505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6106c08282611865565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f628360405161071d919061216d565b60405180910390a35050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506107bd83826113d6565b915050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6107f8600160ff16610633565b15610838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082f906123d5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146108c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bd90612441565b60405180910390fd5b620f4240811061090b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610902906124ad565b60405180910390fd5b8060048190555050565b6000600782111561095b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095290612519565b60405180910390fd5b6000600a548316146109a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099990612585565b60405180910390fd5b81600a600082825417925050819055506007600a541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e600a546040516109eb919061216d565b60405180910390a2600a549050919050565b610a0a600260ff16610633565b15610a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a41906123d5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610acf90612441565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60078054610b4d90612358565b80601f0160208091040260200160405190810160405280929190818152602001828054610b7990612358565b8015610bc65780601f10610b9b57610100808354040283529160200191610bc6565b820191906000526020600020905b815481529060010190602001808311610ba957829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600080606060008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610c6157849350505050610de1565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16878787604051602401610caf939291906125a5565b6040516020818303038152906040527fdbb21d40000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610d399190612623565b6000604051808303816000865af19150503d8060008114610d76576040519150601f19603f3d011682016040523d82523d6000602084013e610d7b565b606091505b50809350819450505082610dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dbb90612686565b60405180910390fd5b81806020019051810190610dd891906126bb565b90508093505050505b9392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060606000806000610e22888888610bfa565b90508773ffffffffffffffffffffffffffffffffffffffff1630604051602401610e4c9190612747565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610ed69190612623565b6000604051808303816000865af19150503d8060008114610f13576040519150601f19603f3d011682016040523d82523d6000602084013e610f18565b606091505b50809550819650505084610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906127ae565b60405180910390fd5b83806020019051810190610f7591906126bb565b9250610f8081611a55565b91508181610f8e91906127fd565b905080831015610fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fca9061287d565b60405180910390fd5b610fdd8787611865565b8773ffffffffffffffffffffffffffffffffffffffff16338260405160240161100792919061289d565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516110919190612623565b6000604051808303816000865af19150503d80600081146110ce576040519150601f19603f3d011682016040523d82523d6000602084013e6110d3565b606091505b5080955081965050508461111c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611113906127ae565b60405180910390fd5b8380602001905181019061113091906128f2565b945084611172576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111699061296b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461121f5781600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611217919061298b565b925050819055505b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd6d34547c69c5ee3d2667625c188acf1006abb93e0ee7cf03925c67cf77604138a89858760405161128294939291906129bf565b60405180910390a35050505050505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146112ef57600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b600080606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611469576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146090612a50565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036114fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f190612441565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168560405160240161154692919061289d565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516115d09190612623565b6000604051808303816000865af19150503d806000811461160d576040519150601f19603f3d011682016040523d82523d6000602084013e611612565b606091505b5080925081935050508161165b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611652906127ae565b60405180910390fd5b8080602001905181019061166f91906128f2565b9150816116b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a89061296b565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1314fd112a381beea61539dbd21ec04afcff2662ac7d1b83273aade1f53d1b97868660405161171b92919061289d565b60405180910390a2839250505092915050565b61173b600460ff16610633565b1561177b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611772906123d5565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180090612441565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60096020528060005260406000206000915090505481565b6000606061189584600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16611a82565b61189f8484611c5b565b8373ffffffffffffffffffffffffffffffffffffffff163330856040516024016118cb93929190612a70565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516119559190612623565b6000604051808303816000865af19150503d8060008114611992576040519150601f19603f3d011682016040523d82523d6000602084013e611997565b606091505b508092508193505050816119e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119d7906127ae565b60405180910390fd5b808060200190518101906119f491906128f2565b915081611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d9061296b565b60405180910390fd5b8260086000828254611a48919061298b565b9250508190555050505050565b60008060045483611a669190612aa7565b9050620f424081611a779190612b18565b905080915050919050565b60006060600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611ac1575050611c57565b8273ffffffffffffffffffffffffffffffffffffffff1684604051602401611ae99190612222565b6040516020818303038152906040527f3ef25013000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b739190612623565b6000604051808303816000865af19150503d8060008114611bb0576040519150601f19603f3d011682016040523d82523d6000602084013e611bb5565b606091505b50809250819350505081611bfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf590612b95565b60405180910390fd5b80806020019051810190611c1291906128f2565b915081611c54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4b90612c01565b60405180910390fd5b50505b5050565b60006060600080600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611cc15750505050611fde565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168630604051602401611d0d929190612c21565b6040516020818303038152906040527f23778613000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611d979190612623565b6000604051808303816000865af19150503d8060008114611dd4576040519150601f19603f3d011682016040523d82523d6000602084013e611dd9565b606091505b50809450819550505083611e22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1990612c96565b60405180910390fd5b82806020019051810190611e3691906126bb565b91508573ffffffffffffffffffffffffffffffffffffffff1630604051602401611e609190612747565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611eea9190612623565b6000604051808303816000865af19150503d8060008114611f27576040519150601f19603f3d011682016040523d82523d6000602084013e611f2c565b606091505b50809450819550505083611f75576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f6c906127ae565b60405180910390fd5b82806020019051810190611f8991906126bb565b9050818582611f98919061298b565b1115611fd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fd090612d02565b60405180910390fd5b505050505b5050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61201c81611fe7565b811461202757600080fd5b50565b60008135905061203981612013565b92915050565b60006020828403121561205557612054611fe2565b5b60006120638482850161202a565b91505092915050565b60008115159050919050565b6120818161206c565b82525050565b600060208201905061209c6000830184612078565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120dc5780820151818401526020810190506120c1565b60008484015250505050565b6000601f19601f8301169050919050565b6000612104826120a2565b61210e81856120ad565b935061211e8185602086016120be565b612127816120e8565b840191505092915050565b6000602082019050818103600083015261214c81846120f9565b905092915050565b6000819050919050565b61216781612154565b82525050565b6000602082019050612182600083018461215e565b92915050565b61219181612154565b811461219c57600080fd5b50565b6000813590506121ae81612188565b92915050565b6000602082840312156121ca576121c9611fe2565b5b60006121d88482850161219f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061220c826121e1565b9050919050565b61221c81612201565b82525050565b60006020820190506122376000830184612213565b92915050565b61224681612201565b811461225157600080fd5b50565b6000813590506122638161223d565b92915050565b600080604083850312156122805761227f611fe2565b5b600061228e85828601612254565b925050602061229f8582860161219f565b9150509250929050565b6000602082840312156122bf576122be611fe2565b5b60006122cd84828501612254565b91505092915050565b6000806000606084860312156122ef576122ee611fe2565b5b60006122fd86828701612254565b935050602061230e86828701612254565b925050604061231f8682870161219f565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061237057607f821691505b60208210810361238357612382612329565b5b50919050565b7f4552525f5345414c000000000000000000000000000000000000000000000000600082015250565b60006123bf6008836120ad565b91506123ca82612389565b602082019050919050565b600060208201905081810360008301526123ee816123b2565b9050919050565b7f4552525f41585800000000000000000000000000000000000000000000000000600082015250565b600061242b6007836120ad565b9150612436826123f5565b602082019050919050565b6000602082019050818103600083015261245a8161241e565b9050919050565b7f4552525f4645455f544f4f5f4849474800000000000000000000000000000000600082015250565b60006124976010836120ad565b91506124a282612461565b602082019050919050565b600060208201905081810360008301526124c68161248a565b9050919050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b60006125036011836120ad565b915061250e826124cd565b602082019050919050565b60006020820190508181036000830152612532816124f6565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b600061256f6012836120ad565b915061257a82612539565b602082019050919050565b6000602082019050818103600083015261259e81612562565b9050919050565b60006060820190506125ba6000830186612213565b6125c76020830185612213565b6125d4604083018461215e565b949350505050565b600081519050919050565b600081905092915050565b60006125fd826125dc565b61260781856125e7565b93506126178185602086016120be565b80840191505092915050565b600061262f82846125f2565b915081905092915050565b7f4552525f51554f54455200000000000000000000000000000000000000000000600082015250565b6000612670600a836120ad565b915061267b8261263a565b602082019050919050565b6000602082019050818103600083015261269f81612663565b9050919050565b6000815190506126b581612188565b92915050565b6000602082840312156126d1576126d0611fe2565b5b60006126df848285016126a6565b91505092915050565b6000819050919050565b600061270d612708612703846121e1565b6126e8565b6121e1565b9050919050565b600061271f826126f2565b9050919050565b600061273182612714565b9050919050565b61274181612726565b82525050565b600060208201905061275c6000830184612738565b92915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b60006127986009836120ad565b91506127a382612762565b602082019050919050565b600060208201905081810360008301526127c78161278b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061280882612154565b915061281383612154565b925082820390508181111561282b5761282a6127ce565b5b92915050565b7f4552525f42414c414e4345000000000000000000000000000000000000000000600082015250565b6000612867600b836120ad565b915061287282612831565b602082019050919050565b600060208201905081810360008301526128968161285a565b9050919050565b60006040820190506128b26000830185612213565b6128bf602083018461215e565b9392505050565b6128cf8161206c565b81146128da57600080fd5b50565b6000815190506128ec816128c6565b92915050565b60006020828403121561290857612907611fe2565b5b6000612916848285016128dd565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000612955600c836120ad565b91506129608261291f565b602082019050919050565b6000602082019050818103600083015261298481612948565b9050919050565b600061299682612154565b91506129a183612154565b92508282019050808211156129b9576129b86127ce565b5b92915050565b60006080820190506129d46000830187612213565b6129e1602083018661215e565b6129ee604083018561215e565b6129fb606083018461215e565b95945050505050565b7f4552525f4f574e45520000000000000000000000000000000000000000000000600082015250565b6000612a3a6009836120ad565b9150612a4582612a04565b602082019050919050565b60006020820190508181036000830152612a6981612a2d565b9050919050565b6000606082019050612a856000830186612213565b612a926020830185612738565b612a9f604083018461215e565b949350505050565b6000612ab282612154565b9150612abd83612154565b9250828202612acb81612154565b91508282048414831517612ae257612ae16127ce565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612b2382612154565b9150612b2e83612154565b925082612b3e57612b3d612ae9565b5b828204905092915050565b7f4552525f52454749535452590000000000000000000000000000000000000000600082015250565b6000612b7f600c836120ad565b9150612b8a82612b49565b602082019050919050565b60006020820190508181036000830152612bae81612b72565b9050919050565b7f4552525f554e415554485f544f4b454e00000000000000000000000000000000600082015250565b6000612beb6010836120ad565b9150612bf682612bb5565b602082019050919050565b60006020820190508181036000830152612c1a81612bde565b9050919050565b6000604082019050612c366000830185612213565b612c436020830184612738565b9392505050565b7f4552525f4c494d49544552000000000000000000000000000000000000000000600082015250565b6000612c80600b836120ad565b9150612c8b82612c4a565b602082019050919050565b60006020820190508181036000830152612caf81612c73565b9050919050565b7f4552525f4c494d49540000000000000000000000000000000000000000000000600082015250565b6000612cec6009836120ad565b9150612cf782612cb6565b602082019050919050565b60006020820190508181036000830152612d1b81612cdf565b905091905056fea2646970667358221220a4fb2492a9ae6fc7bbe1da1c16fad8c402355ad8c5d78db2bfbb495d38c6da7a64736f6c63430008190033 -\ No newline at end of file +60a06040523480156200001157600080fd5b5060405162003b1a38038062003b1a833981810160405281019062000037919062000369565b846006908162000048919062000680565b5083600790816200005a919062000680565b508260ff166080818152505081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505050505062000767565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200019c8262000151565b810181811067ffffffffffffffff82111715620001be57620001bd62000162565b5b80604052505050565b6000620001d362000133565b9050620001e1828262000191565b919050565b600067ffffffffffffffff82111562000204576200020362000162565b5b6200020f8262000151565b9050602081019050919050565b60005b838110156200023c5780820151818401526020810190506200021f565b60008484015250505050565b60006200025f6200025984620001e6565b620001c7565b9050828152602081018484840111156200027e576200027d6200014c565b5b6200028b8482856200021c565b509392505050565b600082601f830112620002ab57620002aa62000147565b5b8151620002bd84826020860162000248565b91505092915050565b600060ff82169050919050565b620002de81620002c6565b8114620002ea57600080fd5b50565b600081519050620002fe81620002d3565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003318262000304565b9050919050565b620003438162000324565b81146200034f57600080fd5b50565b600081519050620003638162000338565b92915050565b600080600080600060a086880312156200038857620003876200013d565b5b600086015167ffffffffffffffff811115620003a957620003a862000142565b5b620003b78882890162000293565b955050602086015167ffffffffffffffff811115620003db57620003da62000142565b5b620003e98882890162000293565b9450506040620003fc88828901620002ed565b93505060606200040f8882890162000352565b9250506080620004228882890162000352565b9150509295509295909350565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200048257607f821691505b6020821081036200049857620004976200043a565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b60008160020a8302905092915050565b600060088302620005057fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004c3565b620005118683620004c3565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200055e62000558620005528462000529565b62000533565b62000529565b9050919050565b6000819050919050565b6200057a836200053d565b62000592620005898262000565565b848454620004d3565b825550505050565b600090565b620005a96200059a565b620005b68184846200056f565b505050565b5b81811015620005de57620005d26000826200059f565b600181019050620005bc565b5050565b601f8211156200062d57620005f7816200049e565b6200060284620004b3565b8101602085101562000612578190505b6200062a6200062185620004b3565b830182620005bb565b50505b505050565b60008160020a8304905092915050565b6000620006556000198460080262000632565b1980831691505092915050565b600062000670838362000642565b9150826002028217905092915050565b6200068b826200042f565b67ffffffffffffffff811115620006a757620006a662000162565b5b620006b3825462000469565b620006c0828285620005e2565b600060209050601f831160018114620006f85760008415620006e3578287015190505b620006ef858262000662565b8655506200075f565b601f19841662000708866200049e565b60005b8281101562000732578489015182556001820191506020850194506020810190506200070b565b868310156200075257848901516200074e601f89168262000642565b8355505b6001600288020188555050505b505050505050565b60805161339762000783600039600061074701526133976000f3fe608060405234801561001057600080fd5b50600436106101c6576000357c01000000000000000000000000000000000000000000000000000000009004806386fe212d11610116578063c515ee23116100b4578063f2fde38b1161008e578063f2fde38b146104cb578063f3fef3a3146104fb578063f912c64b1461052b578063faaebd2114610547576101c6565b8063c515ee2314610461578063c6bbd5a714610491578063d9caed12146104af576101c6565b8063934785b7116100f0578063934785b7146103eb57806395d89b41146104075780639d23c4c714610425578063a534150c14610443576101c6565b806386fe212d146103815780638705fcd4146103b15780638da5cb5b146103cd576101c6565b806331a5995d1161018357806351cff8d91161015d57806351cff8d9146102fb57806353799c571461032b57806369fe0e2d1461034957806375e3bb4314610365576101c6565b806331a5995d146102a357806341275358146102c157806347e7ef24146102df576101c6565b806301ffc9a7146101cb57806306fdde03146101fb57806318160ddd1461021957806318cbbcfc146102375780632c1758c114610255578063313ce56714610285575b600080fd5b6101e560048036038101906101e091906125dc565b610577565b6040516101f29190612624565b60405180910390f35b610203610679565b60405161021091906126cf565b60405180910390f35b610221610707565b60405161022e919061270a565b60405180910390f35b61023f61070d565b60405161024c919061270a565b60405180910390f35b61026f600480360381019061026a9190612751565b610712565b60405161027c9190612624565b60405180910390f35b61028d610745565b60405161029a919061270a565b60405180910390f35b6102ab610769565b6040516102b8919061270a565b60405180910390f35b6102c961076f565b6040516102d691906127bf565b60405180910390f35b6102f960048036038101906102f49190612806565b610795565b005b61031560048036038101906103109190612846565b610808565b604051610322919061270a565b60405180910390f35b6103336108a4565b60405161034091906127bf565b60405180910390f35b610363600480360381019061035e9190612751565b6108ca565b005b61037f600480360381019061037a9190612873565b6109f4565b005b61039b60048036038101906103969190612751565b610e7a565b6040516103a8919061270a565b60405180910390f35b6103cb60048036038101906103c69190612846565b610f62565b005b6103d5611081565b6040516103e291906127bf565b60405180910390f35b610405600480360381019061040091906128f2565b6110a5565b005b61040f6110cd565b60405161041c91906126cf565b60405180910390f35b61042d61115b565b60405161043a91906127bf565b60405180910390f35b61044b611181565b604051610458919061270a565b60405180910390f35b61047b60048036038101906104769190612873565b611187565b604051610488919061270a565b60405180910390f35b610499611375565b6040516104a691906127bf565b60405180910390f35b6104c960048036038101906104c49190612873565b61139b565b005b6104e560048036038101906104e09190612846565b611831565b6040516104f29190612624565b60405180910390f35b61051560048036038101906105109190612806565b611973565b604051610522919061270a565b60405180910390f35b61054560048036038101906105409190612846565b611ccb565b005b610561600480360381019061055c9190612846565b611dea565b60405161056e919061270a565b60405180910390f35b60006301ffc9a77c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036105cb5760019050610674565b639493f8b27c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361061d5760019050610674565b630d7491f87c010000000000000000000000000000000000000000000000000000000002827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19160361066f5760019050610674565b600090505b919050565b6006805461068690612988565b80601f01602080910402602001604051908101604052809291908181526020018280546106b290612988565b80156106ff5780601f106106d4576101008083540402835291602001916106ff565b820191906000526020600020905b8154815290600101906020018083116106e257829003601f168201915b505050505081565b60085481565b600781565b60006007821061072157600080fd5b60008203610736576007600a54149050610740565b81600a5483161490505b919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600a5481565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61079f8282611e02565b8173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f5548c837ab068cf56a2c2479df0882a4922fd203edb7517321831d95078c5f62836040516107fc919061270a565b60405180910390a35050565b600080600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490506000600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061089c8382611973565b915050919050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6108d7600160ff16610712565b15610917576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090e90612a05565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146109a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161099c90612a71565b60405180910390fd5b620f424081106109ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e190612add565b60405180910390fd5b8060048190555050565b600060606000806000610a08888888611187565b90508773ffffffffffffffffffffffffffffffffffffffff1630604051602401610a329190612b5c565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610abc9190612bbe565b6000604051808303816000865af19150503d8060008114610af9576040519150601f19603f3d011682016040523d82523d6000602084013e610afe565b606091505b50809550819650505084610b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3e90612c21565b60405180910390fd5b83806020019051810190610b5b9190612c56565b9250610b6681611ff2565b91508181610b749190612cb2565b905080831015610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb090612d32565b60405180910390fd5b610bc38787611e02565b8773ffffffffffffffffffffffffffffffffffffffff163382604051602401610bed929190612d52565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610c779190612bbe565b6000604051808303816000865af19150503d8060008114610cb4576040519150601f19603f3d011682016040523d82523d6000602084013e610cb9565b606091505b50809550819650505084610d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf990612c21565b60405180910390fd5b83806020019051810190610d169190612d90565b945084610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90612e09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e055781600960008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610dfd9190612e29565b925050819055505b8673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd6d34547c69c5ee3d2667625c188acf1006abb93e0ee7cf03925c67cf77604138a898587604051610e689493929190612e5d565b60405180910390a35050505050505050565b60006007821115610ec0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eb790612eee565b60405180910390fd5b6000600a54831614610f07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610efe90612f5a565b60405180910390fd5b81600a600082825417925050819055506007600a541415157f6b7e2e653f93b645d4ed7292d6429f96637084363e477c8aaea1a43ed13c284e600a54604051610f50919061270a565b60405180910390a2600a549050919050565b610f6f600260ff16610712565b15610faf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa690612a05565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461103d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161103490612a71565b60405180910390fd5b80600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b80156110bb576110b68484846109f4565b6110c7565b6110c684848461139b565b5b50505050565b600780546110da90612988565b80601f016020809104026020016040519081016040528092919081815260200182805461110690612988565b80156111535780601f1061112857610100808354040283529160200191611153565b820191906000526020600020905b81548152906001019060200180831161113657829003601f168201915b505050505081565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60045481565b600080606060008073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036111ee5784935050505061136e565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1687878760405160240161123c93929190612f7a565b6040516020818303038152906040527fdbb21d40000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516112c69190612bbe565b6000604051808303816000865af19150503d8060008114611303576040519150601f19603f3d011682016040523d82523d6000602084013e611308565b606091505b50809350819450505082611351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134890612ffd565b60405180910390fd5b818060200190518101906113659190612c56565b90508093505050505b9392505050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600060606000806000806113ae87611ff2565b905080876113bc9190612cb2565b93506113c9898986611187565b93508873ffffffffffffffffffffffffffffffffffffffff16306040516024016113f39190612b5c565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161147d9190612bbe565b6000604051808303816000865af19150503d80600081146114ba576040519150601f19603f3d011682016040523d82523d6000602084013e6114bf565b606091505b50809650819750505085611508576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ff90612c21565b60405180910390fd5b8480602001905181019061151c9190612c56565b9150808461152a9190612e29565b92508282101561156f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156690612d32565b60405180910390fd5b6115798888610795565b8873ffffffffffffffffffffffffffffffffffffffff1633856040516024016115a3929190612d52565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff838183161783525050505060405161162d9190612bbe565b6000604051808303816000865af19150503d806000811461166a576040519150601f19603f3d011682016040523d82523d6000602084013e61166f565b606091505b508096508197505050856116b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116af90612c21565b60405180910390fd5b848060200190518101906116cc9190612d90565b95508561170e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170590612e09565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117bb5780600960008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117b39190612e29565b925050819055505b8773ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fd6d34547c69c5ee3d2667625c188acf1006abb93e0ee7cf03925c67cf77604138b8a878660405161181e9493929190612e5d565b60405180910390a3505050505050505050565b60008060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461188c57600080fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36001915050919050565b600080606060008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a06576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fd90613069565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a8e90612a71565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1685604051602401611ae3929190612d52565b6040516020818303038152906040527fa9059cbb000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611b6d9190612bbe565b6000604051808303816000865af19150503d8060008114611baa576040519150601f19603f3d011682016040523d82523d6000602084013e611baf565b606091505b50809250819350505081611bf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bef90612c21565b60405180910390fd5b80806020019051810190611c0c9190612d90565b915081611c4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4590612e09565b60405180910390fd5b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f1314fd112a381beea61539dbd21ec04afcff2662ac7d1b83273aade1f53d1b978686604051611cb8929190612d52565b60405180910390a2839250505092915050565b611cd8600460ff16610712565b15611d18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0f90612a05565b60405180910390fd5b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9d90612a71565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60096020528060005260406000206000915090505481565b60006060611e3284600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1661201f565b611e3c84846121f8565b8373ffffffffffffffffffffffffffffffffffffffff16333085604051602401611e6893929190613089565b6040516020818303038152906040527f23b872dd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051611ef29190612bbe565b6000604051808303816000865af19150503d8060008114611f2f576040519150601f19603f3d011682016040523d82523d6000602084013e611f34565b606091505b50809250819350505081611f7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7490612c21565b60405180910390fd5b80806020019051810190611f919190612d90565b915081611fd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fca90612e09565b60405180910390fd5b8260086000828254611fe59190612e29565b9250508190555050505050565b6000806004548361200391906130c0565b9050620f4240816120149190613131565b905080915050919050565b60006060600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361205e5750506121f4565b8273ffffffffffffffffffffffffffffffffffffffff168460405160240161208691906127bf565b6040516020818303038152906040527f3ef25013000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516121109190612bbe565b6000604051808303816000865af19150503d806000811461214d576040519150601f19603f3d011682016040523d82523d6000602084013e612152565b606091505b5080925081935050508161219b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612192906131ae565b60405180910390fd5b808060200190518101906121af9190612d90565b9150816121f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e89061321a565b60405180910390fd5b50505b5050565b60006060600080600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff160361225e575050505061257b565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1686306040516024016122aa92919061323a565b6040516020818303038152906040527f23778613000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516123349190612bbe565b6000604051808303816000865af19150503d8060008114612371576040519150601f19603f3d011682016040523d82523d6000602084013e612376565b606091505b508094508195505050836123bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123b6906132af565b60405180910390fd5b828060200190518101906123d39190612c56565b91508573ffffffffffffffffffffffffffffffffffffffff16306040516024016123fd9190612b5c565b6040516020818303038152906040527f70a08231000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040516124879190612bbe565b6000604051808303816000865af19150503d80600081146124c4576040519150601f19603f3d011682016040523d82523d6000602084013e6124c9565b606091505b50809450819550505083612512576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161250990612c21565b60405180910390fd5b828060200190518101906125269190612c56565b90508185826125359190612e29565b1115612576576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161256d9061331b565b60405180910390fd5b505050505b5050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6125b981612584565b81146125c457600080fd5b50565b6000813590506125d6816125b0565b92915050565b6000602082840312156125f2576125f161257f565b5b6000612600848285016125c7565b91505092915050565b60008115159050919050565b61261e81612609565b82525050565b60006020820190506126396000830184612615565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561267957808201518184015260208101905061265e565b60008484015250505050565b6000601f19601f8301169050919050565b60006126a18261263f565b6126ab818561264a565b93506126bb81856020860161265b565b6126c481612685565b840191505092915050565b600060208201905081810360008301526126e98184612696565b905092915050565b6000819050919050565b612704816126f1565b82525050565b600060208201905061271f60008301846126fb565b92915050565b61272e816126f1565b811461273957600080fd5b50565b60008135905061274b81612725565b92915050565b6000602082840312156127675761276661257f565b5b60006127758482850161273c565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006127a98261277e565b9050919050565b6127b98161279e565b82525050565b60006020820190506127d460008301846127b0565b92915050565b6127e38161279e565b81146127ee57600080fd5b50565b600081359050612800816127da565b92915050565b6000806040838503121561281d5761281c61257f565b5b600061282b858286016127f1565b925050602061283c8582860161273c565b9150509250929050565b60006020828403121561285c5761285b61257f565b5b600061286a848285016127f1565b91505092915050565b60008060006060848603121561288c5761288b61257f565b5b600061289a868287016127f1565b93505060206128ab868287016127f1565b92505060406128bc8682870161273c565b9150509250925092565b6128cf81612609565b81146128da57600080fd5b50565b6000813590506128ec816128c6565b92915050565b6000806000806080858703121561290c5761290b61257f565b5b600061291a878288016127f1565b945050602061292b878288016127f1565b935050604061293c8782880161273c565b925050606061294d878288016128dd565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129a057607f821691505b6020821081036129b3576129b2612959565b5b50919050565b7f4552525f5345414c000000000000000000000000000000000000000000000000600082015250565b60006129ef60088361264a565b91506129fa826129b9565b602082019050919050565b60006020820190508181036000830152612a1e816129e2565b9050919050565b7f4552525f41585800000000000000000000000000000000000000000000000000600082015250565b6000612a5b60078361264a565b9150612a6682612a25565b602082019050919050565b60006020820190508181036000830152612a8a81612a4e565b9050919050565b7f4552525f4645455f544f4f5f4849474800000000000000000000000000000000600082015250565b6000612ac760108361264a565b9150612ad282612a91565b602082019050919050565b60006020820190508181036000830152612af681612aba565b9050919050565b6000819050919050565b6000612b22612b1d612b188461277e565b612afd565b61277e565b9050919050565b6000612b3482612b07565b9050919050565b6000612b4682612b29565b9050919050565b612b5681612b3b565b82525050565b6000602082019050612b716000830184612b4d565b92915050565b600081519050919050565b600081905092915050565b6000612b9882612b77565b612ba28185612b82565b9350612bb281856020860161265b565b80840191505092915050565b6000612bca8284612b8d565b915081905092915050565b7f4552525f544f4b454e0000000000000000000000000000000000000000000000600082015250565b6000612c0b60098361264a565b9150612c1682612bd5565b602082019050919050565b60006020820190508181036000830152612c3a81612bfe565b9050919050565b600081519050612c5081612725565b92915050565b600060208284031215612c6c57612c6b61257f565b5b6000612c7a84828501612c41565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cbd826126f1565b9150612cc8836126f1565b9250828203905081811115612ce057612cdf612c83565b5b92915050565b7f4552525f42414c414e4345000000000000000000000000000000000000000000600082015250565b6000612d1c600b8361264a565b9150612d2782612ce6565b602082019050919050565b60006020820190508181036000830152612d4b81612d0f565b9050919050565b6000604082019050612d6760008301856127b0565b612d7460208301846126fb565b9392505050565b600081519050612d8a816128c6565b92915050565b600060208284031215612da657612da561257f565b5b6000612db484828501612d7b565b91505092915050565b7f4552525f5452414e534645520000000000000000000000000000000000000000600082015250565b6000612df3600c8361264a565b9150612dfe82612dbd565b602082019050919050565b60006020820190508181036000830152612e2281612de6565b9050919050565b6000612e34826126f1565b9150612e3f836126f1565b9250828201905080821115612e5757612e56612c83565b5b92915050565b6000608082019050612e7260008301876127b0565b612e7f60208301866126fb565b612e8c60408301856126fb565b612e9960608301846126fb565b95945050505050565b7f4552525f494e56414c49445f5354415445000000000000000000000000000000600082015250565b6000612ed860118361264a565b9150612ee382612ea2565b602082019050919050565b60006020820190508181036000830152612f0781612ecb565b9050919050565b7f4552525f414c52454144595f4c4f434b45440000000000000000000000000000600082015250565b6000612f4460128361264a565b9150612f4f82612f0e565b602082019050919050565b60006020820190508181036000830152612f7381612f37565b9050919050565b6000606082019050612f8f60008301866127b0565b612f9c60208301856127b0565b612fa960408301846126fb565b949350505050565b7f4552525f51554f54455200000000000000000000000000000000000000000000600082015250565b6000612fe7600a8361264a565b9150612ff282612fb1565b602082019050919050565b6000602082019050818103600083015261301681612fda565b9050919050565b7f4552525f4f574e45520000000000000000000000000000000000000000000000600082015250565b600061305360098361264a565b915061305e8261301d565b602082019050919050565b6000602082019050818103600083015261308281613046565b9050919050565b600060608201905061309e60008301866127b0565b6130ab6020830185612b4d565b6130b860408301846126fb565b949350505050565b60006130cb826126f1565b91506130d6836126f1565b92508282026130e4816126f1565b915082820484148315176130fb576130fa612c83565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061313c826126f1565b9150613147836126f1565b92508261315757613156613102565b5b828204905092915050565b7f4552525f52454749535452590000000000000000000000000000000000000000600082015250565b6000613198600c8361264a565b91506131a382613162565b602082019050919050565b600060208201905081810360008301526131c78161318b565b9050919050565b7f4552525f554e415554485f544f4b454e00000000000000000000000000000000600082015250565b600061320460108361264a565b915061320f826131ce565b602082019050919050565b60006020820190508181036000830152613233816131f7565b9050919050565b600060408201905061324f60008301856127b0565b61325c6020830184612b4d565b9392505050565b7f4552525f4c494d49544552000000000000000000000000000000000000000000600082015250565b6000613299600b8361264a565b91506132a482613263565b602082019050919050565b600060208201905081810360008301526132c88161328c565b9050919050565b7f4552525f4c494d49540000000000000000000000000000000000000000000000600082015250565b600061330560098361264a565b9150613310826132cf565b602082019050919050565b60006020820190508181036000830152613334816132f8565b905091905056fea26469706673582212203a25d481721fe753165310a01fbb256856cf4e7cfa3f7add7c7e52c97434cd9464736f6c637828302e382e32312d646576656c6f702e323032342e342e31352b636f6d6d69742e64393937346265640059 +\ No newline at end of file diff --git a/python/erc20_pool/data/SwapPool.json b/python/erc20_pool/data/SwapPool.json @@ -1 +1 @@ -[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_tokenRegistry","type":"address"},{"internalType":"address","name":"_tokenLimiter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePpm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_quoter","type":"address"}],"name":"setQuoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLimiter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}] +[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_tokenRegistry","type":"address"},{"internalType":"address","name":"_tokenLimiter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePpm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_quoter","type":"address"}],"name":"setQuoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLimiter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bool","name":"_deduct_fee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw_less_fee","outputs":[],"stateMutability":"nonpayable","type":"function"}] diff --git a/python/erc20_pool/data/SwapPool.metadata.json b/python/erc20_pool/data/SwapPool.metadata.json @@ -1 +1 @@ -{"compiler":{"version":"0.8.25+commit.b61c2a91"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_tokenRegistry","type":"address"},{"internalType":"address","name":"_tokenLimiter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePpm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_quoter","type":"address"}],"name":"setQuoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLimiter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"SwapPool.sol":"SwapPool"},"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"SwapPool.sol":{"keccak256":"0x3dfc6ebc8d007e726a6b4cff3dbf90cc6f108e007ceae407ff0f025009e0ce45","license":"AGPL-3.0-or-later","urls":["bzz-raw://7fb8f6dd21d0704c7145895e7c3aa0541f349d8d84fa9d826afa79016e322aa0","dweb:/ipfs/QmVR8GhA8JHVVMe3MHg1A2QoScecjYi4vKhkBUXKbWRuUK"]}},"version":1} +{"compiler":{"version":"0.8.21-develop.2024.4.15+commit.d9974bed"},"language":"Solidity","output":{"abi":[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"},{"internalType":"address","name":"_tokenRegistry","type":"address"},{"internalType":"address","name":"_tokenLimiter","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"feeAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"}],"name":"Collect","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bool","name":"_final","type":"bool"},{"indexed":false,"internalType":"uint256","name":"_sealState","type":"uint256"}],"name":"SealStateChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"initiator","type":"address"},{"indexed":true,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"fee","type":"uint256"}],"name":"Swap","type":"event"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feePpm","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"fees","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"getQuote","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"isSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"quoter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_state","type":"uint256"}],"name":"seal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"name":"setFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_quoter","type":"address"}],"name":"setQuoter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"_sum","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenLimiter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenRegistry","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bool","name":"_deduct_fee","type":"bool"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_outToken","type":"address"},{"internalType":"address","name":"_inToken","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"withdraw_less_fee","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"userdoc":{"kind":"user","methods":{},"version":1}},"settings":{"compilationTarget":{"SwapPool.sol":"SwapPool"},"evmVersion":"byzantium","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":false,"runs":200},"remappings":[]},"sources":{"SwapPool.sol":{"keccak256":"0x2754346f8597439ea78849de0f800dd21355f548e5f71487b7ba199703a44ac4","license":"AGPL-3.0-or-later","urls":["bzz-raw://e6c16f09dad445a06db1128809bea98b0d03360145c6a83d31c6c704c78d963e","dweb:/ipfs/QmePDiRrTRg381HTzQ4MPHUtcJtFyjEiDB27NeULxEJgWH"]}},"version":1} diff --git a/python/tests/test_fee.py b/python/tests/test_fee.py @@ -56,9 +56,16 @@ class TestPoolFee(TestERC20Pool): r = self.rpc.do(o) self.assertEqual(int(r, 16), 990) - nonce_oracle = RPCNonceOracle(self.accounts[2], conn=self.conn) c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) - (tx_hash, o) = c.withdraw(self.pool_address, self.accounts[2], self.foo_address) + (tx_hash, o) = c.withdraw(self.pool_address, self.accounts[1], self.foo_address) + self.rpc.do(o) + o = receipt(tx_hash) + r = self.conn.do(o) + self.assertEqual(r['status'], 0) + + nonce_oracle = RPCNonceOracle(self.accounts[0], conn=self.conn) + c = Pool(self.chain_spec, signer=self.signer, nonce_oracle=nonce_oracle) + (tx_hash, o) = c.withdraw(self.pool_address, self.accounts[0], self.foo_address) self.rpc.do(o) o = receipt(tx_hash) r = self.conn.do(o) diff --git a/solidity/Makefile b/solidity/Makefile @@ -1,13 +1,14 @@ SOLC = /usr/local/bin/solc +EVM_VERSION = byzantium all: - $(SOLC) --bin SwapPool.sol --evm-version istanbul | awk 'NR>3' > SwapPool.bin - $(SOLC) --abi SwapPool.sol --evm-version istanbul | awk 'NR>3' > SwapPool.json - $(SOLC) --metadata SwapPool.sol --evm-version istanbul | awk 'NR>3' > SwapPool.metadata.json + $(SOLC) --bin SwapPool.sol --evm-version $(EVM_VERSION)| awk 'NR>3' > SwapPool.bin + $(SOLC) --abi SwapPool.sol --evm-version $(EVM_VERSION) | awk 'NR>3' > SwapPool.json + $(SOLC) --metadata SwapPool.sol --evm-version $(EVM_VERSION) | awk 'NR>3' > SwapPool.metadata.json truncate -s -1 SwapPool.bin - $(SOLC) --bin DecimalQuote.sol --evm-version istanbul | awk 'NR>3' > DecimalQuote.bin - $(SOLC) --abi DecimalQuote.sol --evm-version istanbul | awk 'NR>3' > DecimalQuote.json - $(SOLC) --metadata DecimalQuote.sol --evm-version istanbul | awk 'NR>3' > DecimalQuote.metadata.json + $(SOLC) --bin DecimalQuote.sol --evm-version $(EVM_VERSION) | awk 'NR>3' > DecimalQuote.bin + $(SOLC) --abi DecimalQuote.sol --evm-version $(EVM_VERSION) | awk 'NR>3' > DecimalQuote.json + $(SOLC) --metadata DecimalQuote.sol --evm-version $(EVM_VERSION) | awk 'NR>3' > DecimalQuote.metadata.json truncate -s -1 DecimalQuote.bin install: all diff --git a/solidity/SwapPool.sol b/solidity/SwapPool.sol @@ -163,7 +163,7 @@ contract SwapPool { return quote; } - function withdraw(address _outToken, address _inToken, uint256 _value) public { + function withdraw_less_fee(address _outToken, address _inToken, uint256 _value) public { bool r; bytes memory v; uint256 balance; @@ -197,6 +197,46 @@ contract SwapPool { emit Swap(msg.sender, _inToken, _outToken, _value, outValue, fee); } + function withdraw(address _outToken, address _inToken, uint256 _value) public { + bool r; + bytes memory v; + uint256 netValue; + uint256 outValue; + uint256 balance; + uint256 fee; + + fee = getFee(_value); + netValue = _value - fee; + netValue = getQuote(_outToken, _inToken, netValue); + + (r, v) = _outToken.call(abi.encodeWithSignature("balanceOf(address)", this)); + require(r, "ERR_TOKEN"); + balance = abi.decode(v, (uint256)); + outValue = netValue + fee; + require(balance >= outValue, "ERR_BALANCE"); + + deposit(_inToken, _value); + + (r, v) = _outToken.call(abi.encodeWithSignature('transfer(address,uint256)', msg.sender, netValue)); + require(r, "ERR_TOKEN"); + r = abi.decode(v, (bool)); + require(r, "ERR_TRANSFER"); + + if (feeAddress != address(0)) { + fees[_outToken] += fee; + } + + emit Swap(msg.sender, _inToken, _outToken, _value, outValue, fee); + } + + function withdraw(address _outToken, address _inToken, uint256 _value, bool _deduct_fee) public { + if (_deduct_fee) { + withdraw_less_fee(_outToken, _inToken, _value); + } else { + withdraw(_outToken, _inToken, _value); + } + } + // Withdraw token to fee address function withdraw(address _outToken) public returns (uint256) { uint256 balance;