Source Code
Overview
GLMR Balance
GLMR Value
$0.00View more zero value Internal Transactions in Advanced View mode
Cross-Chain Transactions
Loading...
Loading
Contract Name:
ComplexRewarderTime
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at moonbeam.moonscan.io on 2022-07-05 */ /** *Submitted for verification at moonbeam.moonscan.io on 2022-06-24 */ /** *Submitted for verification at moonbase.moonscan.io on 2022-04-25 */ /** *Submitted for verification at moonbase.moonscan.io on 2022-04-21 */ /** *Submitted for verification at moonriver.moonscan.io on 2021-10-27 */ // 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] pragma solidity 0.6.12; 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 pragma solidity 0.6.12; interface IRewarder { using BoringERC20 for IERC20; function onEnergyFiReward(uint256 pid, address user, address recipient, uint256 energyFiAmount, uint256 newLpAmount) external; function pendingTokens(uint256 pid, address user, uint256 energyFiAmount) external view returns (IERC20[] memory, uint256[] memory); } // File @boringcrypto/boring-solidity/contracts/libraries/[email protected] pragma solidity 0.6.12; // 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. ENERGYFI to distribute per block. uint256 lastRewardBlock; // Last block number that ENERGYFI distribution occurs. uint256 accEnergyFiPerShare; // Accumulated ENERGYFI 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 ENERGYFI tokens per block. /// It is the only address with minting rights for ENERGYFI. /// 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 ENERGYFI 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 ENERGYFI to distribute per block. struct PoolInfo { uint128 accEnergyFiPerShare; uint64 lastRewardBlock; uint64 allocPoint; } /// @notice Address of MCV1 contract. IMasterChef public immutable MASTER_CHEF; /// @notice Address of ENERGYFI contract. IERC20 public immutable ENERGYFI; /// @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_ENERGYFI_PER_BLOCK = 1e20; uint256 private constant ACC_ENERGYFI_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 accEnergyFiPerShare); event LogInit(); /// @param _MASTER_CHEF The EnergyFiSwap MCV1 contract address. /// @param _energyFi The ENERGYFI token contract address. /// @param _MASTER_PID The pool ID of the dummy token on the base MCV1 contract. constructor(IMasterChef _MASTER_CHEF, IERC20 _energyFi, uint256 _MASTER_PID) public { MASTER_CHEF = _MASTER_CHEF; ENERGYFI = _energyFi; MASTER_PID = _MASTER_PID; } /// @notice Deposits a dummy token to `MASTER_CHEF` MCV1. This is required because MCV1 holds the minting rights for ENERGYFI. /// 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(), accEnergyFiPerShare: 0 })); emit LogPoolAddition(lpToken.length.sub(1), allocPoint, _lpToken, _rewarder); } /// @notice Update the given pool's ENERGYFI 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 ENERGYFI on frontend. /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending ENERGYFI reward for a given user. function pendingEnergyFi(uint256 _pid, address _user) external view returns (uint256 pending) { PoolInfo memory pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accEnergyFiPerShare = pool.accEnergyFiPerShare; uint256 lpSupply = lpToken[_pid].balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 blocks = block.number.sub(pool.lastRewardBlock); uint256 energyFiReward = blocks.mul(energyFiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; accEnergyFiPerShare = accEnergyFiPerShare.add(energyFiReward.mul(ACC_ENERGYFI_PRECISION) / lpSupply); } pending = int256(user.amount.mul(accEnergyFiPerShare) / ACC_ENERGYFI_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 ENERGYFI per block. function energyFiPerBlock() public view returns (uint256 amount) { amount = uint256(MASTERCHEF_ENERGYFI_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 energyFiReward = blocks.mul(energyFiPerBlock()).mul(pool.allocPoint) / totalAllocPoint; pool.accEnergyFiPerShare = pool.accEnergyFiPerShare.add((energyFiReward.mul(ACC_ENERGYFI_PRECISION) / lpSupply).to128()); } pool.lastRewardBlock = block.number.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardBlock, lpSupply, pool.accEnergyFiPerShare); } } /// @notice Deposit LP tokens to MCV2 for ENERGYFI 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.accEnergyFiPerShare) / ACC_ENERGYFI_PRECISION)); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onEnergyFiReward(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.accEnergyFiPerShare) / ACC_ENERGYFI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onEnergyFiReward(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 ENERGYFI rewards. function harvest(uint256 pid, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedEnergyFi = int256(user.amount.mul(pool.accEnergyFiPerShare) / ACC_ENERGYFI_PRECISION); uint256 _pendingEnergyFi = accumulatedEnergyFi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedEnergyFi; // Interactions if (_pendingEnergyFi != 0) { ENERGYFI.safeTransfer(to, _pendingEnergyFi); } IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onEnergyFiReward( pid, msg.sender, to, _pendingEnergyFi, user.amount); } emit Harvest(msg.sender, pid, _pendingEnergyFi); } /// @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 ENERGYFI rewards. function withdrawAndHarvest(uint256 pid, uint256 amount, address to) public { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][msg.sender]; int256 accumulatedEnergyFi = int256(user.amount.mul(pool.accEnergyFiPerShare) / ACC_ENERGYFI_PRECISION); uint256 _pendingEnergyFi = accumulatedEnergyFi.sub(user.rewardDebt).toUInt256(); // Effects user.rewardDebt = accumulatedEnergyFi.sub(int256(amount.mul(pool.accEnergyFiPerShare) / ACC_ENERGYFI_PRECISION)); user.amount = user.amount.sub(amount); // Interactions ENERGYFI.safeTransfer(to, _pendingEnergyFi); IRewarder _rewarder = rewarder[pid]; if (address(_rewarder) != address(0)) { _rewarder.onEnergyFiReward(pid, msg.sender, to, _pendingEnergyFi, user.amount); } lpToken[pid].safeTransfer(to, amount); emit Withdraw(msg.sender, pid, amount, to); emit Harvest(msg.sender, pid, _pendingEnergyFi); } /// @notice Harvests ENERGYFI 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.onEnergyFiReward(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 ENERGYFI entitled to the user. struct UserInfo { uint256 amount; uint256 rewardDebt; uint256 unpaidRewards; } /// @notice Info of each MCV2 pool. /// `allocPoint` The amount of allocation points assigned to the pool. /// Also known as the amount of ENERGYFI to distribute per block. struct PoolInfo { uint128 accEnergyFiPerShare; 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; uint256 internal unlocked; modifier lock() { require(unlocked == 1, "LOCKED"); unlocked = 2; _; unlocked = 1; } 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 accEnergyFiPerShare); event LogRewardPerSecond(uint256 rewardPerSecond); event LogInit(); constructor (IERC20 _rewardToken, uint256 _rewardPerSecond, address _MASTERCHEF_V2) public { rewardToken = _rewardToken; rewardPerSecond = _rewardPerSecond; MASTERCHEF_V2 = _MASTERCHEF_V2; unlocked = 1; } function onEnergyFiReward (uint256 pid, address _user, address to, uint256, uint256 lpToken) onlyMCV2 lock override external { PoolInfo memory pool = updatePool(pid); UserInfo storage user = userInfo[pid][_user]; uint256 pending; if (user.amount > 0) { pending = (user.amount.mul(pool.accEnergyFiPerShare) / ACC_TOKEN_PRECISION).sub( user.rewardDebt ).add(user.unpaidRewards); uint256 balance = rewardToken.balanceOf(address(this)); if (pending > balance) { rewardToken.safeTransfer(to, balance); user.unpaidRewards = pending - balance; } else { rewardToken.safeTransfer(to, pending); user.unpaidRewards = 0; } } user.amount = lpToken; user.rewardDebt = lpToken.mul(pool.accEnergyFiPerShare) / ACC_TOKEN_PRECISION; emit LogOnReward(_user, pid, pending - user.unpaidRewards, 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 energyFi per second to be distributed. Can only be called by the owner. /// @param _rewardPerSecond The amount of EnergyFi 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(), accEnergyFiPerShare: 0 }); poolIds.push(_pid); emit LogPoolAddition(_pid, allocPoint); } /// @notice Update the given pool's ENERGYFI 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 Allows owner to reclaim/withdraw any tokens (including reward tokens) held by this contract /// @param token Token to reclaim, use 0x00 for Ethereum /// @param amount Amount of tokens to reclaim /// @param to Receiver of the tokens, first of his name, rightful heir to the lost tokens, /// reightful owner of the extra tokens, and ether, protector of mistaken transfers, mother of token reclaimers, /// the Khaleesi of the Great Token Sea, the Unburnt, the Breaker of blockchains. function reclaimTokens(address token, uint256 amount, address payable to) public onlyOwner { if (token == address(0)) { to.transfer(amount); } else { IERC20(token).safeTransfer(to, amount); } } /// @notice View function to see pending Token /// @param _pid The index of the pool. See `poolInfo`. /// @param _user Address of user. /// @return pending ENERGYFI 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 accEnergyFiPerShare = pool.accEnergyFiPerShare; 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 energyFiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; accEnergyFiPerShare = accEnergyFiPerShare.add(energyFiReward.mul(ACC_TOKEN_PRECISION) / lpSupply); } pending = (user.amount.mul(accEnergyFiPerShare) / ACC_TOKEN_PRECISION).sub(user.rewardDebt).add(user.unpaidRewards); } /// @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 energyFiReward = time.mul(rewardPerSecond).mul(pool.allocPoint) / totalAllocPoint; pool.accEnergyFiPerShare = pool.accEnergyFiPerShare.add((energyFiReward.mul(ACC_TOKEN_PRECISION) / lpSupply).to128()); } pool.lastRewardTime = block.timestamp.to64(); poolInfo[pid] = pool; emit LogUpdatePool(pid, pool.lastRewardTime, lpSupply, pool.accEnergyFiPerShare); } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"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":"accEnergyFiPerShare","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":"onEnergyFiReward","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":"accEnergyFiPerShare","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":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address payable","name":"to","type":"address"}],"name":"reclaimTokens","outputs":[],"stateMutability":"nonpayable","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":"accEnergyFiPerShare","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"},{"internalType":"uint256","name":"unpaidRewards","type":"uint256"}],"stateMutability":"view","type":"function"}]Contract Creation Code
60c06040523480156200001157600080fd5b5060405162001b5d38038062001b5d83398101604081905262000034916200009e565b600080546001600160a01b0319163390811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36001600160601b0319606093841b811660805260069290925590911b1660a0526001600755620000fe565b600080600060608486031215620000b3578283fd5b8351620000c081620000e5565b602085015160408601519194509250620000da81620000e5565b809150509250925092565b6001600160a01b0381168114620000fb57600080fd5b50565b60805160601c60a05160601c611a126200014b6000398061053252806105c7528061084752806108dc5280610d40525080610e225280610ed35280610f1452806110b25250611a126000f3fe608060405234801561001057600080fd5b50600436106101165760003560e01c806369883b4e116100a257806392c9e72f1161007157806392c9e72f1461022757806393f1a40b1461023a578063c1ea38681461025c578063d63b3c491461026f578063e30c39781461029057610116565b806369883b4e146101e4578063771602f7146101f75780638da5cb5b1461020a5780638f10369a1461021f57610116565b806348e43af4116100e957806348e43af4146101835780634e71e0c81461019657806351eb05a61461019e57806357a5b58c146101be57806366da5815146101d157610116565b8063078dfbe71461011b578063081e3eda146101305780631526fe271461014e5780631ab06ee514610170575b600080fd5b61012e61012936600461136e565b610298565b005b610138610387565b604051610145919061196d565b60405180910390f35b61016161015c36600461149b565b61038d565b60405161014593929190611943565b61012e61017e366004611582565b6103c4565b6101386101913660046114cb565b6104a3565b61012e610741565b6101b16101ac36600461149b565b6107ce565b604051610145919061190a565b61012e6101cc3660046113ee565b610acc565b61012e6101df36600461149b565b610b02565b6101386101f236600461149b565b610b6c565b61012e610205366004611582565b610b8a565b610212610d20565b60405161014591906115e4565b610138610d2f565b61012e6102353660046114fa565b610d35565b61024d6102483660046114cb565b610fd6565b60405161014593929190611976565b61012e61026a3660046113b8565b611002565b61028261027d36600461154b565b61108a565b604051610145929190611611565b610212611149565b6000546001600160a01b031633146102cb5760405162461bcd60e51b81526004016102c290611812565b60405180910390fd5b8115610366576001600160a01b0383161515806102e55750805b6103015760405162461bcd60e51b81526004016102c290611775565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610382565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103ee5760405162461bcd60e51b81526004016102c290611812565b60008281526002602052604090205460055461042591839161041f91600160c01b90046001600160401b0316611158565b90611181565b600555610431816111a4565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c9061049790849061196d565b60405180910390a25050565b60006104ad61134e565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f0000000000000000000000000000000000000000000000000000000000000000909216916378ed5d1f91610567918b910161196d565b60206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b7919061147f565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161060291906115e4565b60206040518083038186803b15801561061a57600080fd5b505afa15801561062e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065291906114b3565b905083602001516001600160401b03164211801561066f57508015155b156106fb57600061069685602001516001600160401b03164261115890919063ffffffff16565b905060006005546106c987604001516001600160401b03166106c3600654866111d190919063ffffffff16565b906111d1565b816106d057fe5b0490506106f6836106e68364e8d4a510006111d1565b816106ed57fe5b86919004611181565b935050505b610736836002015461041f856001015464e8d4a510006107288789600001546111d190919063ffffffff16565b8161072f57fe5b0490611158565b979650505050505050565b6001546001600160a01b031633811461076c5760405162461bcd60e51b81526004016102c290611847565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6107d661134e565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252421115610ac7576040516378ed5d1f60e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906378ed5d1f9061087c90869060040161196d565b60206040518083038186803b15801561089457600080fd5b505afa1580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc919061147f565b6001600160a01b03166370a082317f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b815260040161091791906115e4565b60206040518083038186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096791906114b3565b90508015610a0a57600061099183602001516001600160401b03164261115890919063ffffffff16565b905060006005546109be85604001516001600160401b03166106c3600654866111d190919063ffffffff16565b816109c557fe5b0490506109fc6109eb846109de8464e8d4a510006111d1565b816109e557fe5b04611208565b85516001600160801b031690611231565b6001600160801b0316845250505b610a13426111a4565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610abd929091869161198c565b60405180910390a2505b919050565b8060005b81811015610afc57610af3848483818110610ae757fe5b905060200201356107ce565b50600101610ad0565b50505050565b6000546001600160a01b03163314610b2c5760405162461bcd60e51b81526004016102c290611812565b60068190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610b6190839061196d565b60405180910390a150565b60038181548110610b7957fe5b600091825260209091200154905081565b6000546001600160a01b03163314610bb45760405162461bcd60e51b81526004016102c290611812565b600081815260026020526040902054600160801b90046001600160401b031615610bf05760405162461bcd60e51b81526004016102c2906116d0565b6005544290610bff9084611181565b60055560408051606081019091526000815260208101610c1e836111a4565b6001600160401b03168152602001610c35856111a4565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610d1390869061196d565b60405180910390a2505050565b6000546001600160a01b031681565b60065481565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610d7d5760405162461bcd60e51b81526004016102c290611734565b600754600114610d9f5760405162461bcd60e51b81526004016102c2906118b3565b6002600755610dac61134e565b610db5866107ce565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610f4557610e1c826002015461041f846001015464e8d4a5100061072888600001516001600160801b031688600001546111d190919063ffffffff16565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e6c91906115e4565b60206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc91906114b3565b905080821115610f0757610efa6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168883611260565b8082036002840155610f43565b610f3b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168884611260565b600060028401555b505b838255825164e8d4a5100090610f659086906001600160801b03166111d1565b81610f6c57fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b85600201548503604051610fbf919061196d565b60405180910390a450506001600755505050505050565b600460209081526000928352604080842090915290825290208054600182015460029092015490919083565b6000546001600160a01b0316331461102c5760405162461bcd60e51b81526004016102c290611812565b6001600160a01b038316611076576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611070573d6000803e3d6000fd5b50610382565b6103826001600160a01b0384168284611260565b60408051600180825281830190925260609182918291602080830190803683370190505090507f0000000000000000000000000000000000000000000000000000000000000000816000815181106110de57fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905061112587876104a3565b8160008151811061113257fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b8082038281111561117b5760405162461bcd60e51b81526004016102c2906116a1565b92915050565b8181018181101561117b5760405162461bcd60e51b81526004016102c2906117db565b60006001600160401b038211156111cd5760405162461bcd60e51b81526004016102c29061187c565b5090565b60008115806111ec575050808202828282816111e957fe5b04145b61117b5760405162461bcd60e51b81526004016102c2906118d3565b60006001600160801b038211156111cd5760405162461bcd60e51b81526004016102c2906117a4565b8181016001600160801b03808316908216101561117b5760405162461bcd60e51b81526004016102c2906117db565b60006060846001600160a01b031663a9059cbb85856040516024016112869291906115f8565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516112bf91906115ab565b6000604051808303816000865af19150503d80600081146112fc576040519150601f19603f3d011682016040523d82523d6000602084013e611301565b606091505b509150915081801561132b57508051158061132b57508080602001905181019061132b919061145c565b6113475760405162461bcd60e51b81526004016102c2906116fd565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b600080600060608486031215611382578283fd5b833561138d816119b6565b9250602084013561139d816119ce565b915060408401356113ad816119ce565b809150509250925092565b6000806000606084860312156113cc578283fd5b83356113d7816119b6565b92506020840135915060408401356113ad816119b6565b60008060208385031215611400578182fd5b82356001600160401b0380821115611416578384fd5b818501915085601f830112611429578384fd5b813581811115611437578485fd5b866020808302850101111561144a578485fd5b60209290920196919550909350505050565b60006020828403121561146d578081fd5b8151611478816119ce565b9392505050565b600060208284031215611490578081fd5b8151611478816119b6565b6000602082840312156114ac578081fd5b5035919050565b6000602082840312156114c4578081fd5b5051919050565b600080604083850312156114dd578182fd5b8235915060208301356114ef816119b6565b809150509250929050565b600080600080600060a08688031215611511578081fd5b853594506020860135611523816119b6565b93506040860135611533816119b6565b94979396509394606081013594506080013592915050565b60008060006060848603121561155f578283fd5b833592506020840135611571816119b6565b929592945050506040919091013590565b60008060408385031215611594578182fd5b50508035926020909101359150565b815260200190565b60008251815b818110156115cb57602081860181015185830152016115b1565b818111156115d95782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156116535781516001600160a01b03168452928401929084019060010161162e565b5050508381038285015280855161166a818461196d565b91508387019250845b81811015611694576116868385516115a3565b938501939250600101611673565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252600690820152651313d0d2d15160d21b604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9283526020830191909152604082015260600190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b03811681146119cb57600080fd5b50565b80151581146119cb57600080fdfea26469706673582212203959585b89e2f2d253562af30cfacb00a4913240bfe885e69c3d984fad8270d864736f6c634300060c0033000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e620000000000000000000000000000000000000000000000000000000153bf1900000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a9
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101165760003560e01c806369883b4e116100a257806392c9e72f1161007157806392c9e72f1461022757806393f1a40b1461023a578063c1ea38681461025c578063d63b3c491461026f578063e30c39781461029057610116565b806369883b4e146101e4578063771602f7146101f75780638da5cb5b1461020a5780638f10369a1461021f57610116565b806348e43af4116100e957806348e43af4146101835780634e71e0c81461019657806351eb05a61461019e57806357a5b58c146101be57806366da5815146101d157610116565b8063078dfbe71461011b578063081e3eda146101305780631526fe271461014e5780631ab06ee514610170575b600080fd5b61012e61012936600461136e565b610298565b005b610138610387565b604051610145919061196d565b60405180910390f35b61016161015c36600461149b565b61038d565b60405161014593929190611943565b61012e61017e366004611582565b6103c4565b6101386101913660046114cb565b6104a3565b61012e610741565b6101b16101ac36600461149b565b6107ce565b604051610145919061190a565b61012e6101cc3660046113ee565b610acc565b61012e6101df36600461149b565b610b02565b6101386101f236600461149b565b610b6c565b61012e610205366004611582565b610b8a565b610212610d20565b60405161014591906115e4565b610138610d2f565b61012e6102353660046114fa565b610d35565b61024d6102483660046114cb565b610fd6565b60405161014593929190611976565b61012e61026a3660046113b8565b611002565b61028261027d36600461154b565b61108a565b604051610145929190611611565b610212611149565b6000546001600160a01b031633146102cb5760405162461bcd60e51b81526004016102c290611812565b60405180910390fd5b8115610366576001600160a01b0383161515806102e55750805b6103015760405162461bcd60e51b81526004016102c290611775565b600080546040516001600160a01b03808716939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0385166001600160a01b031991821617909155600180549091169055610382565b600180546001600160a01b0319166001600160a01b0385161790555b505050565b60035490565b6002602052600090815260409020546001600160801b038116906001600160401b03600160801b8204811691600160c01b90041683565b6000546001600160a01b031633146103ee5760405162461bcd60e51b81526004016102c290611812565b60008281526002602052604090205460055461042591839161041f91600160c01b90046001600160401b0316611158565b90611181565b600555610431816111a4565b6000838152600260205260409081902080546001600160401b0393909316600160c01b026001600160c01b03909316929092179091555182907f942cc7e17a17c164bd977f32ab8c54265d5b9d481e4e352bf874f1e568874e7c9061049790849061196d565b60405180910390a25050565b60006104ad61134e565b506000838152600260209081526040808320815160608101835290546001600160801b0380821683526001600160401b03600160801b8304811684870152600160c01b9092049091168284015287855260048085528386206001600160a01b03808a1688529552838620835194516378ed5d1f60e01b815293969095949092169391927f000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a9909216916378ed5d1f91610567918b910161196d565b60206040518083038186803b15801561057f57600080fd5b505afa158015610593573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105b7919061147f565b6001600160a01b03166370a082317f000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a96040518263ffffffff1660e01b815260040161060291906115e4565b60206040518083038186803b15801561061a57600080fd5b505afa15801561062e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065291906114b3565b905083602001516001600160401b03164211801561066f57508015155b156106fb57600061069685602001516001600160401b03164261115890919063ffffffff16565b905060006005546106c987604001516001600160401b03166106c3600654866111d190919063ffffffff16565b906111d1565b816106d057fe5b0490506106f6836106e68364e8d4a510006111d1565b816106ed57fe5b86919004611181565b935050505b610736836002015461041f856001015464e8d4a510006107288789600001546111d190919063ffffffff16565b8161072f57fe5b0490611158565b979650505050505050565b6001546001600160a01b031633811461076c5760405162461bcd60e51b81526004016102c290611847565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b039092166001600160a01b0319928316179055600180549091169055565b6107d661134e565b50600081815260026020908152604091829020825160608101845290546001600160801b03811682526001600160401b03600160801b82048116938301849052600160c01b9091041692810192909252421115610ac7576040516378ed5d1f60e01b81526000906001600160a01b037f000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a916906378ed5d1f9061087c90869060040161196d565b60206040518083038186803b15801561089457600080fd5b505afa1580156108a8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108cc919061147f565b6001600160a01b03166370a082317f000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a96040518263ffffffff1660e01b815260040161091791906115e4565b60206040518083038186803b15801561092f57600080fd5b505afa158015610943573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061096791906114b3565b90508015610a0a57600061099183602001516001600160401b03164261115890919063ffffffff16565b905060006005546109be85604001516001600160401b03166106c3600654866111d190919063ffffffff16565b816109c557fe5b0490506109fc6109eb846109de8464e8d4a510006111d1565b816109e557fe5b04611208565b85516001600160801b031690611231565b6001600160801b0316845250505b610a13426111a4565b6001600160401b03908116602084810191825260008681526002909152604090819020855181549351838801516001600160801b03199095166001600160801b0383161767ffffffffffffffff60801b1916600160801b82881602176001600160c01b0316600160c01b95909616949094029490941790555185927f0fc9545022a542541ad085d091fb09a2ab36fee366a4576ab63714ea907ad35392610abd929091869161198c565b60405180910390a2505b919050565b8060005b81811015610afc57610af3848483818110610ae757fe5b905060200201356107ce565b50600101610ad0565b50505050565b6000546001600160a01b03163314610b2c5760405162461bcd60e51b81526004016102c290611812565b60068190556040517fde89cb17ac7f58f94792b3e91e086ed85403819c24ceea882491f960ccb1a27890610b6190839061196d565b60405180910390a150565b60038181548110610b7957fe5b600091825260209091200154905081565b6000546001600160a01b03163314610bb45760405162461bcd60e51b81526004016102c290611812565b600081815260026020526040902054600160801b90046001600160401b031615610bf05760405162461bcd60e51b81526004016102c2906116d0565b6005544290610bff9084611181565b60055560408051606081019091526000815260208101610c1e836111a4565b6001600160401b03168152602001610c35856111a4565b6001600160401b0390811690915260008481526002602090815260408083208551815493870151968301518616600160c01b026001600160c01b0397909616600160801b0267ffffffffffffffff60801b196001600160801b039092166001600160801b031990951694909417169290921794909416929092179091556003805460018101825591527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b018390555182907f38410508059921573ab9ebdca2a5034be738d236366b8f32de4434ea95ed3c8190610d1390869061196d565b60405180910390a2505050565b6000546001600160a01b031681565b60065481565b336001600160a01b037f000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a91614610d7d5760405162461bcd60e51b81526004016102c290611734565b600754600114610d9f5760405162461bcd60e51b81526004016102c2906118b3565b6002600755610dac61134e565b610db5866107ce565b60008781526004602090815260408083206001600160a01b038a168452909152812080549293509115610f4557610e1c826002015461041f846001015464e8d4a5100061072888600001516001600160801b031688600001546111d190919063ffffffff16565b905060007f000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e626001600160a01b03166370a08231306040518263ffffffff1660e01b8152600401610e6c91906115e4565b60206040518083038186803b158015610e8457600080fd5b505afa158015610e98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebc91906114b3565b905080821115610f0757610efa6001600160a01b037f000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62168883611260565b8082036002840155610f43565b610f3b6001600160a01b037f000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62168884611260565b600060028401555b505b838255825164e8d4a5100090610f659086906001600160801b03166111d1565b81610f6c57fe5b048260010181905550856001600160a01b031688886001600160a01b03167f2ece88ca2bc08dd018db50e1d25a20bf1241e5fab1c396caa51f01a54bd2f75b85600201548503604051610fbf919061196d565b60405180910390a450506001600755505050505050565b600460209081526000928352604080842090915290825290208054600182015460029092015490919083565b6000546001600160a01b0316331461102c5760405162461bcd60e51b81526004016102c290611812565b6001600160a01b038316611076576040516001600160a01b0382169083156108fc029084906000818181858888f19350505050158015611070573d6000803e3d6000fd5b50610382565b6103826001600160a01b0384168284611260565b60408051600180825281830190925260609182918291602080830190803683370190505090507f000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62816000815181106110de57fe5b6001600160a01b03929092166020928302919091019091015260408051600180825281830190925260609181602001602082028036833701905050905061112587876104a3565b8160008151811061113257fe5b602090810291909101015290969095509350505050565b6001546001600160a01b031681565b8082038281111561117b5760405162461bcd60e51b81526004016102c2906116a1565b92915050565b8181018181101561117b5760405162461bcd60e51b81526004016102c2906117db565b60006001600160401b038211156111cd5760405162461bcd60e51b81526004016102c29061187c565b5090565b60008115806111ec575050808202828282816111e957fe5b04145b61117b5760405162461bcd60e51b81526004016102c2906118d3565b60006001600160801b038211156111cd5760405162461bcd60e51b81526004016102c2906117a4565b8181016001600160801b03808316908216101561117b5760405162461bcd60e51b81526004016102c2906117db565b60006060846001600160a01b031663a9059cbb85856040516024016112869291906115f8565b6040516020818303038152906040529060e01b6020820180516001600160e01b0383818316178352505050506040516112bf91906115ab565b6000604051808303816000865af19150503d80600081146112fc576040519150601f19603f3d011682016040523d82523d6000602084013e611301565b606091505b509150915081801561132b57508051158061132b57508080602001905181019061132b919061145c565b6113475760405162461bcd60e51b81526004016102c2906116fd565b5050505050565b604080516060810182526000808252602082018190529181019190915290565b600080600060608486031215611382578283fd5b833561138d816119b6565b9250602084013561139d816119ce565b915060408401356113ad816119ce565b809150509250925092565b6000806000606084860312156113cc578283fd5b83356113d7816119b6565b92506020840135915060408401356113ad816119b6565b60008060208385031215611400578182fd5b82356001600160401b0380821115611416578384fd5b818501915085601f830112611429578384fd5b813581811115611437578485fd5b866020808302850101111561144a578485fd5b60209290920196919550909350505050565b60006020828403121561146d578081fd5b8151611478816119ce565b9392505050565b600060208284031215611490578081fd5b8151611478816119b6565b6000602082840312156114ac578081fd5b5035919050565b6000602082840312156114c4578081fd5b5051919050565b600080604083850312156114dd578182fd5b8235915060208301356114ef816119b6565b809150509250929050565b600080600080600060a08688031215611511578081fd5b853594506020860135611523816119b6565b93506040860135611533816119b6565b94979396509394606081013594506080013592915050565b60008060006060848603121561155f578283fd5b833592506020840135611571816119b6565b929592945050506040919091013590565b60008060408385031215611594578182fd5b50508035926020909101359150565b815260200190565b60008251815b818110156115cb57602081860181015185830152016115b1565b818111156115d95782828501525b509190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b604080825283519082018190526000906020906060840190828701845b828110156116535781516001600160a01b03168452928401929084019060010161162e565b5050508381038285015280855161166a818461196d565b91508387019250845b81811015611694576116868385516115a3565b938501939250600101611673565b5090979650505050505050565b602080825260159082015274426f72696e674d6174683a20556e646572666c6f7760581b604082015260600190565b602080825260139082015272506f6f6c20616c72656164792065786973747360681b604082015260600190565b6020808252601c908201527f426f72696e6745524332303a205472616e73666572206661696c656400000000604082015260600190565b60208082526021908201527f4f6e6c79204d4356322063616e2063616c6c20746869732066756e6374696f6e6040820152601760f91b606082015260800190565b6020808252601590820152744f776e61626c653a207a65726f206164647265737360581b604082015260600190565b6020808252601c908201527f426f72696e674d6174683a2075696e74313238204f766572666c6f7700000000604082015260600190565b60208082526018908201527f426f72696e674d6174683a20416464204f766572666c6f770000000000000000604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c657220213d2070656e64696e67206f776e6572604082015260600190565b6020808252601b908201527f426f72696e674d6174683a2075696e743634204f766572666c6f770000000000604082015260600190565b6020808252600690820152651313d0d2d15160d21b604082015260600190565b60208082526018908201527f426f72696e674d6174683a204d756c204f766572666c6f770000000000000000604082015260600190565b81516001600160801b031681526020808301516001600160401b0390811691830191909152604092830151169181019190915260600190565b6001600160801b039390931683526001600160401b03918216602084015216604082015260600190565b90815260200190565b9283526020830191909152604082015260600190565b6001600160401b0393909316835260208301919091526001600160801b0316604082015260600190565b6001600160a01b03811681146119cb57600080fd5b50565b80151581146119cb57600080fdfea26469706673582212203959585b89e2f2d253562af30cfacb00a4913240bfe885e69c3d984fad8270d864736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e620000000000000000000000000000000000000000000000000000000153bf1900000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a9
-----Decoded View---------------
Arg [0] : _rewardToken (address): 0xA423E7eEB60547d9C7b65005477b63ae7CE67E62
Arg [1] : _rewardPerSecond (uint256): 5700000000
Arg [2] : _MASTERCHEF_V2 (address): 0xA07E2876f9A53153362F05B59734aF01Ea8807A9
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a423e7eeb60547d9c7b65005477b63ae7ce67e62
Arg [1] : 0000000000000000000000000000000000000000000000000000000153bf1900
Arg [2] : 000000000000000000000000a07e2876f9a53153362f05b59734af01ea8807a9
Deployed Bytecode Sourcemap
28521:8913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5939:472;;;;;;:::i;:::-;;:::i;:::-;;32798:99;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29377:45;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;33916:267::-;;;;;;:::i;:::-;;:::i;35183:856::-;;;;;;:::i;:::-;;:::i;6460:348::-;;;:::i;36598:831::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;36221:193::-;;;;;;:::i;:::-;;:::i;32396:176::-;;;;;;:::i;:::-;;:::i;29431:24::-;;;;;;:::i;:::-;;:::i;33152:522::-;;;;;;:::i;:::-;;:::i;5515:20::-;;;:::i;:::-;;;;;;;:::i;29721:30::-;;;:::i;30725:1045::-;;;;;;:::i;:::-;;:::i;29522:66::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;34714:251::-;;;;;;:::i;:::-;;:::i;31778:426::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;5562:27::-;;;:::i;5939:472::-;6911:5;;-1:-1:-1;;;;;6911:5:0;6897:10;:19;6889:64;;;;-1:-1:-1;;;6889:64:0;;;;;;;:::i;:::-;;;;;;;;;6044:6:::1;6040:364;;;-1:-1:-1::0;;;;;6098:22:0;::::1;::::0;::::1;::::0;:34:::1;;;6124:8;6098:34;6090:68;;;;-1:-1:-1::0;;;6090:68:0::1;;;;;;;:::i;:::-;6225:5;::::0;;6204:37:::1;::::0;-1:-1:-1;;;;;6204:37:0;;::::1;::::0;6225:5;::::1;::::0;6204:37:::1;::::0;::::1;6256:5;:16:::0;;-1:-1:-1;;;;;6256:16:0;::::1;-1:-1:-1::0;;;;;;6256:16:0;;::::1;;::::0;;;;6287:25;;;;::::1;::::0;;6040:364:::1;;;6369:12;:23:::0;;-1:-1:-1;;;;;;6369:23:0::1;-1:-1:-1::0;;;;;6369:23:0;::::1;;::::0;;6040:364:::1;5939:472:::0;;;:::o;32798:99::-;32875:7;:14;;32798:99::o;29377:45::-;;;;;;;;;;;;-1:-1:-1;;;;;29377:45:0;;;-1:-1:-1;;;;;;;;29377:45:0;;;;;-1:-1:-1;;;29377:45:0;;;;:::o;33916:267::-;6911:5;;-1:-1:-1;;;;;6911:5:0;6897:10;:19;6889:64;;;;-1:-1:-1;;;6889:64:0;;;;;;;:::i;:::-;34030:14:::1;::::0;;;:8:::1;:14;::::0;;;;:25;34010:15:::1;::::0;:63:::1;::::0;34061:11;;34010:46:::1;::::0;-1:-1:-1;;;34030:25:0;::::1;-1:-1:-1::0;;;;;34030:25:0::1;34010:19;:46::i;:::-;:50:::0;::::1;:63::i;:::-;33992:15;:81:::0;34112:18:::1;:11:::0;:16:::1;:18::i;:::-;34084:14;::::0;;;:8:::1;:14;::::0;;;;;;:46;;-1:-1:-1;;;;;34084:46:0;;;::::1;-1:-1:-1::0;;;34084:46:0::1;-1:-1:-1::0;;;;;34084:46:0;;::::1;::::0;;;::::1;::::0;;;34146:29;34093:4;;34146:29:::1;::::0;::::1;::::0;34163:11;;34146:29:::1;:::i;:::-;;;;;;;;33916:267:::0;;:::o;35183:856::-;35255:15;35283:20;;:::i;:::-;-1:-1:-1;35306:14:0;;;;:8;:14;;;;;;;;35283:37;;;;;;;;;-1:-1:-1;;;;;35283:37:0;;;;;-1:-1:-1;;;;;;;;35283:37:0;;;;;;;;-1:-1:-1;;;35283:37:0;;;;;;;;;;35355:14;;;:8;:14;;;;;;-1:-1:-1;;;;;35355:21:0;;;;;;;;;;35417:24;;35471:41;;-1:-1:-1;;;35471:41:0;;35283:37;;35355:21;;35387:54;;;;;35306:14;;35484:13;35471:35;;;;;;:41;;35315:4;;35471:41;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;35471:51:0;;35523:13;35471:66;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35452:85;;35570:4;:19;;;-1:-1:-1;;;;;35552:37:0;:15;:37;:54;;;;-1:-1:-1;35593:13:0;;;35552:54;35548:358;;;35623:12;35638:40;35658:4;:19;;;-1:-1:-1;;;;;35638:40:0;:15;:19;;:40;;;;:::i;:::-;35623:55;;35693:22;35767:15;;35718:46;35748:4;:15;;;-1:-1:-1;;;;;35718:46:0;:25;35727:15;;35718:4;:8;;:25;;;;:::i;:::-;:29;;:46::i;:::-;:64;;;;;;;-1:-1:-1;35819:75:0;35885:8;35843:39;35718:64;29805:4;35843:18;:39::i;:::-;:50;;;;;35819:19;;35843:50;;35819:23;:75::i;:::-;35797:97;;35548:358;;;35926:105;36012:4;:18;;;35926:81;35991:4;:15;;;29805:4;35927:36;35943:19;35927:4;:11;;;:15;;:36;;;;:::i;:::-;:58;;;;;;;35926:64;:81::i;:105::-;35916:115;35183:856;-1:-1:-1;;;;;;;35183:856:0:o;6460:348::-;6528:12;;-1:-1:-1;;;;;6528:12:0;6588:10;:27;;6580:72;;;;-1:-1:-1;;;6580:72:0;;;;;;;:::i;:::-;6711:5;;;6690:42;;-1:-1:-1;;;;;6690:42:0;;;;6711:5;;;6690:42;;;6743:5;:21;;-1:-1:-1;;;;;6743:21:0;;;-1:-1:-1;;;;;;6743:21:0;;;;;;;6775:25;;;;;;;6460:348::o;36598:831::-;36647:20;;:::i;:::-;-1:-1:-1;36687:13:0;;;;:8;:13;;;;;;;;;36680:20;;;;;;;;;-1:-1:-1;;;;;36680:20:0;;;;-1:-1:-1;;;;;;;;36680:20:0;;;;;;;;;;-1:-1:-1;;;36680:20:0;;;;;;;;;;;36715:15;:37;36711:711;;;36788:40;;-1:-1:-1;;;36788:40:0;;36769:16;;-1:-1:-1;;;;;36801:13:0;36788:35;;;;:40;;36824:3;;36788:40;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;36788:50:0;;36839:13;36788:65;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36769:84;-1:-1:-1;36874:12:0;;36870:352;;36907:12;36922:40;36942:4;:19;;;-1:-1:-1;;;;;36922:40:0;:15;:19;;:40;;;;:::i;:::-;36907:55;;36981:22;37055:15;;37006:46;37036:4;:15;;;-1:-1:-1;;;;;37006:46:0;:25;37015:15;;37006:4;:8;;:25;;;;:::i;:46::-;:64;;;;;;;-1:-1:-1;37116:90:0;37145:60;37188:8;37146:39;37006:64;29805:4;37146:18;:39::i;:::-;:50;;;;;;37145:58;:60::i;:::-;37116:24;;-1:-1:-1;;;;;37116:28:0;;;:90::i;:::-;-1:-1:-1;;;;;37089:117:0;;;-1:-1:-1;;36870:352:0;37258:22;:15;:20;:22::i;:::-;-1:-1:-1;;;;;37236:44:0;;;:19;;;;:44;;;37295:13;;;;:8;:13;;;;;;;;:20;;;;;;;;;;-1:-1:-1;;;;;;37295:20:0;;;-1:-1:-1;;;;;37295:20:0;;;-1:-1:-1;;;;37295:20:0;-1:-1:-1;;;37295:20:0;;;;;-1:-1:-1;;;;;37295:20:0;-1:-1:-1;;;37295:20:0;;;;;;;;;;;;;;37335:75;37295:13;;37335:75;;;;37295:20;;37375:8;;37335:75;:::i;:::-;;;;;;;;36711:711;;36598:831;;;:::o;36221:193::-;36305:4;36291:11;36327:80;36351:3;36347:1;:7;36327:80;;;36376:19;36387:4;;36392:1;36387:7;;;;;;;;;;;;;36376:10;:19::i;:::-;-1:-1:-1;36356:3:0;;36327:80;;;;36221:193;;;:::o;32396:176::-;6911:5;;-1:-1:-1;;;;;6911:5:0;6897:10;:19;6889:64;;;;-1:-1:-1;;;6889:64:0;;;;;;;:::i;:::-;32478:15:::1;:34:::0;;;32528:36:::1;::::0;::::1;::::0;::::1;::::0;32496:16;;32528:36:::1;:::i;:::-;;;;;;;;32396:176:::0;:::o;29431:24::-;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29431:24:0;:::o;33152:522::-;6911:5;;-1:-1:-1;;;;;6911:5:0;6897:10;:19;6889:64;;;;-1:-1:-1;;;6889:64:0;;;;;;;:::i;:::-;33235:14:::1;::::0;;;:8:::1;:14;::::0;;;;:29;-1:-1:-1;;;33235:29:0;::::1;-1:-1:-1::0;;;;;33235:29:0::1;:34:::0;33227:66:::1;;;;-1:-1:-1::0;;;33227:66:0::1;;;;;;;:::i;:::-;33373:15;::::0;33329::::1;::::0;33373:31:::1;::::0;33393:10;33373:19:::1;:31::i;:::-;33355:15;:49:::0;33434:154:::1;::::0;;::::1;::::0;::::1;::::0;;;-1:-1:-1;33434:154:0;;::::1;::::0;::::1;33518:21;:14:::0;:19:::1;:21::i;:::-;-1:-1:-1::0;;;;;33434:154:0::1;;;;;33470:17;:10;:15;:17::i;:::-;-1:-1:-1::0;;;;;33434:154:0;;::::1;::::0;;;33417:14:::1;::::0;;;:8:::1;:14;::::0;;;;;;;:171;;;;;;::::1;::::0;;;::::1;::::0;;::::1;-1:-1:-1::0;;;33417:171:0::1;-1:-1:-1::0;;;;;33417:171:0;;;::::1;-1:-1:-1::0;;;33417:171:0::1;-1:-1:-1::0;;;;;;;;;33417:171:0;;::::1;-1:-1:-1::0;;;;;;33417:171:0;;::::1;::::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;33599:7:::1;:18:::0;;33417:171;33599:18;::::1;::::0;;;;;::::1;::::0;;;33633:33;33426:4;;33633:33:::1;::::0;::::1;::::0;33655:10;;33633:33:::1;:::i;:::-;;;;;;;;6964:1;33152:522:::0;;:::o;5515:20::-;;;-1:-1:-1;;;;;5515:20:0;;:::o;29721:30::-;;;;:::o;30725:1045::-;32631:10;-1:-1:-1;;;;;32645:13:0;32631:27;;32609:110;;;;-1:-1:-1;;;32609:110:0;;;;;;;:::i;:::-;29933:8:::1;;29945:1;29933:13;29925:32;;;;-1:-1:-1::0;;;29925:32:0::1;;;;;;;:::i;:::-;29979:1;29968:8;:12:::0;30861:20:::2;;:::i;:::-;30884:15;30895:3;30884:10;:15::i;:::-;30910:21;30934:13:::0;;;:8:::2;:13;::::0;;;;;;;-1:-1:-1;;;;;30934:20:0;::::2;::::0;;;;;;;30995:11;;30861:38;;-1:-1:-1;30934:20:0;30995:15;30991:579:::2;;31054:150;31185:4;:18;;;31054:126;31146:4;:15;;;29805:4;31055:41;31071:4;:24;;;-1:-1:-1::0;;;;;31055:41:0::2;:4;:11;;;:15;;:41;;;;:::i;31054:150::-;31027:177;;31219:15;31237:11;-1:-1:-1::0;;;;;31237:21:0::2;;31267:4;31237:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31219:54;;31302:7;31292;:17;31288:271;;;31330:37;-1:-1:-1::0;;;;;31330:11:0::2;:24;31355:2:::0;31359:7;31330:24:::2;:37::i;:::-;31407:17:::0;;::::2;31386:18;::::0;::::2;:38:::0;31288:271:::2;;;31465:37;-1:-1:-1::0;;;;;31465:11:0::2;:24;31490:2:::0;31494:7;31465:24:::2;:37::i;:::-;31542:1;31521:18;::::0;::::2;:22:::0;31288:271:::2;30991:579;;31580:21:::0;;;31642:24;;29805:4:::2;::::0;31630:37:::2;::::0;31594:7;;-1:-1:-1;;;;;31630:37:0::2;:11;:37::i;:::-;:59;;;;;;31612:4;:15;;:77;;;;31759:2;-1:-1:-1::0;;;;;31705:57:0::2;31724:3;31717:5;-1:-1:-1::0;;;;;31705:57:0::2;;31739:4;:18;;;31729:7;:28;31705:57;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;30014:1:0::1;30003:8;:12:::0;-1:-1:-1;;;;;;30725:1045:0:o;29522:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34714:251::-;6911:5;;-1:-1:-1;;;;;6911:5:0;6897:10;:19;6889:64;;;;-1:-1:-1;;;6889:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34820:19:0;::::1;34816:142;;34856:19;::::0;-1:-1:-1;;;;;34856:11:0;::::1;::::0;:19;::::1;;;::::0;34868:6;;34856:19:::1;::::0;;;34868:6;34856:11;:19;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;34816:142;;;34908:38;-1:-1:-1::0;;;;;34908:26:0;::::1;34935:2:::0;34939:6;34908:26:::1;:38::i;31778:426::-:0;31974:15;;;31987:1;31974:15;;;;;;;;;31869:28;;;;;;31974:15;;;;;;;;;;;-1:-1:-1;31974:15:0;31942:47;;32020:11;32000:13;32014:1;32000:16;;;;;;;;-1:-1:-1;;;;;32000:32:0;;;;:16;;;;;;;;;;;:32;32077:16;;;32091:1;32077:16;;;;;;;;;32043:31;;32077:16;;;;;;;;;;;;-1:-1:-1;32077:16:0;32043:50;;32124:23;32137:3;32142:4;32124:12;:23::i;:::-;32104:14;32119:1;32104:17;;;;;;;;;;;;;;;;;:43;32166:13;;;;-1:-1:-1;31778:426:0;-1:-1:-1;;;;31778:426:0:o;5562:27::-;;;-1:-1:-1;;;;;5562:27:0;;:::o;3504:122::-;3587:5;;;3582:16;;;;3574:50;;;;-1:-1:-1;;;3574:50:0;;;;;;;:::i;:::-;3504:122;;;;:::o;3373:125::-;3456:5;;;3451:16;;;;3443:53;;;;-1:-1:-1;;;3443:53:0;;;;;;;:::i;3942:156::-;3990:8;-1:-1:-1;;;;;4019:15:0;;;4011:55;;;;-1:-1:-1;;;4011:55:0;;;;;;;:::i;:::-;-1:-1:-1;4088:1:0;3942:156::o;3632:137::-;3690:9;3710:6;;;:28;;-1:-1:-1;;3725:5:0;;;3737:1;3732;3725:5;3732:1;3720:13;;;;;:18;3710:28;3702:65;;;;-1:-1:-1;;;3702:65:0;;;;;;;:::i;3775:161::-;3824:9;-1:-1:-1;;;;;3854:16:0;;;3846:57;;;;-1:-1:-1;;;3846:57:0;;;;;;;:::i;4296:125::-;4379:5;;;-1:-1:-1;;;;;4374:16:0;;;;;;;;4366:53;;;;-1:-1:-1;;;4366:53:0;;;;;;;:::i;2051:304::-;2136:12;2150:17;2179:5;-1:-1:-1;;;;;2171:19:0;2214:10;2226:2;2230:6;2191:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2191:46:0;;;;;;;;;;;2171:67;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2135:103;;;;2257:7;:57;;;;-1:-1:-1;2269:11:0;;:16;;:44;;;2300:4;2289:24;;;;;;;;;;;;:::i;:::-;2249:98;;;;-1:-1:-1;;;2249:98:0;;;;;;;:::i;:::-;2051:304;;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1384:479::-;;;;1516:2;1504:9;1495:7;1491:23;1487:32;1484:2;;;-1:-1;;1522:12;1484:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;1574:63;-1:-1;1674:2;1710:22;;737:20;762:30;737:20;762:30;:::i;:::-;1682:60;-1:-1;1779:2;1815:22;;737:20;762:30;737:20;762:30;:::i;:::-;1787:60;;;;1478:385;;;;;:::o;1870:507::-;;;;2016:2;2004:9;1995:7;1991:23;1987:32;1984:2;;;-1:-1;;2022:12;1984:2;85:6;72:20;97:33;124:5;97:33;:::i;:::-;2074:63;-1:-1;2174:2;2213:22;;1173:20;;-1:-1;2282:2;2329:22;;217:20;242:41;217:20;242:41;:::i;2384:397::-;;;2523:2;2511:9;2502:7;2498:23;2494:32;2491:2;;;-1:-1;;2529:12;2491:2;2587:17;2574:31;-1:-1;;;;;2625:18;2617:6;2614:30;2611:2;;;-1:-1;;2647:12;2611:2;2748:6;2737:9;2733:22;;;443:3;436:4;428:6;424:17;420:27;410:2;;-1:-1;;451:12;410:2;494:6;481:20;2625:18;513:6;510:30;507:2;;;-1:-1;;543:12;507:2;638:3;2523:2;;622:6;618:17;579:6;604:32;;601:41;598:2;;;-1:-1;;645:12;598:2;2523;575:17;;;;;2667:98;;-1:-1;2485:296;;-1:-1;;;;2485:296::o;2788:257::-;;2900:2;2888:9;2879:7;2875:23;2871:32;2868:2;;;-1:-1;;2906:12;2868:2;885:6;879:13;897:30;921:5;897:30;:::i;:::-;2958:71;2862:183;-1:-1;;;2862:183::o;3052:289::-;;3180:2;3168:9;3159:7;3155:23;3151:32;3148:2;;;-1:-1;;3186:12;3148:2;1036:6;1030:13;1048:46;1088:5;1048:46;:::i;3348:241::-;;3452:2;3440:9;3431:7;3427:23;3423:32;3420:2;;;-1:-1;;3458:12;3420:2;-1:-1;1173:20;;3414:175;-1:-1;3414:175::o;3596:263::-;;3711:2;3699:9;3690:7;3686:23;3682:32;3679:2;;;-1:-1;;3717:12;3679:2;-1:-1;1321:13;;3673:186;-1:-1;3673:186::o;3866:366::-;;;3987:2;3975:9;3966:7;3962:23;3958:32;3955:2;;;-1:-1;;3993:12;3955:2;1186:6;1173:20;4045:63;;4145:2;4188:9;4184:22;72:20;97:33;124:5;97:33;:::i;:::-;4153:63;;;;3949:283;;;;;:::o;4239:743::-;;;;;;4411:3;4399:9;4390:7;4386:23;4382:33;4379:2;;;-1:-1;;4418:12;4379:2;1186:6;1173:20;4470:63;;4570:2;4613:9;4609:22;72:20;97:33;124:5;97:33;:::i;:::-;4578:63;-1:-1;4678:2;4717:22;;72:20;97:33;72:20;97:33;:::i;:::-;4373:609;;;;-1:-1;4686:63;;4786:2;4825:22;;1173:20;;-1:-1;4894:3;4934:22;1173:20;;4373:609;-1:-1;;4373:609::o;4989:491::-;;;;5127:2;5115:9;5106:7;5102:23;5098:32;5095:2;;;-1:-1;;5133:12;5095:2;1186:6;1173:20;5185:63;;5285:2;5328:9;5324:22;72:20;97:33;124:5;97:33;:::i;:::-;5089:391;;5293:63;;-1:-1;;;5393:2;5432:22;;;;1173:20;;5089:391::o;5487:366::-;;;5608:2;5596:9;5587:7;5583:23;5579:32;5576:2;;;-1:-1;;5614:12;5576:2;-1:-1;;1173:20;;;5766:2;5805:22;;;1173:20;;-1:-1;5570:283::o;6069:173::-;13623:37;;6231:4;6222:14;;6149:93::o;14016:271::-;;8061:5;22949:12;-1:-1;25511:101;25525:6;25522:1;25519:13;25511:101;;;8205:4;25592:11;;;;;25586:18;25573:11;;;25566:39;25540:10;25511:101;;;25627:6;25624:1;25621:13;25618:2;;;-1:-1;25683:6;25678:3;25674:16;25667:27;25618:2;-1:-1;8236:16;;;;;14150:137;-1:-1;;14150:137::o;14294:222::-;-1:-1;;;;;24793:54;;;;6321:37;;14421:2;14406:18;;14392:124::o;14523:333::-;-1:-1;;;;;24793:54;;;;6321:37;;14842:2;14827:18;;13623:37;14678:2;14663:18;;14649:207::o;14863:655::-;15131:2;15145:47;;;22949:12;;15116:18;;;23624:19;;;14863:655;;23673:4;;23664:14;;;;22632;;;14863:655;6856:286;6881:6;6878:1;6875:13;6856:286;;;6942:13;;-1:-1;;;;;24793:54;8338:63;;6040:14;;;;23364;;;;2625:18;6896:9;6856:286;;;6860:14;;;15375:9;15369:4;15365:20;23673:4;15349:9;15345:18;15338:48;15400:108;7396:5;22949:12;7415:86;7494:6;7489:3;7415:86;:::i;:::-;7408:93;;23673:4;7572:5;22632:14;7584:21;;-1:-1;7611:260;7636:6;7633:1;7630:13;7611:260;;;7724:63;7783:3;7703:6;7697:13;7724:63;:::i;:::-;23364:14;;;;7717:70;-1:-1;6903:1;7651:9;7611:260;;;-1:-1;15392:116;;15102:416;-1:-1;;;;;;;15102:416::o;15525:::-;15725:2;15739:47;;;8638:2;15710:18;;;23624:19;-1:-1;;;23664:14;;;8654:44;8717:12;;;15696:245::o;15948:416::-;16148:2;16162:47;;;8968:2;16133:18;;;23624:19;-1:-1;;;23664:14;;;8984:42;9045:12;;;16119:245::o;16371:416::-;16571:2;16585:47;;;9296:2;16556:18;;;23624:19;9332:30;23664:14;;;9312:51;9382:12;;;16542:245::o;16794:416::-;16994:2;17008:47;;;9633:2;16979:18;;;23624:19;9669:34;23664:14;;;9649:55;-1:-1;;;9724:12;;;9717:25;9761:12;;;16965:245::o;17217:416::-;17417:2;17431:47;;;10012:2;17402:18;;;23624:19;-1:-1;;;23664:14;;;10028:44;10091:12;;;17388:245::o;17640:416::-;17840:2;17854:47;;;10342:2;17825:18;;;23624:19;10378:30;23664:14;;;10358:51;10428:12;;;17811:245::o;18063:416::-;18263:2;18277:47;;;10679:2;18248:18;;;23624:19;10715:26;23664:14;;;10695:47;10761:12;;;18234:245::o;18486:416::-;18686:2;18700:47;;;18671:18;;;23624:19;11048:34;23664:14;;;11028:55;11102:12;;;18657:245::o;18909:416::-;19109:2;19123:47;;;19094:18;;;23624:19;11389:34;23664:14;;;11369:55;11443:12;;;19080:245::o;19332:416::-;19532:2;19546:47;;;11694:2;19517:18;;;23624:19;11730:29;23664:14;;;11710:50;11779:12;;;19503:245::o;19755:416::-;19955:2;19969:47;;;12030:1;19940:18;;;23624:19;-1:-1;;;23664:14;;;12045:29;12093:12;;;19926:245::o;20178:416::-;20378:2;20392:47;;;12344:2;20363:18;;;23624:19;12380:26;23664:14;;;12360:47;12426:12;;;20349:245::o;20601:326::-;12759:23;;-1:-1;;;;;24673:46;13260:37;;12940:4;12929:16;;;12923:23;-1:-1;;;;;24999:30;;;12998:14;;;13851:36;;;;13098:4;13087:16;;;13081:23;24999:30;13156:14;;;13851:36;;;;20780:2;20765:18;;20751:176::o;20934:436::-;-1:-1;;;;;24673:46;;;;13260:37;;-1:-1;;;;;24999:30;;;21275:2;21260:18;;13851:36;24999:30;21356:2;21341:18;;13851:36;21113:2;21098:18;;21084:286::o;21377:222::-;13623:37;;;21504:2;21489:18;;21475:124::o;21606:444::-;13623:37;;;21953:2;21938:18;;13623:37;;;;22036:2;22021:18;;13623:37;21789:2;21774:18;;21760:290::o;22057:440::-;-1:-1;;;;;24999:30;;;;13851:36;;22400:2;22385:18;;13623:37;;;;-1:-1;;;;;24673:46;22483:2;22468:18;;13500:50;22238:2;22223:18;;22209:288::o;25715:117::-;-1:-1;;;;;24793:54;;25774:35;;25764:2;;25823:1;;25813:12;25764:2;25758:74;:::o;25979:111::-;26060:5;24474:13;24467:21;26038:5;26035:32;26025:2;;26081:1;;26071:12
Swarm Source
ipfs://3959585b89e2f2d253562af30cfacb00a4913240bfe885e69c3d984fad8270d8
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in GLMR
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
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.