UNPKG

@lukso/lsp-smart-contracts

Version:

The reference smart contract implementation for the LUKSO LSP standards

628 lines 62.6 kB
{ "_format": "hh-sol-artifact-1", "contractName": "LSP9Vault", "sourceName": "@lukso/lsp9-contracts/contracts/LSP9Vault.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "stateMutability": "payable", "type": "constructor" }, { "inputs": [], "name": "ERC725X_ContractDeploymentFailed", "type": "error" }, { "inputs": [], "name": "ERC725X_CreateOperationsRequireEmptyRecipientAddress", "type": "error" }, { "inputs": [], "name": "ERC725X_ExecuteParametersEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725X_ExecuteParametersLengthMismatch", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "uint256", "name": "value", "type": "uint256" } ], "name": "ERC725X_InsufficientBalance", "type": "error" }, { "inputs": [], "name": "ERC725X_MsgValueDisallowedInStaticCall", "type": "error" }, { "inputs": [], "name": "ERC725X_NoContractBytecodeProvided", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "operationTypeProvided", "type": "uint256" } ], "name": "ERC725X_UnknownOperationType", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_MsgValueDisallowed", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" } ], "name": "LSP14CallerNotPendingOwner", "type": "error" }, { "inputs": [], "name": "LSP14CannotTransferOwnershipToSelf", "type": "error" }, { "inputs": [], "name": "LSP14MustAcceptOwnershipInSeparateTransaction", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "renounceOwnershipStart", "type": "uint256" }, { "internalType": "uint256", "name": "renounceOwnershipEnd", "type": "uint256" } ], "name": "LSP14NotInRenounceOwnershipInterval", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "LSP1DelegateNotAllowedToSetDataKey", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } ], "name": "NoExtensionFoundForFunctionSelector", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "callerAddress", "type": "address" } ], "name": "OwnableCallerNotTheOwner", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "operationType", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "contractAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": true, "internalType": "bytes32", "name": "salt", "type": "bytes32" } ], "name": "ContractCreated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "DataChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "operationType", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "target", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": true, "internalType": "bytes4", "name": "selector", "type": "bytes4" } ], "name": "Executed", "type": "event" }, { "anonymous": false, "inputs": [], "name": "OwnershipRenounced", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferStarted", "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": [], "name": "RenounceOwnershipStarted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": true, "internalType": "bytes32", "name": "typeId", "type": "bytes32" }, { "indexed": false, "internalType": "bytes", "name": "receivedData", "type": "bytes" }, { "indexed": false, "internalType": "bytes", "name": "returnedValue", "type": "bytes" } ], "name": "UniversalReceiver", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [], "name": "RENOUNCE_OWNERSHIP_CONFIRMATION_DELAY", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "RENOUNCE_OWNERSHIP_CONFIRMATION_PERIOD", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "VERSION", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "acceptOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "batchCalls", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "operationType", "type": "uint256" }, { "internalType": "address", "name": "target", "type": "address" }, { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "execute", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "operationsType", "type": "uint256[]" }, { "internalType": "address[]", "name": "targets", "type": "address[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "datas", "type": "bytes[]" } ], "name": "executeBatch", "outputs": [ { "internalType": "bytes[]", "name": "", "type": "bytes[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "getData", "outputs": [ { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" } ], "name": "getDataBatch", "outputs": [ { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "owner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "pendingOwner", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "setData", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes32[]", "name": "dataKeys", "type": "bytes32[]" }, { "internalType": "bytes[]", "name": "dataValues", "type": "bytes[]" } ], "name": "setDataBatch", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "typeId", "type": "bytes32" }, { "internalType": "bytes", "name": "receivedData", "type": "bytes" } ], "name": "universalReceiver", "outputs": [ { "internalType": "bytes", "name": "returnedValues", "type": "bytes" } ], "stateMutability": "payable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60806040526040516200332e3803806200332e833981016040819052620000269162000366565b3415620000ad577f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b34336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c2604051620000a4906040808252600090820181905260606020830181905282015260800190565b60405180910390a45b620000c3816200016360201b620011ce1760201c565b6040805180820190915260048152637c0334a160e01b60208201526200010b907feafec4d89fa9619884b600007c0334a14085fefa8b51ae5a40895018882bdb9090620001d1565b604080516020808201909252600081526200015c916001600160a01b038416917f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c916200123c6200022a821b17901c565b5062000641565b6000546001600160a01b03828116911614620001ce57600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0383161790555b50565b6000828152600160205260409020620001eb82826200043c565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516200021e91906200055c565b60405180910390a25050565b62000254636bb56a1460e01b846001600160a01b0316620002db60201b620012d01790919060201c565b15620002d657604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906200028a908590859060040162000571565b6000604051808303816000875af1158015620002aa573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052620002d4919081019062000594565b505b505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d915060005190508280156200034e575060208210155b80156200035b5750600081115b979650505050505050565b6000602082840312156200037957600080fd5b81516001600160a01b03811681146200039157600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c90821680620003c357607f821691505b602082108103620003e457634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620002d657600081815260208120601f850160051c81016020861015620004135750805b601f850160051c820191505b8181101562000434578281556001016200041f565b505050505050565b81516001600160401b0381111562000458576200045862000398565b6200047081620004698454620003ae565b84620003ea565b602080601f831160018114620004a857600084156200048f5750858301515b600019600386901b1c1916600185901b17855562000434565b600085815260208120601f198616915b82811015620004d957888601518255948401946001909101908401620004b8565b5085821015620004f85787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60005b83811015620005255781810151838201526020016200050b565b50506000910152565b600081518084526200054881602086016020860162000508565b601f01601f19169290920160200192915050565b6020815260006200039160208301846200052e565b8281526040602082015260006200058c60408301846200052e565b949350505050565b600060208284031215620005a757600080fd5b81516001600160401b0380821115620005bf57600080fd5b818401915084601f830112620005d457600080fd5b815181811115620005e957620005e962000398565b604051601f8201601f19908116603f0116810190838211818310171562000614576200061462000398565b816040528281528760208487010111156200062e57600080fd5b6200035b83602083016020880162000508565b612cdd80620006516000396000f3fe6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e30000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b60008080611489696773c5a04a6d4300884b60b11b6001600160e01b031986166113fb565b9050600061149682611359565b90506014815110156114af575060009485945092505050565b805160150361153057806014815181106114cb576114cb612a44565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f01000000000000000000000000000000000000000000000000000000000000000361153057611521816128d1565b60601c95600195509350505050565b611539816128d1565b60601c95600095509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806108e457506108e482611b81565b6000806115996301ffc9a760e01b611464565b5090506001600160a01b0381166115b35750600092915050565b6115bd81846112d0565b9392505050565b336115d76000546001600160a01b031690565b6001600160a01b031614611619576040517fbf1169c500000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b565b60608351855114158061163c57508251845114158061163c57508151835114155b15611673576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b84516000036116ae576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000855167ffffffffffffffff8111156116ca576116ca612345565b6040519080825280602002602001820160405280156116fd57816020015b60608152602001906001900390816116e85790505b50905060005b86518110156117a15761177c87828151811061172157611721612a44565b602002602001015187838151811061173b5761173b612a44565b602002602001015187848151811061175557611755612a44565b602002602001015187858151811061176f5761176f612a44565b60200260200101516117ab565b82828151811061178e5761178e612a44565b6020908102919091010152600101611703565b5095945050505050565b6060846117c4576117bd848484611bbf565b9050610a28565b600185036117fe576001600160a01b038416156117f457604051631820c12560e11b815260040160405180910390fd5b6117bd8383611cf0565b60028503611838576001600160a01b0384161561182e57604051631820c12560e11b815260040160405180910390fd5b6117bd8383611e0a565b60038503611882578215611878576040517f72f2bc6a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117bd8483611ef4565b6040517f7583b3bc0000000000000000000000000000000000000000000000000000000081526004810186905260240161082e565b60025443906000906118cb9060c890612b3f565b905060006118da60c883612b3f565b9050808311806118ea5750600254155b15611932576002839055600380546001600160a01b03191690556040517f81b7f830f1f0084db6497c486cbe6974c86488dcc4e3738eab94ab6d6b1653e790600090a1505050565b81831015611976576040517f1b080942000000000000000000000000000000000000000000000000000000008152600481018390526024810182905260440161082e565b61198060006111ce565b60006002819055600380546001600160a01b03191690556040517fd1f66c3d2bc1993a86be5e3d33709d98f0442381befcedd29f578b9b2506b1ce9190a1505050565b6003546001600160a01b03163314611a09576040517f451e452800000000000000000000000000000000000000000000000000000000815233600482015260240161082e565b611a12336111ce565b600380546001600160a01b03191690556000600255565b600080546001600160a01b03163314611ac0576004546001600160a01b03163314611abc5760405162461bcd60e51b815260206004820152603b60248201527f4f6e6c79204f776e6572206f72207265656e746572656420556e69766572736160448201527f6c2052656365697665722044656c656761746520616c6c6f7765640000000000606482015260840161082e565b5060015b90565b6000828152600160205260409020611adb8282612ba0565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611b0c919061273f565b60405180910390a25050565b306001600160a01b03821603611b5a576040517fe052a6f800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b03929092169190911790556000600255565b60006001600160e01b031982167f629aa6940000000000000000000000000000000000000000000000000000000014806108e457506108e482611ff8565b606082471015611beb576040516301bf351f60e31b81524760048201526024810184905260440161082e565b611bf482612c60565b6001600160e01b031916846001600160a01b031660007f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e86604051611c3b91815260200190565b60405180910390a4600080856001600160a01b03168585604051611c5f91906129fe565b60006040518083038185875af1925050503d8060008114611c9c576040519150601f19603f3d011682016040523d82523d6000602084013e611ca1565b606091505b5091509150611ce682826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b9695505050505050565b606082471015611d1c576040516301bf351f60e31b81524760048201526024810184905260440161082e565b8151600003611d3e5760405163b81cd8d960e01b815260040160405180910390fd5b600082516020840185f090506001600160a01b038116611d8a576040517f0b07489b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000801b816001600160a01b031660017fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c387604051611dcb91815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b16602082015260340160405160208183030381529060405291505092915050565b60608151600003611e2e5760405163b81cd8d960e01b815260040160405180910390fd5b6000611e478360208551611e429190612c94565b61205f565b90506000611e6484600060208751611e5f9190612c94565b6120c5565b90506000611e738684846121ed565b905082816001600160a01b031660027fa1fb700aaee2ae4a2ff6f91ce7eba292f89c2f5488b8ec4c5c5c8150692595c389604051611eb391815260200190565b60405180910390a46040516bffffffffffffffffffffffff19606083901b166020820152603401604051602081830303815290604052935050505092915050565b6060611eff82612c60565b6001600160e01b031916836001600160a01b031660037f4810874456b8e6487bd861375cf6abd8e1c8bb5858c8ce36a86a04dabfac199e6000604051611f4791815260200190565b60405180910390a4600080846001600160a01b031684604051611f6a91906129fe565b600060405180830381855afa9150503d8060008114611fa5576040519150601f19603f3d011682016040523d82523d6000602084013e611faa565b606091505b5091509150611fef82826040518060400160405280601681526020017f455243373235583a20556e6b6e6f776e204572726f7200000000000000000000815250612046565b95945050505050565b60006001600160e01b031982167f7545acac0000000000000000000000000000000000000000000000000000000014806108e457506301ffc9a760e01b6001600160e01b03198316146108e4565b606083156120555750816115bd565b6115bd83836122f1565b600061206c826020612b3f565b835110156120bc5760405162461bcd60e51b815260206004820152601560248201527f746f427974657333325f6f75744f66426f756e64730000000000000000000000604482015260640161082e565b50016020015190565b6060816120d381601f612b3f565b10156121215760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f77000000000000000000000000000000000000604482015260640161082e565b61212b8284612b3f565b8451101561217b5760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e6473000000000000000000000000000000604482015260640161082e565b60608215801561219a57604051915060008252602082016040526121e4565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156121d35780518352602092830192016121bb565b5050858452601f01601f1916604052505b50949350505050565b60008347101561223f5760405162461bcd60e51b815260206004820152601d60248201527f437265617465323a20696e73756666696369656e742062616c616e6365000000604482015260640161082e565b81516000036122905760405162461bcd60e51b815260206004820181905260248201527f437265617465323a2062797465636f6465206c656e677468206973207a65726f604482015260640161082e565b8282516020840186f590506001600160a01b0381166115bd5760405162461bcd60e51b815260206004820152601960248201527f437265617465323a204661696c6564206f6e206465706c6f7900000000000000604482015260640161082e565b8151156123015781518083602001fd5b8060405162461bcd60e51b815260040161082e919061273f565b60006020828403121561232d57600080fd5b81356001600160e01b0319811681146115bd57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff8111828210171561238457612384612345565b604052919050565b600067ffffffffffffffff8211156123a6576123a6612345565b5060051b60200190565b600082601f8301126123c157600080fd5b813560206123d66123d18361238c565b61235b565b82815260059290921b840181019181810190868411156123f557600080fd5b8286015b8481101561241057803583529183019183016123f9565b509695505050505050565b80356001600160a01b038116811461243257600080fd5b919050565b600067ffffffffffffffff82111561245157612451612345565b50601f01601f191660200190565b600082601f83011261247057600080fd5b813561247e6123d182612437565b81815284602083860101111561249357600080fd5b816020850160208301376000918101602001919091529392505050565b600082601f8301126124c157600080fd5b813560206124d16123d18361238c565b82815260059290921b840181019181810190868411156124f057600080fd5b8286015b8481101561241057803567ffffffffffffffff8111156125145760008081fd5b6125228986838b010161245f565b8452509183019183016124f4565b6000806000806080858703121561254657600080fd5b843567ffffffffffffffff8082111561255e57600080fd5b61256a888389016123b0565b955060209150818701358181111561258157600080fd5b8701601f8101891361259257600080fd5b80356125a06123d18261238c565b81815260059190911b8201840190848101908b8311156125bf57600080fd5b928501925b828410156125e4576125d58461241b565b825292850192908501906125c4565b975050505060408701359150808211156125fd57600080fd5b612609888389016123b0565b9350606087013591508082111561261f57600080fd5b5061262c878288016124b0565b91505092959194509250565b60005b8381101561265357818101518382015260200161263b565b50506000910152565b60008151808452612674816020860160208601612638565b601f01601f19169290920160200192915050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156126dd57603f198886030184526126cb85835161265c565b945092850192908501906001016126af565b5092979650505050505050565b6000806000806080858703121561270057600080fd5b843593506127106020860161241b565b925060408501359150606085013567ffffffffffffffff81111561273357600080fd5b61262c8782880161245f565b6020815260006115bd602083018461265c565b60006020828403121561276457600080fd5b5035919050565b6000806020838503121561277e57600080fd5b823567ffffffffffffffff8082111561279657600080fd5b818501915085601f8301126127aa57600080fd5b8135818111156127b957600080fd5b8660208260051b85010111156127ce57600080fd5b60209290920196919550909350505050565b600080604083850312156127f357600080fd5b82359150602083013567ffffffffffffffff81111561281157600080fd5b61281d8582860161245f565b9150509250929050565b6000806040838503121561283a57600080fd5b823567ffffffffffffffff8082111561285257600080fd5b61285e868387016123b0565b9350602085013591508082111561287457600080fd5b5061281d858286016124b0565b60006020828403121561289357600080fd5b813567ffffffffffffffff8111156128aa57600080fd5b610a28848285016123b0565b6000602082840312156128c857600080fd5b6115bd8261241b565b805160208201516bffffffffffffffffffffffff1980821692919060148310156129055780818460140360031b1b83161693505b505050919050565b6001600160a01b0385168152836020820152826040820152608060608201526000611ce6608083018461265c565b60006020828403121561294d57600080fd5b815167ffffffffffffffff81111561296457600080fd5b8201601f8101841361297557600080fd5b80516129836123d182612437565b81815285602083850101111561299857600080fd5b611fef826020830160208601612638565b6040815260006129bc604083018561265c565b8281036020840152611fef818561265c565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612a10818460208701612638565b9190910192915050565b604081526000612a2d604083018461265c565b828103602093840152600081529190910192915050565b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612a7157600080fd5b83018035915067ffffffffffffffff821115612a8c57600080fd5b602001915036819003821315612aa157600080fd5b9250929050565b8183823760009101908152919050565b828152604060208201526000610a28604083018461265c565b600181811c90821680612ae557607f821691505b6020821081036110fd57634e487b7160e01b600052602260045260246000fd5b805160208083015191908110156110fd5760001960209190910360031b1b16919050565b634e487b7160e01b600052601160045260246000fd5b808201808211156108e4576108e4612b29565b601f821115610e9757600081815260208120601f850160051c81016020861015612b795750805b601f850160051c820191505b81811015612b9857828155600101612b85565b505050505050565b815167ffffffffffffffff811115612bba57612bba612345565b612bce81612bc88454612ad1565b84612b52565b602080601f831160018114612c035760008415612beb5750858301515b600019600386901b1c1916600185901b178555612b98565b600085815260208120601f198616915b82811015612c3257888601518255948401946001909101908401612c13565b5085821015612c505787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6000815160208301516001600160e01b0319808216935060048310156129055760049290920360031b82901b161692915050565b818103818111156108e4576108e4612b2956fea2646970667358221220ff7e847f2f95a0b087fe025531ffe532f3b2196250242ddb8aa31a3c8041c1bb64736f6c63430008110033", "deployedBytecode": "0x6080604052600436106101125760003560e01c806379ba5097116100a5578063dedff9c611610074578063ead3fbdf11610059578063ead3fbdf14610203578063f2fde38b146103ae578063ffa1ad74146103ce5761015d565b8063dedff9c614610370578063e30c3978146103905761015d565b806379ba5097146103035780637f23690c146103185780638da5cb5b1461032b578063979024211461035d5761015d565b806354f6127f116100e157806354f6127f1461029b5780636963d438146102bb5780636bb56a14146102db578063715018a6146102ee5761015d565b806301bfba611461020357806301ffc9a71461022b578063318584521461025b57806344c028fe1461027b5761015d565b3661015d57341561015b576101597f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b60405180602001604052806000815250610417565b505b005b600036606060048210156101eb5734156101d6576101d47f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b84848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b506040805160208101909152600081526101f8565b6101f5838361070e565b90505b915050805190602001f35b34801561020f57600080fd5b5061021860c881565b6040519081526020015b60405180910390f35b34801561023757600080fd5b5061024b61024636600461231b565b6108ea565b6040519015158152602001610222565b61026e610269366004612530565b610986565b6040516102229190612688565b61028e6102893660046126ea565b610a30565b604051610222919061273f565b3480156102a757600080fd5b5061028e6102b6366004612752565b610acf565b3480156102c757600080fd5b5061026e6102d636600461276b565b610ada565b61028e6102e93660046127e0565b610417565b3480156102fa57600080fd5b5061015b610c3d565b34801561030f57600080fd5b5061015b610cd3565b61015b6103263660046127e0565b610dcb565b34801561033757600080fd5b506000546001600160a01b03165b6040516001600160a01b039091168152602001610222565b61015b61036b366004612827565b610e9c565b34801561037c57600080fd5b5061026e61038b366004612881565b611058565b34801561039c57600080fd5b506003546001600160a01b0316610345565b3480156103ba57600080fd5b5061015b6103c93660046128b6565b611103565b3480156103da57600080fd5b5061028e6040518060400160405280600681526020017f302e31352e30000000000000000000000000000000000000000000000000000081525081565b6060341580159061044857507f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc8314155b156104b3576104b17f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b6000368080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b60006104de7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47611359565b9050606060148251106105a15760006104f6836128d1565b60601c905061050c81635122dded60e11b6112d0565b1561059f57600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161055591339134918c918c910161290d565b6000604051808303816000875af1158015610574573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261059c919081019061293b565b91505b505b60006105ba690cfc51aec37c55a4d0b160b01b876113fb565b905060006105c782611359565b90506060601482511061068a5760006105df836128d1565b60601c90506105f581635122dded60e11b6112d0565b1561068857600480546001600160a01b0319166001600160a01b0383169081178255604051635122dded60e11b8152909163a245bbda9161063e91339134918f918f910161290d565b6000604051808303816000875af115801561065d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610685919081019061293b565b91505b505b600480546001600160a01b03191690556040516106ad90859083906020016129a9565b60405160208183030381529060405295508734336001600160a01b03167f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c28a8a6040516106fb9291906129a9565b60405180910390a4505050505092915050565b60606000806107286000356001600160e01b031916611464565b915091503460001415801561073b575080155b156107a5576107a37f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc60001b86868080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061041792505050565b505b6000356001600160e01b0319161580156107c657506001600160a01b038216155b156107e45760405180602001604052806000815250925050506108e4565b6001600160a01b038216610837576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024015b60405180910390fd5b600080836001600160a01b031683610850576000610852565b345b8888333460405160200161086994939291906129ce565b60408051601f1981840301815290829052610883916129fe565b60006040518083038185875af1925050503d80600081146108c0576040519150601f19603f3d011682016040523d82523d6000602084013e6108c5565b606091505b509150915081156108db5793506108e492505050565b80518060208301fd5b92915050565b60006001600160e01b031982167f28af17e600000000000000000000000000000000000000000000000000000000148061093457506001600160e01b03198216631aed5a8560e21b145b8061096857506001600160e01b031982167f94be599900000000000000000000000000000000000000000000000000000000145b80610977575061097782611548565b806108e457506108e482611586565b60606109906115c4565b3415610a19576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610a1091612a1a565b60405180910390a45b610a258585858561161b565b90505b949350505050565b6060610a3a6115c4565b3415610ac3576040516001600160e01b03196000351660208201527f468cd1581d7bc001c3b685513d2b929b55437be34700410383d58f3aa1ea0abc90349033907f9c3ba68eb5742b8e3961aea0afc7371a71bf433c8a67a831803b64c064a178c29060240160408051601f1981840301815290829052610aba91612a1a565b60405180910390a45b610a25858585856117ab565b60606108e482611359565b60608167ffffffffffffffff811115610af557610af5612345565b604051908082528060200260200182016040528015610b2857816020015b6060815260200190600190039081610b135790505b50905060005b82811015610c365760008030868685818110610b4c57610b4c612a44565b9050602002810190610b5e9190612a5a565b604051610b6c929190612aa8565b600060405180830381855af49150503d8060008114610ba7576040519150601f19603f3d011682016040523d82523d6000602084013e610bac565b606091505b509150915081610c0e57805115610bc65780518082602001fd5b60405162461bcd60e51b815260206004820152601960248201527f4c5350393a20626174636843616c6c7320726576657274656400000000000000604482015260640161082e565b80848481518110610c2157610c21612a44565b60209081029190910101525050600101610b2e565b5092915050565b610c456115c4565b6000546001600160a01b0316610c596118b7565b6000546001600160a01b0316610cd057604080516001600160a01b0383166020820152600091810191909152610cd0907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa65169471906060015b60408051601f198184030181529190526001600160a01b038416919061123c565b50565b600354600160a01b900460ff1615610d17576040517f5758dd0700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000546001600160a01b0316610d2b6119c3565b604080516001600160a01b03831660208201523391810191909152610d74907f0c622e58e6b7089ae35f1af1c86d997be92fcdd8c9509652022d41aa6516947190606001610caf565b604080516001600160a01b0383166020820152338183018190528251808303840181526060909201909252610cd091907f79855c97dbc259ce395421d933d7bc0699b0f1561f988f09a9e8633fd542fe5c9061123c565b3415610dea5760405163f36ba73760e01b815260040160405180910390fd5b6000610df4611a29565b90508015610e8d576001600160a01b03198316690cfc51aec37c55a4d0b160b01b1480610e4b57507fffffffffffff00000000000000000000000000000000000000000000000000008316654b80742de2bf60d01b145b80610e6c57506001600160a01b03198316696773c5a04a6d4300884b60b11b145b15610e8d5760405163199611f160e01b81526004810184905260240161082e565b610e978383611ac3565b505050565b6000610ea6611a29565b90508151835114610ee3576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610f025760405163f36ba73760e01b815260040160405180910390fd5b60005b835181101561105257811561100e578351690cfc51aec37c55a4d0b160b01b90859083908110610f3757610f37612a44565b60200260200101516001600160a01b0319161480610f9657508351654b80742de2bf60d01b90859083908110610f6f57610f6f612a44565b602002602001015179ffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610fd357508351696773c5a04a6d4300884b60b11b90859083908110610fbf57610fbf612a44565b60200260200101516001600160a01b031916145b1561100e57838181518110610fea57610fea612a44565b602002602001015160405163199611f160e01b815260040161082e91815260200190565b61104a84828151811061102357611023612a44565b602002602001015184838151811061103d5761103d612a44565b6020026020010151611ac3565b600101610f05565b50505050565b6060815167ffffffffffffffff81111561107457611074612345565b6040519080825280602002602001820160405280156110a757816020015b60608152602001906001900390816110925790505b50905060005b82518110156110fd576110d88382815181106110cb576110cb612a44565b6020026020010151611359565b8282815181106110ea576110ea612a44565b60209081029190910101526001016110ad565b50919050565b61110b6115c4565b6003805460ff60a01b1916600160a01b17905561112781611b18565b600080546040516001600160a01b03918216929184169183917f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e227009190a3604080516001600160a01b038381166020830152841681830181905282518083038401815260609092019092526111bd91907faefd43f45fed1bcd8992f23c803b6f4ec45cf6b62b0d404d565f290a471e763f9061123c565b50506003805460ff60a01b19169055565b6000546001600160a01b03828116911614610cd057600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0383166001600160a01b031990911617905550565b6112566001600160a01b038416631aed5a8560e21b6112d0565b15610e9757604051631aed5a8560e21b81526001600160a01b03841690636bb56a14906112899085908590600401612ab8565b6000604051808303816000875af11580156112a8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611052919081019061293b565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015611342575060208210155b801561134e5750600081115b979650505050505050565b600081815260016020526040902080546060919061137690612ad1565b80601f01602080910402602001604051908101604052809291908181526020018280546113a290612ad1565b80156113ef5780601f106113c4576101008083540402835291602001916113ef565b820191906000526020600020905b8154815290600101906020018083116113d257829003601f168201915b50505050509050919050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c83015291829101604051602081830303815290604052905080610a2890612b05565b6000