UNPKG

@settlemint/solidity-zeto

Version:

Smart contract set to build Zero Knowledge tokens in SettleMint

761 lines 63 kB
{ "_format": "hh-sol-artifact-1", "contractName": "Zeto_AnonEnc", "sourceName": "contracts/zeto_anon_enc.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "target", "type": "address" } ], "name": "AddressEmptyCode", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "implementation", "type": "address" } ], "name": "ERC1967InvalidImplementation", "type": "error" }, { "inputs": [], "name": "ERC1967NonPayable", "type": "error" }, { "inputs": [], "name": "FailedCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "addr", "type": "address" } ], "name": "IdentityNotRegistered", "type": "error" }, { "inputs": [], "name": "InvalidInitialization", "type": "error" }, { "inputs": [], "name": "NotInitializing", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "owner", "type": "address" } ], "name": "OwnableInvalidOwner", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "OwnableUnauthorizedAccount", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "utxo", "type": "uint256" } ], "name": "UTXOAlreadyOwned", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "utxo", "type": "uint256" } ], "name": "UTXOAlreadySpent", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "maxAllowed", "type": "uint256" } ], "name": "UTXOArrayTooLarge", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "utxo", "type": "uint256" } ], "name": "UTXODuplicate", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "utxo", "type": "uint256" } ], "name": "UTXONotMinted", "type": "error" }, { "inputs": [], "name": "UUPSUnauthorizedCallContext", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "slot", "type": "bytes32" } ], "name": "UUPSUnsupportedProxiableUUID", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "maxAllowed", "type": "uint256" } ], "name": "WithdrawArrayTooLarge", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint64", "name": "version", "type": "uint64" } ], "name": "Initialized", "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": false, "internalType": "uint256[]", "name": "outputs", "type": "uint256[]" }, { "indexed": true, "internalType": "address", "name": "submitter", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "UTXOMint", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256[]", "name": "inputs", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256[]", "name": "outputs", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256", "name": "encryptionNonce", "type": "uint256" }, { "indexed": false, "internalType": "uint256[2]", "name": "ecdhPublicKey", "type": "uint256[2]" }, { "indexed": false, "internalType": "uint256[]", "name": "encryptedValues", "type": "uint256[]" }, { "indexed": true, "internalType": "address", "name": "submitter", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "UTXOTransferWithEncryptedValues", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "implementation", "type": "address" } ], "name": "Upgraded", "type": "event" }, { "inputs": [], "name": "UPGRADE_INTERFACE_VERSION", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract Groth16Verifier_CheckHashesValue", "name": "_depositVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckInputsOutputsValue", "name": "_withdrawVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckInputsOutputsValueBatch", "name": "_batchWithdrawVerifier", "type": "address" } ], "name": "__ZetoFungibleWithdraw_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract Groth16Verifier_CheckHashesValue", "name": "_depositVerifier", "type": "address" } ], "name": "__ZetoFungible_init", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "utxo", "type": "uint256" }, { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" } ], "name": "_deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256[]", "name": "inputs", "type": "uint256[]" }, { "internalType": "uint256", "name": "output", "type": "uint256" }, { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" } ], "name": "_withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256", "name": "utxo", "type": "uint256" }, { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "deposit", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "initialOwner", "type": "address" }, { "internalType": "contract Groth16Verifier_AnonEnc", "name": "_verifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckHashesValue", "name": "_depositVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckInputsOutputsValue", "name": "_withdrawVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_AnonEncBatch", "name": "_batchVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckInputsOutputsValueBatch", "name": "_batchWithdrawVerifier", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" }, { "internalType": "address", "name": "delegate", "type": "address" } ], "name": "lockProof", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "utxos", "type": "uint256[]" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "mint", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "proxiableUUID", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract IERC20", "name": "_erc20", "type": "address" } ], "name": "setERC20", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "txo", "type": "uint256" } ], "name": "spent", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "inputs", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "outputs", "type": "uint256[]" }, { "internalType": "uint256", "name": "encryptionNonce", "type": "uint256" }, { "internalType": "uint256[2]", "name": "ecdhPublicKey", "type": "uint256[2]" }, { "internalType": "uint256[]", "name": "encryptedValues", "type": "uint256[]" }, { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "transfer", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newImplementation", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "upgradeToAndCall", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "uint256[]", "name": "inputs", "type": "uint256[]" }, { "internalType": "uint256", "name": "output", "type": "uint256" }, { "components": [ { "internalType": "uint256[2]", "name": "pA", "type": "uint256[2]" }, { "internalType": "uint256[2][2]", "name": "pB", "type": "uint256[2][2]" }, { "internalType": "uint256[2]", "name": "pC", "type": "uint256[2]" } ], "internalType": "struct Commonlib.Proof", "name": "proof", "type": "tuple" } ], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "bytecode": "0x60a0806040523460295730608052612cc3908161002f823960805181818161060e01526114160152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c80630107eb4a1461013757806312c0fed2146101325780634ad899291461012d5780634f1ef2861461012857806352d1902d14610123578063715018a61461011e578063788c0456146101195780638bb2513b146101145780638da5cb5b1461010f5780639b2e8b521461010a5780639fcc50af14610105578063ad3cb1cc14610100578063c29a6fda146100fb578063cc2a9a5b146100f6578063d5b5cc23146100f1578063e4e3842a146100ec578063f2fde38b146100e75763f756356a146100e257600080fd5b610e95565b610e68565b610d96565b610ce8565b610a49565b6109eb565b610957565b6108f9565b610877565b610824565b6107c1565b61073b565b610688565b6105e6565b61056a565b610534565b610290565b61015f565b73ffffffffffffffffffffffffffffffffffffffff81160361015a57565b600080fd5b3461015a57606060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff6004356101918161013c565b8160243561019e8161013c565b81604435936101ac8561013c565b6101b4611dd9565b6101bc611dd9565b1673ffffffffffffffffffffffffffffffffffffffff1960025416176002551673ffffffffffffffffffffffffffffffffffffffff1960045416176004551673ffffffffffffffffffffffffffffffffffffffff196005541617600555600080f35b60031961010091011261015a57600490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261015a57604490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c61010091011261015a5760c490565b3461015a5761012060031936011261015a576102ab3661021e565b6102c161010435916102bc8361013c565b611e5f565b9081600052600060205273ffffffffffffffffffffffffffffffffffffffff604060002054161580156103c6575b156103425761030b610340926000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff19825416179055565b005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b5081600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020541633146102ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761044557604052565b6103f3565b906104586040519283610422565b565b67ffffffffffffffff81116104455760051b60200190565b9080601f8301121561015a5781356104898161045a565b926104976040519485610422565b81845260208085019260051b82010192831161015a57602001905b8282106104bf5750505090565b81358152602091820191016104b2565b9061016060031983011261015a576004359160243567ffffffffffffffff811161015a578161050091600401610472565b916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c60443593011261015a57606490565b3461015a57610340610545366104cf565b9291909161112c565b67ffffffffffffffff811161044557601f01601f191660200190565b604060031936011261015a576004356105828161013c565b6024359067ffffffffffffffff821161015a573660238301121561015a578160040135906105af8261054e565b916105bd6040519384610422565b808352366024828601011161015a576020816000926024610340970183870137840101526113fd565b3461015a57600060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361065e5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461015a57600060031936011261015a576106a161201c565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015a57610749366104cf565b61075683949293516115bc565b9081511561078e57610774826103409686602061078996015261208a565b949080946107838488846121d0565b5061112c565b6124e4565b610f17565b9181601f8401121561015a5782359167ffffffffffffffff831161015a576020838186019501011161015a57565b3461015a57604060031936011261015a5760043567ffffffffffffffff811161015a576107f2903690600401610472565b6024359067ffffffffffffffff821161015a57610816610340923690600401610793565b9161081f61201c565b6125c2565b3461015a57600060031936011261015a57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461015a5761016060031936011261015a5760243560043561089836610230565b906101443567ffffffffffffffff811161015a5783926108bf6108c7923690600401610793565b949093611ccf565b60408051906108d68183610422565b60018252601f190136602083013780511561078e576103409360208201526125c2565b3461015a57602060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff60043561092b8161013c565b610933611dd9565b1673ffffffffffffffffffffffffffffffffffffffff196002541617600255600080f35b3461015a57600060031936011261015a5760408051906109778183610422565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b8281106109d45750506000828201840152601f01601f19168101030190f35b6020828201810151878301870152869450016109b5565b3461015a57602060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff600435610a1d8161013c565b610a2561201c565b1673ffffffffffffffffffffffffffffffffffffffff196003541617600355600080f35b3461015a5760c060031936011261015a57600435610a668161013c565b60243590610a738261013c565b604435610a7f8161013c565b606435610a8b8161013c565b60843590610a988261013c565b60a43592610aa58461013c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610aeb60ff60408a901c16159867ffffffffffffffff1690565b1680159081610ce0575b6001149081610cd6575b159081610ccd575b50610ca357610b889587610b7f60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610c28576115ed565b610b8e57005b610bf97fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610c9e680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b6115ed565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610b07565b303b159150610aff565b889150610af5565b3461015a57602060031936011261015a57600435600052600160205260ff604060002054166003811015610d255760405160029091148152602090f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b806083121561015a5760405190610d6c604083610422565b819060a41161015a576064905b60a48210610d8657505090565b8135815260209182019101610d79565b3461015a576101e060031936011261015a5760043567ffffffffffffffff811161015a57610dc8903690600401610472565b60243567ffffffffffffffff811161015a57610de8903690600401610472565b9060443591610df636610d54565b9160a43567ffffffffffffffff811161015a57610e17903690600401610472565b610e2036610260565b906101c4359467ffffffffffffffff861161015a57610e6496610e4a610e52973690600401610793565b969095611935565b60405190151581529081906020820190565b0390f35b3461015a57602060031936011261015a57610340600435610e888161013c565b610e9061201c565b611baa565b3461015a5761014060031936011261015a57610340600435602435610eb936610230565b91611ccf565b604051906080610ecf8184610422565b368337565b60405190610180610ecf8184610422565b604051906101e0610ecf8184610422565b604051906107e0610ecf8184610422565b604090815191610ecf8184610422565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805182101561078e5760209160051b010190565b90600481101561078e5760051b0190565b9081602091031261015a5751801515810361015a5790565b906000905b60028210610f9557505050565b6040808281866001953701930191019091610f88565b90949392604090610fcb6101009483610180860199863783850190610f83565b60c0830137016000905b60048210610fe257505050565b6020806001928551815201930191019091610fd5565b6040513d6000823e3d90fd5b1561100b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b90600c81101561078e5760051b0190565b9094939260409061109a6101009483610280860199863783850190610f83565b60c0830137016000905b600c82106110b157505050565b60208060019285518152019301910190916110a4565b156110ce57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4661696c656420746f207472616e7366657220455243323020746f6b656e73006044820152fd5b9291600282511160001461132c57600c8251116112fc5761114d9184611fc4565b90611156610ed4565b9160005b600c81106112dd5750506111e6916020916111a661118d60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f8cbac0fa00000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161107a565b03915afa80156112bb5760009261120a6112709260209486916112c0575b50611004565b61122c61118d60035473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101929092529093849283919082906044820190565b03925af180156112bb576104589160009161128c575b506110c7565b6112ae915060203d6020116112b4575b6112a68183610422565b810190610f6b565b38611286565b503d61129c565b610ff8565b6112d79150853d87116112b4576112a68183610422565b38611204565b806112ea60019284610f46565b516112f58287611069565b520161115a565b7f71798fb500000000000000000000000000000000000000000000000000000000600052600c60045260245b6000fd5b6113369184611f56565b9061133f610ebf565b9160005b600481106113de5750506113b69160209161137661118d60045473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f5fe8c13b00000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601610fab565b03915afa80156112bb576000926113d96112709260209486916112c05750611004565b61120a565b806113eb60019284610f46565b516113f68287610f5a565b5201611343565b909173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680301490811561157a575b5061065e5761144e61201c565b604051927f52d1902d00000000000000000000000000000000000000000000000000000000845260208460048173ffffffffffffffffffffffffffffffffffffffff87165afa60009481611549575b506114e6577f4c9c8ce30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260246000fd5b90917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc840361151a576104589293506128ce565b7faa1d49a400000000000000000000000000000000000000000000000000000000600052600484905260246000fd5b61156c91955060203d602011611573575b6115648183610422565b81019061200d565b933861149d565b503d61155a565b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141538611441565b906115c68261045a565b6115d36040519182610422565b828152601f196115e3829461045a565b0190602036910137565b9473ffffffffffffffffffffffffffffffffffffffff8094818094956116306104589a611618611dd9565b611620611dd9565b611628611dd9565b610e90611dd9565b611638611dd9565b611640611dd9565b1673ffffffffffffffffffffffffffffffffffffffff1960025416176002551673ffffffffffffffffffffffffffffffffffffffff1960045416176004551673ffffffffffffffffffffffffffffffffffffffff1960055416176005551673ffffffffffffffffffffffffffffffffffffffff1960065416176006556116f68173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff196007541617600755565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff196007541617600755565b60031115610d2557565b1561173d57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964207472616e73616374696f6e2070726f706f73616c000000006044820152fd5b90600f81101561078e5760051b0190565b909493926040906117cc61010094836102e0860199863783850190610f83565b60c0830137016000905b600f82106117e357505050565b60208060019285518152019301910190916117d6565b90603f81101561078e5760051b0190565b9094939260409061182a61010094836108e0860199863783850190610f83565b60c0830137016000905b603f821061184157505050565b6020806001928551815201930191019091611834565b906020808351928381520192019060005b8181106118755750505090565b8251845260209384019390920191600101611868565b906000905b6002821061189d57505050565b6020806001928551815201930191019091611890565b601f8260209493601f19938186528686013760008582860101520116010190565b95936119179061190761192495946118f96119329b999560e08c5260e08c0190611857565b908a820360208c0152611857565b936040890152606088019061188b565b85820360a0870152611857565b9260c08185039101526118b3565b90565b9061194791989594989792939761208a565b91909361195d6119588285886121d0565b611736565b60028551118015611b9f575b15611ad35761197b89898686896127fc565b90611984610ef6565b9160005b603f8110611ab45750506119fb916020916119bb61118d60075473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f7d40902600000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161180a565b03915afa80156112bb57611a1691600091611a9b5750611004565b611a2082856124e4565b611a2a88516115bc565b9560005b8951811015611a565780611a446001928c610f46565b51611a4f828b610f46565b5201611a2e565b5090919396611a9393959850957f18fd5042f65c100c3eb616143f0e3d2d83f7efe63df2a868b19f0b823c08a21b96604051968796339a886118d4565b0390a2600190565b6112d7915060203d6020116112b4576112a68183610422565b80611ac160019284610f46565b51611acc82876117f9565b5201611988565b611ae08989868689612715565b90611ae9610ee5565b9160005b600f8110611b80575050611b6091602091611b2061118d60065473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff054a9a300000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016117ac565b03915afa80156112bb57611b7b91600091611a9b5750611004565b611a16565b80611b8d60019284610f46565b51611b98828761179b565b5201611aed565b506002835111611969565b73ffffffffffffffffffffffffffffffffffffffff168015611c615773ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300548273ffffffffffffffffffffffffffffffffffffffff198216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b90600281101561078e5760051b0190565b604061045894611cc3610100949897958361014086019a863783850190610f83565b60c0830137019061188b565b91611d4a91602091611cdf610f07565b858152916020830152611d0a61118d60025473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff5c9d69e00000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611ca1565b03915afa80156112bb57600092611d6d6112709260209486916112c05750611004565b611d8f61118d60035473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101929092529093849283919082906064820190565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615611e0857565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b906000825b60088210611e49575050506101000190565b6020806001928551815201930191019091611e37565b611ec660c0611e6f61010061044a565b833581529260208101356020850152611eb2611ea56040830180356040880152611e998160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e0820152604051611eef81611ee1602082019485611e32565b03601f198101835282610422565b51902090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611f515760010190565b611ef5565b9290611f6260046115bc565b9160019483511561078e57602084015260005b8251811015611fa65780611f8b60019285610f46565b51611f9f611f9889611f24565b9887610f46565b5201611f75565b5093611fc09150929192611fb981611f24565b5083610f46565b5290565b9290611fd0600c6115bc565b9160019483511561078e57602084015260005b8251811015611fa65780611ff960019285610f46565b51612006611f9889611f24565b5201611fe3565b9081602091031261015a575190565b73ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416330361205c57565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b9190918051908351600a8311801561210e575b6120df57600261193293119081156120d4575b50156120c8576120c2600a80926129f9565b936129f9565b6120c2600280926129f9565b6002915011386120b0565b7f9ebbc98e00000000000000000000000000000000000000000000000000000000600052600a60045260246000fd5b50600a811161209d565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211611f5157565b1561214c57565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4c6f636b65642070726f6f662063616e206f6e6c79206265207375626d69747460448201527f656420627920746865206c6f636b6572206164647265737300000000000000006064820152fd5b906121da91612a64565b9290916000935b835185101561234a576121f48585610f46565b511561233f578415158061231a575b6122e05761222f6122286122178787610f46565b516000526001602052604060002090565b5460ff1690565b6122388161172c565b612276576113286122498686610f46565b517f8392512700000000000000000000000000000000000000000000000000000000600052600452602490565b909193600261228b6122286122178488610f46565b6122948161172c565b146122a6576001905b019391906121e1565b6122b36113289185610f46565b517f41a06d2800000000000000000000000000000000000000000000000000000000600052600452602490565b6113286122ed8686610f46565b517fdd57483100000000000000000000000000000000000000000000000000000000600052600452602490565b506123258585610f46565b5161233861233287612118565b86610f46565b5114612203565b90919360019061229d565b600094509250905b8251841015612449576123658484610f46565b511561243f578315158061241a575b61240d57600261238a6122286122178787610f46565b6123938161172c565b036123a5576113286122b38585610f46565b909260016123b96122286122178487610f46565b6123c28161172c565b146123d3576001905b019290612352565b6123e06113289184610f46565b517f79e1da4700000000000000000000000000000000000000000000000000000000600052600452602490565b6113286122ed8585610f46565b506124258484610f46565b5161243861243286612118565b85610f46565b5114612374565b90926001906123cb565b92506124559150611e5f565b73ffffffffffffffffffffffffffffffffffffffff61249b612481836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b166124a7575b50600190565b6124c16124816124de926000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff163314612145565b386124a1565b919060005b835181101561253b57806124ff60019286610f46565b5160005281602052604060002060027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055016124e9565b50915060005b8251811015612598578061255760019285610f46565b5160005281602052612592604060002060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b01612541565b509050565b916125b46119329492604085526040850190611857565b9260208185039101526118b3565b90926000925b82518410156126d9576125db8484610f46565b519360016125f6612228876000526001602052604060002090565b6125ff8161172c565b03612633577f79e1da4700000000000000000000000000000000000000000000000000000000600052600485905260246000fd5b909192936002612650612228836000526001602052604060002090565b6126598161172c565b146126ac57906126a36126786001936000526001602052604060002090565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b019291906125c8565b7f41a06d280000000000000000000000000000000000000000000000000000000060005260045260246000fd5b90937f7ff08e0ca1fce6b202b83128811e4f6ceda54930aa074cd365bf68f95c20ce1992935061271060405192839233968461259d565b0390a2565b949093919294612725600f6115bc565b93600096875b600281106127d457505060005b8451811015612769578061274e60019287610f46565b5161276261275b8b611f24565b9a89610f46565b5201612738565b50919490925060005b83518110156127a3578061278860019286610f46565b5161279c6127958a611f24565b9988610f46565b5201612772565b5091509260005b8251811015611fa657806127c060019285610f46565b516127cd611f9889611f24565b52016127aa565b806127e160019284611c90565b516127f56127ee8c611f24565b9b8a610f46565b520161272b565b94909391929461280c603f6115bc565b93600096875b600281106128ad57505060005b8451811015612849578061283560019287610f46565b5161284261275b8b611f24565b520161281f565b50919490925060005b835181101561287c578061286860019286610f46565b516128756127958a611f24565b5201612852565b5091509260005b8251811015611fa6578061289960019285610f46565b516128a6611f9889611f24565b5201612883565b806128ba60019284611c90565b516128c76127ee8c611f24565b5201612812565b90813b156129b55773ffffffffffffffffffffffffffffffffffffffff82168073ffffffffffffffffffffffffffffffffffffffff197f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a28051156129825761297f91612af4565b50565b50503461298b57565b7fb398979f0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f4c9c8ce3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b9181835114612a6057612a0b826115bc565b9060005b8451811015612a375780612a2560019287610f46565b51612a308286610f46565b5201612a0f565b5092919091515b818110612a4a57505090565b806000612a5960019386610f46565b5201612a3e565b9050565b9190612a7083516115bc565b90612a7b81516115bc565b9060005b8551811015612aa75780612a9560019288610f46565b51612aa08287610f46565b5201612a7f565b50919290935060005b8251811015612ad85780612ac660019285610f46565b51612ad18288610f46565b5201612ab0565b50919050612ae581612bd3565b50612aef83612bd3565b509190565b60008061193293602081519101845af43d15612b32573d91612b158361054e565b92612b236040519485610422565b83523d6000602085013e612b36565b6060915b90612b755750805115612b4b57805190602001fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580612bca575b612b86575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15612b7e565b61193260016020835160051b840101602084015b9190604083820310612c885782519282818095602084015b858110612c255750508251815184528152612c1992612be7565b60206104589301612be7565b91509150805185600114612c62577f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b8211612c75575b60200184918691612bff565b6020909501805186518252865294612c69565b50505056fea26469706673582212203daba91f351b78224a3fc0380266a487948557f55be3f82e2cf6125ededbf3cb64736f6c634300081b0033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c80630107eb4a1461013757806312c0fed2146101325780634ad899291461012d5780634f1ef2861461012857806352d1902d14610123578063715018a61461011e578063788c0456146101195780638bb2513b146101145780638da5cb5b1461010f5780639b2e8b521461010a5780639fcc50af14610105578063ad3cb1cc14610100578063c29a6fda146100fb578063cc2a9a5b146100f6578063d5b5cc23146100f1578063e4e3842a146100ec578063f2fde38b146100e75763f756356a146100e257600080fd5b610e95565b610e68565b610d96565b610ce8565b610a49565b6109eb565b610957565b6108f9565b610877565b610824565b6107c1565b61073b565b610688565b6105e6565b61056a565b610534565b610290565b61015f565b73ffffffffffffffffffffffffffffffffffffffff81160361015a57565b600080fd5b3461015a57606060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff6004356101918161013c565b8160243561019e8161013c565b81604435936101ac8561013c565b6101b4611dd9565b6101bc611dd9565b1673ffffffffffffffffffffffffffffffffffffffff1960025416176002551673ffffffffffffffffffffffffffffffffffffffff1960045416176004551673ffffffffffffffffffffffffffffffffffffffff196005541617600555600080f35b60031961010091011261015a57600490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261015a57604490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff3c61010091011261015a5760c490565b3461015a5761012060031936011261015a576102ab3661021e565b6102c161010435916102bc8361013c565b611e5f565b9081600052600060205273ffffffffffffffffffffffffffffffffffffffff604060002054161580156103c6575b156103425761030b610340926000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff19825416179055565b005b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b5081600052600060205273ffffffffffffffffffffffffffffffffffffffff6040600020541633146102ef565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761044557604052565b6103f3565b906104586040519283610422565b565b67ffffffffffffffff81116104455760051b60200190565b9080601f8301121561015a5781356104898161045a565b926104976040519485610422565b81845260208085019260051b82010192831161015a57602001905b8282106104bf5750505090565b81358152602091820191016104b2565b9061016060031983011261015a576004359160243567ffffffffffffffff811161015a578161050091600401610472565b916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c60443593011261015a57606490565b3461015a57610340610545366104cf565b9291909161112c565b67ffffffffffffffff811161044557601f01601f191660200190565b604060031936011261015a576004356105828161013c565b6024359067ffffffffffffffff821161015a573660238301121561015a578160040135906105af8261054e565b916105bd6040519384610422565b808352366024828601011161015a576020816000926024610340970183870137840101526113fd565b3461015a57600060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016300361065e5760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461015a57600060031936011261015a576106a161201c565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005473ffffffffffffffffffffffffffffffffffffffff1981167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b3461015a57610749366104cf565b61075683949293516115bc565b9081511561078e57610774826103409686602061078996015261208a565b949080946107838488846121d0565b5061112c565b6124e4565b610f17565b9181601f8401121561015a5782359167ffffffffffffffff831161015a576020838186019501011161015a57565b3461015a57604060031936011261015a5760043567ffffffffffffffff811161015a576107f2903690600401610472565b6024359067ffffffffffffffff821161015a57610816610340923690600401610793565b9161081f61201c565b6125c2565b3461015a57600060031936011261015a57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461015a5761016060031936011261015a5760243560043561089836610230565b906101443567ffffffffffffffff811161015a5783926108bf6108c7923690600401610793565b949093611ccf565b60408051906108d68183610422565b60018252601f190136602083013780511561078e576103409360208201526125c2565b3461015a57602060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff60043561092b8161013c565b610933611dd9565b1673ffffffffffffffffffffffffffffffffffffffff196002541617600255600080f35b3461015a57600060031936011261015a5760408051906109778183610422565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b8281106109d45750506000828201840152601f01601f19168101030190f35b6020828201810151878301870152869450016109b5565b3461015a57602060031936011261015a5773ffffffffffffffffffffffffffffffffffffffff600435610a1d8161013c565b610a2561201c565b1673ffffffffffffffffffffffffffffffffffffffff196003541617600355600080f35b3461015a5760c060031936011261015a57600435610a668161013c565b60243590610a738261013c565b604435610a7f8161013c565b606435610a8b8161013c565b60843590610a988261013c565b60a43592610aa58461013c565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610aeb60ff60408a901c16159867ffffffffffffffff1690565b1680159081610ce0575b6001149081610cd6575b159081610ccd575b50610ca357610b889587610b7f60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610c28576115ed565b610b8e57005b610bf97fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610c9e680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b6115ed565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610b07565b303b159150610aff565b889150610af5565b3461015a57602060031936011261015a57600435600052600160205260ff604060002054166003811015610d255760405160029091148152602090f35b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b806083121561015a5760405190610d6c604083610422565b819060a41161015a576064905b60a48210610d8657505090565b8135815260209182019101610d79565b3461015a576101e060031936011261015a5760043567ffffffffffffffff811161015a57610dc8903690600401610472565b60243567ffffffffffffffff811161015a57610de8903690600401610472565b9060443591610df636610d54565b9160a43567ffffffffffffffff811161015a57610e17903690600401610472565b610e2036610260565b906101c4359467ffffffffffffffff861161015a57610e6496610e4a610e52973690600401610793565b969095611935565b60405190151581529081906020820190565b0390f35b3461015a57602060031936011261015a57610340600435610e888161013c565b610e9061201c565b611baa565b3461015a5761014060031936011261015a57610340600435602435610eb936610230565b91611ccf565b604051906080610ecf8184610422565b368337565b60405190610180610ecf8184610422565b604051906101e0610ecf8184610422565b604051906107e0610ecf8184610422565b604090815191610ecf8184610422565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805182101561078e5760209160051b010190565b90600481101561078e5760051b0190565b9081602091031261015a5751801515810361015a5790565b906000905b60028210610f9557505050565b6040808281866001953701930191019091610f88565b90949392604090610fcb6101009483610180860199863783850190610f83565b60c0830137016000905b60048210610fe257505050565b6020806001928551815201930191019091610fd5565b6040513d6000823e3d90fd5b1561100b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b90600c81101561078e5760051b0190565b9094939260409061109a6101009483610280860199863783850190610f83565b60c0830137016000905b600c82106110b157505050565b60208060019285518152019301910190916110a4565b156110ce57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4661696c656420746f207472616e7366657220455243323020746f6b656e73006044820152fd5b9291600282511160001461132c57600c8251116112fc5761114d9184611fc4565b90611156610ed4565b9160005b600c81106112dd5750506111e6916020916111a661118d60055473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f8cbac0fa00000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161107a565b03915afa80156112bb5760009261120a6112709260209486916112c0575b50611004565b61122c61118d60035473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101929092529093849283919082906044820190565b03925af180156112bb576104589160009161128c575b506110c7565b6112ae915060203d6020116112b4575b6112a68183610422565b810190610f6b565b38611286565b503d61129c565b610ff8565b6112d79150853d87116112b4576112a68183610422565b38611204565b806112ea60019284610f46565b516112f58287611069565b520161115a565b7f71798fb500000000000000000000000000000000000000000000000000000000600052600c60045260245b6000fd5b6113369184611f56565b9061133f610ebf565b9160005b600481106113de5750506113b69160209161137661118d60045473ffffffffffffffffffffffffff