UNPKG

@settlemint/solidity-zeto

Version:

Smart contract set to build Zero Knowledge tokens in SettleMint

725 lines 64.9 kB
{ "_format": "hh-sol-artifact-1", "contractName": "Zeto_AnonNullifier", "sourceName": "contracts/zeto_anon_nullifier.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": [ { "internalType": "uint256", "name": "root", "type": "uint256" } ], "name": "UTXORootNotFound", "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": true, "internalType": "address", "name": "submitter", "type": "address" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "UTXOTransfer", "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" } ], "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": "nullifiers", "type": "uint256[]" }, { "internalType": "uint256", "name": "output", "type": "uint256" }, { "internalType": "uint256", "name": "root", "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": "_withdrawWithNullifiers", "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": [], "name": "getRoot", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "initialOwner", "type": "address" }, { "internalType": "contract Groth16Verifier_AnonNullifier", "name": "_verifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckHashesValue", "name": "_depositVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckNullifierValue", "name": "_withdrawVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_AnonNullifierBatch", "name": "_batchVerifier", "type": "address" }, { "internalType": "contract Groth16Verifier_CheckNullifierValueBatch", "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": "nullifiers", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "outputs", "type": "uint256[]" }, { "internalType": "uint256", "name": "root", "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": "nullifiers", "type": "uint256[]" }, { "internalType": "uint256", "name": "output", "type": "uint256" }, { "internalType": "uint256", "name": "root", "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": "0x60a0806040523460295730608052612e7d908161002f82396080518181816105e401526114c50152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806312c0fed21461012757806322414cf3146101225780634f1ef2861461011d57806352d1902d146101185780635ca1e16514610113578063715018a61461010e57806373295241146101095780638bb2513b146101045780638da5cb5b146100ff5780639b2e8b52146100fa5780639e2a7194146100f55780639fcc50af146100f0578063ad3cb1cc146100eb578063c29a6fda146100e6578063cc2a9a5b146100e1578063f2fde38b146100dc5763f756356a146100d757600080fd5b610e12565b610de5565b610b46565b610add565b610a49565b6109e0565b6109c6565b61093f565b6108ec565b610889565b610836565b610710565b61065e565b6105bc565b610535565b610471565b6101c1565b60031961010091011261013e57600490565b600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61010091011261013e57606490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261013e57604490565b73ffffffffffffffffffffffffffffffffffffffff81160361013e57565b3461013e5761012060031936011261013e5761032b6101df3661012c565b6102eb61010435916101f0836101a3565b61025760c06102006101006103be565b833581529260208101356020850152610243610236604083018035604088015261022a8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e082015260405161028081610272602082019485611da9565b03601f198101835282610396565b51902073ffffffffffffffffffffffffffffffffffffffff6102c96102af836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1615801561032d575b6102db90610e3c565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b506102db6103486102af836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff16331490506102d2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176103b957604052565b610367565b906103cc6040519283610396565b565b67ffffffffffffffff81116103b95760051b60200190565b9080601f8301121561013e5781356103fd816103ce565b9261040b6040519485610396565b81845260208085019260051b82010192831161013e57602001905b8282106104335750505090565b8135815260209182019101610426565b9181601f8401121561013e5782359167ffffffffffffffff831161013e576020838186019501011161013e57565b3461013e5761018060031936011261013e5760043567ffffffffffffffff811161013e576104a39036906004016103e6565b60243567ffffffffffffffff811161013e576104c39036906004016103e6565b90604435916104d136610143565b91610164359267ffffffffffffffff841161013e57610515946104fb610503953690600401610443565b9490936111f1565b60405190151581529081906020820190565b0390f35b67ffffffffffffffff81116103b957601f01601f191660200190565b604060031936011261013e5760043561054d816101a3565b6024359067ffffffffffffffff821161013e573660238301121561013e5781600401359061057a82610519565b916105886040519384610396565b808352366024828601011161013e57602081600092602461032b970183870137840101526114ac565b600091031261013e57565b3461013e57600060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106345760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e57600060031936011261013e576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af4801561070b57610515916000916106dc575b506040519081529081906020820190565b6106fe915060203d602011610704575b6106f68183610396565b81019061165c565b386106cb565b503d6106ec565b611061565b3461013e57600060031936011261013e57610729612598565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b61018060031982011261013e576004359160243567ffffffffffffffff811161013e57826107fe916004016103e6565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261013e57608490565b3461013e5761032b61088461086f61084d366107ce565b9261085e8197959692939751611130565b908761086983610fa2565b52611dd6565b9590809561087e848984611f68565b5061172e565b612459565b3461013e57604060031936011261013e5760043567ffffffffffffffff811161013e576108ba9036906004016103e6565b6024359067ffffffffffffffff821161013e576108de61032b923690600401610443565b916108e7612598565b61262b565b3461013e57600060031936011261013e57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461013e5761016060031936011261013e5760243560043561096036610173565b906101443567ffffffffffffffff811161013e57839261098761098f923690600401610443565b949093611c9f565b604080519061099e8183610396565b60018252601f19013660208301378051156109c15761032b93602082015261262b565b610f73565b3461013e5761032b6109d7366107ce565b9392909261172e565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610a12816101a3565b610a1a612944565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455600080f35b3461013e57600060031936011261013e576040805190610a698183610396565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b828110610ac65750506000828201840152601f01601f19168101030190f35b602082820181015187830187015286945001610aa7565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610b0f816101a3565b610b17612598565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555600080f35b3461013e5760c060031936011261013e57600435610b63816101a3565b60243590610b70826101a3565b604435610b7c816101a3565b606435610b88816101a3565b60843590610b95826101a3565b60a43592610ba2846101a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610be860ff60408a901c16159867ffffffffffffffff1690565b1680159081610ddd575b6001149081610dd3575b159081610dca575b50610da057610c859587610c7c60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610d255761198b565b610c8b57005b610cf67fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610d9b680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61198b565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610c04565b303b159150610bfc565b889150610bf2565b3461013e57602060031936011261013e5761032b600435610e05816101a3565b610e0d612598565b611b61565b3461013e5761014060031936011261013e5761032b600435602435610e3636610173565b91611c9f565b15610e4357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b15610ece57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964207472616e73616374696f6e2070726f706f73616c000000006044820152fd5b6040519060e0610f3c8184610396565b368337565b604051906103e0610f3c8184610396565b604051906102e0610f3c8184610396565b604090815191610f3c8184610396565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156109c15760200190565b80518210156109c15760209160051b010190565b9060078110156109c15760051b0190565b9081602091031261013e5751801515810361013e5790565b906000905b60028210610ffe57505050565b6040808281866001953701930191019091610ff1565b9094939260409061103461010094836101e0860199863783850190610fec565b60c0830137016000905b6007821061104b57505050565b602080600192855181520193019101909161103e565b6040513d6000823e3d90fd5b1561107457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b90601f8110156109c15760051b0190565b9094939260409061110361010094836104e0860199863783850190610fec565b60c0830137016000905b601f821061111a57505050565b602080600192855181520193019101909161110d565b9061113a826103ce565b6111476040519182610396565b828152601f1961115782946103ce565b0190602036910137565b906020808351928381520192019060005b81811061117f5750505090565b8251845260209384019390920191600101611172565b601f8260209493601f19938186528686013760008582860101520116010190565b92906111ee94926111d26111e092606087526060870190611161565b908582036020870152611161565b926040818503910152611195565b90565b906111fe91969396611dd6565b95909161121461120f828986611f68565b610ec7565b600283511180156114a1575b156113d7576112309087846123a0565b90611239610f41565b9160005b601f81106113b85750506112c99160209161128961127060395473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f44a173dd00000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016110e3565b03915afa801561070b576112e591600091611389575b5061106d565b6112ef8582612459565b6112f98151611130565b916113048651611130565b9360005b8351811015611346578061131e60019286610faf565b516113298288610faf565b52611334818a610faf565b5161133f8289610faf565b5201611308565b5092946113819196507fcb56a7130431b68e0e636f24584d40580490c1bf882bef3701f317d47ba98c389492506040519384933397856111b6565b0390a2600190565b6113ab915060203d6020116113b1575b6113a38183610396565b810190610fd4565b386112df565b503d611399565b806113c560019284610faf565b516113d082876110d2565b520161123d565b6113e29087846122c2565b906113eb610f2c565b9160005b600781106114825750506114629160209161142261127060385473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fc894e75700000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611014565b03915afa801561070b5761147d91600091611389575061106d565b6112e5565b8061148f60019284610faf565b5161149a8287610fc3565b52016113ef565b506002875111611220565b909173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001680301490811561161a575b50610634576114fd612598565b604051927f52d1902d00000000000000000000000000000000000000000000000000000000845260208460048173ffffffffffffffffffffffffffffffffffffffff87165afa600094816115f9575b50611596577f4c9c8ce30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260245b6000fd5b90917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc84036115ca576103cc929350612b70565b7faa1d49a400000000000000000000000000000000000000000000000000000000600052600484905260246000fd5b61161391955060203d602011610704576106f68183610396565b933861154c565b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54161415386114f0565b9081602091031261013e575190565b9060178110156109c15760051b0190565b9094939260409061169c61010094836103e0860199863783850190610fec565b60c0830137016000905b601782106116b357505050565b60208060019285518152019301910190916116a6565b156116d057565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4661696c656420746f207472616e7366657220455243323020746f6b656e73006044820152fd5b9392909160028351116000146118fa5760178351116118cb57611751928561288a565b9061175a610f52565b9160005b601781106118ac5750506117d19160209161179161127060375473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fa0c2a19a00000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161167c565b03915afa801561070b576000926117f461185a926020948691611895575061106d565b61181661127060355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101929092529093849283919082906044820190565b03925af1801561070b576103cc91600091611876575b506116c9565b61188f915060203d6020116113b1576113a38183610396565b38611870565b6113ab9150853d87116113b1576113a38183610396565b806118b960019284610faf565b516118c4828761166b565b520161175e565b7f71798fb500000000000000000000000000000000000000000000000000000000600052601760045260246000fd5b61190492856127a8565b9061190d610f2c565b9160005b6007811061196c5750506119449160209161142261127060365473ffffffffffffffffffffffffffffffffffffffff1690565b03915afa801561070b5760009261196761185a926020948691611895575061106d565b6117f4565b8061197960019284610faf565b516119848287610fc3565b5201611911565b6119b59095939592919261199d612944565b6119a5612944565b6119ad612944565b610e0d612944565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__92833b1561013e576000604494604051958680927f9e43b81300000000000000000000000000000000000000000000000000000000825260016004830152604060248301525af493841561070b576103cc9673ffffffffffffffffffffffffffffffffffffffff80948193611b0e98611b4f575b50611a47612944565b611a4f612944565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655167fffffffffffffffffffffffff0000000000000000000000000000000000000000603754161760375573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006039541617603955565b6000611b5a91610396565b6000611a3e565b73ffffffffffffffffffffffffffffffffffffffff168015611c235773ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054827fffffffffffffffffffffffff00000000000000000000000000000000000000008216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b90949392604090611c726101009483610140860199863783850190610fec565b60c0830137016000905b60028210611c8957505050565b6020806001928551815201930191019091611c7c565b91611d1a91602091611caf610f63565b858152916020830152611cda61127060345473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff5c9d69e00000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611c52565b03915afa801561070b57600092611d3d61185a926020948691611895575061106d565b611d5f61127060355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101929092529093849283919082906064820190565b906000825b60088210611dc0575050506101000190565b6020806001928551815201930191019091611dae565b9190918051908351600a83118015611e5a575b611e2b5760026111ee9311908115611e20575b5015611e1457611e0e600a809261299d565b9361299d565b611e0e6002809261299d565b600291501138611dfc565b7f9ebbc98e00000000000000000000000000000000000000000000000000000000600052600a60045260246000fd5b50600a8111611de9565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8201918211611ec057565b611e64565b908160a091031261013e5760405190600060a0830167ffffffffffffffff8111848210176103b95760405281516003811015611f2b5790608092918452602082015160208501526040820151604085015260608201516060850152500151608082015290565b5080fd5b60031115611f3957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b90611f7591939293612a08565b60009291925b835181101561208357611f8e8185610faf565b511561207b5780151580612056575b61201c576001611fd3611fce611fc7611fb68589610faf565b516000526033602052604060002090565b5460ff1690565b151590565b14611fe2576001905b01611f7b565b611fef6115929185610faf565b517f41a06d2800000000000000000000000000000000000000000000000000000000600052600452602490565b6120296115929185610faf565b517fdd57483100000000000000000000000000000000000000000000000000000000600052600452602490565b506120618185610faf565b5161207461206e83611e93565b86610faf565b5114611f9d565b600190611fdc565b50915073__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__9060005b83518110156121e1576120b28185610faf565b51156121d957801515806121ba575b61201c5761211c60a06120dd6120d78488610faf565b51612ac6565b604051809381927fe170cf6e00000000000000000000000000000000000000000000000000000000835260048301919060206040840193600181520152565b0381875af490811561070b5760009161218c575b505161213b81611f2f565b61214481611f2f565b612152576001905b0161209f565b61215f6115929185610faf565b517f79e1da4700000000000000000000000000000000000000000000000000000000600052600452602490565b6121ad915060a03d81116121b3575b6121a58183610396565b810190611ec5565b38612130565b503d61219b565b506121c58185610faf565b516121d261206e83611e93565b51146120c1565b60019061214c565b50929150602060405180927f92f5b06c000000000000000000000000000000000000000000000000000000008252818061222a8760048301919060206040840193600181520152565b03915af490811561070b57600091612276575b50156122495750600190565b7f4acd7ab80000000000000000000000000000000000000000000000000000000060005260045260246000fd5b61228f915060203d6020116113b1576113a38183610396565b3861223d565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114611ec05760010190565b6122cc6007611130565b91600094855b835181101561230357806122e860019286610faf565b516122fc6122f58a612295565b9988610faf565b52016122d2565b50909361231961231287612295565b9685610faf565b5260005b8251811015612361578061233360019285610faf565b5161235a576000965b61235360ff61234a83612295565b99169187610faf565b520161231d565b819661233c565b5092905060005b8151811015612399578061237e60019284610faf565b5161239261238b88612295565b9786610faf565b5201612368565b5090925050565b6123aa601f611130565b91600094855b83518110156123da57806123c660019286610faf565b516123d36122f58a612295565b52016123b0565b5090936123e961231287612295565b5260005b8251811015612428578061240360019285610faf565b51612421576000965b61241a60ff61234a83612295565b52016123ed565b819661240c565b5092905060005b8151811015612399578061244560019284610faf565b5161245261238b88612295565b520161242f565b91909160005b81518110156124c1578061247560019284610faf565b51612481575b0161245f565b6124bc612491611fb68386610faf565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b61247b565b505060005b8251811015612593576124d98184610faf565b516124e7575b6001016124c6565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__906125078185610faf565b516125128286610faf565b51833b1561013e576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810192909252604482015291600090839060649082905af491821561070b57600192612578575b5090506124df565b80612587600061258d93610396565b806105b1565b38612570565b509050565b73ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300541633036125d857565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b9161261d6111ee9492604085526040850190611161565b926020818503910152611195565b90919260009373__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__945b835181101561276b5761265b8185610faf565b519081156127625761267160a06120dd84612ac6565b03818b5af490811561070b57600091612744575b505161269081611f2f565b61269981611f2f565b61271557863b1561013e576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810183905260448101929092526000826064818a5af491821561070b57600192612700575b505b01612648565b80612587600061270f93610396565b386126f8565b7f79e1da4700000000000000000000000000000000000000000000000000000000600052600482905260246000fd5b61275c915060a03d81116121b3576121a58183610396565b38612685565b600191506126fa565b509093507f7ff08e0ca1fce6b202b83128811e4f6ceda54930aa074cd365bf68f95c20ce1991926127a3604051928392339684612606565b0390a2565b90926127b46007611130565b9360019182936127c387610fa2565b52826000815b612854575b50506127e36127dc85612295565b9487610faf565b526000825b612808575b505050806127fd61280492612295565b5083610faf565b5290565b815181101561284f5790828261281f829484610faf565b51612848576000955b61283f60ff61283683612295565b9816918a610faf565b520190916127e8565b8195612828565b6127ed565b83518110156128855780612869839286610faf565b5161287d61287689612295565b988b610faf565b5201816127c9565b6127ce565b90926128966017611130565b9360019182936128a587610fa2565b52826000815b612915575b50506128be6127dc85612295565b526000825b6128d757505050806127fd61280492612295565b815181101561284f579082826128ee829484610faf565b5161290e576000955b61290560ff61283683612295565b520190916128c3565b81956128f7565b835181101561293f578061292a839286610faf565b5161293761287689612295565b5201816128ab565b6128b0565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561297357565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b9181835114612a04576129af82611130565b9060005b84518110156129db57806129c960019287610faf565b516129d48286610faf565b52016129b3565b5092919091515b8181106129ee57505090565b8060006129fd60019386610faf565b52016129e2565b9050565b9190612a148351611130565b90612a1f8151611130565b9060005b8551811015612a4b5780612a3960019288610faf565b51612a448287610faf565b5201612a23565b50919290935060005b8251811015612a7c5780612a6a60019285610faf565b51612a758288610faf565b5201612a54565b50919050612a8981612cec565b50612a9383612cec565b509190565b919060608301926000905b60038210612ab057505050565b6020806001928551815201930191019091612aa3565b604051606081019080821067ffffffffffffffff8311176103b957612b2c926020926040528082528282015260016040820152604051809381927f25cc70e800000000000000000000000000000000000000000000000000000000835260048301612a98565b038173__$03320550cd1b629da90608251571b2532e$__5af490811561070b57600091612b57575090565b6111ee915060203d602011610704576106f68183610396565b90813b15612c625773ffffffffffffffffffffffffffffffffffffffff8216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612c2f57612c2c91612ca6565b50565b505034612c3857565b7fb398979f0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f4c9c8ce3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6000806111ee93602081519101845af43d15612ce4573d91612cc783610519565b92612cd56040519485610396565b83523d6000602085013e612d04565b606091612d04565b6111ee60016020835160051b84010160208401612da1565b90612d435750805115612d1957805190602001fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580612d98575b612d54575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15612d4c565b9190604083820310612e425782519282818095602084015b858110612ddf5750508251815184528152612dd392612da1565b60206103cc9301612da1565b91509150805185600114612e1c577f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b8211612e2f575b60200184918691612db9565b6020909501805186518252865294612e23565b50505056fea26469706673582212205ec1e6e245833394786c7ca9b035d4e6632c461c4a8556b5d8e0f220f0287e0064736f6c634300081b0033", "deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806312c0fed21461012757806322414cf3146101225780634f1ef2861461011d57806352d1902d146101185780635ca1e16514610113578063715018a61461010e57806373295241146101095780638bb2513b146101045780638da5cb5b146100ff5780639b2e8b52146100fa5780639e2a7194146100f55780639fcc50af146100f0578063ad3cb1cc146100eb578063c29a6fda146100e6578063cc2a9a5b146100e1578063f2fde38b146100dc5763f756356a146100d757600080fd5b610e12565b610de5565b610b46565b610add565b610a49565b6109e0565b6109c6565b61093f565b6108ec565b610889565b610836565b610710565b61065e565b6105bc565b610535565b610471565b6101c1565b60031961010091011261013e57600490565b600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9c61010091011261013e57606490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261013e57604490565b73ffffffffffffffffffffffffffffffffffffffff81160361013e57565b3461013e5761012060031936011261013e5761032b6101df3661012c565b6102eb61010435916101f0836101a3565b61025760c06102006101006103be565b833581529260208101356020850152610243610236604083018035604088015261022a8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e082015260405161028081610272602082019485611da9565b03601f198101835282610396565b51902073ffffffffffffffffffffffffffffffffffffffff6102c96102af836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1615801561032d575b6102db90610e3c565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b506102db6103486102af836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff16331490506102d2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176103b957604052565b610367565b906103cc6040519283610396565b565b67ffffffffffffffff81116103b95760051b60200190565b9080601f8301121561013e5781356103fd816103ce565b9261040b6040519485610396565b81845260208085019260051b82010192831161013e57602001905b8282106104335750505090565b8135815260209182019101610426565b9181601f8401121561013e5782359167ffffffffffffffff831161013e576020838186019501011161013e57565b3461013e5761018060031936011261013e5760043567ffffffffffffffff811161013e576104a39036906004016103e6565b60243567ffffffffffffffff811161013e576104c39036906004016103e6565b90604435916104d136610143565b91610164359267ffffffffffffffff841161013e57610515946104fb610503953690600401610443565b9490936111f1565b60405190151581529081906020820190565b0390f35b67ffffffffffffffff81116103b957601f01601f191660200190565b604060031936011261013e5760043561054d816101a3565b6024359067ffffffffffffffff821161013e573660238301121561013e5781600401359061057a82610519565b916105886040519384610396565b808352366024828601011161013e57602081600092602461032b970183870137840101526114ac565b600091031261013e57565b3461013e57600060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106345760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e57600060031936011261013e576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af4801561070b57610515916000916106dc575b506040519081529081906020820190565b6106fe915060203d602011610704575b6106f68183610396565b81019061165c565b386106cb565b503d6106ec565b611061565b3461013e57600060031936011261013e57610729612598565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b61018060031982011261013e576004359160243567ffffffffffffffff811161013e57826107fe916004016103e6565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261013e57608490565b3461013e5761032b61088461086f61084d366107ce565b9261085e8197959692939751611130565b908761086983610fa2565b52611dd6565b9590809561087e848984611f68565b5061172e565b612459565b3461013e57604060031936011261013e5760043567ffffffffffffffff811161013e576108ba9036906004016103e6565b6024359067ffffffffffffffff821161013e576108de61032b923690600401610443565b916108e7612598565b61262b565b3461013e57600060031936011261013e57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461013e5761016060031936011261013e5760243560043561096036610173565b906101443567ffffffffffffffff811161013e57839261098761098f923690600401610443565b949093611c9f565b604080519061099e8183610396565b60018252601f19013660208301378051156109c15761032b93602082015261262b565b610f73565b3461013e5761032b6109d7366107ce565b9392909261172e565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610a12816101a3565b610a1a612944565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455600080f35b3461013e57600060031936011261013e576040805190610a698183610396565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b828110610ac65750506000828201840152601f01601f19168101030190f35b602082820181015187830187015286945001610aa7565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610b0f816101a3565b610b17612598565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555600080f35b3461013e5760c060031936011261013e57600435610b63816101a3565b60243590610b70826101a3565b604435610b7c816101a3565b606435610b88816101a3565b60843590610b95826101a3565b60a43592610ba2846101a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610be860ff60408a901c16159867ffffffffffffffff1690565b1680159081610ddd575b6001149081610dd3575b159081610dca575b50610da057610c859587610c7c60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610d255761198b565b610c8b57005b610cf67fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610d9b680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b61198b565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610c04565b303b159150610bfc565b889150610bf2565b3461013e57602060031936011261013e5761032b600435610e05816101a3565b610e0d612598565b611b61565b3461013e5761014060031936011261013e5761032b600435602435610e3636610173565b91611c9f565b15610e4357565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b15610ece57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964207472616e73616374696f6e2070726f706f73616c000000006044820152fd5b6040519060e0610f3c8184610396565b368337565b604051906103e0610f3c8184610396565b604051906102e0610f3c8184610396565b604090815191610f3c8184610396565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8051156109c15760200190565b80518210156109c15760209160051b010190565b9060078110156109c15760051b0190565b9081602091031261013e5751801515810361013e5790565b906000905b60028210610ffe57505050565b6040808281866001953701930191019091610ff1565b9094939260409061103461010094836101e0860199863783850190610fec565b60c0830137016000905b6007821061104b57505050565b602080600192855181520193019101909161103e565b6040513d6000823e3d90fd5b1561107457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b90601f8110156109c15760051b0190565b9094939260409061110361010094836104e0860199863783850190610fec565b60c0830137016000905b601f821061111a57505050565b602080600192855181520193019101909161110d565b9061113a826103ce565b6111476040519182610396565b828152601f1961115782946103ce565b0190602036910137565b906020808351928381520192019060005b81811061117f5750505090565b8251845260209384019390920191600101611172565b601f8260209493601f19938186528686013760008582860101520116010190565b92906111ee94926111d26111e092606087526060870190611161565b908582036020870152611161565b926040818503910152611195565b90565b906111fe91969396611dd6565b95909161121461120f828986611f68565b610ec7565b600283511180156114a1575b156113d7576112309087846123a0565b90611239610f41565b9160005b601f81106113b85750506112c99160209161128961127060395473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f44a173dd00000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016110e3565b03915afa801561070b576112e591600091611389575b5061106d565b6112ef8582612459565b6112f98151611130565b916113048651611130565b9360005b8351811015611346578061131e60019286610faf565b516113298288610faf565b52611334818a610faf565b5161133f8289610faf565b5201611308565b5092946113819196507fcb56a7130431b68e0e636f24584d40580490c1bf882bef3701f317d47ba98c389492506040519384933397856111b6565b0390a2600190565b6113ab915060203d6020116113b1575b6113a38183610396565b810190610fd4565b386112df565b503d611399565b806113c56001