@settlemint/solidity-zeto
Version:
Smart contract set to build Zero Knowledge tokens in SettleMint
795 lines • 72.8 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "Zeto_AnonEncNullifierNonRepudiation",
"sourceName": "contracts/zeto_anon_enc_nullifier_non_repudiation.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": false,
"internalType": "uint256",
"name": "encryptionNonce",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256[2]",
"name": "ecdhPublicKey",
"type": "uint256[2]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "encryptedValuesForReceiver",
"type": "uint256[]"
},
{
"indexed": false,
"internalType": "uint256[]",
"name": "encryptedValuesForAuthority",
"type": "uint256[]"
},
{
"indexed": true,
"internalType": "address",
"name": "submitter",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "UTXOTransferNonRepudiation",
"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": "getArbiter",
"outputs": [
{
"internalType": "uint256[2]",
"name": "",
"type": "uint256[2]"
}
],
"stateMutability": "view",
"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_AnonEncNullifierNonRepudiation",
"name": "_verifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_CheckHashesValue",
"name": "_depositVerifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_CheckNullifierValue",
"name": "_withdrawVerifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_AnonEncNullifierNonRepudiationBatch",
"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": "uint256[2]",
"name": "_arbiter",
"type": "uint256[2]"
}
],
"name": "setArbiter",
"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"
},
{
"internalType": "uint256",
"name": "encryptionNonce",
"type": "uint256"
},
{
"internalType": "uint256[2]",
"name": "ecdhPublicKey",
"type": "uint256[2]"
},
{
"internalType": "uint256[]",
"name": "encryptedValuesForReceiver",
"type": "uint256[]"
},
{
"internalType": "uint256[]",
"name": "encryptedValuesForAuthority",
"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": "0x60a0806040523460295730608052613479908161002f8239608051818181610695015261189f0152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806304b10b9f1461014757806312c0fed2146101425780634f1ef2861461013d57806352d1902d146101385780635ca1e16514610133578063715018a61461012e578063732952411461012957806383f0ef49146101245780638bb2513b1461011f5780638da5cb5b1461011a5780639b2e8b52146101155780639e2a7194146101105780639fcc50af1461010b578063ad3cb1cc14610106578063c29a6fda14610101578063cc2a9a5b146100fc578063cffe00f9146100f7578063f2fde38b146100f25763f756356a146100ed57600080fd5b610fd2565b610fa5565b610f3e565b610c77565b610c0e565b610b7a565b610b11565b610af7565b610a70565b610a1d565b6109ba565b61093a565b6108e7565b6107c1565b61070f565b61066d565b6105e6565b610424565b610310565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761019e57604052565b61014c565b906101b1604051928361017b565b565b67ffffffffffffffff811161019e5760051b60200190565b9080601f830112156102285781356101e2816101b3565b926101f0604051948561017b565b81845260208085019260051b82010192831161022857602001905b8282106102185750505090565b813581526020918201910161020b565b600080fd5b8060a31215610228576040519061024560408361017b565b819060c411610228576084905b60c4821061025f57505090565b8135815260209182019101610252565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefc6101009101126102285761010490565b60031961010091011261022857600490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261022857604490565b9181601f840112156102285782359167ffffffffffffffff8311610228576020838186019501011161022857565b34610228576102206003193601126102285760043567ffffffffffffffff8111610228576103429036906004016101cb565b60243567ffffffffffffffff8111610228576103629036906004016101cb565b9060443591606435916103743661022d565b60c43567ffffffffffffffff8111610228576103949036906004016101cb565b60e43567ffffffffffffffff8111610228576103b49036906004016101cb565b906103be3661026f565b92610204359667ffffffffffffffff881161022857610402986103e86103f09936906004016102e2565b9890976114f6565b60405190151581529081906020820190565b0390f35b73ffffffffffffffffffffffffffffffffffffffff81160361022857565b34610228576101206003193601126102285761058e610442366102a0565b61054e610104359161045383610406565b6104ba60c06104636101006101a3565b8335815292602081013560208501526104a6610499604083018035604088015261048d8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e08201526040516104e3816104d5602082019485612b72565b03601f19810183528261017b565b51902073ffffffffffffffffffffffffffffffffffffffff61052c610512836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b16158015610590575b61053e906117fb565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b5061053e6105ab610512836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff1633149050610535565b67ffffffffffffffff811161019e57601f01601f191660200190565b6040600319360112610228576004356105fe81610406565b6024359067ffffffffffffffff821161022857366023830112156102285781600401359061062b826105ca565b91610639604051938461017b565b808352366024828601011161022857602081600092602461058e97018387013784010152611886565b600091031261022857565b346102285760006003193601126102285773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106e55760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b34610228576000600319360112610228576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af480156107bc576104029160009161078d575b506040519081529081906020820190565b6107af915060203d6020116107b5575b6107a7818361017b565b810190611a36565b3861077c565b503d61079d565b611258565b34610228576000600319360112610228576107da612b9f565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b610180600319820112610228576004359160243567ffffffffffffffff811161022857826108af916004016101cb565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261022857608490565b346102285761058e6109356109206108fe3661087f565b9261090f81979596929397516113fe565b908761091a83611199565b52612242565b9590809561092f8489846123a1565b50611b95565b612a33565b3461022857604060031936011261022857600036602312156109b7576040519061096560408361017b565b81366044116109b5576004905b604482106109a55783610983612b9f565b60005b6002811061099057005b6001906020835193019281603a015501610986565b8135815260209182019101610972565b505b80fd5b346102285760406003193601126102285760043567ffffffffffffffff8111610228576109eb9036906004016101cb565b6024359067ffffffffffffffff821161022857610a0f61058e9236906004016102e2565b91610a18612b9f565b612c32565b3461022857600060031936011261022857602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b346102285761016060031936011261022857602435600435610a91366102b2565b906101443567ffffffffffffffff8111610228578392610ab8610ac09236906004016102e2565b949093612138565b6040805190610acf818361017b565b60018252601f1901366020830137805115610af25761058e936020820152612c32565b61116a565b346102285761058e610b083661087f565b93929092611b95565b346102285760206003193601126102285773ffffffffffffffffffffffffffffffffffffffff600435610b4381610406565b610b4b612f40565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455600080f35b34610228576000600319360112610228576040805190610b9a818361017b565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b828110610bf75750506000828201840152601f01601f19168101030190f35b602082820181015187830187015286945001610bd8565b346102285760206003193601126102285773ffffffffffffffffffffffffffffffffffffffff600435610c4081610406565b610c48612b9f565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555600080f35b346102285760c060031936011261022857600435610c9481610406565b60243590610ca182610406565b604435610cad81610406565b606435610cb981610406565b60843590610cc682610406565b60a43592610cd384610406565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610d1960ff60408a901c16159867ffffffffffffffff1690565b1680159081610f0e575b6001149081610f04575b159081610efb575b50610ed157610db69587610dad60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610e5657611e32565b610dbc57005b610e277fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610ecc680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611e32565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610d35565b303b159150610d2d565b889150610d23565b906000905b60028210610f2857505050565b6020806001928551815201930191019091610f1b565b34610228576000600319360112610228576040808051610f5e828261017b565b369037805190603a6000835b60028210610f8f576104028486610f81828261017b565b815192838093810192610f16565b6001602081928554815201930191019091610f6a565b346102285760206003193601126102285761058e600435610fc581610406565b610fcd612b9f565b612008565b34610228576101406003193601126102285761058e600435602435610ff6366102b2565b91612138565b1561100357565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964207472616e73616374696f6e2070726f706f73616c000000006044820152fd5b1561106857565b60a46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152605760248201527f436970686572205465787420666f7220417574686f72697479206d757374206860448201527f6176652061206c656e677468206f6620313620666f72206e6f206d6f7265207460648201527f68616e203220696e70757473206f72206f7574707574730000000000000000006084820152fd5b60405190610480611123818461017b565b368337565b60405190611180611123818461017b565b6040519060e0611123818461017b565b604051906102e0611123818461017b565b604090815191611123818461017b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b805115610af25760200190565b8051821015610af25760209160051b010190565b906024811015610af25760051b0190565b90816020910312610228575180151581036102285790565b906000905b600282106111f557505050565b60408082818660019537019301910190916111e8565b9094939260409061122b61010094836105808601998637838501906111e3565b60c0830137016000905b6024821061124257505050565b6020806001928551815201930191019091611235565b6040513d6000823e3d90fd5b1561126b57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b156112d057565b60c46040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152606c60248201527f436970686572205465787420666f7220417574686f72697479206d757374206860448201527f6176652061206c656e677468206f66203634207769746820696e707574206f7260648201527f206f757470757473206e756d626572206d6f7265207468616e203220616e642060848201527f6c657373207468616e203130000000000000000000000000000000000000000060a4820152fd5b90608c811015610af25760051b0190565b909493926040906113d161010094836112808601998637838501906111e3565b60c0830137016000905b608c82106113e857505050565b60208060019285518152019301910190916113db565b90611408826101b3565b611415604051918261017b565b828152601f1961142582946101b3565b0190602036910137565b906020808351928381520192019060005b81811061144d5750505090565b8251845260209384019390920191600101611440565b601f8260209493601f19938186528686013760008582860101520116010190565b96946114ca6114e5956114ba6114d7956114ac6114f39d9b98966101008e818152019061142f565b8c810360208e01529061142f565b9360408b015260608a0190610f16565b87820360a089015261142f565b9085820360c087015261142f565b9260e0818503910152611463565b90565b93868661150f83999a94879e989d999c9d979697612242565b9d878f95929861152361152891888c6123a1565b610ffc565b600289511180156117f0575b1561171a576115509561154a60408751146112c9565b896128da565b90611559611128565b9160005b608c81106116fb5750506115e9916020916115a961159060395473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f1438cd2200000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016113b1565b03915afa80156107bc57611605916000916116cc575b50611264565b61160f8983612a33565b61161987516113fe565b9861162487516113fe565b9460005b895181101561165157808c61164a826116436001958f6111a6565b51926111a6565b5201611628565b509295989194975092959860005b8a5181101561168757806116756001928d6111a6565b51611680828c6111a6565b520161165f565b506116c4949699507f2de65d88bad801ae25960ccc943b3a24033838692a43078533014e938562b02b979192939598604051978897339b89611484565b0390a2600190565b6116ee915060203d6020116116f4575b6116e6818361017b565b8101906111cb565b386115ff565b503d6116dc565b80611708600192846111a6565b5161171382876113a0565b520161155d565b6117319561172b6010875114611061565b896126fb565b9061173a611112565b9160005b602481106117d15750506117b19160209161177161159060385473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f881453ac00000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161120b565b03915afa80156107bc576117cc916000916116cc5750611264565b611605565b806117de600192846111a6565b516117e982876111ba565b520161173e565b506002865111611534565b1561180257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b909173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168030149081156119f4575b506106e5576118d7612b9f565b604051927f52d1902d00000000000000000000000000000000000000000000000000000000845260208460048173ffffffffffffffffffffffffffffffffffffffff87165afa600094816119d3575b50611970577f4c9c8ce30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260245b6000fd5b90917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc84036119a4576101b192935061316c565b7faa1d49a400000000000000000000000000000000000000000000000000000000600052600484905260246000fd5b6119ed91955060203d6020116107b5576107a7818361017b565b9338611926565b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc54161415386118ca565b90816020910312610228575190565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b906007811015610af25760051b0190565b90949392604090611aa561010094836101e08601998637838501906111e3565b60c0830137016000905b60078210611abc57505050565b6020806001928551815201930191019091611aaf565b906017811015610af25760051b0190565b90949392604090611b0361010094836103e08601998637838501906111e3565b60c0830137016000905b60178210611b1a57505050565b6020806001928551815201930191019091611b0d565b15611b3757565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4661696c656420746f207472616e7366657220455243323020746f6b656e73006044820152fd5b939290916002835111600014611d61576017835111611d3257611bb89285612e86565b90611bc1611149565b9160005b60178110611d13575050611c3891602091611bf861159060375473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fa0c2a19a00000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611ae3565b03915afa80156107bc57600092611c5b611cc1926020948691611cfc5750611264565b611c7d61159060355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101929092529093849283919082906044820190565b03925af180156107bc576101b191600091611cdd575b50611b30565b611cf6915060203d6020116116f4576116e6818361017b565b38611cd7565b6116ee9150853d87116116f4576116e6818361017b565b80611d20600192846111a6565b51611d2b8287611ad2565b5201611bc5565b7f71798fb500000000000000000000000000000000000000000000000000000000600052601760045260246000fd5b611d6b9285612daf565b90611d74611139565b9160005b60078110611e13575050611deb91602091611dab61159060365473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fc894e75700000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611a85565b03915afa80156107bc57600092611e0e611cc1926020948691611cfc5750611264565b611c5b565b80611e20600192846111a6565b51611e2b8287611a74565b5201611d78565b611e5c90959395929192611e44612f40565b611e4c612f40565b611e54612f40565b610fcd612f40565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__92833b15610228576000604494604051958680927f9e43b81300000000000000000000000000000000000000000000000000000000825260016004830152604060248301525af49384156107bc576101b19673ffffffffffffffffffffffffffffffffffffffff80948193611fb598611ff6575b50611eee612f40565b611ef6612f40565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655167fffffffffffffffffffffffff0000000000000000000000000000000000000000603754161760375573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006039541617603955565b60006120019161017b565b6000611ee5565b73ffffffffffffffffffffffffffffffffffffffff1680156120ca5773ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054827fffffffffffffffffffffffff00000000000000000000000000000000000000008216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b906002811015610af25760051b0190565b60406101b19461212c610100949897958361014086019a8637838501906111e3565b60c08301370190610f16565b916121b39160209161214861115a565b85815291602083015261217361159060345473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff5c9d69e00000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161210a565b03915afa80156107bc576000926121d6611cc1926020948691611cfc5750611264565b6121f861159060355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101929092529093849283919082906064820190565b9190918051908351600a831180156122c6575b6122975760026114f3931190811561228c575b50156122805761227a600a8092612f99565b93612f99565b61227a60028092612f99565b600291501138612268565b7f9ebbc98e00000000000000000000000000000000000000000000000000000000600052600a60045260246000fd5b50600a8111612255565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82019182116122fd57565b611a45565b908160a09103126102285760405190600060a0830167ffffffffffffffff81118482101761019e57604052815160038110156109b55790608092918452602082015160208501526040820151604085015260608201516060850152500151608082015290565b6003111561237257565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b906123ae91939293613004565b60009291925b83518110156124bc576123c781856111a6565b51156124b4578015158061248f575b61245557600161240c6124076124006123ef85896111a6565b516000526033602052604060002090565b5460ff1690565b151590565b1461241b576001905b016123b4565b61242861196c91856111a6565b517f41a06d2800000000000000000000000000000000000000000000000000000000600052600452602490565b61246261196c91856111a6565b517fdd57483100000000000000000000000000000000000000000000000000000000600052600452602490565b5061249a81856111a6565b516124ad6124a7836122d0565b866111a6565b51146123d6565b600190612415565b50915073__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__9060005b835181101561261a576124eb81856111a6565b511561261257801515806125f3575b6124555761255560a061251661251084886111a6565b516130c2565b604051809381927fe170cf6e00000000000000000000000000000000000000000000000000000000835260048301919060206040840193600181520152565b0381875af49081156107bc576000916125c5575b505161257481612368565b61257d81612368565b61258b576001905b016124d8565b61259861196c91856111a6565b517f79e1da4700000000000000000000000000000000000000000000000000000000600052600452602490565b6125e6915060a03d81116125ec575b6125de818361017b565b810190612302565b38612569565b503d6125d4565b506125fe81856111a6565b5161260b6124a7836122d0565b51146124fa565b600190612585565b50929150602060405180927f92f5b06c00000000000000000000000000000000000000000000000000000000825281806126638760048301919060206040840193600181520152565b03915af49081156107bc576000916126af575b50156126825750600190565b7f4acd7ab80000000000000000000000000000000000000000000000000000000060005260045260246000fd5b6126c8915060203d6020116116f4576116e6818361017b565b38612676565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122fd5760010190565b96959190929694939461270e60246113fe565b96600096875b600281106128b257505060005b86518110156127525780612737600192896111a6565b5161274b6127448b6126ce565b9a8c6111a6565b5201612721565b509193979092945060005b855181101561278e5780612773600192886111a6565b516127876127808a6126ce565b998b6111a6565b520161275d565b50919350919560005b84518110156127c857806127ad600192876111a6565b516127c16127ba896126ce565b988a6111a6565b5201612797565b509091956127df6127d8866126ce565b95876111a6565b5260005b835181101561282757806127f9600192866111a6565b51612820576000955b61281960ff612810836126ce565b981691896111a6565b52016127e3565b8195612802565b5091509360005b825181101561285f5780612844600192856111a6565b51612858612851876126ce565b96886111a6565b520161282e565b5093905061287661286f836126ce565b92846111a6565b52603a546128ae9061289d906000906128916127d8866126ce565b52603b549060031b1c90565b916128a7816126ce565b50836111a6565b5290565b806128bf600192846120f9565b516128d36128cc8c6126ce565b9b8d6111a6565b5201612714565b9695919092969493946128ed608c6113fe565b96600096875b60028110612a1257505060005b865181101561292a5780612916600192896111a6565b516129236127448b6126ce565b5201612900565b509193979092945060005b855181101561295f578061294b600192886111a6565b516129586127808a6126ce565b5201612935565b50919350919560005b8451811015612992578061297e600192876111a6565b5161298b6127ba896126ce565b5201612968565b509091956129a26127d8866126ce565b5260005b83518110156129e157806129bc600192866111a6565b516129da576000955b6129d360ff612810836126ce565b52016129a6565b81956129c5565b5091509360005b825181101561285f57806129fe600192856111a6565b51612a0b612851876126ce565b52016129e8565b80612a1f600192846120f9565b51612a2c6128cc8c6126ce565b52016128f3565b91909160005b8151811015612a9b5780612a4f600192846111a6565b51612a5b575b01612a39565b612a96612a6b6123ef83866111a6565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b612a55565b505060005b8251811015612b6d57612ab381846111a6565b51612ac1575b600101612aa0565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__90612ae181856111a6565b51612aec82866111a6565b51833b15610228576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810192909252604482015291600090839060649082905af49182156107bc57600192612b52575b509050612ab9565b80612b616000612b679361017b565b80610662565b38612b4a565b509050565b906000825b60088210612b89575050506101000190565b6020806001928551815201930191019091612b77565b73ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303612bdf57565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b91612c246114f3949260408552604085019061142f565b926020818503910152611463565b90919260009373__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__945b8351811015612d7257612c6281856111a6565b51908115612d6957612c7860a0612516846130c2565b03818b5af49081156107bc57600091612d4b575b5051612c9781612368565b612ca081612368565b612d1c57863b15610228576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810183905260448101929092526000826064818a5af49182156107bc57600192612d07575b505b01612c4f565b80612b616000612d169361017b565b38612cff565b7f79e1da4700000000000000000000000000000000000000000000000000000000600052600482905260246000fd5b612d63915060a03d81116125ec576125de818361017b565b38612c8c565b60019150612d01565b509093507f7ff08e0ca1fce6b202b83128811e4f6ceda54930aa074cd365bf68f95c20ce199192612daa604051928392339684612c0d565b0390a2565b9092612dbb60076113fe565b936001918293612dca87611199565b52826000815b612e50575b5050612dea612de3856126ce565b94876111a6565b526000825b612e04575b505050806128a76128ae926126ce565b8151811015612e4b57908282612e1b8294846111a6565b51612e44576000955b612e3b60ff612e32836126ce565b9816918a6111a6565b52019091612def565b8195612e24565b612df4565b8351811015612e815780612e658392866111a6565b51612e79612e72896126ce565b988b6111a6565b520181612dd0565b612dd5565b9092612e9260176113fe565b936001918293612ea187611199565b52826000815b612f11575b5050612eba612de3856126ce565b526000825b612ed357505050806128a76128ae926126ce565b8151811015612e4b57908282612eea8294846111a6565b51612f0a576000955b612f0160ff612e32836126ce565b52019091612ebf565b8195612ef3565b8351811015612f3b5780612f268392866111a6565b51612f33612e72896126ce565b520181612ea7565b612eac565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c1615612f6f57565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b918183511461300057612fab826113fe565b9060005b8451811015612fd75780612fc5600192876111a6565b51612fd082866111a6565b5201612faf565b5092919091515b818110612fea57505090565b806000612ff9600193866111a6565b5201612fde565b9050565b919061301083516113fe565b9061301b81516113fe565b9060005b85518110156130475780613035600192886111a6565b5161304082876111a6565b520161301f565b50919290935060005b82518110156130785780613066600192856111a6565b5161307182886111a6565b5201613050565b50919050613085816132e8565b5061308f836132e8565b509190565b919060608301926000905b600382106130ac57505050565b602080600192855181520193019101909161309f565b604051606081019080821067ffffffffffffffff83111761019e57613128926020926040528082528282015260016040820152604051809381927f25cc70e800000000000000000000000000000000000000000000000000000000835260048301613094565b038173__$03320550cd1b629da90608251571b2532e$__5af49081156107bc57600091613153575090565b6114f3915060203d6020116107b5576107a7818361017b565b90813b1561325e5773ffffffffffffffffffffffffffffffffffffffff8216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a280511561322b57613228916132a2565b50565b50503461323457565b7fb398979f0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f4c9c8ce3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b6000806114f393602081519101845af43d156132e0573d916132c3836105ca565b926132d1604051948561017b565b83523d6000602085013e613300565b606091613300565b6114f360016020835160051b8401016020840161339d565b9061333f575080511561331557805190602001fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580613394575b613350575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15613348565b919060408382031061343e5782519282818095602084015b8581106133db57505082518151845281526133cf9261339d565b60206101b1930161339d565b91509150805185600114613418577f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b821161342b575b602001849186916133b5565b602090950180518651825286529461341f565b50505056fea264697066735822122000b1ee5b7dd189834fac09010d17f0f9aecb37fcf209fc4d2013112eeaa0526464736f6c634300081b0033",
"deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806304b10b9f1461014757806312c0fed2146101425780634f1ef2861461013d57806352d1902d146101385780635ca1e16514610133578063715018a61461012e578063732952411461012957806383f0ef49146101245780638bb2513b1461011f5780638da5cb5b1461011a5780639b2e8b52146101155780639e2a7194146101105780639fcc50af1461010b578063ad3cb1cc14610106578063c29a6fda14610101578063cc2a9a5b146100fc578063cffe00f9146100f7578063f2fde38b146100f25763f756356a146100ed57600080fd5b610fd2565b610fa5565b610f3e565b610c77565b610c0e565b610b7a565b610b11565b610af7565b610a70565b610a1d565b6109ba565b61093a565b6108e7565b6107c1565b61070f565b61066d565b6105e6565b610424565b610310565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff82111761019e57604052565b61014c565b906101b1604051928361017b565b565b67ffffffffffffffff811161019e5760051b60200190565b9080601f830112156102285781356101e2816101b3565b926101f0604051948561017b565b81845260208085019260051b82010192831161022857602001905b8282106102185750505090565b813581526020918201910161020b565b600080fd5b8060a31215610228576040519061024560408361017b565b819060c411610228576084905b60c4821061025f57505090565b8135815260209182019101610252565b7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffefc6101009101126102285761010490565b60031961010091011261022857600490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261022857604490565b9181601f840112156102285782359167ffffffffffffffff8311610228576020838186019501011161022857565b34610228576102206003193601126102285760043567ffffffffffffffff8111610228576103429036906004016101cb565b60243567ffffffffffffffff8111610228576103629036906004016101cb565b9060443591606435916103743661022d565b60c43567ffffffffffffffff8111610228576103949036906004016101cb565b60e43567ffffffffffffffff8111610228576103b49036906004016101cb565b906103be3661026f565b92610204359667ffffffffffffffff881161022857610402986103e86103f09936906004016102e2565b9890976114f6565b60405190151581529081906020820190565b0390f35b73ffffffffffffffffffffffffffffffffffffffff81160361022857565b34610228576101206003193601126102285761058e610442366102a0565b61054e610104359161045383610406565b6104ba60c06104636101006101a3565b8335815292602081013560208501526104a6610499604083018035604088015261048d8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e08201526040516104e3816104d5602082019485612b72565b03601f19810183528261017b565b51902073ffffffffffffffffffffffffffffffffffffffff61052c610512836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b16158015610590575b61053e906117fb565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b5061053e6105ab610512836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff1633149050610535565b67ffffffffffffffff811161019e57601f01601f191660200190565b6040600319360112610228576004356105fe81610406565b6024359067ffffffffffffffff821161022857366023830112156102285781600401359061062b826105ca565b91610639604051938461017b565b808352366024828601011161022857602081600092602461058e97018387013784010152611886565b600091031261022857565b346102285760006003193601126102285773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036106e55760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b34610228576000600319360112610228576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af480156107bc576104029160009161078d575b506040519081529081906020820190565b6107af915060203d6020116107b5575b6107a7818361017b565b810190611a36565b3861077c565b503d61079d565b611258565b34610228576000600319360112610228576107da612b9f565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b610180600319820112610228576004359160243567ffffffffffffffff811161022857826108af916004016101cb565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261022857608490565b346102285761058e6109356109206108fe3661087f565b9261090f81979596929397516113fe565b908761091a83611199565b52612242565b9590809561092f8489846123a1565b50611b95565b612a33565b3461022857604060031936011261022857600036602312156109b7576040519061096560408361017b565b81366044116109b5576004905b604482106109a55783610983612b9f565b60005b6002811061099057005b6001906020835193019281603a015501610986565b8135815260209182019101610972565b505b80fd5b346102285760406003193601126102285760043567ffffffffffffffff8111610228576109eb9036906004016101cb565b6024359067ffffffffffffffff821161022857610a0f61058e9236906004016102e2565b91610a18612b9f565b612c32565b3461022857600060031936011261022857602073ffffffffffffffffffffffffffffffffffffffff7