More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 97 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Exit | 13958651 | 924 days ago | IN | 0 ETH | 0.01670591 | ||||
Exit | 13951226 | 925 days ago | IN | 0 ETH | 0.01728765 | ||||
Exit | 12730842 | 1115 days ago | IN | 0 ETH | 0.00203884 | ||||
Exit | 12657388 | 1127 days ago | IN | 0 ETH | 0.00220491 | ||||
Exit | 12655971 | 1127 days ago | IN | 0 ETH | 0.00132639 | ||||
Exit | 12642823 | 1129 days ago | IN | 0 ETH | 0.00140312 | ||||
Exit | 12633463 | 1130 days ago | IN | 0 ETH | 0.00128772 | ||||
Exit | 12633461 | 1130 days ago | IN | 0 ETH | 0.00362809 | ||||
Exit | 12626250 | 1132 days ago | IN | 0 ETH | 0.00183347 | ||||
Exit | 12606858 | 1135 days ago | IN | 0 ETH | 0.0030067 | ||||
Get Reward | 12573553 | 1140 days ago | IN | 0 ETH | 0.00170597 | ||||
Exit | 12569383 | 1140 days ago | IN | 0 ETH | 0.00366694 | ||||
Exit | 12528049 | 1147 days ago | IN | 0 ETH | 0.00400894 | ||||
Exit | 12527649 | 1147 days ago | IN | 0 ETH | 0.00481072 | ||||
Get Reward | 12524165 | 1147 days ago | IN | 0 ETH | 0.00556558 | ||||
Exit | 12506679 | 1150 days ago | IN | 0 ETH | 0.00781743 | ||||
Exit | 12483802 | 1154 days ago | IN | 0 ETH | 0.00841877 | ||||
Exit | 12481439 | 1154 days ago | IN | 0 ETH | 0.00721609 | ||||
Exit | 12477234 | 1155 days ago | IN | 0 ETH | 0.00761698 | ||||
Exit | 12476374 | 1155 days ago | IN | 0 ETH | 0.00770057 | ||||
Exit | 12467176 | 1156 days ago | IN | 0 ETH | 0.03407599 | ||||
Exit | 12452158 | 1159 days ago | IN | 0 ETH | 0.00916735 | ||||
Exit | 12450728 | 1159 days ago | IN | 0 ETH | 0.01242771 | ||||
Exit | 12450027 | 1159 days ago | IN | 0 ETH | 0.01543441 | ||||
Exit | 12446076 | 1160 days ago | IN | 0 ETH | 0.00935069 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
StakingRewardsv2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-02-26 */ // File: @openzeppelin/contracts/math/Math.sol // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a >= b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow, so we distribute return (a / 2) + (b / 2) + ((a % 2 + b % 2) / 2); } } // File: @openzeppelin/contracts/math/SafeMath.sol // -License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // 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; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned 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(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. 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 mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // -License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File: @openzeppelin/contracts/utils/Address.sol // -License-Identifier: MIT pragma solidity ^0.6.2; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return _functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); return _functionCallWithValue(target, data, value, errorMessage); } function _functionCallWithValue(address target, bytes memory data, uint256 weiValue, string memory errorMessage) private returns (bytes memory) { require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: weiValue }(data); if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC20/SafeERC20.sol // -License-Identifier: MIT pragma solidity ^0.6.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; using Address for address; function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require((value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File: contracts/utils/ContractGuard.sol pragma solidity ^0.6.12; contract ContractGuard { mapping(uint256 => mapping(address => bool)) private _status; function checkSameOriginReentranted() internal view returns (bool) { return _status[block.number][tx.origin]; } function checkSameSenderReentranted() internal view returns (bool) { return _status[block.number][msg.sender]; } modifier onlyOneBlock() { require( !checkSameOriginReentranted(), 'ContractGuard: one block, one function' ); require( !checkSameSenderReentranted(), 'ContractGuard: one block, one function' ); _; _status[block.number][tx.origin] = true; _status[block.number][msg.sender] = true; } } // File: @openzeppelin/contracts/GSN/Context.sol // -License-Identifier: MIT pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // -License-Identifier: MIT pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/ILpMigratorRecipient.sol pragma solidity ^0.6.0; abstract contract ILpMigratorRecipient is Ownable { address public lpMigrator; modifier onlyLpMigrator() { require( _msgSender() == lpMigrator, 'Caller is not LpMigrator' ); _; } function setLpMigrator(address _lpMigrator) external virtual onlyOwner { lpMigrator = _lpMigrator; } } // File: contracts/interfaces/IStakingRewardsv2.sol pragma solidity ^0.6.0; interface IStakingRewardsv2 { function balanceOf(address account) external view returns (uint256); function exit() external; function getReward() external; function stakeLockedFor(address user, uint256 amount, uint256 convertedAmount) external; function totalSupply() external view returns (uint256); function totalRewardAmount() external view returns (uint256); function totalRewardBurned() external view returns (uint256); function calculateRewardAmount(uint256 convertedAmount) external view returns (uint256); function getRedeemableReward(address user) external view returns (uint256); } // File: contracts/interfaces/IOracle.sol pragma solidity ^0.6.0; interface IOracle { function update() external; function consult(address token, uint256 amountIn) external view returns (uint256 amountOut); // function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestamp); } // File: contracts/owner/Operator.sol pragma solidity ^0.6.0; contract Operator is Context, Ownable { address private _operator; event OperatorTransferred( address indexed previousOperator, address indexed newOperator ); constructor() internal { _operator = _msgSender(); emit OperatorTransferred(address(0), _operator); } function operator() public view returns (address) { return _operator; } modifier onlyOperator() { require( _operator == msg.sender, 'operator: caller is not the operator' ); _; } function isOperator() public view returns (bool) { return _msgSender() == _operator; } function transferOperator(address newOperator_) public onlyOwner { _transferOperator(newOperator_); } function _transferOperator(address newOperator_) internal { require( newOperator_ != address(0), 'operator: zero address given for new operator' ); emit OperatorTransferred(address(0), newOperator_); _operator = newOperator_; } } // File: contracts/utils/Epoch.sol pragma solidity ^0.6.0; contract Epoch is Operator { using SafeMath for uint256; uint256 private period; uint256 private startTime; uint256 private lastExecutedAt; /* ========== CONSTRUCTOR ========== */ constructor( uint256 _period, uint256 _startTime, uint256 _startEpoch ) public { require(_startTime > block.timestamp, 'Epoch: invalid start time'); period = _period; startTime = _startTime; lastExecutedAt = startTime.add(_startEpoch.mul(period)); } /* ========== Modifier ========== */ modifier checkStartTime { require(now >= startTime, 'Epoch: not started yet'); _; } modifier checkEpoch { require(now > startTime, 'Epoch: not started yet'); require(getCurrentEpoch() >= getNextEpoch(), 'Epoch: not allowed'); _; lastExecutedAt = block.timestamp; } /* ========== VIEW FUNCTIONS ========== */ // epoch function getLastEpoch() public view returns (uint256) { return lastExecutedAt.sub(startTime).div(period); } function getCurrentEpoch() public view returns (uint256) { return Math.max(startTime, block.timestamp).sub(startTime).div(period); } function getNextEpoch() public view returns (uint256) { if (startTime == lastExecutedAt) { return getLastEpoch(); } return getLastEpoch().add(1); } function nextEpochPoint() public view returns (uint256) { return startTime.add(getNextEpoch().mul(period)); } // params function getPeriod() public view returns (uint256) { return period; } function getStartTime() public view returns (uint256) { return startTime; } /* ========== GOVERNANCE ========== */ function setPeriod(uint256 _period) external onlyOperator { period = _period; } } // File: contracts/distribution/StakingRewardsv2.sol pragma solidity ^0.6.0; // Inheritance contract StakingRewardsv2 is IStakingRewardsv2, ILpMigratorRecipient, ContractGuard, Operator, Epoch { using SafeMath for uint256; using SafeERC20 for IERC20; uint256 constant private ONE_DOLLAR_PRICE = 1000000; uint256 constant TOTAL_EPOCH = 10; /* ========== STATE VARIABLES ========== */ IERC20 public rewardsToken; IERC20 public stakingToken; uint256 public unlockEpoch; bool public isStartRewards; mapping(address => uint256) public rewardsPaid; mapping(address => uint256) public rewards; uint256 private _totalRewardAmount; uint256 private _totalRewardBurned; uint256 private _totalSupply; mapping(address => uint256) private _balances; //Tokens address public cash_old; //Contracts address public cashOracle; /* ========== CONSTRUCTOR ========== */ constructor( address _lpMigrator, address _rewardsToken, address _stakingToken, address _cash_old, address _cashOracle, uint256 _startTime, uint256 _unlockEpoch ) Epoch(7 days, _startTime, 0) public { rewardsToken = IERC20(_rewardsToken); stakingToken = IERC20(_stakingToken); lpMigrator = _lpMigrator; cash_old = _cash_old; cashOracle = _cashOracle; unlockEpoch = _unlockEpoch; } /* ========== VIEWS ========== */ function getOraclePrice() public view returns (uint256) { try IOracle(cashOracle).consult(cash_old, 1e18) returns (uint256 price) { return price; } catch { revert('StakingRewards: failed to consult cash price from the oracle'); } } function totalRewardAmount() external view override returns (uint256) { return _totalRewardAmount; } function totalRewardBurned() external view override returns (uint256) { return _totalRewardBurned; } function totalSupply() external view override returns (uint256) { return _totalSupply; } function balanceOf(address account) external view override returns (uint256) { return _balances[account]; } function calculateRewardAmount(uint256 convertedAmount) public view override returns (uint256) { uint256 price = getOraclePrice(); // no reward if MICv1 price > 1 if (price > ONE_DOLLAR_PRICE) { return 0; } // rewards = MIC V1 converted * 1 / x - 1 return convertedAmount.mul(ONE_DOLLAR_PRICE).div(getOraclePrice()).sub(convertedAmount); } /* ========== MUTATIVE FUNCTIONS ========== */ function _burnReward(address user, uint256 amount) private { uint256 currentReward = rewards[user]; require(currentReward.sub(amount) >= rewardsPaid[user], 'StakingRewards: reward burned should not exceed total reward'); rewards[user] = rewards[user].sub(amount); _totalRewardBurned = _totalRewardBurned.add(amount); _totalRewardAmount = _totalRewardAmount.sub(amount); emit RewardBurn(user, amount); } function getRedeemableReward(address user) public view override returns (uint256){ uint256 reward = rewards[user]; if (getCurrentEpoch() >= TOTAL_EPOCH) { return reward; } uint256 multiplier = ONE_DOLLAR_PRICE.mul(getCurrentEpoch()).div(TOTAL_EPOCH); return reward.mul(multiplier).div(ONE_DOLLAR_PRICE); } function getReward() public override onlyOneBlock checkUnlock { uint256 rewardPaid = rewardsPaid[msg.sender]; uint256 redeemableReward = getRedeemableReward(msg.sender); if (rewardPaid < redeemableReward) { uint256 currentRewardAmount = redeemableReward.sub(rewardPaid); rewardsPaid[msg.sender] = rewardsPaid[msg.sender].add(currentRewardAmount); rewardsToken.safeTransfer(msg.sender, currentRewardAmount); emit RewardPaid(msg.sender, currentRewardAmount); } } function _withdrawFor(address user, uint256 amount) private { require(amount > 0, "StakingRewards: Cannot withdraw 0"); _totalSupply = _totalSupply.sub(amount); _balances[user] = _balances[user].sub(amount); stakingToken.safeTransfer(user, amount); emit Withdrawn(user, amount); } function exit() public override checkUnlock { // reward will be burned when users exit. get redeemable reward before exit. getReward(); uint256 unredeemedReward = rewards[msg.sender].sub(rewardsPaid[msg.sender]); _burnReward(msg.sender, unredeemedReward); _withdrawFor(msg.sender, _balances[msg.sender]); } /* ========== RESTRICTED FUNCTIONS ========== */ // calculate the amount of MICv2 users can get for converted amount function startRewards() public onlyOperator checkStartTime { require(!isStartRewards, 'StakingRewards: Rewards already started'); isStartRewards = true; rewardsToken.safeTransferFrom(msg.sender, address(this), _totalRewardAmount); } // stakeLockedFor locked MICV2 LP Token and distribute reward according to converted MICv1 amount function stakeLockedFor(address user, uint256 stakeAmount, uint256 convertedAmount) external override onlyLpMigrator { require(getOraclePrice() < ONE_DOLLAR_PRICE, 'StakingRewards: Cannot stake while price > 1'); require(stakeAmount > 0, 'StakingRewards: Cannot stake 0'); require(!isStartRewards, 'StakingRewards: Cannot stake after start time'); _totalSupply = _totalSupply.add(stakeAmount); _balances[user] = _balances[user].add(stakeAmount); uint256 rewardAmount = calculateRewardAmount(convertedAmount); rewards[user] = rewards[user].add(rewardAmount); _totalRewardAmount = _totalRewardAmount.add(rewardAmount); stakingToken.safeTransferFrom(msg.sender, address(this), stakeAmount); emit Staked(user, stakeAmount); emit RewardAdded(rewardAmount); } // Added to support recovering LP Rewards from other systems such as BAL to be distributed to holders function recoverERC20(address tokenAddress, uint256 tokenAmount) external onlyOwner { require(tokenAddress != address(stakingToken), "StakingRewards: Cannot withdraw the staking token"); IERC20(tokenAddress).safeTransfer(msg.sender, tokenAmount); emit Recovered(tokenAddress, tokenAmount); } /* ========== MODIFIERS ========== */ modifier checkUnlock { require(getCurrentEpoch() >= unlockEpoch, 'StakingRewards: not unlocked yer'); _; } /* ========== EVENTS ========== */ event RewardAdded(uint256 reward); event Staked(address indexed user, uint256 amount); event Withdrawn(address indexed user, uint256 amount); event RewardPaid(address indexed user, uint256 reward); event RewardBurn(address indexed user, uint256 reward); event Recovered(address token, uint256 amount); }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lpMigrator","type":"address"},{"internalType":"address","name":"_rewardsToken","type":"address"},{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_cash_old","type":"address"},{"internalType":"address","name":"_cashOracle","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"},{"internalType":"uint256","name":"_unlockEpoch","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOperator","type":"address"},{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"convertedAmount","type":"uint256"}],"name":"calculateRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cashOracle","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cash_old","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"exit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getCurrentEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNextEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOraclePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getRedeemableReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getStartTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isStartRewards","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpMigrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextEpochPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewardsPaid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardsToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_lpMigrator","type":"address"}],"name":"setLpMigrator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_period","type":"uint256"}],"name":"setPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"stakeAmount","type":"uint256"},{"internalType":"uint256","name":"convertedAmount","type":"uint256"}],"name":"stakeLockedFor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalRewardAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRewardBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator_","type":"address"}],"name":"transferOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockEpoch","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001f4838038062001f48833981810160405260e08110156200003757600080fd5b508051602082015160408301516060840151608085015160a086015160c090960151949593949293919290919062093a80826000806200007662000216565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350620000ca62000216565b600380546001600160a01b0319166001600160a01b0392831617908190556040519116906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a34282116200016b576040805162461bcd60e51b815260206004820152601960248201527f45706f63683a20696e76616c69642073746172742074696d6500000000000000604482015290519081900360640190fd5b60048390556005829055620001a86200019182856200021a602090811b6200119e17901c565b6005546200028160201b620012001790919060201c565b6006555050600780546001600160a01b03199081166001600160a01b03998a16179091556008805482169789169790971790965550600180548616978716979097179096555060118054841692851692909217909155601280549092169216919091179055600955620002dc565b3390565b6000826200022b575060006200027b565b828202828482816200023957fe5b0414620002785760405162461bcd60e51b815260040180806020018281038252602181526020018062001f276021913960400191505060405180910390fd5b90505b92915050565b60008282018381101562000278576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b611c3b80620002ec6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806377bd9eb411610125578063b6d6c4d4116100ad578063d1af0c7d1161007c578063d1af0c7d14610476578063e7a4e8a61461047e578063e9fad8ee14610486578063efe97d051461048e578063f2fde38b1461049657610211565b8063b6d6c4d414610456578063b97dd9e21461045e578063c5967c2614610466578063c828371e1461046e57610211565b80638da5cb5b116100f45780638da5cb5b146104195780638e73064f146104215780639d6b522a14610429578063a08f77dd14610446578063b456cf191461044e57610211565b806377bd9eb4146103b7578063796da7af146103bf57806380d3d79d146103c75780638980f11f146103ed57610211565b80634456eda2116101a85780636e958835116101775780636e95883514610335578063700a4a741461035b57806370a0823114610381578063715018a6146103a757806372f702f3146103af57610211565b80634456eda2146102bb578063570ca735146102d75780635a4519ea146102fb5780635fdc4d5c1461030357610211565b806329605e77116101e457806329605e771461027d5780632dfd0bdc146102a3578063398bac63146102ab5780633d18b912146102b357610211565b80630700037d146102165780630f3a9f651461024e57806318160ddd1461026d5780631ed2419514610275575b600080fd5b61023c6004803603602081101561022c57600080fd5b50356001600160a01b03166104bc565b60408051918252519081900360200190f35b61026b6004803603602081101561026457600080fd5b50356104ce565b005b61023c61051c565b61023c610523565b61026b6004803603602081101561029357600080fd5b50356001600160a01b0316610529565b61026b61058d565b61023c610696565b61026b6106c0565b6102c3610896565b604080519115158252519081900360200190f35b6102df6108bc565b604080516001600160a01b039092168252519081900360200190f35b6102df6108cb565b61026b6004803603606081101561031957600080fd5b506001600160a01b0381351690602081013590604001356108da565b61023c6004803603602081101561034b57600080fd5b50356001600160a01b0316610b5f565b61023c6004803603602081101561037157600080fd5b50356001600160a01b0316610bc7565b61023c6004803603602081101561039757600080fd5b50356001600160a01b0316610bd9565b61026b610bf4565b6102df610c96565b61023c610ca5565b61023c610cab565b61026b600480360360208110156103dd57600080fd5b50356001600160a01b0316610d74565b61026b6004803603604081101561040357600080fd5b506001600160a01b038135169060200135610dee565b6102df610eef565b61023c610efe565b61023c6004803603602081101561043f57600080fd5b5035610f04565b6102c3610f4f565b6102df610f58565b61023c610f67565b61023c610f6d565b61023c610f87565b61023c610fa9565b6102df610faf565b6102df610fbe565b61026b610fcd565b61023c61107d565b61026b600480360360208110156104ac57600080fd5b50356001600160a01b03166110a6565b600c6020526000908152604090205481565b6003546001600160a01b031633146105175760405162461bcd60e51b8152600401808060200182810382526024815260200180611b666024913960400191505060405180910390fd5b600455565b600f545b90565b60045490565b61053161125a565b6000546001600160a01b03908116911614610581576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b61058a8161125e565b50565b6003546001600160a01b031633146105d65760405162461bcd60e51b8152600401808060200182810382526024815260200180611b666024913960400191505060405180910390fd5b600554421015610626576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b600a5460ff16156106685760405162461bcd60e51b81526004018080602001828103825260278152602001806119da6027913960400191505060405180910390fd5b600a805460ff19166001179055600d54600754610694916001600160a01b0390911690339030906112fb565b565b60006106bb6004546106b560055460065461135b90919063ffffffff16565b9061139d565b905090565b6106c86113df565b156107045760405162461bcd60e51b8152600401808060200182810382526026815260200180611bb46026913960400191505060405180910390fd5b61070c611400565b156107485760405162461bcd60e51b8152600401808060200182810382526026815260200180611bb46026913960400191505060405180910390fd5b600954610753610f6d565b10156107a6576040805162461bcd60e51b815260206004820181905260248201527f5374616b696e67526577617264733a206e6f7420756e6c6f636b656420796572604482015290519081900360640190fd5b336000818152600b6020526040812054916107c090610b5f565b9050808210156108575760006107d6828461135b565b336000908152600b60205260409020549091506107f39082611200565b336000818152600b602052604090209190915560075461081f916001600160a01b039091169083611421565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a2505b50504360009081526002602090815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6003546000906001600160a01b03166108ad61125a565b6001600160a01b031614905090565b6003546001600160a01b031690565b6001546001600160a01b031681565b6001546001600160a01b03166108ee61125a565b6001600160a01b031614610949576040805162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74204c704d69677261746f720000000000000000604482015290519081900360640190fd5b620f4240610955610cab565b106109915760405162461bcd60e51b815260040180806020018281038252602c815260200180611bda602c913960400191505060405180910390fd5b600082116109e6576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e67526577617264733a2043616e6e6f74207374616b6520300000604482015290519081900360640190fd5b600a5460ff1615610a285760405162461bcd60e51b815260040180806020018281038252602d815260200180611a5e602d913960400191505060405180910390fd5b600f54610a359083611200565b600f556001600160a01b038316600090815260106020526040902054610a5b9083611200565b6001600160a01b038416600090815260106020526040812091909155610a8082610f04565b6001600160a01b0385166000908152600c6020526040902054909150610aa69082611200565b6001600160a01b0385166000908152600c6020526040902055600d54610acc9082611200565b600d55600854610ae7906001600160a01b03163330866112fb565b6040805184815290516001600160a01b038616917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a26040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505050565b6001600160a01b0381166000908152600c6020526040812054600a610b82610f6d565b10610b8e579050610bc2565b6000610baa600a6106b5610ba0610f6d565b620f42409061119e565b9050610bbd620f42406106b5848461119e565b925050505b919050565b600b6020526000908152604090205481565b6001600160a01b031660009081526010602052604090205490565b610bfc61125a565b6000546001600160a01b03908116911614610c4c576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6008546001600160a01b031681565b600e5490565b60125460115460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a7640000602482015290516000939290921691633ddac95391604480820192602092909190829003018186803b158015610d0d57600080fd5b505afa925050508015610d3257506040513d6020811015610d2d57600080fd5b505160015b610d6d5760405162461bcd60e51b815260040180806020018281038252603c815260200180611ab8603c913960400191505060405180910390fd5b9050610520565b610d7c61125a565b6000546001600160a01b03908116911614610dcc576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610df661125a565b6000546001600160a01b03908116911614610e46576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b6008546001600160a01b0383811691161415610e935760405162461bcd60e51b8152600401808060200182810382526031815260200180611b156031913960400191505060405180910390fd5b610ea76001600160a01b0383163383611421565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b6000546001600160a01b031690565b600d5490565b600080610f0f610cab565b9050620f4240811115610f26576000915050610bc2565b610f4883610f42610f35610cab565b6106b587620f424061119e565b9061135b565b9392505050565b600a5460ff1681565b6011546001600160a01b031681565b60095481565b60006106bb6004546106b5600554610f4260055442611478565b60006106bb610fa0600454610f9a61107d565b9061119e565b60055490611200565b60055490565b6007546001600160a01b031681565b6012546001600160a01b031681565b600954610fd8610f6d565b101561102b576040805162461bcd60e51b815260206004820181905260248201527f5374616b696e67526577617264733a206e6f7420756e6c6f636b656420796572604482015290519081900360640190fd5b6110336106c0565b336000908152600b6020908152604080832054600c9092528220546110579161135b565b9050611063338261148f565b3360008181526010602052604090205461058a919061159b565b6000600654600554141561109357610d6d610696565b6106bb60016110a0610696565b90611200565b6110ae61125a565b6000546001600160a01b039081169116146110fe576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b6001600160a01b0381166111435760405162461bcd60e51b81526004018080602001828103825260268152602001806119b46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826111ad575060006111fa565b828202828482816111ba57fe5b04146111f75760405162461bcd60e51b8152600401808060200182810382526021815260200180611af46021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156111f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166112a35760405162461bcd60e51b815260040180806020018281038252602d815260200180611a8b602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261135590859061167c565b50505050565b60006111f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061172d565b60006111f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117c4565b43600090815260026020908152604080832032845290915290205460ff1690565b43600090815260026020908152604080832033845290915290205460ff1690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147390849061167c565b505050565b60008183101561148857816111f7565b5090919050565b6001600160a01b0382166000908152600c6020908152604080832054600b909252909120546114be828461135b565b10156114fb5760405162461bcd60e51b815260040180806020018281038252603c815260200180611a01603c913960400191505060405180910390fd5b6001600160a01b0383166000908152600c602052604090205461151e908361135b565b6001600160a01b0384166000908152600c6020526040902055600e546115449083611200565b600e55600d54611554908361135b565b600d556040805183815290516001600160a01b038516917f76f03a4c93f88781a542cdf47bbe8dbd68641fb19c8b1359a7b55a62fefb3be6919081900360200190a2505050565b600081116115da5760405162461bcd60e51b8152600401808060200182810382526021815260200180611a3d6021913960400191505060405180910390fd5b600f546115e7908261135b565b600f556001600160a01b03821660009081526010602052604090205461160d908261135b565b6001600160a01b0380841660009081526010602052604090209190915560085461163991168383611421565b6040805182815290516001600160a01b038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b60606116d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118299092919063ffffffff16565b805190915015611473578080602001905160208110156116f057600080fd5b50516114735760405162461bcd60e51b815260040180806020018281038252602a815260200180611b8a602a913960400191505060405180910390fd5b600081848411156117bc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611781578181015183820152602001611769565b50505050905090810190601f1680156117ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118135760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611781578181015183820152602001611769565b50600083858161181f57fe5b0495945050505050565b60606118388484600085611840565b949350505050565b606061184b856119ad565b61189c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118db5780518252601f1990920191602091820191016118bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461193d576040519150601f19603f3d011682016040523d82523d6000602084013e611942565b606091505b509150915081156119565791506118389050565b8051156119665780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611781578181015183820152602001611769565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67526577617264733a205265776172647320616c726561647920737461727465645374616b696e67526577617264733a20726577617264206275726e65642073686f756c64206e6f742065786365656420746f74616c207265776172645374616b696e67526577617264733a2043616e6e6f7420776974686472617720305374616b696e67526577617264733a2043616e6e6f74207374616b652061667465722073746172742074696d656f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f725374616b696e67526577617264733a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67526577617264733a2043616e6e6f7420776974686472617720746865207374616b696e6720746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5374616b696e67526577617264733a2043616e6e6f74207374616b65207768696c65207072696365203e2031a2646970667358221220e901842fa7d6847e27377c36e9ffcbdef24b8eb59857405be7655f3a2b464e2464736f6c634300060c0033536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77000000000000000000000000c29338d618e0e7c4e7182405971ca1adb9027072000000000000000000000000eed0c8d2da6d243329a6f4a8c2ac61a59ecbfa020000000000000000000000000f8c89d3fb0b502732b338f1dfb3c465dc856c8e000000000000000000000000368b3a58b5f49392e5c9e4c998cb0bb966752e510000000000000000000000009ef5fec8eebe50f3c8858037a74e96ed1e9d28e600000000000000000000000000000000000000000000000000000000603953400000000000000000000000000000000000000000000000000000000000000004
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c806377bd9eb411610125578063b6d6c4d4116100ad578063d1af0c7d1161007c578063d1af0c7d14610476578063e7a4e8a61461047e578063e9fad8ee14610486578063efe97d051461048e578063f2fde38b1461049657610211565b8063b6d6c4d414610456578063b97dd9e21461045e578063c5967c2614610466578063c828371e1461046e57610211565b80638da5cb5b116100f45780638da5cb5b146104195780638e73064f146104215780639d6b522a14610429578063a08f77dd14610446578063b456cf191461044e57610211565b806377bd9eb4146103b7578063796da7af146103bf57806380d3d79d146103c75780638980f11f146103ed57610211565b80634456eda2116101a85780636e958835116101775780636e95883514610335578063700a4a741461035b57806370a0823114610381578063715018a6146103a757806372f702f3146103af57610211565b80634456eda2146102bb578063570ca735146102d75780635a4519ea146102fb5780635fdc4d5c1461030357610211565b806329605e77116101e457806329605e771461027d5780632dfd0bdc146102a3578063398bac63146102ab5780633d18b912146102b357610211565b80630700037d146102165780630f3a9f651461024e57806318160ddd1461026d5780631ed2419514610275575b600080fd5b61023c6004803603602081101561022c57600080fd5b50356001600160a01b03166104bc565b60408051918252519081900360200190f35b61026b6004803603602081101561026457600080fd5b50356104ce565b005b61023c61051c565b61023c610523565b61026b6004803603602081101561029357600080fd5b50356001600160a01b0316610529565b61026b61058d565b61023c610696565b61026b6106c0565b6102c3610896565b604080519115158252519081900360200190f35b6102df6108bc565b604080516001600160a01b039092168252519081900360200190f35b6102df6108cb565b61026b6004803603606081101561031957600080fd5b506001600160a01b0381351690602081013590604001356108da565b61023c6004803603602081101561034b57600080fd5b50356001600160a01b0316610b5f565b61023c6004803603602081101561037157600080fd5b50356001600160a01b0316610bc7565b61023c6004803603602081101561039757600080fd5b50356001600160a01b0316610bd9565b61026b610bf4565b6102df610c96565b61023c610ca5565b61023c610cab565b61026b600480360360208110156103dd57600080fd5b50356001600160a01b0316610d74565b61026b6004803603604081101561040357600080fd5b506001600160a01b038135169060200135610dee565b6102df610eef565b61023c610efe565b61023c6004803603602081101561043f57600080fd5b5035610f04565b6102c3610f4f565b6102df610f58565b61023c610f67565b61023c610f6d565b61023c610f87565b61023c610fa9565b6102df610faf565b6102df610fbe565b61026b610fcd565b61023c61107d565b61026b600480360360208110156104ac57600080fd5b50356001600160a01b03166110a6565b600c6020526000908152604090205481565b6003546001600160a01b031633146105175760405162461bcd60e51b8152600401808060200182810382526024815260200180611b666024913960400191505060405180910390fd5b600455565b600f545b90565b60045490565b61053161125a565b6000546001600160a01b03908116911614610581576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b61058a8161125e565b50565b6003546001600160a01b031633146105d65760405162461bcd60e51b8152600401808060200182810382526024815260200180611b666024913960400191505060405180910390fd5b600554421015610626576040805162461bcd60e51b8152602060048201526016602482015275115c1bd8da0e881b9bdd081cdd185c9d1959081e595d60521b604482015290519081900360640190fd5b600a5460ff16156106685760405162461bcd60e51b81526004018080602001828103825260278152602001806119da6027913960400191505060405180910390fd5b600a805460ff19166001179055600d54600754610694916001600160a01b0390911690339030906112fb565b565b60006106bb6004546106b560055460065461135b90919063ffffffff16565b9061139d565b905090565b6106c86113df565b156107045760405162461bcd60e51b8152600401808060200182810382526026815260200180611bb46026913960400191505060405180910390fd5b61070c611400565b156107485760405162461bcd60e51b8152600401808060200182810382526026815260200180611bb46026913960400191505060405180910390fd5b600954610753610f6d565b10156107a6576040805162461bcd60e51b815260206004820181905260248201527f5374616b696e67526577617264733a206e6f7420756e6c6f636b656420796572604482015290519081900360640190fd5b336000818152600b6020526040812054916107c090610b5f565b9050808210156108575760006107d6828461135b565b336000908152600b60205260409020549091506107f39082611200565b336000818152600b602052604090209190915560075461081f916001600160a01b039091169083611421565b60408051828152905133917fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e0486919081900360200190a2505b50504360009081526002602090815260408083203284529091528082208054600160ff1991821681179092553384529190922080549091169091179055565b6003546000906001600160a01b03166108ad61125a565b6001600160a01b031614905090565b6003546001600160a01b031690565b6001546001600160a01b031681565b6001546001600160a01b03166108ee61125a565b6001600160a01b031614610949576040805162461bcd60e51b815260206004820152601860248201527f43616c6c6572206973206e6f74204c704d69677261746f720000000000000000604482015290519081900360640190fd5b620f4240610955610cab565b106109915760405162461bcd60e51b815260040180806020018281038252602c815260200180611bda602c913960400191505060405180910390fd5b600082116109e6576040805162461bcd60e51b815260206004820152601e60248201527f5374616b696e67526577617264733a2043616e6e6f74207374616b6520300000604482015290519081900360640190fd5b600a5460ff1615610a285760405162461bcd60e51b815260040180806020018281038252602d815260200180611a5e602d913960400191505060405180910390fd5b600f54610a359083611200565b600f556001600160a01b038316600090815260106020526040902054610a5b9083611200565b6001600160a01b038416600090815260106020526040812091909155610a8082610f04565b6001600160a01b0385166000908152600c6020526040902054909150610aa69082611200565b6001600160a01b0385166000908152600c6020526040902055600d54610acc9082611200565b600d55600854610ae7906001600160a01b03163330866112fb565b6040805184815290516001600160a01b038616917f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d919081900360200190a26040805182815290517fde88a922e0d3b88b24e9623efeb464919c6bf9f66857a65e2bfcf2ce87a9433d9181900360200190a150505050565b6001600160a01b0381166000908152600c6020526040812054600a610b82610f6d565b10610b8e579050610bc2565b6000610baa600a6106b5610ba0610f6d565b620f42409061119e565b9050610bbd620f42406106b5848461119e565b925050505b919050565b600b6020526000908152604090205481565b6001600160a01b031660009081526010602052604090205490565b610bfc61125a565b6000546001600160a01b03908116911614610c4c576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6008546001600160a01b031681565b600e5490565b60125460115460408051633ddac95360e01b81526001600160a01b039283166004820152670de0b6b3a7640000602482015290516000939290921691633ddac95391604480820192602092909190829003018186803b158015610d0d57600080fd5b505afa925050508015610d3257506040513d6020811015610d2d57600080fd5b505160015b610d6d5760405162461bcd60e51b815260040180806020018281038252603c815260200180611ab8603c913960400191505060405180910390fd5b9050610520565b610d7c61125a565b6000546001600160a01b03908116911614610dcc576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b610df661125a565b6000546001600160a01b03908116911614610e46576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b6008546001600160a01b0383811691161415610e935760405162461bcd60e51b8152600401808060200182810382526031815260200180611b156031913960400191505060405180910390fd5b610ea76001600160a01b0383163383611421565b604080516001600160a01b03841681526020810183905281517f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa28929181900390910190a15050565b6000546001600160a01b031690565b600d5490565b600080610f0f610cab565b9050620f4240811115610f26576000915050610bc2565b610f4883610f42610f35610cab565b6106b587620f424061119e565b9061135b565b9392505050565b600a5460ff1681565b6011546001600160a01b031681565b60095481565b60006106bb6004546106b5600554610f4260055442611478565b60006106bb610fa0600454610f9a61107d565b9061119e565b60055490611200565b60055490565b6007546001600160a01b031681565b6012546001600160a01b031681565b600954610fd8610f6d565b101561102b576040805162461bcd60e51b815260206004820181905260248201527f5374616b696e67526577617264733a206e6f7420756e6c6f636b656420796572604482015290519081900360640190fd5b6110336106c0565b336000908152600b6020908152604080832054600c9092528220546110579161135b565b9050611063338261148f565b3360008181526010602052604090205461058a919061159b565b6000600654600554141561109357610d6d610696565b6106bb60016110a0610696565b90611200565b6110ae61125a565b6000546001600160a01b039081169116146110fe576040805162461bcd60e51b81526020600482018190526024820152600080516020611b46833981519152604482015290519081900360640190fd5b6001600160a01b0381166111435760405162461bcd60e51b81526004018080602001828103825260268152602001806119b46026913960400191505060405180910390fd5b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000826111ad575060006111fa565b828202828482816111ba57fe5b04146111f75760405162461bcd60e51b8152600401808060200182810382526021815260200180611af46021913960400191505060405180910390fd5b90505b92915050565b6000828201838110156111f7576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b3390565b6001600160a01b0381166112a35760405162461bcd60e51b815260040180806020018281038252602d815260200180611a8b602d913960400191505060405180910390fd5b6040516001600160a01b038216906000907f74da04524d50c64947f5dd5381ef1a4dca5cba8ed1d816243f9e48aa0b5617ed908290a3600380546001600160a01b0319166001600160a01b0392909216919091179055565b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b17905261135590859061167c565b50505050565b60006111f783836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f77000081525061172d565b60006111f783836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f0000000000008152506117c4565b43600090815260026020908152604080832032845290915290205460ff1690565b43600090815260026020908152604080832033845290915290205460ff1690565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b17905261147390849061167c565b505050565b60008183101561148857816111f7565b5090919050565b6001600160a01b0382166000908152600c6020908152604080832054600b909252909120546114be828461135b565b10156114fb5760405162461bcd60e51b815260040180806020018281038252603c815260200180611a01603c913960400191505060405180910390fd5b6001600160a01b0383166000908152600c602052604090205461151e908361135b565b6001600160a01b0384166000908152600c6020526040902055600e546115449083611200565b600e55600d54611554908361135b565b600d556040805183815290516001600160a01b038516917f76f03a4c93f88781a542cdf47bbe8dbd68641fb19c8b1359a7b55a62fefb3be6919081900360200190a2505050565b600081116115da5760405162461bcd60e51b8152600401808060200182810382526021815260200180611a3d6021913960400191505060405180910390fd5b600f546115e7908261135b565b600f556001600160a01b03821660009081526010602052604090205461160d908261135b565b6001600160a01b0380841660009081526010602052604090209190915560085461163991168383611421565b6040805182815290516001600160a01b038416917f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5919081900360200190a25050565b60606116d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166118299092919063ffffffff16565b805190915015611473578080602001905160208110156116f057600080fd5b50516114735760405162461bcd60e51b815260040180806020018281038252602a815260200180611b8a602a913960400191505060405180910390fd5b600081848411156117bc5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611781578181015183820152602001611769565b50505050905090810190601f1680156117ae5780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b505050900390565b600081836118135760405162461bcd60e51b8152602060048201818152835160248401528351909283926044909101919085019080838360008315611781578181015183820152602001611769565b50600083858161181f57fe5b0495945050505050565b60606118388484600085611840565b949350505050565b606061184b856119ad565b61189c576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106118db5780518252601f1990920191602091820191016118bc565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d806000811461193d576040519150601f19603f3d011682016040523d82523d6000602084013e611942565b606091505b509150915081156119565791506118389050565b8051156119665780518082602001fd5b60405162461bcd60e51b8152602060048201818152865160248401528651879391928392604401919085019080838360008315611781578181015183820152602001611769565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573735374616b696e67526577617264733a205265776172647320616c726561647920737461727465645374616b696e67526577617264733a20726577617264206275726e65642073686f756c64206e6f742065786365656420746f74616c207265776172645374616b696e67526577617264733a2043616e6e6f7420776974686472617720305374616b696e67526577617264733a2043616e6e6f74207374616b652061667465722073746172742074696d656f70657261746f723a207a65726f206164647265737320676976656e20666f72206e6577206f70657261746f725374616b696e67526577617264733a206661696c656420746f20636f6e73756c7420636173682070726963652066726f6d20746865206f7261636c65536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775374616b696e67526577617264733a2043616e6e6f7420776974686472617720746865207374616b696e6720746f6b656e4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657261746f725361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564436f6e747261637447756172643a206f6e6520626c6f636b2c206f6e652066756e6374696f6e5374616b696e67526577617264733a2043616e6e6f74207374616b65207768696c65207072696365203e2031a2646970667358221220e901842fa7d6847e27377c36e9ffcbdef24b8eb59857405be7655f3a2b464e2464736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c29338d618e0e7c4e7182405971ca1adb9027072000000000000000000000000eed0c8d2da6d243329a6f4a8c2ac61a59ecbfa020000000000000000000000000f8c89d3fb0b502732b338f1dfb3c465dc856c8e000000000000000000000000368b3a58b5f49392e5c9e4c998cb0bb966752e510000000000000000000000009ef5fec8eebe50f3c8858037a74e96ed1e9d28e600000000000000000000000000000000000000000000000000000000603953400000000000000000000000000000000000000000000000000000000000000004
-----Decoded View---------------
Arg [0] : _lpMigrator (address): 0xC29338D618e0E7C4e7182405971ca1Adb9027072
Arg [1] : _rewardsToken (address): 0xEEd0c8d2DA6d243329a6F4A8C2aC61A59ecBFa02
Arg [2] : _stakingToken (address): 0x0F8c89d3fB0b502732b338f1dfb3c465Dc856C8e
Arg [3] : _cash_old (address): 0x368B3a58B5f49392e5C9E4C998cb0bB966752E51
Arg [4] : _cashOracle (address): 0x9EF5FeC8eEBE50F3C8858037a74e96ed1E9D28E6
Arg [5] : _startTime (uint256): 1614369600
Arg [6] : _unlockEpoch (uint256): 4
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 000000000000000000000000c29338d618e0e7c4e7182405971ca1adb9027072
Arg [1] : 000000000000000000000000eed0c8d2da6d243329a6f4a8c2ac61a59ecbfa02
Arg [2] : 0000000000000000000000000f8c89d3fb0b502732b338f1dfb3c465dc856c8e
Arg [3] : 000000000000000000000000368b3a58b5f49392e5c9e4c998cb0bb966752e51
Arg [4] : 0000000000000000000000009ef5fec8eebe50f3c8858037a74e96ed1e9d28e6
Arg [5] : 0000000000000000000000000000000000000000000000000000000060395340
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Deployed Bytecode Sourcemap
28097:7171:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28611:42;;;;;;;;;;;;;;;;-1:-1:-1;28611:42:0;-1:-1:-1;;;;;28611:42:0;;:::i;:::-;;;;;;;;;;;;;;;;27880:93;;;;;;;;;;;;;;;;-1:-1:-1;27880:93:0;;:::i;:::-;;30077:102;;;:::i;27646:83::-;;;:::i;25519:115::-;;;;;;;;;;;;;;;;-1:-1:-1;25519:115:0;-1:-1:-1;;;;;25519:115:0;;:::i;33031:264::-;;;:::i;27017:121::-;;;:::i;31634:553::-;;;:::i;25411:100::-;;;:::i;:::-;;;;;;;;;;;;;;;;;;25146:85;;;:::i;:::-;;;;-1:-1:-1;;;;;25146:85:0;;;;;;;;;;;;;;23278:25;;;:::i;33408:859::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;33408:859:0;;;;;;;;;;;;;:::i;31258:368::-;;;;;;;;;;;;;;;;-1:-1:-1;31258:368:0;-1:-1:-1;;;;;31258:368:0;;:::i;28558:46::-;;;;;;;;;;;;;;;;-1:-1:-1;28558:46:0;-1:-1:-1;;;;;28558:46:0;;:::i;30187:121::-;;;;;;;;;;;;;;;;-1:-1:-1;30187:121:0;-1:-1:-1;;;;;30187:121:0;;:::i;22580:148::-;;;:::i;28459:26::-;;;:::i;29955:114::-;;;:::i;29536:289::-;;;:::i;23477:146::-;;;;;;;;;;;;;;;;-1:-1:-1;23477:146:0;-1:-1:-1;;;;;23477:146:0;;:::i;34382:323::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;34382:323:0;;;;;;;;:::i;21938:79::-;;;:::i;29833:114::-;;;:::i;30316:411::-;;;;;;;;;;;;;;;;-1:-1:-1;30316:411:0;;:::i;28525:26::-;;;:::i;28847:23::-;;;:::i;28492:26::-;;;:::i;27146:146::-;;;:::i;27500:123::-;;;:::i;27737:89::-;;;:::i;28426:26::-;;;:::i;28894:25::-;;;:::i;32533:359::-;;;:::i;27300:192::-;;;:::i;22883:244::-;;;;;;;;;;;;;;;;-1:-1:-1;22883:244:0;-1:-1:-1;;;;;22883:244:0;;:::i;28611:42::-;;;;;;;;;;;;;:::o;27880:93::-;25296:9;;-1:-1:-1;;;;;25296:9:0;25309:10;25296:23;25274:109;;;;-1:-1:-1;;;25274:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27949:6:::1;:16:::0;27880:93::o;30077:102::-;30159:12;;30077:102;;:::o;27646:83::-;27715:6;;27646:83;:::o;25519:115::-;22160:12;:10;:12::i;:::-;22150:6;;-1:-1:-1;;;;;22150:6:0;;;:22;;;22142:67;;;;;-1:-1:-1;;;22142:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22142:67:0;;;;;;;;;;;;;;;25595:31:::1;25613:12;25595:17;:31::i;:::-;25519:115:::0;:::o;33031:264::-;25296:9;;-1:-1:-1;;;;;25296:9:0;25309:10;25296:23;25274:109;;;;-1:-1:-1;;;25274:109:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26654:9:::1;;26647:3;:16;;26639:51;;;::::0;;-1:-1:-1;;;26639:51:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;-1:-1:-1;;;26639:51:0;;;;;;;;;;;;;::::1;;33110:14:::2;::::0;::::2;;33109:15;33101:67;;;;-1:-1:-1::0;;;33101:67:0::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33179:14;:21:::0;;-1:-1:-1;;33179:21:0::2;33196:4;33179:21;::::0;;33268:18:::2;::::0;33211:12:::2;::::0;:76:::2;::::0;-1:-1:-1;;;;;33211:12:0;;::::2;::::0;33241:10:::2;::::0;33261:4:::2;::::0;33211:29:::2;:76::i;:::-;33031:264::o:0;27017:121::-;27062:7;27089:41;27123:6;;27089:29;27108:9;;27089:14;;:18;;:29;;;;:::i;:::-;:33;;:41::i;:::-;27082:48;;27017:121;:::o;31634:553::-;19456:28;:26;:28::i;:::-;19455:29;19433:117;;;;-1:-1:-1;;;19433:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19584:28;:26;:28::i;:::-;19583:29;19561:117;;;;-1:-1:-1;;;19561:117:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34819:11:::1;;34798:17;:15;:17::i;:::-;:32;;34790:77;;;::::0;;-1:-1:-1;;;34790:77:0;;::::1;;::::0;::::1;::::0;;;;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31740:10:::2;31707:18;31728:23:::0;;;:11:::2;:23;::::0;;;;;;31789:31:::2;::::0;:19:::2;:31::i;:::-;31762:58;;31848:16;31835:10;:29;31831:349;;;31881:27;31911:32;:16:::0;31932:10;31911:20:::2;:32::i;:::-;31996:10;31984:23;::::0;;;:11:::2;:23;::::0;;;;;31881:62;;-1:-1:-1;31984:48:0::2;::::0;31881:62;31984:27:::2;:48::i;:::-;31970:10;31958:23;::::0;;;:11:::2;:23;::::0;;;;:74;;;;32047:12:::2;::::0;:58:::2;::::0;-1:-1:-1;;;;;32047:12:0;;::::2;::::0;32085:19;32047:25:::2;:58::i;:::-;32125:43;::::0;;;;;;;32136:10:::2;::::0;32125:43:::2;::::0;;;;;::::2;::::0;;::::2;31831:349;;-1:-1:-1::0;;19713:12:0;19705:21;;;;:7;:21;;;;;;;;19727:9;19705:32;;;;;;;;:39;;19740:4;-1:-1:-1;;19705:39:0;;;;;;;;19777:10;19755:33;;;;;;:40;;;;;;;;;;31634:553::o;25411:100::-;25494:9;;25454:4;;-1:-1:-1;;;;;25494:9:0;25478:12;:10;:12::i;:::-;-1:-1:-1;;;;;25478:25:0;;25471:32;;25411:100;:::o;25146:85::-;25214:9;;-1:-1:-1;;;;;25214:9:0;25146:85;:::o;23278:25::-;;;-1:-1:-1;;;;;23278:25:0;;:::o;33408:859::-;23387:10;;-1:-1:-1;;;;;23387:10:0;23371:12;:10;:12::i;:::-;-1:-1:-1;;;;;23371:26:0;;23349:100;;;;;-1:-1:-1;;;23349:100:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;28321:7:::1;33544:16;:14;:16::i;:::-;:35;33536:92;;;;-1:-1:-1::0;;;33536:92:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33661:1;33647:11;:15;33639:58;;;::::0;;-1:-1:-1;;;33639:58:0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;33717:14;::::0;::::1;;33716:15;33708:73;;;;-1:-1:-1::0;;;33708:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33807:12;::::0;:29:::1;::::0;33824:11;33807:16:::1;:29::i;:::-;33792:12;:44:::0;-1:-1:-1;;;;;33865:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;;:32:::1;::::0;33885:11;33865:19:::1;:32::i;:::-;-1:-1:-1::0;;;;;33847:15:0;::::1;;::::0;;;:9:::1;:15;::::0;;;;:50;;;;33933:38:::1;33955:15:::0;33933:21:::1;:38::i;:::-;-1:-1:-1::0;;;;;33998:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;;33910:61;;-1:-1:-1;33998:31:0::1;::::0;33910:61;33998:17:::1;:31::i;:::-;-1:-1:-1::0;;;;;33982:13:0;::::1;;::::0;;;:7:::1;:13;::::0;;;;:47;34061:18:::1;::::0;:36:::1;::::0;34084:12;34061:22:::1;:36::i;:::-;34040:18;:57:::0;34108:12:::1;::::0;:69:::1;::::0;-1:-1:-1;;;;;34108:12:0::1;34138:10;34158:4;34165:11:::0;34108:29:::1;:69::i;:::-;34193:25;::::0;;;;;;;-1:-1:-1;;;;;34193:25:0;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;34234;::::0;;;;;;;::::1;::::0;;;;::::1;::::0;;::::1;23460:1;33408:859:::0;;;:::o;31258:368::-;-1:-1:-1;;;;;31367:13:0;;31331:7;31367:13;;;:7;:13;;;;;;28366:2;31395:17;:15;:17::i;:::-;:32;31391:78;;31451:6;-1:-1:-1;31444:13:0;;31391:78;31479:18;31500:56;28366:2;31500:39;31521:17;:15;:17::i;:::-;28321:7;;31500:20;:39::i;:56::-;31479:77;-1:-1:-1;31574:44:0;28321:7;31574:22;:6;31479:77;31574:10;:22::i;:44::-;31567:51;;;;31258:368;;;;:::o;28558:46::-;;;;;;;;;;;;;:::o;30187:121::-;-1:-1:-1;;;;;30282:18:0;30255:7;30282:18;;;:9;:18;;;;;;;30187:121::o;22580:148::-;22160:12;:10;:12::i;:::-;22150:6;;-1:-1:-1;;;;;22150:6:0;;;:22;;;22142:67;;;;;-1:-1:-1;;;22142:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22142:67:0;;;;;;;;;;;;;;;22687:1:::1;22671:6:::0;;22650:40:::1;::::0;-1:-1:-1;;;;;22671:6:0;;::::1;::::0;22650:40:::1;::::0;22687:1;;22650:40:::1;22718:1;22701:19:::0;;-1:-1:-1;;;;;;22701:19:0::1;::::0;;22580:148::o;28459:26::-;;;-1:-1:-1;;;;;28459:26:0;;:::o;29955:114::-;30043:18;;29955:114;:::o;29536:289::-;29615:10;;29635:8;;29607:43;;;-1:-1:-1;;;29607:43:0;;-1:-1:-1;;;;;29635:8:0;;;29607:43;;;;29645:4;29607:43;;;;;;29583:7;;29615:10;;;;;29607:27;;:43;;;;;;;;;;;;;;;29615:10;29607:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29607:43:0;;;29603:215;;29736:70;;-1:-1:-1;;;29736:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29603:215;29697:5;-1:-1:-1;29690:12:0;;23477:146;22160:12;:10;:12::i;:::-;22150:6;;-1:-1:-1;;;;;22150:6:0;;;:22;;;22142:67;;;;;-1:-1:-1;;;22142:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22142:67:0;;;;;;;;;;;;;;;23591:10:::1;:24:::0;;-1:-1:-1;;;;;;23591:24:0::1;-1:-1:-1::0;;;;;23591:24:0;;;::::1;::::0;;;::::1;::::0;;23477:146::o;34382:323::-;22160:12;:10;:12::i;:::-;22150:6;;-1:-1:-1;;;;;22150:6:0;;;:22;;;22142:67;;;;;-1:-1:-1;;;22142:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22142:67:0;;;;;;;;;;;;;;;34509:12:::1;::::0;-1:-1:-1;;;;;34485:37:0;;::::1;34509:12:::0;::::1;34485:37;;34477:99;;;;-1:-1:-1::0;;;34477:99:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34587:58;-1:-1:-1::0;;;;;34587:33:0;::::1;34621:10;34633:11:::0;34587:33:::1;:58::i;:::-;34661:36;::::0;;-1:-1:-1;;;;;34661:36:0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;;;;;;;;::::1;34382:323:::0;;:::o;21938:79::-;21976:7;22003:6;-1:-1:-1;;;;;22003:6:0;21938:79;:::o;29833:114::-;29921:18;;29833:114;:::o;30316:411::-;30402:7;30422:13;30438:16;:14;:16::i;:::-;30422:32;;28321:7;30510:5;:24;30506:65;;;30558:1;30551:8;;;;;30506:65;30639:80;30703:15;30639:59;30681:16;:14;:16::i;:::-;30639:37;:15;28321:7;30639:19;:37::i;:59::-;:63;;:80::i;:::-;30632:87;30316:411;-1:-1:-1;;;30316:411:0:o;28525:26::-;;;;;;:::o;28847:23::-;;;-1:-1:-1;;;;;28847:23:0;;:::o;28492:26::-;;;;:::o;27146:146::-;27194:7;27221:63;27277:6;;27221:51;27262:9;;27221:36;27230:9;;27241:15;27221:8;:36::i;27500:123::-;27547:7;27574:41;27588:26;27607:6;;27588:14;:12;:14::i;:::-;:18;;:26::i;:::-;27574:9;;;:13;:41::i;27737:89::-;27809:9;;27737:89;:::o;28426:26::-;;;-1:-1:-1;;;;;28426:26:0;;:::o;28894:25::-;;;-1:-1:-1;;;;;28894:25:0;;:::o;32533:359::-;34819:11;;34798:17;:15;:17::i;:::-;:32;;34790:77;;;;;-1:-1:-1;;;34790:77:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32677:11:::1;:9;:11::i;:::-;32762:10;32699:24;32750:23:::0;;;:11:::1;:23;::::0;;;;;;;;32726:7:::1;:19:::0;;;;;;:48:::1;::::0;:23:::1;:48::i;:::-;32699:75;;32785:41;32797:10;32809:16;32785:11;:41::i;:::-;32850:10;32862:21;::::0;;;:9:::1;:21;::::0;;;;;32837:47:::1;::::0;32850:10;32837:12:::1;:47::i;27300:192::-:0;27345:7;27382:14;;27369:9;;:27;27365:81;;;27420:14;:12;:14::i;27365:81::-;27463:21;27482:1;27463:14;:12;:14::i;:::-;:18;;:21::i;22883:244::-;22160:12;:10;:12::i;:::-;22150:6;;-1:-1:-1;;;;;22150:6:0;;;:22;;;22142:67;;;;;-1:-1:-1;;;22142:67:0;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;22142:67:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;22972:22:0;::::1;22964:73;;;;-1:-1:-1::0;;;22964:73:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23074:6;::::0;;23053:38:::1;::::0;-1:-1:-1;;;;;23053:38:0;;::::1;::::0;23074:6;::::1;::::0;23053:38:::1;::::0;::::1;23102:6;:17:::0;;-1:-1:-1;;;;;;23102:17:0::1;-1:-1:-1::0;;;;;23102:17:0;;;::::1;::::0;;;::::1;::::0;;22883:244::o;3190:471::-;3248:7;3493:6;3489:47;;-1:-1:-1;3523:1:0;3516:8;;3489:47;3560:5;;;3564:1;3560;:5;:1;3584:5;;;;;:10;3576:56;;;;-1:-1:-1;;;3576:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3652:1;-1:-1:-1;3190:471:0;;;;;:::o;1836:181::-;1894:7;1926:5;;;1950:6;;;;1942:46;;;;;-1:-1:-1;;;1942:46:0;;;;;;;;;;;;;;;;;;;;;;;;;;;20463:106;20551:10;20463:106;:::o;25642:294::-;-1:-1:-1;;;;;25733:26:0;;25711:121;;;;-1:-1:-1;;;25711:121:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25848:45;;-1:-1:-1;;;;;25848:45:0;;;25876:1;;25848:45;;25876:1;;25848:45;25904:9;:24;;-1:-1:-1;;;;;;25904:24:0;-1:-1:-1;;;;;25904:24:0;;;;;;;;;;25642:294::o;16070:205::-;16198:68;;;-1:-1:-1;;;;;16198:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;16198:68:0;-1:-1:-1;;;16198:68:0;;;16171:96;;16191:5;;16171:19;:96::i;:::-;16070:205;;;;:::o;2300:136::-;2358:7;2385:43;2389:1;2392;2385:43;;;;;;;;;;;;;;;;;:3;:43::i;4137:132::-;4195:7;4222:39;4226:1;4229;4222:39;;;;;;;;;;;;;;;;;:3;:39::i;19131:125::-;19224:12;19192:4;19216:21;;;:7;:21;;;;;;;;19238:9;19216:32;;;;;;;;;;19131:125;:::o;19264:126::-;19357:12;19325:4;19349:21;;;:7;:21;;;;;;;;19371:10;19349:33;;;;;;;;;;19264:126;:::o;15885:177::-;15995:58;;;-1:-1:-1;;;;;15995:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15995:58:0;-1:-1:-1;;;15995:58:0;;;15968:86;;15988:5;;15968:19;:86::i;:::-;15885:177;;;:::o;276:107::-;334:7;366:1;361;:6;;:14;;374:1;361:14;;;-1:-1:-1;370:1:0;;276:107;-1:-1:-1;276:107:0:o;30789:461::-;-1:-1:-1;;;;;30883:13:0;;30859:21;30883:13;;;:7;:13;;;;;;;;;30944:11;:17;;;;;;;30915:25;30883:13;30933:6;30915:17;:25::i;:::-;:46;;30907:119;;;;-1:-1:-1;;;30907:119:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;31053:13:0;;;;;;:7;:13;;;;;;:25;;31071:6;31053:17;:25::i;:::-;-1:-1:-1;;;;;31037:13:0;;;;;;:7;:13;;;;;:41;31110:18;;:30;;31133:6;31110:22;:30::i;:::-;31089:18;:51;31172:18;;:30;;31195:6;31172:22;:30::i;:::-;31151:18;:51;31218:24;;;;;;;;-1:-1:-1;;;;;31218:24:0;;;;;;;;;;;;;30789:461;;;:::o;32195:330::-;32283:1;32274:6;:10;32266:56;;;;-1:-1:-1;;;32266:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32348:12;;:24;;32365:6;32348:16;:24::i;:::-;32333:12;:39;-1:-1:-1;;;;;32401:15:0;;;;;;:9;:15;;;;;;:27;;32421:6;32401:19;:27::i;:::-;-1:-1:-1;;;;;32383:15:0;;;;;;;:9;:15;;;;;:45;;;;32439:12;;:39;;:12;32393:4;32471:6;32439:25;:39::i;:::-;32494:23;;;;;;;;-1:-1:-1;;;;;32494:23:0;;;;;;;;;;;;;32195:330;;:::o;18190:761::-;18614:23;18640:69;18668:4;18640:69;;;;;;;;;;;;;;;;;18648:5;-1:-1:-1;;;;;18640:27:0;;;:69;;;;;:::i;:::-;18724:17;;18614:95;;-1:-1:-1;18724:21:0;18720:224;;18866:10;18855:30;;;;;;;;;;;;;;;-1:-1:-1;18855:30:0;18847:85;;;;-1:-1:-1;;;18847:85:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2739:192;2825:7;2861:12;2853:6;;;;2845:29;;;;-1:-1:-1;;;2845:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2897:5:0;;;2739:192::o;4765:278::-;4851:7;4886:12;4879:5;4871:28;;;;-1:-1:-1;;;4871:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4910:9;4926:1;4922;:5;;;;;;;4765:278;-1:-1:-1;;;;;4765:278:0:o;12837:196::-;12940:12;12972:53;12995:6;13003:4;13009:1;13012:12;12972:22;:53::i;:::-;12965:60;12837:196;-1:-1:-1;;;;12837:196:0:o;14214:979::-;14344:12;14377:18;14388:6;14377:10;:18::i;:::-;14369:60;;;;;-1:-1:-1;;;14369:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;14503:12;14517:23;14544:6;-1:-1:-1;;;;;14544:11:0;14564:8;14575:4;14544:36;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;14544:36:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14502:78;;;;14595:7;14591:595;;;14626:10;-1:-1:-1;14619:17:0;;-1:-1:-1;14619:17:0;14591:595;14740:17;;:21;14736:439;;15003:10;14997:17;15064:15;15051:10;15047:2;15043:19;15036:44;14951:148;15139:20;;-1:-1:-1;;;15139:20:0;;;;;;;;;;;;;;;;;15146:12;;15139:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9919:422;10286:20;10325:8;;;9919:422::o
Swarm Source
ipfs://e901842fa7d6847e27377c36e9ffcbdef24b8eb59857405be7655f3a2b464e24
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.