UNPKG

@lukso/lsp-smart-contracts

Version:

The reference smart contract implementation for the LUKSO LSP standards

597 lines 79.5 kB
{ "_format": "hh-sol-artifact-1", "contractName": "LSP6KeyManager", "sourceName": "@lukso/lsp6-contracts/contracts/LSP6KeyManager.sol", "abi": [ { "inputs": [ { "internalType": "address", "name": "target_", "type": "address" } ], "stateMutability": "nonpayable", "type": "constructor" }, { "inputs": [], "name": "BatchExecuteParamsLengthMismatch", "type": "error" }, { "inputs": [], "name": "BatchExecuteRelayCallParamsLengthMismatch", "type": "error" }, { "inputs": [], "name": "CallingKeyManagerNotAllowed", "type": "error" }, { "inputs": [], "name": "DelegateCallDisallowedViaKeyManager", "type": "error" }, { "inputs": [], "name": "ERC725X_ExecuteParametersEmptyArray", "type": "error" }, { "inputs": [], "name": "ERC725X_ExecuteParametersLengthMismatch", "type": "error" }, { "inputs": [], "name": "ERC725Y_DataKeysValuesLengthMismatch", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" }, { "internalType": "bytes", "name": "dataValue", "type": "bytes" } ], "name": "InvalidDataValuesForDataKeys", "type": "error" }, { "inputs": [ { "internalType": "bytes4", "name": "invalidFunction", "type": "bytes4" } ], "name": "InvalidERC725Function", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "allowedCallsValue", "type": "bytes" } ], "name": "InvalidEncodedAllowedCalls", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "value", "type": "bytes" }, { "internalType": "string", "name": "context", "type": "string" } ], "name": "InvalidEncodedAllowedERC725YDataKeys", "type": "error" }, { "inputs": [], "name": "InvalidLSP6Target", "type": "error" }, { "inputs": [ { "internalType": "bytes", "name": "payload", "type": "bytes" } ], "name": "InvalidPayload", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "signer", "type": "address" }, { "internalType": "uint256", "name": "invalidNonce", "type": "uint256" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "InvalidRelayNonce", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" } ], "name": "InvalidWhitelistedCall", "type": "error" }, { "inputs": [], "name": "KeyManagerCannotBeSetAsExtensionForLSP20Functions", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "totalValues", "type": "uint256" }, { "internalType": "uint256", "name": "msgValue", "type": "uint256" } ], "name": "LSP6BatchExcessiveValueSent", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "totalValues", "type": "uint256" }, { "internalType": "uint256", "name": "msgValue", "type": "uint256" } ], "name": "LSP6BatchInsufficientValueSent", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" } ], "name": "NoCallsAllowed", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" } ], "name": "NoERC725YDataKeysAllowed", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" } ], "name": "NoPermissionsSet", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "address", "name": "to", "type": "address" }, { "internalType": "bytes4", "name": "selector", "type": "bytes4" } ], "name": "NotAllowedCall", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "bytes32", "name": "disallowedKey", "type": "bytes32" } ], "name": "NotAllowedERC725YDataKey", "type": "error" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "string", "name": "permission", "type": "string" } ], "name": "NotAuthorised", "type": "error" }, { "inputs": [ { "internalType": "bytes32", "name": "dataKey", "type": "bytes32" } ], "name": "NotRecognisedPermissionKey", "type": "error" }, { "inputs": [], "name": "RelayCallBeforeStartTime", "type": "error" }, { "inputs": [], "name": "RelayCallExpired", "type": "error" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "signer", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "value", "type": "uint256" }, { "indexed": true, "internalType": "bytes4", "name": "selector", "type": "bytes4" } ], "name": "PermissionsVerified", "type": "event" }, { "inputs": [], "name": "VERSION", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "payload", "type": "bytes" } ], "name": "execute", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "payloads", "type": "bytes[]" } ], "name": "executeBatch", "outputs": [ { "internalType": "bytes[]", "name": "", "type": "bytes[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "signature", "type": "bytes" }, { "internalType": "uint256", "name": "nonce", "type": "uint256" }, { "internalType": "uint256", "name": "validityTimestamps", "type": "uint256" }, { "internalType": "bytes", "name": "payload", "type": "bytes" } ], "name": "executeRelayCall", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "bytes[]", "name": "signatures", "type": "bytes[]" }, { "internalType": "uint256[]", "name": "nonces", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "validityTimestamps", "type": "uint256[]" }, { "internalType": "uint256[]", "name": "values", "type": "uint256[]" }, { "internalType": "bytes[]", "name": "payloads", "type": "bytes[]" } ], "name": "executeRelayCallBatch", "outputs": [ { "internalType": "bytes[]", "name": "", "type": "bytes[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "from", "type": "address" }, { "internalType": "uint128", "name": "channelId", "type": "uint128" } ], "name": "getNonce", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "dataHash", "type": "bytes32" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "isValidSignature", "outputs": [ { "internalType": "bytes4", "name": "returnedStatus", "type": "bytes4" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" }, { "internalType": "address", "name": "targetContract", "type": "address" }, { "internalType": "address", "name": "caller", "type": "address" }, { "internalType": "uint256", "name": "msgValue", "type": "uint256" }, { "internalType": "bytes", "name": "callData", "type": "bytes" } ], "name": "lsp20VerifyCall", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" }, { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "lsp20VerifyCallResult", "outputs": [ { "internalType": "bytes4", "name": "", "type": "bytes4" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceId", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "target", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" } ], "bytecode": "0x60806040523480156200001157600080fd5b50604051620041e1380380620041e1833981016040819052620000349162000082565b6001600160a01b0381166200005c5760405163fc85457960e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055620000b4565b6000602082840312156200009557600080fd5b81516001600160a01b0381168114620000ad57600080fd5b9392505050565b61411d80620000c46000396000f3fe6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081029190910101526001016106e2565b50348110156107cf5760405163528c345b60e11b815260048101829052346024820152604401610507565b5090505b949350505050565b6001546000906001600160a01b0316330361080857336000908152600260205260409020805460ff191690555b5063d3fc45d360e01b92915050565b600080631fc8da4360e21b61082c8486613a77565b6001600160e01b031916148061085b5750639790242160e01b61084f8486613a77565b6001600160e01b031916145b90506001600160a01b038716330361091a57600061087a888389610db8565b905061088a888860008888610e25565b6108948486613a77565b6001600160e01b03191686886001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a481806108de5750805b6108ef5763de928f0160e01b610911565b7fde928f00000000000000000000000000000000000000000000000000000000005b925050506103f4565b6001600160a01b03871660009081526002602052604090205460ff16801561095a5761095a876109536001600160a01b038b1682610af9565b6080611246565b610968888860008888610e25565b81806108de5750806108ef5763de928f0160e01b610911565b606060048210156109a9578282604051630d886ef360e21b8152600401610507929190613aa7565b6000631fc8da4360e21b6109bd8486613a77565b6001600160e01b03191614806109ec5750639790242160e01b6109e08486613a77565b6001600160e01b031916145b6001549091506001600160a01b03166000610a08828433610db8565b9050610a18823360008989610e25565b610a228587613a77565b6001600160e01b03191687336001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610a7183898989611256565b905081158015610a7f575083155b15610aa957610aa9836001600160a01b03166000908152600260205260409020805460ff19169055565b979650505050505050565b6000808251604103610aea5760208301516040840151606085015160001a610ade8782858561130e565b94509450505050610af2565b506000905060025b9250929050565b6000806001600160a01b0384166354f6127f610b397f4b80742de2bf82acb36300000000000000000000000000000000000000000000606087901b6113d2565b6040518263ffffffff1660e01b8152600401610b5791815260200190565b600060405180830381865afa158015610b74573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b9c9190810190613ad6565b90508051602014610bb1575060009050610341565b6107d381613b44565b60606004821015610be2578282604051630d886ef360e21b8152600401610507929190613aa7565b6001546001600160a01b03166000610bfe89898989898961143b565b6001600160a01b03811660009081526020818152604080832060808d901c84529091529020549091506fffffffffffffffffffffffffffffffff891614610c775780888a6040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161050793929190613b6b565b6001600160a01b03811660009081526020818152604080832060808c901c84529091528120805491610ca883613b93565b9190505550610cb687611493565b6000631fc8da4360e21b610cca8688613a77565b6001600160e01b0319161480610cf95750639790242160e01b610ced8688613a77565b6001600160e01b031916145b90506000610d08848385610db8565b9050610d18848460018a8a610e25565b610d228688613a77565b6001600160e01b03191688846001600160a01b03167fc0a62328f6bf5e3172bb1fcb2019f54b2c523b6a48e3513a2298fbf0150b781e60405160405180910390a46000610d71858a8a8a611256565b905081158015610d7f575082155b15610da957610da9856001600160a01b03166000908152600260205260409020805460ff19169055565b9b9a5050505050505050505050565b6001600160a01b03831660009081526002602052604090205460ff168015610df657610df1826109536001600160a01b03871682610af9565b610354565b82610354576001600160a01b0384166000908152600260205260409020805460ff191660011790559392505050565b6000610e3a6001600160a01b03871686610af9565b905080610e7e576040517ff292052a0000000000000000000000000000000000000000000000000000000081526001600160a01b0386166004820152602401610507565b8315610e8e57610e8e8582611548565b6000610e9a8385613a77565b90507f80dc96f4000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f0257600080610edd8560048189613bac565b810190610eea9190613581565b91509150610efb89898685856115b2565b505061123d565b7f686fdbdf000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610f6157600080610f438560048189613bac565b810190610f509190613bd6565b91509150610efb898986858561162e565b7fbb3fd702000000000000000000000000000000000000000000000000000000006001600160e01b0319821601610fd1576000808080610fa4876004818b613bac565b810190610fb19190613c85565b9350935093509350610fc88b8b88878787876117b1565b5050505061123d565b7fce7a7bae000000000000000000000000000000000000000000000000000000006001600160e01b0319821601611156576000808080611014876004818b613bac565b8101906110219190613d43565b93509350935093508251845114158061103c57508151835114155b8061104957508051825114155b15611080576040517f3ff55f4d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83516000036110bb576040517fe9ad2b5f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b845181101561114c5761113a8c8c898885815181106110df576110df6139f1565b60200260200101518886815181106110f9576110f96139f1565b6020026020010151888781518110611113576111136139f1565b602002602001015188888151811061112d5761112d6139f1565b60200260200101516117b1565b8061114481613b93565b9150506110be565b505050505061123d565b6001600160e01b031981167ff2fde38b0000000000000000000000000000000000000000000000000000000014806111b757506001600160e01b031981167f79ba509700000000000000000000000000000000000000000000000000000000145b806111eb57506001600160e01b031981167f715018a600000000000000000000000000000000000000000000000000000000145b156111ff576111fa868361187e565b61123d565b6040517f2ba8851c0000000000000000000000000000000000000000000000000000000081526001600160e01b031982166004820152602401610507565b50505050505050565b6112518383836118b3565b505050565b6060600080866001600160a01b0316865a908787604051611278929190613e41565b600060405180830381858888f193505050503d80600081146112b6576040519150601f19603f3d011682016040523d82523d6000602084013e6112bb565b606091505b5091509150600061130283836040518060400160405280601e81526020017f4c5350363a206661696c656420657865637574696e67207061796c6f616400008152506118e6565b98975050505050505050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561134557506000905060036113c9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611399573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166113c2576000600192509250506113c9565b9150600090505b94509492505050565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201526000602a82018190526bffffffffffffffffffffffff198416602c830152918291016040516020818303038152906040529050806107d390613b44565b600080601946888888888860405160200161145c9796959493929190613e51565b60408051601f198184030181529190529050600061147a30836118ff565b9050611486818a611932565b9998505050505050505050565b8060000361149e5750565b608081901c81428211156114dd576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff166000036114fc57505050565b806fffffffffffffffffffffffffffffffff16421115611251576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b62400000808216146115ae5760408051631ded6b7360e11b81526001600160a01b03841660048201526024810191909152601260448201527f455845435554455f52454c41595f43414c4c00000000000000000000000000006064820152608401610507565b5050565b60006115c086858585611956565b90506203ffff19810161160f5762020000808516036115df5750611627565b6115ed858562040000611246565b61160a85846116056001600160a01b038a1683611d0d565b611dad565b611625565b8061161a5750611627565b611625858583611246565b505b5050505050565b8051825114611669576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080835167ffffffffffffffff811115611686576116866134bc565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b509050600080805b6116f58a898984815181106116ce576116ce6139f1565b60200260200101518985815181106116e8576116e86139f1565b6020026020010151611956565b91506203ffff19820161170b576001945061174e565b811561171c5761171c898984611246565b6001848281518110611730576117306139f1565b911515602092830291909101909101528261174a81613b93565b9350505b806001019050865181106116b75784156117a5576202000080891603611778575050505050611627565b611786898962040000611246565b6117a5898861179e6001600160a01b038e1683611d0d565b8787611f0d565b50505050505050505050565b306001600160a01b038416036117f3576040517fa431b23600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83611806576111fa878787868686612151565b60018414806118155750600284145b1561182e5781151561182887878361222d565b5061123d565b60038403611844576111fa8787878686866122b2565b6004840361123d576040517f80d6ebae00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001808216146115ae57600061189460016122e1565b90508281604051631ded6b7360e11b8152600401610507929190613e87565b80821681146112515760006118c7826122e1565b90508381604051631ded6b7360e11b8152600401610507929190613e87565b606083156118f5575081610354565b61035483836126de565b60008282604051602001611914929190613ea9565b60405160208183030381529060405280519060200120905092915050565b60008060006119418585610ab4565b9150915061194e81612708565b509392505050565b60007f20cf245f92495cf19acab2659b39f67a000000000000000000000000000000006fffffffffffffffffffffffffffffffff198416016119ac576006848116146119a486858584612870565b9150506107d3565b7fb47f8bd21d4100000000000000000000000000000000000000000000000000007fffffffffffff0000000000000000000000000000000000000000000000000000841601611b29576006848116146001600160a01b031984167fb47f8bd21d407d534c9d0000000000000000000000000000000000000000000001611a7a578251602014158015611a3e5750825115155b15611a60578383604051631fa4139760e01b8152600401610507929190613f07565b8015611a705750600090506107d3565b6119a48685612a5a565b7fb47f8bd21d40c6c59b39000000000000000000000000000000000000000000006001600160a01b0319851601611ab7576119a486858584612a90565b7fb47f8bd21d407993d6ef000000000000000000000000000000000000000000006001600160a01b0319851601611af4576119a486858584612afb565b6040517f0f7d735b00000000000000000000000000000000000000000000000000000000815260048101859052602401610507565b7f0cfc51aec37c55a4d0b1a65c6255c4bf2fbdf6277f3cc0730c45b828b6db8b47831480611b8057506001600160a01b031983167f0cfc51aec37c55a4d0b100000000000000000000000000000000000000000000145b15611bdc578151601414158015611b975750815115155b15611bb9578282604051631fa4139760e01b8152600401610507929190613f07565b606080851603611bcb575060006107d3565b611bd58584612b25565b90506107d3565b7f311874bf6b2579feef6a000000000000000000000000000000000000000000006001600160a01b0319841601611d03578151601414158015611c2157508151601514155b8015611c2d5750815115155b15611c4f578282604051631fa4139760e01b8152600401610507929190613f07565b606083901b6001600160e01b031981167fde928f14000000000000000000000000000000000000000000000000000000001480611c9c57506001600160e01b0319811663d3fc45d360e01b145b15611ce55730611cab84613f20565b60601c03611ce5576040517f4a9fa8cf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b601880861603611cf95750600090506107d3565b6119a48685612bab565b50620400006107d3565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf866c29110000000000000000000000000000000000000000000085851b6113d2565b6040518263ffffffff1660e01b8152600401611d6891815260200190565b600060405180830381865afa158015611d85573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526103549190810190613ad6565b8051600003611dda5760405163ed7fa50960e01b81526001600160a01b0384166004820152602401610507565b6000806000805b8451841015611ee257848481518110611dfc57611dfc6139f1565b01602001516001600160f81b03191685611e17866001613a1d565b81518110611e2757611e276139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611e6890613f5c565b60f01c9250821580611e7a5750602083115b15611e9a578460405163ae6cbd3760e01b81526004016105079190613fa8565b611ea5836020613ffa565b611eb090600861400d565b8585016022015160001990911b908116925090508581168203611ed65750505050505050565b92820160020192611de1565b60405163557ae07960e01b81526001600160a01b038816600482015260248101879052604401610507565b8251600003611f3a5760405163ed7fa50960e01b81526001600160a01b0386166004820152602401610507565b835160008080805b87518410156120cb57878481518110611f5d57611f5d6139f1565b01602001516001600160f81b03191688611f78866001613a1d565b81518110611f8857611f886139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052611fc990613f5c565b60f01c9250821580611fdb5750602083115b15611ffb578760405163ae6cbd3760e01b81526004016105079190613fa8565b612006836020613ffa565b61201190600861400d565b8885016022015160001990911b9081169250905060005b858110156120be57878181518110612042576120426139f1565b60200260200101511561205757600101612028565b82828b838151811061206b5761206b6139f1565b602002602001015116036120b657600188828151811061208d5761208d6139f1565b91151560209283029190910190910152600180880197879003016120b657505050505050611627565b600101612028565b5092820160020192611f42565b60005b85811015612144578781815181106120e8576120e86139f1565b602002602001015161213c578a8a8281518110612107576121076139f1565b602090810291909101015160405163557ae07960e01b81526001600160a01b0390921660048301526024820152604401610507565b6001016120ce565b5050505050505050505050565b80518215801591610100878116149190159061040080891614908490612175575082155b15612187576121878989610200611246565b818015612192575083155b801561219c575080155b156121ae576121ae8989610800611246565b811580156121ba575080155b156121cc576121cc8989610800611246565b831580156121d75750805b156121e55750505050611625565b8180156121ef5750835b80156121f85750825b156122065750505050611625565b8080156122105750825b1561221e5750505050611625565b6117a58a8a60008a8a8a612c31565b61223b838362010000611246565b6101008281161481801561224d575080155b156122ac5760408051631ded6b7360e11b81526001600160a01b03861660048201526024810191909152601360448201527f53555045525f5452414e5346455256414c5545000000000000000000000000006064820152608401610507565b50505050565b6110008481161480156122c55750611625565b6122d28686612000611246565b61123d87876003878787612c31565b6060600019820161232557505060408051808201909152601181527f5452414e534645524f574e455253484950000000000000000000000000000000602082015290565b600319820161236757505060408051808201909152600f81527f454449545045524d495353494f4e530000000000000000000000000000000000602082015290565b60011982016123a957505060408051808201909152600d81527f414444434f4e54524f4c4c455200000000000000000000000000000000000000602082015290565b60071982016123eb57505060408051808201909152600d81527f414444455854454e53494f4e5300000000000000000000000000000000000000602082015290565b600f19820161242d57505060408051808201909152601081527f4348414e4745455854454e53494f4e5300000000000000000000000000000000602082015290565b601f19820161246f57505060408051808201909152601c81527f414444554e4956455253414c524543454956455244454c454741544500000000602082015290565b603f1982016124b157505060408051808201909152601f81527f4348414e4745554e4956455253414c524543454956455244454c454741544500602082015290565b607f1982016124f357505060408051808201909152600a81527f5245454e5452414e435900000000000000000000000000000000000000000000602082015290565b6203ffff19820161253757505060408051808201909152600781527f5345544441544100000000000000000000000000000000000000000000000000602082015290565b6107ff19820161257a57505060408051808201909152600481527f43414c4c00000000000000000000000000000000000000000000000000000000602082015290565b611fff1982016125bd57505060408051808201909152600a81527f53544154494343414c4c00000000000000000000000000000000000000000000602082015290565b617fff19820161260057505060408051808201909152600c81527f44454c454741544543414c4c0000000000000000000000000000000000000000602082015290565b61ffff19820161264357505060408051808201909152600681527f4445504c4f590000000000000000000000000000000000000000000000000000602082015290565b6101ff19820161268657505060408051808201909152600d81527f5452414e5346455256414c554500000000000000000000000000000000000000602082015290565b621fffff1982016126ca57505060408051808201909152600481527f5349474e00000000000000000000000000000000000000000000000000000000602082015290565b505060408051602081019091526000815290565b8151156126ee5781518083602001fd5b8060405162461bcd60e51b815260040161050791906134a9565b600081600481111561271c5761271c6139db565b036127245750565b6001816004811115612738576127386139db565b036127855760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610507565b6002816004811115612799576127996139db565b036127e65760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610507565b60038160048111156127fa576127fa6139db565b0361286d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f75650000000000000000000000000000000000000000000000000000000000006064820152608401610507565b50565b60007f20cf245f92495cf19acab2659b39f679e0f76aba35a7394b241ce5a0cc734f1d84016129935782516010141580156128ab5750825115155b156128cd578383604051631fa4139760e01b8152600401610507929190613f07565b81156128db575060006107d3565b60006128e684614024565b60801c9050856001600160a01b03166354f6127f866040518263ffffffff1660e01b815260040161291991815260200190565b600060405180830381865afa158015612936573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261295e9190810190613ad6565b61296790614024565b60801c6fffffffffffffffffffffffffffffffff8216116129895760046119a4565b60029150506107d3565b8251158015906129a557508251601414155b156129c7578383604051631fa4139760e01b8152600401610507929190613f07565b81156129d5575060006107d3565b6040516354f6127f60e01b8152600481018590526001600160a01b038616906354f6127f90602401600060405180830381865afa158015612a1a573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612a429190810190613ad6565b5115612a4f5760046103db565b600295945050505050565b60006001600160a01b03808316908290612a7690861683610af9565b90508015612a855760046103db565b506002949350505050565b6000612a9b83612e0d565b612aba578260405163187e77ab60e01b815260040161050791906134a9565b8115612ac8575060006107d3565b6001600160a01b0380851690600090612ae390881683610af9565b14612aef5760046103f4565b60029695505050505050565b6000612b0683612f03565b612aba578260405163ae6cbd3760e01b81526004016105079190614061565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612b6d573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b959190810190613ad6565b5115612ba2576040610354565b50602092915050565b6040516354f6127f60e01b8152600481018290526000906001600160a01b038416906354f6127f90602401600060405180830381865afa158015612bf3573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612c1b9190810190613ad6565b5115612c28576010610354565b50600892915050565b6000612c466001600160a01b03881687612fe9565b90508051600003612c8e576040517f6cb605870000000000000000000000000000000000000000000000000000000081526001600160a01b0387166004820152602401610507565b6000612c9b868585613026565b905060005b8251811015612dab578251612cb6826022613a1d565b1115612cd7578260405163187e77ab60e01b815260040161050791906134a9565b6000612cef84612ce8846002613a1d565b6020613102565b905063ffffffff196020612d0283613b44565b63ffffffff19911b1603612d4d576040517f6fd203c50000000000000000000000000000000000000000000000000000000081526001600160a01b038a166004820152602401610507565b612d57818461322a565b8015612d685750612d688188613251565b8015612d795750612d798188613294565b8015612d8a5750612d8a81866132cc565b15612d985750505050611625565b50612da4602282613a1d565b9050612ca0565b508685612db7856140b3565b6040517f45147bce0000000000000000000000000000000000000000000000000000000081526001600160a01b0393841660048201529290911660248301526001600160e01b0319166044820152606401610507565b6000805b8251811015612ee9578251612e27826001613a1d565b10612e355750600092915050565b6000838281518110612e4957612e496139f1565b01602001516001600160f81b03191684612e64846001613a1d565b81518110612e7457612e746139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612eb590613f5c565b60f01c905060208114612ecc575060009392505050565b612ed7816002613a1d565b612ee19083613a1d565b915050612e11565b82518103612efa5750600192915050565b50600092915050565b6000805b8251811015612ee9578251612f1d826001613a1d565b10612f2b5750600092915050565b6000838281518110612f3f57612f3f6139f1565b01602001516001600160f81b03191684612f5a846001613a1d565b81518110612f6a57612f6a6139f1565b016020908101516040516001600160f81b031993841692810192909252919091166021820152602201604051602081830303815290604052612fab90613f5c565b60f01c9050801580612fbd5750602081115b15612fcc575060009392505050565b612fd7816002613a1d565b612fe19083613a1d565b915050612f07565b60606001600160a01b0383166354f6127f611d4a7f4b80742de2bf393a64c70000000000000000000000000000000000000000000085851b6113d2565b6000821561304e577c0100000000000000000000000000000000000000000000000000000000175b81511580159060009082613060575084155b9050818061306b5750805b156130f9578561309d577c020000000000000000000000000000000000000000000000000000000092909217916130f9565b600386036130cd577c040000000000000000000000000000000000000000000000000000000092909217916130f9565b600486036130f9577c080000000000000000000000000000000000000000000000000000000092909217915b50509392505050565b60608161311081601f613a1d565b101561315e5760405162461bcd60e51b815260206004820152600e60248201527f736c6963655f6f766572666c6f770000000000000000000000000000000000006044820152606401610507565b6131688284613a1d565b845110156131b85760405162461bcd60e51b815260206004820152601160248201527f736c6963655f6f75744f66426f756e64730000000000000000000000000000006044820152606401610507565b6060821580156131d75760405191506000825260208201604052613221565b6040519150601f8416801560200281840101858101878315602002848b0101015b818310156132105780518352602092830192016131f8565b5050858452601f01601f1916604052505b50949350505050565b600080613236846140b3565b83166001600160e01b03199081169084161491505092915050565b600080602061325f85613b44565b901b60601c90506001600160a01b038114806107d35750806001600160a01b0316836001600160a01b03161491505092915050565b60008060c06132a285613b44565b901b90506001600160e01b031980821614806107d357506107d36001600160a01b03841682613326565b60008060e06132da85613b44565b8451911b91506004111560006132ef856140b3565b90506001600160e01b031983811614806103f457508180156103f457506001600160e01b0319818116908416149695505050505050565b604080516001600160e01b03198316602480830191909152825180830390910181526044909101909152602080820180516001600160e01b03166301ffc9a760e01b178152825160009392849283928392918391908a617530fa92503d91506000519050828015613398575060208210155b8015610aa9575015159695505050505050565b6000602082840312156133bd57600080fd5b81356001600160e01b03198116811461035457600080fd5b60008083601f8401126133e757600080fd5b50813567ffffffffffffffff8111156133ff57600080fd5b602083019150836020828501011115610af257600080fd5b6000806020838503121561342a57600080fd5b823567ffffffffffffffff81111561344157600080fd5b61344d858286016133d5565b90969095509350505050565b60005b8381101561347457818101518382015260200161345c565b50506000910152565b60008151808452613495816020860160208601613459565b601f01601f19169290920160200192915050565b602081526000610354602083018461347d565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156134fb576134fb6134bc565b604052919050565b600067ffffffffffffffff82111561351d5761351d6134bc565b50601f01601f191660200190565b600082601f83011261353c57600080fd5b813561354f61354a82613503565b6134d2565b81815284602083860101111561356457600080fd5b816020850160208301376000918101602001919091529392505050565b6000806040838503121561359457600080fd5b82359150602083013567ffffffffffffffff8111156135b257600080fd5b6135be8582860161352b565b9150509250929050565b6000806000806000608086880312156135e057600080fd5b853567ffffffffffffffff808211156135f857600080fd5b61360489838a0161352b565b96506020880135955060408801359450606088013591508082111561362857600080fd5b50613635888289016133d5565b969995985093965092949392505050565b600067ffffffffffffffff821115613660576136606134bc565b5060051b60200190565b600082601f83011261367b57600080fd5b8135602061368b61354a83613646565b82815260059290921b840181019181810190868411156136aa57600080fd5b8286015b848110156136ea57803567ffffffffffffffff8111156136ce5760008081fd5b6136dc8986838b010161352b565b8452509183019183016136ae565b509695505050505050565b60008083601f84011261370757600080fd5b50813567ffffffffffffffff81111561371f57600080fd5b6020830191508360208260051b8501011115610af257600080fd5b600080600080600080600080600060a08a8c03121561375857600080fd5b893567ffffffffffffffff8082111561377057600080fd5b61377c8d838e0161366a565b9a5060208c013591508082111561379257600080fd5b61379e8d838e016136f5565b909a50985060408c01359150808211156137b757600080fd5b6137c38d838e016136f5565b909850965060608c01359150808211156137dc57600080fd5b6137e88d838e016136f5565b909650945060808c013591508082111561380157600080fd5b5061380e8c828d016136f5565b915080935050809150509295985092959850929598565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561387a57603f1988860301845261386885835161347d565b9450928501929085019060010161384c565b5092979650505050505050565b6001600160a01b038116811461286d57600080fd5b600080604083850312156138af57600080fd5b82356138ba81613887565b915060208301356fffffffffffffffffffffffffffffffff811681146138df57600080fd5b809150509250929050565b6000806000806040858703121561390057600080fd5b843567ffffffffffffffff8082111561391857600080fd5b613924888389016136f5565b9096509450602087013591508082111561393d57600080fd5b5061394a878288016136f5565b95989497509550505050565b60008060008060008060a0878903121561396f57600080fd5b863561397a81613887565b9550602087013561398a81613887565b9450604087013561399a81613887565b935060608701359250608087013567ffffffffffffffff8111156139bd57600080fd5b6139c989828a016133d5565b979a9699509497509295939492505050565b634e487b7160e01b600052602160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561034157610341613a07565b6000808335601e19843603018112613a4757600080fd5b83018035915067ffffffffffffffff821115613a6257600080fd5b602001915036819003821315610af257600080fd5b6001600160e01b03198135818116916004851015613a9f5780818660040360031b1b83161692505b505092915050565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b600060208284031215613ae857600080fd5b815167ffffffffffffffff811115613aff57600080fd5b8201601f81018413613b1057600080fd5b8051613b1e61354a82613503565b818152856020838501011115613b3357600080fd5b6103db826020830160208601613459565b80516020808301519190811015613b65576000198160200360031b1b821691505b50919050565b6001600160a01b03841681528260208201526060604082015260006103db606083018461347d565b600060018201613ba557613ba5613a07565b5060010190565b60008085851115613bbc57600080fd5b83861115613bc957600080fd5b5050820193919092039150565b60008060408385031215613be957600080fd5b823567ffffffffffffffff80821115613c0157600080fd5b818501915085601f830112613c1557600080fd5b81356020613c2561354a83613646565b82815260059290921b84018101918181019089841115613c4457600080fd5b948201945b83861015613c6257853582529482019490820190613c49565b96505086013592505080821115613c7857600080fd5b506135be8582860161366a565b60008060008060808587031215613c9b57600080fd5b843593506020850135613cad81613887565b925060408501359150606085013567ffffffffffffffff811115613cd057600080fd5b613cdc8782880161352b565b91505092959194509250565b600082601f830112613cf957600080fd5b81356020613d0961354a83613646565b82815260059290921b84018101918181019086841115613d2857600080fd5b8286015b848110156136ea5780358352918301918301613d2c565b60008060008060808587031215613d5957600080fd5b843567ffffffffffffffff80821115613d7157600080fd5b613d7d88838901613ce8565b9550602091508187013581811115613d9457600080fd5b8701601f81018913613da557600080fd5b8035613db361354a82613646565b81815260059190911b8201840190848101908b831115613dd257600080fd5b928501925b82841015613df9578335613dea81613887565b82529285019290850190613dd7565b97505050506040870135915080821115613e1257600080fd5b613e1e88838901613ce8565b93506060870135915080821115613e3457600080fd5b50613cdc8782880161366a565b8183823760009101908152919050565b878152866020820152856040820152846060820152836080820152818360a08301376000910160a0019081529695505050505050565b6001600160a01b03831681526040602082015260006107d3604083018461347d565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251613ef9816016850160208701613459565b919091016016019392505050565b8281526040602082015260006107d3604083018461347d565b805160208201516bffffffffffffffffffffffff198082169291906014831015613f545780818460140360031b1b83161693505b505050919050565b6000815160208301517fffff00000000000000000000000000000000000000000000000000000000000080821693506002831015613f545760029290920360031b82901b161692915050565b604081526000613fbb604083018461347d565b8281036020840152601c81527f636f756c646e2774204445434f44452066726f6d2073746f726167650000000060208201526040810191505092915050565b8181038181111561034157610341613a07565b808202811582820484141761034157610341613a07565b6000815160208301516fffffffffffffffffffffffffffffffff1980821693506010831015613f545760109290920360031b82901b161692915050565b604081526000614074604083018461347d565b8281036020840152602081527f636f756c646e27742056414c49444154452074686520646174612076616c756560208201526040810191505092915050565b6000815160208301516001600160e01b031980821693506004831015613f545760049290920360031b82901b16169291505056fea2646970667358221220a090bcaf5a79b938a3b7052dd753c9e5d751df4175525daf36bed6f3d37c7cda64736f6c63430008110033", "deployedBytecode": "0x6080604052600436106100bc5760003560e01c8063b44581d911610074578063d4b839921161004e578063d4b83992146101e3578063de928f141461020b578063ffa1ad741461022b57600080fd5b8063b44581d914610182578063bf0176ff146101b0578063d3fc45d3146101c357600080fd5b80631626ba7e116100a55780631626ba7e146101165780634c8a4e741461014f578063a20856a51461016257600080fd5b806301ffc9a7146100c157806309c5eabe146100f6575b600080fd5b3480156100cd57600080fd5b506100e16100dc3660046133ab565b610274565b60405190151581526020015b60405180910390f35b610109610104366004613417565b610347565b6040516100ed91906134a9565b34801561012257600080fd5b50610136610131366004613581565b61035b565b6040516001600160e01b031990911681526020016100ed565b61010961015d3660046135c8565b6103e4565b61017561017036600461373a565b6103fe565b6040516100ed9190613825565b34801561018e57600080fd5b506101a261019d36600461389c565b610600565b6040519081526020016100ed565b6101756101be3660046138ea565b610652565b3480156101cf57600080fd5b506101366101de366004613581565b6107db565b3480156101ef57600080fd5b506001546040516001600160a01b0390911681526020016100ed565b34801561021757600080fd5b50610136610226366004613956565b610817565b34801561023757600080fd5b506101096040518060400160405280600681526020017f302e31352e35000000000000000000000000000000000000000000000000000081525081565b60006001600160e01b031982167f23f34c620000000000000000000000000000000000000000000000000000000014806102be57506001600160e01b03198216630b135d3f60e11b145b806102f257506001600160e01b031982167f0d6ecac700000000000000000000000000000000000000000000000000000000145b8061032657506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b8061034157506301ffc9a760e01b6001600160e01b03198316145b92915050565b6060610354348484610981565b9392505050565b600080600061036a8585610ab4565b90925090506000816004811115610383576103836139db565b1461039b57506001600160e01b031991506103419050565b6001546103c09062200000906103ba906001600160a01b031685610af9565b81161490565b6103d2576001600160e01b03196103db565b630b135d3f60e11b5b95945050505050565b60606103f4868686348787610bba565b9695505050505050565b8851606090881415806104115750878614155b8061041c5750858414155b806104275750838214155b1561045e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610479576104796134bc565b6040519080825280602002602001820160405280156104ac57816020015b60608152602001906001900390816104975790505b5090506000805b848110156105c657348888838181106104ce576104ce6139f1565b90506020020135836104e09190613a1d565b925082111561051057604051630c28c92b60e21b8152600481018390523460248201526044015b60405180910390fd5b6105a18d8281518110610525576105256139f1565b60200260200101518d8d8481811061053f5761053f6139f1565b905060200201358c8c85818110610558576105586139f1565b905060200201358b8b86818110610571576105716139f1565b905060200201358a8a8781811061058a5761058a6139f1565b905060200281019061059c9190613a30565b610bba565b8382815181106105b3576105b36139f1565b60209081029190910101526001016104b3565b50348110156105f15760405163528c345b60e11b815260048101829052346024820152604401610507565b509a9950505050505050505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b6fffffffffffffffffffffffffffffffff191617610354565b606083821461068d576040517f55a187db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff8111156106a8576106a86134bc565b6040519080825280602002602001820160405280156106db57816020015b60608152602001906001900390816106c65790505b5090506000805b848110156107a457348888838181106106fd576106fd6139f1565b905060200201358361070f9190613a1d565b925082111561073a57604051630c28c92b60e21b815260048101839052346024820152604401610507565b61077f88888381811061074f5761074f6139f1565b90506020020135878784818110610768576107686139f1565b905060200281019061077a9190613a30565b610981565b838281518110610791576107916139f1565b60209081