@gooddollar/goodprotocol
Version:
GoodDollar Protocol
1,202 lines • 84.2 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "GoodDollar",
"sourceName": "contracts/token/GoodDollar.sol",
"abi": [
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "previousAdmin",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "AdminChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "beacon",
"type": "address"
}
],
"name": "BeaconUpgraded",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"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": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"indexed": false,
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "Upgraded",
"type": "event"
},
{
"inputs": [],
"name": "DEFAULT_ADMIN_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "DOMAIN_SEPARATOR",
"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": [],
"name": "PAUSER_ROLE",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_minter",
"type": "address"
}
],
"name": "addMinter",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_pauser",
"type": "address"
}
],
"name": "addPauser",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
}
],
"name": "allowance",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "approve",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burn",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
},
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "burnFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "cap",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "decimals",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "subtractedValue",
"type": "uint256"
}
],
"name": "decreaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "feeRecipient",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "formula",
"outputs": [
{
"internalType": "contract IFeesFormula",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "address",
"name": "recipient",
"type": "address"
}
],
"name": "getFees",
"outputs": [
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "bool",
"name": "senderPays",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "getFees",
"outputs": [
{
"internalType": "uint256",
"name": "fee",
"type": "uint256"
},
{
"internalType": "bool",
"name": "senderPays",
"type": "bool"
}
],
"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"
},
{
"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": [],
"name": "identity",
"outputs": [
{
"internalType": "contract IIdentity",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "addedValue",
"type": "uint256"
}
],
"name": "increaseAllowance",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "name",
"type": "string"
},
{
"internalType": "string",
"name": "symbol",
"type": "string"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "string",
"name": "_symbol",
"type": "string"
},
{
"internalType": "uint256",
"name": "_cap",
"type": "uint256"
},
{
"internalType": "contract IFeesFormula",
"name": "_formula",
"type": "address"
},
{
"internalType": "contract IIdentity",
"name": "_identity",
"type": "address"
},
{
"internalType": "address",
"name": "_feeRecipient",
"type": "address"
},
{
"internalType": "address",
"name": "_owner",
"type": "address"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_minter",
"type": "address"
}
],
"name": "isMinter",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_pauser",
"type": "address"
}
],
"name": "isPauser",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "mint",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "nonces",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "spender",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "deadline",
"type": "uint256"
},
{
"internalType": "uint8",
"name": "v",
"type": "uint8"
},
{
"internalType": "bytes32",
"name": "r",
"type": "bytes32"
},
{
"internalType": "bytes32",
"name": "s",
"type": "bytes32"
}
],
"name": "permit",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "proxiableUUID",
"outputs": [
{
"internalType": "bytes32",
"name": "",
"type": "bytes32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceMinter",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes32",
"name": "role",
"type": "bytes32"
},
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "renounceRole",
"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": "_feeRecipient",
"type": "address"
}
],
"name": "setFeeRecipient",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IFeesFormula",
"name": "_formula",
"type": "address"
}
],
"name": "setFormula",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract IIdentityV2",
"name": "_identity",
"type": "address"
}
],
"name": "setIdentity",
"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": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalSupply",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transfer",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "transferAndCall",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_owner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unpause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
}
],
"name": "upgradeTo",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newImplementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeToAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
],
"bytecode": "0x60a06040523060805234801561001457600080fd5b506080516139cb61004c60003960008181610a9601528181610ad601528181610ef701528181610f370152610faf01526139cb6000f3fe60806040526004361061025a5760003560e01c806301ffc9a71461025f57806306fdde0314610294578063095ea7b3146102b657806318160ddd146102d657806323b872dd146102f6578063248a9ca3146103165780632c159a1a146103365780632f2ff15d14610364578063313ce56714610386578063355274ea146103a25780633644e515146103b957806336568abe146103ce5780633659cfe6146103ee57806339364fd71461040e57806339509351146104435780633f4ba83a146104635780634000aea01461047857806340c10f191461049857806342966c68146104b857806346904840146104d857806346fbf68e146104f95780634b75f54f146105195780634cd88b761461053a5780634f1ef2861461055a57806352d1902d1461056d5780635c975abb146105825780635d5bf1781461059b57806370a08231146105bb57806379cc6790146105db5780637ecebe00146105fb57806382dc1ec41461061b5780638456cb591461063b5780638da5cb5b146106505780639010d07c1461066557806391d148541461068557806395d89b41146106a5578063983b2d56146106ba57806398650275146106da578063a217fddf146106ef578063a457c2d714610704578063a9059cbb14610724578063aa271e1a14610744578063ca15c87314610764578063d505accf14610784578063d5391393146107a4578063d547741f146107c6578063d5a06d4c146107e6578063dd62ed3e14610806578063dea7f11214610826578063e63ab1e914610846578063e74b981b14610868578063ecc06c7614610888578063f2fde38b146108a8575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612ebb565b6108c8565b60405190151581526020015b60405180910390f35b3480156102a057600080fd5b506102a96108f3565b60405161028b9190612f35565b3480156102c257600080fd5b5061027f6102d1366004612f5d565b610986565b3480156102e257600080fd5b5061012f545b60405190815260200161028b565b34801561030257600080fd5b5061027f610311366004612f89565b61099e565b34801561032257600080fd5b506102e8610331366004612fca565b6109c4565b34801561034257600080fd5b5061029054610357906001600160a01b031681565b60405161028b9190612fe3565b34801561037057600080fd5b5061038461037f366004612ff7565b6109d9565b005b34801561039257600080fd5b506040516012815260200161028b565b3480156103ae57600080fd5b506102e86102915481565b3480156103c557600080fd5b506102e86109fa565b3480156103da57600080fd5b506103846103e9366004612ff7565b610a09565b3480156103fa57600080fd5b50610384610409366004613027565b610a8c565b34801561041a57600080fd5b5061042e610429366004613044565b610b54565b6040805192835290151560208301520161028b565b34801561044f57600080fd5b5061027f61045e366004612f5d565b610bda565b34801561046f57600080fd5b50610384610bfc565b34801561048457600080fd5b5061027f610493366004613086565b610c7a565b3480156104a457600080fd5b5061027f6104b3366004612f5d565b610d80565b3480156104c457600080fd5b506103846104d3366004612fca565b610e07565b3480156104e457600080fd5b5061028e54610357906001600160a01b031681565b34801561050557600080fd5b5061027f610514366004613027565b610e11565b34801561052557600080fd5b5061028f54610357906001600160a01b031681565b34801561054657600080fd5b506103846105553660046131b9565b610e2b565b61038461056836600461321c565b610eed565b34801561057957600080fd5b506102e8610fa2565b34801561058e57600080fd5b506101f85460ff1661027f565b3480156105a757600080fd5b506103846105b6366004613027565b611050565b3480156105c757600080fd5b506102e86105d6366004613027565b61109a565b3480156105e757600080fd5b506103846105f6366004612f5d565b6110b6565b34801561060757600080fd5b506102e8610616366004613027565b6110cb565b34801561062757600080fd5b50610384610636366004613027565b6110ea565b34801561064757600080fd5b50610384611102565b34801561065c57600080fd5b5061035761117c565b34801561067157600080fd5b50610357610680366004613275565b611184565b34801561069157600080fd5b5061027f6106a0366004612ff7565b61119c565b3480156106b157600080fd5b506102a96111c7565b3480156106c657600080fd5b506103846106d5366004613027565b6111d7565b3480156106e657600080fd5b506103846111ef565b3480156106fb57600080fd5b506102e8600081565b34801561071057600080fd5b5061027f61071f366004612f5d565b611207565b34801561073057600080fd5b5061027f61073f366004612f5d565b61128d565b34801561075057600080fd5b5061027f61075f366004613027565b6112af565b34801561077057600080fd5b506102e861077f366004612fca565b6112c9565b34801561079057600080fd5b5061038461079f366004613297565b6112e0565b3480156107b057600080fd5b506102e860008051602061395683398151915281565b3480156107d257600080fd5b506103846107e1366004612ff7565b611444565b3480156107f257600080fd5b5061042e610801366004612fca565b611460565b34801561081257600080fd5b506102e861082136600461330e565b6114e3565b34801561083257600080fd5b5061038461084136600461333c565b61150f565b34801561085257600080fd5b506102e860008051602061390f83398151915281565b34801561087457600080fd5b50610384610883366004613027565b611675565b34801561089457600080fd5b506103846108a3366004613027565b6116bf565b3480156108b457600080fd5b506103846108c3366004613027565b611709565b60006001600160e01b03198216635a05180f60e01b14806108ed57506108ed82611746565b92915050565b60606101308054610903906133f5565b80601f016020809104026020016040519081016040528092919081815260200182805461092f906133f5565b801561097c5780601f106109515761010080835404028352916020019161097c565b820191906000526020600020905b81548152906001019060200180831161095f57829003601f168201915b5050505050905090565b60003361099481858561177b565b5060019392505050565b6000806109ac8585856118a0565b90506109b9858583611a13565b9150505b9392505050565b600090815260c9602052604090206001015490565b6109e2826109c4565b6109eb81611a2c565b6109f58383611a36565b505050565b6000610a04611a58565b905090565b6001600160a01b0381163314610a7e5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a888282611ad5565b5050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610ad45760405162461bcd60e51b8152600401610a7590613429565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610b06611af7565b6001600160a01b031614610b2c5760405162461bcd60e51b8152600401610a7590613463565b610b3581611b13565b60408051600080825260208201909252610b5191839190611b3a565b50565b61028f54604051631eed540360e11b815260009182916001600160a01b0390911690633ddaa80690610b8e9088908890889060040161349d565b6040805180830381865afa158015610baa573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bce91906134d1565b91509150935093915050565b600033610994818585610bed83836114e3565b610bf79190613513565b61177b565b610c1460008051602061390f8339815191523361119c565b610c705760405162461bcd60e51b8152602060048201526039602482015260008051602061388f83398151915260448201527876652070617573657220726f6c6520746f20756e706175736560381b6064820152608401610a75565b610c78611ca5565b565b600080610c883387876118a0565b90506000610c968783611cf2565b9050866001600160a01b0316336001600160a01b03167fe19260aff97b920c7df27010903aeb9c8d2be5d310a2c67824cf3f15396e4c16848888604051610cdf93929190613526565b60405180910390a3863b15610d7657610d2f878387878080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611d0092505050565b610d765760405162461bcd60e51b815260206004820152601860248201527710dbdb9d1c9858dd0819985b1b189858dac819985a5b195960421b6044820152606401610a75565b9695505050505050565b6102915460009015610dfd576102915482610d9b61012f5490565b610da59190613513565b1115610dfd5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f7420696e63726561736520737570706c79206265796f6e642063616044820152600760fc1b6064820152608401610a75565b6109bd8383611dbf565b610b513382611e45565b60006108ed60008051602061390f8339815191528361119c565b600054610100900460ff1615808015610e4b5750600054600160ff909116105b80610e6c5750610e5a30611f76565b158015610e6c575060005460ff166001145b610e885760405162461bcd60e51b8152600401610a759061355c565b6000805460ff191660011790558015610eab576000805461ff0019166101001790555b610eb58383611f85565b80156109f5576000805461ff0019169055604051600181526000805160206138ef8339815191529060200160405180910390a1505050565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163003610f355760405162461bcd60e51b8152600401610a7590613429565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610f67611af7565b6001600160a01b031614610f8d5760405162461bcd60e51b8152600401610a7590613463565b610f9682611b13565b610a8882826001611b3a565b6000306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461103d5760405162461bcd60e51b815260206004820152603860248201527f555550535570677261646561626c653a206d757374206e6f742062652063616c6044820152771b1959081d1a1c9bdd59da0819195b1959d85d1958d85b1b60421b6064820152608401610a75565b506000805160206138cf83398151915290565b61105b60003361119c565b6110775760405162461bcd60e51b8152600401610a75906135aa565b61029080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0316600090815261012d602052604090205490565b6110c1823383612001565b610a888282611e45565b6001600160a01b038116600090815261019360205260408120546108ed565b610b5160008051602061390f833981519152826109d9565b61111a60008051602061390f8339815191523361119c565b6111745760405162461bcd60e51b8152602060048201526037602482015260008051602061388f83398151915260448201527676652070617573657220726f6c6520746f20706175736560481b6064820152608401610a75565b610c7861207b565b6000610a0481805b600082815260fb602052604081206109bd90836120b9565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60606101318054610903906133f5565b610b51600080516020613956833981519152826109d9565b610c7860008051602061395683398151915233610a09565b6000338161121582866114e3565b9050838110156112755760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b6064820152608401610a75565b611282828686840361177b565b506001949350505050565b60008061129b3385856118a0565b90506112a78482611cf2565b949350505050565b60006108ed6000805160206139568339815191528361119c565b600081815260fb602052604081206108ed906120c5565b834211156113305760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e650000006044820152606401610a75565b60007f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c988888861135f8c6120cf565b6040805160208101969096526001600160a01b0394851690860152929091166060840152608083015260a082015260c0810186905260e00160405160208183030381529060405280519060200120905060006113ba826120f8565b905060006113ca82878787612146565b9050896001600160a01b0316816001600160a01b03161461142d5760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e617475726500006044820152606401610a75565b6114388a8a8a61177b565b50505050505050505050565b61144d826109c4565b61145681611a2c565b6109f58383611ad5565b61028f54604051631eed540360e11b815260009182916001600160a01b0390911690633ddaa8069061149a9086908590819060040161349d565b6040805180830381865afa1580156114b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114da91906134d1565b91509150915091565b6001600160a01b03918216600090815261012e6020908152604080832093909416825291909152205490565b600054610100900460ff161580801561152f5750600054600160ff909116105b80611550575061153e30611f76565b158015611550575060005460ff166001145b61156c5760405162461bcd60e51b8152600401610a759061355c565b6000805460ff19166001179055801561158f576000805461ff0019166101001790555b6115998888611f85565b61028e80546001600160a01b038086166001600160a01b031992831617909255610290805487841690831617905561028f8054928816929091169190911790556102918690556115e63390565b6001600160a01b0316826001600160a01b0316146116375761160782611709565b61161f60008051602061395683398151915233610a09565b61163760008051602061390f83398151915233610a09565b801561166b576000805461ff0019169055604051600181526000805160206138ef8339815191529060200160405180910390a15b5050505050505050565b61168060003361119c565b61169c5760405162461bcd60e51b8152600401610a75906135aa565b61028e80546001600160a01b0319166001600160a01b0392909216919091179055565b6116ca60003361119c565b6116e65760405162461bcd60e51b8152600401610a75906135aa565b61028f80546001600160a01b0319166001600160a01b0392909216919091179055565b61171460003361119c565b6117305760405162461bcd60e51b8152600401610a75906135aa565b61173b6000826109d9565b610b51600033610a09565b60006001600160e01b03198216637965db0b60e01b14806108ed57506301ffc9a760e01b6001600160e01b03198316146108ed565b6001600160a01b0383166117dd5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b6064820152608401610a75565b6001600160a01b03821661183e5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b6064820152608401610a75565b6001600160a01b03838116600081815261012e602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b60008060006118b0848787610b54565b9150915060008211801561193357506102905460405163639e625760e11b81526001600160a01b039091169063c73cc4ae906118f0903390600401612fe3565b602060405180830381865afa15801561190d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061193191906135cd565b155b15611a095780158061195657506119498661109a565b6119538386613513565b11155b6119a25760405162461bcd60e51b815260206004820181905260248201527f4e6f7420656e6f7567682062616c616e636520746f20706179205458206665656044820152606401610a75565b336001600160a01b038716036119cf5761028e546119c9906001600160a01b031683611cf2565b506119ea565b61028e546119e89087906001600160a01b031684611a13565b505b806119fe576119f982856135e8565b611a00565b835b925050506109bd565b5091949350505050565b600033611a21858285612001565b61128285858561216e565b610b518133612314565b611a40828261236d565b600082815260fb602052604090206109f590826123f3565b6000610a047f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f611a8861015f5490565b610160546040805160208101859052908101839052606081018290524660808201523060a082015260009060c0016040516020818303038152906040528051906020012090509392505050565b611adf8282612408565b600082815260fb602052604090206109f5908261246f565b6000805160206138cf833981519152546001600160a01b031690565b611b1e60003361119c565b610b515760405162461bcd60e51b8152600401610a75906135aa565b7f4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd91435460ff1615611b6d576109f583612484565b826001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611bc7575060408051601f3d908101601f19168201909252611bc4918101906135fb565b60015b611c2a5760405162461bcd60e51b815260206004820152602e60248201527f45524331393637557067726164653a206e657720696d706c656d656e7461746960448201526d6f6e206973206e6f74205555505360901b6064820152608401610a75565b6000805160206138cf8339815191528114611c995760405162461bcd60e51b815260206004820152602960248201527f45524331393637557067726164653a20756e737570706f727465642070726f786044820152681a58589b195555525160ba1b6064820152608401610a75565b506109f583838361251e565b611cad612543565b6101f8805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b604051611ce89190612fe3565b60405180910390a1565b60003361099481858561216e565b604051635260769b60e11b815260009084906001600160a01b0382169063a4c0ed3690611d3590339088908890600401613614565b6020604051808303816000875af1158015611d54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d7891906135cd565b6112825760405162461bcd60e51b815260206004820152601860248201527710dbdb9d1c9858dd0811985b1b189858dac819985a5b195960421b6044820152606401610a75565b6000611dd96000805160206139568339815191523361119c565b611e325760405162461bcd60e51b8152602060048201526036602482015260008051602061388f8339815191526044820152751d99481b5a5b9d195c881c9bdb19481d1bc81b5a5b9d60521b6064820152608401610a75565b611e3c838361258d565b50600192915050565b6001600160a01b038216611ea55760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b6064820152608401610a75565b611eb18260008361264a565b6001600160a01b038216600090815261012d602052604090205481811015611f265760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b6064820152608401610a75565b6001600160a01b038316600081815261012d60209081526040808320868603905561012f8054879003905551858152919291600080516020613976833981519152910160405180910390a3505050565b6001600160a01b03163b151590565b600054610100900460ff16611fac5760405162461bcd60e51b8152600401610a759061363b565b611fb4612655565b611fbc612655565b611fc4612655565b611fcc612655565b611fd6828261267c565b611fde612655565b611fe66126be565b611fee612655565b611ff882826126f2565b610a8882612754565b600061200d84846114e3565b9050600019811461207557818110156120685760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e63650000006044820152606401610a75565b612075848484840361177b565b50505050565b61208361277b565b6101f8805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611cdb3390565b60006109bd83836127c2565b60006108ed825490565b6001600160a01b0381166000908152610193602052604090208054600181018255905b50919050565b60006108ed612105611a58565b8360405161190160f01b6020820152602281018390526042810182905260009060620160405160208183030381529060405280519060200120905092915050565b6000806000612157878787876127ec565b91509150612164816128a6565b5095945050505050565b6001600160a01b0383166121d25760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b6064820152608401610a75565b6001600160a01b0382166122345760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b6064820152608401610a75565b61223f83838361264a565b6001600160a01b038316600090815261012d6020526040902054818110156122b85760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b6064820152608401610a75565b6001600160a01b03808516600081815261012d60205260408082208686039055928616808252908390208054860190559151600080516020613976833981519152906123079086815260200190565b60405180910390a3612075565b61231e828261119c565b610a885761232b816129eb565b6123368360206129fd565b604051602001612347929190613686565b60408051601f198184030181529082905262461bcd60e51b8252610a7591600401612f35565b612377828261119c565b610a8857600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123af3390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60006109bd836001600160a01b038416612b98565b612412828261119c565b15610a8857600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b60006109bd836001600160a01b038416612be7565b61248d81611f76565b6124ef5760405162461bcd60e51b815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201526c1bdd08184818dbdb9d1c9858dd609a1b6064820152608401610a75565b6000805160206138cf83398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b61252783612cda565b6000825111806125345750805b156109f5576120758383612d1a565b6101f85460ff16610c785760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b6044820152606401610a75565b6001600160a01b0382166125e35760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f2061646472657373006044820152606401610a75565b6125ef6000838361264a565b8061012f60008282546126029190613513565b90915550506001600160a01b038216600081815261012d6020908152604080832080548601905551848152600080516020613976833981519152910160405180910390a35050565b6109f5838383612e0c565b600054610100900460ff16610c785760405162461bcd60e51b8152600401610a759061363b565b600054610100900460ff166126a35760405162461bcd60e51b8152600401610a759061363b565b6101306126b08382613743565b506101316109f58282613743565b600054610100900460ff166126e55760405162461bcd60e51b8152600401610a759061363b565b6101f8805460ff19169055565b600054610100900460ff166127195760405162461bcd60e51b8152600401610a759061363b565b612724600033612e73565b61273c60008051602061395683398151915233612e73565b610a8860008051602061390f83398151915233612e73565b600054610100900460ff16610b515760405162461bcd60e51b8152600401610a759061363b565b6101f85460ff1615610c785760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b6044820152606401610a75565b60008260000182815481106127d9576127d9613802565b9060005260206000200154905092915050565b6000806fa2a8918ca85bafe22016d0b997e4df60600160ff1b03831115612819575060009050600361289d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561286d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166128965760006001925092505061289d565b9150600090505b94509492505050565b60008160048111156128ba576128ba613818565b036128c25750565b60018160048111156128d6576128d6613818565b0361291e5760405162461bcd60e51b815260206004820152601860248201527745434453413a20696e76616c6964207369676e617475726560401b6044820152606401610a75565b600281600481111561293257612932613818565b0361297f5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610a75565b600381600481111561299357612993613818565b03610b515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610a75565b60606108ed6001600160a01b03831660145b60606000612a0c83600261382e565b612a17906002613513565b6001600160401b03811115612a2e57612a2e61310e565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b509050600360fc1b81600081518110612a7357612a73613802565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612aa257612aa2613802565b60200101906001600160f81b031916908160001a9053506000612ac684600261382e565b612ad1906001613513565b90505b6001811115612b49576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612b0557612b05613802565b1a60f81b828281518110612b1b57612b1b613802565b60200101906001600160f81b031916908160001a90535060049490941c93612b4281613845565b9050612ad4565b5083156109bd5760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a75565b6000818152600183016020526040812054612bdf575081546001818101845560008481526020808220909301849055845484825282860190935260409020919091556108ed565b5060006108ed565b60008181526001830160205260408120548015612cd0576000612c0b6001836135e8565b8554909150600090612c1f906001906135e8565b9050818114612c84576000866000018281548110612c3f57612c3f613802565b9060005260206000200154905080876000018481548110612c6257612c62613802565b6000918252602080832090910192909255918252600188019052604090208390555b8554869080612c9557612c9561385c565b6001900381819060005260206000200160009055905585600101600086815260200190815260200160002060009055600193505050506108ed565b60009150506108ed565b612ce381612484565b6040516001600160a01b038216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b6060612d2583611f76565b612d805760405162461bcd60e51b815260206004820152602660248201527f416464726573733a2064656c65676174652063616c6c20746f206e6f6e2d636f6044820152651b9d1c9858dd60d21b6064820152608401610a75565b600080846001600160a01b031684604051612d9b9190613872565b600060405180830381855af49150503d8060008114612dd6576040519150601f19603f3d011682016040523d82523d6000602084013e612ddb565b606091505b5091509150612e03828260405180606001604052806027815260200161392f60279139612e7d565b95945050505050565b6101f85460ff16156109f55760405162461bcd60e51b815260206004820152602a60248201527f45524332305061757361626c653a20746f6b656e207472616e736665722077686044820152691a5b19481c185d5cd95960b21b6064820152608401610a75565b610a888282611a36565b60608315612e8c5750816109bd565b6109bd8383815115612ea15781518083602001fd5b8060405162461bcd60e51b8152600401610a759190612f35565b600060208284031215612ecd57600080fd5b81356001600160e01b0319811681146109bd57600080fd5b60005b83811015612f00578181015183820152602001612ee8565b50506000910152565b60008151808452612f21816020860160208601612ee5565b601f01601f19169290920160200192915050565b6020815260006109bd6020830184612f09565b6001600160a01b0381168114610b5157600080fd5b60008060408385031215612f7057600080fd5b8235612f7b81612f48565b946020939093013593505050565b600080600060608486031215612f9e57600080fd5b8335612fa981612f48565b92506020840135612fb981612f48565b929592945050506040919091013590565b600060208284031215612fdc57600080fd5b5035919050565b6001600160a01b0391909116815260200190565b6000806040838503121561300a57600080fd5b82359150602083013561301c81612f48565b809150509250929050565b60006020828403121561303957600080fd5b81356109bd81612f48565b60008060006060848603121561305957600080fd5b83359250602084013561306b81612f48565b9150604084013561307b81612f48565b809150509250925092565b6000806000806060858703121561309c57600080fd5b84356130a781612f48565b93506020850135925060408501356001600160401b03808211156130ca57600080fd5b818701915087601f8301126130de57600080fd5b8135818111156130ed57600080fd5b8860208285010111156130ff57600080fd5b9598949750506020019450505