UNPKG

@lukso/lsp-smart-contracts

Version:

The reference smart contract implementation for the LUKSO LSP standards

850 lines 63.1 kB
{ "_format": "hh-sol-artifact-1", "contractName": "LSP7Mintable", "sourceName": "@lukso/lsp7-contracts/contracts/presets/LSP7Mintable.sol", "abi": [ { "inputs": [ { "internalType": "string", "name": "name_", "type": "string" }, { "internalType": "string", "name": "symbol_", "type": "string" }, { "internalType": "address", "name": "newOwner_", "type": "address" }, { "internalType": "uint256", "name": "lsp4TokenType_", "type": "uint256" }, { "internalType": "bool", "name": "isNonDivisible_", "type": "bool" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_MsgValueDisallowed", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "storedData", "type": "bytes" } ], "name": "InvalidExtensionAddress", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "InvalidFunctionSelector", "type": "error" }, { "inputs": [], "name": "LSP4TokenNameNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenSymbolNotEditable", "type": "error" }, { "inputs": [], "name": "LSP4TokenTypeNotEditable", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "authorizedAmount", "type": "uint256" }, { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsAuthorizedAmount", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "LSP7AmountExceedsBalance", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "callIndex", "type": "uint256" } ], "name": "LSP7BatchCallFailed", "type": "error" }, { "inputs": [], "name": "LSP7CannotSendWithAddressZero", "type": "error" }, { "inputs": [], "name": "LSP7CannotUseAddressZeroAsOperator", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7DecreaseAllowanceNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7DecreasedAllowanceBelowZero", "type": "error" }, { "inputs": [], "name": "LSP7InvalidTransferBatch", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverContractMissingLSP1Interface", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "tokenReceiver", "type": "address" } ], "name": "LSP7NotifyTokenReceiverIsEOA", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "address", "name": "operator", "type": "address" } ], "name": "LSP7RevokeOperatorNotAuthorized", "type": "error" }, { "inputs": [], "name": "LSP7TokenContractCannotHoldValue", "type": "error" }, { "inputs": [], "name": "LSP7TokenOwnerCannotBeOperator", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "functionSelector", "type": "bytes4" } ], "name": "NoExtensionFoundForFunctionSelector", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" } ], "name": "OperatorAllowanceCannotBeIncreasedFromZero", "type": "error" }, { "inputs": [], "name": "OwnableCannotSetZeroAddressAsOwner", "type": "error" }, { "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": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorAuthorizationChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenOwner", "type": "address" }, { "indexed": true, "internalType": "bool", "name": "notified", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "OperatorRevoked", "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": true, "internalType": "address", "name": "operator", "type": "address" }, { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" }, { "indexed": false, "internalType": "bool", "name": "force", "type": "bool" }, { "indexed": false, "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "Transfer", "type": "event" }, { "stateMutability": "payable", "type": "fallback" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "authorizeOperator", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "authorizedAmountFor", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "batchCalls", "outputs": [ { "internalType": "bytes[]", "name": "results", "type": "bytes[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "decimals", "outputs": [ { "internalType": "uint8", "name": "", "type": "uint8" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "uint256", "name": "subtractedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "decreaseAllowance", "outputs": [], "stateMutability": "nonpayable", "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": [ { "internalType": "address", "name": "tokenOwner", "type": "address" } ], "name": "getOperatorsOf", "outputs": [ { "internalType": "address[]", "name": "", "type": "address[]" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "uint256", "name": "addedAmount", "type": "uint256" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "increaseAllowance", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "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": "renounceOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "operator", "type": "address" }, { "internalType": "address", "name": "tokenOwner", "type": "address" }, { "internalType": "bool", "name": "notify", "type": "bool" }, { "internalType": "bytes", "name": "operatorNotificationData", "type": "bytes" } ], "name": "revokeOperator", "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": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "uint256", "name": "amount", "type": "uint256" }, { "internalType": "bool", "name": "force", "type": "bool" }, { "internalType": "bytes", "name": "data", "type": "bytes" } ], "name": "transfer", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "from", "type": "address[]" }, { "internalType": "address[]", "name": "to", "type": "address[]" }, { "internalType": "uint256[]", "name": "amount", "type": "uint256[]" }, { "internalType": "bool[]", "name": "force", "type": "bool[]" }, { "internalType": "bytes[]", "name": "data", "type": "bytes[]" } ], "name": "transferBatch", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "transferOwnership", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ], "bytecode": "0x60806040523480156200001157600080fd5b5060405162002e9638038062002e96833981016040819052620000349162000341565b848484848484848484816200004933620001cb565b6001600160a01b03811662000071576040516306b620db60e21b815260040160405180910390fd5b6200008781620001cb60201b62000dfa1760201c565b50620000de7feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c60001b604051806040016040528060048152602001632936598960e21b8152506200021b60201b62000e621760201c565b620001187fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af160001b856200021b60201b62000e621760201c565b620001527f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db93275660001b846200021b60201b62000e621760201c565b6040805160208101839052620001a5917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb391016040516020818303038152906040526200021b60201b62000e621760201c565b50506002805460ff19169315159390931790925550620005829950505050505050505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600082815260016020526040902062000235828262000481565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516200026891906200054d565b60405180910390a25050565b634e487b7160e01b600052604160045260246000fd5b60005b83811015620002a75781810151838201526020016200028d565b50506000910152565b600082601f830112620002c257600080fd5b81516001600160401b0380821115620002df57620002df62000274565b604051601f8301601f19908116603f011681019082821181831017156200030a576200030a62000274565b816040528381528660208588010111156200032457600080fd5b620003378460208301602089016200028a565b9695505050505050565b600080600080600060a086880312156200035a57600080fd5b85516001600160401b03808211156200037257600080fd5b6200038089838a01620002b0565b965060208801519150808211156200039757600080fd5b50620003a688828901620002b0565b604088015190955090506001600160a01b0381168114620003c657600080fd5b6060870151608088015191945092508015158114620003e457600080fd5b809150509295509295909350565b600181811c908216806200040757607f821691505b6020821081036200042857634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200047c57600081815260208120601f850160051c81016020861015620004575750805b601f850160051c820191505b81811015620004785782815560010162000463565b5050505b505050565b81516001600160401b038111156200049d576200049d62000274565b620004b581620004ae8454620003f2565b846200042e565b602080601f831160018114620004ed5760008415620004d45750858301515b600019600386901b1c1916600185901b17855562000478565b600085815260208120601f198616915b828110156200051e57888601518255948401946001909101908401620004fd565b50858210156200053d5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60208152600082518060208401526200056e8160408501602087016200028a565b601f01601f19169190910160400192915050565b61290480620005926000396000f3fe60806040526004361061016e5760003560e01c8063715018a6116100cb5780638da5cb5b1161007f578063d72fc29a11610059578063d72fc29a14610493578063dedff9c6146104c0578063f2fde38b146104e0576101e2565b80638da5cb5b146104385780639790242114610460578063b49506fd14610473576101e2565b8063760d9bba116100b0578063760d9bba146103e557806378381670146104055780637f23690c14610425576101e2565b8063715018a6146103b05780637580d920146103c5576101e2565b8063313ce5671161012257806365aeaa951161010757806365aeaa951461032d5780636963d4381461034d57806370a082311461037a576101e2565b8063313ce567146102d957806354f6127f14610300576101e2565b80632bc1da82116101535780632bc1da82146102775780632d7667c91461029957806330d0dc37146102b9576101e2565b806301ffc9a71461022357806318160ddd14610258576101e2565b366101e257346000036101b05760405163e5099ee360e01b81526004016101a79060208082526004908201526000604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000366060600482101561020d57828260405163e5099ee360e01b81526004016101a7929190611c80565b6102178383610500565b80519350602001915050f35b34801561022f57600080fd5b5061024361023e366004611caf565b61060f565b60405190151581526020015b60405180910390f35b34801561026457600080fd5b506003545b60405190815260200161024f565b34801561028357600080fd5b50610297610292366004611dba565b61065c565b005b3480156102a557600080fd5b506102976102b4366004611fef565b610705565b3480156102c557600080fd5b506102976102d43660046120c1565b61080d565b3480156102e557600080fd5b506102ee6108ce565b60405160ff909116815260200161024f565b34801561030c57600080fd5b5061032061031b366004612130565b6108e7565b60405161024f9190612199565b34801561033957600080fd5b506102696103483660046121ac565b6108f2565b34801561035957600080fd5b5061036d6103683660046121df565b610958565b60405161024f9190612254565b34801561038657600080fd5b506102696103953660046122b6565b6001600160a01b031660009081526004602052604090205490565b3480156103bc57600080fd5b50610297610aa8565b3480156103d157600080fd5b506102976103e03660046122d1565b610abc565b3480156103f157600080fd5b50610297610400366004612305565b610ad0565b34801561041157600080fd5b50610297610420366004612371565b610af8565b6102976104333660046123c1565b610bf5565b34801561044457600080fd5b506000546040516001600160a01b03909116815260200161024f565b61029761046e366004612408565b610c2a565b34801561047f57600080fd5b5061029761048e366004611dba565b610c5b565b34801561049f57600080fd5b506104b36104ae3660046122b6565b610c9b565b60405161024f9190612462565b3480156104cc57600080fd5b5061036d6104db3660046124af565b610cbf565b3480156104ec57600080fd5b506102976104fb3660046122b6565b610d6a565b606060006105196000356001600160e01b031916610eb7565b5090506001600160a01b03811661056a576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024016101a7565b600080826001600160a01b0316348787333460405160200161058f94939291906124e4565b60408051601f19818403018152908290526105a991612514565b60006040518083038185875af1925050503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b50915091508115610600579250610609915050565b80518060208301fd5b92915050565b60006001600160e01b031982167fc52d600800000000000000000000000000000000000000000000000000000000148061064d575061064d82610f61565b80610609575061060982610f9f565b600061066884336108f2565b9050806000036106af576040517fcba6e9770000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101a7565b60006106bb8483612546565b90506106cb338683600187610fdd565b60003382856040516020016106e293929190612559565b60405160208183030381529060405290506106fd8682611182565b505050505050565b8451845181141580610718575083518114155b80610724575082518114155b80610730575081518114155b15610767576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610804576107fc8782815181106107875761078761258a565b60200260200101518783815181106107a1576107a161258a565b60200260200101518784815181106107bb576107bb61258a565b60200260200101518785815181106107d5576107d561258a565b60200260200101518786815181106107ef576107ef61258a565b6020026020010151610ad0565b60010161076a565b50505050505050565b336001600160a01b0384161480159061082f5750336001600160a01b03851614155b1561087f576040517f1a525b320000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038085166024830152851660448201526064016101a7565b61088d838560008585610fdd565b81156108c8576000836000836040516020016108ab939291906125a0565b60405160208183030381529060405290506108c68582611182565b505b50505050565b60025460009060ff166108e15750601290565b50600090565b6060610609826111ad565b6000826001600160a01b0316826001600160a01b03160361092c57506001600160a01b038116600090815260046020526040902054610609565b506001600160a01b03808216600090815260066020908152604080832093861683529290522054610609565b60608167ffffffffffffffff81111561097357610973611cf5565b6040519080825280602002602001820160405280156109a657816020015b60608152602001906001900390816109915790505b50905060005b82811015610aa157600080308686858181106109ca576109ca61258a565b90506020028101906109dc91906125cb565b6040516109ea929190612619565b600060405180830381855af49150503d8060008114610a25576040519150601f19603f3d011682016040523d82523d6000602084013e610a2a565b606091505b509150915081610a7957805115610a445780518082602001fd5b6040517fb774c284000000000000000000000000000000000000000000000000000000008152600481018490526024016101a7565b80848481518110610a8c57610a8c61258a565b602090810291909101015250506001016109ac565b5092915050565b610ab061124f565b610aba6000610dfa565b565b610ac461124f565b6108c8848484846112a9565b336001600160a01b03861614610aeb57610aeb338685611332565b6108c685858585856113e2565b336001600160a01b03841614801590610b1a5750336001600160a01b03851614155b15610b6a576040517f98ce29450000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038085166024830152851660448201526064016101a7565b6000610b7685856108f2565b905082811015610bb2576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828103610bc3858783600187610fdd565b6000858285604051602001610bda93929190612559565b60405160208183030381529060405290506108048782611182565b610bfd61124f565b3415610c1c5760405163f36ba73760e01b815260040160405180910390fd5b610c268282611485565b5050565b610c3261124f565b3415610c515760405163f36ba73760e01b815260040160405180910390fd5b610c268282611590565b610c69338484600185610fdd565b6000338383604051602001610c8093929190612559565b60405160208183030381529060405290506108c88482611182565b6001600160a01b03811660009081526005602052604090206060906106099061165b565b6060815167ffffffffffffffff811115610cdb57610cdb611cf5565b604051908082528060200260200182016040528015610d0e57816020015b6060815260200190600190039081610cf95790505b50905060005b8251811015610d6457610d3f838281518110610d3257610d3261258a565b60200260200101516111ad565b828281518110610d5157610d5161258a565b6020908102919091010152600101610d14565b50919050565b610d7261124f565b6001600160a01b038116610dee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101a7565b610df781610dfa565b50565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000828152600160205260409020610e7a82826126a3565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051610eab9190612199565b60405180910390a25050565b60008080610eef7fcee78b4094da86011096000000000000000000000000000000000000000000006001600160e01b03198616611668565b90506000610efc826111ad565b90508051601414158015610f105750805115155b15610f4957806040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016101a79190612199565b610f5281612763565b60601c95600195509350505050565b60006001600160e01b031982167fa918fa6b0000000000000000000000000000000000000000000000000000000014806106095750610609826116d9565b600080610fb26301ffc9a760e01b610eb7565b5090506001600160a01b038116610fcc5750600092915050565b610fd68184611727565b9392505050565b6001600160a01b03841661101d576040517f6355e76600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b0316846001600160a01b031603611068576040517fdab7504700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038086166000908152600660209081526040808320938816835292905220839055821561110a576001600160a01b03851660009081526005602052604090206110b890856117c5565b5082856001600160a01b0316856001600160a01b03167ff772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d846040516110fd9190612199565b60405180910390a46108c6565b6001600160a01b038516600090815260056020526040902061112c90856117da565b50811515856001600160a01b0316856001600160a01b03167f0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167846040516111739190612199565b60405180910390a45050505050565b610c26827f386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc836117ef565b60008181526001602052604090208054606091906111ca90612629565b80601f01602080910402602001604051908101604052809291908181526020018280546111f690612629565b80156112435780601f1061121857610100808354040283529160200191611243565b820191906000526020600020905b81548152906001019060200180831161122657829003601f168201915b50505050509050919050565b6000546001600160a01b03163314610aba5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101a7565b6001600160a01b0384166112d057604051630d2d5ec360e41b815260040160405180910390fd5b6112de6000858585856108c6565b6112ec600085858585611883565b6112fa6000858585856108c6565b600033600086868560405160200161131695949392919061279f565b60405160208183030381529060405290506108c68584836119c5565b6001600160a01b0380831660009081526006602090815260408083209387168352929052205480158061136457508082115b156113bc576040517ff3a6b6910000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301526024820183905285166044820152606481018390526084016101a7565b6108c883856113cb85856127d9565b600060405180602001604052806000815250610fdd565b6001600160a01b03851615806113ff57506001600160a01b038416155b1561141d57604051630d2d5ec360e41b815260040160405180910390fd5b61142a85858585856108c6565b6114378585858585611883565b61144485858585856108c6565b6000338686868560405160200161145f95949392919061279f565b604051602081830303815290604052905061147a8682611ab8565b6106fd8584836119c5565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f82016114de576040517f85c169bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa8201611537576040517f76755b3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d8201610e62576040517f4ef6d7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80518251146115cb576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8151600003611606576040517f97da5f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b82518110156116565761164e8382815181106116275761162761258a565b60200260200101518383815181106116415761164161258a565b6020026020010151611485565b600101611609565b505050565b60606000610fd683611ae3565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806116d1906127ec565b949350505050565b60006001600160e01b031982167f629aa69400000000000000000000000000000000000000000000000000000000148061060957506301ffc9a760e01b6001600160e01b0319831614610609565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d915060005190508280156117ae575060208210155b80156117ba5750600081115b979650505050505050565b6000610fd6836001600160a01b038416611b3e565b6000610fd6836001600160a01b038416611b8d565b6118096001600160a01b038416631aed5a8560e21b611727565b1561165657604051631aed5a8560e21b81526001600160a01b03841690636bb56a149061183c9085908590600401612810565b6000604051808303816000875af115801561185b573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526108c89190810190612829565b6001600160a01b0385166118ae5782600360008282546118a39190612546565b909155506119399050565b6001600160a01b0385166000908152600460205260409020548381101561191a576040517f08d47949000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b0387166024820152604481018590526064016101a7565b6001600160a01b03861660009081526004602052604090209084900390555b6001600160a01b03841661195557600380548490039055611974565b6001600160a01b03841660009081526004602052604090208054840190555b836001600160a01b0316856001600160a01b0316336001600160a01b03167f3997e418d2cef0b3b0e907b1e39605c3f7d32dbd061e82ea5b4a770d46a160a686868660405161117393929190612897565b6119d683631aed5a8560e21b611727565b15611a2957604051631aed5a8560e21b81526001600160a01b03841690636bb56a149061183c907f20804611b3e2ea21c480dc465142210acf4a2485947541770ec1fb87dee4a55c908590600401612810565b81611656576001600160a01b0383163b15611a7b576040517fa608fbb60000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016101a7565b6040517f26c247f40000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024016101a7565b610c26827f429ac7a06903dbc9c13dfcb3c9d11df8194581fa047c96d7a4171fc7402958ea836117ef565b60608160000180548060200260200160405190810160405280929190818152602001828054801561124357602002820191906000526020600020905b815481526020019060010190808311611b1f5750505050509050919050565b6000818152600183016020526040812054611b8557508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610609565b506000610609565b60008181526001830160205260408120548015611c76576000611bb16001836127d9565b8554909150600090611bc5906001906127d9565b9050818114611c2a576000866000018281548110611be557611be561258a565b9060005260206000200154905080876000018481548110611c0857611c0861258a565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611c3b57611c3b6128b8565b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050610609565b6000915050610609565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215611cc157600080fd5b81356001600160e01b031981168114610fd657600080fd5b80356001600160a01b0381168114611cf057600080fd5b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611d3457611d34611cf5565b604052919050565b600067ffffffffffffffff821115611d5657611d56611cf5565b50601f01601f191660200190565b600082601f830112611d7557600080fd5b8135611d88611d8382611d3c565b611d0b565b818152846020838601011115611d9d57600080fd5b816020850160208301376000918101602001919091529392505050565b600080600060608486031215611dcf57600080fd5b611dd884611cd9565b925060208401359150604084013567ffffffffffffffff811115611dfb57600080fd5b611e0786828701611d64565b9150509250925092565b600067ffffffffffffffff821115611e2b57611e2b611cf5565b5060051b60200190565b600082601f830112611e4657600080fd5b81356020611e56611d8383611e11565b82815260059290921b84018101918181019086841115611e7557600080fd5b8286015b84811015611e9757611e8a81611cd9565b8352918301918301611e79565b509695505050505050565b600082601f830112611eb357600080fd5b81356020611ec3611d8383611e11565b82815260059290921b84018101918181019086841115611ee257600080fd5b8286015b84811015611e975780358352918301918301611ee6565b80358015158114611cf057600080fd5b600082601f830112611f1e57600080fd5b81356020611f2e611d8383611e11565b82815260059290921b84018101918181019086841115611f4d57600080fd5b8286015b84811015611e9757611f6281611efd565b8352918301918301611f51565b600082601f830112611f8057600080fd5b81356020611f90611d8383611e11565b82815260059290921b84018101918181019086841115611faf57600080fd5b8286015b84811015611e9757803567ffffffffffffffff811115611fd35760008081fd5b611fe18986838b0101611d64565b845250918301918301611fb3565b600080600080600060a0868803121561200757600080fd5b853567ffffffffffffffff8082111561201f57600080fd5b61202b89838a01611e35565b9650602088013591508082111561204157600080fd5b61204d89838a01611e35565b9550604088013591508082111561206357600080fd5b61206f89838a01611ea2565b9450606088013591508082111561208557600080fd5b61209189838a01611f0d565b935060808801359150808211156120a757600080fd5b506120b488828901611f6f565b9150509295509295909350565b600080600080608085870312156120d757600080fd5b6120e085611cd9565b93506120ee60208601611cd9565b92506120fc60408601611efd565b9150606085013567ffffffffffffffff81111561211857600080fd5b61212487828801611d64565b91505092959194509250565b60006020828403121561214257600080fd5b5035919050565b60005b8381101561216457818101518382015260200161214c565b50506000910152565b60008151808452612185816020860160208601612149565b601f01601f19169290920160200192915050565b602081526000610fd6602083018461216d565b600080604083850312156121bf57600080fd5b6121c883611cd9565b91506121d660208401611cd9565b90509250929050565b600080602083850312156121f257600080fd5b823567ffffffffffffffff8082111561220a57600080fd5b818501915085601f83011261221e57600080fd5b81358181111561222d57600080fd5b8660208260051b850101111561224257600080fd5b60209290920196919550909350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b828110156122a957603f1988860301845261229785835161216d565b9450928501929085019060010161227b565b5092979650505050505050565b6000602082840312156122c857600080fd5b610fd682611cd9565b600080600080608085870312156122e757600080fd5b6122f085611cd9565b9350602085013592506120fc60408601611efd565b600080600080600060a0868803121561231d57600080fd5b61232686611cd9565b945061233460208701611cd9565b93506040860135925061234960608701611efd565b9150608086013567ffffffffffffffff81111561236557600080fd5b6120b488828901611d64565b6000806000806080858703121561238757600080fd5b61239085611cd9565b935061239e60208601611cd9565b925060408501359150606085013567ffffffffffffffff81111561211857600080fd5b600080604083850312156123d457600080fd5b82359150602083013567ffffffffffffffff8111156123f257600080fd5b6123fe85828601611d64565b9150509250929050565b6000806040838503121561241b57600080fd5b823567ffffffffffffffff8082111561243357600080fd5b61243f86838701611ea2565b9350602085013591508082111561245557600080fd5b506123fe85828601611f6f565b6020808252825182820181905260009190848201906040850190845b818110156124a35783516001600160a01b03168352928401929184019160010161247e565b50909695505050505050565b6000602082840312156124c157600080fd5b813567ffffffffffffffff8111156124d857600080fd5b6116d184828501611ea2565b8385823760609290921b6bffffffffffffffffffffffff1916919092019081526014810191909152603401919050565b60008251612526818460208701612149565b9190910192915050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561060957610609612530565b6001600160a01b0384168152826020820152606060408201526000612581606083018461216d565b95945050505050565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038416815260ff83166020820152606060408201526000612581606083018461216d565b6000808335601e198436030181126125e257600080fd5b83018035915067ffffffffffffffff8211156125fd57600080fd5b60200191503681900382131561261257600080fd5b9250929050565b8183823760009101908152919050565b600181811c9082168061263d57607f821691505b602082108103610d6457634e487b7160e01b600052602260045260246000fd5b601f82111561165657600081815260208120601f850160051c810160208610156126845750805b601f850160051c820191505b818110156106fd57828155600101612690565b815167ffffffffffffffff8111156126bd576126bd611cf5565b6126d1816126cb8454612629565b8461265d565b602080601f83116001811461270657600084156126ee5750858301515b600019600386901b1c1916600185901b1785556106fd565b600085815260208120601f198616915b8281101561273557888601518255948401946001909101908401612716565b50858210156127535787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b805160208201516bffffffffffffffffffffffff1980821692919060148310156127975780818460140360031b1b83161693505b505050919050565b60006001600160a01b038088168352808716602084015280861660408401525083606083015260a060808301526117ba60a083018461216d565b8181038181111561060957610609612530565b80516020808301519190811015610d645760001960209190910360031b1b16919050565b8281526040602082015260006116d1604083018461216d565b60006020828403121561283b57600080fd5b815167ffffffffffffffff81111561285257600080fd5b8201601f8101841361286357600080fd5b8051612871611d8382611d3c565b81815285602083850101111561288657600080fd5b612581826020830160208601612149565b8381528215156020820152606060408201526000612581606083018461216d565b634e487b7160e01b600052603160045260246000fdfea2646970667358221220914c0ef6d499ee7c3743c73874d7695401e9877f5276038127012df98e777c9964736f6c63430008110033", "deployedBytecode": "0x60806040526004361061016e5760003560e01c8063715018a6116100cb5780638da5cb5b1161007f578063d72fc29a11610059578063d72fc29a14610493578063dedff9c6146104c0578063f2fde38b146104e0576101e2565b80638da5cb5b146104385780639790242114610460578063b49506fd14610473576101e2565b8063760d9bba116100b0578063760d9bba146103e557806378381670146104055780637f23690c14610425576101e2565b8063715018a6146103b05780637580d920146103c5576101e2565b8063313ce5671161012257806365aeaa951161010757806365aeaa951461032d5780636963d4381461034d57806370a082311461037a576101e2565b8063313ce567146102d957806354f6127f14610300576101e2565b80632bc1da82116101535780632bc1da82146102775780632d7667c91461029957806330d0dc37146102b9576101e2565b806301ffc9a71461022357806318160ddd14610258576101e2565b366101e257346000036101b05760405163e5099ee360e01b81526004016101a79060208082526004908201526000604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000366060600482101561020d57828260405163e5099ee360e01b81526004016101a7929190611c80565b6102178383610500565b80519350602001915050f35b34801561022f57600080fd5b5061024361023e366004611caf565b61060f565b60405190151581526020015b60405180910390f35b34801561026457600080fd5b506003545b60405190815260200161024f565b34801561028357600080fd5b50610297610292366004611dba565b61065c565b005b3480156102a557600080fd5b506102976102b4366004611fef565b610705565b3480156102c557600080fd5b506102976102d43660046120c1565b61080d565b3480156102e557600080fd5b506102ee6108ce565b60405160ff909116815260200161024f565b34801561030c57600080fd5b5061032061031b366004612130565b6108e7565b60405161024f9190612199565b34801561033957600080fd5b506102696103483660046121ac565b6108f2565b34801561035957600080fd5b5061036d6103683660046121df565b610958565b60405161024f9190612254565b34801561038657600080fd5b506102696103953660046122b6565b6001600160a01b031660009081526004602052604090205490565b3480156103bc57600080fd5b50610297610aa8565b3480156103d157600080fd5b506102976103e03660046122d1565b610abc565b3480156103f157600080fd5b50610297610400366004612305565b610ad0565b34801561041157600080fd5b50610297610420366004612371565b610af8565b6102976104333660046123c1565b610bf5565b34801561044457600080fd5b506000546040516001600160a01b03909116815260200161024f565b61029761046e366004612408565b610c2a565b34801561047f57600080fd5b5061029761048e366004611dba565b610c5b565b34801561049f57600080fd5b506104b36104ae3660046122b6565b610c9b565b60405161024f9190612462565b3480156104cc57600080fd5b5061036d6104db3660046124af565b610cbf565b3480156104ec57600080fd5b506102976104fb3660046122b6565b610d6a565b606060006105196000356001600160e01b031916610eb7565b5090506001600160a01b03811661056a576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081526001600160e01b03196000351660048201526024016101a7565b600080826001600160a01b0316348787333460405160200161058f94939291906124e4565b60408051601f19818403018152908290526105a991612514565b60006040518083038185875af1925050503d80600081146105e6576040519150601f19603f3d011682016040523d82523d6000602084013e6105eb565b606091505b50915091508115610600579250610609915050565b80518060208301fd5b92915050565b60006001600160e01b031982167fc52d600800000000000000000000000000000000000000000000000000000000148061064d575061064d82610f61565b80610609575061060982610f9f565b600061066884336108f2565b9050806000036106af576040517fcba6e9770000000000000000000000000000000000000000000000000000000081526001600160a01b03851660048201526024016101a7565b60006106bb8483612546565b90506106cb338683600187610fdd565b60003382856040516020016106e293929190612559565b60405160208183030381529060405290506106fd8682611182565b505050505050565b8451845181141580610718575083518114155b80610724575082518114155b80610730575081518114155b15610767576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b81811015610804576107fc8782815181106107875761078761258a565b60200260200101518783815181106107a1576107a161258a565b60200260200101518784815181106107bb576107bb61258a565b60200260200101518785815181106107d5576107d561258a565b60200260200101518786815181106107ef576107ef61258a565b6020026020010151610ad0565b60010161076a565b50505050505050565b336001600160a01b0384161480159061082f5750336001600160a01b03851614155b1561087f576040517f1a525b320000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038085166024830152851660448201526064016101a7565b61088d838560008585610fdd565b81156108c8576000836000836040516020016108ab939291906125a0565b60405160208183030381529060405290506108c68582611182565b505b50505050565b60025460009060ff166108e15750601290565b50600090565b6060610609826111ad565b6000826001600160a01b0316826001600160a01b03160361092c57506001600160a01b038116600090815260046020526040902054610609565b506001600160a01b03808216600090815260066020908152604080832093861683529290522054610609565b60608167ffffffffffffffff81111561097357610973611cf5565b6040519080825280602002602001820160405280156109a657816020015b60608152602001906001900390816109915790505b50905060005b82811015610aa157600080308686858181106109ca576109ca61258a565b90506020028101906109dc91906125cb565b6040516109ea929190612619565b600060405180830381855af49150503d8060008114610a25576040519150601f19603f3d011682016040523d82523d6000602084013e610a2a565b606091505b509150915081610a7957805115610a445780518082602001fd5b6040517fb774c284000000000000000000000000000000000000000000000000000000008152600481018490526024016101a7565b80848481518110610a8c57610a8c61258a565b602090810291909101015250506001016109ac565b5092915050565b610ab061124f565b610aba6000610dfa565b565b610ac461124f565b6108c8848484846112a9565b336001600160a01b03861614610aeb57610aeb338685611332565b6108c685858585856113e2565b336001600160a01b03841614801590610b1a5750336001600160a01b03851614155b15610b6a576040517f98ce29450000000000000000000000000000000000000000000000000000000081523360048201526001600160a01b038085166024830152851660448201526064016101a7565b6000610b7685856108f2565b905082811015610bb2576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b828103610bc3858783600187610fdd565b6000858285604051602001610bda93929190612559565b60405160208183030381529060405290506108048782611182565b610bfd61124f565b3415610c1c5760405163f36ba73760e01b815260040160405180910390fd5b610c268282611485565b5050565b610c3261124f565b3415610c515760405163f36ba73760e01b815260040160405180910390fd5b610c268282611590565b610c69338484600185610fdd565b6000338383604051602001610c8093929190612559565b60405160208183030381529060405290506108c88482611182565b6001600160a01b03811660009081526005602052604090206060906106099061165b565b6060815167ffffffffffffffff811115610cdb57610cdb611cf5565b604051908082528060200260200182016040528015610d0e57816020015b6060815260200190600190039081610cf95790505b50905060005b8251811015610d6457610d3f838281518110610d3257610d3261258a565b60200260200101516111ad565b828281518110610d5157610d5161258a565b6020908102919091010152600101610d14565b50919050565b610d7261124f565b6001600160a01b038116610dee5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016101a7565b610df781610dfa565b50565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000828152600160205260409020610e7a82826126a3565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051610eab9190612199565b60405180910390a25050565b60008080610eef7fcee78b4094da86011096000000000000000000000000000000000000000000006001600160e01b03198616611668565b90506000610efc826111ad565b90508051601414158015610f105750805115155b15610f4957806040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016101a79190612199565b610f5281612763565b60601c95600195509350505050565b60006001600160e01b031982167fa918fa6b000000000000000000000000000000000000000000000000000000001480610609575061060982