More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 58,469 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Unstake | 20625666 | 158 days ago | IN | 0 ETH | 0.00008707 | ||||
Unstake | 20577193 | 164 days ago | IN | 0 ETH | 0.00012341 | ||||
Withdraw | 20577191 | 164 days ago | IN | 0 ETH | 0.00015509 | ||||
Unstake | 20018556 | 242 days ago | IN | 0 ETH | 0.00086206 | ||||
Withdraw | 20018550 | 242 days ago | IN | 0 ETH | 0.00080435 | ||||
Unstake | 19594767 | 302 days ago | IN | 0 ETH | 0.00085087 | ||||
Unstake | 19312732 | 341 days ago | IN | 0 ETH | 0.00463038 | ||||
Withdraw | 19312724 | 341 days ago | IN | 0 ETH | 0.00198338 | ||||
Withdraw | 19312722 | 341 days ago | IN | 0 ETH | 0.00487903 | ||||
Unstake | 18833204 | 409 days ago | IN | 0 ETH | 0.00279038 | ||||
Withdraw | 18833202 | 409 days ago | IN | 0 ETH | 0.00278029 | ||||
Claim | 18833156 | 409 days ago | IN | 0 ETH | 0.00299391 | ||||
Unstake | 18798303 | 413 days ago | IN | 0 ETH | 0.00393215 | ||||
Withdraw | 18798100 | 413 days ago | IN | 0 ETH | 0.00411177 | ||||
Unstake | 18567050 | 446 days ago | IN | 0 ETH | 0.00274886 | ||||
Withdraw | 18567022 | 446 days ago | IN | 0 ETH | 0.00355367 | ||||
Unstake | 18524332 | 452 days ago | IN | 0 ETH | 0.00177989 | ||||
Unstake | 18466155 | 460 days ago | IN | 0 ETH | 0.00084351 | ||||
Unstake | 18466146 | 460 days ago | IN | 0 ETH | 0.00072007 | ||||
Withdraw | 18433799 | 464 days ago | IN | 0 ETH | 0.00314135 | ||||
Unstake | 18293079 | 484 days ago | IN | 0 ETH | 0.00081134 | ||||
Withdraw | 18279928 | 486 days ago | IN | 0 ETH | 0.00064447 | ||||
Claim | 18279902 | 486 days ago | IN | 0 ETH | 0.00096099 | ||||
Unstake | 17907500 | 538 days ago | IN | 0 ETH | 0.00114208 | ||||
Transfer | 17907462 | 538 days ago | IN | 0 ETH | 0.00033139 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
Farm
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-11-24 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity >=0.6.0 <0.8.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/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.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, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, 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 (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @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) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @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) { 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, reverting 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) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting 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) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * 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); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * 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); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * 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/utils/Address.sol pragma solidity >=0.6.2 <0.8.0; /** * @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 on 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { 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 pragma solidity >=0.6.0 <0.8.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/interfaces/IBurnable.sol //SPDX-License-Identifier: Unlicense pragma solidity 0.7.6; interface IBurnable { function burn(uint256 amount) external; function balanceOf(address account) external view returns (uint256); } // File: contracts/interfaces/IFarmManager.sol pragma solidity 0.7.6; interface IFarmManager { function getPaused() external view returns(bool); function getBurnRate() external view returns(uint256); function getUnstakeEpochs() external view returns(uint256); function getRedistributor() external view returns(address); function getLpLock() external view returns(address); } // File: contracts/Farm.sol pragma solidity 0.7.6; pragma abicoder v2; // Farm distributes the ERC20 rewards based on staked LP to each user. contract Farm { 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 rewardDebt; // Reward debt. See explanation below. uint256 lastClaimTime; uint256 withdrawTime; // We do some fancy math here. Basically, any point in time, the amount of ERC20s // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accERC20PerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accERC20PerShare` (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 stakingToken; // Address of staking token contract. uint256 allocPoint; // How many allocation points assigned to this pool. ERC20s to distribute per block. uint256 lastRewardBlock; // Last block number that ERC20s distribution occurs. uint256 accERC20PerShare; // Accumulated ERC20s per share, times 1e36. uint256 supply; // changes with unstakes. bool isLP; // if the staking token is an LP token. } // Address of the ERC20 Token contract. IERC20 public erc20; // The total amount of ERC20 that's paid out as reward. uint256 public paidOut = 0; // ERC20 tokens rewarded per block. uint256 public rewardPerBlock; // Manager interface to get globals for all farms. IFarmManager public manager; // 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; // The block number when farming starts. uint256 public startBlock; // The block number when farming ends. uint256 public endBlock; // Seconds per epoch (1 day) uint256 public constant SECS_EPOCH = 86400; // events event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid); event Claim(address indexed user, uint256 indexed pid); event Unstake(address indexed user, uint256 indexed pid); event Initialize(IERC20 erc20, uint256 rewardPerBlock, uint256 startBlock, address manager); constructor(IERC20 _erc20, uint256 _rewardPerBlock, uint256 _startBlock, address _manager) public { erc20 = _erc20; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; endBlock = _startBlock; manager = IFarmManager(_manager); emit Initialize(_erc20, _rewardPerBlock, _startBlock, _manager); } // Fund the farm, increase the end block. function fund(uint256 _amount) external { require(msg.sender == address(manager), "fund: sender is not manager"); require(block.number <= endBlock, "fund: too late, the farm is closed"); erc20.safeTransferFrom(address(tx.origin), address(this), _amount); endBlock += _amount.div(rewardPerBlock); } // Update the given pool's ERC20 allocation point. Can only be called by the manager. function set(uint256 _pid, uint256 _allocPoint, bool _withUpdate) external { require(msg.sender == address(manager), "set: sender is not manager"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } // Add a new staking token to the pool. Can only be called by the manager. function add(uint256 _allocPoint, IERC20 _stakingToken, bool _isLP, bool _withUpdate) external { require(msg.sender == address(manager), "fund: sender is not manager"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardBlock = block.number > startBlock ? block.number : startBlock; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolInfo.push(PoolInfo({ stakingToken: _stakingToken, supply: 0, allocPoint: _allocPoint, lastRewardBlock: lastRewardBlock, accERC20PerShare: 0, isLP: _isLP })); } // 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]; uint256 lastBlock = block.number < endBlock ? block.number : endBlock; if (lastBlock <= pool.lastRewardBlock) { return; } if (pool.supply == 0) { pool.lastRewardBlock = lastBlock; return; } uint256 nrOfBlocks = lastBlock.sub(pool.lastRewardBlock); uint256 erc20Reward = nrOfBlocks.mul(rewardPerBlock).mul(pool.allocPoint).div(totalAllocPoint); pool.accERC20PerShare = pool.accERC20PerShare.add(erc20Reward.mul(1e36).div(pool.supply)); pool.lastRewardBlock = block.number; } // move LP tokens from one farm to another. only callable by Manager. // tx.origin is user EOA, msg.sender is the Manager. function move(uint256 _pid) external { require(msg.sender == address(manager), "move: sender is not manager"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][tx.origin]; updatePool(_pid); uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(tx.origin, pendingAmount); pool.supply = pool.supply.sub(user.amount); pool.stakingToken.safeTransfer(address(manager), user.amount); user.amount = 0; user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36); emit Withdraw(msg.sender, _pid); } // Deposit LP tokens to Farm for ERC20 allocation. // can come from manager or user address directly; in either case, tx.origin is the user. // In the case the call is coming from the mananger, msg.sender is the manager. function deposit(uint256 _pid, uint256 _amount) external { require(manager.getPaused()==false, "deposit: farm paused"); address userAddress = ((msg.sender == address(manager)) ? tx.origin : msg.sender); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][userAddress]; require(user.withdrawTime == 0, "deposit: user is unstaking"); updatePool(_pid); if (user.amount > 0) { uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(userAddress, pendingAmount); } pool.stakingToken.safeTransferFrom(address(msg.sender), address(this), _amount); pool.supply = pool.supply.add(_amount); user.amount = user.amount.add(_amount); user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36); emit Deposit(userAddress, _pid, _amount); } // Distribute rewards and start unstake period. function withdraw(uint256 _pid) external { require(manager.getPaused()==false, "withdraw: farm paused"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount > 0, "withdraw: amount must be greater than 0"); require(user.withdrawTime == 0, "withdraw: user is unstaking"); updatePool(_pid); // transfer any rewards due uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(msg.sender, pendingAmount); pool.supply = pool.supply.sub(user.amount); user.rewardDebt = 0; user.withdrawTime = block.timestamp; emit Withdraw(msg.sender, _pid); } // unstake LP tokens from Farm. if done within "unstakeEpochs" days, apply burn. function unstake(uint256 _pid) external { require(manager.getPaused()==false, "unstake: farm paused"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.withdrawTime > 0, "unstake: user is not unstaking"); updatePool(_pid); //apply burn fee if unstaking before unstake epochs. uint256 unstakeEpochs = manager.getUnstakeEpochs(); uint256 burnRate = manager.getBurnRate(); address redistributor = manager.getRedistributor(); if((user.withdrawTime.add(SECS_EPOCH.mul(unstakeEpochs)) > block.timestamp) && burnRate > 0){ uint penalty = user.amount.div(1000).mul(burnRate); user.amount = user.amount.sub(penalty); // if the staking address is an LP, send 50% of penalty to redistributor, and 50% to lp lock address. if(pool.isLP){ pool.stakingToken.safeTransfer(redistributor, penalty.div(2)); pool.stakingToken.safeTransfer(manager.getLpLock(), penalty.div(2)); }else { // for normal ERC20 tokens, 50% of the penalty is sent to the redistributor address, 50% is burned from the supply. pool.stakingToken.safeTransfer(redistributor, penalty.div(2)); IBurnable(address(pool.stakingToken)).burn(penalty.div(2)); } } uint userAmount = user.amount; // allows user to stake again. user.withdrawTime = 0; user.amount = 0; pool.stakingToken.safeTransfer(address(msg.sender), userAmount); emit Unstake(msg.sender, _pid); } // claim LP tokens from Farm. function claim(uint256 _pid) external { require(manager.getPaused() == false, "claim: farm paused"); PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount > 0, "claim: amount is equal to 0"); require(user.withdrawTime == 0, "claim: user is unstaking"); updatePool(_pid); uint256 pendingAmount = user.amount.mul(pool.accERC20PerShare).div(1e36).sub(user.rewardDebt); erc20Transfer(msg.sender, pendingAmount); user.rewardDebt = user.amount.mul(pool.accERC20PerShare).div(1e36); user.lastClaimTime = block.timestamp; emit Claim(msg.sender, _pid); } // Transfer ERC20 and update the required ERC20 to payout all rewards function erc20Transfer(address _to, uint256 _amount) internal { erc20.transfer(_to, _amount); paidOut += _amount; } // emergency withdraw rewards. only owner. EMERGENCY ONLY. function emergencyWithdrawRewards() external { require(msg.sender == address(manager), "emergencyWithdrawRewards: sender is not manager"); uint balance = erc20.balanceOf(address(this)); erc20.safeTransfer(address(tx.origin), balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_erc20","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"address","name":"_manager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Claim","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":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"contract IERC20","name":"erc20","type":"address"},{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"address","name":"manager","type":"address"}],"name":"Initialize","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Unstake","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"SECS_EPOCH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_stakingToken","type":"address"},{"internalType":"bool","name":"_isLP","type":"bool"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"claim","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":[],"name":"emergencyWithdrawRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"erc20","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"fund","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"manager","outputs":[{"internalType":"contract IFarmManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"move","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paidOut","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"stakingToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardBlock","type":"uint256"},{"internalType":"uint256","name":"accERC20PerShare","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"bool","name":"isLP","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","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":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"unstake","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":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"lastClaimTime","type":"uint256"},{"internalType":"uint256","name":"withdrawTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052600060015560006006553480156200001b57600080fd5b5060405162002039380380620020398339810160408190526200003e91620000c7565b600080546001600160a01b038087166001600160a01b03199283161790925560028590556007849055600884905560038054928416929091169190911790556040517fc3c5a2656123d24501b47b687c873515b973ed6b86ad0a07bc5543adab5dc2b790620000b590869086908690869062000117565b60405180910390a1505050506200015b565b60008060008060808587031215620000dd578384fd5b8451620000ea8162000142565b80945050602085015192506040850151915060608501516200010c8162000142565b939692955090935050565b6001600160a01b03948516815260208101939093526040830191909152909116606082015260800190565b6001600160a01b03811681146200015857600080fd5b50565b611ece806200016b6000396000f3fe608060405234801561001057600080fd5b50600436106101375760003560e01c8063630b5ba1116100b85780638b01295d1161007c5780638b01295d1461023857806393f1a40b14610240578063b2e1630614610263578063c507aeaa1461026b578063ca1d209d1461027e578063e2bbb1581461029157610137565b8063630b5ba1146101fa57806364482f7914610202578063785e9e861461021557806387cb15f71461021d5780638ae39cac1461023057610137565b8063379607f5116100ff578063379607f5146101af578063481c6a75146101c257806348cd4cb1146101d757806351eb05a6146101df5780635c76ca2d146101f257610137565b8063083c63231461013c5780631526fe271461015a57806317caf6f11461017f5780632e17de78146101875780632e1a7d4d1461019c575b600080fd5b6101446102a4565b6040516101519190611e25565b60405180910390f35b61016d610168366004611752565b6102aa565b604051610151969594939291906118c9565b6101446102fd565b61019a610195366004611752565b610303565b005b61019a6101aa366004611752565b61078f565b61019a6101bd366004611752565b610956565b6101ca610b1e565b6040516101519190611878565b610144610b2d565b61019a6101ed366004611752565b610b33565b610144610c1e565b61019a610c24565b61019a610210366004611824565b610c47565b6101ca610cea565b61019a61022b366004611752565b610cf9565b610144610e3a565b610144610e40565b61025361024e366004611782565b610e47565b6040516101519493929190611e2e565b61019a610e79565b61019a6102793660046117b1565b610f3e565b61019a61028c366004611752565b6110f9565b61019a61029f366004611803565b611177565b60085481565b600481815481106102ba57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909260ff1686565b60065481565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561035157600080fd5b505afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103899190611736565b156103af5760405162461bcd60e51b81526004016103a690611b34565b60405180910390fd5b6000600482815481106103be57fe5b6000918252602080832085845260058252604080852033865290925292206003810154600690920290920192506104075760405162461bcd60e51b81526004016103a6906119e6565b61041083610b33565b600354604080516352dc6bf960e11b815290516000926001600160a01b03169163a5b8d7f2916004808301926020929190829003018186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048d919061176a565b90506000600360009054906101000a90046001600160a01b03166001600160a01b031663482cd6c56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104df57600080fd5b505afa1580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610517919061176a565b90506000600360009054906101000a90046001600160a01b03166001600160a01b0316630ee09a106040518163ffffffff1660e01b815260040160206040518083038186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a1919061171a565b9050426105bf6105b4620151808661139e565b6003870154906113e1565b1180156105cc5750600082115b156107365783546000906105ee9084906105e8906103e8611406565b9061139e565b85549091506105fd9082611438565b8555600586015460ff16156106bb5761062d8261061b836002611406565b88546001600160a01b03169190611460565b6003546040805163b495373560e01b815290516106b6926001600160a01b03169163b4953735916004808301926020929190829003018186803b15801561067357600080fd5b505afa158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ab919061171a565b61061b836002611406565b610734565b6106ca8261061b836002611406565b85546001600160a01b03166342966c686106e5836002611406565b6040518263ffffffff1660e01b81526004016107019190611e25565b600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b505050505b505b835460006003860181905585558554610759906001600160a01b03163383611460565b604051879033907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd90600090a350505050505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107dd57600080fd5b505afa1580156107f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108159190611736565b156108325760405162461bcd60e51b81526004016103a690611c53565b60006004828154811061084157fe5b6000918252602080832085845260058252604080852033865290925292208054600690920290920192506108875760405162461bcd60e51b81526004016103a690611931565b6003810154156108a95760405162461bcd60e51b81526004016103a690611978565b6108b283610b33565b60006108f582600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b90611406565b90611438565b905061090133826114bb565b8154600484015461091191611438565b6004840155600060018301819055426003840155604051859133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649190a350505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109a457600080fd5b505afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190611736565b156109f95760405162461bcd60e51b81526004016103a690611b08565b600060048281548110610a0857fe5b600091825260208083208584526005825260408085203386529092529220805460069092029092019250610a4e5760405162461bcd60e51b81526004016103a690611b62565b600381015415610a705760405162461bcd60e51b81526004016103a690611a54565b610a7983610b33565b6000610ab082600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b9050610abc33826114bb565b60038301548254610ae0916a0c097ce7bc90715b34b9f160241b916108e99161139e565b6001830155426002830155604051849033907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490600090a350505050565b6003546001600160a01b031681565b60075481565b600060048281548110610b4257fe5b9060005260206000209060060201905060006008544310610b6557600854610b67565b435b905081600201548111610b7b575050610c1b565b6004820154610b8f57600290910155610c1b565b6000610ba883600201548361143890919063ffffffff16565b90506000610bcf6006546108e986600101546105e86002548761139e90919063ffffffff16565b9050610c08610bfd85600401546108e96a0c097ce7bc90715b34b9f160241b8561139e90919063ffffffff16565b6003860154906113e1565b6003850155505043600290920191909155505b50565b60015481565b60045460005b81811015610c4357610c3b81610b33565b600101610c2a565b5050565b6003546001600160a01b03163314610c715760405162461bcd60e51b81526004016103a690611dee565b8015610c7f57610c7f610c24565b610cbc82610cb660048681548110610c9357fe5b90600052602060002090600602016001015460065461143890919063ffffffff16565b906113e1565b6006819055508160048481548110610cd057fe5b906000526020600020906006020160010181905550505050565b6000546001600160a01b031681565b6003546001600160a01b03163314610d235760405162461bcd60e51b81526004016103a690611db7565b600060048281548110610d3257fe5b60009182526020808320858452600582526040808520328652909252922060069091029091019150610d6383610b33565b6000610d9a82600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b9050610da632826114bb565b81546004840154610db691611438565b600484015560035482548454610dda926001600160a01b0391821692911690611460565b60008083556003840154610e02916a0c097ce7bc90715b34b9f160241b916108e9919061139e565b6001830155604051849033907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490600090a350505050565b60025481565b6201518081565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6003546001600160a01b03163314610ea35760405162461bcd60e51b81526004016103a690611d68565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ed4903090600401611878565b60206040518083038186803b158015610eec57600080fd5b505afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f24919061176a565b600054909150610c1b906001600160a01b03163283611460565b6003546001600160a01b03163314610f685760405162461bcd60e51b81526004016103a690611b99565b8015610f7657610f76610c24565b60006007544311610f8957600754610f8b565b435b600654909150610f9b90866113e1565b60069081556040805160c0810182526001600160a01b039687168152602081019788529081019283526000606082018181526080830182815296151560a0840190815260048054600181018255935292517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9290940291820180546001600160a01b031916949098169390931790965595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c86015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d850155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e84015550517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f82015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a0909101805460ff1916911515919091179055565b6003546001600160a01b031633146111235760405162461bcd60e51b81526004016103a690611b99565b6008544311156111455760405162461bcd60e51b81526004016103a690611c11565b60005461115d906001600160a01b031632308461154c565b60025461116b908290611406565b60088054909101905550565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c557600080fd5b505afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd9190611736565b1561121a5760405162461bcd60e51b81526004016103a690611cb9565b6003546000906001600160a01b031633146112355733611237565b325b905060006004848154811061124857fe5b600091825260208083208784526005825260408085206001600160a01b038816865290925292206003810154600690920290920192501561129b5760405162461bcd60e51b81526004016103a690611d31565b6112a485610b33565b8054156112f05760006112e282600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b90506112ee84826114bb565b505b8154611307906001600160a01b031633308761154c565b600482015461131690856113e1565b6004830155805461132790856113e1565b808255600383015461134d916a0c097ce7bc90715b34b9f160241b916108e9919061139e565b816001018190555084836001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161138f9190611e25565b60405180910390a35050505050565b6000826113ad575060006113db565b828202828482816113ba57fe5b04146113d85760405162461bcd60e51b81526004016103a690611bd0565b90505b92915050565b6000828201838110156113d85760405162461bcd60e51b81526004016103a6906119af565b60008082116114275760405162461bcd60e51b81526004016103a690611ad1565b81838161143057fe5b049392505050565b60008282111561145a5760405162461bcd60e51b81526004016103a690611a1d565b50900390565b6114b68363a9059cbb60e01b848460405160240161147f9291906118b0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611573565b505050565b60005460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906114ed90859085906004016118b0565b602060405180830381600087803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153f9190611736565b5060018054909101905550565b61156d846323b872dd60e01b85858560405160240161147f9392919061188c565b50505050565b60006115c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116029092919063ffffffff16565b8051909150156114b657808060200190518101906115e69190611736565b6114b65760405162461bcd60e51b81526004016103a690611ce7565b6060611611848460008561161b565b90505b9392505050565b60608247101561163d5760405162461bcd60e51b81526004016103a690611a8b565b611646856116db565b6116625760405162461bcd60e51b81526004016103a690611c82565b600080866001600160a01b0316858760405161167e919061185c565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b50915091506116d08282866116e1565b979650505050505050565b3b151590565b606083156116f0575081611614565b8251156117005782518084602001fd5b8160405162461bcd60e51b81526004016103a691906118fe565b60006020828403121561172b578081fd5b81516113d881611e75565b600060208284031215611747578081fd5b81516113d881611e8a565b600060208284031215611763578081fd5b5035919050565b60006020828403121561177b578081fd5b5051919050565b60008060408385031215611794578081fd5b8235915060208301356117a681611e75565b809150509250929050565b600080600080608085870312156117c6578182fd5b8435935060208501356117d881611e75565b925060408501356117e881611e8a565b915060608501356117f881611e8a565b939692955090935050565b60008060408385031215611815578182fd5b50508035926020909101359150565b600080600060608486031215611838578283fd5b8335925060208401359150604084013561185181611e8a565b809150509250925092565b6000825161186e818460208701611e49565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039690961686526020860194909452604085019290925260608401526080830152151560a082015260c00190565b600060208252825180602084015261191d816040850160208701611e49565b601f01601f19169190910160400192915050565b60208082526027908201527f77697468647261773a20616d6f756e74206d75737420626520677265617465726040820152660207468616e20360cc1b606082015260800190565b6020808252601b908201527f77697468647261773a207573657220697320756e7374616b696e670000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f756e7374616b653a2075736572206973206e6f7420756e7374616b696e670000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526018908201527f636c61696d3a207573657220697320756e7374616b696e670000000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526012908201527118db185a5b4e8819985c9b481c185d5cd95960721b604082015260600190565b6020808252601490820152731d5b9cdd185ad94e8819985c9b481c185d5cd95960621b604082015260600190565b6020808252601b908201527f636c61696d3a20616d6f756e7420697320657175616c20746f20300000000000604082015260600190565b6020808252601b908201527f66756e643a2073656e646572206973206e6f74206d616e616765720000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f66756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73604082015261195960f21b606082015260800190565b6020808252601590820152741dda5d1a191c985dce8819985c9b481c185d5cd959605a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526014908201527319195c1bdcda5d0e8819985c9b481c185d5cd95960621b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601a908201527f6465706f7369743a207573657220697320756e7374616b696e67000000000000604082015260600190565b6020808252602f908201527f656d657267656e63795769746864726177526577617264733a2073656e64657260408201526e1034b9903737ba1036b0b730b3b2b960891b606082015260800190565b6020808252601b908201527f6d6f76653a2073656e646572206973206e6f74206d616e616765720000000000604082015260600190565b6020808252601a908201527f7365743a2073656e646572206973206e6f74206d616e61676572000000000000604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b60005b83811015611e64578181015183820152602001611e4c565b8381111561156d5750506000910152565b6001600160a01b0381168114610c1b57600080fd5b8015158114610c1b57600080fdfea2646970667358221220aad24aa5602cf8e9c8ee4fc520ba1eaf5e4511881a405e171eeed518c218fdb064736f6c63430007060033000000000000000000000000a8b61cff52564758a204f841e636265bebc8db9b00000000000000000000000000000000000000000000000016aea32d742c88000000000000000000000000000000000000000000000000000000000000b7409f0000000000000000000000009f48313c86249a8a369c830ce0379cb634b94935
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101375760003560e01c8063630b5ba1116100b85780638b01295d1161007c5780638b01295d1461023857806393f1a40b14610240578063b2e1630614610263578063c507aeaa1461026b578063ca1d209d1461027e578063e2bbb1581461029157610137565b8063630b5ba1146101fa57806364482f7914610202578063785e9e861461021557806387cb15f71461021d5780638ae39cac1461023057610137565b8063379607f5116100ff578063379607f5146101af578063481c6a75146101c257806348cd4cb1146101d757806351eb05a6146101df5780635c76ca2d146101f257610137565b8063083c63231461013c5780631526fe271461015a57806317caf6f11461017f5780632e17de78146101875780632e1a7d4d1461019c575b600080fd5b6101446102a4565b6040516101519190611e25565b60405180910390f35b61016d610168366004611752565b6102aa565b604051610151969594939291906118c9565b6101446102fd565b61019a610195366004611752565b610303565b005b61019a6101aa366004611752565b61078f565b61019a6101bd366004611752565b610956565b6101ca610b1e565b6040516101519190611878565b610144610b2d565b61019a6101ed366004611752565b610b33565b610144610c1e565b61019a610c24565b61019a610210366004611824565b610c47565b6101ca610cea565b61019a61022b366004611752565b610cf9565b610144610e3a565b610144610e40565b61025361024e366004611782565b610e47565b6040516101519493929190611e2e565b61019a610e79565b61019a6102793660046117b1565b610f3e565b61019a61028c366004611752565b6110f9565b61019a61029f366004611803565b611177565b60085481565b600481815481106102ba57600080fd5b60009182526020909120600690910201805460018201546002830154600384015460048501546005909501546001600160a01b0390941695509193909260ff1686565b60065481565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561035157600080fd5b505afa158015610365573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103899190611736565b156103af5760405162461bcd60e51b81526004016103a690611b34565b60405180910390fd5b6000600482815481106103be57fe5b6000918252602080832085845260058252604080852033865290925292206003810154600690920290920192506104075760405162461bcd60e51b81526004016103a6906119e6565b61041083610b33565b600354604080516352dc6bf960e11b815290516000926001600160a01b03169163a5b8d7f2916004808301926020929190829003018186803b15801561045557600080fd5b505afa158015610469573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061048d919061176a565b90506000600360009054906101000a90046001600160a01b03166001600160a01b031663482cd6c56040518163ffffffff1660e01b815260040160206040518083038186803b1580156104df57600080fd5b505afa1580156104f3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610517919061176a565b90506000600360009054906101000a90046001600160a01b03166001600160a01b0316630ee09a106040518163ffffffff1660e01b815260040160206040518083038186803b15801561056957600080fd5b505afa15801561057d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105a1919061171a565b9050426105bf6105b4620151808661139e565b6003870154906113e1565b1180156105cc5750600082115b156107365783546000906105ee9084906105e8906103e8611406565b9061139e565b85549091506105fd9082611438565b8555600586015460ff16156106bb5761062d8261061b836002611406565b88546001600160a01b03169190611460565b6003546040805163b495373560e01b815290516106b6926001600160a01b03169163b4953735916004808301926020929190829003018186803b15801561067357600080fd5b505afa158015610687573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ab919061171a565b61061b836002611406565b610734565b6106ca8261061b836002611406565b85546001600160a01b03166342966c686106e5836002611406565b6040518263ffffffff1660e01b81526004016107019190611e25565b600060405180830381600087803b15801561071b57600080fd5b505af115801561072f573d6000803e3d6000fd5b505050505b505b835460006003860181905585558554610759906001600160a01b03163383611460565b604051879033907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd90600090a350505050505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156107dd57600080fd5b505afa1580156107f1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108159190611736565b156108325760405162461bcd60e51b81526004016103a690611c53565b60006004828154811061084157fe5b6000918252602080832085845260058252604080852033865290925292208054600690920290920192506108875760405162461bcd60e51b81526004016103a690611931565b6003810154156108a95760405162461bcd60e51b81526004016103a690611978565b6108b283610b33565b60006108f582600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b90611406565b90611438565b905061090133826114bb565b8154600484015461091191611438565b6004840155600060018301819055426003840155604051859133917f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649190a350505050565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156109a457600080fd5b505afa1580156109b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109dc9190611736565b156109f95760405162461bcd60e51b81526004016103a690611b08565b600060048281548110610a0857fe5b600091825260208083208584526005825260408085203386529092529220805460069092029092019250610a4e5760405162461bcd60e51b81526004016103a690611b62565b600381015415610a705760405162461bcd60e51b81526004016103a690611a54565b610a7983610b33565b6000610ab082600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b9050610abc33826114bb565b60038301548254610ae0916a0c097ce7bc90715b34b9f160241b916108e99161139e565b6001830155426002830155604051849033907f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d490600090a350505050565b6003546001600160a01b031681565b60075481565b600060048281548110610b4257fe5b9060005260206000209060060201905060006008544310610b6557600854610b67565b435b905081600201548111610b7b575050610c1b565b6004820154610b8f57600290910155610c1b565b6000610ba883600201548361143890919063ffffffff16565b90506000610bcf6006546108e986600101546105e86002548761139e90919063ffffffff16565b9050610c08610bfd85600401546108e96a0c097ce7bc90715b34b9f160241b8561139e90919063ffffffff16565b6003860154906113e1565b6003850155505043600290920191909155505b50565b60015481565b60045460005b81811015610c4357610c3b81610b33565b600101610c2a565b5050565b6003546001600160a01b03163314610c715760405162461bcd60e51b81526004016103a690611dee565b8015610c7f57610c7f610c24565b610cbc82610cb660048681548110610c9357fe5b90600052602060002090600602016001015460065461143890919063ffffffff16565b906113e1565b6006819055508160048481548110610cd057fe5b906000526020600020906006020160010181905550505050565b6000546001600160a01b031681565b6003546001600160a01b03163314610d235760405162461bcd60e51b81526004016103a690611db7565b600060048281548110610d3257fe5b60009182526020808320858452600582526040808520328652909252922060069091029091019150610d6383610b33565b6000610d9a82600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b9050610da632826114bb565b81546004840154610db691611438565b600484015560035482548454610dda926001600160a01b0391821692911690611460565b60008083556003840154610e02916a0c097ce7bc90715b34b9f160241b916108e9919061139e565b6001830155604051849033907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436490600090a350505050565b60025481565b6201518081565b600560209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b6003546001600160a01b03163314610ea35760405162461bcd60e51b81526004016103a690611d68565b600080546040516370a0823160e01b81526001600160a01b03909116906370a0823190610ed4903090600401611878565b60206040518083038186803b158015610eec57600080fd5b505afa158015610f00573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f24919061176a565b600054909150610c1b906001600160a01b03163283611460565b6003546001600160a01b03163314610f685760405162461bcd60e51b81526004016103a690611b99565b8015610f7657610f76610c24565b60006007544311610f8957600754610f8b565b435b600654909150610f9b90866113e1565b60069081556040805160c0810182526001600160a01b039687168152602081019788529081019283526000606082018181526080830182815296151560a0840190815260048054600181018255935292517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b9290940291820180546001600160a01b031916949098169390931790965595517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19c86015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19d850155517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e84015550517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19f82015590517f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd1a0909101805460ff1916911515919091179055565b6003546001600160a01b031633146111235760405162461bcd60e51b81526004016103a690611b99565b6008544311156111455760405162461bcd60e51b81526004016103a690611c11565b60005461115d906001600160a01b031632308461154c565b60025461116b908290611406565b60088054909101905550565b600360009054906101000a90046001600160a01b03166001600160a01b0316636805b84b6040518163ffffffff1660e01b815260040160206040518083038186803b1580156111c557600080fd5b505afa1580156111d9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111fd9190611736565b1561121a5760405162461bcd60e51b81526004016103a690611cb9565b6003546000906001600160a01b031633146112355733611237565b325b905060006004848154811061124857fe5b600091825260208083208784526005825260408085206001600160a01b038816865290925292206003810154600690920290920192501561129b5760405162461bcd60e51b81526004016103a690611d31565b6112a485610b33565b8054156112f05760006112e282600101546108ef6a0c097ce7bc90715b34b9f160241b6108e98760030154876000015461139e90919063ffffffff16565b90506112ee84826114bb565b505b8154611307906001600160a01b031633308761154c565b600482015461131690856113e1565b6004830155805461132790856113e1565b808255600383015461134d916a0c097ce7bc90715b34b9f160241b916108e9919061139e565b816001018190555084836001600160a01b03167f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a158660405161138f9190611e25565b60405180910390a35050505050565b6000826113ad575060006113db565b828202828482816113ba57fe5b04146113d85760405162461bcd60e51b81526004016103a690611bd0565b90505b92915050565b6000828201838110156113d85760405162461bcd60e51b81526004016103a6906119af565b60008082116114275760405162461bcd60e51b81526004016103a690611ad1565b81838161143057fe5b049392505050565b60008282111561145a5760405162461bcd60e51b81526004016103a690611a1d565b50900390565b6114b68363a9059cbb60e01b848460405160240161147f9291906118b0565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611573565b505050565b60005460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb906114ed90859085906004016118b0565b602060405180830381600087803b15801561150757600080fd5b505af115801561151b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061153f9190611736565b5060018054909101905550565b61156d846323b872dd60e01b85858560405160240161147f9392919061188c565b50505050565b60006115c8826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166116029092919063ffffffff16565b8051909150156114b657808060200190518101906115e69190611736565b6114b65760405162461bcd60e51b81526004016103a690611ce7565b6060611611848460008561161b565b90505b9392505050565b60608247101561163d5760405162461bcd60e51b81526004016103a690611a8b565b611646856116db565b6116625760405162461bcd60e51b81526004016103a690611c82565b600080866001600160a01b0316858760405161167e919061185c565b60006040518083038185875af1925050503d80600081146116bb576040519150601f19603f3d011682016040523d82523d6000602084013e6116c0565b606091505b50915091506116d08282866116e1565b979650505050505050565b3b151590565b606083156116f0575081611614565b8251156117005782518084602001fd5b8160405162461bcd60e51b81526004016103a691906118fe565b60006020828403121561172b578081fd5b81516113d881611e75565b600060208284031215611747578081fd5b81516113d881611e8a565b600060208284031215611763578081fd5b5035919050565b60006020828403121561177b578081fd5b5051919050565b60008060408385031215611794578081fd5b8235915060208301356117a681611e75565b809150509250929050565b600080600080608085870312156117c6578182fd5b8435935060208501356117d881611e75565b925060408501356117e881611e8a565b915060608501356117f881611e8a565b939692955090935050565b60008060408385031215611815578182fd5b50508035926020909101359150565b600080600060608486031215611838578283fd5b8335925060208401359150604084013561185181611e8a565b809150509250925092565b6000825161186e818460208701611e49565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6001600160a01b039690961686526020860194909452604085019290925260608401526080830152151560a082015260c00190565b600060208252825180602084015261191d816040850160208701611e49565b601f01601f19169190910160400192915050565b60208082526027908201527f77697468647261773a20616d6f756e74206d75737420626520677265617465726040820152660207468616e20360cc1b606082015260800190565b6020808252601b908201527f77697468647261773a207573657220697320756e7374616b696e670000000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252601e908201527f756e7374616b653a2075736572206973206e6f7420756e7374616b696e670000604082015260600190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526018908201527f636c61696d3a207573657220697320756e7374616b696e670000000000000000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526012908201527118db185a5b4e8819985c9b481c185d5cd95960721b604082015260600190565b6020808252601490820152731d5b9cdd185ad94e8819985c9b481c185d5cd95960621b604082015260600190565b6020808252601b908201527f636c61696d3a20616d6f756e7420697320657175616c20746f20300000000000604082015260600190565b6020808252601b908201527f66756e643a2073656e646572206973206e6f74206d616e616765720000000000604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b60208082526022908201527f66756e643a20746f6f206c6174652c20746865206661726d20697320636c6f73604082015261195960f21b606082015260800190565b6020808252601590820152741dda5d1a191c985dce8819985c9b481c185d5cd959605a1b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526014908201527319195c1bdcda5d0e8819985c9b481c185d5cd95960621b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601a908201527f6465706f7369743a207573657220697320756e7374616b696e67000000000000604082015260600190565b6020808252602f908201527f656d657267656e63795769746864726177526577617264733a2073656e64657260408201526e1034b9903737ba1036b0b730b3b2b960891b606082015260800190565b6020808252601b908201527f6d6f76653a2073656e646572206973206e6f74206d616e616765720000000000604082015260600190565b6020808252601a908201527f7365743a2073656e646572206973206e6f74206d616e61676572000000000000604082015260600190565b90815260200190565b93845260208401929092526040830152606082015260800190565b60005b83811015611e64578181015183820152602001611e4c565b8381111561156d5750506000910152565b6001600160a01b0381168114610c1b57600080fd5b8015158114610c1b57600080fdfea2646970667358221220aad24aa5602cf8e9c8ee4fc520ba1eaf5e4511881a405e171eeed518c218fdb064736f6c63430007060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a8b61cff52564758a204f841e636265bebc8db9b00000000000000000000000000000000000000000000000016aea32d742c88000000000000000000000000000000000000000000000000000000000000b7409f0000000000000000000000009f48313c86249a8a369c830ce0379cb634b94935
-----Decoded View---------------
Arg [0] : _erc20 (address): 0xa8B61CfF52564758A204F841E636265bEBC8db9B
Arg [1] : _rewardPerBlock (uint256): 1634423130400000000
Arg [2] : _startBlock (uint256): 12009631
Arg [3] : _manager (address): 0x9f48313C86249A8A369c830cE0379cb634B94935
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000a8b61cff52564758a204f841e636265bebc8db9b
Arg [1] : 00000000000000000000000000000000000000000000000016aea32d742c8800
Arg [2] : 0000000000000000000000000000000000000000000000000000000000b7409f
Arg [3] : 0000000000000000000000009f48313c86249a8a369c830ce0379cb634b94935
Deployed Bytecode Sourcemap
22875:11795:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25197:23;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24791:26;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;;:::i;25034:34::-;;;:::i;31671:1685::-;;;;;;:::i;:::-;;:::i;:::-;;30804:773;;;;;;:::i;:::-;;:::i;33399:707::-;;;;;;:::i;:::-;;:::i;24730:27::-;;;:::i;:::-;;;;;;;:::i;25121:25::-;;;:::i;28014:696::-;;;;;;:::i;:::-;;:::i;24564:26::-;;;:::i;27758:180::-;;;:::i;26547:376::-;;;;;;:::i;:::-;;:::i;24477:19::-;;;:::i;28852:686::-;;;;;;:::i;:::-;;:::i;24638:29::-;;;:::i;25261:42::-;;;:::i;24873:66::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;:::i;34399:268::-;;;:::i;27011:664::-;;;;;;:::i;:::-;;:::i;26108:340::-;;;;;;:::i;:::-;;:::i;29783:960::-;;;;;;:::i;:::-;;:::i;25197:23::-;;;;:::o;24791:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24791:26:0;;;;-1:-1:-1;24791:26:0;;;;;;;:::o;25034:34::-;;;;:::o;31671:1685::-;31730:7;;;;;;;;;-1:-1:-1;;;;;31730:7:0;-1:-1:-1;;;;;31730:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;31722:59;;;;-1:-1:-1;;;31722:59:0;;;;;;;:::i;:::-;;;;;;;;;31792:21;31816:8;31825:4;31816:14;;;;;;;;;;;;;;;;31865;;;:8;:14;;;;;;31880:10;31865:26;;;;;;;31910:17;;;;31816:14;;;;;;;;-1:-1:-1;31902:64:0;;;;-1:-1:-1;;;31902:64:0;;;;;;;:::i;:::-;31977:16;31988:4;31977:10;:16::i;:::-;32090:7;;:26;;;-1:-1:-1;;;32090:26:0;;;;32066:21;;-1:-1:-1;;;;;32090:7:0;;:24;;:26;;;;;;;;;;;;;;:7;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32066:50;;32127:16;32146:7;;;;;;;;;-1:-1:-1;;;;;32146:7:0;-1:-1:-1;;;;;32146:19:0;;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32127:40;;32178:21;32202:7;;;;;;;;;-1:-1:-1;;;;;32202:7:0;-1:-1:-1;;;;;32202:24:0;;:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32178:50;-1:-1:-1;32298:15:0;32243:52;32265:29;25298:5;32280:13;32265:14;:29::i;:::-;32243:17;;;;;:21;:52::i;:::-;:70;32242:88;;;;;32329:1;32318:8;:12;32242:88;32239:857;;;32361:11;;32346:12;;32361:35;;32387:8;;32361:21;;32377:4;32361:15;:21::i;:::-;:25;;:35::i;:::-;32425:11;;32346:50;;-1:-1:-1;32425:24:0;;32346:50;32425:15;:24::i;:::-;32411:38;;32582:9;;;;;;32579:506;;;32611:61;32642:13;32657:14;:7;32669:1;32657:11;:14::i;:::-;32611:17;;-1:-1:-1;;;;;32611:17:0;;:61;:30;:61::i;:::-;32722:7;;:19;;;-1:-1:-1;;;32722:19:0;;;;32691:67;;-1:-1:-1;;;;;32722:7:0;;:17;;:19;;;;;;;;;;;;;;:7;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32743:14;:7;32755:1;32743:11;:14::i;32691:67::-;32579:506;;;32931:61;32962:13;32977:14;:7;32989:1;32977:11;:14::i;32931:61::-;33029:17;;-1:-1:-1;;;;;33029:17:0;33011:42;33054:14;:7;33066:1;33054:11;:14::i;:::-;33011:58;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32579:506;32239:857;;33124:11;;33106:15;33186:17;;;:21;;;33218:15;;33244:17;;:63;;-1:-1:-1;;;;;33244:17:0;33283:10;33124:11;33244:30;:63::i;:::-;33323:25;;33343:4;;33331:10;;33323:25;;;;;31671:1685;;;;;;;:::o;30804:773::-;30864:7;;;;;;;;;-1:-1:-1;;;;;30864:7:0;-1:-1:-1;;;;;30864:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;30856:60;;;;-1:-1:-1;;;30856:60:0;;;;;;;:::i;:::-;30927:21;30951:8;30960:4;30951:14;;;;;;;;;;;;;;;;31000;;;:8;:14;;;;;;31015:10;31000:26;;;;;;;31045:11;;30951:14;;;;;;;;-1:-1:-1;31037:67:0;;;;-1:-1:-1;;;31037:67:0;;;;;;;:::i;:::-;31123:17;;;;:22;31115:62;;;;-1:-1:-1;;;31115:62:0;;;;;;;:::i;:::-;31188:16;31199:4;31188:10;:16::i;:::-;31254:21;31278:69;31331:4;:15;;;31278:48;-1:-1:-1;;;31278:38:0;31294:4;:21;;;31278:4;:11;;;:15;;:38;;;;:::i;:::-;:42;;:48::i;:::-;:52;;:69::i;:::-;31254:93;;31358:40;31372:10;31384:13;31358;:40::i;:::-;31439:11;;31423;;;;:28;;:15;:28::i;:::-;31409:11;;;:42;31480:1;31462:15;;;:19;;;31512:15;-1:-1:-1;31492:17:0;;:35;31543:26;;31564:4;;31552:10;;31543:26;;31480:1;31543:26;30804:773;;;;:::o;33399:707::-;33456:7;;;;;;;;;-1:-1:-1;;;;;33456:7:0;-1:-1:-1;;;;;33456:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:28;33448:59;;;;-1:-1:-1;;;33448:59:0;;;;;;;:::i;:::-;33518:21;33542:8;33551:4;33542:14;;;;;;;;;;;;;;;;33591;;;:8;:14;;;;;;33606:10;33591:26;;;;;;;33636:11;;33542:14;;;;;;;;-1:-1:-1;33628:55:0;;;;-1:-1:-1;;;33628:55:0;;;;;;;:::i;:::-;33702:17;;;;:22;33694:59;;;;-1:-1:-1;;;33694:59:0;;;;;;;:::i;:::-;33764:16;33775:4;33764:10;:16::i;:::-;33791:21;33815:69;33868:4;:15;;;33815:48;-1:-1:-1;;;33815:38:0;33831:4;:21;;;33815:4;:11;;;:15;;:38;;;;:::i;:69::-;33791:93;;33895:40;33909:10;33921:13;33895;:40::i;:::-;33980:21;;;;33964:11;;:48;;-1:-1:-1;;;34007:4:0;33964:38;;:15;:38::i;:48::-;33946:15;;;:66;34044:15;34023:18;;;:36;34075:23;;34093:4;;34081:10;;34075:23;;-1:-1:-1;;34075:23:0;33399:707;;;;:::o;24730:27::-;;;-1:-1:-1;;;;;24730:27:0;;:::o;25121:25::-;;;;:::o;28014:696::-;28066:21;28090:8;28099:4;28090:14;;;;;;;;;;;;;;;;;;28066:38;;28115:17;28150:8;;28135:12;:23;:49;;28176:8;;28135:49;;;28161:12;28135:49;28115:69;;28214:4;:20;;;28201:9;:33;28197:72;;28251:7;;;;28197:72;28283:11;;;;28279:102;;28316:20;;;;:32;28363:7;;28279:102;28393:18;28414:35;28428:4;:20;;;28414:9;:13;;:35;;;;:::i;:::-;28393:56;;28460:19;28482:72;28538:15;;28482:51;28517:4;:15;;;28482:30;28497:14;;28482:10;:14;;:30;;;;:::i;:72::-;28460:94;;28591:65;28617:38;28643:4;:11;;;28617:21;-1:-1:-1;;;28617:11:0;:15;;:21;;;;:::i;:38::-;28591:21;;;;;:25;:65::i;:::-;28567:21;;;:89;-1:-1:-1;;28690:12:0;28667:20;;;;:35;;;;-1:-1:-1;28014:696:0;;:::o;24564:26::-;;;;:::o;27758:180::-;27820:8;:15;27803:14;27846:85;27874:6;27868:3;:12;27846:85;;;27904:15;27915:3;27904:10;:15::i;:::-;27882:5;;27846:85;;;;27758:180;:::o;26547:376::-;26663:7;;-1:-1:-1;;;;;26663:7:0;26641:10;:30;26633:69;;;;-1:-1:-1;;;26633:69:0;;;;;;;:::i;:::-;26717:11;26713:61;;;26745:17;:15;:17::i;:::-;26802:63;26853:11;26802:46;26822:8;26831:4;26822:14;;;;;;;;;;;;;;;;;;:25;;;26802:15;;:19;;:46;;;;:::i;:::-;:50;;:63::i;:::-;26784:15;:81;;;;26904:11;26876:8;26885:4;26876:14;;;;;;;;;;;;;;;;;;:25;;:39;;;;26547:376;;;:::o;24477:19::-;;;-1:-1:-1;;;;;24477:19:0;;:::o;28852:686::-;28930:7;;-1:-1:-1;;;;;28930:7:0;28908:10;:30;28900:70;;;;-1:-1:-1;;;28900:70:0;;;;;;;:::i;:::-;28981:21;29005:8;29014:4;29005:14;;;;;;;;;;;;;;;;29054;;;:8;:14;;;;;;29069:9;29054:25;;;;;;;29005:14;;;;;;;;-1:-1:-1;29090:16:0;29063:4;29090:10;:16::i;:::-;29117:21;29141:69;29194:4;:15;;;29141:48;-1:-1:-1;;;29141:38:0;29157:4;:21;;;29141:4;:11;;;:15;;:38;;;;:::i;:69::-;29117:93;;29221:39;29235:9;29246:13;29221;:39::i;:::-;29301:11;;29285;;;;:28;;:15;:28::i;:::-;29271:11;;;:42;29363:7;;29373:11;;29324:17;;:61;;-1:-1:-1;;;;;29324:17:0;;;;29363:7;;;29324:30;:61::i;:::-;29410:1;29396:15;;;29456:21;;;;29440:48;;-1:-1:-1;;;29483:4:0;29440:38;;29410:1;29440:15;:38::i;:48::-;29422:15;;;:66;29504:26;;29525:4;;29513:10;;29504:26;;;;;28852:686;;;;:::o;24638:29::-;;;;:::o;25261:42::-;25298:5;25261:42;:::o;24873:66::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;34399:268::-;34485:7;;-1:-1:-1;;;;;34485:7:0;34463:10;:30;34455:90;;;;-1:-1:-1;;;34455:90:0;;;;;;;:::i;:::-;34556:12;34571:5;;:30;;-1:-1:-1;;;34571:30:0;;-1:-1:-1;;;;;34571:5:0;;;;:15;;:30;;34595:4;;34571:30;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34612:5;;34556:45;;-1:-1:-1;34612:47:0;;-1:-1:-1;;;;;34612:5:0;34639:9;34556:45;34612:18;:47::i;27011:664::-;27147:7;;-1:-1:-1;;;;;27147:7:0;27125:10;:30;27117:70;;;;-1:-1:-1;;;27117:70:0;;;;;;;:::i;:::-;27202:11;27198:61;;;27230:17;:15;:17::i;:::-;27269:23;27310:10;;27295:12;:25;:53;;27338:10;;27295:53;;;27323:12;27295:53;27377:15;;27269:79;;-1:-1:-1;27377:32:0;;27397:11;27377:19;:32::i;:::-;27359:15;:50;;;27434:232;;;;;;;;-1:-1:-1;;;;;27434:232:0;;;;;;;;;;;;;;;;;-1:-1:-1;27434:232:0;;;;;;;;;;;;;;;;;;;;;27420:8;:247;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;27420:247:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;27420:247:0;;;;;;;;;;;;;-1:-1:-1;;27420:247:0;;;;;;;;;;27011:664::o;26108:340::-;26189:7;;-1:-1:-1;;;;;26189:7:0;26167:10;:30;26159:70;;;;-1:-1:-1;;;26159:70:0;;;;;;;:::i;:::-;26264:8;;26248:12;:24;;26240:71;;;;-1:-1:-1;;;26240:71:0;;;;;;;:::i;:::-;26324:5;;:66;;-1:-1:-1;;;;;26324:5:0;26355:9;26375:4;26382:7;26324:22;:66::i;:::-;26425:14;;26413:27;;:7;;:11;:27::i;:::-;26401:8;:39;;;;;;;-1:-1:-1;26108:340:0:o;29783:960::-;29859:7;;;;;;;;;-1:-1:-1;;;;;29859:7:0;-1:-1:-1;;;;;29859:17:0;;:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:26;29851:59;;;;-1:-1:-1;;;29851:59:0;;;;;;;:::i;:::-;29967:7;;29921:19;;-1:-1:-1;;;;;29967:7:0;29945:10;:30;29944:57;;29991:10;29944:57;;;29979:9;29944:57;29921:81;;30013:21;30037:8;30046:4;30037:14;;;;;;;;;;;;;;;;30086;;;:8;:14;;;;;;-1:-1:-1;;;;;30086:27:0;;;;;;;;;30132:17;;;;30037:14;;;;;;;;-1:-1:-1;30132:22:0;30124:61;;;;-1:-1:-1;;;30124:61:0;;;;;;;:::i;:::-;30196:16;30207:4;30196:10;:16::i;:::-;30227:11;;:15;30223:197;;30259:21;30283:69;30336:4;:15;;;30283:48;-1:-1:-1;;;30283:38:0;30299:4;:21;;;30283:4;:11;;;:15;;:38;;;;:::i;:69::-;30259:93;;30367:41;30381:11;30394:13;30367;:41::i;:::-;30223:197;;30430:17;;:79;;-1:-1:-1;;;;;30430:17:0;30473:10;30494:4;30501:7;30430:34;:79::i;:::-;30534:11;;;;:24;;30550:7;30534:15;:24::i;:::-;30520:11;;;:38;30583:11;;:24;;30599:7;30583:15;:24::i;:::-;30569:38;;;30652:21;;;;30636:48;;-1:-1:-1;;;30679:4:0;30636:38;;30569;30636:15;:38::i;:48::-;30618:4;:15;;:66;;;;30721:4;30708:11;-1:-1:-1;;;;;30700:35:0;;30727:7;30700:35;;;;;;:::i;:::-;;;;;;;;29783:960;;;;;:::o;6487:220::-;6545:7;6569:6;6565:20;;-1:-1:-1;6584:1:0;6577:8;;6565:20;6608:5;;;6612:1;6608;:5;:1;6632:5;;;;;:10;6624:56;;;;-1:-1:-1;;;6624:56:0;;;;;;;:::i;:::-;6698:1;-1:-1:-1;6487:220:0;;;;;:::o;5608:179::-;5666:7;5698:5;;;5722:6;;;;5714:46;;;;-1:-1:-1;;;5714:46:0;;;;;;;:::i;7185:153::-;7243:7;7275:1;7271;:5;7263:44;;;;-1:-1:-1;;;7263:44:0;;;;;;;:::i;:::-;7329:1;7325;:5;;;;;;;7185:153;-1:-1:-1;;;7185:153:0:o;6070:158::-;6128:7;6161:1;6156;:6;;6148:49;;;;-1:-1:-1;;;6148:49:0;;;;;;;:::i;:::-;-1:-1:-1;6215:5:0;;;6070:158::o;18974:177::-;19057:86;19077:5;19107:23;;;19132:2;19136:5;19084:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19084:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;19084:58:0;-1:-1:-1;;;;;;19084:58:0;;;;;;;;;;19057:19;:86::i;:::-;18974:177;;;:::o;34189:138::-;34262:5;;:28;;-1:-1:-1;;;34262:28:0;;-1:-1:-1;;;;;34262:5:0;;;;:14;;:28;;34277:3;;34282:7;;34262:28;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;34301:7:0;:18;;;;;;;-1:-1:-1;34189:138:0:o;19159:205::-;19260:96;19280:5;19310:27;;;19339:4;19345:2;19349:5;19287:68;;;;;;;;;;:::i;19260:96::-;19159:205;;;;:::o;21279:761::-;21703:23;21729:69;21757:4;21729:69;;;;;;;;;;;;;;;;;21737:5;-1:-1:-1;;;;;21729:27:0;;;:69;;;;;:::i;:::-;21813:17;;21703:95;;-1:-1:-1;21813:21:0;21809:224;;21955:10;21944:30;;;;;;;;;;;;:::i;:::-;21936:85;;;;-1:-1:-1;;;21936:85:0;;;;;;;:::i;13967:195::-;14070:12;14102:52;14124:6;14132:4;14138:1;14141:12;14102:21;:52::i;:::-;14095:59;;13967:195;;;;;;:::o;15019:530::-;15146:12;15204:5;15179:21;:30;;15171:81;;;;-1:-1:-1;;;15171:81:0;;;;;;;:::i;:::-;15271:18;15282:6;15271:10;:18::i;:::-;15263:60;;;;-1:-1:-1;;;15263:60:0;;;;;;;:::i;:::-;15397:12;15411:23;15438:6;-1:-1:-1;;;;;15438:11:0;15458:5;15466:4;15438:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15396:75;;;;15489:52;15507:7;15516:10;15528:12;15489:17;:52::i;:::-;15482:59;15019:530;-1:-1:-1;;;;;;;15019:530:0:o;11049:422::-;11416:20;11455:8;;;11049:422::o;17559:742::-;17674:12;17703:7;17699:595;;;-1:-1:-1;17734:10:0;17727:17;;17699:595;17848:17;;:21;17844:439;;18111:10;18105:17;18172:15;18159:10;18155:2;18151:19;18144:44;18059:148;18254:12;18247:20;;-1:-1:-1;;;18247:20:0;;;;;;;;:::i;14:263:1:-;;137:2;125:9;116:7;112:23;108:32;105:2;;;158:6;150;143:22;105:2;195:9;189:16;214:33;241:5;214:33;:::i;282:257::-;;402:2;390:9;381:7;377:23;373:32;370:2;;;423:6;415;408:22;370:2;460:9;454:16;479:30;503:5;479:30;:::i;544:190::-;;656:2;644:9;635:7;631:23;627:32;624:2;;;677:6;669;662:22;624:2;-1:-1:-1;705:23:1;;614:120;-1:-1:-1;614:120:1:o;739:194::-;;862:2;850:9;841:7;837:23;833:32;830:2;;;883:6;875;868:22;830:2;-1:-1:-1;911:16:1;;820:113;-1:-1:-1;820:113:1:o;938:327::-;;;1067:2;1055:9;1046:7;1042:23;1038:32;1035:2;;;1088:6;1080;1073:22;1035:2;1129:9;1116:23;1106:33;;1189:2;1178:9;1174:18;1161:32;1202:33;1229:5;1202:33;:::i;:::-;1254:5;1244:15;;;1025:240;;;;;:::o;1270:615::-;;;;;1440:3;1428:9;1419:7;1415:23;1411:33;1408:2;;;1462:6;1454;1447:22;1408:2;1503:9;1490:23;1480:33;;1563:2;1552:9;1548:18;1535:32;1576:33;1603:5;1576:33;:::i;:::-;1628:5;-1:-1:-1;1685:2:1;1670:18;;1657:32;1698;1657;1698;:::i;:::-;1749:7;-1:-1:-1;1808:2:1;1793:18;;1780:32;1821;1780;1821;:::i;:::-;1398:487;;;;-1:-1:-1;1398:487:1;;-1:-1:-1;;1398:487:1:o;1890:258::-;;;2019:2;2007:9;1998:7;1994:23;1990:32;1987:2;;;2040:6;2032;2025:22;1987:2;-1:-1:-1;;2068:23:1;;;2138:2;2123:18;;;2110:32;;-1:-1:-1;1977:171:1:o;2153:389::-;;;;2296:2;2284:9;2275:7;2271:23;2267:32;2264:2;;;2317:6;2309;2302:22;2264:2;2358:9;2345:23;2335:33;;2415:2;2404:9;2400:18;2387:32;2377:42;;2469:2;2458:9;2454:18;2441:32;2482:30;2506:5;2482:30;:::i;:::-;2531:5;2521:15;;;2254:288;;;;;:::o;2547:274::-;;2714:6;2708:13;2730:53;2776:6;2771:3;2764:4;2756:6;2752:17;2730:53;:::i;:::-;2799:16;;;;;2684:137;-1:-1:-1;;2684:137:1:o;2826:203::-;-1:-1:-1;;;;;2990:32:1;;;;2972:51;;2960:2;2945:18;;2927:102::o;3034:375::-;-1:-1:-1;;;;;3292:15:1;;;3274:34;;3344:15;;;;3339:2;3324:18;;3317:43;3391:2;3376:18;;3369:34;;;;3224:2;3209:18;;3191:218::o;3414:274::-;-1:-1:-1;;;;;3606:32:1;;;;3588:51;;3670:2;3655:18;;3648:34;3576:2;3561:18;;3543:145::o;3914:584::-;-1:-1:-1;;;;;4226:32:1;;;;4208:51;;4290:2;4275:18;;4268:34;;;;4333:2;4318:18;;4311:34;;;;4376:2;4361:18;;4354:34;4419:3;4404:19;;4397:35;4476:14;4469:22;4246:3;4448:19;;4441:51;4195:3;4180:19;;4162:336::o;4731:383::-;;4880:2;4869:9;4862:21;4912:6;4906:13;4955:6;4950:2;4939:9;4935:18;4928:34;4971:66;5030:6;5025:2;5014:9;5010:18;5005:2;4997:6;4993:15;4971:66;:::i;:::-;5098:2;5077:15;-1:-1:-1;;5073:29:1;5058:45;;;;5105:2;5054:54;;4852:262;-1:-1:-1;;4852:262:1:o;5119:403::-;5321:2;5303:21;;;5360:2;5340:18;;;5333:30;5399:34;5394:2;5379:18;;5372:62;-1:-1:-1;;;5465:2:1;5450:18;;5443:37;5512:3;5497:19;;5293:229::o;5527:351::-;5729:2;5711:21;;;5768:2;5748:18;;;5741:30;5807:29;5802:2;5787:18;;5780:57;5869:2;5854:18;;5701:177::o;5883:351::-;6085:2;6067:21;;;6124:2;6104:18;;;6097:30;6163:29;6158:2;6143:18;;6136:57;6225:2;6210:18;;6057:177::o;6239:354::-;6441:2;6423:21;;;6480:2;6460:18;;;6453:30;6519:32;6514:2;6499:18;;6492:60;6584:2;6569:18;;6413:180::o;6598:354::-;6800:2;6782:21;;;6839:2;6819:18;;;6812:30;6878:32;6873:2;6858:18;;6851:60;6943:2;6928:18;;6772:180::o;6957:348::-;7159:2;7141:21;;;7198:2;7178:18;;;7171:30;7237:26;7232:2;7217:18;;7210:54;7296:2;7281:18;;7131:174::o;7310:402::-;7512:2;7494:21;;;7551:2;7531:18;;;7524:30;7590:34;7585:2;7570:18;;7563:62;-1:-1:-1;;;7656:2:1;7641:18;;7634:36;7702:3;7687:19;;7484:228::o;7717:350::-;7919:2;7901:21;;;7958:2;7938:18;;;7931:30;7997:28;7992:2;7977:18;;7970:56;8058:2;8043:18;;7891:176::o;8072:342::-;8274:2;8256:21;;;8313:2;8293:18;;;8286:30;-1:-1:-1;;;8347:2:1;8332:18;;8325:48;8405:2;8390:18;;8246:168::o;8419:344::-;8621:2;8603:21;;;8660:2;8640:18;;;8633:30;-1:-1:-1;;;8694:2:1;8679:18;;8672:50;8754:2;8739:18;;8593:170::o;8768:351::-;8970:2;8952:21;;;9009:2;8989:18;;;8982:30;9048:29;9043:2;9028:18;;9021:57;9110:2;9095:18;;8942:177::o;9124:351::-;9326:2;9308:21;;;9365:2;9345:18;;;9338:30;9404:29;9399:2;9384:18;;9377:57;9466:2;9451:18;;9298:177::o;9480:397::-;9682:2;9664:21;;;9721:2;9701:18;;;9694:30;9760:34;9755:2;9740:18;;9733:62;-1:-1:-1;;;9826:2:1;9811:18;;9804:31;9867:3;9852:19;;9654:223::o;9882:398::-;10084:2;10066:21;;;10123:2;10103:18;;;10096:30;10162:34;10157:2;10142:18;;10135:62;-1:-1:-1;;;10228:2:1;10213:18;;10206:32;10270:3;10255:19;;10056:224::o;10285:345::-;10487:2;10469:21;;;10526:2;10506:18;;;10499:30;-1:-1:-1;;;10560:2:1;10545:18;;10538:51;10621:2;10606:18;;10459:171::o;10635:353::-;10837:2;10819:21;;;10876:2;10856:18;;;10849:30;10915:31;10910:2;10895:18;;10888:59;10979:2;10964:18;;10809:179::o;10993:344::-;11195:2;11177:21;;;11234:2;11214:18;;;11207:30;-1:-1:-1;;;11268:2:1;11253:18;;11246:50;11328:2;11313:18;;11167:170::o;11342:406::-;11544:2;11526:21;;;11583:2;11563:18;;;11556:30;11622:34;11617:2;11602:18;;11595:62;-1:-1:-1;;;11688:2:1;11673:18;;11666:40;11738:3;11723:19;;11516:232::o;11753:350::-;11955:2;11937:21;;;11994:2;11974:18;;;11967:30;12033:28;12028:2;12013:18;;12006:56;12094:2;12079:18;;11927:176::o;12108:411::-;12310:2;12292:21;;;12349:2;12329:18;;;12322:30;12388:34;12383:2;12368:18;;12361:62;-1:-1:-1;;;12454:2:1;12439:18;;12432:45;12509:3;12494:19;;12282:237::o;12524:351::-;12726:2;12708:21;;;12765:2;12745:18;;;12738:30;12804:29;12799:2;12784:18;;12777:57;12866:2;12851:18;;12698:177::o;12880:350::-;13082:2;13064:21;;;13121:2;13101:18;;;13094:30;13160:28;13155:2;13140:18;;13133:56;13221:2;13206:18;;13054:176::o;13235:177::-;13381:25;;;13369:2;13354:18;;13336:76::o;13417:391::-;13648:25;;;13704:2;13689:18;;13682:34;;;;13747:2;13732:18;;13725:34;13790:2;13775:18;;13768:34;13635:3;13620:19;;13602:206::o;13813:258::-;13885:1;13895:113;13909:6;13906:1;13903:13;13895:113;;;13985:11;;;13979:18;13966:11;;;13959:39;13931:2;13924:10;13895:113;;;14026:6;14023:1;14020:13;14017:2;;;-1:-1:-1;;14061:1:1;14043:16;;14036:27;13866:205::o;14076:133::-;-1:-1:-1;;;;;14153:31:1;;14143:42;;14133:2;;14199:1;14196;14189:12;14214:120;14302:5;14295:13;14288:21;14281:5;14278:32;14268:2;;14324:1;14321;14314:12
Swarm Source
ipfs://aad24aa5602cf8e9c8ee4fc520ba1eaf5e4511881a405e171eeed518c218fdb0
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.