@gooddollar/goodprotocol
Version:
GoodDollar Protocol
1,329 lines • 130 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "GoodCompoundStakingTest",
"sourceName": "contracts/mocks/GoodCompoundStakingTest.sol",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_iToken",
"type": "address"
},
{
"internalType": "contract INameService",
"name": "_ns",
"type": "address"
},
{
"internalType": "string",
"name": "_tokenName",
"type": "string"
},
{
"internalType": "string",
"name": "_tokenSymbol",
"type": "string"
},
{
"internalType": "uint64",
"name": "_maxRewardThreshold",
"type": "uint64"
},
{
"internalType": "address",
"name": "_tokenUsdOracle",
"type": "address"
},
{
"internalType": "address",
"name": "_compUsdOracle",
"type": "address"
},
{
"internalType": "address[]",
"name": "_swapPath",
"type": "address[]"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"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": false,
"internalType": "uint8",
"name": "version",
"type": "uint8"
}
],
"name": "Initialized",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "recipient",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "iTokenGains",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "tokenGains",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "actualTokenRedeemed",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "actualRewardTokenEarned",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "interestCollectedInDAI",
"type": "uint256"
}
],
"name": "InterestCollected",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "staker",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "StakeWithdraw",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "staker",
"type": "address"
},
{
"indexed": false,
"internalType": "address",
"name": "token",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "Staked",
"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"
},
{
"inputs": [],
"name": "accAmountPerShare",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "accumulatedRewards",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"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": [],
"name": "avatar",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "claimReputation",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "collectInterestGasCost",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_recipient",
"type": "address"
}
],
"name": "collectUBIInterest",
"outputs": [
{
"internalType": "uint256",
"name": "actualTokenRedeemed",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "actualRewardTokenRedeemed",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "actualDai",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "comp",
"outputs": [
{
"internalType": "contract ERC20",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "compCollectGasCost",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "compUsdOracle",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_returnTokenBalanceInUSD",
"type": "bool"
},
{
"internalType": "bool",
"name": "_returnTokenGainsInUSD",
"type": "bool"
}
],
"name": "currentGains",
"outputs": [
{
"internalType": "uint256",
"name": "iTokenGains",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tokenGains",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tokenBalance",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "balanceInUSD",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "tokenGainsInUSD",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "dao",
"outputs": [
{
"internalType": "contract Controller",
"name": "",
"type": "address"
}
],
"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": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "decreaseProductivityTest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "getGasCostForInterestTransfer",
"outputs": [
{
"internalType": "uint32",
"name": "",
"type": "uint32"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
}
],
"name": "getProductivity",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "getRouter",
"outputs": [
{
"internalType": "contract Uniswap",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_oracle",
"type": "address"
},
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_decimals",
"type": "uint256"
}
],
"name": "getTokenValueInUSD",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_staker",
"type": "address"
}
],
"name": "getUserMintedAndPending",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "rewardsPerBlock",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "blockStart",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "blockEnd",
"type": "uint256"
}
],
"name": "getUserPendingReward",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "iToken",
"outputs": [
{
"internalType": "contract ERC20",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "iTokenWorthInToken",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_iToken",
"type": "address"
},
{
"internalType": "contract INameService",
"name": "_ns",
"type": "address"
},
{
"internalType": "string",
"name": "_tokenName",
"type": "string"
},
{
"internalType": "string",
"name": "_tokenSymbol",
"type": "string"
},
{
"internalType": "uint64",
"name": "_maxRewardThreshold",
"type": "uint64"
},
{
"internalType": "address",
"name": "_tokenUsdOracle",
"type": "address"
},
{
"internalType": "address",
"name": "_compUsdOracle",
"type": "address"
},
{
"internalType": "address[]",
"name": "_tokenToDaiSwapPath",
"type": "address[]"
}
],
"name": "init",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_token",
"type": "address"
},
{
"internalType": "address",
"name": "_iToken",
"type": "address"
},
{
"internalType": "contract INameService",
"name": "_ns",
"type": "address"
},
{
"internalType": "string",
"name": "_tokenName",
"type": "string"
},
{
"internalType": "string",
"name": "_tokenSymbol",
"type": "string"
},
{
"internalType": "uint64",
"name": "_maxRewardThreshold",
"type": "uint64"
}
],
"name": "initialize",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "isPaused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "lastRewardBlock",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxLiquidityPercentageSwap",
"outputs": [
{
"internalType": "uint24",
"name": "",
"type": "uint24"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "maxMultiplierThreshold",
"outputs": [
{
"internalType": "uint64",
"name": "",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "value",
"type": "uint256"
}
],
"name": "mintToken",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "mintedRewards",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "nameService",
"outputs": [
{
"internalType": "contract INameService",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "nativeToken",
"outputs": [
{
"internalType": "contract IGoodDollar",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_isPaused",
"type": "bool"
}
],
"name": "pause",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract ERC20",
"name": "_token",
"type": "address"
}
],
"name": "recover",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "redeemUnderlyingToDAITest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "user",
"type": "address"
},
{
"internalType": "uint256",
"name": "rewardsPerBlock",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "blockStart",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "blockEnd",
"type": "uint256"
}
],
"name": "rewardsMinted",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint24",
"name": "_maxPercentage",
"type": "uint24"
}
],
"name": "setMaxLiquidityPercentageSwap",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint32",
"name": "_collectInterestGasCost",
"type": "uint32"
},
{
"internalType": "uint32",
"name": "_rewardTokenCollectCost",
"type": "uint32"
}
],
"name": "setcollectInterestGasCostParams",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "_donationPer",
"type": "uint256"
},
{
"internalType": "bool",
"name": "_inInterestToken",
"type": "bool"
}
],
"name": "stake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "token",
"outputs": [
{
"internalType": "contract ERC20",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tokenDecimalDifference",
"outputs": [
{
"internalType": "uint8",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "tokenToDaiSwapPath",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "tokenUsdOracle",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
}
],
"name": "tokenWorthIniToken",
"outputs": [
{
"internalType": "uint256",
"name": "tokenWorth",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalEffectiveStakes",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalProductivity",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"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": "amount",
"type": "uint256"
}
],
"name": "transfer",
"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": "amount",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "uniswapContract",
"outputs": [
{
"internalType": "contract Uniswap",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "updateAvatar",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "users",
"outputs": [
{
"internalType": "uint256",
"name": "amount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "effectiveStakes",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rewardDebt",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rewardEarn",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "rewardMinted",
"type": "uint256"
},
{
"internalType": "uint64",
"name": "lastRewardTime",
"type": "uint64"
},
{
"internalType": "uint64",
"name": "multiplierResetTime",
"type": "uint64"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "withdrawRewards",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_amount",
"type": "uint256"
},
{
"internalType": "bool",
"name": "_inInterestToken",
"type": "bool"
}
],
"name": "withdrawStake",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x60806040523480156200001157600080fd5b5060405162006b1938038062006b19833981016040819052620000349162000c14565b6200004789898989898989898962000056565b50505050505050505062000fa9565b620000668989898989896200038b565b60675460405163bf40fac160e01b815260206004820152600360248201526244414960e81b60448201526000916001600160a01b03169063bf40fac190606401602060405180830381865afa158015620000c4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000ea919062000d17565b9050806001600160a01b03168a6001600160a01b03161480620001835750896001600160a01b03168260008151811062000128576200012862000d3e565b60200260200101516001600160a01b0316148015620001835750806001600160a01b031682600184516200015d919062000d6a565b8151811062000170576200017062000d3e565b60200260200101516001600160a01b0316145b620001c45760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840e0c2e8d60a31b60448201526064015b60405180910390fd5b60d880546001600160a01b038086166001600160a01b03199283161790925560d78054928716929091169190911790558151620002099060d9906020850190620009ea565b5060675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac19062000252906004016020808252600490820152630434f4d560e41b604082015260600190565b602060405180830381865afa15801562000270573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000296919062000d17565b60da80546001600160a01b0319166001600160a01b0392831617905560675460405163bf40fac160e01b815260206004820152600e60248201526d2aa724a9aba0a82fa927aaaa22a960911b604482015291169063bf40fac190606401602060405180830381865afa15801562000311573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000337919062000d17565b60db80546001600160a01b0319166001600160a01b039290921691909117905560d88054600160a01b600160e01b03191665249f00003d0960a41b1790556200037f6200068e565b50505050505050505050565b600054610100900460ff1615808015620003ac5750600054600160ff909116105b80620003c85750303b158015620003c8575060005460ff166001145b6200042d5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620001bb565b6000805460ff19166001179055801562000451576000805461ff0019166101001790555b6200045c8562000813565b60d580546001600160a01b03808a166001600160a01b03199283161790925560d68054928916929091169190911790556200049884846200083b565b60d5546040805163313ce56760e01b815290516012926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015620004e3573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000509919062000d86565b60ff161115620005735760405162461bcd60e51b815260206004820152602e60248201527f546f6b656e20646563696d616c732073686f756c64206265206c65737320746860448201526d616e20313820646563696d616c7360901b6064820152608401620001bb565b60d560009054906101000a90046001600160a01b03166001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015620005c7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ed919062000d86565b620005fa90601262000dab565b60a1805460ff191660ff92909216919091179055609f80546001600160401b0319166001600160401b03841617905560d6805462ffffff60a81b1916604b60aa1b179055801562000685576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b60db5460da5460405163095ea7b360e01b81526001600160a01b03928316929091169063095ea7b390620006cb9084906000199060040162000dc7565b6020604051808303816000875af1158015620006eb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000711919062000de0565b5060d55460405163095ea7b360e01b81526001600160a01b039091169063095ea7b390620007489084906000199060040162000dc7565b6020604051808303816000875af115801562000768573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200078e919062000de0565b5060d55460d65460405163095ea7b360e01b81526001600160a01b039283169263095ea7b392620007c9929116906000199060040162000dc7565b6020604051808303816000875af1158015620007e9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200080f919062000de0565b5050565b606780546001600160a01b0319166001600160a01b0383161790556200083862000871565b50565b600054610100900460ff16620008655760405162461bcd60e51b8152600401620001bb9062000e04565b6200080f82826200099e565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa158015620008d5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620008fb919062000d17565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801562000956573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200097c919062000d17565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b600054610100900460ff16620009c85760405162461bcd60e51b8152600401620001bb9062000e04565b6036620009d6838262000edd565b506037620009e5828262000edd565b505050565b82805482825590600052602060002090810192821562000a42579160200282015b8281111562000a4257825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019062000a0b565b5062000a5092915062000a54565b5090565b5b8082111562000a50576000815560010162000a55565b6001600160a01b03811681146200083857600080fd5b805162000a8e8162000a6b565b919050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b038111828210171562000ad45762000ad462000a93565b604052919050565b600082601f83011262000aee57600080fd5b81516001600160401b0381111562000b0a5762000b0a62000a93565b602062000b20601f8301601f1916820162000aa9565b828152858284870101111562000b3557600080fd5b60005b8381101562000b5557858101830151828201840152820162000b38565b506000928101909101919091529392505050565b80516001600160401b038116811462000a8e57600080fd5b600082601f83011262000b9357600080fd5b815160206001600160401b0382111562000bb15762000bb162000a93565b8160051b62000bc282820162000aa9565b928352848101820192828101908785111562000bdd57600080fd5b83870192505b8483101562000c0957825162000bf98162000a6b565b8252918301919083019062000be3565b979650505050505050565b60008060008060008060008060006101208a8c03121562000c3457600080fd5b62000c3f8a62000a81565b985062000c4f60208b0162000a81565b975062000c5f60408b0162000a81565b60608b01519097506001600160401b038082111562000c7d57600080fd5b62000c8b8d838e0162000adc565b975060808c015191508082111562000ca257600080fd5b62000cb08d838e0162000adc565b965062000cc060a08d0162000b69565b955062000cd060c08d0162000a81565b945062000ce060e08d0162000a81565b93506101008c015191508082111562000cf857600080fd5b5062000d078c828d0162000b81565b9150509295985092959850929598565b60006020828403121562000d2a57600080fd5b815162000d378162000a6b565b9392505050565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8181038181111562000d805762000d8062000d54565b92915050565b60006020828403121562000d9957600080fd5b815160ff8116811462000d3757600080fd5b60ff828116828216039081111562000d805762000d8062000d54565b6001600160a01b03929092168252602082015260400190565b60006020828403121562000df357600080fd5b8151801515811462000d3757600080fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b600181811c9082168062000e6457607f821691505b60208210810362000e8557634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620009e557600081815260208120601f850160051c8101602086101562000eb45750805b601f850160051c820191505b8181101562000ed55782815560010162000ec0565b505050505050565b81516001600160401b0381111562000ef95762000ef962000a93565b62000f118162000f0a845462000e4f565b8462000e8b565b602080601f83116001811462000f49576000841562000f305750858301515b600019600386901b1c1916600185901b17855562000ed5565b600085815260208120601f198616915b8281101562000f7a5788860151825594840194600190910190840162000f59565b508582101562000f995787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b615b608062000fb96000396000f3fe608060405234801561001057600080fd5b50600436106102b45760003560e01c806302329a29146102b957806306fdde03146102ce578063095ea7b3146102ec57806309b04fb41461030f5780630cd865ec1461034a578063109d0af81461035d57806316965b9a1461037d57806317a6a40c1461039057806318160ddd146103b15780631b3c90a8146103b95780631ce720f3146103c157806323b872dd146103e057806328e964e9146103f35780632bbbdc8914610435578063313ce567146104485780633745599014610450578063395093511461047e5780633a608032146104915780633e6326fc1461049a578063408cfe24146104ad5780634162169f146104c057806343d93ca0146104d357806346b30ff5146104e65780634a291b01146104ee578063552bada2146104f757806355b8bb251461050a578063561b24631461051d578063574c5c93146105305780635836af9b146105435780635a6d735c146105565780635abea7dc146105695780635aef7de61461057c57806370a082311461058f57806379c65068146105b85780638955e46f146105cb578063899e1b6c146105f757806389eb64261461062257806395d89b41146106355780639c81ff6b1461063d578063a457c2d714610646578063a82415ae14610659578063a87430ba1461066c578063a9059cbb14610704578063a9f8d18114610717578063ad1e5d7514610720578063b0ce7abb14610733578063b0f479a114610746578063b187bd261461074e578063b76e230e14610762578063bea2811514610779578063c7b8981c14610782578063dd62ed3e1461078a578063e1758bd81461079d578063e319828c146107a5578063e32f1726146107ae578063e660b53f146107c1578063ead8dbd4146107c9578063edb5b863146107dc578063f412a6af146107ef578063fc0c546a14610819575b600080fd5b6102cc6102c7366004614dfa565b61082c565b005b6102d6610852565b6040516102e39190614e17565b60405180910390f35b6102ff6102fa366004614e8a565b6108e4565b60405190151581526020016102e3565b61032261031d366004614eb6565b6108fe565b604080519586526020860194909452928401919091526060830152608082015260a0016102e3565b6102cc610358366004614eef565b610b4f565b60da54610370906001600160a01b031681565b6040516102e39190614f0c565b6102cc61038b36600461508c565b610d2b565b6103a361039e366004615178565b611013565b6040519081526020016102e3565b6035546103a3565b6102cc61114a565b60a1546103ce9060ff1681565b60405160ff90911681526020016102e3565b6102ff6103ee366004615191565b611271565b610420610401366004614eef565b6001600160a01b0316600090815260a26020526040902054609a549091565b604080519283526020830191909152016102e3565b6102cc6104433660046151e4565b611295565b6103ce6112dc565b61046361045e366004614eef565b61134f565b604080519384526020840192909252908201526060016102e3565b6102ff61048c366004614e8a565b611454565b6103a3609c5481565b606754610370906001600160a01b031681565b60d654610370906001600160a01b031681565b606554610370906001600160a01b031681565b6102cc6104e1366004615212565b611476565b6102cc6114a2565b6103a3609b5481565b6102cc610505366004614e8a565b6115cd565b6102cc610518366004615178565b6116e6565b6102cc61052b366004615237565b6116f6565b6103a361053e366004615270565b611ccb565b60d854610370906001600160a01b031681565b6103a3610564366004615178565b611d59565b60db54610370906001600160a01b031681565b606654610370906001600160a01b031681565b6103a361059d366004614eef565b6001600160a01b031660009081526033602052604090205490565b6102cc6105c6366004614e8a565b611e8c565b60d8546105e290600160c01b900463ffffffff1681565b60405163ffffffff90911681526020016102e3565b609f5461060a906001600160401b031681565b6040516001600160401b0390911681526020016102e3565b60d754610370906001600160a01b031681565b6102d6611e96565b6103a3609e5481565b6102ff610654366004614e8a565b611ea5565b6103a3610667366004615270565b611f20565b6106c361067a366004614eef565b60a26020526000908152604090208054600182015460028301546003840154600485015460059095015493949293919290916001600160401b0380821691600160401b90041687565b60408051978852602088019690965294860193909352606085019190915260808401526001600160401b0390811660a08401521660c082015260e0016102e3565b6102ff610712366004614e8a565b612149565b6103a360a05481565b6103a361072e3660046152ab565b612157565b610370610741366004615178565b6121d8565b610370612202565b60d6546102ff90600160a01b900460ff1681565b60d8546105e290600160a01b900463ffffffff1681565b6103a3609a5481565b6102cc612272565b6103a36107983660046152e0565b6123c4565b6103706123ef565b6103a3609d5481565b6102cc6107bc36600461530e565b61243b565b6105e2612728565b6102cc6107d73660046153bc565b6127de565b6104206107ea366004614eef565b612def565b60d65461080590600160a81b900462ffffff1681565b60405162ffffff90911681526020016102e3565b60d554610370906001600160a01b031681565b610834612f4f565b60d68054911515600160a01b0260ff60a01b19909216919091179055565b606060368054610861906153e1565b80601f016020809104026020016040519081016040528092919081815260200182805461088d906153e1565b80156108da5780601f106108af576101008083540402835291602001916108da565b820191906000526020600020905b8154815290600101906020018083116108bd57829003601f168201915b5050505050905090565b6000336108f2818585613012565b60019150505b92915050565b60d6546040516370a0823160e01b8152600091829182918291829161097e916001600160a01b03909116906370a082319061093d903090600401614f0c565b602060405180830381865afa15801561095a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610564919061541b565b92508661098c576000610a0e565b60d75460d5546040805163313ce56760e01b81529051610a0e936001600160a01b0390811693889391169163313ce567916004808201926020929091908290030181865afa1580156109e2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a069190615434565b60ff16612157565b9150600086610a1e576000610a9f565b60d85460da546040516370a0823160e01b8152610a9f926001600160a01b039081169216906370a0823190610a57903090600401614f0c565b602060405180830381865afa158015610a74573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a98919061541b565b6012612157565b9050609a548411610ab857600095508594509050610b45565b609a54610ac5908561546d565b945086610ad3576000610b36565b60d75460d5546040805163313ce56760e01b815290518493610b2c936001600160a01b03918216938b93919092169163313ce5679160048083019260209291908290030181865afa1580156109e2573d6000803e3d6000fd5b610b369190615480565b9150610b4185611013565b9550505b9295509295909350565b610b57612f4f565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610b86903090600401614f0c565b602060405180830381865afa158015610ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bc7919061541b565b60d6549091506001600160a01b0390811690831603610c6a57609a54158015610bf9575060d654600160a01b900460ff165b610c6a5760405162461bcd60e51b815260206004820152603760248201527f63616e207265636f7665722069546f6b656e206f6e6c79207768656e2073746160448201527635b2b9903430bb32903132b2b7103bb4ba34323930bbb760491b60648201526084015b60405180910390fd5b60665460405163a9059cbb60e01b81526001600160a01b038481169263a9059cbb92610c9e92909116908590600401615493565b6020604051808303816000875af1158015610cbd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce191906154ac565b610d275760405162461bcd60e51b81526020600482015260176024820152761c9958dbdd995c881d1c985b9cd9995c8819985a5b1959604a1b6044820152606401610c61565b5050565b610d3989898989898961243b565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac190610d68906004016154c9565b602060405180830381865afa158015610d85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da991906154e6565b9050806001600160a01b03168a6001600160a01b03161480610e385750896001600160a01b031682600081518110610de357610de3615503565b60200260200101516001600160a01b0316148015610e385750806001600160a01b03168260018451610e15919061546d565b81518110610e2557610e25615503565b60200260200101516001600160a01b0316145b610e735760405162461bcd60e51b815260206004820152600c60248201526b0d2dcecc2d8d2c840e0c2e8d60a31b6044820152606401610c61565b60d880546001600160a01b038086166001600160a01b03199283161790925560d78054928716929091169190911790558151610eb69060d9906020850190614d72565b5060675460405163bf40fac160e01b81526001600160a01b039091169063bf40fac190610efe906004016020808252600490820152630434f4d560e41b604082015260600190565b602060405180830381865afa158015610f1b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f3f91906154e6565b60da80546001600160a01b0319166001600160a01b0392831617905560675460405163bf40fac160e01b815291169063bf40fac190610f8090600401615519565b602060405180830381865afa158015610f9d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fc191906154e6565b60db80546001600160a01b0319166001600160a01b039290921691909117905560d88054600160a01b600160e01b03191665249f00003d0960a41b179055611007613136565b50505050505050505050565b60008060d660009054906101000a90046001600160a01b03166001600160a01b031663182df0f56040518163ffffffff1660e01b8152600401602060405180830381865afa158015611069573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108d919061541b565b905060008061109a6132a8565b9150915060006110a86132f1565b6110b061336b565b6110bb906012615480565b6110c5919061546d565b905060018215151461110b57836110dd82600a615625565b6110e885600a615625565b6110f29089615631565b6110fc9190615631565b6111069190615648565b611140565b8361111782600a615625565b61112285600a615625565b61112c9089615648565b6111369190615631565b6111409190615648565b9695505050505050565b60675460405163bf40fac160e01b815260206004820152600a60248201526921a7a72a2927a62622a960b11b60448201526001600160a01b039091169063bf40fac190606401602060405180830381865afa1580156111ad573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111d191906154e6565b606580546001600160a01b0319166001600160a01b0392909216918217905560408051632d77bef360e11b81529051635aef7de6916004808201926020929091908290030181865afa15801561122b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061124f91906154e6565b606680546001600160a01b0319166001600160a01b0392909216919091179055565b60003361127f8582856133b8565b61128a85858561342c565b506001949350505050565b61129d612f4f565b60d88054600160a01b600160e01b031916600160a01b63ffffffff9485160263ffffffff60c01b191617600160c01b9290931691909102919091179055565b60d5546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015611326573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061134a9190615434565b905090565b600080600061135c6136b9565b306001600160a01b038516036113c55760405162461bcd60e51b815260206004820152602860248201527f526563697069656e742063616e6e6f7420626520746865207374616b696e672060448201526718dbdb9d1c9858dd60c21b6064820152608401610c61565b6000806113d36000806108fe565b505050915091506113e48287613796565b604080516001600160a01b038b16815260208101879052908101859052606081018490526080810183905260a0810182905292975090955093507f38c2c21f82a20481909d7aef48247b0743f69728fbb599c274039e2eecf8bb179060c00160405180910390a150509193909250565b6000336108f281858561146783836123c4565b6114719190615480565b613012565b61147e612f4f565b60d6805462ffffff909216600160a81b0262ffffff60a81b19909216919091179055565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac1906114d19060040161566a565b602060405180830381865afa1580156114ee573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061151291906154e6565b90506001600160a01b038116156115ca5760408051600180825281830190925260009160208083019080368337019050509050308160008151811061155957611559615503565b6001600160a01b03928316602091820292909201015260405163455518ef60e11b815290831690638aaa31de9061159690339085906004016156d4565b600060405180830381600087803b1580156115b057600080fd5b505af11580156115c4573d6000803e3d6000fd5b50505050505b50565b60675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac1906115fc90600401615700565b602060405180830381865afa158015611619573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061163d91906154e6565b90506000806000836001600160a01b031663d0250144306040518263ffffffff1660e01b81526004016116709190614f0c565b608060405180830381865afa15801561168d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116b19190615726565b509250925092506116dd86868563ffffffff16856001600160401b0316856001600160401b0316613e79565b50505050505050565b6116f08130613796565b50505050565b6116fe613ed4565b60d654600160a01b900460ff161561174c5760405162461bcd60e51b815260206004820152601160248201527014dd185ada5b99c81a5cc81c185d5cd959607a1b6044820152606401610c61565b8115806117595750816064145b6117b45760405162461bcd60e51b815260206004820152602660248201527f446f6e6174696f6e2070657263656e746167652073686f756c6420626520302060448201526506f72203130360d41b6064820152608401610c61565b600083116118165760405162461bcd60e51b815260206004820152602960248201527f596f75206e65656420746f207374616b65206120706f73697469766520746f6b604482015268195b88185b5bdd5b9d60ba1b6064820152608401610c61565b8061182c5760d5546001600160a01b0316611839565b60d6546001600160a01b03165b6001600160a01b03166323b872dd336040516001600160e01b031960e084901b1681526001600160a01b039091166004820152306024820152604481018690526064016020604051808303816000875af115801561189b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118bf91906154ac565b61192e5760405162461bcd60e51b815260206004820152603a60248201527f7472616e7366657246726f6d206661696c65642c206d616b652073757265207960448201527937ba9030b8383937bb32b2103a37b5b2b7103a3930b739b332b960311b6064820152608401610c61565b806119395782611942565b61194283611d59565b92508015156000036119575761195783613f2d565b6119613384613ff7565b60675460405163bf40fac160e01b8152600091829182916001600160a01b03169063bf40fac19061199490600401615700565b602060405180830381865afa1580156119b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119d591906154e6565b6001600160a01b031663d0250144306040518263ffffffff1660e01b8152600401611a009190614f0c565b608060405180830381865afa158015611a1d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a419190615726565b50925092509250611a74611a523390565b878563ffffffff16856001600160401b0316856001600160401b03168a6140a6565b5060675460405163bf40fac160e01b81526000916001600160a01b03169063bf40fac190611aa49060040161566a565b602060405180830381865afa158015611ac1573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061