@lukso/lsp7-contracts
Version:
Package for the LSP7 Digital Asset standard
1,210 lines • 91.3 kB
JSON
{
"_format": "hh3-artifact-1",
"contractName": "LSP7Mintable",
"sourceName": "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": "AccessControlBadConfirmation",
"type": "error"
},
{
"inputs": [],
"name": "AccessControlCannotSetAdminForDefaultAdminRole",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "bytes32",
"name": "neededRole",
"type": "bytes32"
}
],
"name": "AccessControlUnauthorizedAccount",
"type": "error"
},
{
"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": [],
"name": "LSP7MintDisabled",
"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": "bool",
"name": "enabled",
"type": "bool"
}
],
"name": "MintingStatusChanged",
"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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "previousAdminRole",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "bytes32",
"name": "newAdminRole",
"type": "bytes32"
}
],
"name": "RoleAdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleGranted",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"indexed": true,
"internalType": "address",
"name": "account",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "RoleRevoked",
"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": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MINTER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"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": [],
"name": "disableMinting",
"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": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleAdmin",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "uint256",
"name": "index",
"type": "uint256"
}
],
"name": "getRoleMember",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleMemberCount",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
}
],
"name": "getRoleMembers",
"outputs": [
{
"internalType": "address[]",
"name": "",
"type": "address[]"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "grantRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "hasRole",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"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": [],
"name": "isMintable",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "callerConfirmation",
"type": "address"
}
],
"name": "renounceRole",
"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": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "revokeRole",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "rolesOf",
"outputs": [
{
"internalType": "bytes32[]",
"name": "",
"type": "bytes32[]"
}
],
"stateMutability": "view",
"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": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "adminRole",
"type": "bytes32"
}
],
"name": "setRoleAdmin",
"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": [],
"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": "0x60a060405234801561000f575f5ffd5b506040516144bc3803806144bc83398101604081905261002e91610721565b600185858585858484848481610043336101ea565b6001600160a01b03811661006a576040516306b620db60e21b815260040160405180910390fd5b6100738161020d565b506040805180820190915260048152632936598960e21b60208201526100ba907feafec4d89fa9619884b60000a4d96624a38f7ac2d8d9a604ecf07c12c77e480c9061025c565b6100e47fdeba1e292f8ba88238e10ab3c7f88bd4be4fac56cad5194b6ecceaf653468af18561025c565b61010e7f2f0a68ab07768e01943a599e73362a0e17a63a72e94dd2e384d2c1d4db9327568461025c565b6040805160208101839052610155917fe0261fa95db2eb3b5439bd033cda66d56b96f92f243a8228fd87550ed7bdfdb3910160408051601f1981840301815291905261025c565b50505050151560805250505f805461017e93509091506001600160a01b03166102b0565b6102b0565b6009805460ff19168215159081179091556040517f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4905f90a280156101df576101df5f51602061449c5f395f51905f526101795f546001600160a01b031690565b505050505050610980565b6102015f51602061449c5f395f51905f525f61032e565b61020a81610393565b50565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f828152600160205260409020610273828261084a565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b2826040516102a49190610904565b60405180910390a25050565b5f8281526007602052604081206102c79083610429565b90508015610329576001600160a01b0382165f9081526008602052604090206102f09084610446565b5060405133906001600160a01b0384169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45b505050565b8161034c5760405163d0dc904b60e01b815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b5f546001600160a01b03166103a78261020d565b6001600160a01b0381165f9081526008602052604081206103c790610451565b90505f5b8151811015610423575f8282815181106103e7576103e7610939565b60200260200101519050610401818561046460201b60201c565b6001600160a01b0385161561041a5761041a81866102b0565b506001016103cb565b50505050565b5f61043d836001600160a01b0384166104e1565b90505b92915050565b5f61043d83836104e1565b60605f61045d8361052d565b9392505050565b5f82815260076020526040812061047b9083610586565b90508015610329576001600160a01b0382165f9081526008602052604090206104a4908461059a565b5060405133906001600160a01b0384169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f81815260018301602052604081205461052657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610440565b505f610440565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561057a57602002820191905f5260205f20905b815481526020019060010190808311610566575b50505050509050919050565b5f61043d836001600160a01b0384166105a1565b5f61043d83835b5f818152600183016020526040812054801561067b575f6105c360018361094d565b85549091505f906105d69060019061094d565b9050818114610635575f865f0182815481106105f4576105f4610939565b905f5260205f200154905080875f01848154811061061457610614610939565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806106465761064661096c565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610440565b5f915050610440565b634e487b7160e01b5f52604160045260245ffd5b5f82601f8301126106a7575f5ffd5b81516001600160401b038111156106c0576106c0610684565b604051601f8201601f19908116603f011681016001600160401b03811182821017156106ee576106ee610684565b604052818152838201602001851015610705575f5ffd5b8160208501602083015e5f918101602001919091529392505050565b5f5f5f5f5f60a08688031215610735575f5ffd5b85516001600160401b0381111561074a575f5ffd5b61075688828901610698565b602088015190965090506001600160401b03811115610773575f5ffd5b61077f88828901610698565b604088015190955090506001600160a01b038116811461079d575f5ffd5b60608701516080880151919450925080151581146107b9575f5ffd5b809150509295509295909350565b600181811c908216806107db57607f821691505b6020821081036107f957634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561032957805f5260205f20601f840160051c810160208510156108245750805b601f840160051c820191505b81811015610843575f8155600101610830565b5050505050565b81516001600160401b0381111561086357610863610684565b6108778161087184546107c7565b846107ff565b6020601f8211600181146108a9575f83156108925750848201515b5f19600385901b1c1916600184901b178455610843565b5f84815260208120601f198516915b828110156108d857878501518255602094850194600190920191016108b8565b50848210156108f557868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561044057634e487b7160e01b5f52601160045260245ffd5b634e487b7160e01b5f52603160045260245ffd5b608051613b046109985f395f610c980152613b045ff3fe608060405260043610610237575f3560e01c80637580d92011610137578063a217fddf116100af578063d53913931161007e578063d72fc29a11610063578063d72fc29a1461077b578063dedff9c61461079a578063f2fde38b146107b9576102c2565b8063d539139314610729578063d547741f1461075c576102c2565b8063a217fddf146106ac578063a3246ad3146106bf578063b49506fd146106eb578063ca15c8731461070a576102c2565b80637f23690c116101065780639010d07c116100eb5780639010d07c1461065b57806391d148541461067a5780639790242114610699576102c2565b80637f23690c146105fe5780638da5cb5b14610611576102c2565b80637580d9201461058d578063760d9bba146105ac57806378381670146105cb5780637e5cd5c1146105ea576102c2565b806330d0dc37116101ca57806354f6127f116101995780636963d4381161017e5780636963d4381461050c57806370a0823114610538578063715018a614610579576102c2565b806354f6127f146104c157806365aeaa95146104ed576102c2565b806330d0dc3714610444578063313ce5671461046357806336568abe1461048957806346b45af7146104a8576102c2565b80632bc1da82116102065780632bc1da82146103bb5780632d7667c9146103da5780632de94807146103f95780632f2ff15d14610425576102c2565b806301ffc9a71461031d57806318160ddd146103515780631e4e00911461036f578063248a9ca314610390576102c2565b366102c257345f03610290576040517fe5099ee30000000000000000000000000000000000000000000000000000000081526004016102879060208082526004908201525f604082015260600190565b60405180910390fd5b6040517f388f5adc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f36606082826004811015610305576040517fe5099ee3000000000000000000000000000000000000000000000000000000008152600401610287929190612bf9565b505061031183836107d8565b80519350602001915050f35b348015610328575f5ffd5b5061033c610337366004612c45565b61096d565b60405190151581526020015b60405180910390f35b34801561035c575f5ffd5b506002545b604051908152602001610348565b34801561037a575f5ffd5b5061038e610389366004612c84565b610986565b005b34801561039b575f5ffd5b506103616103aa366004612ca4565b5f9081526006602052604090205490565b3480156103c6575f5ffd5b5061038e6103d5366004612df6565b61099f565b3480156103e5575f5ffd5b5061038e6103f4366004613023565b610a52565b348015610404575f5ffd5b50610418610413366004613106565b610b57565b604051610348919061311f565b348015610430575f5ffd5b5061038e61043f366004613161565b610b87565b34801561044f575f5ffd5b5061038e61045e36600461318b565b610ba8565b34801561046e575f5ffd5b50610477610c95565b60405160ff9091168152602001610348565b348015610494575f5ffd5b5061038e6104a3366004613161565b610cc6565b3480156104b3575f5ffd5b5060095461033c9060ff1681565b3480156104cc575f5ffd5b506104e06104db366004612ca4565b610da2565b6040516103489190613242565b3480156104f8575f5ffd5b50610361610507366004613254565b610dad565b348015610517575f5ffd5b5061052b61052636600461327c565b610e44565b60405161034891906132ed565b348015610543575f5ffd5b50610361610552366004613106565b73ffffffffffffffffffffffffffffffffffffffff165f9081526003602052604090205490565b348015610584575f5ffd5b5061038e610f8f565b348015610598575f5ffd5b5061038e6105a736600461336e565b610fa2565b3480156105b7575f5ffd5b5061038e6105c636600461339f565b610fd8565b3480156105d6575f5ffd5b5061038e6105e5366004613406565b61100d565b3480156105f5575f5ffd5b5061038e611137565b61038e61060c366004613452565b6111cf565b34801561061c575f5ffd5b505f5473ffffffffffffffffffffffffffffffffffffffff165b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610348565b348015610666575f5ffd5b50610636610675366004612c84565b611219565b348015610685575f5ffd5b5061033c610694366004613161565b611237565b61038e6106a7366004613496565b611242565b3480156106b7575f5ffd5b506103615f81565b3480156106ca575f5ffd5b506106de6106d9366004612ca4565b61128c565b60405161034891906134f1565b3480156106f6575f5ffd5b5061038e610705366004612df6565b6112a5565b348015610715575f5ffd5b50610361610724366004612ca4565b6112e4565b348015610734575f5ffd5b506103617f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b348015610767575f5ffd5b5061038e610776366004613161565b6112fa565b348015610786575f5ffd5b506106de610795366004613106565b61139d565b3480156107a5575f5ffd5b5061052b6107b436600461353e565b6113cd565b3480156107c4575f5ffd5b5061038e6107d3366004613106565b611477565b60605f6108075f357fffffffff000000000000000000000000000000000000000000000000000000001661152e565b5090507fffffffff000000000000000000000000000000000000000000000000000000005f351673ffffffffffffffffffffffffffffffffffffffff82166108a0576040517fbb370b2b0000000000000000000000000000000000000000000000000000000081527fffffffff000000000000000000000000000000000000000000000000000000009091166004820152602401610287565b505f5f8273ffffffffffffffffffffffffffffffffffffffff1634878733346040516020016108d29493929190613570565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529082905261090a916135b3565b5f6040518083038185875af1925050503d805f8114610944576040519150601f19603f3d011682016040523d82523d5f602084013e610949565b606091505b5091509150811561095e579250610967915050565b80518060208301fd5b92915050565b5f610977826115ec565b806109675750610967826116cf565b5f61099081611733565b61099a838361173d565b505050565b5f6109aa8433610dad565b905083816109fd576040517fcba6e97700000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401610287565b505f610a0984836135f6565b9050610a193386836001876117bb565b5f338285604051602001610a2f93929190613609565b6040516020818303038152906040529050610a4a86826119df565b505050505050565b8451845181148015610a645750835181145b8015610a705750825181145b8015610a7c5750815181145b610ab2576040517f263eee8d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b81811015610b4e57610b46878281518110610ad157610ad1613646565b6020026020010151878381518110610aeb57610aeb613646565b6020026020010151878481518110610b0557610b05613646565b6020026020010151878581518110610b1f57610b1f613646565b6020026020010151878681518110610b3957610b39613646565b6020026020010151610fd8565b600101610ab4565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020526040902060609061096790611a0a565b5f82815260066020526040902054610b9e81611733565b61099a8383611a16565b3373ffffffffffffffffffffffffffffffffffffffff84161480610be157503373ffffffffffffffffffffffffffffffffffffffff8516145b338486909192610c46576040517f1a525b3200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606401610287565b505050610c5683855f85856117bb565b8115610c8f575f835f83604051602001610c7293929190613673565b6040516020818303038152906040529050610c8d85826119df565b505b50505050565b5f7f0000000000000000000000000000000000000000000000000000000000000000610cc15750601290565b505f90565b73ffffffffffffffffffffffffffffffffffffffff81163314610d15576040517f6697b23200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81158015610d3957505f5473ffffffffffffffffffffffffffffffffffffffff1633145b1533839091610d92576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b5050610d9e8233611aad565b5050565b606061096782611b44565b5f8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610e0c575073ffffffffffffffffffffffffffffffffffffffff81165f90815260036020526040902054610967565b5073ffffffffffffffffffffffffffffffffffffffff8082165f90815260056020908152604080832093861683529290522054610967565b60608167ffffffffffffffff811115610e5f57610e5f612ce3565b604051908082528060200260200182016040528015610e9257816020015b6060815260200190600190039081610e7d5790505b5090505f5b82811015610f88575f8030868685818110610eb457610eb4613646565b9050602002810190610ec691906136aa565b604051610ed4929190613712565b5f60405180830381855af49150503d805f8114610f0c576040519150601f19603f3d011682016040523d82523d5f602084013e610f11565b606091505b509150915081610f6057805115610f2b5780518082602001fd5b6040517fb774c28400000000000000000000000000000000000000000000000000000000815260048101849052602401610287565b80848481518110610f7357610f73613646565b60209081029190910101525050600101610e97565b5092915050565b610f97611be3565b610fa05f611c63565b565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610fcc81611733565b610c8d85858585611c96565b3373ffffffffffffffffffffffffffffffffffffffff86161461100057611000338685611cde565b610c8d8585858585611da5565b3373ffffffffffffffffffffffffffffffffffffffff8416148061104657503373ffffffffffffffffffffffffffffffffffffffff8516145b3384869091926110ab576040517f98ce294500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff938416600482015291831660248301529091166044820152606401610287565b5050505f6110b98585610dad565b9050828110156110f5576040517f0ef76c3500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8281036111068587836001876117bb565b5f85828560405160200161111c93929190613609565b6040516020818303038152906040529050610b4e87826119df565b61113f611be3565b60095460ff1661117b576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600980547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556040515f907f41f386d449eec03c1c3b75bbba9c18df70aa19779ff47f68eab4b6a66fb399d4908290a2565b6111d7611be3565b341561120f576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9e8282611e7c565b5f8281526007602052604081206112309083611fdb565b9392505050565b5f6112308383611fe6565b61124a611be3565b3415611282576040517ff36ba73700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d9e8282611ffd565b5f81815260076020526040902060609061096790611a0a565b6112b33384846001856117bb565b5f3383836040516020016112c993929190613609565b6040516020818303038152906040529050610c8f84826119df565b5f818152600760205260408120610967906120c1565b5f8281526006602052604090205461131181611733565b8215801561133857505f5473ffffffffffffffffffffffffffffffffffffffff8381169116145b1582849091611391576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b505061099a8383611aad565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260046020526040902060609061096790611a0a565b6060815167ffffffffffffffff8111156113e9576113e9612ce3565b60405190808252806020026020018201604052801561141c57816020015b60608152602001906001900390816114075790505b5090505f5b82518110156114715761144c83828151811061143f5761143f613646565b6020026020010151611b44565b82828151811061145e5761145e613646565b6020908102919091010152600101611421565b50919050565b61147f611be3565b73ffffffffffffffffffffffffffffffffffffffff8116611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610287565b61152b81611c63565b50565b5f808061157d7fcee78b4094da86011096000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000086166120ca565b90505f61158982611b44565b905080516014148061159a57508051155b81906115d3576040517f42bfe79f0000000000000000000000000000000000000000000000000000000081526004016102879190613242565b506115dd81613721565b60601c95600195509350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167f7965db0b00000000000000000000000000000000000000000000000000000000148061167e57507fffffffff0000000000000000000000000000000000000000000000000000000082167f5a05180f00000000000000000000000000000000000000000000000000000000145b8061096757507fffffffff0000000000000000000000000000000000000000000000000000000082167f90832245000000000000000000000000000000000000000000000000000000001492915050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fc52d600800000000000000000000000000000000000000000000000000000000148061172457506117248261214d565b806109675750610967826121a2565b61152b81336121fd565b81611774576040517fd0dc904b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82815260066020526040808220805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b73ffffffffffffffffffffffffffffffffffffffff8416611808576040517f6355e76600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361186d576040517fdab7504700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8086165f90815260056020908152604080832093881683529290522083905582156119415773ffffffffffffffffffffffffffffffffffffffff85165f9081526004602052604090206118d5908561225f565b50828573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167ff772a43bfdf4729b196e3fb54a818b91a2ca6c49d10b2e16278752f9f515c25d846040516119349190613242565b60405180910390a4610c8d565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260046020526040902061196f9085612280565b508115158573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f0ebf5762d8855cbe012d2ca42fb33a81175e17c8a8751f8859931ba453bd4167846040516119d09190613242565b60405180910390a45050505050565b610d9e827f386072cc5a58e61263b434c722725f21031cd06e7c552cfaa06db5de8a320dbc836122a1565b60605f6112308361239a565b5f828152600760205260408120611a2d908361225f565b9050801561099a5773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611a6390846123f2565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a4505050565b5f828152600760205260408120611ac49083612280565b9050801561099a5773ffffffffffffffffffffffffffffffffffffffff82165f908152600860205260409020611afa90846123fd565b50604051339073ffffffffffffffffffffffffffffffffffffffff84169085907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a4505050565b5f818152600160205260409020805460609190611b609061378d565b80601f0160208091040260200160405190810160405280929190818152602001828054611b8c9061378d565b8015611bd75780601f10611bae57610100808354040283529160200191611bd7565b820191905f5260205f20905b815481529060010190602001808311611bba57829003601f168201915b50505050509050919050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610fa0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610287565b611c8d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a65f61173d565b61152b81612408565b60095460ff16611cd2576040517fe633442100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610c8f848484846124b9565b73ffffffffffffffffffffffffffffffffffffffff8083165f90815260056020908152604080832093871683529290522054801580611d1c57508082115b15611d81576040517ff3a6b69100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8085166004830152602482018390528516604482015260648101839052608401610287565b610c8f8385611d9085856137d8565b5f60405180602001604052805f8152506117bb565b73ffffffffffffffffffffffffffffffffffffffff851615801590611ddf575073ffffffffffffffffffffffffffffffffffffffff841615155b611e15576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611e228585858585610c8d565b611e2f8585858585612563565b611e3c8585858585610c8d565b5f3386868685604051602001611e569594939291906137eb565b6040516020818303038152906040529050611e71868261271c565b610a4a858483612747565b7f2145e1d6d074577dc71ef54c3807742b41b053a9352ae6b491331509acb9750f8201611ed5576040517f85c169bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fd0f59754f88971fe6bc5a6618cc9d5f1e859c58d16b22d1c7b2d3e2b246cd8aa8201611f2e576040517f76755b3800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f1fd9e056a24d14c4abc642fcc325992a946906d0dbc57dd70278aaf12842024d8201611f87576040517f4ef6d7fb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f828152600160205260409020611f9e828261389b565b50817fece574603820d07bc9b91f2a932baadf4628aabcb8afba49776529c14a6104b282604051611fcf9190613242565b60405180910390a25050565b5f61123083836128a0565b5f82815260076020526040812061123090836128c6565b8051825114612038576040517f3bcc897900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81515f03612072576040517f97da5f9500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b825181101561099a576120b983828151811061209257612092613646565b60200260200101518383815181106120ac576120ac613646565b6020026020010151611e7c565b600101612074565b5f610967825490565b604080517fffffffffffffffffffff00000000000000000000000000000000000000000000841660208201525f602a82018190527fffffffffffffffffffffffffffffffffffffffff0000000000000000000000008416602c83015291829101604051602081830303815290604052905080612145906139b2565b949350505050565b5f7fffffffff0000000000000000000000000000000000000000000000000000000082167fa918fa6b0000000000000000000000000000000000000000000000000000000014806109675750610967826128f4565b5f806121cd7f01ffc9a70000000000000000000000000000000000000000000000000000000061152e565b50905073ffffffffffffffffffffffffffffffffffffffff81166121f357505f92915050565b611230818461298a565b6122078282611fe6565b81839091610c8f576040517fe2517d3f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90921660048301526024820152604401610287565b5f6112308373ffffffffffffffffffffffffffffffffffffffff8416612a56565b5f6112308373ffffffffffffffffffffffffffffffffffffffff8416612aa2565b6122e173ffffffffffffffffffffffffffffffffffffffff84167f6bb56a140000000000000000000000000000000000000000000000000000000061298a565b1561099a576040517f6bb56a1400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff841690636bb56a149061233a90859085906004016139f4565b5f604051808303815f875af1158015612355573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610c8f9190810190613a0c565b6060815f01805480602002602001604051908101604052809291908181526020018280548015611bd757602002820191905f5260205f20905b8154815260200190600101908083116123d35750505050509050919050565b5f6112308383612a56565b5f6112308383612aa2565b5f5473ffffffffffffffffffffffffffffffffffffffff1661242982612b85565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260086020526040812061245690611a0a565b90505f5b8151811015610c8f575f82828151811061247657612476613646565b6020026020010151905061248a8185611aad565b73ffffffffffffffffffffffffffffffffffffffff8516156124b0576124b08186611a16565b5060010161245a565b73ffffffffffffffffffffffffffffffffffffffff8416612506576040517fd2d5ec3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125135f85858585610c8d565b6125205f85858585612563565b61252d5f85858585610c8d565b5f335f8686856040516020016125479594939291906137eb565b6040516020818303038152906040529050610c8d858483612747565b73ffffffffffffffffffffffffffffffffffffffff851661259a578260025f82825461258f91906135f6565b909155506126509050565b73ffffffffffffffffffffffffffffffffffffffff85165f9081526003602052604090205480868580831015612622576040517f08d47949000000000000000000000000000000000000000000000000000000008152600481019390935273ffffffffffffffffffffffffffffffffffffffff909116602483015260448201526