@settlemint/solidity-zeto
Version:
Smart contract set to build Zero Knowledge tokens in SettleMint
758 lines • 68 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "Zeto_AnonEncNullifier",
"sourceName": "contracts/zeto_anon_enc_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": 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"
}
],
"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_AnonEncNullifier",
"name": "_verifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_CheckHashesValue",
"name": "_depositVerifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_CheckNullifierValue",
"name": "_withdrawVerifier",
"type": "address"
},
{
"internalType": "contract Groth16Verifier_AnonEncNullifierBatch",
"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"
},
{
"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": "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": "0x60a08060405234602957306080526130a4908161002f82396080518181816104990152610f4f0152f35b600080fdfe6080604052600436101561001257600080fd5b60003560e01c806312c0fed2146101275780634f1ef2861461012257806352d1902d1461011d5780635ca1e16514610118578063715018a614610113578063732952411461010e5780638bb2513b146101095780638da5cb5b146101045780639b2e8b52146100ff5780639e2a7194146100fa5780639fcc50af146100f5578063a576b537146100f0578063ad3cb1cc146100eb578063c29a6fda146100e6578063cc2a9a5b146100e1578063f2fde38b146100dc5763f756356a146100d757600080fd5b610e81565b610e54565b610bb5565b610b4c565b610ab8565b6109e7565b61093c565b610922565b61089b565b610848565b6107e5565b610764565b6105c9565b610513565b610471565b6103ea565b6101c1565b60031961010091011261013e57600490565b600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261013e57604490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c61010091011261013e5760e490565b73ffffffffffffffffffffffffffffffffffffffff81160361013e57565b3461013e5761012060031936011261013e5761032b6101df3661012c565b6102eb61010435916101f0836101a3565b61025760c06102006101006103be565b833581529260208101356020850152610243610236604083018035604088015261022a8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e082015260405161028081610272602082019485611ef0565b03601f198101835282610396565b51902073ffffffffffffffffffffffffffffffffffffffff6102c96102af836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1615801561032d575b6102db90610eab565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b506102db6103486102af836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff16331490506102d2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176103b957604052565b610367565b906103cc6040519283610396565b565b67ffffffffffffffff81116103b957601f01601f191660200190565b604060031936011261013e57600435610402816101a3565b6024359067ffffffffffffffff821161013e573660238301121561013e5781600401359061042f826103ce565b9161043d6040519384610396565b808352366024828601011161013e57602081600092602461032b97018387013784010152610f36565b600091031261013e57565b3461013e57600060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036104e95760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e57600060031936011261013e576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af480156105c45761059191600091610595575b506040519081529081906020820190565b0390f35b6105b7915060203d6020116105bd575b6105af8183610396565b8101906110e6565b38610580565b503d6105a5565b6110f5565b3461013e57600060031936011261013e576105e2611f1d565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b67ffffffffffffffff81116103b95760051b60200190565b9080601f8301121561013e5781356106b681610687565b926106c46040519485610396565b81845260208085019260051b82010192831161013e57602001905b8282106106ec5750505090565b81358152602091820191016106df565b61018060031982011261013e576004359160243567ffffffffffffffff811161013e578261072c9160040161069f565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261013e57608490565b3461013e5761032b6107b261079d61077b366106fc565b9261078c8197959692939751611101565b908761079783611161565b52611f8b565b959080956107ac84898461211d565b506113a0565b61244a565b9181601f8401121561013e5782359167ffffffffffffffff831161013e576020838186019501011161013e57565b3461013e57604060031936011261013e5760043567ffffffffffffffff811161013e5761081690369060040161069f565b6024359067ffffffffffffffff821161013e5761083a61032b9236906004016107b7565b91610843611f1d565b6125ae565b3461013e57600060031936011261013e57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461013e5761016060031936011261013e576024356004356108bc36610143565b906101443567ffffffffffffffff811161013e5783926108e36108eb9236906004016107b7565b949093611de6565b60408051906108fa8183610396565b60018252601f190136602083013780511561091d5761032b9360208201526125ae565b611132565b3461013e5761032b610933366106fc565b939290926113a0565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff60043561096e816101a3565b6109766128f4565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455600080f35b8060a3121561013e57604051906109bd604083610396565b819060c41161013e576084905b60c482106109d757505090565b81358152602091820191016109ca565b3461013e5761020060031936011261013e5760043567ffffffffffffffff811161013e57610a1990369060040161069f565b60243567ffffffffffffffff811161013e57610a3990369060040161069f565b906044359160643591610a4b366109a5565b60c43567ffffffffffffffff811161013e57610a6b90369060040161069f565b610a7436610173565b916101e4359567ffffffffffffffff871161013e5761059197610a9e610aa69836906004016107b7565b97909661186c565b60405190151581529081906020820190565b3461013e57600060031936011261013e576040805190610ad88183610396565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b828110610b355750506000828201840152601f01601f19168101030190f35b602082820181015187830187015286945001610b16565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610b7e816101a3565b610b86611f1d565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555600080f35b3461013e5760c060031936011261013e57600435610bd2816101a3565b60243590610bdf826101a3565b604435610beb816101a3565b606435610bf7816101a3565b60843590610c04826101a3565b60a43592610c11846101a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610c5760ff60408a901c16159867ffffffffffffffff1690565b1680159081610e4c575b6001149081610e42575b159081610e39575b50610e0f57610cf49587610ceb60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610d9457611ae0565b610cfa57005b610d657fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610e0a680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611ae0565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610c73565b303b159150610c6b565b889150610c61565b3461013e57602060031936011261013e5761032b600435610e74816101a3565b610e7c611f1d565b611cb6565b3461013e5761014060031936011261013e5761032b600435602435610ea536610143565b91611de6565b15610eb257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b909173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168030149081156110a4575b506104e957610f87611f1d565b604051927f52d1902d00000000000000000000000000000000000000000000000000000000845260208460048173ffffffffffffffffffffffffffffffffffffffff87165afa60009481611083575b50611020577f4c9c8ce30000000000000000000000000000000000000000000000000000000060005273ffffffffffffffffffffffffffffffffffffffff831660045260245b6000fd5b90917f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8403611054576103cc929350612bcc565b7faa1d49a400000000000000000000000000000000000000000000000000000000600052600484905260246000fd5b61109d91955060203d6020116105bd576105af8183610396565b9338610fd6565b905073ffffffffffffffffffffffffffffffffffffffff7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416141538610f7a565b9081602091031261013e575190565b6040513d6000823e3d90fd5b9061110b82610687565b6111186040519182610396565b828152601f196111288294610687565b0190602036910137565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b80511561091d5760200190565b805182101561091d5760209160051b010190565b6040519060e06111928184610396565b368337565b604051906102e06111928184610396565b604051906102406111928184610396565b604051906109406111928184610396565b6040908151916111928184610396565b90600781101561091d5760051b0190565b9081602091031261013e5751801515810361013e5790565b906000905b6002821061121557505050565b6040808281866001953701930191019091611208565b9094939260409061124b61010094836101e0860199863783850190611203565b60c0830137016000905b6007821061126257505050565b6020806001928551815201930191019091611255565b1561127f57565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f496e76616c69642070726f6f66000000000000000000000000000000000000006044820152fd5b90601781101561091d5760051b0190565b9094939260409061130e61010094836103e0860199863783850190611203565b60c0830137016000905b6017821061132557505050565b6020806001928551815201930191019091611318565b1561134257565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4661696c656420746f207472616e7366657220455243323020746f6b656e73006044820152fd5b93929091600283511160001461159c57601783511161156d576113c3928561283a565b906113cc611197565b9160005b6017811061154e57505061145c9160209161141c61140360375473ffffffffffffffffffffffffffffffffffffffff1690565b73ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fa0c2a19a00000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016112ee565b03915afa80156105c4576000926114806114e6926020948691611531575b50611278565b6114a261140360355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815233600482015260248101929092529093849283919082906044820190565b03925af180156105c4576103cc91600091611502575b5061133b565b611524915060203d60201161152a575b61151c8183610396565b8101906111eb565b386114fc565b503d611512565b6115489150853d871161152a5761151c8183610396565b3861147a565b8061155b6001928461116e565b5161156682876112dd565b52016113d0565b7f71798fb500000000000000000000000000000000000000000000000000000000600052601760045260246000fd5b6115a69285612758565b906115af611182565b9160005b6007811061164e575050611626916020916115e661140360365473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937fc894e75700000000000000000000000000000000000000000000000000000000845260c081019060408101906004860161122b565b03915afa80156105c4576000926116496114e69260209486916115315750611278565b611480565b8061165b6001928461116e565b5161166682876111da565b52016115b3565b1561167457565b60646040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f496e76616c6964207472616e73616374696f6e2070726f706f73616c000000006044820152fd5b90601281101561091d5760051b0190565b909493926040906117036101009483610340860199863783850190611203565b60c0830137016000905b6012821061171a57505050565b602080600192855181520193019101909161170d565b90604a81101561091d5760051b0190565b909493926040906117616101009483610a40860199863783850190611203565b60c0830137016000905b604a821061177857505050565b602080600192855181520193019101909161176b565b906020808351928381520192019060005b8181106117ac5750505090565b825184526020938401939092019160010161179f565b906000905b600282106117d457505050565b60208060019285518152019301910190916117c7565b601f8260209493601f19938186528686013760008582860101520116010190565b959361184e9061183e61185b95946118306118699b999560e08c5260e08c019061178e565b908a820360208c015261178e565b93604089015260608801906117c2565b85820360a087015261178e565b9260c08185039101526117ea565b90565b9061187e919996939498929599611f8b565b92909461189461188f82868961211d565b61166d565b89898660028951118015611ad5575b15611a0b576118b393878a612aac565b906118bc6111b9565b9160005b604a81106119ec575050611933916020916118f361140360395473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff035c56300000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611741565b03915afa80156105c45761194e916000916119d35750611278565b611958828561244a565b6119628851611101565b9560005b895181101561198e578061197c6001928c61116e565b51611987828b61116e565b5201611966565b50909193966119cb93959850957f18fd5042f65c100c3eb616143f0e3d2d83f7efe63df2a868b19f0b823c08a21b96604051968796339a8861180b565b0390a2600190565b611548915060203d60201161152a5761151c8183610396565b806119f96001928461116e565b51611a048287611730565b52016118c0565b611a1693878a61294d565b90611a1f6111a8565b9160005b60128110611ab6575050611a9691602091611a5661140360385473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937f4483e72100000000000000000000000000000000000000000000000000000000845260c08101906040810190600486016116e3565b03915afa80156105c457611ab1916000916119d35750611278565b61194e565b80611ac36001928461116e565b51611ace82876116d2565b5201611a23565b5060028751116118a3565b611b0a90959395929192611af26128f4565b611afa6128f4565b611b026128f4565b610e7c6128f4565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__92833b1561013e576000604494604051958680927f9e43b81300000000000000000000000000000000000000000000000000000000825260016004830152604060248301525af49384156105c4576103cc9673ffffffffffffffffffffffffffffffffffffffff80948193611c6398611ca4575b50611b9c6128f4565b611ba46128f4565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455167fffffffffffffffffffffffff00000000000000000000000000000000000000006036541617603655167fffffffffffffffffffffffff0000000000000000000000000000000000000000603754161760375573ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006038541617603855565b73ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff00000000000000000000000000000000000000006039541617603955565b6000611caf91610396565b6000611b93565b73ffffffffffffffffffffffffffffffffffffffff168015611d785773ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054827fffffffffffffffffffffffff00000000000000000000000000000000000000008216177f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0600080a3565b7f1e4fbdf700000000000000000000000000000000000000000000000000000000600052600060045260246000fd5b90600281101561091d5760051b0190565b60406103cc94611dda610100949897958361014086019a863783850190611203565b60c083013701906117c2565b91611e6191602091611df66111ca565b858152916020830152611e2161140360345473ffffffffffffffffffffffffffffffffffffffff1690565b906040518095819482937ff5c9d69e00000000000000000000000000000000000000000000000000000000845260c0810190604081019060048601611db8565b03915afa80156105c457600092611e846114e69260209486916115315750611278565b611ea661140360355473ffffffffffffffffffffffffffffffffffffffff1690565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815233600482015230602482015260448101929092529093849283919082906064820190565b906000825b60088210611f07575050506101000190565b6020806001928551815201930191019091611ef5565b73ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930054163303611f5d57565b7f118cdaa7000000000000000000000000000000000000000000000000000000006000523360045260246000fd5b9190918051908351600a8311801561200f575b611fe05760026118699311908115611fd5575b5015611fc957611fc3600a8092612d02565b93612d02565b611fc360028092612d02565b600291501138611fb1565b7f9ebbc98e00000000000000000000000000000000000000000000000000000000600052600a60045260246000fd5b50600a8111611f9e565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820191821161207557565b612019565b908160a091031261013e5760405190600060a0830167ffffffffffffffff8111848210176103b957604052815160038110156120e05790608092918452602082015160208501526040820151604085015260608201516060850152500151608082015290565b5080fd5b600311156120ee57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b9061212a91939293612d6d565b60009291925b835181101561223857612143818561116e565b5115612230578015158061220b575b6121d157600161218861218361217c61216b858961116e565b516000526033602052604060002090565b5460ff1690565b151590565b14612197576001905b01612130565b6121a461101c918561116e565b517f41a06d2800000000000000000000000000000000000000000000000000000000600052600452602490565b6121de61101c918561116e565b517fdd57483100000000000000000000000000000000000000000000000000000000600052600452602490565b50612216818561116e565b5161222961222383612048565b8661116e565b5114612152565b600190612191565b50915073__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__9060005b835181101561239657612267818561116e565b511561238e578015158061236f575b6121d1576122d160a061229261228c848861116e565b51612e2b565b604051809381927fe170cf6e00000000000000000000000000000000000000000000000000000000835260048301919060206040840193600181520152565b0381875af49081156105c457600091612341575b50516122f0816120e4565b6122f9816120e4565b612307576001905b01612254565b61231461101c918561116e565b517f79e1da4700000000000000000000000000000000000000000000000000000000600052600452602490565b612362915060a03d8111612368575b61235a8183610396565b81019061207a565b386122e5565b503d612350565b5061237a818561116e565b5161238761222383612048565b5114612276565b600190612301565b50929150602060405180927f92f5b06c00000000000000000000000000000000000000000000000000000000825281806123df8760048301919060206040840193600181520152565b03915af49081156105c45760009161242b575b50156123fe5750600190565b7f4acd7ab80000000000000000000000000000000000000000000000000000000060005260045260246000fd5b612444915060203d60201161152a5761151c8183610396565b386123f2565b91909160005b81518110156124b257806124666001928461116e565b51612472575b01612450565b6124ad61248261216b838661116e565b60017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055565b61246c565b505060005b8251811015612584576124ca818461116e565b516124d8575b6001016124b7565b73__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__906124f8818561116e565b51612503828661116e565b51833b1561013e576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810192909252604482015291600090839060649082905af49182156105c457600192612569575b5090506124d0565b80612578600061257e93610396565b80610466565b38612561565b509050565b916125a0611869949260408552604085019061178e565b9260208185039101526117ea565b90919260009373__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__945b83518110156126ee576125de818561116e565b519081156126e5576125f460a061229284612e2b565b03818b5af49081156105c4576000916126c7575b5051612613816120e4565b61261c816120e4565b61269857863b1561013e576040517fc1d29f01000000000000000000000000000000000000000000000000000000008152600160048201526024810183905260448101929092526000826064818a5af49182156105c457600192612683575b505b016125cb565b80612578600061269293610396565b3861267b565b7f79e1da4700000000000000000000000000000000000000000000000000000000600052600482905260246000fd5b6126df915060a03d81116123685761235a8183610396565b38612608565b6001915061267d565b509093507f7ff08e0ca1fce6b202b83128811e4f6ceda54930aa074cd365bf68f95c20ce199192612726604051928392339684612589565b0390a2565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146120755760010190565b90926127646007611101565b93600191829361277387611161565b52826000815b612804575b505061279361278c8561272b565b948761116e565b526000825b6127b8575b505050806127ad6127b49261272b565b508361116e565b5290565b81518110156127ff579082826127cf82948461116e565b516127f8576000955b6127ef60ff6127e68361272b565b9816918a61116e565b52019091612798565b81956127d8565b61279d565b8351811015612835578061281983928661116e565b5161282d6128268961272b565b988b61116e565b520181612779565b61277e565b90926128466017611101565b93600191829361285587611161565b52826000815b6128c5575b505061286e61278c8561272b565b526000825b61288757505050806127ad6127b49261272b565b81518110156127ff5790828261289e82948461116e565b516128be576000955b6128b560ff6127e68361272b565b52019091612873565b81956128a7565b83518110156128ef57806128da83928661116e565b516128e76128268961272b565b52018161285b565b612860565b60ff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005460401c161561292357565b7fd7e6bcf80000000000000000000000000000000000000000000000000000000060005260046000fd5b909492939561295c6012611101565b94600097885b60028110612a8457505060005b85518110156129a057806129856001928861116e565b516129996129928c61272b565b9b8a61116e565b520161296f565b50919350919460005b84518110156129da57806129bf6001928761116e565b516129d36129cc8b61272b565b9a8961116e565b52016129a9565b509091946129f16129ea8861272b565b978661116e565b5260005b8351811015612a395780612a0b6001928661116e565b51612a32576000975b612a2b60ff612a228361272b565b9a16918861116e565b52016129f5565b8197612a14565b5091509260005b8251811015612a715780612a566001928561116e565b51612a6a612a638961272b565b988761116e565b5201612a40565b50936127b491509291926127ad8161272b565b80612a9160019284611da7565b51612aa5612a9e8d61272b565b9c8b61116e565b5201612962565b9094929395612abb604a611101565b94600097885b60028110612bab57505060005b8551811015612af85780612ae46001928861116e565b51612af16129928c61272b565b5201612ace565b50919350919460005b8451811015612b2b5780612b176001928761116e565b51612b246129cc8b61272b565b5201612b01565b50909194612b3b6129ea8861272b565b5260005b8351811015612b7a5780612b556001928661116e565b51612b73576000975b612b6c60ff612a228361272b565b5201612b3f565b8197612b5e565b5091509260005b8251811015612a715780612b976001928561116e565b51612ba4612a638961272b565b5201612b81565b80612bb860019284611da7565b51612bc5612a9e8d61272b565b5201612ac1565b90813b15612cbe5773ffffffffffffffffffffffffffffffffffffffff8216807fffffffffffffffffffffffff00000000000000000000000000000000000000007f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5416177f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc557fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b600080a2805115612c8b57612c8891612ed5565b50565b505034612c9457565b7fb398979f0000000000000000000000000000000000000000000000000000000060005260046000fd5b73ffffffffffffffffffffffffffffffffffffffff827f4c9c8ce3000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b9181835114612d6957612d1482611101565b9060005b8451811015612d405780612d2e6001928761116e565b51612d39828661116e565b5201612d18565b5092919091515b818110612d5357505090565b806000612d626001938661116e565b5201612d47565b9050565b9190612d798351611101565b90612d848151611101565b9060005b8551811015612db05780612d9e6001928861116e565b51612da9828761116e565b5201612d88565b50919290935060005b8251811015612de15780612dcf6001928561116e565b51612dda828861116e565b5201612db9565b50919050612dee81612fb4565b50612df883612fb4565b509190565b919060608301926000905b60038210612e1557505050565b6020806001928551815201930191019091612e08565b604051606081019080821067ffffffffffffffff8311176103b957612e91926020926040528082528282015260016040820152604051809381927f25cc70e800000000000000000000000000000000000000000000000000000000835260048301612dfd565b038173__$03320550cd1b629da90608251571b2532e$__5af49081156105c457600091612ebc575090565b611869915060203d6020116105bd576105af8183610396565b60008061186993602081519101845af43d15612f13573d91612ef6836103ce565b92612f046040519485610396565b83523d6000602085013e612f17565b6060915b90612f565750805115612f2c57805190602001fd5b7fd6bda2750000000000000000000000000000000000000000000000000000000060005260046000fd5b81511580612fab575b612f67575090565b73ffffffffffffffffffffffffffffffffffffffff907f9996b315000000000000000000000000000000000000000000000000000000006000521660045260246000fd5b50803b15612f5f565b61186960016020835160051b840101602084015b91906040838203106130695782519282818095602084015b8581106130065750508251815184528152612ffa92612fc8565b60206103cc9301612fc8565b91509150805185600114613043577f4e487b7100000000000000000000000000000000000000000000000000000000600052605160045260246000fd5b8211613056575b60200184918691612fe0565b602090950180518651825286529461304a565b50505056fea2646970667358221220cfa6d6f10a973220e5feab37d823d6d514ef67b450b2514a676e4ec5a026ec3664736f6c634300081b0033",
"deployedBytecode": "0x6080604052600436101561001257600080fd5b60003560e01c806312c0fed2146101275780634f1ef2861461012257806352d1902d1461011d5780635ca1e16514610118578063715018a614610113578063732952411461010e5780638bb2513b146101095780638da5cb5b146101045780639b2e8b52146100ff5780639e2a7194146100fa5780639fcc50af146100f5578063a576b537146100f0578063ad3cb1cc146100eb578063c29a6fda146100e6578063cc2a9a5b146100e1578063f2fde38b146100dc5763f756356a146100d757600080fd5b610e81565b610e54565b610bb5565b610b4c565b610ab8565b6109e7565b61093c565b610922565b61089b565b610848565b6107e5565b610764565b6105c9565b610513565b610471565b6103ea565b6101c1565b60031961010091011261013e57600490565b600080fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffbc61010091011261013e57604490565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1c61010091011261013e5760e490565b73ffffffffffffffffffffffffffffffffffffffff81160361013e57565b3461013e5761012060031936011261013e5761032b6101df3661012c565b6102eb61010435916101f0836101a3565b61025760c06102006101006103be565b833581529260208101356020850152610243610236604083018035604088015261022a8160200190565b35606088015260400190565b8035608087015260200190565b3560a085015201803560c084015260200190565b3560e082015260405161028081610272602082019485611ef0565b03601f198101835282610396565b51902073ffffffffffffffffffffffffffffffffffffffff6102c96102af836000526000602052604060002090565b5473ffffffffffffffffffffffffffffffffffffffff1690565b1615801561032d575b6102db90610eab565b6000526000602052604060002090565b9073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b005b506102db6103486102af836000526000602052604060002090565b73ffffffffffffffffffffffffffffffffffffffff16331490506102d2565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b90601f601f19910116810190811067ffffffffffffffff8211176103b957604052565b610367565b906103cc6040519283610396565b565b67ffffffffffffffff81116103b957601f01601f191660200190565b604060031936011261013e57600435610402816101a3565b6024359067ffffffffffffffff821161013e573660238301121561013e5781600401359061042f826103ce565b9161043d6040519384610396565b808352366024828601011161013e57602081600092602461032b97018387013784010152610f36565b600091031261013e57565b3461013e57600060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001630036104e95760206040517f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8152f35b7fe07c8dba0000000000000000000000000000000000000000000000000000000060005260046000fd5b3461013e57600060031936011261013e576040517f79f971250000000000000000000000000000000000000000000000000000000081526001600482015260208160248173__$dc6c4dd02ac6da041aea5ed0aea43c2a22$__5af480156105c45761059191600091610595575b506040519081529081906020820190565b0390f35b6105b7915060203d6020116105bd575b6105af8183610396565b8101906110e6565b38610580565b503d6105a5565b6110f5565b3461013e57600060031936011261013e576105e2611f1d565b600073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300547fffffffffffffffffffffffff000000000000000000000000000000000000000081167f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930055167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a3005b67ffffffffffffffff81116103b95760051b60200190565b9080601f8301121561013e5781356106b681610687565b926106c46040519485610396565b81845260208085019260051b82010192831161013e57602001905b8282106106ec5750505090565b81358152602091820191016106df565b61018060031982011261013e576004359160243567ffffffffffffffff811161013e578261072c9160040161069f565b91604435916101007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7c60643593011261013e57608490565b3461013e5761032b6107b261079d61077b366106fc565b9261078c8197959692939751611101565b908761079783611161565b52611f8b565b959080956107ac84898461211d565b506113a0565b61244a565b9181601f8401121561013e5782359167ffffffffffffffff831161013e576020838186019501011161013e57565b3461013e57604060031936011261013e5760043567ffffffffffffffff811161013e5761081690369060040161069f565b6024359067ffffffffffffffff821161013e5761083a61032b9236906004016107b7565b91610843611f1d565b6125ae565b3461013e57600060031936011261013e57602073ffffffffffffffffffffffffffffffffffffffff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c1993005416604051908152f35b3461013e5761016060031936011261013e576024356004356108bc36610143565b906101443567ffffffffffffffff811161013e5783926108e36108eb9236906004016107b7565b949093611de6565b60408051906108fa8183610396565b60018252601f190136602083013780511561091d5761032b9360208201526125ae565b611132565b3461013e5761032b610933366106fc565b939290926113a0565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff60043561096e816101a3565b6109766128f4565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006034541617603455600080f35b8060a3121561013e57604051906109bd604083610396565b819060c41161013e576084905b60c482106109d757505090565b81358152602091820191016109ca565b3461013e5761020060031936011261013e5760043567ffffffffffffffff811161013e57610a1990369060040161069f565b60243567ffffffffffffffff811161013e57610a3990369060040161069f565b906044359160643591610a4b366109a5565b60c43567ffffffffffffffff811161013e57610a6b90369060040161069f565b610a7436610173565b916101e4359567ffffffffffffffff871161013e5761059197610a9e610aa69836906004016107b7565b97909661186c565b60405190151581529081906020820190565b3461013e57600060031936011261013e576040805190610ad88183610396565b600582527f352e302e300000000000000000000000000000000000000000000000000000006020830152805180926020825280519081602084015260005b828110610b355750506000828201840152601f01601f19168101030190f35b602082820181015187830187015286945001610b16565b3461013e57602060031936011261013e5773ffffffffffffffffffffffffffffffffffffffff600435610b7e816101a3565b610b86611f1d565b167fffffffffffffffffffffffff00000000000000000000000000000000000000006035541617603555600080f35b3461013e5760c060031936011261013e57600435610bd2816101a3565b60243590610bdf826101a3565b604435610beb816101a3565b606435610bf7816101a3565b60843590610c04826101a3565b60a43592610c11846101a3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00549567ffffffffffffffff610c5760ff60408a901c16159867ffffffffffffffff1690565b1680159081610e4c575b6001149081610e42575b159081610e39575b50610e0f57610cf49587610ceb60017fffffffffffffffffffffffffffffffffffffffffffffffff00000000000000007ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b610d9457611ae0565b610cfa57005b610d657fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054167ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d290602090a1005b610e0a680100000000000000007fffffffffffffffffffffffffffffffffffffffffffffff00ffffffffffffffff7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a005416177ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0055565b611ae0565b7ff92ee8a90000000000000000000000000000000000000000000000000000000060005260046000fd5b90501538610c73565b303b159150610c6b565b889150610c61565b3461013e57602060031936011261013e5761032b600435610e74816101a3565b610e7c611f1d565b611cb6565b3461013e5761014060031936011261013e5761032b600435602435610ea536610143565b91611de6565b15610eb257565b60846040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f6f6620616c7265616479206c6f636b656420627920616e6f746865722060448201527f70617274790000000000000000000000000000000000000000000000000000006064820152fd5b909173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168030149081156110a4575b506104e957610f87611f1d565b604051927f52d1902d00000000000000000000000000000000000000000000000000000000845260208460048173ffffffffffffffffffffffffffffffffffffffff87165afa60009481611083575b50611020577f4c9c8ce300000000