@le7el/rewards_engine
Version:
Smart contracts that distribute reward tokens according to conditional oracle or a merkle root
716 lines • 78.6 kB
JSON
{
"_format": "hh-sol-artifact-1",
"contractName": "VirtualDistributor",
"sourceName": "contracts/VirtualDistributor.sol",
"abi": [
{
"inputs": [
{
"internalType": "uint256",
"name": "_rewardPerBlock",
"type": "uint256"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Dropin",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "Harvest",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": false,
"internalType": "uint256",
"name": "allocPoint",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint128",
"name": "rewardMultiplier",
"type": "uint128"
},
{
"indexed": true,
"internalType": "address",
"name": "rewarder",
"type": "address"
}
],
"name": "LogPoolAddition",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": false,
"internalType": "uint120",
"name": "allocPoint",
"type": "uint120"
},
{
"indexed": true,
"internalType": "address",
"name": "rewarder",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "overwrite",
"type": "bool"
}
],
"name": "LogPoolAllocPoint",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "multiplier",
"type": "uint256"
}
],
"name": "LogPoolMultiplier",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "nftContract",
"type": "address"
},
{
"indexed": true,
"internalType": "uint128",
"name": "lastRewardBlock",
"type": "uint128"
},
{
"indexed": false,
"internalType": "uint256",
"name": "lpSupply",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "accRewardPerShare",
"type": "uint256"
}
],
"name": "LogUpdatePool",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "uint256",
"name": "amount",
"type": "uint256"
}
],
"name": "NewRewardPerBlock",
"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": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Paused",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "newPeriod",
"type": "uint256"
}
],
"name": "UnlockPeriodChanged",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "Unpaused",
"type": "event"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint120",
"name": "_allocPoint",
"type": "uint120"
},
{
"internalType": "uint128",
"name": "_rewardMultiplier",
"type": "uint128"
},
{
"internalType": "address",
"name": "_rewarder",
"type": "address"
}
],
"name": "adminAddPool",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint64",
"name": "_newRewardsMultiplier",
"type": "uint64"
}
],
"name": "adminChangePoolMultiplier",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_newPeriod",
"type": "uint256"
}
],
"name": "adminChangeUnlockPeriod",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint120",
"name": "_allocPoint",
"type": "uint120"
},
{
"internalType": "address",
"name": "_rewarder",
"type": "address"
},
{
"internalType": "bool",
"name": "_overwrite",
"type": "bool"
}
],
"name": "adminSetAllocPoint",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_state",
"type": "bool"
}
],
"name": "adminSetPaused",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "_newBlockReward",
"type": "uint256"
}
],
"name": "adminUpdateBlockReward",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "harvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "isRewardSafelyLocked",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "join",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "lockHarvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address[]",
"name": "_pools",
"type": "address[]"
}
],
"name": "massUpdatePools",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"name": "nftInfo",
"outputs": [
{
"internalType": "int256",
"name": "rewardDebt",
"type": "int256"
},
{
"internalType": "uint256",
"name": "virtualAmount",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "lockedUntil",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "paused",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "pendingRewards",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "poolInfo",
"outputs": [
{
"internalType": "contract ICRS",
"name": "crs",
"type": "address"
},
{
"internalType": "bytes32",
"name": "project",
"type": "bytes32"
},
{
"internalType": "address",
"name": "rewarder",
"type": "address"
},
{
"internalType": "uint256",
"name": "virtualTotalSupply",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "accRewardPerShare",
"type": "uint256"
},
{
"internalType": "uint128",
"name": "lastRewardBlock",
"type": "uint128"
},
{
"internalType": "uint120",
"name": "allocPoint",
"type": "uint120"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "rewardMultipliers",
"outputs": [
{
"internalType": "uint128",
"name": "",
"type": "uint128"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "rewardPerBlock",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalAllocPoint",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
},
{
"internalType": "uint256",
"name": "_tokenId",
"type": "uint256"
}
],
"name": "unlockHarvest",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "unlockPeriod",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_nftContract",
"type": "address"
}
],
"name": "updatePool",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
}
],
"bytecode": "0x6080604052670de0b6b3a7640000600455620151806005553480156200002457600080fd5b5060405162003eec38038062003eec83398181016040528101906200004a919062000211565b600160008190555062000072620000666200010360201b60201c565b6200010b60201b60201c565b6000600160146101000a81548160ff02191690831515021790555080600481905550807f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df60405160405180910390a27fef17b49db9e4abe0b6cc529ae4d99ba7c0e8d919233290c7dac7f018076f8890600554604051620000f4919062000254565b60405180910390a15062000271565b600033905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080fd5b6000819050919050565b620001eb81620001d6565b8114620001f757600080fd5b50565b6000815190506200020b81620001e0565b92915050565b6000602082840312156200022a5762000229620001d1565b5b60006200023a84828501620001fa565b91505092915050565b6200024e81620001d6565b82525050565b60006020820190506200026b600083018462000243565b92915050565b613c6b80620002816000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c35780639aa712441161007c5780639aa71244146103a5578063a0c4968a146103d5578063d2a7cdda146103f1578063dc0afeda1461040d578063f2fde38b14610429578063f65d8da51461044557610158565b8063715018a6146102f157806372dcfab8146102fb5780637b46c54f146103175780638ae39cac146103335780638da5cb5b146103515780639a7b5f111461036f57610158565b806339eaed291161011557806339eaed291461021f5780633b4da69f1461023b5780635b16759e146102575780635c975abb146102875780635fa45883146102a55780636099ecb2146102c157610158565b8063018ee9b71461015d578063043fb1b0146101795780630463aed11461019557806317caf6f1146101b15780631d62fa05146101cf57806320d3a0b414610201575b600080fd5b610177600480360381019061017291906126fa565b610461565b005b610193600480360381019061018e91906127b9565b610490565b005b6101af60048036038101906101aa9190612820565b6107c0565b005b6101b96107e7565b6040516101c6919061285c565b60405180910390f35b6101e960048036038101906101e491906126fa565b6107ed565b6040516101f893929190612890565b60405180910390f35b610209610824565b604051610216919061285c565b60405180910390f35b6102396004803603810190610234919061292c565b61082a565b005b610255600480360381019061025091906126fa565b610884565b005b610271600480360381019061026c91906126fa565b610d0d565b60405161027e9190612988565b60405180910390f35b61028f610d6d565b60405161029c9190612988565b60405180910390f35b6102bf60048036038101906102ba91906129a3565b610d84565b005b6102db60048036038101906102d691906126fa565b610e11565b6040516102e8919061285c565b60405180910390f35b6102f9610ff3565b005b610315600480360381019061031091906126fa565b611007565b005b610331600480360381019061032c91906129d0565b61114b565b005b61033b61137f565b604051610348919061285c565b60405180910390f35b610359611385565b6040516103669190612a0c565b60405180910390f35b610389600480360381019061038491906129d0565b6113af565b60405161039c9796959493929190612ad9565b60405180910390f35b6103bf60048036038101906103ba91906129d0565b611468565b6040516103cc9190612b48565b60405180910390f35b6103ef60048036038101906103ea91906129a3565b611497565b005b61040b60048036038101906104069190612ba3565b6114d6565b005b61042760048036038101906104229190612c0f565b6115b0565b005b610443600480360381019061043e91906129d0565b611a47565b005b61045f600480360381019061045a91906126fa565b611aca565b005b610469611ceb565b610471611d3a565b61047a8261114b565b6104848282611d84565b61048c6121a3565b5050565b6104986121ad565b6104a18461114b565b826effffffffffffffffffffffffffffff16600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160109054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1660075461052f9190612ca5565b6105399190612cd9565b600781905550600060075411610584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161057b90612d90565b60405180910390fd5b82600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060050160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff16021790555080156106ef5781600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f962215e9cb4312569f8aab6098acc43c4f666093a58c153ec54078cf2f86e8d48560016040516106e2929190612db0565b60405180910390a36107ba565b600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f962215e9cb4312569f8aab6098acc43c4f666093a58c153ec54078cf2f86e8d48560006040516107b1929190612db0565b60405180910390a35b50505050565b6107c86121ad565b80156107db576107d661222b565b6107e4565b6107e361228d565b5b50565b60075481565b6006602052816000526040600020602052806000526040600020600091509150508060000154908060010154908060020154905083565b60055481565b600082829050905060005b8181101561087e5761086d84848381811061085357610852612dd9565b5b905060200201602081019061086891906129d0565b61114b565b8061087790612e08565b9050610835565b50505050565b61088c611ceb565b610894611d3a565b61089d8261114b565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a90046fffffffffffffffffffffffffffffffff169050612710816fffffffffffffffffffffffffffffffff161015610954576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094b90612e9c565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16636352211e846040518263ffffffff1660e01b81526004016109a4919061285c565b602060405180830381865afa1580156109c1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e59190612ed1565b73ffffffffffffffffffffffffffffffffffffffff1614610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290612f4a565b60405180910390fd5b6000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600085815260200190815260200160002090506000610b078360000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168460010154876122f0565b90506000826001015490506000610b1e8888610e11565b90506000612710876fffffffffffffffffffffffffffffffff1685610b439190612f6a565b610b4d9190612fdb565b9050808560010181905550610b908269152d02c7e14af6800000886004015484610b779190612f6a565b610b819190612fdb565b610b8b9190612ca5565b61242c565b856000018190555080838760030154610ba99190612ca5565b610bb39190612cd9565b866003018190555060008660020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c93578073ffffffffffffffffffffffffffffffffffffffff1663dac17e508b8b333360008c600101546040518763ffffffff1660e01b8152600401610c6096959493929190613047565b600060405180830381600087803b158015610c7a57600080fd5b505af1158015610c8e573d6000803e3d6000fd5b505050505b888a73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f50468db8a28500d77de4aac34e31c59b5a1a8973badc2e4d4aaae1954777864e88604051610cf1919061285c565b60405180910390a45050505050505050610d096121a3565b5050565b600080600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000206002015414905092915050565b6000600160149054906101000a900460ff16905090565b610d8c6121ad565b610e108111610dd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc7906130f4565b60405180910390fd5b806005819055507fef17b49db9e4abe0b6cc529ae4d99ba7c0e8d919233290c7dac7f018076f889081604051610e06919061285c565b60405180910390a150565b600080600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000858152602001908152602001600020905060008260040154905060008360050160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1690506000846003015490508143118015610f02575060008114155b15610fa25760008243610f159190612ca5565b905060006007548760050160109054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff1660045484610f5b9190612f6a565b610f659190612f6a565b610f6f9190612fdb565b90508269152d02c7e14af680000082610f889190612f6a565b610f929190612fdb565b85610f9d9190612cd9565b945050505b610fe68460000154610fd769152d02c7e14af6800000868860010154610fc89190612f6a565b610fd29190612fdb565b61242c565b610fe19190613114565b612499565b9550505050505092915050565b610ffb6121ad565b61100560006124e6565b565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611057919061285c565b602060405180830381865afa158015611074573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110989190612ed1565b73ffffffffffffffffffffffffffffffffffffffff16146110ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e5906131a3565b60405180910390fd5b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060008160050160009054906101000a90046fffffffffffffffffffffffffffffffff169050806fffffffffffffffffffffffffffffffff1643111561137a57600082600401549050600083600301549050600060075490506000821180156111f7575060008114155b156112b0576000846fffffffffffffffffffffffffffffffff164361121c9190612ca5565b90506000828760050160109054906101000a90046effffffffffffffffffffffffffffff166effffffffffffffffffffffffffffff16600454846112609190612f6a565b61126a9190612f6a565b6112749190612fdb565b90508369152d02c7e14af68000008261128d9190612f6a565b6112979190612fdb565b856112a29190612cd9565b945084876004018190555050505b6112b9436125ac565b8560050160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508460050160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f3f940c9a8eb3c70f60bdf950fa106fd59019a197f5d2f1cf4decb0d55d846d70848660405161136e9291906131c3565b60405180910390a35050505b505050565b60045481565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60036020528060005260406000206000915090508060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060010154908060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16908060030154908060040154908060050160009054906101000a90046fffffffffffffffffffffffffffffffff16908060050160109054906101000a90046effffffffffffffffffffffffffffff16905087565b60026020528060005260406000206000915054906101000a90046fffffffffffffffffffffffffffffffff1681565b61149f6121ad565b80600481905550807f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df60405160405180910390a250565b6114de6121ad565b8067ffffffffffffffff16600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055508067ffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fe316434a55b474a7eeb4c6391ab4f10718f9fb0ce52cf10b40c70b24eac3c7b160405160405180910390a35050565b6115b86121ad565b6000836effffffffffffffffffffffffffffff161161160c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116039061325e565b60405180910390fd5b6000611617436125ac565b9050836effffffffffffffffffffffffffffff166007600082825461163c9190612cd9565b9250508190555082600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550826fffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fe316434a55b474a7eeb4c6391ab4f10718f9fb0ce52cf10b40c70b24eac3c7b160405160405180910390a36040518060e001604052808673ffffffffffffffffffffffffffffffffffffffff16638a5913696040518163ffffffff1660e01b8152600401602060405180830381865afa158015611765573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061178991906132bc565b73ffffffffffffffffffffffffffffffffffffffff1681526020018673ffffffffffffffffffffffffffffffffffffffff1663ddf7fcb06040518163ffffffff1660e01b8152600401602060405180830381865afa1580156117ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118139190613315565b81526020018373ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001826fffffffffffffffffffffffffffffffff168152602001856effffffffffffffffffffffffffffff16815250600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506020820151816001015560408201518160020160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550606082015181600301556080820151816004015560a08201518160050160006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555060c08201518160050160106101000a8154816effffffffffffffffffffffffffffff02191690836effffffffffffffffffffffffffffff1602179055509050508173ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f95474620f6c1bc2084ea3637f7273c649967b13a1f9f8b65474c59f466aece298686604051611a38929190613373565b60405180910390a35050505050565b611a4f6121ad565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611abe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab59061340e565b60405180910390fd5b611ac7816124e6565b50565b600073ffffffffffffffffffffffffffffffffffffffff16600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b929061347a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401611beb919061285c565b602060405180830381865afa158015611c08573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c2c9190612ed1565b73ffffffffffffffffffffffffffffffffffffffff1614611c82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c79906134e6565b60405180910390fd5b60055442611c909190612cd9565b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000838152602001908152602001600020600201819055505050565b600260005403611d30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2790613552565b60405180910390fd5b6002600081905550565b611d42610d6d565b15611d82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d79906135be565b60405180910390fd5b565b6000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506000600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168260020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611eae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ea59061347a565b60405180910390fd5b600081600201549050600081118015611ec657504281105b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc9061362a565b60405180910390fd5b6000611f3869152d02c7e14af680000085600401548560010154611f299190612f6a565b611f339190612fdb565b61242c565b905060008112158015611f5b57506000836000015482611f589190613114565b12155b611f6857611f6761364a565b5b6000611f82846000015483611f7d9190613114565b612499565b90506000611f8f8261242c565b1215611f9e57611f9d61364a565b5b81846000018190555060008773ffffffffffffffffffffffffffffffffffffffff16636352211e886040518263ffffffff1660e01b8152600401611fe2919061285c565b602060405180830381865afa158015611fff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120239190612ed1565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603612094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208b906136c5565b60405180910390fd5b8560020160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663dac17e5089893385878b600101546040518763ffffffff1660e01b81526004016120ff969594939291906136e5565b600060405180830381600087803b15801561211957600080fd5b505af115801561212d573d6000803e3d6000fd5b50505050868873ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f30e699aa1c506dd4f383dedc299e5b85974c4913152ca23f566de9847e351cd13386604051612191929190613746565b60405180910390a45050505050505050565b6001600081905550565b6121b561260b565b73ffffffffffffffffffffffffffffffffffffffff166121d3611385565b73ffffffffffffffffffffffffffffffffffffffff1614612229576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612220906137bb565b60405180910390fd5b565b612233611d3a565b60018060146101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861227661260b565b6040516122839190612a0c565b60405180910390a1565b612295612613565b6000600160146101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6122d961260b565b6040516122e69190612a0c565b60405180910390a1565b600080838360001b6040516020016123099291906137fc565b60405160208183030381529060405280519060200120905060028573ffffffffffffffffffffffffffffffffffffffff16630178b8bf866040518263ffffffff1660e01b815260040161235c9190613828565b602060405180830381865afa158015612379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061239d9190612ed1565b73ffffffffffffffffffffffffffffffffffffffff1663b198241386846040518363ffffffff1660e01b81526004016123d7929190613843565b602060405180830381865afa1580156123f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124189190613881565b61242291906139ee565b9150509392505050565b60007f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821115612491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248890613aab565b60405180910390fd5b819050919050565b6000808212156124de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124d590613b17565b60405180910390fd5b819050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006fffffffffffffffffffffffffffffffff8016821115612603576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125fa90613ba9565b60405180910390fd5b819050919050565b600033905090565b61261b610d6d565b61265a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161265190613c15565b60405180910390fd5b565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061269182612666565b9050919050565b6126a181612686565b81146126ac57600080fd5b50565b6000813590506126be81612698565b92915050565b6000819050919050565b6126d7816126c4565b81146126e257600080fd5b50565b6000813590506126f4816126ce565b92915050565b600080604083850312156127115761271061265c565b5b600061271f858286016126af565b9250506020612730858286016126e5565b9150509250929050565b60006effffffffffffffffffffffffffffff82169050919050565b61275e8161273a565b811461276957600080fd5b50565b60008135905061277b81612755565b92915050565b60008115159050919050565b61279681612781565b81146127a157600080fd5b50565b6000813590506127b38161278d565b92915050565b600080600080608085870312156127d3576127d261265c565b5b60006127e1878288016126af565b94505060206127f28782880161276c565b9350506040612803878288016126af565b9250506060612814878288016127a4565b91505092959194509250565b6000602082840312156128365761283561265c565b5b6000612844848285016127a4565b91505092915050565b612856816126c4565b82525050565b6000602082019050612871600083018461284d565b92915050565b6000819050919050565b61288a81612877565b82525050565b60006060820190506128a56000830186612881565b6128b2602083018561284d565b6128bf604083018461284d565b949350505050565b600080fd5b600080fd5b600080fd5b60008083601f8401126128ec576128eb6128c7565b5b8235905067ffffffffffffffff811115612909576129086128cc565b5b602083019150836020820283011115612925576129246128d1565b5b9250929050565b600080602083850312156129435761294261265c565b5b600083013567ffffffffffffffff81111561296157612960612661565b5b61296d858286016128d6565b92509250509250929050565b61298281612781565b82525050565b600060208201905061299d6000830184612979565b92915050565b6000602082840312156129b9576129b861265c565b5b60006129c7848285016126e5565b91505092915050565b6000602082840312156129e6576129e561265c565b5b60006129f4848285016126af565b91505092915050565b612a0681612686565b82525050565b6000602082019050612a2160008301846129fd565b92915050565b6000819050919050565b6000612a4c612a47612a4284612666565b612a27565b612666565b9050919050565b6000612a5e82612a31565b9050919050565b6000612a7082612a53565b9050919050565b612a8081612a65565b82525050565b6000819050919050565b612a9981612a86565b82525050565b60006fffffffffffffffffffffffffffffffff82169050919050565b612ac481612a9f565b82525050565b612ad38161273a565b82525050565b600060e082019050612aee600083018a612a77565b612afb6020830189612a90565b612b0860408301886129fd565b612b15606083018761284d565b612b22608083018661284d565b612b2f60a0830185612abb565b612b3c60c0830184612aca565b98975050505050505050565b6000602082019050612b5d6000830184612abb565b92915050565b600067ffffffffffffffff82169050919050565b612b8081612b63565b8114612b8b57600080fd5b50565b600081359050612b9d81612b77565b92915050565b60008060408385031215612bba57612bb961265c565b5b6000612bc8858286016126af565b9250506020612bd985828601612b8e565b9150509250929050565b612bec81612a9f565b8114612bf757600080fd5b50565b600081359050612c0981612be3565b92915050565b60008060008060808587031215612c2957612c2861265c565b5b6000612c37878288016126af565b9450506020612c488782880161276c565b9350506040612c5987828801612bfa565b9250506060612c6a878288016126af565b91505092959194509250565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612cb0826126c4565b9150612cbb836126c4565b9250828203905081811115612cd357612cd2612c76565b5b92915050565b6000612ce4826126c4565b9150612cef836126c4565b9250828201905080821115612d0757612d06612c76565b5b92915050565b600082825260208201905092915050565b7f746f74616c20616c6c6f636174696f6e20706f696e74732063616e6e6f74206260008201527f6520300000000000000000000000000000000000000000000000000000000000602082015250565b6000612d7a602383612d0d565b9150612d8582612d1e565b604082019050919050565b60006020820190508181036000830152612da981612d6d565b9050919050565b6000604082019050612dc56000830185612aca565b612dd26020830184612979565b9392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000612e13826126c4565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612e4557612e44612c76565b5b600182019050919050565b7f696e76616c6964206d756c7469706c6965720000000000000000000000000000600082015250565b6000612e86601283612d0d565b9150612e9182612e50565b602082019050919050565b60006020820190508181036000830152612eb581612e79565b9050919050565b600081519050612ecb81612698565b92915050565b600060208284031215612ee757612ee661265c565b5b6000612ef584828501612ebc565b91505092915050565b7f6e6f7420616e204e4654206f776e657200000000000000000000000000000000600082015250565b6000612f34601083612d0d565b9150612f3f82612efe565b602082019050919050565b60006020820190508181036000830152612f6381612f27565b9050919050565b6000612f75826126c4565b9150612f80836126c4565b9250828202612f8e816126c4565b91508282048414831517612fa557612fa4612c76565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612fe6826126c4565b9150612ff1836126c4565b92508261300157613000612fac565b5b828204905092915050565b6000819050919050565b600061303161302c6130278461300c565b612a27565b6126c4565b9050919050565b61304181613016565b82525050565b600060c08201905061305c60008301896129fd565b613069602083018861284d565b61307660408301876129fd565b61308360608301866129fd565b6130906080830185613038565b61309d60a083018461284d565b979650505050505050565b7f6174206c65617374203120686f75720000000000000000000000000000000000600082015250565b60006130de600f83612d0d565b91506130e9826130a8565b602082019050919050565b6000602082019050818103600083015261310d816130d1565b9050919050565b600061311f82612877565b915061312a83612877565b925082820390508181126000841216828213600085121516171561315157613150612c76565b5b92915050565b7f6f6e6c79204e4654206f776e65722063616e206c6f636b000000000000000000600082015250565b600061318d601783612d0d565b915061319882613157565b602082019050919050565b600060208201905081810360008301526131bc81613180565b9050919050565b60006040820190506131d8600083018561284d565b6131e5602083018461284d565b9392505050565b7f706f6f6c206d757374206861766520616c6c6f636174696f6e20706f696e747360008201527f20746f2062652063726561746564000000000000000000000000000000000000602082015250565b6000613248602e83612d0d565b9150613253826131ec565b604082019050919050565b600060208201905081810360008301526132778161323b565b9050919050565b600061328982612686565b9050919050565b6132998161327e565b81146132a457600080fd5b50565b6000815190506132b681613290565b92915050565b6000602082840312156132d2576132d161265c565b5b60006132e0848285016132a7565b91505092915050565b6132f281612a86565b81146132fd57600080fd5b50565b60008151905061330f816132e9565b92915050565b60006020828403121561332b5761332a61265c565b5b600061333984828501613300565b91505092915050565b600061335d6133586133538461273a565b612a27565b6126c4565b9050919050565b61336d81613342565b82525050565b60006040820190506133886000830185613364565b6133956020830184612abb565b9392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006133f8602683612d0d565b91506134038261339c565b604082019050919050565b60006020820190508181036000830152613427816133eb565b9050919050565b7f6861727665737420636c6f736564000000000000000000000000000000000000600082015250565b6000613464600e83612d0d565b915061346f8261342e565b602082019050919050565b6000602082019050818103600083015261349381613457565b9050919050565b7f6f6e6c79204e4654206f776e65722063616e20756e6c6f636b00000000000000600082015250565b60006134d0601983612d0d565b91506134db8261349a565b602082019050919050565b600060208201905081810360008301526134ff816134c3565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061353c601f83612d0d565b915061354782613506565b602082019050919050565b6000602082019050818103600083015261356b8161352f565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b60006135a8601083612d0d565b91506135b382613572565b602082019050919050565b600060208201905081810360008301526135d78161359b565b9050919050565b7f68617276657374206c6f636b6564000000000000000000000000000000000000600082015250565b6000613614600e83612d0d565b915061361f826135de565b602082019050919050565b6000602082019050818103600083015261364381613607565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b7f696e76616c6964204e4654000000000000000000000000000000000000000000600082015250565b60006136af600b83612d0d565b91506136ba82613679565b602082019050919050565b600060208201905081810360008301526136de816136a2565b9050919050565b600060c0820190506136fa60008301896129fd565b613707602083018861284d565b61371460408301876129fd565b61372160608301866129fd565b61372e608083018561284d565b61373b60a083018461284d565b979650505050505050565b600060408201905061375b60008301856129fd565b613768602083018461284d565b9392505050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006137a5602083612d0d565b91506137b08261376f565b602082019050919050565b600060208201905081810360008301526137d481613798565b9050919050565b6000819050919050565b6137f66137f182612a86565b6137db565b82525050565b600061380882856137e5565b60208201915061381882846137e5565b6020820191508190509392505050565b600060208201905061383d6000830184612a90565b92915050565b60006040820190506138586000830185612a90565b6138656020830184612a90565b9392505050565b60008151905061387b816126ce565b92915050565b6000602082840312156138975761389661265c565b5b60006138a58482850161386c565b91505092915050565b60008160011c9050919050565b6000808291508390505b6001851115613905578086048111156138e1576138e0612c76565b5b60018516156138f05780820291505b80810290506138fe856138ae565b94506138c5565b94509492505050565b60008261391e57600190506139da565b8161392c57600090506139da565b8160018114613942576002811461394c5761397b565b60019150506139da565b60ff84111561395e5761395d612c76565b5b8360020a91508482111561397557613974612c76565b5b506139da565b5060208310610133831016604e8410600b84101617156139b05782820a9050838111156139ab576139aa612c76565b5b6139da565b6139bd84848460016138bb565b925090508184048111156139d4576139d3612c76565b5b81810290505b9392505050565b600060ff82169050919050565b60006139f9826126c4565b9150613a04836139e1565b9250613a317fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461390e565b905092915050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e206160008201527f6e20696e74323536000000000000000000000000000000000000000000000000602082015250565b6000613a95602883612d0d565b9150613aa082613a39565b604082019050919050565b60006020820190508181036000830152613ac481613a88565b9050919050565b7f53616665436173743a2076616c7565206d75737420626520706f736974697665600082015250565b6000613b01602083612d0d565b9150613b0c82613acb565b602082019050919050565b60006020820190508181036000830152613b3081613af4565b9050919050565b7f53616665436173743a2076616c756520646f65736e27742066697420696e203160008201527f3238206269747300000000000000000000000000000000000000000000000000602082015250565b6000613b93602783612d0d565b9150613b9e82613b37565b604082019050919050565b60006020820190508181036000830152613bc281613b86565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000613bff601483612d0d565b9150613c0a82613bc9565b602082019050919050565b60006020820190508181036000830152613c2e81613bf2565b905091905056fea2646970667358221220592c30ac6185e508a5e738e5619639a1d67451fb03b65921ee0088028bf80cb264736f6c63430008110033",
"deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063715018a6116100c35780639aa712441161007c5780639aa71244146103a5578063a0c4968a146103d5578063d2a7cdda146103f1578063dc0afeda1461040d578063f2fde38b14610429578063f65d8da51461044557610158565b8063715018a6146102f157806372dcfab8146102fb5780637b46c54f146103175780638ae39cac146103335780638da5cb5b146103515780639a7b5f111461036f57610158565b806339eaed291161011557806339eaed291461021f5780633b4da69f1461023b5780635b16759e146102575780635c975abb146102875780635fa45883146102a55780636099ecb2146102c157610158565b8063018ee9b71461015d578063043fb1b0146101795780630463aed11461019557806317caf6f1146101b15780631d62fa05146101cf57806320d3a0b414610201575b600080fd5b610177600480360381019061017291906126fa565b610461565b005b610193600480360381019061018e91906127b9565b610490565b005b6101af60048036038101906101aa9190612820565b6107c0565b005b6101b96107e7565b6040516101c6919061285c565b60405180910390f35b6101e960048036038101906101e491906126fa565b6107ed565b6040516101f893929190612890565b60405180910390f35b610209610824565b604051610216919061285c565b60405180910390f35b6102396004803603810190610234919061292c565b61082a565b005b610255600480360381019061025091906126fa565b610884565b005b610271600480360381019061026c91906126fa565b610d0d565b60405161027e9190612988565b60405180910390f35b61028f610d6d565b60405161029c9190612988565b60405180910390f35b6102bf60048036038101906102ba91906129a3565b610d84565b005b6102db60048036038101906102d691906126fa565b610e11565b6040516102e8919061285c565b60405180910390f35b6102f9610ff3565b005b610315600480360381019061031091906126fa565b611007565b005b610331600480360381019061032c91906129d0565b61114b565b005b61033b61137f565b604051610348919061285c565b60405180910390f35b610359611385565b6040516103669190612a0c565b60405180910390f35b610389600480360381019061038491906129d0565b6113af565b60405161039c9796959493929190612ad9565b60405180910390f35b6103bf60048036038101906103ba91906129d0565b611468565b6040516103cc9190612b48565b60405180910390f35b6103ef60048036038101906103ea91906129a3565b611497565b005b61040b60048036038101906104069190612ba3565b6114d6565b005b61042760048036038101906104229190612c0f565b6115b0565b005b610443600480360381019061043e91906129d0565b611a47565b005b61045f600480360381019061045a91906126fa565b611aca565b005b610469611ceb565b610471611d3a565b61047a8261114b565b6104848282611d84565b61048c6121a3565b5050565b6104986121ad565b6104a18461114b565b826effffffffffffff