Overview
MATIC Balance
0 MATIC
MATIC Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator:
Latest 24 from a total of 24 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
Value | ||||
---|---|---|---|---|---|---|---|---|---|
Mass Update Pool... | 35360845 | 506 days ago | IN | 0 MATIC | 0.11245349 | ||||
Update Pool | 35360845 | 506 days ago | IN | 0 MATIC | 0.21917934 | ||||
Mass Update Pool... | 28915579 | 669 days ago | IN | 0 MATIC | 0.04126155 | ||||
Mass Update Pool... | 28914384 | 669 days ago | IN | 0 MATIC | 0.04126155 | ||||
Mass Update Pool... | 25750000 | 751 days ago | IN | 0 MATIC | 0.02955934 | ||||
Mass Update Pool... | 22603508 | 833 days ago | IN | 0 MATIC | 0.02698635 | ||||
Mass Update Pool... | 18338937 | 948 days ago | IN | 0 MATIC | 0.00039913 | ||||
Mass Update Pool... | 15601358 | 1021 days ago | IN | 0 MATIC | 0.00042743 | ||||
Mass Update Pool... | 15051671 | 1035 days ago | IN | 0 MATIC | 0.00033671 | ||||
Transfer Ownersh... | 14661215 | 1045 days ago | IN | 0 MATIC | 0.00003296 | ||||
Mass Update Pool... | 14661162 | 1045 days ago | IN | 0 MATIC | 0.00019081 | ||||
Set | 14661143 | 1045 days ago | IN | 0 MATIC | 0.00003689 | ||||
Set | 14661135 | 1045 days ago | IN | 0 MATIC | 0.00003689 | ||||
Mass Update Pool... | 14414676 | 1051 days ago | IN | 0 MATIC | 0.00015031 | ||||
Transfer Ownersh... | 14014061 | 1061 days ago | IN | 0 MATIC | 0.00003296 | ||||
Add | 14014033 | 1061 days ago | IN | 0 MATIC | 0.00007798 | ||||
Add | 14013886 | 1061 days ago | IN | 0 MATIC | 0.00007798 | ||||
Add | 14013866 | 1061 days ago | IN | 0 MATIC | 0.00007798 | ||||
Add | 14013736 | 1061 days ago | IN | 0 MATIC | 0.00009298 | ||||
Set Reward Per S... | 13960208 | 1062 days ago | IN | 0 MATIC | 0.00002839 | ||||
Update Pool | 13959645 | 1062 days ago | IN | 0 MATIC | 0.00004046 | ||||
Set | 13959638 | 1062 days ago | IN | 0 MATIC | 0.00005187 | ||||
Set Reward Per S... | 13959586 | 1062 days ago | IN | 0 MATIC | 0.00004339 | ||||
0x60c06040 | 13913130 | 1063 days ago | IN | Create: ComplexRewarderTime | 0 MATIC | 0.00139203 |
Loading...
Loading
Contract Name:
ComplexRewarderTime
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2021-06-24 */ // Sources flattened with hardhat v2.0.11 https://hardhat.org // File @boringcrypto/boring-solidity/contracts/interfaces/[email protected] // SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IERC20 { function totalSupply() external view returns (uint256); function balanceOf(address account) external view returns (uint256); function allowance(address owner, address spender) external view returns (uint256); function approve(address spender, uint256 amount) external returns (bool); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); // EIP 2612 function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] library BoringERC20 { function safeSymbol(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x95d89b41)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeName(IERC20 token) internal view returns(string memory) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x06fdde03)); return success && data.length > 0 ? abi.decode(data, (string)) : "???"; } function safeDecimals(IERC20 token) internal view returns (uint8) { (bool success, bytes memory data) = address(token).staticcall(abi.encodeWithSelector(0x313ce567)); return success && data.length == 32 ? abi.decode(data, (uint8)) : 18; } function safeTransfer(IERC20 token, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0xa9059cbb, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: Transfer failed"); } function safeTransferFrom(IERC20 token, address from, address to, uint256 amount) internal { (bool success, bytes memory data) = address(token).call(abi.encodeWithSelector(0x23b872dd, from, to, amount)); require(success && (data.length == 0 || abi.decode(data, (bool))), "BoringERC20: TransferFrom failed"); } } // File contracts/interfaces/IRewarder.sol interface IRewarder { using BoringERC20 for IERC20; function onSushiReward(uint256 pid, address user, address recipient, uint256 sushiAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 sushiAmount) external view returns (IERC20[] memory, uint256[] memory); } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] // a library for performing overflow-safe math, updated with awesomeness from of DappHub (https://github.com/dapphub/ds-math) library BoringMath { function add(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint256 a, uint256 b) internal pure returns (uint256 c) {require((c = a - b) <= a, "BoringMath: Underflow");} function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {require(b == 0 || (c = a * b)/b == a, "BoringMath: Mul Overflow");} function to128(uint256 a) internal pure returns (uint128 c) { require(a <= uint128(-1), "BoringMath: uint128 Overflow"); c = uint128(a); } function to64(uint256 a) internal pure returns (uint64 c) { require(a <= uint64(-1), "BoringMath: uint64 Overflow"); c = uint64(a); } function to32(uint256 a) internal pure returns (uint32 c) { require(a <= uint32(-1), "BoringMath: uint32 Overflow"); c = uint32(a); } } library BoringMath128 { function add(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint128 a, uint128 b) internal pure returns (uint128 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath64 { function add(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint64 a, uint64 b) internal pure returns (uint64 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } library BoringMath32 { function add(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a + b) >= b, "BoringMath: Add Overflow");} function sub(uint32 a, uint32 b) internal pure returns (uint32 c) {require((c = a - b) <= a, "BoringMath: Underflow");} } // File @boringcrypto/boring-solidity/contracts/[email protected] // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; // Source: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol + Claimable.sol // Edited by BoringCrypto // T1 - T4: OK contract BoringOwnableData { // V1 - V5: OK address public owner; // V1 - V5: OK address public pendingOwner; } // T1 - T4: OK contract BoringOwnable is BoringOwnableData { // E1: OK event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor () public { owner = msg.sender; emit OwnershipTransferred(address(0), msg.sender); } // F1 - F9: OK // C1 - C21: OK function transferOwnership(address newOwner, bool direct, bool renounce) public onlyOwner { if (direct) { // Checks require(newOwner != address(0) || renounce, "Ownable: zero address"); // Effects emit OwnershipTransferred(owner, newOwner); owner = newOwner; pendingOwner = address(0); } else { // Effects pendingOwner = newOwner; } } // F1 - F9: OK // C1 - C21: OK function claimOwnership() public { address _pendingOwner = pendingOwner; // Checks require(msg.sender == _pendingOwner, "Ownable: caller != pending owner"); // Effects emit OwnershipTransferred(owner, _pendingOwner); owner = _pendingOwner; pendingOwner = address(0); } // M1 - M5: OK // C1 - C21: OK modifier onlyOwner() { require(msg.sender == owner, "Ownable: caller is not the owner"); _; } } // File @boringcrypto/boring-solidity/contracts/[email protected] // Audit on 5-Jan-2021 by Keno and BoringCrypto // P1 - P3: OK pragma solidity 0.6.12; pragma experimental ABIEncoderV2; // solhint-disable avoid-low-level-calls // T1 - T4: OK contract BaseBoringBatchable { function _getRevertMsg(bytes memory _returnData) internal pure returns (string memory) { // If the _res length is less than 68, then the transaction failed silently (without a revert message) if (_returnData.length < 68) return "Transaction reverted silently"; assembly { // Slice the sighash. _returnData := add(_returnData, 0x04) } return abi.decode(_returnData, (string)); // All that remains is the revert string } // F3 - F9: OK // F1: External is ok here because this is the batch function, adding it to a batch makes no sense // F2: Calls in the batch may be payable, delegatecall operates in the same context, so each call in the batch has access to msg.value // C1 - C21: OK // C3: The length of the loop is fully under user control, so can't be exploited // C7: Delegatecall is only used on the same contract, so it's safe function batch(bytes[] calldata calls, bool revertOnFail) external payable returns(bool[] memory successes, bytes[] memory results) { // Interactions successes = new bool[](calls.length); results = new bytes[](calls.length); for (uint256 i = 0; i < calls.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(calls[i]); require(success || !revertOnFail, _getRevertMsg(result)); successes[i] = success; results[i] = result; } } } // T1 - T4: OK contract BoringBatchable is BaseBoringBatchable { // F1 - F9: OK // F6: Parameters can be used front-run the permit and the user's permit will fail (due to nonce or other revert) // if part of a batch this could be used to grief once as the second call would not need the permit // C1 - C21: OK function permitToken(IERC20 token, address from, address to, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { // Interactions // X1 - X5 token.permit(from, to, amount, deadline, v, r, s); } } // File contracts/libraries/SignedSafeMath.sol pragma solidity 0.6.12; library SignedSafeMath { int256 constant private _INT256_MIN = -2**255; /** * @dev Returns the multiplication of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(int256 a, int256 b) internal pure returns (int256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } require(!(a == -1 && b == _INT256_MIN), "SignedSafeMath: multiplication overflow"); int256 c = a * b; require(c / a == b, "SignedSafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two signed integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(int256 a, int256 b) internal pure returns (int256) { require(b != 0, "SignedSafeMath: division by zero"); require(!(b == -1 && a == _INT256_MIN), "SignedSafeMath: division overflow"); int256 c = a / b; return c; } /** * @dev Returns the subtraction of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(int256 a, int256 b) internal pure returns (int256) { int256 c = a - b; require((b >= 0 && c <= a) || (b < 0 && c > a), "SignedSafeMath: subtraction overflow"); return c; } /** * @dev Returns the addition of two signed integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(int256 a, int256 b) internal pure returns (int256) { int256 c = a + b; require((b >= 0 && c >= a) || (b < 0 && c < a), "SignedSafeMath: addition overflow"); return c; } function toUInt256(int256 a) internal pure returns (uint256) { require(a >= 0, "Integer < 0"); return uint256(a); } } // File contracts/interfaces/IMasterChef.sol pragma solidity 0.6.12; interface IMasterChef { using BoringERC20 for IERC20; struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. } struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. SUSHI to distribute per block. uint256 lastRewardBlock; // Last block number that SUSHI distribution occurs. uint256 accSushiPerShare; // Accumulated SUSHI per share, times 1e12. See below. } function poolInfo(uint256 pid) external view returns (IMasterChef.PoolInfo memory); function totalAllocPoint() external view returns (uint256); function deposit(uint256 _pid, uint256 _amount) external; } // File contracts/MasterChefV2.sol pragma solidity 0.6.12; interface IMigratorChef { // Take the current LP token address and return the new LP token address. // Migrator should have full access to the caller's LP token. function migrate(IERC20 token) external returns (IERC20); } /// @notice The (older) MasterChef contract gives out a constant number of SUSHI tokens per block. /// It is the only address with minting rights for SUSHI. /// The idea for this MasterChef V2 (MCV2) contract is therefore to be the owner of a dummy token /// that is deposited into the MasterChef V1 (MCV1) contract. /// The allocation point for this pool on MCV1 is the total allocation point for all pools that receive double incentives. contract MasterChefV2 is BoringOwnable, BoringBatchable { using BoringMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; using SignedSafeMath for int256; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of SUSHI entitled to the user. struct UserInfo { uint256 amount; int256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of SUSHI to distribute per block. struct PoolInfo { uint128 accSushiPerShare; uint64 lastRewardBlock; uint64 allocPoint; } /// @notice Address of MCV1 contract. IMasterChef public immutable MASTER_CHEF; /// @notice Address of SUSHI contract. IERC20 public immutable SUSHI; /// @notice The index of MCV2 master pool in MCV1. uint256 public immutable MASTER_PID; // @notice The migrator contract. It has a lot of power. Can only be set through governance (owner). IMigratorChef public migrator; /// @notice Info of each MCV2 pool. PoolInfo[] public poolInfo; /// @notice Address of the LP token for each MCV2 pool. IERC20[] public lpToken; /// @notice Address of each `IRewarder` contract in MCV2. IRewarder[] public rewarder; /// @notice Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint; uint256 private constant MASTERCHEF_SUSHI_PER_BLOCK = 1e20; uint256 private constant ACC_SUSHI_PRECISION = 1e12; event Deposit(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event Harvest(address indexed user, uint256 indexed pid, uint256 amount); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint, IERC20 indexed lpToken, IRewarder indexed rewarder); event LogSetPool(uint256 indexed pid, uint256 allocPoint, IRewarder indexed rewarder, bool overwrite); event LogUpdatePool(uint256 indexed pid, uint64 lastRewardBlock, uint256 lpSupply, uint256 accSushiPerShare); event LogInit(); /// @param _MASTER_CHEF The SushiSwap MCV1 contract address. /// @param _sushi The SUSHI token contract address. /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract. constructor(IMasterChef _MASTER_CHEF, IERC20 _sushi, uint256 _MASTER_PID) public { MASTER_CHEF = _MASTER_CHEF; SUSHI = _sushi; MASTER_PID = _MASTER_PID; } /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for SUSHI. /// Any balance of transaction sender in `dummyToken` is transferred. /// The allocation point for the pool on MCV1 is the total allocation point for all pools that receive double incentives. /// @param dummyToken The address of the ERC-20 token to deposit into MCV1. function init(IERC20 dummyToken) external { uint256 balance = dummyToken.balanceOf(msg.sender); require(balance != 0, "MasterChefV2: Balance must exceed 0"); dummyToken.safeTransferFrom(msg.sender, address(this), balance); dummyToken.approve(address(MASTER_CHEF), balance); MASTER_CHEF.deposit(MASTER_PID, balance); emit LogInit(); } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolInfo.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _lpToken Address of the LP ERC-20 token. /// @param _rewarder Address of the rewarder delegate. function add(uint256 allocPoint, IERC20 _lpToken, IRewarder _rewarder) public onlyOwner { uint256 lastRewardBlock = block.number; totalAllocPoint = totalAllocPoint.add(allocPoint); lpToken.push(_lpToken); rewarder.push(_rewarder); poolInfo.push(PoolInfo({ allocPoint: allocPoint.to64(), lastRewardBlock: lastRewardBlock.to64(), accSushiPerShare: 0 })); emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder); } /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. /// @param _rewarder Address of the rewarder delegate. /// @param overwrite True if _rewarder should be `set`. Otherwise `_rewarder` is ignored. function set(uint256 _pid, uint256 _allocPoint, IRewarder _rewarder, bool overwrite) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint.to64(); if (overwrite) { rewarder[_pid] = _rewarder; } emit LogSetPool(_pid, _allocPoint, overwrite ? _rewarder : rewarder[_pid], overwrite); } /// @notice Set the `migrator` contract. Can only be called by the owner. /// @param _migrator The contract address to set. function setMigrator(IMigratorChef _migrator) public onlyOwner { migrator = _migrator; } /// @notice Migrate LP token to another LP contract through the `migrator` contract. /// @param _pid The index of the pool. See `poolInfo`. function migrate(uint256 _pid) public { require(address(migrator) != address(0), "MasterChefV2: no migrator set"); IERC20 _lpToken = lpToken[_pid]; uint256 bal = _lpToken.balanceOf(address(this)); _lpToken.approve(address(migrator), bal); IERC20 newLpToken = migrator.migrate(_lpToken); require(bal == newLpToken.balanceOf(address(this)), "MasterChefV2: migrated balance must match"); lpToken[_pid] = newLpToken; } /// @notice View function to see pending SUSHI on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending SUSHI reward for a given user. function pendingSushi(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSushiPerShare = pool.accSushiPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply); } pending = int256(user.amount.mul(accSushiPerShare) / ACC_SUSHI_PRECISION).sub(user.rewardDebt).toUInt256(); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Calculates and returns the `amount` of SUSHI per block. function sushiPerBlock() public view returns (uint256 amount) { amount = uint256(MASTERCHEF_SUSHI_PER_BLOCK) .mul(MASTER_CHEF.poolInfo(MASTER_PID).allocPoint) / MASTER_CHEF.totalAllocPoint(); } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.number > pool.lastRewardBlock) { uint256 lpSupply = lpToken[pid].balanceOf(address(this)); if (lpSupply > 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 sushiReward = blocks.mul(sushiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_SUSHI_PRECISION) / lpSupply).to128()); } pool.lastRewardBlock = block.number.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accSushiPerShare); } } /// @notice Deposit LP tokens to MCV2 for SUSHI allocation. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to deposit. /// @param to The receiver of `amount` deposit benefit. function deposit(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][to]; // Effects user.amount = user.amount.add(amount); user.rewardDebt = user.rewardDebt.add(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, to, to, 0, user.amount); } lpToken[pid].safeTransferFrom(msg.sender, address(this), amount); emit Deposit(msg.sender, pid, amount, to); } /// @notice Withdraw LP tokens from MCV2. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens. function withdraw(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; // Effects user.rewardDebt = user.rewardDebt.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, 0, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); } /// @notice Harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of SUSHI rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION); uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedSushi; // Interactions if (_pendingSushi != 0) { SUSHI.safeTransfer(to, _pendingSushi); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward( pid, msg.sender, to, _pendingSushi, user.amount); } emit Harvest(msg.sender, pid, _pendingSushi); } /// @notice Withdraw LP tokens from MCV2 and harvest proceeds for transaction sender to `to`. /// @param pid The index of the pool. See `poolInfo`. /// @param amount LP token amount to withdraw. /// @param to Receiver of the LP tokens and SUSHI rewards. function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedSushi = int256(user.amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION); uint256 _pendingSushi = accumulatedSushi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedSushi.sub(int256(amount.mul(pool.accSushiPerShare) / ACC_SUSHI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions SUSHI.safeTransfer(to, _pendingSushi); IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, _pendingSushi, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingSushi); } /// @notice Harvests SUSHI from `MASTER_CHEF` MCV1 and pool `MASTER_PID` to this MCV2 contract. function harvestFromMasterChef() public { MASTER_CHEF.deposit(MASTER_PID, 0); } /// @notice Withdraw without caring about rewards. EMERGENCY ONLY. /// @param pid The index of the pool. See `poolInfo`. /// @param to Receiver of the LP tokens. function emergencyWithdraw(uint256 pid, address to) public { UserInfo storage user = userInfo[pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onSushiReward(pid, msg.sender, to, 0, 0); } // Note: transfer can fail or succeed if `amount` is zero. lpToken[pid].safeTransfer(to, amount); emit EmergencyWithdraw(msg.sender, pid, amount, to); } } // File contracts/mocks/ComplexRewarderTime.sol pragma solidity 0.6.12; /// @author @0xKeno contract ComplexRewarderTime is IRewarder, BoringOwnable{ using BoringMath for uint256; using BoringMath128 for uint128; using BoringERC20 for IERC20; IERC20 private immutable rewardToken; /// @notice Info of each MCV2 user. /// `amount` LP token amount the user has provided. /// `rewardDebt` The amount of SUSHI entitled to the user. struct UserInfo { uint256 amount; uint256 rewardDebt; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of SUSHI to distribute per block. struct PoolInfo { uint128 accSushiPerShare; uint64 lastRewardTime; uint64 allocPoint; } /// @notice Info of each pool. mapping (uint256 => PoolInfo) public poolInfo; uint256[] public poolIds; /// @notice Info of each user that stakes LP tokens. mapping (uint256 => mapping (address => UserInfo)) public userInfo; /// @dev Total allocation points. Must be the sum of all allocation points in all pools. uint256 totalAllocPoint; uint256 public rewardPerSecond; uint256 private constant ACC_TOKEN_PRECISION = 1e12; address private immutable MASTERCHEF_V2; event LogOnReward(address indexed user, uint256 indexed pid, uint256 amount, address indexed to); event LogPoolAddition(uint256 indexed pid, uint256 allocPoint); event LogSetPool(uint256 indexed pid, uint256 allocPoint); event LogUpdatePool(uint256 indexed pid, uint64 lastRewardTime, uint256 lpSupply, uint256 accSushiPerShare); event LogRewardPerSecond(uint256 rewardPerSecond); event LogInit(); constructor (IERC20 _rewardToken, uint256 _rewardPerSecond, address _MASTERCHEF_V2) public { rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; MASTERCHEF_V2 = _MASTERCHEF_V2; } function onSushiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 override external { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][_user]; uint256 pending; if (user.amount > 0) { pending = (user.amount.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION).sub( user.rewardDebt ); rewardToken.safeTransfer(to, pending); } user.amount = lpToken; user.rewardDebt = lpToken.mul(pool.accSushiPerShare) / ACC_TOKEN_PRECISION; emit LogOnReward(_user, pid, pending, to); } function pendingTokens(uint256 pid, address user, uint256) override external view returns (IERC20[] memory rewardTokens, uint256[] memory rewardAmounts) { IERC20[] memory _rewardTokens = new IERC20[](1); _rewardTokens[0] = (rewardToken); uint256[] memory _rewardAmounts = new uint256[](1); _rewardAmounts[0] = pendingToken(pid, user); return (_rewardTokens, _rewardAmounts); } /// @notice Sets the sushi per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of Sushi to be distributed per second. function setRewardPerSecond(uint256 _rewardPerSecond) public onlyOwner { rewardPerSecond = _rewardPerSecond; emit LogRewardPerSecond(_rewardPerSecond); } modifier onlyMCV2 { require( msg.sender == MASTERCHEF_V2, "Only MCV2 can call this function." ); _; } /// @notice Returns the number of MCV2 pools. function poolLength() public view returns (uint256 pools) { pools = poolIds.length; } /// @notice Add a new LP to the pool. Can only be called by the owner. /// DO NOT add the same LP token more than once. Rewards will be messed up if you do. /// @param allocPoint AP of the new pool. /// @param _pid Pid on MCV2 function add(uint256 allocPoint, uint256 _pid) public onlyOwner { require(poolInfo[_pid].lastRewardTime == 0, "Pool already exists"); uint256 lastRewardTime = block.timestamp; totalAllocPoint = totalAllocPoint.add(allocPoint); poolInfo[_pid] = PoolInfo({ allocPoint: allocPoint.to64(), lastRewardTime: lastRewardTime.to64(), accSushiPerShare: 0 }); poolIds.push(_pid); emit LogPoolAddition(_pid, allocPoint); } /// @notice Update the given pool's SUSHI allocation point and `IRewarder` contract. Can only be called by the owner. /// @param _pid The index of the pool. See `poolInfo`. /// @param _allocPoint New AP of the pool. function set(uint256 _pid, uint256 _allocPoint) public onlyOwner { totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint.to64(); emit LogSetPool(_pid, _allocPoint); } /// @notice View function to see pending Token /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending SUSHI reward for a given user. function pendingToken(uint256 _pid, address _user) public view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accSushiPerShare = pool.accSushiPerShare; uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(_pid).balanceOf(MASTERCHEF_V2); if (block.timestamp > pool.lastRewardTime && lpSupply != 0) { uint256 time = block.timestamp.sub(pool.lastRewardTime); uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; accSushiPerShare = accSushiPerShare.add(sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply); } pending = (user.amount.mul(accSushiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt); } /// @notice Update reward variables for all pools. Be careful of gas spending! /// @param pids Pool IDs of all to be updated. Make sure to update all active pools. function massUpdatePools(uint256[] calldata pids) external { uint256 len = pids.length; for (uint256 i = 0; i < len; ++i) { updatePool(pids[i]); } } /// @notice Update reward variables of the given pool. /// @param pid The index of the pool. See `poolInfo`. /// @return pool Returns the pool that was updated. function updatePool(uint256 pid) public returns (PoolInfo memory pool) { pool = poolInfo[pid]; if (block.timestamp > pool.lastRewardTime) { uint256 lpSupply = MasterChefV2(MASTERCHEF_V2).lpToken(pid).balanceOf(MASTERCHEF_V2); if (lpSupply > 0) { uint256 time = block.timestamp.sub(pool.lastRewardTime); uint256 sushiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; pool.accSushiPerShare = pool.accSushiPerShare.add((sushiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128()); } pool.lastRewardTime = block.timestamp.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accSushiPerShare); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"},{"internalType":"address","name":"_MASTERCHEF_V2","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"LogInit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"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":"uint256","name":"rewardPerSecond","type":"uint256"}],"name":"LogRewardPerSecond","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":false,"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"lpSupply","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"accSushiPerShare","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":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"pids","type":"uint256[]"}],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"lpToken","type":"uint256"}],"name":"onSushiReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingToken","outputs":[{"internalType":"uint256","name":"pending","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"pendingTokens","outputs":[{"internalType":"contract IERC20[]","name":"rewardTokens","type":"address[]"},{"internalType":"uint256[]","name":"rewardAmounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"uint128","name":"accSushiPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"pools","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerSecond","type":"uint256"}],"name":"setRewardPerSecond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"},{"internalType":"bool","name":"direct","type":"bool"},{"internalType":"bool","name":"renounce","type":"bool"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"pid","type":"uint256"}],"name":"updatePool","outputs":[{"components":[{"internalType":"uint128","name":"accSushiPerShare","type":"uint128"},{"internalType":"uint64","name":"lastRewardTime","type":"uint64"},{"internalType":"uint64","name":"allocPoint","type":"uint64"}],"internalType":"struct ComplexRewarderTime.PoolInfo","name":"pool","type":"tuple"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c06040523480156200001157600080fd5b50604051620018f9380380620018f9833981016040819052620000349162000099565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b811660805260069290925590911b1660a052620000f9565b600080600060608486031215620000ae578283fd5b8351620000bb81620000e0565b602085015160408601519194509250620000d581620000e0565b809150509250925092565b6001600160a01b0381168114620000f657600080fd5b50565b60805160601c60a05160601c6117bd6200013c6000398061051352806105a8528061081852806108ad5280610cfc525080610dad5280610ebb52506117bd6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c806366da5815116100a25780638da5cb5b116100715780638da5cb5b146102125780638f10369a1461022757806393f1a40b1461022f578063d63b3c4914610250578063e30c3978146102715761010b565b806366da5815146101c657806369883b4e146101d9578063771602f7146101ec5780638bf63742146101ff5761010b565b806348e43af4116100de57806348e43af4146101785780634e71e0c81461018b57806351eb05a61461019357806357a5b58c146101b35761010b565b8063078dfbe714610110578063081e3eda146101255780631526fe27146101435780631ab06ee514610165575b600080fd5b61012361011e366004611177565b610279565b005b61012d610368565b60405161013a9190611720565b60405180910390f35b61015661015136600461126e565b61036e565b60405161013a939291906116f6565b610123610173366004611355565b6103a5565b61012d61018636600461129e565b610484565b610123610712565b6101a66101a136600461126e565b61079f565b60405161013a91906116bd565b6101236101c13660046111c1565b610a9d565b6101236101d436600461126e565b610ad3565b61012d6101e736600461126e565b610b3d565b6101236101fa366004611355565b610b5b565b61012361020d3660046112cd565b610cf1565b61021a610e5a565b60405161013a91906113b7565b61012d610e69565b61024261023d36600461129e565b610e6f565b60405161013a929190611729565b61026361025e36600461131e565b610e93565b60405161013a9291906113e4565b61021a610f52565b6000546001600160a01b031633146102ac5760405162461bcd60e51b81526004016102a3906115e5565b60405180910390fd5b8115610347576001600160a01b0383161515806102c65750805b6102e25760405162461bcd60e51b81526004016102a390611548565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610363565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103cf5760405162461bcd60e51b81526004016102a3906115e5565b60008281526002602052604090205460055461040691839161040091600160c01b90046001600160401b0316610f61565b90610f8a565b60055561041281610fad565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c90610478908490611720565b60405180910390a25050565b600061048e611157565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f0000000000000000000000000000000000000000000000000000000000000000909216916378ed5d1f91610548918b9101611720565b60206040518083038186803b15801561056057600080fd5b505afa158015610574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105989190611252565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016105e391906113b7565b60206040518083038186803b1580156105fb57600080fd5b505afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190611286565b905083602001516001600160401b03164211801561065057508015155b156106dc57600061067785602001516001600160401b031642610f6190919063ffffffff16565b905060006005546106aa87604001516001600160401b03166106a460065486610fda90919063ffffffff16565b90610fda565b816106b157fe5b0490506106d7836106c78364e8d4a51000610fda565b816106ce57fe5b86919004610f8a565b935050505b60018301548354610707919064e8d4a51000906106f99086610fda565b8161070057fe5b0490610f61565b979650505050505050565b6001546001600160a01b031633811461073d5760405162461bcd60e51b81526004016102a39061161a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6107a7611157565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252421115610a98576040516378ed5d1f60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f9061084d908690600401611720565b60206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190611252565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b81526004016108e891906113b7565b60206040518083038186803b15801561090057600080fd5b505afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109389190611286565b905080156109db57600061096283602001516001600160401b031642610f6190919063ffffffff16565b9050600060055461098f85604001516001600160401b03166106a460065486610fda90919063ffffffff16565b8161099657fe5b0490506109cd6109bc846109af8464e8d4a51000610fda565b816109b657fe5b04611011565b85516001600160801b03169061103a565b6001600160801b0316845250505b6109e442610fad565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610a8e9290918691611737565b60405180910390a2505b919050565b8060005b81811015610acd57610ac4848483818110610ab857fe5b9050602002013561079f565b50600101610aa1565b50505050565b6000546001600160a01b03163314610afd5760405162461bcd60e51b81526004016102a3906115e5565b60068190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610b32908390611720565b60405180910390a150565b60038181548110610b4a57fe5b600091825260209091200154905081565b6000546001600160a01b03163314610b855760405162461bcd60e51b81526004016102a3906115e5565b600081815260026020526040902054600160801b90046001600160401b031615610bc15760405162461bcd60e51b81526004016102a3906114a3565b6005544290610bd09084610f8a565b60055560408051606081019091526000815260208101610bef83610fad565b6001600160401b03168152602001610c0685610fad565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610ce4908690611720565b60405180910390a2505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d395760405162461bcd60e51b81526004016102a390611507565b610d41611157565b610d4a8661079f565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610dd457600182015483518354610d9e929164e8d4a51000916106f9916001600160801b0316610fda565b9050610dd46001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168783611069565b838255825164e8d4a5100090610df49086906001600160801b0316610fda565b81610dfb57fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b84604051610e489190611720565b60405180910390a45050505050505050565b6000546001600160a01b031681565b60065481565b60046020908152600092835260408084209091529082529020805460019091015482565b60408051600180825281830190925260609182918291602080830190803683370190505090507f000000000000000000000000000000000000000000000000000000000000000081600081518110610ee757fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050610f2e8787610484565b81600081518110610f3b57fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b80820382811115610f845760405162461bcd60e51b81526004016102a390611474565b92915050565b81810181811015610f845760405162461bcd60e51b81526004016102a3906115ae565b60006001600160401b03821115610fd65760405162461bcd60e51b81526004016102a39061164f565b5090565b6000811580610ff557505080820282828281610ff257fe5b04145b610f845760405162461bcd60e51b81526004016102a390611686565b60006001600160801b03821115610fd65760405162461bcd60e51b81526004016102a390611577565b8181016001600160801b038083169082161015610f845760405162461bcd60e51b81526004016102a3906115ae565b60006060846001600160a01b031663a9059cbb858560405160240161108f9291906113cb565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516110c8919061137e565b6000604051808303816000865af19150503d8060008114611105576040519150601f19603f3d011682016040523d82523d6000602084013e61110a565b606091505b5091509150818015611134575080511580611134575080806020019051810190611134919061122f565b6111505760405162461bcd60e51b81526004016102a3906114d0565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b60008060006060848603121561118b578283fd5b833561119681611761565b925060208401356111a681611779565b915060408401356111b681611779565b809150509250925092565b600080602083850312156111d3578182fd5b82356001600160401b03808211156111e9578384fd5b818501915085601f8301126111fc578384fd5b81358181111561120a578485fd5b866020808302850101111561121d578485fd5b60209290920196919550909350505050565b600060208284031215611240578081fd5b815161124b81611779565b9392505050565b600060208284031215611263578081fd5b815161124b81611761565b60006020828403121561127f578081fd5b5035919050565b600060208284031215611297578081fd5b5051919050565b600080604083850312156112b0578182fd5b8235915060208301356112c281611761565b809150509250929050565b600080600080600060a086880312156112e4578081fd5b8535945060208601356112f681611761565b9350604086013561130681611761565b94979396509394606081013594506080013592915050565b600080600060608486031215611332578283fd5b83359250602084013561134481611761565b929592945050506040919091013590565b60008060408385031215611367578182fd5b50508035926020909101359150565b815260200190565b60008251815b8181101561139e5760208186018101518583015201611384565b818111156113ac5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156114265781516001600160a01b031684529284019290840190600101611401565b5050508381038285015280855161143d8184611720565b91508387019250845b8181101561146757611459838551611376565b938501939250600101611446565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b038116811461177657600080fd5b50565b801515811461177657600080fdfea2646970667358221220aa14a3dc4ecc4f67ff28feb8d591f8fc7e542d35f0f2d01c3ab01f97090e7f9764736f6c634300060c00330000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c806366da5815116100a25780638da5cb5b116100715780638da5cb5b146102125780638f10369a1461022757806393f1a40b1461022f578063d63b3c4914610250578063e30c3978146102715761010b565b806366da5815146101c657806369883b4e146101d9578063771602f7146101ec5780638bf63742146101ff5761010b565b806348e43af4116100de57806348e43af4146101785780634e71e0c81461018b57806351eb05a61461019357806357a5b58c146101b35761010b565b8063078dfbe714610110578063081e3eda146101255780631526fe27146101435780631ab06ee514610165575b600080fd5b61012361011e366004611177565b610279565b005b61012d610368565b60405161013a9190611720565b60405180910390f35b61015661015136600461126e565b61036e565b60405161013a939291906116f6565b610123610173366004611355565b6103a5565b61012d61018636600461129e565b610484565b610123610712565b6101a66101a136600461126e565b61079f565b60405161013a91906116bd565b6101236101c13660046111c1565b610a9d565b6101236101d436600461126e565b610ad3565b61012d6101e736600461126e565b610b3d565b6101236101fa366004611355565b610b5b565b61012361020d3660046112cd565b610cf1565b61021a610e5a565b60405161013a91906113b7565b61012d610e69565b61024261023d36600461129e565b610e6f565b60405161013a929190611729565b61026361025e36600461131e565b610e93565b60405161013a9291906113e4565b61021a610f52565b6000546001600160a01b031633146102ac5760405162461bcd60e51b81526004016102a3906115e5565b60405180910390fd5b8115610347576001600160a01b0383161515806102c65750805b6102e25760405162461bcd60e51b81526004016102a390611548565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610363565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103cf5760405162461bcd60e51b81526004016102a3906115e5565b60008281526002602052604090205460055461040691839161040091600160c01b90046001600160401b0316610f61565b90610f8a565b60055561041281610fad565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c90610478908490611720565b60405180910390a25050565b600061048e611157565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f909216916378ed5d1f91610548918b9101611720565b60206040518083038186803b15801561056057600080fd5b505afa158015610574573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105989190611252565b6001600160a01b03166370a082317f0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f6040518263ffffffff1660e01b81526004016105e391906113b7565b60206040518083038186803b1580156105fb57600080fd5b505afa15801561060f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106339190611286565b905083602001516001600160401b03164211801561065057508015155b156106dc57600061067785602001516001600160401b031642610f6190919063ffffffff16565b905060006005546106aa87604001516001600160401b03166106a460065486610fda90919063ffffffff16565b90610fda565b816106b157fe5b0490506106d7836106c78364e8d4a51000610fda565b816106ce57fe5b86919004610f8a565b935050505b60018301548354610707919064e8d4a51000906106f99086610fda565b8161070057fe5b0490610f61565b979650505050505050565b6001546001600160a01b031633811461073d5760405162461bcd60e51b81526004016102a39061161a565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6107a7611157565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252421115610a98576040516378ed5d1f60e01b81526000906001600160a01b037f0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f16906378ed5d1f9061084d908690600401611720565b60206040518083038186803b15801561086557600080fd5b505afa158015610879573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061089d9190611252565b6001600160a01b03166370a082317f0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f6040518263ffffffff1660e01b81526004016108e891906113b7565b60206040518083038186803b15801561090057600080fd5b505afa158015610914573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109389190611286565b905080156109db57600061096283602001516001600160401b031642610f6190919063ffffffff16565b9050600060055461098f85604001516001600160401b03166106a460065486610fda90919063ffffffff16565b8161099657fe5b0490506109cd6109bc846109af8464e8d4a51000610fda565b816109b657fe5b04611011565b85516001600160801b03169061103a565b6001600160801b0316845250505b6109e442610fad565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610a8e9290918691611737565b60405180910390a2505b919050565b8060005b81811015610acd57610ac4848483818110610ab857fe5b9050602002013561079f565b50600101610aa1565b50505050565b6000546001600160a01b03163314610afd5760405162461bcd60e51b81526004016102a3906115e5565b60068190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610b32908390611720565b60405180910390a150565b60038181548110610b4a57fe5b600091825260209091200154905081565b6000546001600160a01b03163314610b855760405162461bcd60e51b81526004016102a3906115e5565b600081815260026020526040902054600160801b90046001600160401b031615610bc15760405162461bcd60e51b81526004016102a3906114a3565b6005544290610bd09084610f8a565b60055560408051606081019091526000815260208101610bef83610fad565b6001600160401b03168152602001610c0685610fad565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610ce4908690611720565b60405180910390a2505050565b336001600160a01b037f0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f1614610d395760405162461bcd60e51b81526004016102a390611507565b610d41611157565b610d4a8661079f565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610dd457600182015483518354610d9e929164e8d4a51000916106f9916001600160801b0316610fda565b9050610dd46001600160a01b037f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270168783611069565b838255825164e8d4a5100090610df49086906001600160801b0316610fda565b81610dfb57fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b84604051610e489190611720565b60405180910390a45050505050505050565b6000546001600160a01b031681565b60065481565b60046020908152600092835260408084209091529082529020805460019091015482565b60408051600180825281830190925260609182918291602080830190803683370190505090507f0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127081600081518110610ee757fe5b6001600160a01b039290921660209283029190910190910152604080516001808252818301909252606091816020016020820280368337019050509050610f2e8787610484565b81600081518110610f3b57fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b80820382811115610f845760405162461bcd60e51b81526004016102a390611474565b92915050565b81810181811015610f845760405162461bcd60e51b81526004016102a3906115ae565b60006001600160401b03821115610fd65760405162461bcd60e51b81526004016102a39061164f565b5090565b6000811580610ff557505080820282828281610ff257fe5b04145b610f845760405162461bcd60e51b81526004016102a390611686565b60006001600160801b03821115610fd65760405162461bcd60e51b81526004016102a390611577565b8181016001600160801b038083169082161015610f845760405162461bcd60e51b81526004016102a3906115ae565b60006060846001600160a01b031663a9059cbb858560405160240161108f9291906113cb565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516110c8919061137e565b6000604051808303816000865af19150503d8060008114611105576040519150601f19603f3d011682016040523d82523d6000602084013e61110a565b606091505b5091509150818015611134575080511580611134575080806020019051810190611134919061122f565b6111505760405162461bcd60e51b81526004016102a3906114d0565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b60008060006060848603121561118b578283fd5b833561119681611761565b925060208401356111a681611779565b915060408401356111b681611779565b809150509250925092565b600080602083850312156111d3578182fd5b82356001600160401b03808211156111e9578384fd5b818501915085601f8301126111fc578384fd5b81358181111561120a578485fd5b866020808302850101111561121d578485fd5b60209290920196919550909350505050565b600060208284031215611240578081fd5b815161124b81611779565b9392505050565b600060208284031215611263578081fd5b815161124b81611761565b60006020828403121561127f578081fd5b5035919050565b600060208284031215611297578081fd5b5051919050565b600080604083850312156112b0578182fd5b8235915060208301356112c281611761565b809150509250929050565b600080600080600060a086880312156112e4578081fd5b8535945060208601356112f681611761565b9350604086013561130681611761565b94979396509394606081013594506080013592915050565b600080600060608486031215611332578283fd5b83359250602084013561134481611761565b929592945050506040919091013590565b60008060408385031215611367578182fd5b50508035926020909101359150565b815260200190565b60008251815b8181101561139e5760208186018101518583015201611384565b818111156113ac5782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156114265781516001600160a01b031684529284019290840190600101611401565b5050508381038285015280855161143d8184611720565b91508387019250845b8181101561146757611459838551611376565b938501939250600101611446565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b918252602082015260400190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b038116811461177657600080fd5b50565b801515811461177657600080fdfea2646970667358221220aa14a3dc4ecc4f67ff28feb8d591f8fc7e542d35f0f2d01c3ab01f97090e7f9764736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf127000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270
Arg [1] : _rewardPerSecond (uint256): 0
Arg [2] : _MASTERCHEF_V2 (address): 0x0769fd68dFb93167989C6f7254cd0D766Fb2841F
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000d500b1d8e8ef31e21c99d1db9a6444d3adf1270
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000769fd68dfb93167989c6f7254cd0d766fb2841f
Deployed Bytecode Sourcemap
27923:7461:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5601:472;;;;;;:::i;:::-;;:::i;:::-;;31599:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28738:45;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;32711:267::-;;;;;;:::i;:::-;;:::i;33193:811::-;;;;;;:::i;:::-;;:::i;6122:348::-;;;:::i;34563:816::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;34186:193::-;;;;;;:::i;:::-;;:::i;31197:176::-;;;;;;:::i;:::-;;:::i;28792:24::-;;;;;;:::i;:::-;;:::i;31953:519::-;;;;;;:::i;:::-;;:::i;29889:684::-;;;;;;:::i;:::-;;:::i;5177:20::-;;;:::i;:::-;;;;;;;:::i;29082:30::-;;;:::i;28883:66::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;30585:426::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;5224:27::-;;;:::i;5601:472::-;6573:5;;-1:-1:-1;;;;;6573:5:0;6559:10;:19;6551:64;;;;-1:-1:-1;;;6551:64:0;;;;;;;:::i;:::-;;;;;;;;;5706:6:::1;5702:364;;;-1:-1:-1::0;;;;;5760:22:0;::::1;::::0;::::1;::::0;:34:::1;;;5786:8;5760:34;5752:68;;;;-1:-1:-1::0;;;5752:68:0::1;;;;;;;:::i;:::-;5887:5;::::0;;5866:37:::1;::::0;-1:-1:-1;;;;;5866:37:0;;::::1;::::0;5887:5;::::1;::::0;5866:37:::1;::::0;::::1;5918:5;:16:::0;;-1:-1:-1;;;;;5918:16:0;::::1;-1:-1:-1::0;;;;;;5918:16:0;;::::1;;::::0;;;;5949:25;;;;::::1;::::0;;5702:364:::1;;;6031:12;:23:::0;;-1:-1:-1;;;;;;6031:23:0::1;-1:-1:-1::0;;;;;6031:23:0;::::1;;::::0;;5702:364:::1;5601:472:::0;;;:::o;31599:99::-;31676:7;:14;;31599:99::o;28738:45::-;;;;;;;;;;;;-1:-1:-1;;;;;28738:45:0;;;-1:-1:-1;;;;;;;;28738:45:0;;;;;-1:-1:-1;;;28738:45:0;;;;:::o;32711:267::-;6573:5;;-1:-1:-1;;;;;6573:5:0;6559:10;:19;6551:64;;;;-1:-1:-1;;;6551:64:0;;;;;;;:::i;:::-;32825:14:::1;::::0;;;:8:::1;:14;::::0;;;;:25;32805:15:::1;::::0;:63:::1;::::0;32856:11;;32805:46:::1;::::0;-1:-1:-1;;;32825:25:0;::::1;-1:-1:-1::0;;;;;32825:25:0::1;32805:19;:46::i;:::-;:50:::0;::::1;:63::i;:::-;32787:15;:81:::0;32907:18:::1;:11:::0;:16:::1;:18::i;:::-;32879:14;::::0;;;:8:::1;:14;::::0;;;;;;:46;;-1:-1:-1;;;;;32879:46:0;;;::::1;-1:-1:-1::0;;;32879:46:0::1;-1:-1:-1::0;;;;;32879:46:0;;::::1;::::0;;;::::1;::::0;;;32941:29;32888:4;;32941:29:::1;::::0;::::1;::::0;32958:11;;32941:29:::1;:::i;:::-;;;;;;;;32711:267:::0;;:::o;33193:811::-;33265:15;33293:20;;:::i;:::-;-1:-1:-1;33316:14:0;;;;:8;:14;;;;;;;;33293:37;;;;;;;;;-1:-1:-1;;;;;33293:37:0;;;;;-1:-1:-1;;;;;;;;33293:37:0;;;;;;;;-1:-1:-1;;;33293:37:0;;;;;;;;;;33365:14;;;:8;:14;;;;;;-1:-1:-1;;;;;33365:21:0;;;;;;;;;;33424;;33475:41;;-1:-1:-1;;;33475:41:0;;33293:37;;33365:21;;33397:48;;;;;33316:14;;33488:13;33475:35;;;;;;:41;;33325:4;;33475:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;33475:51:0;;33527:13;33475:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33456:85;;33574:4;:19;;;-1:-1:-1;;;;;33556:37:0;:15;:37;:54;;;;-1:-1:-1;33597:13:0;;;33556:54;33552:346;;;33627:12;33642:40;33662:4;:19;;;-1:-1:-1;;;;;33642:40:0;:15;:19;;:40;;;;:::i;:::-;33627:55;;33697:19;33768:15;;33719:46;33749:4;:15;;;-1:-1:-1;;;;;33719:46:0;:25;33728:15;;33719:4;:8;;:25;;;;:::i;:::-;:29;;:46::i;:::-;:64;;;;;;;-1:-1:-1;33817:69:0;33877:8;33838:36;33719:64;29166:4;33838:15;:36::i;:::-;:47;;;;;33817:16;;33838:47;;33817:20;:69::i;:::-;33798:88;;33552:346;;;33980:15;;;;33919:11;;33918:78;;33980:15;29166:4;;33919:33;;33935:16;33919:15;:33::i;:::-;:55;;;;;;;33918:61;:78::i;:::-;33908:88;33193:811;-1:-1:-1;;;;;;;33193:811:0:o;6122:348::-;6190:12;;-1:-1:-1;;;;;6190:12:0;6250:10;:27;;6242:72;;;;-1:-1:-1;;;6242:72:0;;;;;;;:::i;:::-;6373:5;;;6352:42;;-1:-1:-1;;;;;6352:42:0;;;;6373:5;;;6352:42;;;6405:5;:21;;-1:-1:-1;;;;;6405:21:0;;;-1:-1:-1;;;;;;6405:21:0;;;;;;;6437:25;;;;;;;6122:348::o;34563:816::-;34612:20;;:::i;:::-;-1:-1:-1;34652:13:0;;;;:8;:13;;;;;;;;;34645:20;;;;;;;;;-1:-1:-1;;;;;34645:20:0;;;;-1:-1:-1;;;;;;;;34645:20:0;;;;;;;;;;-1:-1:-1;;;34645:20:0;;;;;;;;;;;34680:15;:37;34676:696;;;34753:40;;-1:-1:-1;;;34753:40:0;;34734:16;;-1:-1:-1;;;;;34766:13:0;34753:35;;;;:40;;34789:3;;34753:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;34753:50:0;;34804:13;34753:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34734:84;-1:-1:-1;34839:12:0;;34835:340;;34872:12;34887:40;34907:4;:19;;;-1:-1:-1;;;;;34887:40:0;:15;:19;;:40;;;;:::i;:::-;34872:55;;34946:19;35017:15;;34968:46;34998:4;:15;;;-1:-1:-1;;;;;34968:46:0;:25;34977:15;;34968:4;:8;;:25;;;;:::i;:46::-;:64;;;;;;;-1:-1:-1;35075:84:0;35101:57;35141:8;35102:36;34968:64;29166:4;35102:15;:36::i;:::-;:47;;;;;;35101:55;:57::i;:::-;35075:21;;-1:-1:-1;;;;;35075:25:0;;;:84::i;:::-;-1:-1:-1;;;;;35051:108:0;;;-1:-1:-1;;34835:340:0;35211:22;:15;:20;:22::i;:::-;-1:-1:-1;;;;;35189:44:0;;;:19;;;;:44;;;35248:13;;;;:8;:13;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;;35248:20:0;;;-1:-1:-1;;;;;35248:20:0;;;-1:-1:-1;;;;35248:20:0;-1:-1:-1;;;35248:20:0;;;;;-1:-1:-1;;;;;35248:20:0;-1:-1:-1;;;35248:20:0;;;;;;;;;;;;;;35288:72;35248:13;;35288:72;;;;35248:20;;35328:8;;35288:72;:::i;:::-;;;;;;;;34676:696;;34563:816;;;:::o;34186:193::-;34270:4;34256:11;34292:80;34316:3;34312:1;:7;34292:80;;;34341:19;34352:4;;34357:1;34352:7;;;;;;;;;;;;;34341:10;:19::i;:::-;-1:-1:-1;34321:3:0;;34292:80;;;;34186:193;;;:::o;31197:176::-;6573:5;;-1:-1:-1;;;;;6573:5:0;6559:10;:19;6551:64;;;;-1:-1:-1;;;6551:64:0;;;;;;;:::i;:::-;31279:15:::1;:34:::0;;;31329:36:::1;::::0;::::1;::::0;::::1;::::0;31297:16;;31329:36:::1;:::i;:::-;;;;;;;;31197:176:::0;:::o;28792:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28792:24:0;:::o;31953:519::-;6573:5;;-1:-1:-1;;;;;6573:5:0;6559:10;:19;6551:64;;;;-1:-1:-1;;;6551:64:0;;;;;;;:::i;:::-;32036:14:::1;::::0;;;:8:::1;:14;::::0;;;;:29;-1:-1:-1;;;32036:29:0;::::1;-1:-1:-1::0;;;;;32036:29:0::1;:34:::0;32028:66:::1;;;;-1:-1:-1::0;;;32028:66:0::1;;;;;;;:::i;:::-;32174:15;::::0;32130::::1;::::0;32174:31:::1;::::0;32194:10;32174:19:::1;:31::i;:::-;32156:15;:49:::0;32235:151:::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;32235:151:0;;::::1;::::0;::::1;32319:21;:14:::0;:19:::1;:21::i;:::-;-1:-1:-1::0;;;;;32235:151:0::1;;;;;32271:17;:10;:15;:17::i;:::-;-1:-1:-1::0;;;;;32235:151:0;;::::1;::::0;;;32218:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:168;;;;;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;;32218:168:0::1;-1:-1:-1::0;;;;;32218:168:0;;;::::1;-1:-1:-1::0;;;32218:168:0::1;-1:-1:-1::0;;;;;;;;;32218:168:0;;::::1;-1:-1:-1::0;;;;;;32218:168:0;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;32397:7:::1;:18:::0;;32218:168;32397:18;::::1;::::0;;;;;::::1;::::0;;;32431:33;32227:4;;32431:33:::1;::::0;::::1;::::0;32453:10;;32431:33:::1;:::i;:::-;;;;;;;;6626:1;31953:519:::0;;:::o;29889:684::-;31432:10;-1:-1:-1;;;;;31446:13:0;31432:27;;31410:110;;;;-1:-1:-1;;;31410:110:0;;;;;;;:::i;:::-;30017:20:::1;;:::i;:::-;30040:15;30051:3;30040:10;:15::i;:::-;30066:21;30090:13:::0;;;:8:::1;:13;::::0;;;;;;;-1:-1:-1;;;;;30090:20:0;::::1;::::0;;;;;;;30151:11;;30017:38;;-1:-1:-1;30090:20:0;30151:15;30147:250:::1;;30299:15;::::0;::::1;::::0;30227:21;;30211:11;;30210:123:::1;::::0;30299:15;29166:4:::1;::::0;30211:38:::1;::::0;-1:-1:-1;;;;;30211:38:0::1;:15;:38::i;30210:123::-;30183:150:::0;-1:-1:-1;30348:37:0::1;-1:-1:-1::0;;;;;30348:11:0::1;:24;30373:2:::0;30183:150;30348:24:::1;:37::i;:::-;30407:21:::0;;;30469;;29166:4:::1;::::0;30457:34:::1;::::0;30421:7;;-1:-1:-1;;;;;30457:34:0::1;:11;:34::i;:::-;:56;;;;;;30439:4;:15;;:74;;;;30562:2;-1:-1:-1::0;;;;;30529:36:0::1;30548:3;30541:5;-1:-1:-1::0;;;;;30529:36:0::1;;30553:7;30529:36;;;;;;:::i;:::-;;;;;;;;31531:1;;;29889:684:::0;;;;;:::o;5177:20::-;;;-1:-1:-1;;;;;5177:20:0;;:::o;29082:30::-;;;;:::o;28883:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30585:426::-;30781:15;;;30794:1;30781:15;;;;;;;;;30676:28;;;;;;30781:15;;;;;;;;;;;-1:-1:-1;30781:15:0;30749:47;;30827:11;30807:13;30821:1;30807:16;;;;;;;;-1:-1:-1;;;;;30807:32:0;;;;:16;;;;;;;;;;;:32;30884:16;;;30898:1;30884:16;;;;;;;;;30850:31;;30884:16;;;;;;;;;;;;-1:-1:-1;30884:16:0;30850:50;;30931:23;30944:3;30949:4;30931:12;:23::i;:::-;30911:14;30926:1;30911:17;;;;;;;;;;;;;;;;;:43;30973:13;;;;-1:-1:-1;30585:426:0;-1:-1:-1;;;;30585:426:0:o;5224:27::-;;;-1:-1:-1;;;;;5224:27:0;;:::o;3166:122::-;3249:5;;;3244:16;;;;3236:50;;;;-1:-1:-1;;;3236:50:0;;;;;;;:::i;:::-;3166:122;;;;:::o;3035:125::-;3118:5;;;3113:16;;;;3105:53;;;;-1:-1:-1;;;3105:53:0;;;;;;;:::i;3604:156::-;3652:8;-1:-1:-1;;;;;3681:15:0;;;3673:55;;;;-1:-1:-1;;;3673:55:0;;;;;;;:::i;:::-;-1:-1:-1;3750:1:0;3604:156::o;3294:137::-;3352:9;3372:6;;;:28;;-1:-1:-1;;3387:5:0;;;3399:1;3394;3387:5;3394:1;3382:13;;;;;:18;3372:28;3364:65;;;;-1:-1:-1;;;3364:65:0;;;;;;;:::i;3437:161::-;3486:9;-1:-1:-1;;;;;3516:16:0;;;3508:57;;;;-1:-1:-1;;;3508:57:0;;;;;;;:::i;3958:125::-;4041:5;;;-1:-1:-1;;;;;4036:16:0;;;;;;;;4028:53;;;;-1:-1:-1;;;4028:53:0;;;;;;;:::i;1774:304::-;1859:12;1873:17;1902:5;-1:-1:-1;;;;;1894:19:0;1937:10;1949:2;1953:6;1914:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;1914:46:0;;;;;;;;;;;1894:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1858:103;;;;1980:7;:57;;;;-1:-1:-1;1992:11:0;;:16;;:44;;;2023:4;2012:24;;;;;;;;;;;;:::i;:::-;1972:98;;;;-1:-1:-1;;;1972:98:0;;;;;;;:::i;:::-;1774:304;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1231:479::-;;;;1363:2;1351:9;1342:7;1338:23;1334:32;1331:2;;;-1:-1;;1369:12;1331:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1421:63;-1:-1;1521:2;1557:22;;584:20;609:30;584:20;609:30;:::i;:::-;1529:60;-1:-1;1626:2;1662:22;;584:20;609:30;584:20;609:30;:::i;:::-;1634:60;;;;1325:385;;;;;:::o;1717:397::-;;;1856:2;1844:9;1835:7;1831:23;1827:32;1824:2;;;-1:-1;;1862:12;1824:2;1920:17;1907:31;-1:-1;;;;;1958:18;1950:6;1947:30;1944:2;;;-1:-1;;1980:12;1944:2;2081:6;2070:9;2066:22;;;290:3;283:4;275:6;271:17;267:27;257:2;;-1:-1;;298:12;257:2;341:6;328:20;1958:18;360:6;357:30;354:2;;;-1:-1;;390:12;354:2;485:3;1856:2;;469:6;465:17;426:6;451:32;;448:41;445:2;;;-1:-1;;492:12;445:2;1856;422:17;;;;;2000:98;;-1:-1;1818:296;;-1:-1;;;;1818:296::o;2121:257::-;;2233:2;2221:9;2212:7;2208:23;2204:32;2201:2;;;-1:-1;;2239:12;2201:2;732:6;726:13;744:30;768:5;744:30;:::i;:::-;2291:71;2195:183;-1:-1;;;2195:183::o;2385:289::-;;2513:2;2501:9;2492:7;2488:23;2484:32;2481:2;;;-1:-1;;2519:12;2481:2;883:6;877:13;895:46;935:5;895:46;:::i;2681:241::-;;2785:2;2773:9;2764:7;2760:23;2756:32;2753:2;;;-1:-1;;2791:12;2753:2;-1:-1;1020:20;;2747:175;-1:-1;2747:175::o;2929:263::-;;3044:2;3032:9;3023:7;3019:23;3015:32;3012:2;;;-1:-1;;3050:12;3012:2;-1:-1;1168:13;;3006:186;-1:-1;3006:186::o;3199:366::-;;;3320:2;3308:9;3299:7;3295:23;3291:32;3288:2;;;-1:-1;;3326:12;3288:2;1033:6;1020:20;3378:63;;3478:2;3521:9;3517:22;72:20;97:33;124:5;97:33;:::i;:::-;3486:63;;;;3282:283;;;;;:::o;3572:743::-;;;;;;3744:3;3732:9;3723:7;3719:23;3715:33;3712:2;;;-1:-1;;3751:12;3712:2;1033:6;1020:20;3803:63;;3903:2;3946:9;3942:22;72:20;97:33;124:5;97:33;:::i;:::-;3911:63;-1:-1;4011:2;4050:22;;72:20;97:33;72:20;97:33;:::i;:::-;3706:609;;;;-1:-1;4019:63;;4119:2;4158:22;;1020:20;;-1:-1;4227:3;4267:22;1020:20;;3706:609;-1:-1;;3706:609::o;4322:491::-;;;;4460:2;4448:9;4439:7;4435:23;4431:32;4428:2;;;-1:-1;;4466:12;4428:2;1033:6;1020:20;4518:63;;4618:2;4661:9;4657:22;72:20;97:33;124:5;97:33;:::i;:::-;4422:391;;4626:63;;-1:-1;;;4726:2;4765:22;;;;1020:20;;4422:391::o;4820:366::-;;;4941:2;4929:9;4920:7;4916:23;4912:32;4909:2;;;-1:-1;;4947:12;4909:2;-1:-1;;1020:20;;;5099:2;5138:22;;;1020:20;;-1:-1;4903:283::o;5402:173::-;12639:37;;5564:4;5555:14;;5482:93::o;13032:271::-;;7394:5;21431:12;-1:-1;23887:101;23901:6;23898:1;23895:13;23887:101;;;7538:4;23968:11;;;;;23962:18;23949:11;;;23942:39;23916:10;23887:101;;;24003:6;24000:1;23997:13;23994:2;;;-1:-1;24059:6;24054:3;24050:16;24043:27;23994:2;-1:-1;7569:16;;;;;13166:137;-1:-1;;13166:137::o;13310:222::-;-1:-1;;;;;23169:54;;;;5654:37;;13437:2;13422:18;;13408:124::o;13539:333::-;-1:-1;;;;;23169:54;;;;5654:37;;13858:2;13843:18;;12639:37;13694:2;13679:18;;13665:207::o;13879:655::-;14147:2;14161:47;;;21431:12;;14132:18;;;22106:19;;;13879:655;;22155:4;;22146:14;;;;21114;;;13879:655;6189:286;6214:6;6211:1;6208:13;6189:286;;;6275:13;;-1:-1;;;;;23169:54;7671:63;;5373:14;;;;21846;;;;1958:18;6229:9;6189:286;;;6193:14;;;14391:9;14385:4;14381:20;22155:4;14365:9;14361:18;14354:48;14416:108;6729:5;21431:12;6748:86;6827:6;6822:3;6748:86;:::i;:::-;6741:93;;22155:4;6905:5;21114:14;6917:21;;-1:-1;6944:260;6969:6;6966:1;6963:13;6944:260;;;7057:63;7116:3;7036:6;7030:13;7057:63;:::i;:::-;21846:14;;;;7050:70;-1:-1;6236:1;6984:9;6944:260;;;-1:-1;14408:116;;14118:416;-1:-1;;;;;;;14118:416::o;14541:::-;14741:2;14755:47;;;7971:2;14726:18;;;22106:19;-1:-1;;;22146:14;;;7987:44;8050:12;;;14712:245::o;14964:416::-;15164:2;15178:47;;;8301:2;15149:18;;;22106:19;-1:-1;;;22146:14;;;8317:42;8378:12;;;15135:245::o;15387:416::-;15587:2;15601:47;;;8629:2;15572:18;;;22106:19;8665:30;22146:14;;;8645:51;8715:12;;;15558:245::o;15810:416::-;16010:2;16024:47;;;8966:2;15995:18;;;22106:19;9002:34;22146:14;;;8982:55;-1:-1;;;9057:12;;;9050:25;9094:12;;;15981:245::o;16233:416::-;16433:2;16447:47;;;9345:2;16418:18;;;22106:19;-1:-1;;;22146:14;;;9361:44;9424:12;;;16404:245::o;16656:416::-;16856:2;16870:47;;;9675:2;16841:18;;;22106:19;9711:30;22146:14;;;9691:51;9761:12;;;16827:245::o;17079:416::-;17279:2;17293:47;;;10012:2;17264:18;;;22106:19;10048:26;22146:14;;;10028:47;10094:12;;;17250:245::o;17502:416::-;17702:2;17716:47;;;17687:18;;;22106:19;10381:34;22146:14;;;10361:55;10435:12;;;17673:245::o;17925:416::-;18125:2;18139:47;;;18110:18;;;22106:19;10722:34;22146:14;;;10702:55;10776:12;;;18096:245::o;18348:416::-;18548:2;18562:47;;;11027:2;18533:18;;;22106:19;11063:29;22146:14;;;11043:50;11112:12;;;18519:245::o;18771:416::-;18971:2;18985:47;;;11363:2;18956:18;;;22106:19;11399:26;22146:14;;;11379:47;11445:12;;;18942:245::o;19194:326::-;11775:23;;-1:-1;;;;;23049:46;12276:37;;11956:4;11945:16;;;11939:23;-1:-1;;;;;23375:30;;;12014:14;;;12867:36;;;;12114:4;12103:16;;;12097:23;23375:30;12172:14;;;12867:36;;;;19373:2;19358:18;;19344:176::o;19527:436::-;-1:-1;;;;;23049:46;;;;12276:37;;-1:-1;;;;;23375:30;;;19868:2;19853:18;;12867:36;23375:30;19949:2;19934:18;;12867:36;19706:2;19691:18;;19677:286::o;19970:222::-;12639:37;;;20097:2;20082:18;;20068:124::o;20199:333::-;12639:37;;;20518:2;20503:18;;12639:37;20354:2;20339:18;;20325:207::o;20539:440::-;-1:-1;;;;;23375:30;;;;12867:36;;20882:2;20867:18;;12639:37;;;;-1:-1;;;;;23049:46;20965:2;20950:18;;12516:50;20720:2;20705:18;;20691:288::o;24091:117::-;-1:-1;;;;;23169:54;;24150:35;;24140:2;;24199:1;;24189:12;24140:2;24134:74;:::o;24215:111::-;24296:5;22850:13;22843:21;24274:5;24271:32;24261:2;;24317:1;;24307:12
Swarm Source
ipfs://aa14a3dc4ecc4f67ff28feb8d591f8fc7e542d35f0f2d01c3ab01f97090e7f97
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.