@lukso/lsp-smart-contracts
Version:
The reference smart contract implementation for the LUKSO LSP standards
1,168 lines • 72.1 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "LSP11SocialRecovery",
"sourceName": "@lukso/lsp11-contracts/contracts/LSP11SocialRecovery.sol",
"abi": [
{
"inputs": [],
"name": "AccountNotSetupYet",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "iteration",
"type": "uint256"
}
],
"name": "BatchCallsFailed",
"type": "error"
},
{
"inputs": [],
"name": "BatchExecuteRelayCallParamsLengthMismatch",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "guardian",
"type": "address"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "CallerIsNotGuardian",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "CallerIsNotTheAccount",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
},
{
"internalType": "address",
"name": "caller",
"type": "address"
}
],
"name": "CallerIsNotVotedAddress",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "recoverer",
"type": "address"
}
],
"name": "CallerVotesHaveNotReachedThreshold",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "committer",
"type": "address"
}
],
"name": "CannotRecoverAfterDirectCommit",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "delay",
"type": "uint256"
}
],
"name": "CannotRecoverBeforeDelay",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "guardian",
"type": "address"
},
{
"internalType": "address",
"name": "guardianVotedAddress",
"type": "address"
}
],
"name": "CannotVoteToAddressTwice",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "guardian",
"type": "address"
}
],
"name": "GuardianAlreadyExists",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "guardian",
"type": "address"
}
],
"name": "GuardianNotFound",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "threshold",
"type": "uint256"
}
],
"name": "GuardianNumberCannotGoBelowThreshold",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "committer",
"type": "address"
}
],
"name": "InvalidCommitment",
"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": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "secretHash",
"type": "bytes32"
}
],
"name": "InvalidSecretHash",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "totalValues",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "msgValue",
"type": "uint256"
}
],
"name": "LSP11BatchExcessiveValueSent",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "totalValues",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "msgValue",
"type": "uint256"
}
],
"name": "LSP11BatchInsufficientValueSent",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "nonGuardian",
"type": "address"
}
],
"name": "NotAGuardianOfTheAccount",
"type": "error"
},
{
"inputs": [],
"name": "RelayCallBeforeStartTime",
"type": "error"
},
{
"inputs": [],
"name": "RelayCallExpired",
"type": "error"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "functionSelector",
"type": "bytes4"
}
],
"name": "RelayCallNotSupported",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
},
{
"internalType": "address",
"name": "recoveredAddress",
"type": "address"
}
],
"name": "SignerIsNotVotedAddress",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "threshold",
"type": "uint256"
}
],
"name": "ThresholdExceedsGuardianNumber",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "guardian",
"type": "address"
}
],
"name": "GuardianAdded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "guardian",
"type": "address"
}
],
"name": "GuardianRemoved",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "guardian",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "guardianVotedAddress",
"type": "address"
}
],
"name": "GuardianVotedFor",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "guardianThreshold",
"type": "uint256"
}
],
"name": "GuardiansThresholdChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "previousRecoveryCounter",
"type": "uint256"
}
],
"name": "RecoveryCancelled",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "recoveryDelay",
"type": "uint256"
}
],
"name": "RecoveryDelayChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "guardianVotedAddress",
"type": "address"
},
{
"indexed": false,
"internalType": "bytes",
"name": "calldataExecuted",
"type": "bytes"
}
],
"name": "RecoveryProcessSuccessful",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "secretHash",
"type": "bytes32"
}
],
"name": "SecretHashChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"indexed": true,
"internalType": "address",
"name": "committedBy",
"type": "address"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "commitment",
"type": "bytes32"
}
],
"name": "SecretHashCommitted",
"type": "event"
},
{
"inputs": [],
"name": "COMMITMEMT_DELAY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DEFAULT_RECOVERY_DELAY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "newGuardian",
"type": "address"
}
],
"name": "addGuardian",
"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": "address",
"name": "account",
"type": "address"
}
],
"name": "cancelRecoveryProcess",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "commitment",
"type": "bytes32"
}
],
"name": "commitToRecover",
"outputs": [],
"stateMutability": "nonpayable",
"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": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"internalType": "address",
"name": "committedBy",
"type": "address"
}
],
"name": "getCommitmentInfoOf",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
}
],
"name": "getFirstRecoveryTimestampOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "getGuardiansOf",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "getGuardiansThresholdOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"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": "address",
"name": "account",
"type": "address"
}
],
"name": "getRecoveryCounterOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "getRecoveryDelayOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "getSecretHashOf",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"internalType": "address",
"name": "guardian",
"type": "address"
}
],
"name": "getVotedAddressByGuardian",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
}
],
"name": "getVotesOfGuardianVotedAddress",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryCounter",
"type": "uint256"
},
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
}
],
"name": "hasReachedThreshold",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "guardianAddress",
"type": "address"
}
],
"name": "isGuardianOf",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "votedAddress",
"type": "address"
},
{
"internalType": "bytes32",
"name": "secretHash",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "newSecretHash",
"type": "bytes32"
},
{
"internalType": "bytes",
"name": "calldataToExecute",
"type": "bytes"
}
],
"name": "recoverAccess",
"outputs": [
{
"internalType": "bytes",
"name": "",
"type": "bytes"
}
],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "address",
"name": "existingGuardian",
"type": "address"
}
],
"name": "removeGuardian",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "newThreshold",
"type": "uint256"
}
],
"name": "setGuardiansThreshold",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "recoveryDelay",
"type": "uint256"
}
],
"name": "setRecoveryDelay",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "newRecoverSecretHash",
"type": "bytes32"
}
],
"name": "setRecoverySecretHash",
"outputs": [],
"stateMutability": "nonpayable",
"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": "account",
"type": "address"
},
{
"internalType": "address",
"name": "guardian",
"type": "address"
},
{
"internalType": "address",
"name": "guardianVotedAddress",
"type": "address"
}
],
"name": "voteForRecovery",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x608060405234801561001057600080fd5b50612de4806100206000396000f3fe6080604052600436106101ac5760003560e01c80638ca4aaaf116100ec578063b79336ee1161008a578063d617b89011610064578063d617b890146105a2578063dbd119bd146105fd578063f3b3c78514610633578063fa04a7f11461064657600080fd5b8063b79336ee14610537578063c68452101461054c578063cee79d451461056c57600080fd5b8063a219b404116100c6578063a219b40414610489578063a65068b6146104a9578063a9e3b276146104f7578063b44581d91461051757600080fd5b80638ca4aaaf146104295780639b27a90e14610456578063a20856a51461047657600080fd5b80636289a16311610159578063769e54df11610133578063769e54df1461039057806378f84ebd146103b057806388095527146103d05780638bc0ab751461041357600080fd5b80636289a163146102c4578063639cea19146103435780636963d4381461036357600080fd5b80631ce596661161018a5780631ce596661461024a5780634c8a4e741461026c578063506d1a0f1461028c57600080fd5b806301ffc9a7146101b157806302543bff146101e657806306fe173814610214575b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046124b2565b610666565b60405190151581526020015b60405180910390f35b3480156101f257600080fd5b506102066102013660046124f1565b610703565b6040519081526020016101dd565b34801561022057600080fd5b5061020661022f3660046124f1565b6001600160a01b031660009081526005602052604090205490565b34801561025657600080fd5b5061026a6102653660046124f1565b610748565b005b61027f61027a366004612550565b6107ef565b6040516101dd9190612623565b34801561029857600080fd5b506102ac6102a7366004612636565b61080b565b6040516001600160a01b0390911681526020016101dd565b3480156102d057600080fd5b5061032e6102df366004612636565b6001600160a01b03928316600090815260096020908152604080832094835293815283822092909416815290835281902081518083019092528054808352600190910154919092018190529091565b604080519283526020830191909152016101dd565b34801561034f57600080fd5b5061026a61035e366004612678565b610843565b34801561036f57600080fd5b5061038361037e3660046126e9565b610932565b6040516101dd919061272b565b34801561039c57600080fd5b506101d16103ab36600461278d565b610a82565b3480156103bc57600080fd5b5061026a6103cb366004612678565b610aa4565b3480156103dc57600080fd5b506102066103eb366004612678565b6001600160a01b03919091166000908152600a60209081526040808320938352929052205490565b34801561041f57600080fd5b5061020661096081565b34801561043557600080fd5b506104496104443660046124f1565b610b27565b6040516101dd91906127c6565b34801561046257600080fd5b5061026a61047136600461278d565b610b4b565b610383610484366004612813565b610ce0565b34801561049557600080fd5b5061026a6104a4366004612678565b610f18565b3480156104b557600080fd5b506102066104c4366004612636565b6001600160a01b039283166000908152600860209081526040808320948352938152838220929094168152925290205490565b34801561050357600080fd5b5061026a610512366004612904565b610fdf565b34801561052357600080fd5b50610206610532366004612945565b611044565b34801561054357600080fd5b50610206603c81565b34801561055857600080fd5b5061026a61056736600461278d565b6110a5565b34801561057857600080fd5b506102066105873660046124f1565b6001600160a01b031660009081526006602052604090205490565b3480156105ae57600080fd5b506101d16105bd366004612636565b6001600160a01b03928316600081815260086020908152604080832095835294815284822093909516815291845282822054908252600290935220541490565b34801561060957600080fd5b506102066106183660046124f1565b6001600160a01b031660009081526002602052604090205490565b61027f610641366004612988565b611194565b34801561065257600080fd5b5061026a6106613660046129f2565b61124b565b60006001600160e01b031982167f23a45ef00000000000000000000000000000000000000000000000000000000014806106c957506001600160e01b031982167f5ac7990800000000000000000000000000000000000000000000000000000000145b806106fd57507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316145b92915050565b6001600160a01b03811660009081526004602052604081205460ff1661072c5750610960919050565b506001600160a01b031660009081526003602052604090205490565b806001600160a01b0381163314610788576040516308fd287f60e01b81526001600160a01b03821660048201523360248201526044015b60405180910390fd5b6001600160a01b0382166000908152600660205260408120805490826107ad83612a48565b91905055905080836001600160a01b03167f500ec1d4b692d3c788bfd78a898de379cfd93ab8177575efc7593f87bd051a0760405160405180910390a3505050565b6060610800878787873488886115d4565b979650505050505050565b6001600160a01b03808416600090815260076020908152604080832086845282528083208585168452909152902054165b9392505050565b816001600160a01b038116331461087e576040516308fd287f60e01b81526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b038316600090815260016020526040902061089f90611729565b8211156108ea576040517f217be3a70000000000000000000000000000000000000000000000000000000081526001600160a01b03841660048201526024810183905260440161077f565b6001600160a01b038316600081815260026020526040808220859055518492917f996d956afb7500c4fb0d329508832321c79e3f8fbee914c7e3cf1700053b4b3991a3505050565b60608167ffffffffffffffff81111561094d5761094d612a61565b60405190808252806020026020018201604052801561098057816020015b606081526020019060019003908161096b5790505b50905060005b82811015610a7b57600080308686858181106109a4576109a4612a77565b90506020028101906109b69190612a8d565b6040516109c4929190612ad4565b600060405180830381855af49150503d80600081146109ff576040519150601f19603f3d011682016040523d82523d6000602084013e610a04565b606091505b509150915081610a5357805115610a1e5780518082602001fd5b6040517fd9a023030000000000000000000000000000000000000000000000000000000081526004810184905260240161077f565b80848481518110610a6657610a66612a77565b60209081029190910101525050600101610986565b5092915050565b6001600160a01b038216600090815260016020526040812061083c9083611733565b816001600160a01b0381163314610adf576040516308fd287f60e01b81526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b038316600081815260056020526040808220859055518492917ff1d777ea951a50389c566bd715dcc9fb133ff06f077278fde63b3c6d544580a291a3505050565b6001600160a01b03811660009081526001602052604090206060906106fd90611755565b816001600160a01b0381163314610b86576040516308fd287f60e01b81526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b0383166000908152600160205260409020610ba89083611733565b610bf1576040517f925f444b0000000000000000000000000000000000000000000000000000000081526001600160a01b0380851660048301528316602482015260440161077f565b6001600160a01b0383166000908152600260209081526040808320546001909252909120610c1e90611729565b03610c78576001600160a01b038316600081815260026020526040908190205490517f85283f150000000000000000000000000000000000000000000000000000000081526004810192909252602482015260440161077f565b6001600160a01b0383166000908152600160205260409020610c9a9083611762565b50816001600160a01b0316836001600160a01b03167fee943cdb81826d5909c559c6b1ae6908fcaf2dbc16c4b730346736b486283e8b60405160405180910390a3505050565b60608988141580610cf15750878614155b80610cfc5750858414155b80610d075750838214155b15610d3e576040517fb4d50d2100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008267ffffffffffffffff811115610d5957610d59612a61565b604051908082528060200260200182016040528015610d8c57816020015b6060815260200190600190039081610d775790505b5090506000805b84811015610ec45734888883818110610dae57610dae612a77565b9050602002013583610dc09190612ae4565b9250821115610e04576040517fd42081cc0000000000000000000000000000000000000000000000000000000081526004810183905234602482015260440161077f565b610e9f8e8e83818110610e1957610e19612a77565b9050602002810190610e2b9190612a8d565b8e8e85818110610e3d57610e3d612a77565b905060200201358d8d86818110610e5657610e56612a77565b905060200201358c8c87818110610e6f57610e6f612a77565b905060200201358b8b88818110610e8857610e88612a77565b9050602002810190610e9a9190612a8d565b6115d4565b838281518110610eb157610eb1612a77565b6020908102919091010152600101610d93565b5034811015610f08576040517f7c3328da0000000000000000000000000000000000000000000000000000000081526004810182905234602482015260440161077f565b509b9a5050505050505050505050565b816001600160a01b0381163314610f53576040516308fd287f60e01b81526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b038316600081815260036020526040808220859055518492917fdc9e5e7eb38f77984d9a899bfdc7ca9e531f85f450602723e2adb9a37cebf4bc91a36001600160a01b03831660009081526004602052604090205460ff16610fda576001600160a01b0383166000908152600460205260409020805460ff191660011790555b505050565b6001600160a01b0382163314611019576040516304a78bbb60e51b81526001600160a01b038316600482015233602482015260440161077f565b6001600160a01b03831660009081526006602052604090205461103e84828585611777565b50505050565b6001600160a01b0382166000908152602081815260408083206fffffffffffffffffffffffffffffffff85168452909152812054608083901b7fffffffffffffffffffffffffffffffff00000000000000000000000000000000161761083c565b816001600160a01b03811633146110e0576040516308fd287f60e01b81526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b03831660009081526001602052604081206111029084611804565b90508061114e576040517f242d9f790000000000000000000000000000000000000000000000000000000081526001600160a01b0380861660048301528416602482015260440161077f565b826001600160a01b0316846001600160a01b03167fbc3292102fa77e083913064b282926717cdfaede4d35f553d66366c0a3da755a60405160405180910390a350505050565b60606001600160a01b03861633146111d0576040516304a78bbb60e51b81526001600160a01b038716600482015233602482015260440161077f565b600060066000896001600160a01b03166001600160a01b0316815260200190815260200160002054905061123f8882898989348a8a8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061181992505050565b98975050505050505050565b82826001600160a01b03811633146112a0576040517f17c6343d0000000000000000000000000000000000000000000000000000000081526001600160a01b038216600482015233602482015260440161077f565b6001600160a01b03821660009081526001602052604090206112c29082611733565b61130b576040517f2835d4f40000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528216602482015260440161077f565b6001600160a01b038516600090815260066020908152604080832054600a83528184208185529092528220549091819003611367576001600160a01b0387166000908152600a6020908152604080832085845290915290204290555b6001600160a01b03808816600090815260076020908152604080832086845282528083208a8516845290915290205481169086168190036113ef576040517f92dd87f60000000000000000000000000000000000000000000000000000000081526001600160a01b03808a16600483015280891660248301528716604482015260640161077f565b6001600160a01b038116611479576001600160a01b03888116600081815260076020908152604080832088845282528083208c861684528252808320805473ffffffffffffffffffffffffffffffffffffffff1916958c16958617905592825260088152828220878352815282822093825292909252812080549161147383612a48565b91905055505b806001600160a01b0316866001600160a01b0316141580156114a357506001600160a01b03811615155b15611573576001600160a01b03888116600081815260076020908152604080832088845282528083208c861684528252808320805473ffffffffffffffffffffffffffffffffffffffff19168c8716179055928252600881528282208783528152828220938516825292909252812080549161151e83612af7565b90915550506001600160a01b03861615611573576001600160a01b0380891660009081526008602090815260408083208784528252808320938a16835292905290812080549161156d83612a48565b91905055505b856001600160a01b0316876001600160a01b0316896001600160a01b03167f6e8b2d5fb446171938316212bee6fc889dccfacfdb73d7ffbfb4d5f784c90b99866040516115c291815260200190565b60405180910390a45050505050505050565b606060006115e28385612b0e565b90507f561c4d8a000000000000000000000000000000000000000000000000000000006001600160e01b03198216016116605761165b89898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a91508990508888611c64565b61171d565b7f0c4c387b000000000000000000000000000000000000000000000000000000006001600160e01b03198216016116df576116d789898080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508b92508a91508990508888611d10565b915050610800565b6040517f0602d2700000000000000000000000000000000000000000000000000000000081526001600160e01b03198216600482015260240161077f565b50979650505050505050565b60006106fd825490565b6001600160a01b0381166000908152600183016020526040812054151561083c565b6060600061083c83611dcc565b600061083c836001600160a01b038416611e28565b6040805180820182528281524260208083019182526001600160a01b038881166000818152600984528681208a825284528681209289168082529284528690208551815593516001909401939093559351878152929385939092917f896d444743de428958414d9a86fad106a57cb372ee349d27b86fe2d51622209c910160405180910390a45050505050565b600061083c836001600160a01b038416611f1b565b606061182488610703565b6001600160a01b0389166000908152600a602090815260408083208b84529091529020546118529190612ae4565b4210156118a6578761186389610703565b6040517f7c1b17000000000000000000000000000000000000000000000000000000000081526001600160a01b039092166004830152602482015260440161077f565b6001600160a01b03881660009081526005602090815260408083205460029092528220549091819003611905576040517f1d20946c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b03808b1660009081526008602090815260408083208d84528252808320938c168352929052205481811015611980576040517f36dbf4c80000000000000000000000000000000000000000000000000000000081526001600160a01b03808d1660048301528a16602482015260440161077f565b508115611b2657604080516001600160a01b038c811660208084018290528385018c9052845180850386018152606085018652805190820120928d166080850181905260a08086018590528651808703909101815260c090950186528451948201949094206000928352600982528583208f8452825285832094835293905292909220548114611a4f576040517feca9e4a60000000000000000000000000000000000000000000000000000000081526001600160a01b03808e1660048301528b16602482015260440161077f565b6001600160a01b03808d1660009081526009602090815260408083208f84528252808320938e16835292905220600101544290611a8d90603c612ae4565b1115611ad8576040517ffe75f6280000000000000000000000000000000000000000000000000000000081526001600160a01b03808e1660048301528b16602482015260440161077f565b838214611b23576040517f84bb073d0000000000000000000000000000000000000000000000000000000081526001600160a01b038d166004820152602481018a905260440161077f565b50505b6001600160a01b038a166000908152600660205260408120805491611b4a83612a48565b90915550506001600160a01b038a16600081815260056020526040808220899055518892917ff1d777ea951a50389c566bd715dcc9fb133ff06f077278fde63b3c6d544580a291a3876001600160a01b0316898b6001600160a01b03167f813cb1764d0ee698a363ee823a078c5d80bef414205b6d280820336972cf6d9987604051611bd69190612623565b60405180910390a46000808b6001600160a01b03168787604051611bfa9190612b3e565b60006040518083038185875af1925050503d8060008114611c37576040519150601f19603f3d011682016040523d82523d6000602084013e611c3c565b606091505b5091509150610f088282604051806060016040528060298152602001612d8660299139611f6a565b60008080611c758460048188612b5a565b810190611c829190612904565b925092509250600060066000856001600160a01b03166001600160a01b03168152602001908152602001600020549050611cf88a8a8a8a858b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508c9250611f83915050565b611d0484828585611777565b50505050505050505050565b6060600080808080611d25876004818b612b5a565b810190611d329190612b84565b94509450945094509450600060066000876001600160a01b03166001600160a01b03168152602001908152602001600020549050611dac8d8d8d8d858e8e8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152508e9250611f83915050565b611dbb86828787878f88611819565b9d9c50505050505050505050505050565b606081600001805480602002602001604051908101604052809291908181526020018280548015611e1c57602002820191906000526020600020905b815481526020019060010190808311611e08575b50505050509050919050565b60008181526001830160205260408120548015611f11576000611e4c600183612c6e565b8554909150600090611e6090600190612c6e565b9050818114611ec5576000866000018281548110611e8057611e80612a77565b9060005260206000200154905080876000018481548110611ea357611ea3612a77565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080611ed657611ed6612c81565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506106fd565b60009150506106fd565b6000818152600183016020526040812054611f62575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556106fd565b5060006106fd565b60608315611f7957508161083c565b61083c83836120b3565b6000611f938888888888886120dd565b6001600160a01b03811660009081526020818152604080832060808c901c84529091529020549091506fffffffffffffffffffffffffffffffff88161461200c578087896040517fc9bd9eb900000000000000000000000000000000000000000000000000000000815260040161077f93929190612c97565b6001600160a01b03811660009081526020818152604080832060808b901c8452909152812080549161203d83612a48565b919050555061204b86612135565b806001600160a01b0316826001600160a01b0316146120a9576040517f40a556320000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528216602482015260440161077f565b5050505050505050565b8151156120c35781518083602001fd5b8060405162461bcd60e51b815260040161077f9190612623565b600080600b4688888888886040516020016120fe9796959493929190612cc8565b60408051601f198184030181529190529050600061211c30836121ea565b9050612128818a61221d565b9998505050505050505050565b806000036121405750565b608081901c814282111561217f576040517ede4b8a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806fffffffffffffffffffffffffffffffff1660000361219e57505050565b806fffffffffffffffffffffffffffffffff16421115610fda576040517f5c53a98c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600082826040516020016121ff929190612d11565b60405160208183030381529060405280519060200120905092915050565b600080600061222c8585612241565b9150915061223981612286565b509392505050565b60008082516041036122775760208301516040840151606085015160001a61226b878285856123ee565b9450945050505061227f565b506000905060025b9250929050565b600081600481111561229a5761229a612d6f565b036122a25750565b60018160048111156122b6576122b6612d6f565b036123035760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e61747572650000000000000000604482015260640161077f565b600281600481111561231757612317612d6f565b036123645760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e67746800604482015260640161077f565b600381600481111561237857612378612d6f565b036123eb5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c60448201527f7565000000000000000000000000000000000000000000000000000000000000606482015260840161077f565b50565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561242557506000905060036124a9565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015612479573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166124a2576000600192509250506124a9565b9150600090505b94509492505050565b6000602082840312156124c457600080fd5b81356001600160e01b03198116811461083c57600080fd5b6001600160a01b03811681146123eb57600080fd5b60006020828403121561250357600080fd5b813561083c816124dc565b60008083601f84011261252057600080fd5b50813567ffffffffffffffff81111561253857600080fd5b60208301915083602082850101111561227f57600080fd5b6000806000806000806080878903121561256957600080fd5b863567ffffffffffffffff8082111561258157600080fd5b61258d8a838b0161250e565b9098509650602089013595506040890135945060608901359150808211156125b457600080fd5b506125c189828a0161250e565b979a9699509497509295939492505050565b60005b838110156125ee5781810151838201526020016125d6565b50506000910152565b6000815180845261260f8160208601602086016125d3565b601f01601f19169290920160200192915050565b60208152600061083c60208301846125f7565b60008060006060848603121561264b57600080fd5b8335612656816124dc565b925060208401359150604084013561266d816124dc565b809150509250925092565b6000806040838503121561268b57600080fd5b8235612696816124dc565b946020939093013593505050565b60008083601f8401126126b657600080fd5b50813567ffffffffffffffff8111156126ce57600080fd5b6020830191508360208260051b850101111561227f57600080fd5b600080602083850312156126fc57600080fd5b823567ffffffffffffffff81111561271357600080fd5b61271f858286016126a4565b90969095509350505050565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561278057603f1988860301845261276e8583516125f7565b94509285019290850190600101612752565b5092979650505050505050565b600080604083850312156127a057600080fd5b82356127ab816124dc565b915060208301356127bb816124dc565b809150509250929050565b6020808252825182820181905260009190848201906040850190845b818110156128075783516001600160a01b0316835292840192918401916001016127e2565b50909695505050505050565b60008060008060008060008060008060a08b8d03121561283257600080fd5b8a3567ffffffffffffffff8082111561284a57600080fd5b6128568e838f016126a4565b909c509a5060208d013591508082111561286f57600080fd5b61287b8e838f016126a4565b909a50985060408d013591508082111561289457600080fd5b6128a08e838f016126a4565b909850965060608d01359150808211156128b957600080fd5b6128c58e838f016126a4565b909650945060808d01359150808211156128de57600080fd5b506128eb8d828e016126a4565b915080935050809150509295989b9194979a5092959850565b60008060006060848603121561291957600080fd5b8335612924816124dc565b92506020840135612934816124dc565b929592945050506040919091013590565b6000806040838503121561295857600080fd5b8235612963816124dc565b915060208301356fffffffffffffffffffffffffffffffff811681146127bb57600080fd5b60008060008060008060a087890312156129a157600080fd5b86356129ac816124dc565b955060208701356129bc816124dc565b94506040870135935060608701359250608087013567ffffffffffffffff8111156129e657600080fd5b6125c189828a0161250e565b600080600060608486031215612a0757600080fd5b8335612a12816124dc565b92506020840135612a22816124dc565b9150604084013561266d816124dc565b634e487b7160e01b600052601160045260246000fd5b600060018201612a5a57612a5a612a32565b5060010190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6000808335601e19843603018112612aa457600080fd5b83018035915067ffffffffffffffff821115612abf57600080fd5b60200191503681900382131561227f57600080fd5b8183823760009101908152919050565b808201808211156106fd576106fd612a32565b600081612b0657612b06612a32565b506000190190565b6001600160e01b03198135818116916004851015612b365780818660040360031b1b83161692505b505092915050565b60008251612b508184602087016125d3565b9190910192915050565b60008085851115612b6a57600080fd5b83861115612b7757600080fd5b5050820193919092039150565b600080600080600060a08688031215612b9c57600080fd5b8535612ba7816124dc565b94506020860135612bb7816124dc565b93506040860135925060608601359150608086013567ffffffffffffffff80821115612be257600080fd5b818801915088601f830112612bf657600080fd5b813581811115612c0857612c08612a61565b604051601f8201601f19908116603f01168101908382118183101715612c3057612c30612a61565b816040528281528b6020848701011115612c4957600080fd5b8260208601602083013760006020848301015280955050505050509295509295909350565b818103818111156106fd576106fd612a32565b634e487b7160e01b600052603160045260246000fd5b6001600160a01b0384168152826020820152606060408201526000612cbf60608301846125f7565b95945050505050565b8781528660208201528560408201528460608201528360808201528260a082015260008251612cfe8160c08501602087016125d3565b9190910160c00198975050505050505050565b7f190000000000000000000000000000000000000000000000000000000000000081526bffffffffffffffffffffffff198360601b16600282015260008251612d618160168501602087016125d3565b919091016016019392505050565b634e487b7160e01b600052602160045260246000fdfe4c535031313a204661696c656420746f2063616c6c2066756e6374696f6e206f6e206163636f756e74a26469706673582212202f3ac4cd8941fbccfaa6d54e53b774d46e520ca40760e6c8fc9484b2706c64c664736f6c63430008110033",
"deployedBytecode": "0x6080604052600436106101ac5760003560e01c80638ca4aaaf116100ec578063b79336ee1161008a578063d617b89011610064578063d617b890146105a2578063dbd119bd146105fd578063f3b3c78514610633578063fa04a7f11461064657600080fd5b8063b79336ee14610537578063c68452101461054c578063cee79d451461056c57600080fd5b8063a219b404116100c6578063a219b40414610489578063a65068b6146104a9578063a9e3b276146104f7578063b44581d91461051757600080fd5b80638ca4aaaf146104295780639b27a90e14610456578063a20856a51461047657600080fd5b80636289a16311610159578063769e54df11610133578063769e54df1461039057806378f84ebd146103b057806388095527146103d05780638bc0ab751461041357600080fd5b80636289a163146102c4578063639cea19146103435780636963d4381461036357600080fd5b80631ce596661161018a5780631ce596661461024a5780634c8a4e741461026c578063506d1a0f1461028c57600080fd5b806301ffc9a7146101b157806302543bff146101e657806306fe173814610214575b600080fd5b3480156101bd57600080fd5b506101d16101cc3660046124b2565b610666565b60405190151581526020015b60405180910390f35b3480156101f257600080fd5b506102066102013660046124f1565b610703565b6040519081526020016101dd565b34801561022057600080fd5b5061020661022f3660046124f1565b6001600160a01b031660009081526005602052604090205490565b34801561025657600080fd5b5061026a6102653660046124f1565b610748565b005b61027f61027a366004612550565b6107ef565b6040516101dd9190612623565b34801561029857600080fd5b506102ac6102a7366004612636565b61080b565b6040516001600160a01b0390911681526020016101dd565b34801