Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 25 internal transaction
[ Download CSV Export ]
Contract Name:
IDEXFarm_v2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-04-15 */ // SPDX-License-Identifier: LGPL-3.0-only pragma solidity 0.6.12; // File: @openzeppelin/contracts/math/SafeMath.sol /** * @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 /** * @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 /** * @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 /** * @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: @openzeppelin/contracts/GSN/Context.sol /* * @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 /** * @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: @openzeppelin/contracts/utils/ReentrancyGuard.sol /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } // File: contracts/IDEXFarm.sol // import "@nomiclabs/buidler/console.sol"; contract IDEXFarm_v2 is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 reward0Debt; // Reward debt. See explanation below. uint256 reward1Debt; // Reward debt. See explanation below. // // We do some fancy math here. Basically, any point in time, the amount of reward tokens // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accRewardPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accRewardPerShare` (and `lastRewardBlock`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. Reward to distribute per block. uint256 lastRewardBlock; // Last block number that reward distribution occurs. uint256 accReward0PerShare; // Accumulated rewards per share, times 1e12. See below. uint256 accReward1PerShare; // Accumulated rewards per share, times 1e12. See below. } // The reward tokens IERC20 public reward0Token; IERC20 public reward1Token; // Reward tokens created per block. uint256 public reward0TokenPerBlock; uint256 public reward1TokenPerBlock; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw( address indexed user, uint256 indexed pid, uint256 amount ); constructor(IERC20 _reward0Token, IERC20 _reward1Token, uint256 _reward0TokenPerBlock, uint256 _reward1TokenPerBlock) public { reward0Token = _reward0Token; reward1Token = _reward1Token; reward0TokenPerBlock = _reward0TokenPerBlock; reward1TokenPerBlock = _reward1TokenPerBlock; } // Necessary to allow native token as a reward receive() external payable { } function poolLength() external view returns (uint256) { return poolInfo.length; } // Add a new lp to the pool. Can only be called by the owner. // XXX DO NOT add the same LP token more than once. Rewards will be messed up if you do. function add( uint256 _allocPoint, IERC20 _lpToken, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push( PoolInfo({ lpToken: _lpToken, allocPoint: _allocPoint, lastRewardBlock: block.number, accReward0PerShare: 0, accReward1PerShare: 0 }) ); } // Update the given pool's reward allocation point. Can only be called by the owner. function set( uint256 _pid, uint256 _allocPoint, bool _withUpdate ) public onlyOwner { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add( _allocPoint ); poolInfo[_pid].allocPoint = _allocPoint; } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } // View function to see pending rewards on frontend. function pendingReward(uint256 _pid, address _user) external view returns (uint256, uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accReward0PerShare = pool.accReward0PerShare; uint256 accReward1PerShare = pool.accReward1PerShare; uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (block.number > pool.lastRewardBlock && lpSupply != 0) { uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 reward0Quantity = multiplier.mul(reward0TokenPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); uint256 reward1Quantity = multiplier.mul(reward1TokenPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); accReward0PerShare = accReward0PerShare.add( reward0Quantity.mul(1e12).div(lpSupply) ); accReward1PerShare = accReward1PerShare.add( reward1Quantity.mul(1e12).div(lpSupply) ); } return ( user.amount.mul(accReward0PerShare).div(1e12).sub(user.reward0Debt), user.amount.mul(accReward1PerShare).div(1e12).sub(user.reward1Debt) ); } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.number <= pool.lastRewardBlock) { return; } uint256 lpSupply = pool.lpToken.balanceOf(address(this)); if (lpSupply == 0) { pool.lastRewardBlock = block.number; return; } uint256 multiplier = getMultiplier(pool.lastRewardBlock, block.number); uint256 reward0Quantity = multiplier.mul(reward0TokenPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); uint256 reward1Quantity = multiplier.mul(reward1TokenPerBlock).mul(pool.allocPoint).div( totalAllocPoint ); pool.accReward0PerShare = pool.accReward0PerShare.add( reward0Quantity.mul(1e12).div(lpSupply) ); pool.accReward1PerShare = pool.accReward1PerShare.add( reward1Quantity.mul(1e12).div(lpSupply) ); pool.lastRewardBlock = block.number; } // Deposit LP tokens to Farm for reward allocation. function deposit(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); if (user.amount > 0) { uint256 pending0 = user.amount.mul(pool.accReward0PerShare).div(1e12).sub(user.reward0Debt); uint256 pending1 = user.amount.mul(pool.accReward1PerShare).div(1e12).sub(user.reward1Debt); if (pending0 > 0) { safeRewardTokenTransfer(reward0Token, msg.sender, pending0); } if (pending1 > 0) { safeRewardTokenTransfer(reward1Token, msg.sender, pending1); } } if (_amount > 0) { pool.lpToken.safeTransferFrom( address(msg.sender), address(this), _amount ); user.amount = user.amount.add(_amount); } user.reward0Debt = user.amount.mul(pool.accReward0PerShare).div(1e12); user.reward1Debt = user.amount.mul(pool.accReward1PerShare).div(1e12); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from Farm. function withdraw(uint256 _pid, uint256 _amount) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, 'withdraw: not good'); updatePool(_pid); uint256 pending0 = user.amount.mul(pool.accReward0PerShare).div(1e12).sub(user.reward0Debt); uint256 pending1 = user.amount.mul(pool.accReward1PerShare).div(1e12).sub(user.reward1Debt); if (pending0 > 0) { safeRewardTokenTransfer(reward0Token, msg.sender, pending0); } if (pending1 > 0) { safeRewardTokenTransfer(reward1Token, msg.sender, pending1); } if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); } user.reward0Debt = user.amount.mul(pool.accReward0PerShare).div(1e12); user.reward1Debt = user.amount.mul(pool.accReward1PerShare).div(1e12); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) public nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; pool.lpToken.safeTransfer(address(msg.sender), user.amount); emit EmergencyWithdraw(msg.sender, _pid, user.amount); user.amount = 0; user.reward0Debt = 0; user.reward1Debt = 0; } // Safe token transfer function, just in case pool does not have enough rewards. function safeRewardTokenTransfer(IERC20 rewardToken, address payable _to, uint256 _amount) private { uint256 rewardBalance = address(rewardToken) == address(0x0) ? address(this).balance : rewardToken.balanceOf(address(this)); require(rewardBalance >= _amount, 'safeRewardTokenTransfer: insufficient balance'); if (address(rewardToken) == address(0x0)) { require( _to.send(_amount), 'safeRewardTokenTransfer: native token transfer failed' ); } else { // No need to validate transfer as reward token contract is already vetted rewardToken.transfer(_to, _amount); } } // Admin controls // // Assert _withUpdate or new emission rate will be retroactive to last update for all pools function setRewardsPerBlock(uint256 _reward0TokenPerBlock, uint256 _reward1TokenPerBlock, bool _withUpdate) external onlyOwner { if (_withUpdate) { massUpdatePools(); } reward0TokenPerBlock = _reward0TokenPerBlock; reward1TokenPerBlock = _reward1TokenPerBlock; } function withdrawRewardToken(IERC20 rewardToken, uint256 _amount) external onlyOwner { require(rewardToken == reward0Token || rewardToken == reward1Token, 'withdrawRewardToken: invalid rewardToken'); safeRewardTokenTransfer(rewardToken, msg.sender, _amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_reward0Token","type":"address"},{"internalType":"contract IERC20","name":"_reward1Token","type":"address"},{"internalType":"uint256","name":"_reward0TokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"_reward1TokenPerBlock","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"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"}],"name":"Deposit","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"}],"name":"EmergencyWithdraw","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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accReward0PerShare","type":"uint256"},{"internalType":"uint256","name":"accReward1PerShare","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reward0Token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward0TokenPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward1Token","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reward1TokenPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reward0TokenPerBlock","type":"uint256"},{"internalType":"uint256","name":"_reward1TokenPerBlock","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setRewardsPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"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":"reward0Debt","type":"uint256"},{"internalType":"uint256","name":"reward1Debt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"rewardToken","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawRewardToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600060085534801561001557600080fd5b5060405161231b38038061231b8339818101604052608081101561003857600080fd5b508051602082015160408301516060909301519192909160006100596100e5565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060018055600280546001600160a01b039586166001600160a01b03199182161790915560038054949095169316929092179092556004919091556005556100e9565b3390565b612223806100f86000396000f3fe6080604052600436106101795760003560e01c806364482f79116100cb57806393f1a40b1161007f578063c68d7ea711610059578063c68d7ea71461052e578063e2bbb15814610566578063f2fde38b1461059657610180565b806393f1a40b1461045657806398969e82146104ba578063b0ea4fc41461051957610180565b80637804fe5e116100b05780637804fe5e146103fc5780638da5cb5b146104115780638dbb1e3a1461042657610180565b806364482f79146103af578063715018a6146103e757610180565b8063339de1011161012d57806351eb05a61161010757806351eb05a6146103465780635312ea8e14610370578063630b5ba11461039a57610180565b8063339de10114610292578063441a3e70146102d05780634aac68cd1461030057610180565b80631526fe271161015e5780631526fe27146101c157806317caf6f11461022d5780631eaaa0451461024257610180565b8063081e3eda146101855780630c638dd6146101ac57610180565b3661018057005b600080fd5b34801561019157600080fd5b5061019a6105d6565b60408051918252519081900360200190f35b3480156101b857600080fd5b5061019a6105dc565b3480156101cd57600080fd5b506101eb600480360360208110156101e457600080fd5b50356105e2565b6040805173ffffffffffffffffffffffffffffffffffffffff909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b34801561023957600080fd5b5061019a610637565b34801561024e57600080fd5b506102906004803603606081101561026557600080fd5b5080359073ffffffffffffffffffffffffffffffffffffffff6020820135169060400135151561063d565b005b34801561029e57600080fd5b506102a761082c565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b3480156102dc57600080fd5b50610290600480360360408110156102f357600080fd5b5080359060200135610848565b34801561030c57600080fd5b506102906004803603604081101561032357600080fd5b5073ffffffffffffffffffffffffffffffffffffffff8135169060200135610aec565b34801561035257600080fd5b506102906004803603602081101561036957600080fd5b5035610c24565b34801561037c57600080fd5b506102906004803603602081101561039357600080fd5b5035610dc8565b3480156103a657600080fd5b50610290610ef4565b3480156103bb57600080fd5b50610290600480360360608110156103d257600080fd5b50803590602081013590604001351515610f13565b3480156103f357600080fd5b5061029061101d565b34801561040857600080fd5b5061019a61111d565b34801561041d57600080fd5b506102a7611123565b34801561043257600080fd5b5061019a6004803603604081101561044957600080fd5b508035906020013561113f565b34801561046257600080fd5b5061049c6004803603604081101561047957600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611154565b60408051938452602084019290925282820152519081900360600190f35b3480156104c657600080fd5b50610500600480360360408110156104dd57600080fd5b508035906020013573ffffffffffffffffffffffffffffffffffffffff16611180565b6040805192835260208301919091528051918290030190f35b34801561052557600080fd5b506102a7611385565b34801561053a57600080fd5b506102906004803603606081101561055157600080fd5b508035906020810135906040013515156113a1565b34801561057257600080fd5b506102906004803603604081101561058957600080fd5b508035906020013561144c565b3480156105a257600080fd5b50610290600480360360208110156105b957600080fd5b503573ffffffffffffffffffffffffffffffffffffffff1661167e565b60065490565b60055481565b600681815481106105ef57fe5b60009182526020909120600590910201805460018201546002830154600384015460049094015473ffffffffffffffffffffffffffffffffffffffff90931694509092909185565b60085481565b610645611808565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146106ce57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b80156106dc576106dc610ef4565b6008546106e9908461180c565b600855506040805160a08101825273ffffffffffffffffffffffffffffffffffffffff928316815260208101938452439181019182526000606082018181526080830182815260068054600181018255935292517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f600590930292830180547fffffffffffffffffffffffff000000000000000000000000000000000000000016919096161790945593517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4085015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4184015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d42830155517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4390910155565b60025473ffffffffffffffffffffffffffffffffffffffff1681565b600260015414156108ba57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001819055506000600683815481106108d157fe5b60009182526020808320868452600782526040808520338652909252922080546005909202909201925083111561096957604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f77697468647261773a206e6f7420676f6f640000000000000000000000000000604482015290519081900360640190fd5b61097284610c24565b60006109ac82600101546109a664e8d4a510006109a08760030154876000015461188090919063ffffffff16565b906118f3565b90611935565b905060006109dc83600201546109a664e8d4a510006109a08860040154886000015461188090919063ffffffff16565b90508115610a0857600254610a089073ffffffffffffffffffffffffffffffffffffffff163384611977565b8015610a3257600354610a329073ffffffffffffffffffffffffffffffffffffffff163383611977565b8415610a69578254610a449086611935565b83558354610a699073ffffffffffffffffffffffffffffffffffffffff163387611bda565b60038401548354610a849164e8d4a51000916109a091611880565b600184015560048401548354610aa49164e8d4a51000916109a091611880565b6002840155604080518681529051879133917ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b5689181900360200190a350506001805550505050565b610af4611808565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610b7d57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b60025473ffffffffffffffffffffffffffffffffffffffff83811691161480610bc0575060035473ffffffffffffffffffffffffffffffffffffffff8381169116145b610c15576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602881526020018061213a6028913960400191505060405180910390fd5b610c20823383611977565b5050565b600060068281548110610c3357fe5b9060005260206000209060050201905080600201544311610c545750610dc5565b8054604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905160009273ffffffffffffffffffffffffffffffffffffffff16916370a08231916024808301926020929190829003018186803b158015610cc457600080fd5b505afa158015610cd8573d6000803e3d6000fd5b505050506040513d6020811015610cee57600080fd5b5051905080610d04575043600290910155610dc5565b6000610d1483600201544361113f565b90506000610d416008546109a08660010154610d3b6004548761188090919063ffffffff16565b90611880565b90506000610d686008546109a08760010154610d3b6005548861188090919063ffffffff16565b9050610d8b610d80856109a08564e8d4a51000611880565b60038701549061180c565b6003860155610db1610da6856109a08464e8d4a51000611880565b60048701549061180c565b600486015550504360029093019290925550505b50565b60026001541415610e3a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b6002600181905550600060068281548110610e5157fe5b60009182526020808320858452600782526040808520338087529352909320805460059093029093018054909450610ea39273ffffffffffffffffffffffffffffffffffffffff919091169190611bda565b80546040805191825251849133917fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae05959181900360200190a36000808255600180830182905560029092015580555050565b60065460005b81811015610c2057610f0b81610c24565b600101610efa565b610f1b611808565b60005473ffffffffffffffffffffffffffffffffffffffff908116911614610fa457604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b8015610fb257610fb2610ef4565b610fef82610fe960068681548110610fc657fe5b90600052602060002090600502016001015460085461193590919063ffffffff16565b9061180c565b600881905550816006848154811061100357fe5b906000526020600020906005020160010181905550505050565b611025611808565b60005473ffffffffffffffffffffffffffffffffffffffff9081169116146110ae57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055565b60045481565b60005473ffffffffffffffffffffffffffffffffffffffff1690565b600061114b8284611935565b90505b92915050565b600760209081526000928352604080842090915290825290208054600182015460029092015490919083565b60008060006006858154811061119257fe5b6000918252602080832088845260078252604080852073ffffffffffffffffffffffffffffffffffffffff8a811687529084528186206005959095029092016003810154600480830154835485517f70a08231000000000000000000000000000000000000000000000000000000008152309381019390935294519399509697919695919493909316926370a082319260248083019392829003018186803b15801561123d57600080fd5b505afa158015611251573d6000803e3d6000fd5b505050506040513d602081101561126757600080fd5b505160028601549091504311801561127e57508015155b1561132557600061129386600201544361113f565b905060006112ba6008546109a08960010154610d3b6004548761188090919063ffffffff16565b905060006112e16008546109a08a60010154610d3b6005548861188090919063ffffffff16565b90506113006112f9856109a08564e8d4a51000611880565b879061180c565b955061131f611318856109a08464e8d4a51000611880565b869061180c565b94505050505b61134d84600101546109a664e8d4a510006109a087896000015461188090919063ffffffff16565b61137585600201546109a664e8d4a510006109a0878a6000015461188090919063ffffffff16565b9650965050505050509250929050565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6113a9611808565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461143257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b801561144057611440610ef4565b50600491909155600555565b600260015414156114be57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015290519081900360640190fd5b60026001819055506000600683815481106114d557fe5b6000918252602080832086845260078252604080852033865290925292206005909102909101915061150684610c24565b8054156115c457600061153b82600101546109a664e8d4a510006109a08760030154876000015461188090919063ffffffff16565b9050600061156b83600201546109a664e8d4a510006109a08860040154886000015461188090919063ffffffff16565b90508115611597576002546115979073ffffffffffffffffffffffffffffffffffffffff163384611977565b80156115c1576003546115c19073ffffffffffffffffffffffffffffffffffffffff163383611977565b50505b82156115fd5781546115ee9073ffffffffffffffffffffffffffffffffffffffff16333086611c6c565b80546115fa908461180c565b81555b600382015481546116189164e8d4a51000916109a091611880565b6001820155600482015481546116389164e8d4a51000916109a091611880565b6002820155604080518481529051859133917f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a159181900360200190a35050600180555050565b611686611808565b60005473ffffffffffffffffffffffffffffffffffffffff90811691161461170f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015290519081900360640190fd5b73ffffffffffffffffffffffffffffffffffffffff811661177b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260268152602001806120f36026913960400191505060405180910390fd5b6000805460405173ffffffffffffffffffffffffffffffffffffffff808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b3390565b60008282018381101561114b57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b60008261188f5750600061114e565b8282028284828161189c57fe5b041461114b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806121196021913960400191505060405180910390fd5b600061114b83836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250611d01565b600061114b83836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250611dbd565b600073ffffffffffffffffffffffffffffffffffffffff841615611a3257604080517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152905173ffffffffffffffffffffffffffffffffffffffff8616916370a08231916024808301926020929190829003018186803b158015611a0157600080fd5b505afa158015611a15573d6000803e3d6000fd5b505050506040513d6020811015611a2b57600080fd5b5051611a34565b475b905081811015611a8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d815260200180612197602d913960400191505060405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8416611b365760405173ffffffffffffffffffffffffffffffffffffffff84169083156108fc029084906000818181858888f19350505050611b31576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260358152602001806121626035913960400191505060405180910390fd5b611bd4565b8373ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b158015611ba757600080fd5b505af1158015611bbb573d6000803e3d6000fd5b505050506040513d6020811015611bd157600080fd5b50505b50505050565b6040805173ffffffffffffffffffffffffffffffffffffffff8416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052611c67908490611e31565b505050565b6040805173ffffffffffffffffffffffffffffffffffffffff80861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000179052611bd4908590611e31565b60008183611da7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015611d6c578181015183820152602001611d54565b50505050905090810190601f168015611d995780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581611db357fe5b0495945050505050565b60008184841115611e29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152835160248401528351909283926044909101919085019080838360008315611d6c578181015183820152602001611d54565b505050900390565b6060611e93826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16611f099092919063ffffffff16565b805190915015611c6757808060200190516020811015611eb257600080fd5b5051611c67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602a8152602001806121c4602a913960400191505060405180910390fd5b6060611f188484600085611f20565b949350505050565b6060611f2b856120ec565b611f9657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b600060608673ffffffffffffffffffffffffffffffffffffffff1685876040518082805190602001908083835b6020831061200057805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101611fc3565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612062576040519150601f19603f3d011682016040523d82523d6000602084013e612067565b606091505b5091509150811561207b579150611f189050565b80511561208b5780518082602001fd5b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201818152865160248401528651879391928392604401919085019080838360008315611d6c578181015183820152602001611d54565b3b15159056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f777769746864726177526577617264546f6b656e3a20696e76616c696420726577617264546f6b656e73616665526577617264546f6b656e5472616e736665723a206e617469766520746f6b656e207472616e73666572206661696c656473616665526577617264546f6b656e5472616e736665723a20696e73756666696369656e742062616c616e63655361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564a264697066735822122010d094342fbc05cd508b7e751db24b1addf18940434cb334253eb20275913fdb64736f6c634300060c00330000000000000000000000009cb74c8032b007466865f060ad2c46145d45553d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009cb74c8032b007466865f060ad2c46145d45553d000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _reward0Token (address): 0x9cb74c8032b007466865f060ad2c46145d45553d
Arg [1] : _reward1Token (address): 0x0000000000000000000000000000000000000000
Arg [2] : _reward0TokenPerBlock (uint256): 0
Arg [3] : _reward1TokenPerBlock (uint256): 0
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000009cb74c8032b007466865f060ad2c46145d45553d
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
23857:10520:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26467:89;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;25467:35;;;;;;;;;;;;;:::i;25534:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25534:26:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25767:34;;;;;;;;;;;;;:::i;26719:447::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;26719:447:0;;;;;;;;;;;;;;;;:::i;:::-;;25326:26;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31482:1011;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31482:1011:0;;;;;;;:::i;34099:275::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34099:275:0;;;;;;;;;:::i;29381:939::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29381:939:0;;:::i;32560:371::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;32560:371:0;;:::i;29149:160::-;;;;;;;;;;;;;:::i;27260:314::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27260:314:0;;;;;;;;;;;;;;:::i;20562:148::-;;;;;;;;;;;;;:::i;25427:35::-;;;;;;;;;;;;;:::i;19920:79::-;;;;;;;;;;;;;:::i;27646:133::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27646:133:0;;;;;;;:::i;25612:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25612:64:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;27841:1229;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27841:1229:0;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;25357:26;;;;;;;;;;;;;:::i;33788:305::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33788:305:0;;;;;;;;;;;;;;:::i;30381:1059::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30381:1059:0;;;;;;;:::i;20865:244::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20865:244:0;;;;:::i;26467:89::-;26535:8;:15;26467:89;:::o;25467:35::-;;;;:::o;25534:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;25534:26:0;;;;;:::o;25767:34::-;;;;:::o;26719:447::-;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26836:11:::1;26832:51;;;26858:17;:15;:17::i;:::-;26907:15;::::0;:32:::1;::::0;26927:11;26907:19:::1;:32::i;:::-;26889:15;:50:::0;-1:-1:-1;26968:185:0::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;27067:12:::1;26968:185:::0;;;;;;-1:-1:-1;26968:185:0;;;;;;;;;;;;26946:8:::1;:214:::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;26719:447::o;25326:26::-;;;;;;:::o;31482:1011::-;22820:1;23426:7;;:19;;23418:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22820:1;23559:7;:18;;;;31558:21:::1;31582:8;31591:4;31582:14;;;;;;;;;::::0;;;::::1;::::0;;;31627;;;:8:::1;:14:::0;;;;;;31642:10:::1;31627:26:::0;;;;;;;31668:11;;31582:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;31668:22:0;-1:-1:-1;31668:22:0::1;31660:53;;;::::0;;::::1;::::0;;::::1;;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;;;;;;;;;;;;;::::1;;31720:16;31731:4;31720:10;:16::i;:::-;31743;31769:72;31824:4;:16;;;31769:50;31814:4;31769:40;31785:4;:23;;;31769:4;:11;;;:15;;:40;;;;:::i;:::-;:44:::0;::::1;:50::i;:::-;:54:::0;::::1;:72::i;:::-;31743:98;;31848:16;31874:72;31929:4;:16;;;31874:50;31919:4;31874:40;31890:4;:23;;;31874:4;:11;;;:15;;:40;;;;:::i;:72::-;31848:98:::0;-1:-1:-1;31957:12:0;;31953:94:::1;;32004:12;::::0;31980:59:::1;::::0;32004:12:::1;;32018:10;32030:8:::0;31980:23:::1;:59::i;:::-;32057:12:::0;;32053:94:::1;;32104:12;::::0;32080:59:::1;::::0;32104:12:::1;;32118:10;32130:8:::0;32080:23:::1;:59::i;:::-;32157:11:::0;;32153:136:::1;;32193:11:::0;;:24:::1;::::0;32209:7;32193:15:::1;:24::i;:::-;32179:38:::0;;32226:12;;:55:::1;::::0;:12:::1;;32260:10;32273:7:::0;32226:25:::1;:55::i;:::-;32330:23;::::0;::::1;::::0;32314:11;;:50:::1;::::0;32359:4:::1;::::0;32314:40:::1;::::0;:15:::1;:40::i;:50::-;32295:16;::::0;::::1;:69:::0;32406:23:::1;::::0;::::1;::::0;32390:11;;:50:::1;::::0;32435:4:::1;::::0;32390:40:::1;::::0;:15:::1;:40::i;:50::-;32371:16;::::0;::::1;:69:::0;32452:35:::1;::::0;;;;;;;32473:4;;32461:10:::1;::::0;32452:35:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;22776:1:0;23738:22;;-1:-1:-1;;;;31482:1011:0:o;34099:275::-;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34214:12:::1;::::0;::::1;34199:27:::0;;::::1;34214:12:::0;::::1;34199:27;::::0;:58:::1;;-1:-1:-1::0;34245:12:0::1;::::0;::::1;34230:27:::0;;::::1;34245:12:::0;::::1;34230:27;34199:58;34191:111;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34311:57;34335:11;34348:10;34360:7;34311:23;:57::i;:::-;34099:275:::0;;:::o;29381:939::-;29429:21;29453:8;29462:4;29453:14;;;;;;;;;;;;;;;;;;29429:38;;29494:4;:20;;;29478:12;:36;29474:65;;29525:7;;;29474:65;29564:12;;:37;;;;;;29595:4;29564:37;;;;;;29545:16;;29564:12;;;:22;;:37;;;;;;;;;;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;29564:37:0;;-1:-1:-1;29612:13:0;29608:86;;-1:-1:-1;29659:12:0;29636:20;;;;:35;29680:7;;29608:86;29700:18;29721:49;29735:4;:20;;;29757:12;29721:13;:49::i;:::-;29700:70;;29777:23;29810:96;29882:15;;29810:57;29851:4;:15;;;29810:36;29825:20;;29810:10;:14;;:36;;;;:::i;:::-;:40;;:57::i;:96::-;29777:129;;29913:23;29946:96;30018:15;;29946:57;29987:4;:15;;;29946:36;29961:20;;29946:10;:14;;:36;;;;:::i;:96::-;29913:129;-1:-1:-1;30075:82:0;30111:39;30141:8;30111:25;:15;30131:4;30111:19;:25::i;:39::-;30075:23;;;;;:27;:82::i;:::-;30049:23;;;:108;30190:82;30226:39;30256:8;30226:25;:15;30246:4;30226:19;:25::i;:39::-;30190:23;;;;;:27;:82::i;:::-;30164:23;;;:108;-1:-1:-1;;30302:12:0;30279:20;;;;:35;;;;-1:-1:-1;;29381:939:0;;:::o;32560:371::-;22820:1;23426:7;;:19;;23418:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22820:1;23559:7;:18;;;;32628:21:::1;32652:8;32661:4;32652:14;;;;;;;;;::::0;;;::::1;::::0;;;32697;;;:8:::1;:14:::0;;;;;;32712:10:::1;32697:26:::0;;;;;;;;32777:11;;32652:14:::1;::::0;;::::1;::::0;;::::1;32730:12:::0;;32652:14;;-1:-1:-1;32730:59:0::1;::::0;32697:26:::1;32730:12:::0;;;::::1;::::0;32712:10;32730:25:::1;:59::i;:::-;32837:11:::0;;32801:48:::1;::::0;;;;;;32831:4;;32819:10:::1;::::0;32801:48:::1;::::0;;;;::::1;::::0;;::::1;32870:1;32856:15:::0;;;32878:16:::1;::::0;;::::1;:20:::0;;;32905:16:::1;::::0;;::::1;:20:::0;23738:22;;-1:-1:-1;;32560:371:0:o;29149:160::-;29207:8;:15;29190:14;29229:75;29257:6;29251:3;:12;29229:75;;;29281:15;29292:3;29281:10;:15::i;:::-;29265:5;;29229:75;;27260:314;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27374:11:::1;27370:51;;;27396:17;:15;:17::i;:::-;27445:77;27504:11;27445:46;27465:8;27474:4;27465:14;;;;;;;;;;;;;;;;;;:25;;;27445:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:77::i;:::-;27427:15;:95;;;;27557:11;27529:8;27538:4;27529:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;27260:314:::0;;;:::o;20562:148::-;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20669:1:::1;20653:6:::0;;20632:40:::1;::::0;::::1;20653:6:::0;;::::1;::::0;20632:40:::1;::::0;20669:1;;20632:40:::1;20700:1;20683:19:::0;;;::::1;::::0;;20562:148::o;25427:35::-;;;;:::o;19920:79::-;19958:7;19985:6;;;19920:79;:::o;27646:133::-;27733:7;27759:14;:3;27767:5;27759:7;:14::i;:::-;27752:21;;27646:133;;;;;:::o;25612:64::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27841:1229::-;27931:7;27940;27959:21;27983:8;27992:4;27983:14;;;;;;;;;;;;;;;;28028;;;:8;:14;;;;;;:21;;;;;;;;;;;;27983:14;;;;;;;;28085:23;;;;28144;;;;;28193:12;;:37;;;;;28224:4;28193:37;;;;;;;;;27983:14;;-1:-1:-1;28028:21:0;;28085:23;;28144;27983:14;;28193:12;;;;;:22;;:37;;;;;27983:14;28193:37;;;;;:12;:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;28193:37:0;28256:20;;;;28193:37;;-1:-1:-1;28241:12:0;:35;:52;;;;-1:-1:-1;28280:13:0;;;28241:52;28237:655;;;28304:18;28325:49;28339:4;:20;;;28361:12;28325:13;:49::i;:::-;28304:70;;28383:23;28418:100;28492:15;;28418:57;28459:4;:15;;;28418:36;28433:20;;28418:10;:14;;:36;;;;:::i;:100::-;28383:135;;28527:23;28562:100;28636:15;;28562:57;28603:4;:15;;;28562:36;28577:20;;28562:10;:14;;:36;;;;:::i;:100::-;28527:135;-1:-1:-1;28692:81:0;28725:39;28755:8;28725:25;:15;28745:4;28725:19;:25::i;:39::-;28692:18;;:22;:81::i;:::-;28671:102;-1:-1:-1;28803:81:0;28836:39;28866:8;28836:25;:15;28856:4;28836:19;:25::i;:39::-;28803:18;;:22;:81::i;:::-;28782:102;;28237:655;;;;28914:67;28964:4;:16;;;28914:45;28954:4;28914:35;28930:18;28914:4;:11;;;:15;;:35;;;;:::i;:67::-;28990;29040:4;:16;;;28990:45;29030:4;28990:35;29006:18;28990:4;:11;;;:15;;:35;;;;:::i;:67::-;28898:166;;;;;;;;;27841:1229;;;;;:::o;25357:26::-;;;;;;:::o;33788:305::-;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33939:11:::1;33935:51;;;33961:17;:15;:17::i;:::-;-1:-1:-1::0;33992:20:0::1;:44:::0;;;;34043:20:::1;:44:::0;33788:305::o;30381:1059::-;22820:1;23426:7;;:19;;23418:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22820:1;23559:7;:18;;;;30456:21:::1;30480:8;30489:4;30480:14;;;;;;;;;::::0;;;::::1;::::0;;;30525;;;:8:::1;:14:::0;;;;;;30540:10:::1;30525:26:::0;;;;;;;30480:14:::1;::::0;;::::1;::::0;;::::1;::::0;-1:-1:-1;30558:16:0::1;30534:4:::0;30558:10:::1;:16::i;:::-;30585:11:::0;;:15;30581:459:::1;;30611:16;30639:72;30694:4;:16;;;30639:50;30684:4;30639:40;30655:4;:23;;;30639:4;:11;;;:15;;:40;;;;:::i;:72::-;30611:100;;30720:16;30748:72;30803:4;:16;;;30748:50;30793:4;30748:40;30764:4;:23;;;30748:4;:11;;;:15;;:40;;;;:::i;:72::-;30720:100:::0;-1:-1:-1;30833:12:0;;30829:98:::1;;30882:12;::::0;30858:59:::1;::::0;30882:12:::1;;30896:10;30908:8:::0;30858:23:::1;:59::i;:::-;30939:12:::0;;30935:98:::1;;30988:12;::::0;30964:59:::1;::::0;30988:12:::1;;31002:10;31014:8:::0;30964:23:::1;:59::i;:::-;30581:459;;;31050:11:::0;;31046:191:::1;;31072:12:::0;;:110:::1;::::0;:12:::1;;31120:10;31150:4;31166:7:::0;31072:29:::1;:110::i;:::-;31205:11:::0;;:24:::1;::::0;31221:7;31205:15:::1;:24::i;:::-;31191:38:::0;;31046:191:::1;31278:23;::::0;::::1;::::0;31262:11;;:50:::1;::::0;31307:4:::1;::::0;31262:40:::1;::::0;:15:::1;:40::i;:50::-;31243:16;::::0;::::1;:69:::0;31354:23:::1;::::0;::::1;::::0;31338:11;;:50:::1;::::0;31383:4:::1;::::0;31338:40:::1;::::0;:15:::1;:40::i;:50::-;31319:16;::::0;::::1;:69:::0;31400:34:::1;::::0;;;;;;;31420:4;;31408:10:::1;::::0;31400:34:::1;::::0;;;;::::1;::::0;;::::1;-1:-1:-1::0;;22776:1:0;23738:22;;-1:-1:-1;;30381:1059:0:o;20865:244::-;20142:12;:10;:12::i;:::-;20132:6;;:22;:6;;;:22;;;20124:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20954:22:::1;::::0;::::1;20946:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21056:6;::::0;;21035:38:::1;::::0;::::1;::::0;;::::1;::::0;21056:6;::::1;::::0;21035:38:::1;::::0;::::1;21084:6;:17:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;20865:244::o;18503:106::-;18591:10;18503:106;:::o;966:181::-;1024:7;1056:5;;;1080:6;;;;1072:46;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2320:471;2378:7;2623:6;2619:47;;-1:-1:-1;2653:1:0;2646:8;;2619:47;2690:5;;;2694:1;2690;:5;:1;2714:5;;;;;:10;2706:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3267:132;3325:7;3352:39;3356:1;3359;3352:39;;;;;;;;;;;;;;;;;:3;:39::i;1430:136::-;1488:7;1515:43;1519:1;1522;1515:43;;;;;;;;;;;;;;;;;:3;:43::i;33021:640::-;33127:21;33151:36;;;;:99;;33214:36;;;;;;33244:4;33214:36;;;;;;:21;;;;;;:36;;;;;;;;;;;;;;:21;:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;33214:36:0;33151:99;;;33190:21;33151:99;33127:123;;33282:7;33265:13;:24;;33257:82;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33352:36;;;33348:308;;33417:17;;:8;;;;:17;;;;;33426:7;;33417:17;;;;33426:7;33417:8;:17;;;;;;;33399:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33348:308;;;33614:11;:20;;;33635:3;33640:7;33614:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;33348:308:0;33021:640;;;;:::o;14835:177::-;14945:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14968:23;14945:58;;;14918:86;;14938:5;;14918:19;:86::i;:::-;14835:177;;;:::o;15020:205::-;15148:68;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15171:27;15148:68;;;15121:96;;15141:5;;15121:19;:96::i;3895:278::-;3981:7;4016:12;4009:5;4001:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4040:9;4056:1;4052;:5;;;;;;;3895:278;-1:-1:-1;;;;;3895:278:0:o;1869:192::-;1955:7;1991:12;1983:6;;;;1975:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2027:5:0;;;1869:192::o;17140:761::-;17564:23;17590:69;17618:4;17590:69;;;;;;;;;;;;;;;;;17598:5;17590:27;;;;:69;;;;;:::i;:::-;17674:17;;17564:95;;-1:-1:-1;17674:21:0;17670:224;;17816:10;17805:30;;;;;;;;;;;;;;;-1:-1:-1;17805:30:0;17797:85;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11851:196;11954:12;11986:53;12009:6;12017:4;12023:1;12026:12;11986:22;:53::i;:::-;11979:60;11851:196;-1:-1:-1;;;;11851:196:0:o;13228:979::-;13358:12;13391:18;13402:6;13391:10;:18::i;:::-;13383:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13517:12;13531:23;13558:6;:11;;13578:8;13589:4;13558:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13516:78;;;;13609:7;13605:595;;;13640:10;-1:-1:-1;13633:17:0;;-1:-1:-1;13633:17:0;13605:595;13754:17;;:21;13750:439;;14017:10;14011:17;14078:15;14065:10;14061:2;14057:19;14050:44;13965:148;14153:20;;;;;;;;;;;;;;;;;;;;14160:12;;14153:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8933:422;9300:20;9339:8;;;8933:422::o
Swarm Source
ipfs://10d094342fbc05cd508b7e751db24b1addf18940434cb334253eb20275913fdb
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.