diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..2a61605 --- /dev/null +++ b/.prettierignore @@ -0,0 +1 @@ +*.yaml \ No newline at end of file diff --git a/subgraphs/masterchefV2/abis/MultiTokenRewarder.json b/subgraphs/masterchefV2/abis/MultiTokenRewarder.json new file mode 100644 index 0000000..4857be2 --- /dev/null +++ b/subgraphs/masterchefV2/abis/MultiTokenRewarder.json @@ -0,0 +1,620 @@ +{ + "_format": "hh-sol-artifact-1", + "contractName": "TimeBasedMasterChefMultiTokenRewarder", + "sourceName": "contracts/rewarder/TimeBasedMasterChefMultiTokenRewarder.sol", + "abi": [ + { + "inputs": [ + { + "internalType": "address", + "name": "_masterChef", + "type": "address" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [], + "name": "LogInit", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract ERC20[]", + "name": "rewardTokens", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "accTokenPrecisions", + "type": "uint256[]" + } + ], + "name": "LogInitRewardTokens", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "user", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "contract ERC20", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + } + ], + "name": "LogOnReward", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + } + ], + "name": "LogPoolAddition", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "contract ERC20[]", + "name": "rewardTokens", + "type": "address[]" + }, + { + "indexed": false, + "internalType": "uint256[]", + "name": "rewardsPerSecond", + "type": "uint256[]" + } + ], + "name": "LogRewardsPerSecond", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "allocPoint", + "type": "uint256" + } + ], + "name": "LogSetPool", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "indexed": true, + "internalType": "contract ERC20", + "name": "rewardToken", + "type": "address" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lastRewardTime", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "lpSupply", + "type": "uint256" + }, + { + "indexed": false, + "internalType": "uint256", + "name": "accRewardTokenPerShare", + "type": "uint256" + } + ], + "name": "LogUpdatePool", + "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" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "allocationPoints", + "type": "uint256" + } + ], + "name": "add", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "allocationPointsPerPool", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardTokenConfigs", + "outputs": [ + { + "components": [ + { + "internalType": "contract ERC20", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rewardsPerSecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accTokenPrecision", + "type": "uint256" + } + ], + "internalType": "struct TimeBasedMasterChefMultiTokenRewarder.RewardTokenConfig[]", + "name": "configs", + "type": "tuple[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "getRewardTokens", + "outputs": [ + { + "internalType": "contract ERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ERC20[]", + "name": "tokens", + "type": "address[]" + } + ], + "name": "initializeRewardTokens", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "pids", + "type": "uint256[]" + } + ], + "name": "massUpdatePools", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "masterChef", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "masterchefPoolIds", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "address", + "name": "recipient", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "newLpAmount", + "type": "uint256" + } + ], + "name": "onBeetsReward", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "pendingTokens", + "outputs": [ + { + "internalType": "contract IERC20[]", + "name": "tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "rewardAmounts", + "type": "uint256[]" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "poolLength", + "outputs": [ + { + "internalType": "uint256", + "name": "pools", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "rewardTokenConfigs", + "outputs": [ + { + "internalType": "contract ERC20", + "name": "rewardToken", + "type": "address" + }, + { + "internalType": "uint256", + "name": "rewardsPerSecond", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "accTokenPrecision", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "allocationPoints", + "type": "uint256" + } + ], + "name": "set", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "contract ERC20[]", + "name": "_tokens", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "_rewardsPerSecond", + "type": "uint256[]" + } + ], + "name": "setRewardPerSecond", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "withdrawRemainingFundsTo", + "type": "address" + } + ], + "name": "shutDown", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "contract ERC20", + "name": "", + "type": "address" + } + ], + "name": "tokenRewardInfos", + "outputs": [ + { + "internalType": "uint256", + "name": "accRewardTokenPerShare", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastRewardTime", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "pid", + "type": "uint256" + } + ], + "name": "updatePool", + "outputs": [ + { + "components": [ + { + "internalType": "uint256", + "name": "accRewardTokenPerShare", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "lastRewardTime", + "type": "uint256" + } + ], + "internalType": "struct TimeBasedMasterChefMultiTokenRewarder.RewardInfo[]", + "name": "rewardInfos", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + }, + { + "internalType": "address", + "name": "", + "type": "address" + }, + { + "internalType": "contract ERC20", + "name": "", + "type": "address" + } + ], + "name": "userInfos", + "outputs": [ + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "rewardDebt", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "bytecode": "0x60a06040523480156200001157600080fd5b50604051620029b2380380620029b28339810160408190526200003491620000a5565b6200003f3362000055565b60601b6001600160601b031916608052620000d7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600060208284031215620000b857600080fd5b81516001600160a01b0381168114620000d057600080fd5b9392505050565b60805160601c612899620001196000396000818161023f015281816105c00152818161065101528181610caa015281816117bc015261185501526128996000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c806372f3ac8b116100b8578063b9fef63e1161007c578063b9fef63e146102f1578063c4f59f9b14610306578063cac332ab1461031b578063d63b3c491461032e578063dd585a6b1461034f578063f2fde38b1461038757600080fd5b806372f3ac8b14610294578063771602f7146102a75780638da5cb5b146102ba578063929bffc2146102cb578063aa6db928146102de57600080fd5b8063392e359b116100ff578063392e359b146101e257806351eb05a61461021a578063575a86b21461023a57806357a5b58c14610279578063715018a61461028c57600080fd5b8063081e3eda1461013c578063180e9f8f146101535780631ab06ee51461019a5780631aed4a69146101af5780631c671763146101cf575b600080fd5b6002545b6040519081526020015b60405180910390f35b6101856101613660046122c3565b60036020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161014a565b6101ad6101a83660046122f3565b61039a565b005b6101406101bd3660046121c5565b60046020526000908152604090205481565b6101406101dd3660046121c5565b6104da565b6101f56101f03660046121c5565b6104fb565b604080516001600160a01b03909416845260208401929092529082015260600161014a565b61022d6102283660046121c5565b610538565b60405161014a91906124bf565b6102617f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014a565b6101ad61028736600461207b565b6108c9565b6101ad61090d565b6101ad6102a236600461205e565b610943565b6101ad6102b53660046122f3565b610ab9565b6000546001600160a01b0316610261565b6101ad6102d93660046121f7565b610c9f565b6101ad6102ec36600461207b565b610fdc565b6102f96112d6565b60405161014a919061250e565b61030e611358565b60405161014a919061241e565b6101ad6103293660046120bd565b611421565b61034161033c36600461228b565b611613565b60405161014a92919061245f565b61018561035d366004612249565b60056020908152600093845260408085208252928452828420905282529020805460019091015482565b6101ad61039536600461205e565b611c09565b6000546001600160a01b031633146103cd5760405162461bcd60e51b81526004016103c490612596565b60405180910390fd5b60008281526003602052604081206001805491929182906103f0576103f0612822565b600091825260208083206003909202909101546001600160a01b0316835282019290925260400190206001015461045f5760405162461bcd60e51b8152602060048201526013602482015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016103c4565b600082815260046020526040902054600654829161047c9161278b565b6104869190612620565b600655600082815260046020526040908190208290555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c906104ce9084815260200190565b60405180910390a25050565b600281815481106104ea57600080fd5b600091825260209091200154905081565b6001818154811061050b57600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b60015460609067ffffffffffffffff81111561055657610556612838565b60405190808252806020026020018201604052801561059b57816020015b60408051808201909152600080825260208201528152602001906001900390816105745790505b506040516306ed78b760e21b8152600481018490529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631bb5e2dc9060240160206040518083038186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906121a8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291909116906370a082319060240160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d591906121de565b905060005b6001548110156108c2576000600182815481106106f9576106f9612822565b60009182526020808320888452600380835260408086209490910290910180546001600160a01b031685529282529283902083518085019094528054845260010154908301528551909250819086908590811061075857610758612822565b6020026020010181905250806020015160001415801561077b5750806020015142115b156108ad578315610800576000816020015142610798919061278b565b600654600089815260046020526040812054600187015493945090926107be908561276c565b6107c8919061276c565b6107d2919061265d565b9050858460020154826107e5919061276c565b6107ef919061265d565b83516107fb9190612620565b835250505b426020828101918252600088815260038252604080822086546001600160a01b03168352909252208251815590516001909101558451819086908590811061084a5761084a612822565b6020908102919091018101919091528254828201518351604080519283529382018890528184015291516001600160a01b039091169188917f06269c76d9be32952b871b9472362e7c66042aa3cbf2c64f0cbfb2b7d540ea739181900360600190a35b505080806108ba906127f1565b9150506106da565b5050919050565b8060005b81811015610907576108f68484838181106108ea576108ea612822565b90506020020135610538565b50610900816127f1565b90506108cd565b50505050565b6000546001600160a01b031633146109375760405162461bcd60e51b81526004016103c490612596565b6109416000611ca4565b565b6000546001600160a01b0316331461096d5760405162461bcd60e51b81526004016103c490612596565b6109c2610978611358565b60015467ffffffffffffffff81111561099357610993612838565b6040519080825280602002602001820160405280156109bc578160200160208202803683370190505b50611421565b60005b600154811015610ab557610aa382600183815481106109e6576109e6612822565b60009182526020909120600390910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906121de565b60018481548110610a8257610a82612822565b60009182526020909120600390910201546001600160a01b03169190611cf4565b80610aad816127f1565b9150506109c5565b5050565b6000546001600160a01b03163314610ae35760405162461bcd60e51b81526004016103c490612596565b6000828152600360205260408120600180549192918290610b0657610b06612822565b600091825260208083206003909202909101546001600160a01b0316835282019290925260400190206001015415610b765760405162461bcd60e51b8152602060048201526013602482015272506f6f6c20616c72656164792065786973747360681b60448201526064016103c4565b6006544290610b86908390612620565b60065560008381526004602052604081208390555b600154811015610c2f576040518060400160405280600081526020018381525060036000868152602001908152602001600020600060018481548110610be357610be3612822565b600091825260208083206003909202909101546001600160a01b031683528281019390935260409091019020825181559101516001919091015580610c27816127f1565b915050610b9b565b50600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0183905560405182815283907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c819060200160405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d275760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204d6173746572436865662063616e2063616c6c20746869732066756044820152663731ba34b7b71760c91b60648201526084016103c4565b6000610d3286610538565b905060005b8151811015610fd357600060018281548110610d5557610d55612822565b60009182526020822060039091020154600180546001600160a01b0390921693509084908110610d8757610d87612822565b60009182526020808320600260039093020191909101548b83526005825260408084206001600160a01b03808e16865290845281852090871685529092529082208054919350919015610f1657816001015483878781518110610dec57610dec612822565b6020026020010151600001518460000154610e07919061276c565b610e11919061265d565b610e1b919061278b565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a082319060240160206040518083038186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9591906121de565b811115610f16576040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610edb57600080fd5b505afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906121de565b90505b86825585518390879087908110610f2f57610f2f612822565b60200260200101516000015188610f46919061276c565b610f50919061265d565b60018301558015610f6f57610f6f6001600160a01b0385168a83611cf4565b604080516001600160a01b03868116825260208201849052808c16928e92918e16917f8689a2c06939a3efd443cf730fa992e3c6dca3aa215c5fa45dc50b69dd72a58c910160405180910390a4505050508080610fcb906127f1565b915050610d37565b50505050505050565b6000546001600160a01b031633146110065760405162461bcd60e51b81526004016103c490612596565b600154156110705760405162461bcd60e51b815260206004820152603160248201527f52657761726420746f6b656e20636f6e666967732063616e206f6e6c7920626560448201527020696e697469616c697a6564206f6e636560781b60648201526084016103c4565b60008167ffffffffffffffff81111561108b5761108b612838565b6040519080825280602002602001820160405280156110b4578160200160208202803683370190505b509050816111045760405162461bcd60e51b815260206004820181905260248201527f4174206c6561737420312072657761726420746f6b656e20726571756972656460448201526064016103c4565b60005b8281101561129557600084848381811061112357611123612822565b9050602002016020810190611138919061205e565b6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561117057600080fd5b505afa158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a89190612315565b6111b39060126127a2565b6111be90600c612638565b6111cc9060ff16600a6126c2565b9050600160405180606001604052808787868181106111ed576111ed612822565b9050602002016020810190611202919061205e565b6001600160a01b03908116825260006020808401829052604093840187905285546001808201885596835291819020855160039093020180546001600160a01b031916929093169190911782558301519381019390935501516002909101558251819084908490811061127757611277612822565b6020908102919091010152508061128d816127f1565b915050611107565b507ffbba257c5a77d50a94073d64710c09446977b7a14ab81bd4c9e86bcb17ac3b848383836040516112c9939291906123c8565b60405180910390a1505050565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101561134f576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016112fa565b50505050905090565b60015460609067ffffffffffffffff81111561137657611376612838565b60405190808252806020026020018201604052801561139f578160200160208202803683370190505b50905060005b60015481101561141d57600181815481106113c2576113c2612822565b600091825260209091206003909102015482516001600160a01b03909116908390839081106113f3576113f3612822565b6001600160a01b039092166020928302919091019091015280611415816127f1565b9150506113a5565b5090565b6000546001600160a01b0316331461144b5760405162461bcd60e51b81526004016103c490612596565b8051600154146114b25760405162461bcd60e51b815260206004820152602c60248201527f456d697373696f6e207261746520666f7220656163682072657761726420746f60448201526b1ad95b881c995c5d5a5c995960a21b60648201526084016103c4565b60005b6001548110156115d5578281815181106114d1576114d1612822565b60200260200101516001600160a01b0316600182815481106114f5576114f5612822565b60009182526020909120600390910201546001600160a01b0316146115825760405162461bcd60e51b815260206004820152603d60248201527f4f72646572206d69736d617463682c2070726f7669646520746f6b656e73206960448201527f6e206f72646572206f6620726577617264546f6b656e436f6e6669677300000060648201526084016103c4565b81818151811061159457611594612822565b6020026020010151600182815481106115af576115af612822565b6000918252602090912060016003909202010155806115cd816127f1565b9150506114b5565b507f8e036c6a6dbf4747ff14a010c4532af9cc895116334df6f291aaae75b4afe0368282604051611607929190612431565b60405180910390a15050565b600154606090819067ffffffffffffffff81111561163357611633612838565b60405190808252806020026020018201604052801561165c578160200160208202803683370190505b5060015490915067ffffffffffffffff81111561167b5761167b612838565b6040519080825280602002602001820160405280156116a4578160200160208202803683370190505b50600086815260036020526040812060018054939550909282906116ca576116ca612822565b600091825260208083206003909202909101546001600160a01b031683528201929092526040019020600101546117a35760005b60015481101561179d576001818154811061171b5761171b612822565b600091825260209091206003909102015483516001600160a01b039091169084908390811061174c5761174c612822565b60200260200101906001600160a01b031690816001600160a01b031681525050600082828151811061178057611780612822565b602090810291909101015280611795816127f1565b9150506116fe565b50611c01565b6040516306ed78b760e21b8152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb5e2dc9060240160206040518083038186803b15801561180657600080fd5b505afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e91906121a8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291909116906370a082319060240160206040518083038186803b1580156118a157600080fd5b505afa1580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d991906121de565b905060005b600154811015611bfe576000600182815481106118fd576118fd612822565b60009182526020909120600390910201805486519192506001600160a01b03169086908490811061193057611930612822565b6001600160a01b0392831660209182029290920181019190915260008a8152600382526040808220855490941682529282528281208351808501909452805484526001015491830191909152855186908590811061199057611990612822565b6020026020010181815250508060200151600014611be95760008981526005602090815260408083206001600160a01b03808d168552908352818420865490911684528252909120825191830151909190421180156119ee57508515155b15611a6b576000836020015142611a05919061278b565b60065460008e81526004602052604081205460018901549394509092611a2b908561276c565b611a35919061276c565b611a3f919061265d565b905087866002015482611a52919061276c565b611a5c919061265d565b611a669084612620565b925050505b600182015460028501548354611a8290849061276c565b611a8c919061265d565b611a96919061278b565b878681518110611aa857611aa8612822565b602090810291909101015283546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611af557600080fd5b505afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906121de565b878681518110611b3f57611b3f612822565b60200260200101511115611be65783546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611b8f57600080fd5b505afa158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc791906121de565b878681518110611bd957611bd9612822565b6020026020010181815250505b50505b50508080611bf6906127f1565b9150506118de565b50505b935093915050565b6000546001600160a01b03163314611c335760405162461bcd60e51b81526004016103c490612596565b6001600160a01b038116611c985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c4565b611ca181611ca4565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611d46908490611d4b565b505050565b6000611da0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1d9092919063ffffffff16565b805190915015611d465780806020019051810190611dbe9190612186565b611d465760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103c4565b6060611e2c8484600085611e36565b90505b9392505050565b606082471015611e975760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103c4565b6001600160a01b0385163b611eee5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c4565b600080866001600160a01b03168587604051611f0a91906123ac565b60006040518083038185875af1925050503d8060008114611f47576040519150601f19603f3d011682016040523d82523d6000602084013e611f4c565b606091505b5091509150611f5c828286611f67565b979650505050505050565b60608315611f76575081611e2f565b825115611f865782518084602001fd5b8160405162461bcd60e51b81526004016103c49190612563565b60008083601f840112611fb257600080fd5b50813567ffffffffffffffff811115611fca57600080fd5b6020830191508360208260051b8501011115611fe557600080fd5b9250929050565b600082601f830112611ffd57600080fd5b8135602061201261200d836125fc565b6125cb565b80838252828201915082860187848660051b890101111561203257600080fd5b60005b8581101561205157813584529284019290840190600101612035565b5090979650505050505050565b60006020828403121561207057600080fd5b8135611e2f8161284e565b6000806020838503121561208e57600080fd5b823567ffffffffffffffff8111156120a557600080fd5b6120b185828601611fa0565b90969095509350505050565b600080604083850312156120d057600080fd5b823567ffffffffffffffff808211156120e857600080fd5b818501915085601f8301126120fc57600080fd5b8135602061210c61200d836125fc565b8083825282820191508286018a848660051b890101111561212c57600080fd5b600096505b848710156121585780356121448161284e565b835260019690960195918301918301612131565b509650508601359250508082111561216f57600080fd5b5061217c85828601611fec565b9150509250929050565b60006020828403121561219857600080fd5b81518015158114611e2f57600080fd5b6000602082840312156121ba57600080fd5b8151611e2f8161284e565b6000602082840312156121d757600080fd5b5035919050565b6000602082840312156121f057600080fd5b5051919050565b600080600080600060a0868803121561220f57600080fd5b8535945060208601356122218161284e565b935060408601356122318161284e565b94979396509394606081013594506080013592915050565b60008060006060848603121561225e57600080fd5b8335925060208401356122708161284e565b915060408401356122808161284e565b809150509250925092565b6000806000606084860312156122a057600080fd5b8335925060208401356122b28161284e565b929592945050506040919091013590565b600080604083850312156122d657600080fd5b8235915060208301356122e88161284e565b809150509250929050565b6000806040838503121561230657600080fd5b50508035926020909101359150565b60006020828403121561232757600080fd5b815160ff81168114611e2f57600080fd5b600081518084526020808501945080840160005b838110156123715781516001600160a01b03168752958201959082019060010161234c565b509495945050505050565b600081518084526020808501945080840160005b8381101561237157815187529582019590820190600101612390565b600082516123be8184602087016127c5565b9190910192915050565b6040808252810183905260008460608301825b8681101561240b5782356123ee8161284e565b6001600160a01b03168252602092830192909101906001016123db565b508381036020850152611f5c818661237c565b602081526000611e2f6020830184612338565b6040815260006124446040830185612338565b8281036020840152612456818561237c565b95945050505050565b604080825283519082018190526000906020906060840190828701845b828110156124a15781516001600160a01b03168452928401929084019060010161247c565b505050838103828501526124b5818661237c565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612501578151805185528601518685015292840192908501906001016124dc565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561250157815180516001600160a01b031685528681015187860152850151858501526060909301929085019060010161252b565b60208152600082518060208401526125828160408501602087016127c5565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156125f4576125f4612838565b604052919050565b600067ffffffffffffffff82111561261657612616612838565b5060051b60200190565b600082198211156126335761263361280c565b500190565b600060ff821660ff84168060ff038211156126555761265561280c565b019392505050565b60008261267a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156126ba5781600019048211156126a0576126a061280c565b808516156126ad57918102915b93841c9390800290612684565b509250929050565b6000611e2f83836000826126d857506001612766565b816126e557506000612766565b81600181146126fb576002811461270557612721565b6001915050612766565b60ff8411156127165761271661280c565b50506001821b612766565b5060208310610133831016604e8410600b8410161715612744575081810a612766565b61274e838361267f565b80600019048211156127625761276261280c565b0290505b92915050565b60008160001904831182151516156127865761278661280c565b500290565b60008282101561279d5761279d61280c565b500390565b600060ff821660ff8416808210156127bc576127bc61280c565b90039392505050565b60005b838110156127e05781810151838201526020016127c8565b838111156109075750506000910152565b60006000198214156128055761280561280c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ca157600080fdfea2646970667358221220dbb3e0cadfc29814dfd5ece9b40ca5d55abd8859935f33f2f6cf93c8c45c668a64736f6c63430008070033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101375760003560e01c806372f3ac8b116100b8578063b9fef63e1161007c578063b9fef63e146102f1578063c4f59f9b14610306578063cac332ab1461031b578063d63b3c491461032e578063dd585a6b1461034f578063f2fde38b1461038757600080fd5b806372f3ac8b14610294578063771602f7146102a75780638da5cb5b146102ba578063929bffc2146102cb578063aa6db928146102de57600080fd5b8063392e359b116100ff578063392e359b146101e257806351eb05a61461021a578063575a86b21461023a57806357a5b58c14610279578063715018a61461028c57600080fd5b8063081e3eda1461013c578063180e9f8f146101535780631ab06ee51461019a5780631aed4a69146101af5780631c671763146101cf575b600080fd5b6002545b6040519081526020015b60405180910390f35b6101856101613660046122c3565b60036020908152600092835260408084209091529082529020805460019091015482565b6040805192835260208301919091520161014a565b6101ad6101a83660046122f3565b61039a565b005b6101406101bd3660046121c5565b60046020526000908152604090205481565b6101406101dd3660046121c5565b6104da565b6101f56101f03660046121c5565b6104fb565b604080516001600160a01b03909416845260208401929092529082015260600161014a565b61022d6102283660046121c5565b610538565b60405161014a91906124bf565b6102617f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014a565b6101ad61028736600461207b565b6108c9565b6101ad61090d565b6101ad6102a236600461205e565b610943565b6101ad6102b53660046122f3565b610ab9565b6000546001600160a01b0316610261565b6101ad6102d93660046121f7565b610c9f565b6101ad6102ec36600461207b565b610fdc565b6102f96112d6565b60405161014a919061250e565b61030e611358565b60405161014a919061241e565b6101ad6103293660046120bd565b611421565b61034161033c36600461228b565b611613565b60405161014a92919061245f565b61018561035d366004612249565b60056020908152600093845260408085208252928452828420905282529020805460019091015482565b6101ad61039536600461205e565b611c09565b6000546001600160a01b031633146103cd5760405162461bcd60e51b81526004016103c490612596565b60405180910390fd5b60008281526003602052604081206001805491929182906103f0576103f0612822565b600091825260208083206003909202909101546001600160a01b0316835282019290925260400190206001015461045f5760405162461bcd60e51b8152602060048201526013602482015272141bdbdb08191bd95cc81b9bdd08195e1a5cdd606a1b60448201526064016103c4565b600082815260046020526040902054600654829161047c9161278b565b6104869190612620565b600655600082815260046020526040908190208290555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c906104ce9084815260200190565b60405180910390a25050565b600281815481106104ea57600080fd5b600091825260209091200154905081565b6001818154811061050b57600080fd5b60009182526020909120600390910201805460018201546002909201546001600160a01b03909116925083565b60015460609067ffffffffffffffff81111561055657610556612838565b60405190808252806020026020018201604052801561059b57816020015b60408051808201909152600080825260208201528152602001906001900390816105745790505b506040516306ed78b760e21b8152600481018490529091506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690631bb5e2dc9060240160206040518083038186803b15801561060257600080fd5b505afa158015610616573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061063a91906121a8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291909116906370a082319060240160206040518083038186803b15801561069d57600080fd5b505afa1580156106b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d591906121de565b905060005b6001548110156108c2576000600182815481106106f9576106f9612822565b60009182526020808320888452600380835260408086209490910290910180546001600160a01b031685529282529283902083518085019094528054845260010154908301528551909250819086908590811061075857610758612822565b6020026020010181905250806020015160001415801561077b5750806020015142115b156108ad578315610800576000816020015142610798919061278b565b600654600089815260046020526040812054600187015493945090926107be908561276c565b6107c8919061276c565b6107d2919061265d565b9050858460020154826107e5919061276c565b6107ef919061265d565b83516107fb9190612620565b835250505b426020828101918252600088815260038252604080822086546001600160a01b03168352909252208251815590516001909101558451819086908590811061084a5761084a612822565b6020908102919091018101919091528254828201518351604080519283529382018890528184015291516001600160a01b039091169188917f06269c76d9be32952b871b9472362e7c66042aa3cbf2c64f0cbfb2b7d540ea739181900360600190a35b505080806108ba906127f1565b9150506106da565b5050919050565b8060005b81811015610907576108f68484838181106108ea576108ea612822565b90506020020135610538565b50610900816127f1565b90506108cd565b50505050565b6000546001600160a01b031633146109375760405162461bcd60e51b81526004016103c490612596565b6109416000611ca4565b565b6000546001600160a01b0316331461096d5760405162461bcd60e51b81526004016103c490612596565b6109c2610978611358565b60015467ffffffffffffffff81111561099357610993612838565b6040519080825280602002602001820160405280156109bc578160200160208202803683370190505b50611421565b60005b600154811015610ab557610aa382600183815481106109e6576109e6612822565b60009182526020909120600390910201546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015610a3757600080fd5b505afa158015610a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6f91906121de565b60018481548110610a8257610a82612822565b60009182526020909120600390910201546001600160a01b03169190611cf4565b80610aad816127f1565b9150506109c5565b5050565b6000546001600160a01b03163314610ae35760405162461bcd60e51b81526004016103c490612596565b6000828152600360205260408120600180549192918290610b0657610b06612822565b600091825260208083206003909202909101546001600160a01b0316835282019290925260400190206001015415610b765760405162461bcd60e51b8152602060048201526013602482015272506f6f6c20616c72656164792065786973747360681b60448201526064016103c4565b6006544290610b86908390612620565b60065560008381526004602052604081208390555b600154811015610c2f576040518060400160405280600081526020018381525060036000868152602001908152602001600020600060018481548110610be357610be3612822565b600091825260208083206003909202909101546001600160a01b031683528281019390935260409091019020825181559101516001919091015580610c27816127f1565b915050610b9b565b50600280546001810182556000919091527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace0183905560405182815283907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c819060200160405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d275760405162461bcd60e51b815260206004820152602760248201527f4f6e6c79204d6173746572436865662063616e2063616c6c20746869732066756044820152663731ba34b7b71760c91b60648201526084016103c4565b6000610d3286610538565b905060005b8151811015610fd357600060018281548110610d5557610d55612822565b60009182526020822060039091020154600180546001600160a01b0390921693509084908110610d8757610d87612822565b60009182526020808320600260039093020191909101548b83526005825260408084206001600160a01b03808e16865290845281852090871685529092529082208054919350919015610f1657816001015483878781518110610dec57610dec612822565b6020026020010151600001518460000154610e07919061276c565b610e11919061265d565b610e1b919061278b565b6040516370a0823160e01b81523060048201529091506001600160a01b038516906370a082319060240160206040518083038186803b158015610e5d57600080fd5b505afa158015610e71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e9591906121de565b811115610f16576040516370a0823160e01b81523060048201526001600160a01b038516906370a082319060240160206040518083038186803b158015610edb57600080fd5b505afa158015610eef573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f1391906121de565b90505b86825585518390879087908110610f2f57610f2f612822565b60200260200101516000015188610f46919061276c565b610f50919061265d565b60018301558015610f6f57610f6f6001600160a01b0385168a83611cf4565b604080516001600160a01b03868116825260208201849052808c16928e92918e16917f8689a2c06939a3efd443cf730fa992e3c6dca3aa215c5fa45dc50b69dd72a58c910160405180910390a4505050508080610fcb906127f1565b915050610d37565b50505050505050565b6000546001600160a01b031633146110065760405162461bcd60e51b81526004016103c490612596565b600154156110705760405162461bcd60e51b815260206004820152603160248201527f52657761726420746f6b656e20636f6e666967732063616e206f6e6c7920626560448201527020696e697469616c697a6564206f6e636560781b60648201526084016103c4565b60008167ffffffffffffffff81111561108b5761108b612838565b6040519080825280602002602001820160405280156110b4578160200160208202803683370190505b509050816111045760405162461bcd60e51b815260206004820181905260248201527f4174206c6561737420312072657761726420746f6b656e20726571756972656460448201526064016103c4565b60005b8281101561129557600084848381811061112357611123612822565b9050602002016020810190611138919061205e565b6001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b15801561117057600080fd5b505afa158015611184573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111a89190612315565b6111b39060126127a2565b6111be90600c612638565b6111cc9060ff16600a6126c2565b9050600160405180606001604052808787868181106111ed576111ed612822565b9050602002016020810190611202919061205e565b6001600160a01b03908116825260006020808401829052604093840187905285546001808201885596835291819020855160039093020180546001600160a01b031916929093169190911782558301519381019390935501516002909101558251819084908490811061127757611277612822565b6020908102919091010152508061128d816127f1565b915050611107565b507ffbba257c5a77d50a94073d64710c09446977b7a14ab81bd4c9e86bcb17ac3b848383836040516112c9939291906123c8565b60405180910390a1505050565b60606001805480602002602001604051908101604052809291908181526020016000905b8282101561134f576000848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016112fa565b50505050905090565b60015460609067ffffffffffffffff81111561137657611376612838565b60405190808252806020026020018201604052801561139f578160200160208202803683370190505b50905060005b60015481101561141d57600181815481106113c2576113c2612822565b600091825260209091206003909102015482516001600160a01b03909116908390839081106113f3576113f3612822565b6001600160a01b039092166020928302919091019091015280611415816127f1565b9150506113a5565b5090565b6000546001600160a01b0316331461144b5760405162461bcd60e51b81526004016103c490612596565b8051600154146114b25760405162461bcd60e51b815260206004820152602c60248201527f456d697373696f6e207261746520666f7220656163682072657761726420746f60448201526b1ad95b881c995c5d5a5c995960a21b60648201526084016103c4565b60005b6001548110156115d5578281815181106114d1576114d1612822565b60200260200101516001600160a01b0316600182815481106114f5576114f5612822565b60009182526020909120600390910201546001600160a01b0316146115825760405162461bcd60e51b815260206004820152603d60248201527f4f72646572206d69736d617463682c2070726f7669646520746f6b656e73206960448201527f6e206f72646572206f6620726577617264546f6b656e436f6e6669677300000060648201526084016103c4565b81818151811061159457611594612822565b6020026020010151600182815481106115af576115af612822565b6000918252602090912060016003909202010155806115cd816127f1565b9150506114b5565b507f8e036c6a6dbf4747ff14a010c4532af9cc895116334df6f291aaae75b4afe0368282604051611607929190612431565b60405180910390a15050565b600154606090819067ffffffffffffffff81111561163357611633612838565b60405190808252806020026020018201604052801561165c578160200160208202803683370190505b5060015490915067ffffffffffffffff81111561167b5761167b612838565b6040519080825280602002602001820160405280156116a4578160200160208202803683370190505b50600086815260036020526040812060018054939550909282906116ca576116ca612822565b600091825260208083206003909202909101546001600160a01b031683528201929092526040019020600101546117a35760005b60015481101561179d576001818154811061171b5761171b612822565b600091825260209091206003909102015483516001600160a01b039091169084908390811061174c5761174c612822565b60200260200101906001600160a01b031690816001600160a01b031681525050600082828151811061178057611780612822565b602090810291909101015280611795816127f1565b9150506116fe565b50611c01565b6040516306ed78b760e21b8152600481018690526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690631bb5e2dc9060240160206040518083038186803b15801561180657600080fd5b505afa15801561181a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061183e91906121a8565b6040516370a0823160e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015291909116906370a082319060240160206040518083038186803b1580156118a157600080fd5b505afa1580156118b5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118d991906121de565b905060005b600154811015611bfe576000600182815481106118fd576118fd612822565b60009182526020909120600390910201805486519192506001600160a01b03169086908490811061193057611930612822565b6001600160a01b0392831660209182029290920181019190915260008a8152600382526040808220855490941682529282528281208351808501909452805484526001015491830191909152855186908590811061199057611990612822565b6020026020010181815250508060200151600014611be95760008981526005602090815260408083206001600160a01b03808d168552908352818420865490911684528252909120825191830151909190421180156119ee57508515155b15611a6b576000836020015142611a05919061278b565b60065460008e81526004602052604081205460018901549394509092611a2b908561276c565b611a35919061276c565b611a3f919061265d565b905087866002015482611a52919061276c565b611a5c919061265d565b611a669084612620565b925050505b600182015460028501548354611a8290849061276c565b611a8c919061265d565b611a96919061278b565b878681518110611aa857611aa8612822565b602090810291909101015283546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611af557600080fd5b505afa158015611b09573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2d91906121de565b878681518110611b3f57611b3f612822565b60200260200101511115611be65783546040516370a0823160e01b81523060048201526001600160a01b03909116906370a082319060240160206040518083038186803b158015611b8f57600080fd5b505afa158015611ba3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bc791906121de565b878681518110611bd957611bd9612822565b6020026020010181815250505b50505b50508080611bf6906127f1565b9150506118de565b50505b935093915050565b6000546001600160a01b03163314611c335760405162461bcd60e51b81526004016103c490612596565b6001600160a01b038116611c985760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016103c4565b611ca181611ca4565b50565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052611d46908490611d4b565b505050565b6000611da0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611e1d9092919063ffffffff16565b805190915015611d465780806020019051810190611dbe9190612186565b611d465760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016103c4565b6060611e2c8484600085611e36565b90505b9392505050565b606082471015611e975760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016103c4565b6001600160a01b0385163b611eee5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016103c4565b600080866001600160a01b03168587604051611f0a91906123ac565b60006040518083038185875af1925050503d8060008114611f47576040519150601f19603f3d011682016040523d82523d6000602084013e611f4c565b606091505b5091509150611f5c828286611f67565b979650505050505050565b60608315611f76575081611e2f565b825115611f865782518084602001fd5b8160405162461bcd60e51b81526004016103c49190612563565b60008083601f840112611fb257600080fd5b50813567ffffffffffffffff811115611fca57600080fd5b6020830191508360208260051b8501011115611fe557600080fd5b9250929050565b600082601f830112611ffd57600080fd5b8135602061201261200d836125fc565b6125cb565b80838252828201915082860187848660051b890101111561203257600080fd5b60005b8581101561205157813584529284019290840190600101612035565b5090979650505050505050565b60006020828403121561207057600080fd5b8135611e2f8161284e565b6000806020838503121561208e57600080fd5b823567ffffffffffffffff8111156120a557600080fd5b6120b185828601611fa0565b90969095509350505050565b600080604083850312156120d057600080fd5b823567ffffffffffffffff808211156120e857600080fd5b818501915085601f8301126120fc57600080fd5b8135602061210c61200d836125fc565b8083825282820191508286018a848660051b890101111561212c57600080fd5b600096505b848710156121585780356121448161284e565b835260019690960195918301918301612131565b509650508601359250508082111561216f57600080fd5b5061217c85828601611fec565b9150509250929050565b60006020828403121561219857600080fd5b81518015158114611e2f57600080fd5b6000602082840312156121ba57600080fd5b8151611e2f8161284e565b6000602082840312156121d757600080fd5b5035919050565b6000602082840312156121f057600080fd5b5051919050565b600080600080600060a0868803121561220f57600080fd5b8535945060208601356122218161284e565b935060408601356122318161284e565b94979396509394606081013594506080013592915050565b60008060006060848603121561225e57600080fd5b8335925060208401356122708161284e565b915060408401356122808161284e565b809150509250925092565b6000806000606084860312156122a057600080fd5b8335925060208401356122b28161284e565b929592945050506040919091013590565b600080604083850312156122d657600080fd5b8235915060208301356122e88161284e565b809150509250929050565b6000806040838503121561230657600080fd5b50508035926020909101359150565b60006020828403121561232757600080fd5b815160ff81168114611e2f57600080fd5b600081518084526020808501945080840160005b838110156123715781516001600160a01b03168752958201959082019060010161234c565b509495945050505050565b600081518084526020808501945080840160005b8381101561237157815187529582019590820190600101612390565b600082516123be8184602087016127c5565b9190910192915050565b6040808252810183905260008460608301825b8681101561240b5782356123ee8161284e565b6001600160a01b03168252602092830192909101906001016123db565b508381036020850152611f5c818661237c565b602081526000611e2f6020830184612338565b6040815260006124446040830185612338565b8281036020840152612456818561237c565b95945050505050565b604080825283519082018190526000906020906060840190828701845b828110156124a15781516001600160a01b03168452928401929084019060010161247c565b505050838103828501526124b5818661237c565b9695505050505050565b602080825282518282018190526000919060409081850190868401855b82811015612501578151805185528601518685015292840192908501906001016124dc565b5091979650505050505050565b602080825282518282018190526000919060409081850190868401855b8281101561250157815180516001600160a01b031685528681015187860152850151858501526060909301929085019060010161252b565b60208152600082518060208401526125828160408501602087016127c5565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b604051601f8201601f1916810167ffffffffffffffff811182821017156125f4576125f4612838565b604052919050565b600067ffffffffffffffff82111561261657612616612838565b5060051b60200190565b600082198211156126335761263361280c565b500190565b600060ff821660ff84168060ff038211156126555761265561280c565b019392505050565b60008261267a57634e487b7160e01b600052601260045260246000fd5b500490565b600181815b808511156126ba5781600019048211156126a0576126a061280c565b808516156126ad57918102915b93841c9390800290612684565b509250929050565b6000611e2f83836000826126d857506001612766565b816126e557506000612766565b81600181146126fb576002811461270557612721565b6001915050612766565b60ff8411156127165761271661280c565b50506001821b612766565b5060208310610133831016604e8410600b8410161715612744575081810a612766565b61274e838361267f565b80600019048211156127625761276261280c565b0290505b92915050565b60008160001904831182151516156127865761278661280c565b500290565b60008282101561279d5761279d61280c565b500390565b600060ff821660ff8416808210156127bc576127bc61280c565b90039392505050565b60005b838110156127e05781810151838201526020016127c8565b838111156109075750506000910152565b60006000198214156128055761280561280c565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611ca157600080fdfea2646970667358221220dbb3e0cadfc29814dfd5ece9b40ca5d55abd8859935f33f2f6cf93c8c45c668a64736f6c63430008070033", + "linkReferences": {}, + "deployedLinkReferences": {} +} diff --git a/subgraphs/masterchefV2/abis/CloneRewarderTime.json b/subgraphs/masterchefV2/abis/SingleTokenRewarder.json similarity index 100% rename from subgraphs/masterchefV2/abis/CloneRewarderTime.json rename to subgraphs/masterchefV2/abis/SingleTokenRewarder.json diff --git a/subgraphs/masterchefV2/package.json b/subgraphs/masterchefV2/package.json index 1156095..0c9e0b4 100644 --- a/subgraphs/masterchefV2/package.json +++ b/subgraphs/masterchefV2/package.json @@ -1,28 +1,28 @@ { - "name": "masterchefV2", - "private": true, - "license": "MIT", - "version": "1.0.0", - "author": "BeethovenX", - "scripts": { - "codegen": "graph codegen subgraph.yaml", - "build": "graph build subgraph.yaml", - "create-local": "graph create --node http://localhost:8020/", - "remove-local": "graph remove --node http://localhost:8020/ beetx-subgraph", - "deploy-local": "graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 beetx-subgraph", - "deploy:fantom-eu": "graph deploy masterchef subgraph.yaml --ipfs http://eu-node.beets-ftm-node.com:5001 --node http://eu-node.beets-ftm-node.com:8020/", - "deploy:fantom-canada": "graph deploy masterchef subgraph.yaml --ipfs http://ca-node.beets-ftm-node.com:5001 --node http://ca-node.beets-ftm-node.com:8020/", - "prepare:rinkeby": "mustache config/rinkeby.json template.yaml > subgraph.yaml", - "prepare:fantom": "mustache config/fantom.json template.yaml > subgraph.yaml" - }, - "dependencies": { - "@graphprotocol/graph-cli": "^0.26.0", - "@graphprotocol/graph-ts": "^0.24.1", - "matchstick-as": "^0.3.0", - "ejs": "^3.1.6", - "handlebars": "^4.7.7", - "mustache": "^4.2.0", - "prettier": "^2.0.0", - "typescript": "^4.0.0" - } + "name": "masterchefV2", + "private": true, + "license": "MIT", + "version": "1.0.0", + "author": "BeethovenX", + "scripts": { + "codegen": "graph codegen subgraph.yaml", + "build": "graph build subgraph.yaml", + "create-local": "graph create --node http://localhost:8020/", + "remove-local": "graph remove --node http://localhost:8020/ beetx-subgraph", + "deploy-local": "graph deploy --node http://localhost:8020/ --ipfs http://localhost:5001 beetx-subgraph", + "deploy:fantom-eu": "graph deploy masterchefV2 subgraph.yaml --ipfs http://eu-node.beets-ftm-node.com:5001 --node http://eu-node.beets-ftm-node.com:8020/", + "deploy:fantom-canada": "graph deploy masterchefV2 subgraph.yaml --ipfs http://ca-node.beets-ftm-node.com:5001 --node http://ca-node.beets-ftm-node.com:8020/", + "prepare:rinkeby": "mustache config/rinkeby.json template.yaml > subgraph.yaml", + "prepare:fantom": "mustache config/fantom.json template.yaml > subgraph.yaml" + }, + "dependencies": { + "@graphprotocol/graph-cli": "^0.26.0", + "@graphprotocol/graph-ts": "^0.24.1", + "matchstick-as": "^0.3.0", + "ejs": "^3.1.6", + "handlebars": "^4.7.7", + "mustache": "^4.2.0", + "prettier": "^2.0.0", + "typescript": "^4.0.0" + } } diff --git a/subgraphs/masterchefV2/schema.graphql b/subgraphs/masterchefV2/schema.graphql index 3c68a04..1f13468 100644 --- a/subgraphs/masterchefV2/schema.graphql +++ b/subgraphs/masterchefV2/schema.graphql @@ -2,10 +2,11 @@ type MasterChef @entity { # Contract address id: ID! -# owner: Bytes! -# devAddress: Bytes! -# treasuryAddress: Bytes! + # owner: Bytes! + # devAddress: Bytes! + # treasuryAddress: Bytes! + beets: Bytes! beetsPerBlock: BigInt! totalAllocPoint: BigInt! @@ -39,16 +40,35 @@ type Pool @entity { block: BigInt! } +type RewardToken @entity { + id: ID! + rewarder: Rewarder + token: Bytes! + decimals: Int! + symbol: String! + rewardPerSecond: BigInt! + timestamp: BigInt! + block: BigInt! +} + type Rewarder @entity { # address id: ID! - rewardToken: Bytes! - rewardPerSecond: BigInt! + rewardTokens: [RewardToken!]! @derivedFrom(field: "rewarder") timestamp: BigInt! block: BigInt! } +type HarvestAction @entity { + id: ID! + user: User + token: Bytes! + amount: BigInt! + timestamp: BigInt! + block: BigInt! +} + type User @entity { # Pool id concatenated with user address id: ID! @@ -59,6 +79,7 @@ type User @entity { amount: BigInt! rewardDebt: BigInt! beetsHarvested: BigInt! + harvests: [HarvestAction!]! @derivedFrom(field: "user") timestamp: BigInt! block: BigInt! diff --git a/subgraphs/masterchefV2/src/entities/masterchef.ts b/subgraphs/masterchefV2/src/entities/masterchef.ts index 76bf627..3b4f291 100644 --- a/subgraphs/masterchefV2/src/entities/masterchef.ts +++ b/subgraphs/masterchefV2/src/entities/masterchef.ts @@ -1,4 +1,5 @@ import { MasterChef } from "../../generated/schema"; +import { MasterChefV2 } from "../../generated/MasterChefV2/MasterChefV2"; import { dataSource, ethereum } from "@graphprotocol/graph-ts"; import { BIG_INT_ZERO, @@ -9,10 +10,12 @@ export function getMasterChef(block: ethereum.Block): MasterChef { let masterChef = MasterChef.load(dataSource.address().toHex()); if (masterChef === null) { + const chefContract = MasterChefV2.bind(dataSource.address()); masterChef = new MasterChef(dataSource.address().toHex()); masterChef.totalAllocPoint = BIG_INT_ZERO; masterChef.beetsPerBlock = MASTER_CHEF_INITIAL_BEETS_PER_BLOCK; masterChef.poolCount = BIG_INT_ZERO; + masterChef.beets = chefContract.beets(); } masterChef.timestamp = block.timestamp; diff --git a/subgraphs/masterchefV2/src/entities/rewarder.ts b/subgraphs/masterchefV2/src/entities/rewarder.ts index 1c7d2d4..423a42d 100644 --- a/subgraphs/masterchefV2/src/entities/rewarder.ts +++ b/subgraphs/masterchefV2/src/entities/rewarder.ts @@ -1,27 +1,48 @@ import { ADDRESS_ZERO, BIG_INT_ZERO } from "../constants"; import { Address, ethereum } from "@graphprotocol/graph-ts"; -import { CloneRewarderTime as CloneRewarderTimeContract } from "../../generated/templates/CloneRewarderTime/CloneRewarderTime"; -import { CloneRewarderTime as CloneRewarderTimeTemplate } from "../../generated/templates"; -import { Rewarder } from "../../generated/schema"; +import { SingleTokenRewarder as SingleTokenRewarderContract } from "../../generated/templates/SingleTokenRewarder/SingleTokenRewarder"; +import { SingleTokenRewarder as SingleTokenRewarderTemplate } from "../../generated/templates"; +import { MultiTokenRewarder as MultiTokenRewarderContract } from "../../generated/templates/MultiTokenRewarder/MultiTokenRewarder"; +import { MultiTokenRewarder as MultiTokenRewarderTemplate } from "../../generated/templates"; + +import { Rewarder, RewardToken } from "../../generated/schema"; +import { ERC20 } from "../../../locking/generated/Locker/ERC20"; export function getRewarder(address: Address, block: ethereum.Block): Rewarder { let rewarder = Rewarder.load(address.toHex()); if (rewarder === null) { rewarder = new Rewarder(address.toHex()); - rewarder.rewardToken = ADDRESS_ZERO; - rewarder.rewardPerSecond = BIG_INT_ZERO; - - const rewarderContract = CloneRewarderTimeContract.bind(address); - let rewardTokenResult = rewarderContract.try_rewardToken(); - let rewardRateResult = rewarderContract.try_rewardPerSecond(); - if (!rewardTokenResult.reverted) { - rewarder.rewardToken = rewardTokenResult.value; - } - if (!rewardRateResult.reverted) { - rewarder.rewardPerSecond = rewardRateResult.value; - CloneRewarderTimeTemplate.create(address); + if (address != ADDRESS_ZERO) { + const rewarderContract = SingleTokenRewarderContract.bind(address); + let rewardTokenResult = rewarderContract.try_rewardToken(); + if (!rewardTokenResult.reverted) { + const rewardToken = getRewardToken( + rewarder.id, + rewardTokenResult.value, + block + ); + rewardToken.rewardPerSecond = rewarderContract.rewardPerSecond(); + rewardToken.token = rewarderContract.rewardToken(); + rewardToken.save(); + SingleTokenRewarderTemplate.create(address); + } else { + const multiTokenRewarderContract = + MultiTokenRewarderContract.bind(address); + const tokenConfigs = multiTokenRewarderContract.getRewardTokenConfigs(); + for (let i = 0; i < tokenConfigs.length; i++) { + const rewardToken = getRewardToken( + rewarder.id, + tokenConfigs[i].rewardToken, + block + ); + rewardToken.rewardPerSecond = tokenConfigs[i].rewardsPerSecond; + rewardToken.save(); + } + MultiTokenRewarderTemplate.create(address); + } + } else { } } @@ -34,6 +55,27 @@ export function getRewarder(address: Address, block: ethereum.Block): Rewarder { return rewarder as Rewarder; } +export function getRewardToken( + rewarderId: string, + address: Address, + block: ethereum.Block +): RewardToken { + let rewardToken = RewardToken.load(`${rewarderId}-${address.toHex()}`); + if (rewardToken == null) { + const erc20 = ERC20.bind(address); + rewardToken = new RewardToken(`${rewarderId}-${address.toHex()}`); + rewardToken.rewarder = rewarderId; + rewardToken.token = address; + rewardToken.decimals = erc20.decimals(); + rewardToken.symbol = erc20.symbol(); + rewardToken.rewardPerSecond = BIG_INT_ZERO; + } + rewardToken.block = block.number; + rewardToken.timestamp = block.timestamp; + rewardToken.save(); + return rewardToken; +} + export function updateRewarder(address: Address): void { let rewarder = Rewarder.load(address.toHex()); diff --git a/subgraphs/masterchefV2/src/entities/user.ts b/subgraphs/masterchefV2/src/entities/user.ts index 345188b..486fb46 100644 --- a/subgraphs/masterchefV2/src/entities/user.ts +++ b/subgraphs/masterchefV2/src/entities/user.ts @@ -1,17 +1,12 @@ -import { User } from "../../generated/schema"; import { Address, BigInt, ethereum } from "@graphprotocol/graph-ts"; +import { User } from "../../generated/schema"; import { BIG_INT_ZERO } from "../constants"; -import { getMasterChef } from "./masterChef"; -import { getPool } from "./pool"; export function getUser( address: Address, pid: BigInt, block: ethereum.Block ): User { - const masterChef = getMasterChef(block); - const pool = getPool(pid, block); - const uid = address.toHex(); const id = pid.toString().concat("-").concat(uid); let user = User.load(id); @@ -19,7 +14,7 @@ export function getUser( if (user === null) { user = new User(id); user.address = address; - user.pool = pool.id; + user.pool = pid.toString(); user.amount = BIG_INT_ZERO; user.rewardDebt = BIG_INT_ZERO; user.beetsHarvested = BIG_INT_ZERO; diff --git a/subgraphs/masterchefV2/src/mappings/clone-rewarder.ts b/subgraphs/masterchefV2/src/mappings/clone-rewarder.ts deleted file mode 100644 index 176dec0..0000000 --- a/subgraphs/masterchefV2/src/mappings/clone-rewarder.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Address, BigInt, log } from '@graphprotocol/graph-ts' - -import { LogRewardPerSecond } from '../../generated/templates/CloneRewarderTime/CloneRewarderTime' -import { getRewarder } from '../entities' - -export function logRewardPerSecond(event: LogRewardPerSecond): void { - log.info('[MasterChefV2:Rewarder] Log Reward Per Second {}', [ - event.params.rewardPerSecond.toString() - ]) - - const rewarder = getRewarder(event.address, event.block) - rewarder.rewardPerSecond = event.params.rewardPerSecond - rewarder.save() -} diff --git a/subgraphs/masterchefV2/src/mappings/masterchefV2.ts b/subgraphs/masterchefV2/src/mappings/masterchefV2.ts index 0d4f5ac..2bd1f3b 100644 --- a/subgraphs/masterchefV2/src/mappings/masterchefV2.ts +++ b/subgraphs/masterchefV2/src/mappings/masterchefV2.ts @@ -7,167 +7,191 @@ import { LogUpdatePool, UpdateEmissionRate, Withdraw, -} from '../../generated/MasterChefV2/MasterChefV2' +} from "../../generated/MasterChefV2/MasterChefV2"; -import {Address, log} from '@graphprotocol/graph-ts' -import {ACC_BEETX_PRECISION, BIG_INT_ONE, BIG_INT_ZERO} from '../constants' +import { Address, log } from "@graphprotocol/graph-ts"; +import { ACC_BEETX_PRECISION, BIG_INT_ONE, BIG_INT_ZERO } from "../constants"; -import {getMasterChef, getPool, getRewarder, getUser, updateRewarder} from '../entities' +import { + getMasterChef, + getPool, + getRewarder, + getUser, + updateRewarder, +} from "../entities"; +import { HarvestAction } from "../../generated/schema"; export function logPoolAddition(event: LogPoolAddition): void { - log.info('[MasterChefV2] Log Pool Addition {} {} {} {}', [ + log.info("[MasterChefV2] Log Pool Addition {} {} {} {}", [ event.params.pid.toString(), event.params.allocPoint.toString(), event.params.lpToken.toHex(), - event.params.rewarder.toHex() - ]) + event.params.rewarder.toHex(), + ]); - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) - const rewarder = getRewarder(event.params.rewarder, event.block) + const masterChef = getMasterChef(event.block); + const pool = getPool(event.params.pid, event.block); + const rewarder = getRewarder(event.params.rewarder, event.block); - pool.pair = event.params.lpToken - pool.rewarder = rewarder.id - pool.allocPoint = event.params.allocPoint - pool.save() + pool.pair = event.params.lpToken; + pool.rewarder = rewarder.id; + pool.allocPoint = event.params.allocPoint; + pool.save(); - masterChef.totalAllocPoint = masterChef.totalAllocPoint.plus(pool.allocPoint) - masterChef.poolCount = masterChef.poolCount.plus(BIG_INT_ONE) - masterChef.save() + masterChef.totalAllocPoint = masterChef.totalAllocPoint.plus(pool.allocPoint); + masterChef.poolCount = masterChef.poolCount.plus(BIG_INT_ONE); + masterChef.save(); } export function logSetPool(event: LogSetPool): void { - log.info('[MasterChefV2] Log Set Pool {} {} {} {}', [ + log.info("[MasterChefV2] Log Set Pool {} {} {} {}", [ event.params.pid.toString(), event.params.allocPoint.toString(), event.params.rewarder.toHex(), - event.params.overwrite == true ? 'true' : 'false' - ]) + event.params.overwrite == true ? "true" : "false", + ]); - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) + const masterChef = getMasterChef(event.block); + const pool = getPool(event.params.pid, event.block); if (event.params.overwrite == true) { - const rewarder = getRewarder(event.params.rewarder, event.block) - pool.rewarder = rewarder.id + const rewarder = getRewarder(event.params.rewarder, event.block); + pool.rewarder = rewarder.id; } - masterChef.totalAllocPoint = masterChef.totalAllocPoint.plus(event.params.allocPoint.minus(pool.allocPoint)) - masterChef.save() + masterChef.totalAllocPoint = masterChef.totalAllocPoint.plus( + event.params.allocPoint.minus(pool.allocPoint) + ); + masterChef.save(); - pool.allocPoint = event.params.allocPoint - pool.save() + pool.allocPoint = event.params.allocPoint; + pool.save(); } export function updateEmissionRate(event: UpdateEmissionRate): void { - log.info('[MasterChef] Log update emission rate {} {}', [ + log.info("[MasterChef] Log update emission rate {} {}", [ event.params.user.toString(), - event.params._beetsPerSec.toString() - ]) + event.params._beetsPerSec.toString(), + ]); - const masterChef = getMasterChef(event.block) - masterChef.beetsPerBlock = event.params._beetsPerSec - masterChef.save() + const masterChef = getMasterChef(event.block); + masterChef.beetsPerBlock = event.params._beetsPerSec; + masterChef.save(); } export function logUpdatePool(event: LogUpdatePool): void { - log.info('[MasterChefV2] Log Update Pool {} {} {} {}', [ + log.info("[MasterChefV2] Log Update Pool {} {} {} {}", [ event.params.pid.toString(), event.params.lastRewardBlock.toString(), event.params.lpSupply.toString(), - event.params.accBeetsPerShare.toString() - ]) + event.params.accBeetsPerShare.toString(), + ]); - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) - updateRewarder(Address.fromString(pool.rewarder!)) + const masterChef = getMasterChef(event.block); + const pool = getPool(event.params.pid, event.block); + updateRewarder(Address.fromString(pool.rewarder!)); - pool.accBeetsPerShare = event.params.accBeetsPerShare - pool.lastRewardBlock = event.params.lastRewardBlock - pool.save() + pool.accBeetsPerShare = event.params.accBeetsPerShare; + pool.lastRewardBlock = event.params.lastRewardBlock; + pool.save(); } export function deposit(event: Deposit): void { - log.info('[MasterChefV2] Log Deposit {} {} {} {}', [ + log.info("[MasterChefV2] Log Deposit {} {} {} {}", [ event.params.user.toHex(), event.params.pid.toString(), event.params.amount.toString(), - event.params.to.toHex() - ]) + event.params.to.toHex(), + ]); - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) - const user = getUser(event.params.to, event.params.pid, event.block) + const masterChef = getMasterChef(event.block); + const pool = getPool(event.params.pid, event.block); + const user = getUser(event.params.to, event.params.pid, event.block); - pool.slpBalance = pool.slpBalance.plus(event.params.amount) - if(user.amount === BIG_INT_ZERO && event.params.amount > BIG_INT_ZERO) { - pool.userCount = pool.userCount.plus(BIG_INT_ONE) + pool.slpBalance = pool.slpBalance.plus(event.params.amount); + if (user.amount === BIG_INT_ZERO && event.params.amount > BIG_INT_ZERO) { + pool.userCount = pool.userCount.plus(BIG_INT_ONE); } - pool.save() + pool.save(); - user.amount = user.amount.plus(event.params.amount) - user.rewardDebt = user.rewardDebt.plus(event.params.amount.times(pool.accBeetsPerShare).div(ACC_BEETX_PRECISION)) - user.save() + user.amount = user.amount.plus(event.params.amount); + user.rewardDebt = user.rewardDebt.plus( + event.params.amount.times(pool.accBeetsPerShare).div(ACC_BEETX_PRECISION) + ); + user.save(); } export function withdraw(event: Withdraw): void { - log.info('[MasterChefV2] Log Withdraw {} {} {} {}', [ + log.info("[MasterChefV2] Log Withdraw {} {} {} {}", [ event.params.user.toHex(), event.params.pid.toString(), event.params.amount.toString(), - event.params.to.toHex() - ]) - - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) - const user = getUser(event.params.user, event.params.pid, event.block) - - user.amount = user.amount.minus(event.params.amount) - user.rewardDebt = user.rewardDebt.minus(event.params.amount.times(pool.accBeetsPerShare).div(ACC_BEETX_PRECISION)) - user.save() - - pool.slpBalance = pool.slpBalance.minus(event.params.amount) - if(user.amount === BIG_INT_ZERO) { - pool.userCount = pool.userCount.minus(BIG_INT_ONE) + event.params.to.toHex(), + ]); + + const masterChef = getMasterChef(event.block); + const pool = getPool(event.params.pid, event.block); + const user = getUser(event.params.user, event.params.pid, event.block); + + user.amount = user.amount.minus(event.params.amount); + user.rewardDebt = user.rewardDebt.minus( + event.params.amount.times(pool.accBeetsPerShare).div(ACC_BEETX_PRECISION) + ); + user.save(); + + pool.slpBalance = pool.slpBalance.minus(event.params.amount); + if (user.amount === BIG_INT_ZERO) { + pool.userCount = pool.userCount.minus(BIG_INT_ONE); } - pool.save() - + pool.save(); } export function emergencyWithdraw(event: EmergencyWithdraw): void { - log.info('[MasterChefV2] Log Emergency Withdraw {} {} {} {}', [ + log.info("[MasterChefV2] Log Emergency Withdraw {} {} {} {}", [ event.params.user.toHex(), event.params.pid.toString(), event.params.amount.toString(), - event.params.to.toHex() - ]) + event.params.to.toHex(), + ]); - const masterChefV2 = getMasterChef(event.block) - const user = getUser(event.params.user, event.params.pid, event.block) + const masterChefV2 = getMasterChef(event.block); + const user = getUser(event.params.user, event.params.pid, event.block); - user.amount = BIG_INT_ZERO - user.rewardDebt = BIG_INT_ZERO - user.save() + user.amount = BIG_INT_ZERO; + user.rewardDebt = BIG_INT_ZERO; + user.save(); - const pool = getPool(event.params.pid, event.block) - pool.userCount = pool.userCount.minus(BIG_INT_ONE) - pool.save() + const pool = getPool(event.params.pid, event.block); + pool.userCount = pool.userCount.minus(BIG_INT_ONE); + pool.save(); } export function harvest(event: Harvest): void { - log.info('[MasterChefV2] Log Withdraw {} {} {}', [ + log.info("[MasterChefV2] Log Harvest {} {} {}", [ event.params.user.toHex(), event.params.pid.toString(), - event.params.amount.toString() - ]) - - const masterChef = getMasterChef(event.block) - const pool = getPool(event.params.pid, event.block) - const user = getUser(event.params.user, event.params.pid, event.block) - - const accumulatedSushi = user.amount.times(pool.accBeetsPerShare).div(ACC_BEETX_PRECISION) - - user.rewardDebt = accumulatedSushi - user.beetsHarvested = user.beetsHarvested.plus(event.params.amount) - user.save() + event.params.amount.toString(), + ]); + + const masterChef = getMasterChef(event.block); + const user = getUser(event.params.user, event.params.pid, event.block); + const harvest = new HarvestAction( + `${user.id}-${masterChef.beets.toHex()}-${event.block.timestamp}` + ); + harvest.user = user.id; + harvest.token = masterChef.beets; + harvest.amount = event.params.amount; + harvest.block = event.block.number; + harvest.timestamp = event.block.timestamp; + harvest.save(); + + const pool = getPool(event.params.pid, event.block); + + const rewardDebt = user.amount + .times(pool.accBeetsPerShare) + .div(ACC_BEETX_PRECISION); + + user.rewardDebt = rewardDebt; + user.beetsHarvested = user.beetsHarvested.plus(event.params.amount); + user.save(); } diff --git a/subgraphs/masterchefV2/src/mappings/multi-token-rewarder.ts b/subgraphs/masterchefV2/src/mappings/multi-token-rewarder.ts new file mode 100644 index 0000000..4fe0112 --- /dev/null +++ b/subgraphs/masterchefV2/src/mappings/multi-token-rewarder.ts @@ -0,0 +1,39 @@ +import { log } from "@graphprotocol/graph-ts"; +import { HarvestAction } from "../../generated/schema"; +import { LogRewardsPerSecond } from "../../generated/templates/MultiTokenRewarder/MultiTokenRewarder"; +import { LogOnReward } from "../../generated/templates/MultiTokenRewarder/MultiTokenRewarder"; +import { getRewarder, getRewardToken, getUser } from "../entities"; + +export function logRewardsPerSecond(event: LogRewardsPerSecond): void { + const rewardTokens = event.params.rewardTokens; + const rewardsPerSecond = event.params.rewardsPerSecond; + log.info( + "[MasterChefV2:Rewarder] Log Rewards Per Second for MultiToken rewarder. rewards {}", + [rewardsPerSecond.toString()] + ); + + const rewarder = getRewarder(event.address, event.block); + for (let i = 0; i < rewardTokens.length; i++) { + const rewardToken = getRewardToken( + rewarder.id, + rewardTokens[i], + event.block + ); + rewardToken.rewardPerSecond = rewardsPerSecond[i]; + rewardToken.save(); + } +} + +export function logOnReward(event: LogOnReward): void { + const user = getUser(event.params.user, event.params.pid, event.block); + + const harvest = new HarvestAction( + `${user.id}-${event.params.rewardToken.toHex()}-${event.block.timestamp}` + ); + harvest.user = user.id; + harvest.token = event.params.rewardToken; + harvest.amount = event.params.amount; + harvest.block = event.block.number; + harvest.timestamp = event.block.timestamp; + harvest.save(); +} diff --git a/subgraphs/masterchefV2/src/mappings/single-token-rewarder.ts b/subgraphs/masterchefV2/src/mappings/single-token-rewarder.ts new file mode 100644 index 0000000..acee7db --- /dev/null +++ b/subgraphs/masterchefV2/src/mappings/single-token-rewarder.ts @@ -0,0 +1,37 @@ +import { log } from "@graphprotocol/graph-ts"; +import { HarvestAction } from "../../generated/schema"; +import { + LogOnReward, + LogRewardPerSecond, + SingleTokenRewarder as SingleTokenRewarderContract, +} from "../../generated/templates/SingleTokenRewarder/SingleTokenRewarder"; +import { getRewarder, getRewardToken, getUser } from "../entities"; + +export function logRewardPerSecond(event: LogRewardPerSecond): void { + log.info( + "[MasterChefV2:Rewarder] Log Reward Per Second for single token rewarder {}", + [event.params.rewardPerSecond.toString()] + ); + + const rewarder = getRewarder(event.address, event.block); + const rewarderContract = SingleTokenRewarderContract.bind(event.address); + const token = rewarderContract.rewardToken(); + const rewardToken = getRewardToken(rewarder.id, token, event.block); + rewardToken.rewardPerSecond = event.params.rewardPerSecond; + rewardToken.save(); +} + +export function logOnReward(event: LogOnReward): void { + const rewarderContract = SingleTokenRewarderContract.bind(event.address); + const user = getUser(event.params.user, event.params.pid, event.block); + const token = rewarderContract.rewardToken(); + const harvest = new HarvestAction( + `${user.id}-${token.toHex()}-${event.block.timestamp}` + ); + harvest.user = user.id; + harvest.token = token; + harvest.amount = event.params.amount; + harvest.block = event.block.number; + harvest.timestamp = event.block.timestamp; + harvest.save(); +} diff --git a/subgraphs/masterchefV2/template.yaml b/subgraphs/masterchefV2/template.yaml index fd8e994..0202362 100644 --- a/subgraphs/masterchefV2/template.yaml +++ b/subgraphs/masterchefV2/template.yaml @@ -8,12 +8,12 @@ dataSources: name: MasterChefV2 network: {{ network }} source: - address: '{{ address }}' + address: "{{ address }}" abi: MasterChefV2 startBlock: {{ startBlock }} mapping: kind: ethereum/events - apiVersion: 0.0.6 + apiVersion: 0.0.5 language: wasm/assemblyscript file: ./src/mappings/masterchefV2.ts entities: @@ -24,12 +24,10 @@ dataSources: abis: - name: MasterChefV2 file: ./abis/MasterChefV2.json - - name: ConvexRewarder - file: ./abis/ConvexRewarder.json - - name: ComplexRewarder - file: ./abis/ComplexRewarder.json - - name: CloneRewarderTime - file: ./abis/CloneRewarderTime.json + - name: SingleTokenRewarder + file: ./abis/SingleTokenRewarder.json + - name: MultiTokenRewarder + file: ./abis/MultiTokenRewarder.json - name: ERC20 file: ./abis/ERC20.json eventHandlers: @@ -51,20 +49,50 @@ dataSources: handler: updateEmissionRate templates: - kind: ethereum/contract - name: CloneRewarderTime + name: SingleTokenRewarder network: {{ network }} source: - abi: CloneRewarderTime + abi: SingleTokenRewarder mapping: kind: ethereum/events - apiVersion: 0.0.6 + apiVersion: 0.0.5 language: wasm/assemblyscript - file: ./src/mappings/clone-rewarder.ts + file: ./src/mappings/single-token-rewarder.ts entities: - Rewarder abis: - - name: CloneRewarderTime - file: ./abis/CloneRewarderTime.json + - name: SingleTokenRewarder + file: ./abis/SingleTokenRewarder.json + - name: ERC20 + file: ./abis/ERC20.json + - name: MasterChefV2 + file: ./abis/MasterChefV2.json eventHandlers: - event: LogRewardPerSecond(uint256) handler: logRewardPerSecond + - event: LogOnReward(indexed address,indexed uint256,uint256,indexed address) + handler: logOnReward + - kind: ethereum/contract + name: MultiTokenRewarder + network: {{ network }} + source: + abi: MultiTokenRewarder + mapping: + kind: ethereum/events + apiVersion: 0.0.5 + language: wasm/assemblyscript + file: ./src/mappings/multi-token-rewarder.ts + entities: + - Rewarder + abis: + - name: MultiTokenRewarder + file: ./abis/MultiTokenRewarder.json + - name: ERC20 + file: ./abis/ERC20.json + - name: MasterChefV2 + file: ./abis/MasterChefV2.json + eventHandlers: + - event: LogRewardsPerSecond(address[],uint256[]) + handler: logRewardsPerSecond + - event: LogOnReward(indexed address,indexed uint256,address,uint256,indexed address) + handler: logOnReward