More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 753 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deposit | 19113608 | 173 days ago | IN | 0 ETH | 0.00634568 | ||||
Withdraw | 18865422 | 208 days ago | IN | 0 ETH | 0.00569767 | ||||
Deposit | 18494464 | 260 days ago | IN | 0 ETH | 0.00354499 | ||||
Deposit | 17940897 | 337 days ago | IN | 0 ETH | 0.00494221 | ||||
Deposit | 17618953 | 383 days ago | IN | 0 ETH | 0.00401203 | ||||
Withdraw | 17521050 | 396 days ago | IN | 0 ETH | 0.00432541 | ||||
Deposit | 17521043 | 396 days ago | IN | 0 ETH | 0.00407311 | ||||
Deposit | 17465651 | 404 days ago | IN | 0 ETH | 0.00608681 | ||||
Deposit | 17265191 | 432 days ago | IN | 0 ETH | 0.01317601 | ||||
Withdraw | 16769073 | 502 days ago | IN | 0 ETH | 0.00623465 | ||||
Deposit | 16576527 | 529 days ago | IN | 0 ETH | 0.0074796 | ||||
Withdraw | 16478546 | 543 days ago | IN | 0 ETH | 0.00552639 | ||||
Deposit | 16296284 | 569 days ago | IN | 0 ETH | 0.00414808 | ||||
Withdraw | 16203967 | 581 days ago | IN | 0 ETH | 0.00355459 | ||||
Deposit | 16203961 | 581 days ago | IN | 0 ETH | 0.00370888 | ||||
Withdraw | 15899611 | 624 days ago | IN | 0 ETH | 0.00418699 | ||||
Withdraw | 15751824 | 645 days ago | IN | 0 ETH | 0.00405596 | ||||
Deposit | 15538107 | 674 days ago | IN | 0 ETH | 0.00289869 | ||||
Deposit | 15485291 | 683 days ago | IN | 0 ETH | 0.00472446 | ||||
Deposit | 15466027 | 686 days ago | IN | 0 ETH | 0.00233143 | ||||
Deposit | 15262121 | 718 days ago | IN | 0 ETH | 0.0012595 | ||||
Deposit | 15255739 | 719 days ago | IN | 0 ETH | 0.00376753 | ||||
Deposit | 15136269 | 738 days ago | IN | 0 ETH | 0.00557934 | ||||
Withdraw | 15069144 | 748 days ago | IN | 0 ETH | 0.0018539 | ||||
Deposit | 15063034 | 749 days ago | IN | 0 ETH | 0.00262518 |
Latest 2 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
12334601 | 1178 days ago | Contract Creation | 0 ETH | |||
12334601 | 1178 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Name:
Farm
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-04-30 */ // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^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/utils/Address.sol pragma solidity ^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/utils/SafeERC20.sol pragma solidity ^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 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) + value; _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _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/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with 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) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { 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 pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract 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() { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: contracts/interfaces/IFarmFactory.sol interface IFarmFactory { function userEnteredFarm(address _user) external; function userLeftFarm(address _user) external; function addFarm(address _farmAddress) external; } // File: @openzeppelin/contracts/security/ReentrancyGuard.sol pragma solidity ^0.8.0; /** * @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]. */ abstract 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() { _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/interfaces/IFarm.sol interface IFarm { function owner() external view returns (address); } // File: contracts/Vesting.sol contract Vesting is ReentrancyGuard { using SafeERC20 for IERC20; IERC20 public token; uint256 public vestingDuration; // 1170000 blocks ~ 180 days address public farm; struct VestingInfo { uint256 amount; uint256 startBlock; uint256 claimedAmount; } // user address => vestingInfo[] mapping(address => VestingInfo[]) private _userToVestingList; modifier onlyFarm() { require(msg.sender == farm, "Vesting: FORBIDDEN"); _; } modifier onlyFarmOwner() { require(msg.sender == IFarm(farm).owner(), "Vesting: FORBIDDEN"); _; } constructor(address _token, uint256 _vestingDuration) { token = IERC20(_token); require(_vestingDuration > 0, "Vesting: Invalid duration"); vestingDuration = _vestingDuration; farm = msg.sender; } function addVesting(address _user, uint256 _amount) external onlyFarm { token.safeTransferFrom(msg.sender, address(this), _amount); VestingInfo memory info = VestingInfo(_amount, block.number, 0); _userToVestingList[_user].push(info); } function claimVesting(uint256 _index) external nonReentrant { _claimVestingInternal(_index); } function claimTotalVesting() external nonReentrant { uint256 count = _userToVestingList[msg.sender].length; for (uint256 _index = 0; _index < count; _index++) { if (_getVestingClaimableAmount(msg.sender, _index) > 0) { _claimVestingInternal(_index); } } } function _claimVestingInternal(uint256 _index) internal { require(_index < _userToVestingList[msg.sender].length, "Vesting: Invalid index"); uint256 claimableAmount = _getVestingClaimableAmount(msg.sender, _index); require(claimableAmount > 0, "Vesting: Nothing to claim"); _userToVestingList[msg.sender][_index].claimedAmount = _userToVestingList[msg.sender][_index].claimedAmount + claimableAmount; require(token.transfer(msg.sender, claimableAmount), "Vesting: transfer failed"); } function _getVestingClaimableAmount(address _user, uint256 _index) internal view returns (uint256 claimableAmount) { VestingInfo memory info = _userToVestingList[_user][_index]; if (block.number <= info.startBlock) return 0; uint256 passedBlocks = block.number - info.startBlock; uint256 releasedAmount; if (passedBlocks >= vestingDuration) { releasedAmount = info.amount; } else { releasedAmount = (info.amount * passedBlocks) / vestingDuration; } claimableAmount = 0; if (releasedAmount > info.claimedAmount) { claimableAmount = releasedAmount - info.claimedAmount; } } function getVestingTotalClaimableAmount(address _user) external view returns (uint256 totalClaimableAmount) { uint256 count = _userToVestingList[_user].length; for (uint256 _index = 0; _index < count; _index++) { totalClaimableAmount = totalClaimableAmount + _getVestingClaimableAmount(_user, _index); } } function getVestingClaimableAmount(address _user, uint256 _index) external view returns (uint256) { return _getVestingClaimableAmount(_user, _index); } function getVestingsCountByUser(address _user) external view returns (uint256) { uint256 count = _userToVestingList[_user].length; return count; } function getVestingInfo(address _user, uint256 _index) external view returns (VestingInfo memory) { require(_index < _userToVestingList[_user].length, "Vesting: Invalid index"); VestingInfo memory info = _userToVestingList[_user][_index]; return info; } function getTotalAmountLockedByUser(address _user) external view returns (uint256) { uint256 count = _userToVestingList[_user].length; uint256 amountLocked = 0; for (uint256 _index = 0; _index < count; _index++) { amountLocked = amountLocked + _userToVestingList[_user][_index].amount - _userToVestingList[_user][_index].claimedAmount; } return amountLocked; } function updateVestingDuration(uint256 _vestingDuration) external onlyFarmOwner { vestingDuration = _vestingDuration; } } // SPDX-License-Identifier: GPL-3.0 // File: contracts/Farm.sol contract Farm { using SafeERC20 for IERC20; /// @notice information stuct on each user than stakes LP tokens. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. } address public owner; IERC20 public lpToken; IERC20 public rewardToken; uint256 public startBlock; uint256 public rewardPerBlock; uint256 public lastRewardBlock; uint256 public accRewardPerShare; uint256 public farmerCount; bool public isActive; uint256 public firstCycleRate; uint256 public initRate; uint256 public reducingRate; // 95 equivalent to 95% uint256 public reducingCycle; // 195000 equivalent 195000 block IFarmFactory public factory; address public farmGenerator; Vesting public vesting; uint256 public percentForVesting; // 50 equivalent to 50% /// @notice information on each user than stakes LP tokens mapping(address => UserInfo) public userInfo; event Deposit(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); modifier onlyOwner() { require(msg.sender == owner, "Farm: FORBIDDEN"); _; } modifier mustActive() { require(isActive == true, "Farm: Not active"); _; } constructor(address _factory, address _farmGenerator) { factory = IFarmFactory(_factory); farmGenerator = _farmGenerator; } /** * @notice initialize the farming contract. This is called only once upon farm creation and the FarmGenerator ensures the farm has the correct paramaters */ function init( IERC20 _rewardToken, IERC20 _lpToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256[] memory _rateParameters, // 0: firstCycleRate , 1: initRate, 2: reducingRate, 3: reducingCycle uint256[] memory _vestingParameters, // 0: percentForVesting, 1: vestingDuration address _owner ) public { require(msg.sender == address(farmGenerator), "Farm: FORBIDDEN"); require(address(_rewardToken) != address(0), "Farm: Invalid reward token"); require(_rewardPerBlock > 1000, "Farm: Invalid block reward"); // minimum 1000 divisibility per block reward require(_startBlock > block.number, "Farm: Invalid start block"); // ideally at least 24 hours more to give farmers time require(_vestingParameters[0] <= 100, "Farm: Invalid percent for vesting"); require(_rateParameters[0] > 0, "Farm: Invalid first cycle rate"); require(_rateParameters[1] > 0, "Farm: Invalid initial rate"); require(_rateParameters[2] > 0 && _rateParameters[1] < 100, "Farm: Invalid reducing rate"); require(_rateParameters[3] > 0, "Farm: Invalid reducing cycle"); rewardToken = _rewardToken; startBlock = _startBlock; rewardPerBlock = _rewardPerBlock; firstCycleRate = _rateParameters[0]; initRate = _rateParameters[1]; reducingRate = _rateParameters[2]; reducingCycle = _rateParameters[3]; isActive = true; owner = _owner; uint256 _lastRewardBlock = block.number > _startBlock ? block.number : _startBlock; lpToken = _lpToken; lastRewardBlock = _lastRewardBlock; accRewardPerShare = 0; if (_vestingParameters[0] > 0) { percentForVesting = _vestingParameters[0]; vesting = new Vesting(address(_rewardToken), _vestingParameters[1]); _rewardToken.safeApprove(address(vesting), type(uint256).max); } } /** * @notice Gets the reward multiplier over the given _fromBlock until _to block * @param _fromBlock the start of the period to measure rewards for * @param _toBlock the end of the period to measure rewards for * @return The weighted multiplier for the given period */ function getMultiplier(uint256 _fromBlock, uint256 _toBlock) public view returns (uint256) { return _getMultiplierFromStart(_toBlock) - _getMultiplierFromStart(_fromBlock); } function _getMultiplierFromStart(uint256 _block) internal view returns (uint256) { uint256 roundPassed = (_block - startBlock) / reducingCycle; if (roundPassed == 0) { return (_block - startBlock) * firstCycleRate * 1e12; } else { uint256 multiplier = reducingCycle * firstCycleRate * 1e12; uint256 i = 0; for (i = 0; i < roundPassed - 1; i++) { multiplier = multiplier + ((1e12 * initRate * reducingRate**i) / 100**i) * reducingCycle; } if ((_block - startBlock) % reducingCycle > 0) { multiplier = multiplier + ((1e12 * initRate * reducingRate**i) / 100**i) * ((_block - startBlock) % reducingCycle); } return multiplier; } } /** * @notice function to see accumulated balance of reward token for specified user * @param _user the user for whom unclaimed tokens will be shown * @return total amount of withdrawable reward tokens */ function pendingReward(address _user) public view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 _accRewardPerShare = accRewardPerShare; uint256 _lpSupply = lpToken.balanceOf(address(this)); if (block.number > lastRewardBlock && _lpSupply != 0 && isActive == true) { uint256 _multiplier = getMultiplier(lastRewardBlock, block.number); uint256 _tokenReward = (_multiplier * rewardPerBlock) / 1e12; _accRewardPerShare = _accRewardPerShare + ((_tokenReward * 1e12) / _lpSupply); } return ((user.amount * _accRewardPerShare) / 1e12) - user.rewardDebt; } /** * @notice updates pool information to be up to date to the current block */ function updatePool() public mustActive { if (block.number <= lastRewardBlock) { return; } uint256 _lpSupply = lpToken.balanceOf(address(this)); if (_lpSupply == 0) { lastRewardBlock = block.number; return; } uint256 _multiplier = getMultiplier(lastRewardBlock, block.number); uint256 _tokenReward = (_multiplier * rewardPerBlock) / 1e12; accRewardPerShare = accRewardPerShare + ((_tokenReward * 1e12) / _lpSupply); lastRewardBlock = block.number; } /** * @notice deposit LP token function for msg.sender * @param _amount the total deposit amount */ function deposit(uint256 _amount) public mustActive { UserInfo storage user = userInfo[msg.sender]; updatePool(); if (user.amount > 0) { uint256 _pending = ((user.amount * accRewardPerShare) / 1e12) - user.rewardDebt; uint256 availableRewardToken = rewardToken.balanceOf(address(this)); if (_pending > availableRewardToken) { _pending = availableRewardToken; } uint256 _forVesting = 0; if (percentForVesting > 0) { _forVesting = (_pending * percentForVesting) / 100; vesting.addVesting(msg.sender, _forVesting); } rewardToken.safeTransfer(msg.sender, _pending - _forVesting); } if (user.amount == 0 && _amount > 0) { factory.userEnteredFarm(msg.sender); farmerCount++; } lpToken.safeTransferFrom(msg.sender, address(this), _amount); user.amount = user.amount + _amount; user.rewardDebt = (user.amount * accRewardPerShare) / 1e12; emit Deposit(msg.sender, _amount); } /** * @notice withdraw LP token function for msg.sender * @param _amount the total withdrawable amount */ function withdraw(uint256 _amount) public { UserInfo storage user = userInfo[msg.sender]; require(user.amount >= _amount, "INSUFFICIENT"); if (isActive == true) { updatePool(); } if (user.amount == _amount && _amount > 0) { factory.userLeftFarm(msg.sender); farmerCount--; } uint256 _pending = ((user.amount * accRewardPerShare) / 1e12) - user.rewardDebt; uint256 availableRewardToken = rewardToken.balanceOf(address(this)); if (_pending > availableRewardToken) { _pending = availableRewardToken; } uint256 _forVesting = 0; if (percentForVesting > 0) { _forVesting = (_pending * percentForVesting) / 100; vesting.addVesting(msg.sender, _forVesting); } rewardToken.safeTransfer(msg.sender, _pending - _forVesting); user.amount = user.amount - _amount; user.rewardDebt = (user.amount * accRewardPerShare) / 1e12; lpToken.safeTransfer(msg.sender, _amount); emit Withdraw(msg.sender, _amount); } /** * @notice emergency functoin to withdraw LP tokens and forego harvest rewards. Important to protect users LP tokens */ function emergencyWithdraw() public { UserInfo storage user = userInfo[msg.sender]; lpToken.safeTransfer(msg.sender, user.amount); emit EmergencyWithdraw(msg.sender, user.amount); if (user.amount > 0) { factory.userLeftFarm(msg.sender); farmerCount--; } user.amount = 0; user.rewardDebt = 0; } /** * @notice Safe reward transfer function, just in case a rounding error causes pool to not have enough reward tokens * @param _to the user address to transfer tokens to * @param _amount the total amount of tokens to transfer */ function _safeRewardTransfer(address _to, uint256 _amount) internal { rewardToken.transfer(_to, _amount); } function rescueFunds( address tokenToRescue, address to, uint256 amount ) external onlyOwner { require(address(lpToken) != tokenToRescue, "Farm: Cannot claim token held by the contract"); IERC20(tokenToRescue).safeTransfer(to, amount); } function updateReducingRate(uint256 _reducingRate) external onlyOwner mustActive { require(_reducingRate > 0 && _reducingRate <= 100, "Farm: Invalid reducing rate"); reducingRate = _reducingRate; } function updatePercentForVesting(uint256 _percentForVesting) external onlyOwner { require( _percentForVesting >= 0 && _percentForVesting <= 100, "Farm: Invalid percent for vesting" ); percentForVesting = _percentForVesting; } function forceEnd() external onlyOwner mustActive { updatePool(); isActive = false; } function transferOwnership(address _owner) external onlyOwner { owner = _owner; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_farmGenerator","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IFarmFactory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmGenerator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"farmerCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"firstCycleRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"forceEnd","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_fromBlock","type":"uint256"},{"internalType":"uint256","name":"_toBlock","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256[]","name":"_rateParameters","type":"uint256[]"},{"internalType":"uint256[]","name":"_vestingParameters","type":"uint256[]"},{"internalType":"address","name":"_owner","type":"address"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lpToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentForVesting","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reducingCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reducingRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenToRescue","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentForVesting","type":"uint256"}],"name":"updatePercentForVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_reducingRate","type":"uint256"}],"name":"updateReducingRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vesting","outputs":[{"internalType":"contract Vesting","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200348c3803806200348c833981016040819052620000349162000083565b600d80546001600160a01b039384166001600160a01b031991821617909155600e8054929093169116179055620000ba565b80516001600160a01b03811681146200007e57600080fd5b919050565b6000806040838503121562000096578182fd5b620000a18362000066565b9150620000b16020840162000066565b90509250929050565b6133c280620000ca6000396000f3fe60806040523480156200001157600080fd5b5060043610620002085760003560e01c80638da5cb5b116200011d578063c45a015511620000b1578063f2fde38b116200007b578063f2fde38b14620003c1578063f40f0f5214620003d8578063f7c618c114620003ef578063fca7a0e014620003f95762000208565b8063c45a01551462000399578063c9323e3114620003a3578063db2e21bc14620003ad578063e3161ddd14620003b75762000208565b8063a9f8d18111620000f3578063a9f8d1811462000364578063b5c3f9e5146200036e578063b6b55f251462000378578063bd45b397146200038f5762000208565b80638da5cb5b14620003395780638dbb1e3a1462000343578063939d6237146200035a5762000208565b806348cd4cb111620001a157806369864418116200016b5780636986441814620002f75780636ccae05414620003015780636eb9830414620003185780638ae39cac146200032f5762000208565b806348cd4cb114620002c25780634ee0ab0d14620002cc5780635fcbd28514620002d6578063686477f414620002e05762000208565b80632dd9999611620001e35780632dd99996146200026f5780632e1a7d4d14620002885780633c5171c414620002a157806344c63eec14620002b85762000208565b8063081399c0146200020d5780631959a002146200022f57806322f3e2d41462000256575b600080fd5b6200021762000403565b604051620002269190620020ed565b60405180910390f35b620002466200024036600462001aea565b62000409565b60405162000226929190620020f6565b6200026062000422565b60405162000226919062001d08565b620002796200042b565b60405162000226919062001c9d565b6200029f6200029936600462001c2b565b6200043a565b005b6200029f620002b236600462001b70565b62000752565b6200027962000beb565b6200021762000bfa565b6200029f62000c00565b6200027962000c6d565b6200029f620002f136600462001c2b565b62000c7c565b6200021762000cd2565b6200029f6200031236600462001b09565b62000cd8565b6200029f6200032936600462001c2b565b62000d51565b6200021762000dde565b6200027962000de4565b620002176200035436600462001c5d565b62000df3565b6200021762000e1e565b6200021762000e24565b6200021762000e2a565b6200029f6200038936600462001c2b565b62000e30565b6200021762001120565b6200027962001126565b6200021762001135565b6200029f6200113b565b6200029f62001237565b6200029f620003d236600462001aea565b6200137d565b62000217620003e936600462001aea565b620013cc565b620002796200153e565b620002176200154d565b600b5481565b6011602052600090815260409020805460019091015482565b60085460ff1681565b600e546001600160a01b031681565b3360009081526011602052604090208054821115620004765760405162461bcd60e51b81526004016200046d9062001e74565b60405180910390fd5b60085460ff1615156001141562000491576200049162001237565b805482148015620004a25750600082115b156200052757600d54604051631db2c95560e21b81526001600160a01b03909116906376cb255490620004da90339060040162001c9d565b600060405180830381600087803b158015620004f557600080fd5b505af11580156200050a573d6000803e3d6000fd5b5050600780549250905060006200052183620022d6565b91905055505b6000816001015464e8d4a5100060065484600001546200054891906200226b565b6200055491906200211f565b6200056091906200228d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906200059890309060040162001c9d565b60206040518083038186803b158015620005b157600080fd5b505afa158015620005c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ec919062001c44565b905080821115620005fb578091505b601054600090156200068f576064601054846200061991906200226b565b6200062591906200211f565b600f546040516395fcb00d60e01b81529192506001600160a01b0316906395fcb00d906200065a903390859060040162001cef565b600060405180830381600087803b1580156200067557600080fd5b505af11580156200068a573d6000803e3d6000fd5b505050505b620006b433620006a083866200228d565b6002546001600160a01b0316919062001553565b8354620006c39086906200228d565b80855560065464e8d4a5100091620006dc91906200226b565b620006e891906200211f565b6001808601919091555462000708906001600160a01b0316338762001553565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051620007439190620020ed565b60405180910390a25050505050565b600e546001600160a01b031633146200077f5760405162461bcd60e51b81526004016200046d9062001e9a565b6001600160a01b038716620007a85760405162461bcd60e51b81526004016200046d9062001d7f565b6103e88511620007cc5760405162461bcd60e51b81526004016200046d9062001fdf565b438411620007ee5760405162461bcd60e51b81526004016200046d9062001d48565b6064826000815181106200081257634e487b7160e01b600052603260045260246000fd5b602002602001015111156200083b5760405162461bcd60e51b81526004016200046d9062001db6565b6000836000815181106200085f57634e487b7160e01b600052603260045260246000fd5b602002602001015111620008875760405162461bcd60e51b81526004016200046d9062001df7565b600083600181518110620008ab57634e487b7160e01b600052603260045260246000fd5b602002602001015111620008d35760405162461bcd60e51b81526004016200046d9062001efa565b600083600281518110620008f757634e487b7160e01b600052603260045260246000fd5b60200260200101511180156200093657506064836001815181106200092c57634e487b7160e01b600052603260045260246000fd5b6020026020010151105b620009555760405162461bcd60e51b81526004016200046d9062001ec3565b6000836003815181106200097957634e487b7160e01b600052603260045260246000fd5b602002602001015111620009a15760405162461bcd60e51b81526004016200046d9062002060565b600280546001600160a01b0319166001600160a01b0389161790556003849055600485905582518390600090620009e857634e487b7160e01b600052603260045260246000fd5b60200260200101516009819055508260018151811062000a1857634e487b7160e01b600052603260045260246000fd5b6020026020010151600a819055508260028151811062000a4857634e487b7160e01b600052603260045260246000fd5b6020026020010151600b819055508260038151811062000a7857634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600c556008805460ff19166001179055600080546001600160a01b0383166001600160a01b031990911617815543851062000abf578462000ac1565b435b600180546001600160a01b0319166001600160a01b038a161790556005819055600060068190558451919250908490829062000b0d57634e487b7160e01b600052603260045260246000fd5b6020026020010151111562000be1578260008151811062000b3e57634e487b7160e01b600052603260045260246000fd5b6020026020010151601081905550878360018151811062000b6f57634e487b7160e01b600052603260045260246000fd5b602002602001015160405162000b859062001a3a565b62000b9292919062001cef565b604051809103906000f08015801562000baf573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03928316179081905562000be1918a81169116600019620015ad565b5050505050505050565b600f546001600160a01b031681565b60035481565b6000546001600160a01b0316331462000c2d5760405162461bcd60e51b81526004016200046d9062001e9a565b60085460ff16151560011462000c575760405162461bcd60e51b81526004016200046d9062001f7e565b62000c6162001237565b6008805460ff19169055565b6001546001600160a01b031681565b6000546001600160a01b0316331462000ca95760405162461bcd60e51b81526004016200046d9062001e9a565b606481111562000ccd5760405162461bcd60e51b81526004016200046d9062001db6565b601055565b600c5481565b6000546001600160a01b0316331462000d055760405162461bcd60e51b81526004016200046d9062001e9a565b6001546001600160a01b038481169116141562000d365760405162461bcd60e51b81526004016200046d9062001f31565b62000d4c6001600160a01b038416838362001553565b505050565b6000546001600160a01b0316331462000d7e5760405162461bcd60e51b81526004016200046d9062001e9a565b60085460ff16151560011462000da85760405162461bcd60e51b81526004016200046d9062001f7e565b60008111801562000dba575060648111155b62000dd95760405162461bcd60e51b81526004016200046d9062001ec3565b600b55565b60045481565b6000546001600160a01b031681565b600062000e00836200167d565b62000e0b836200167d565b62000e1791906200228d565b9392505050565b60065481565b60055481565b60105481565b60085460ff16151560011462000e5a5760405162461bcd60e51b81526004016200046d9062001f7e565b33600090815260116020526040902062000e7362001237565b80541562000ff8576000816001015464e8d4a51000600654846000015462000e9c91906200226b565b62000ea891906200211f565b62000eb491906200228d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319062000eec90309060040162001c9d565b60206040518083038186803b15801562000f0557600080fd5b505afa15801562000f1a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f40919062001c44565b90508082111562000f4f578091505b6010546000901562000fe35760646010548462000f6d91906200226b565b62000f7991906200211f565b600f546040516395fcb00d60e01b81529192506001600160a01b0316906395fcb00d9062000fae903390859060040162001cef565b600060405180830381600087803b15801562000fc957600080fd5b505af115801562000fde573d6000803e3d6000fd5b505050505b62000ff433620006a083866200228d565b5050505b8054158015620010085750600082115b156200108d57600d546040516379cdf99b60e01b81526001600160a01b03909116906379cdf99b906200104090339060040162001c9d565b600060405180830381600087803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b5050600780549250905060006200108783620022f0565b91905055505b600154620010a7906001600160a01b03163330856200184e565b8054620010b690839062002104565b80825560065464e8d4a5100091620010cf91906200226b565b620010db91906200211f565b600182015560405133907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9062001114908590620020ed565b60405180910390a25050565b60075481565b600d546001600160a01b031681565b600a5481565b3360008181526011602052604090208054600154919262001166926001600160a01b03169162001553565b805460405133917f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695916200119b9190620020ed565b60405180910390a28054156200122a57600d54604051631db2c95560e21b81526001600160a01b03909116906376cb255490620011dd90339060040162001c9d565b600060405180830381600087803b158015620011f857600080fd5b505af11580156200120d573d6000803e3d6000fd5b5050600780549250905060006200122483620022d6565b91905055505b6000808255600190910155565b60085460ff161515600114620012615760405162461bcd60e51b81526004016200046d9062001f7e565b600554431162001271576200137b565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190620012a490309060040162001c9d565b60206040518083038186803b158015620012bd57600080fd5b505afa158015620012d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f8919062001c44565b9050806200130b5750436005556200137b565b60006200131b6005544362000df3565b9050600064e8d4a51000600454836200133591906200226b565b6200134191906200211f565b905082620013558264e8d4a510006200226b565b6200136191906200211f565b60065462001370919062002104565b600655505043600555505b565b6000546001600160a01b03163314620013aa5760405162461bcd60e51b81526004016200046d9062001e9a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380821660009081526011602052604080822060065460015492516370a0823160e01b8152939491939092859216906370a08231906200141890309060040162001c9d565b60206040518083038186803b1580156200143157600080fd5b505afa15801562001446573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200146c919062001c44565b9050600554431180156200147f57508015155b801562001493575060085460ff1615156001145b1562001500576000620014a96005544362000df3565b9050600064e8d4a5100060045483620014c391906200226b565b620014cf91906200211f565b905082620014e38264e8d4a510006200226b565b620014ef91906200211f565b620014fb908562002104565b935050505b6001830154835464e8d4a51000906200151b9085906200226b565b6200152791906200211f565b6200153391906200228d565b93505050505b919050565b6002546001600160a01b031681565b60095481565b62000d4c8363a9059cbb60e01b84846040516024016200157592919062001cef565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001878565b8015806200163c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90620015e6903090869060040162001cb1565b60206040518083038186803b158015620015ff57600080fd5b505afa15801562001614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200163a919062001c44565b155b6200165b5760405162461bcd60e51b81526004016200046d9062002097565b62000d4c8363095ea7b360e01b84846040516024016200157592919062001cef565b600080600c54600354846200169391906200228d565b6200169f91906200211f565b905080620016df57600954600354620016b990856200228d565b620016c591906200226b565b620016d69064e8d4a510006200226b565b91505062001539565b6000600954600c54620016f391906200226b565b620017049064e8d4a510006200226b565b905060005b620017166001846200228d565b8110156200179957600c546200172e82606462002183565b82600b546200173e919062002183565b600a54620017529064e8d4a510006200226b565b6200175e91906200226b565b6200176a91906200211f565b6200177691906200226b565b62001782908362002104565b9150806200179081620022f0565b91505062001709565b6000600c5460035487620017ae91906200228d565b620017ba91906200230e565b11156200184357600c54600354620017d390876200228d565b620017df91906200230e565b620017ec82606462002183565b82600b54620017fc919062002183565b600a54620018109064e8d4a510006200226b565b6200181c91906200226b565b6200182891906200211f565b6200183491906200226b565b62001840908362002104565b91505b509150620015399050565b62001872846323b872dd60e01b858585604051602401620015759392919062001ccb565b50505050565b6000620018cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200190f9092919063ffffffff16565b80519091501562000d4c5780806020019051810190620018f0919062001b4e565b62000d4c5760405162461bcd60e51b81526004016200046d9062002016565b606062001920848460008562001928565b949350505050565b6060824710156200194d5760405162461bcd60e51b81526004016200046d9062001e2e565b6200195885620019f6565b620019775760405162461bcd60e51b81526004016200046d9062001fa8565b600080866001600160a01b0316858760405162001995919062001c7f565b60006040518083038185875af1925050503d8060008114620019d4576040519150601f19603f3d011682016040523d82523d6000602084013e620019d9565b606091505b5091509150620019eb828286620019fc565b979650505050505050565b3b151590565b6060831562001a0d57508162000e17565b82511562001a1e5782518084602001fd5b8160405162461bcd60e51b81526004016200046d919062001d13565b61100c806200238183390190565b600082601f83011262001a59578081fd5b8135602067ffffffffffffffff8083111562001a795762001a7962002351565b8183026040518382820101818110848211171562001a9b5762001a9b62002351565b6040528481528381019250868401828801850189101562001aba578687fd5b8692505b8583101562001ade57803584529284019260019290920191840162001abe565b50979650505050505050565b60006020828403121562001afc578081fd5b813562000e178162002367565b60008060006060848603121562001b1e578182fd5b833562001b2b8162002367565b9250602084013562001b3d8162002367565b929592945050506040919091013590565b60006020828403121562001b60578081fd5b8151801515811462000e17578182fd5b600080600080600080600060e0888a03121562001b8b578283fd5b873562001b988162002367565b9650602088013562001baa8162002367565b95506040880135945060608801359350608088013567ffffffffffffffff8082111562001bd5578485fd5b62001be38b838c0162001a48565b945060a08a013591508082111562001bf9578384fd5b5062001c088a828b0162001a48565b92505060c088013562001c1b8162002367565b8091505092959891949750929550565b60006020828403121562001c3d578081fd5b5035919050565b60006020828403121562001c56578081fd5b5051919050565b6000806040838503121562001c70578182fd5b50508035926020909101359150565b6000825162001c93818460208701620022a7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252825180602084015262001d34816040850160208701620022a7565b601f01601f19169190910160400192915050565b60208082526019908201527f4661726d3a20496e76616c696420737461727420626c6f636b00000000000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c69642072657761726420746f6b656e000000000000604082015260600190565b60208082526021908201527f4661726d3a20496e76616c69642070657263656e7420666f722076657374696e6040820152606760f81b606082015260800190565b6020808252601e908201527f4661726d3a20496e76616c6964206669727374206379636c6520726174650000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600c908201526b125394d551919250d251539560a21b604082015260600190565b6020808252600f908201526e2330b9369d102327a92124a22222a760891b604082015260600190565b6020808252601b908201527f4661726d3a20496e76616c6964207265647563696e6720726174650000000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c696420696e697469616c2072617465000000000000604082015260600190565b6020808252602d908201527f4661726d3a2043616e6e6f7420636c61696d20746f6b656e2068656c6420627960408201526c081d1a194818dbdb9d1c9858dd609a1b606082015260800190565b60208082526010908201526f4661726d3a204e6f742061637469766560801b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c696420626c6f636b20726577617264000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f4661726d3a20496e76616c6964207265647563696e67206379636c6500000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b918252602082015260400190565b600082198211156200211a576200211a62002325565b500190565b6000826200213157620021316200233b565b500490565b80825b60018086116200214a57506200217a565b8187048211156200215f576200215f62002325565b808616156200216d57918102915b9490941c93800262002139565b94509492505050565b600062000e1760001984846000826200219f5750600162000e17565b81620021ae5750600062000e17565b8160018114620021c75760028114620021d25762002206565b600191505062000e17565b60ff841115620021e657620021e662002325565b6001841b915084821115620021ff57620021ff62002325565b5062000e17565b5060208310610133831016604e8410600b84101617156200223e575081810a8381111562002238576200223862002325565b62000e17565b6200224d848484600162002136565b80860482111562002262576200226262002325565b02949350505050565b600081600019048311821515161562002288576200228862002325565b500290565b600082821015620022a257620022a262002325565b500390565b60005b83811015620022c4578181015183820152602001620022aa565b83811115620018725750506000910152565b600081620022e857620022e862002325565b506000190190565b600060001982141562002307576200230762002325565b5060010190565b6000826200232057620023206200233b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200237d57600080fd5b5056fe608060405234801561001057600080fd5b5060405161100c38038061100c83398101604081905261002f91610090565b6001600081905580546001600160a01b0319166001600160a01b038416179055806100755760405162461bcd60e51b815260040161006c906100c8565b60405180910390fd5b60025550600380546001600160a01b031916331790556100ff565b600080604083850312156100a2578182fd5b82516001600160a01b03811681146100b8578283fd5b6020939093015192949293505050565b60208082526019908201527f56657374696e673a20496e76616c6964206475726174696f6e00000000000000604082015260600190565b610efe8061010e6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806395fcb00d1161007157806395fcb00d1461013c578063ac97b4171461014f578063dd19aa5714610162578063e3ed598414610175578063f3b71c3314610188578063fc0c546a1461019b576100b4565b80631293aafc146100b95780631514617e146100e257806336e9332d146100ea5780634080695e146100ff5780637a5fa298146101125780637c1f241d14610132575b600080fd5b6100cc6100c7366004610af0565b6101a3565b6040516100d99190610ddc565b60405180910390f35b6100cc6101b8565b6100f26101be565b6040516100d99190610b6f565b6100cc61010d366004610ab8565b6101cd565b610125610120366004610af0565b6101e8565b6040516100d99190610dbb565b61013a6102ab565b005b61013a61014a366004610af0565b610322565b61013a61015d366004610b3b565b6103c2565b61013a610170366004610b3b565b6103fb565b6100cc610183366004610ab8565b6104b6565b6100cc610196366004610ab8565b6105ab565b6100f26105fd565b60006101af838361060c565b90505b92915050565b60025481565b6003546001600160a01b031681565b6001600160a01b031660009081526004602052604090205490565b6101f0610a97565b6001600160a01b03831660009081526004602052604090205482106102305760405162461bcd60e51b815260040161022790610cd3565b60405180910390fd5b6001600160a01b038316600090815260046020526040812080548490811061026857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090508091505092915050565b600260005414156102ce5760405162461bcd60e51b815260040161022790610d84565b6002600090815533815260046020526040812054905b818110156103195760006102f8338361060c565b111561030757610307816106fc565b8061031181610e7f565b9150506102e4565b50506001600055565b6003546001600160a01b0316331461034c5760405162461bcd60e51b815260040161022790610c39565b600154610364906001600160a01b031633308461088d565b6040805160608101825291825243602080840191825260008484018181526001600160a01b03909616815260048252928320805460018181018355918552919093209351600390910290930192835551908201559051600290910155565b600260005414156103e55760405162461bcd60e51b815260040161022790610d84565b60026000556103f3816106fc565b506001600055565b600360009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561044957600080fd5b505afa15801561045d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104819190610ad4565b6001600160a01b0316336001600160a01b0316146104b15760405162461bcd60e51b815260040161022790610c39565b600255565b6001600160a01b03811660009081526004602052604081205481805b828110156105a3576001600160a01b038516600090815260046020526040902080548290811061051257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002015460046000876001600160a01b03166001600160a01b03168152602001908152602001600020828154811061056857634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154836105859190610de5565b61058f9190610e3c565b91508061059b81610e7f565b9150506104d2565b509392505050565b6001600160a01b038116600090815260046020526040812054815b818110156105f6576105d8848261060c565b6105e29084610de5565b9250806105ee81610e7f565b9150506105c6565b5050919050565b6001546001600160a01b031681565b6001600160a01b038216600090815260046020526040812080548291908490811061064757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201529150431161068d5760009150506101b2565b600081602001514361069f9190610e3c565b9050600060025482106106b4575081516106d1565b60025483516106c4908490610e1d565b6106ce9190610dfd565b90505b6000935082604001518111156106f35760408301516106f09082610e3c565b93505b50505092915050565b33600090815260046020526040902054811061072a5760405162461bcd60e51b815260040161022790610cd3565b6000610736338361060c565b9050600081116107585760405162461bcd60e51b815260040161022790610d4d565b33600090815260046020526040902080548291908490811061078a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201546107a69190610de5565b3360009081526004602052604090208054849081106107d557634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600390920201015560015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061081b9033908590600401610ba7565b602060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086d9190610b1b565b6108895760405162461bcd60e51b815260040161022790610c65565b5050565b6108e5846323b872dd60e01b8585856040516024016108ae93929190610b83565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526108eb565b50505050565b6000610940826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661097f9092919063ffffffff16565b80519091501561097a578080602001905181019061095e9190610b1b565b61097a5760405162461bcd60e51b815260040161022790610d03565b505050565b606061098e8484600085610998565b90505b9392505050565b6060824710156109ba5760405162461bcd60e51b815260040161022790610bf3565b6109c385610a58565b6109df5760405162461bcd60e51b815260040161022790610c9c565b600080866001600160a01b031685876040516109fb9190610b53565b60006040518083038185875af1925050503d8060008114610a38576040519150601f19603f3d011682016040523d82523d6000602084013e610a3d565b606091505b5091509150610a4d828286610a5e565b979650505050505050565b3b151590565b60608315610a6d575081610991565b825115610a7d5782518084602001fd5b8160405162461bcd60e51b81526004016102279190610bc0565b60405180606001604052806000815260200160008152602001600081525090565b600060208284031215610ac9578081fd5b813561099181610eb0565b600060208284031215610ae5578081fd5b815161099181610eb0565b60008060408385031215610b02578081fd5b8235610b0d81610eb0565b946020939093013593505050565b600060208284031215610b2c578081fd5b81518015158114610991578182fd5b600060208284031215610b4c578081fd5b5035919050565b60008251610b65818460208701610e53565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602082528251806020840152610bdf816040850160208701610e53565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601290820152712b32b9ba34b7339d102327a92124a22222a760711b604082015260600190565b60208082526018908201527f56657374696e673a207472616e73666572206661696c65640000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601690820152750accae6e8d2dcce744092dcecc2d8d2c840d2dcc8caf60531b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526019908201527f56657374696e673a204e6f7468696e6720746f20636c61696d00000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b60008219821115610df857610df8610e9a565b500190565b600082610e1857634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615610e3757610e37610e9a565b500290565b600082821015610e4e57610e4e610e9a565b500390565b60005b83811015610e6e578181015183820152602001610e56565b838111156108e55750506000910152565b6000600019821415610e9357610e93610e9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ec557600080fd5b5056fea2646970667358221220fcae66cdb70c0d1e102b0f7bcd6fe325642c4a4595d9f1d18363d2cd10583b3964736f6c63430008000033a26469706673582212205832d95509d8ad8023e4f3b75b8e1ae64133466abc4ea8fa53e198ae3b00bc2d64736f6c6343000800003300000000000000000000000033d1986867ed8e0d0bf0808942c3f0b7b0c7d546000000000000000000000000874dbb99a53876c77a0cf5f844b88fc1b1f2f7ad
Deployed Bytecode
0x60806040523480156200001157600080fd5b5060043610620002085760003560e01c80638da5cb5b116200011d578063c45a015511620000b1578063f2fde38b116200007b578063f2fde38b14620003c1578063f40f0f5214620003d8578063f7c618c114620003ef578063fca7a0e014620003f95762000208565b8063c45a01551462000399578063c9323e3114620003a3578063db2e21bc14620003ad578063e3161ddd14620003b75762000208565b8063a9f8d18111620000f3578063a9f8d1811462000364578063b5c3f9e5146200036e578063b6b55f251462000378578063bd45b397146200038f5762000208565b80638da5cb5b14620003395780638dbb1e3a1462000343578063939d6237146200035a5762000208565b806348cd4cb111620001a157806369864418116200016b5780636986441814620002f75780636ccae05414620003015780636eb9830414620003185780638ae39cac146200032f5762000208565b806348cd4cb114620002c25780634ee0ab0d14620002cc5780635fcbd28514620002d6578063686477f414620002e05762000208565b80632dd9999611620001e35780632dd99996146200026f5780632e1a7d4d14620002885780633c5171c414620002a157806344c63eec14620002b85762000208565b8063081399c0146200020d5780631959a002146200022f57806322f3e2d41462000256575b600080fd5b6200021762000403565b604051620002269190620020ed565b60405180910390f35b620002466200024036600462001aea565b62000409565b60405162000226929190620020f6565b6200026062000422565b60405162000226919062001d08565b620002796200042b565b60405162000226919062001c9d565b6200029f6200029936600462001c2b565b6200043a565b005b6200029f620002b236600462001b70565b62000752565b6200027962000beb565b6200021762000bfa565b6200029f62000c00565b6200027962000c6d565b6200029f620002f136600462001c2b565b62000c7c565b6200021762000cd2565b6200029f6200031236600462001b09565b62000cd8565b6200029f6200032936600462001c2b565b62000d51565b6200021762000dde565b6200027962000de4565b620002176200035436600462001c5d565b62000df3565b6200021762000e1e565b6200021762000e24565b6200021762000e2a565b6200029f6200038936600462001c2b565b62000e30565b6200021762001120565b6200027962001126565b6200021762001135565b6200029f6200113b565b6200029f62001237565b6200029f620003d236600462001aea565b6200137d565b62000217620003e936600462001aea565b620013cc565b620002796200153e565b620002176200154d565b600b5481565b6011602052600090815260409020805460019091015482565b60085460ff1681565b600e546001600160a01b031681565b3360009081526011602052604090208054821115620004765760405162461bcd60e51b81526004016200046d9062001e74565b60405180910390fd5b60085460ff1615156001141562000491576200049162001237565b805482148015620004a25750600082115b156200052757600d54604051631db2c95560e21b81526001600160a01b03909116906376cb255490620004da90339060040162001c9d565b600060405180830381600087803b158015620004f557600080fd5b505af11580156200050a573d6000803e3d6000fd5b5050600780549250905060006200052183620022d6565b91905055505b6000816001015464e8d4a5100060065484600001546200054891906200226b565b6200055491906200211f565b6200056091906200228d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a08231906200059890309060040162001c9d565b60206040518083038186803b158015620005b157600080fd5b505afa158015620005c6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ec919062001c44565b905080821115620005fb578091505b601054600090156200068f576064601054846200061991906200226b565b6200062591906200211f565b600f546040516395fcb00d60e01b81529192506001600160a01b0316906395fcb00d906200065a903390859060040162001cef565b600060405180830381600087803b1580156200067557600080fd5b505af11580156200068a573d6000803e3d6000fd5b505050505b620006b433620006a083866200228d565b6002546001600160a01b0316919062001553565b8354620006c39086906200228d565b80855560065464e8d4a5100091620006dc91906200226b565b620006e891906200211f565b6001808601919091555462000708906001600160a01b0316338762001553565b336001600160a01b03167f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a942436486604051620007439190620020ed565b60405180910390a25050505050565b600e546001600160a01b031633146200077f5760405162461bcd60e51b81526004016200046d9062001e9a565b6001600160a01b038716620007a85760405162461bcd60e51b81526004016200046d9062001d7f565b6103e88511620007cc5760405162461bcd60e51b81526004016200046d9062001fdf565b438411620007ee5760405162461bcd60e51b81526004016200046d9062001d48565b6064826000815181106200081257634e487b7160e01b600052603260045260246000fd5b602002602001015111156200083b5760405162461bcd60e51b81526004016200046d9062001db6565b6000836000815181106200085f57634e487b7160e01b600052603260045260246000fd5b602002602001015111620008875760405162461bcd60e51b81526004016200046d9062001df7565b600083600181518110620008ab57634e487b7160e01b600052603260045260246000fd5b602002602001015111620008d35760405162461bcd60e51b81526004016200046d9062001efa565b600083600281518110620008f757634e487b7160e01b600052603260045260246000fd5b60200260200101511180156200093657506064836001815181106200092c57634e487b7160e01b600052603260045260246000fd5b6020026020010151105b620009555760405162461bcd60e51b81526004016200046d9062001ec3565b6000836003815181106200097957634e487b7160e01b600052603260045260246000fd5b602002602001015111620009a15760405162461bcd60e51b81526004016200046d9062002060565b600280546001600160a01b0319166001600160a01b0389161790556003849055600485905582518390600090620009e857634e487b7160e01b600052603260045260246000fd5b60200260200101516009819055508260018151811062000a1857634e487b7160e01b600052603260045260246000fd5b6020026020010151600a819055508260028151811062000a4857634e487b7160e01b600052603260045260246000fd5b6020026020010151600b819055508260038151811062000a7857634e487b7160e01b600052603260045260246000fd5b6020908102919091010151600c556008805460ff19166001179055600080546001600160a01b0383166001600160a01b031990911617815543851062000abf578462000ac1565b435b600180546001600160a01b0319166001600160a01b038a161790556005819055600060068190558451919250908490829062000b0d57634e487b7160e01b600052603260045260246000fd5b6020026020010151111562000be1578260008151811062000b3e57634e487b7160e01b600052603260045260246000fd5b6020026020010151601081905550878360018151811062000b6f57634e487b7160e01b600052603260045260246000fd5b602002602001015160405162000b859062001a3a565b62000b9292919062001cef565b604051809103906000f08015801562000baf573d6000803e3d6000fd5b50600f80546001600160a01b0319166001600160a01b03928316179081905562000be1918a81169116600019620015ad565b5050505050505050565b600f546001600160a01b031681565b60035481565b6000546001600160a01b0316331462000c2d5760405162461bcd60e51b81526004016200046d9062001e9a565b60085460ff16151560011462000c575760405162461bcd60e51b81526004016200046d9062001f7e565b62000c6162001237565b6008805460ff19169055565b6001546001600160a01b031681565b6000546001600160a01b0316331462000ca95760405162461bcd60e51b81526004016200046d9062001e9a565b606481111562000ccd5760405162461bcd60e51b81526004016200046d9062001db6565b601055565b600c5481565b6000546001600160a01b0316331462000d055760405162461bcd60e51b81526004016200046d9062001e9a565b6001546001600160a01b038481169116141562000d365760405162461bcd60e51b81526004016200046d9062001f31565b62000d4c6001600160a01b038416838362001553565b505050565b6000546001600160a01b0316331462000d7e5760405162461bcd60e51b81526004016200046d9062001e9a565b60085460ff16151560011462000da85760405162461bcd60e51b81526004016200046d9062001f7e565b60008111801562000dba575060648111155b62000dd95760405162461bcd60e51b81526004016200046d9062001ec3565b600b55565b60045481565b6000546001600160a01b031681565b600062000e00836200167d565b62000e0b836200167d565b62000e1791906200228d565b9392505050565b60065481565b60055481565b60105481565b60085460ff16151560011462000e5a5760405162461bcd60e51b81526004016200046d9062001f7e565b33600090815260116020526040902062000e7362001237565b80541562000ff8576000816001015464e8d4a51000600654846000015462000e9c91906200226b565b62000ea891906200211f565b62000eb491906200228d565b6002546040516370a0823160e01b81529192506000916001600160a01b03909116906370a082319062000eec90309060040162001c9d565b60206040518083038186803b15801562000f0557600080fd5b505afa15801562000f1a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000f40919062001c44565b90508082111562000f4f578091505b6010546000901562000fe35760646010548462000f6d91906200226b565b62000f7991906200211f565b600f546040516395fcb00d60e01b81529192506001600160a01b0316906395fcb00d9062000fae903390859060040162001cef565b600060405180830381600087803b15801562000fc957600080fd5b505af115801562000fde573d6000803e3d6000fd5b505050505b62000ff433620006a083866200228d565b5050505b8054158015620010085750600082115b156200108d57600d546040516379cdf99b60e01b81526001600160a01b03909116906379cdf99b906200104090339060040162001c9d565b600060405180830381600087803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b5050600780549250905060006200108783620022f0565b91905055505b600154620010a7906001600160a01b03163330856200184e565b8054620010b690839062002104565b80825560065464e8d4a5100091620010cf91906200226b565b620010db91906200211f565b600182015560405133907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9062001114908590620020ed565b60405180910390a25050565b60075481565b600d546001600160a01b031681565b600a5481565b3360008181526011602052604090208054600154919262001166926001600160a01b03169162001553565b805460405133917f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd9695916200119b9190620020ed565b60405180910390a28054156200122a57600d54604051631db2c95560e21b81526001600160a01b03909116906376cb255490620011dd90339060040162001c9d565b600060405180830381600087803b158015620011f857600080fd5b505af11580156200120d573d6000803e3d6000fd5b5050600780549250905060006200122483620022d6565b91905055505b6000808255600190910155565b60085460ff161515600114620012615760405162461bcd60e51b81526004016200046d9062001f7e565b600554431162001271576200137b565b6001546040516370a0823160e01b81526000916001600160a01b0316906370a0823190620012a490309060040162001c9d565b60206040518083038186803b158015620012bd57600080fd5b505afa158015620012d2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620012f8919062001c44565b9050806200130b5750436005556200137b565b60006200131b6005544362000df3565b9050600064e8d4a51000600454836200133591906200226b565b6200134191906200211f565b905082620013558264e8d4a510006200226b565b6200136191906200211f565b60065462001370919062002104565b600655505043600555505b565b6000546001600160a01b03163314620013aa5760405162461bcd60e51b81526004016200046d9062001e9a565b600080546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b0380821660009081526011602052604080822060065460015492516370a0823160e01b8152939491939092859216906370a08231906200141890309060040162001c9d565b60206040518083038186803b1580156200143157600080fd5b505afa15801562001446573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200146c919062001c44565b9050600554431180156200147f57508015155b801562001493575060085460ff1615156001145b1562001500576000620014a96005544362000df3565b9050600064e8d4a5100060045483620014c391906200226b565b620014cf91906200211f565b905082620014e38264e8d4a510006200226b565b620014ef91906200211f565b620014fb908562002104565b935050505b6001830154835464e8d4a51000906200151b9085906200226b565b6200152791906200211f565b6200153391906200228d565b93505050505b919050565b6002546001600160a01b031681565b60095481565b62000d4c8363a9059cbb60e01b84846040516024016200157592919062001cef565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915262001878565b8015806200163c5750604051636eb1769f60e11b81526001600160a01b0384169063dd62ed3e90620015e6903090869060040162001cb1565b60206040518083038186803b158015620015ff57600080fd5b505afa15801562001614573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200163a919062001c44565b155b6200165b5760405162461bcd60e51b81526004016200046d9062002097565b62000d4c8363095ea7b360e01b84846040516024016200157592919062001cef565b600080600c54600354846200169391906200228d565b6200169f91906200211f565b905080620016df57600954600354620016b990856200228d565b620016c591906200226b565b620016d69064e8d4a510006200226b565b91505062001539565b6000600954600c54620016f391906200226b565b620017049064e8d4a510006200226b565b905060005b620017166001846200228d565b8110156200179957600c546200172e82606462002183565b82600b546200173e919062002183565b600a54620017529064e8d4a510006200226b565b6200175e91906200226b565b6200176a91906200211f565b6200177691906200226b565b62001782908362002104565b9150806200179081620022f0565b91505062001709565b6000600c5460035487620017ae91906200228d565b620017ba91906200230e565b11156200184357600c54600354620017d390876200228d565b620017df91906200230e565b620017ec82606462002183565b82600b54620017fc919062002183565b600a54620018109064e8d4a510006200226b565b6200181c91906200226b565b6200182891906200211f565b6200183491906200226b565b62001840908362002104565b91505b509150620015399050565b62001872846323b872dd60e01b858585604051602401620015759392919062001ccb565b50505050565b6000620018cf826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166200190f9092919063ffffffff16565b80519091501562000d4c5780806020019051810190620018f0919062001b4e565b62000d4c5760405162461bcd60e51b81526004016200046d9062002016565b606062001920848460008562001928565b949350505050565b6060824710156200194d5760405162461bcd60e51b81526004016200046d9062001e2e565b6200195885620019f6565b620019775760405162461bcd60e51b81526004016200046d9062001fa8565b600080866001600160a01b0316858760405162001995919062001c7f565b60006040518083038185875af1925050503d8060008114620019d4576040519150601f19603f3d011682016040523d82523d6000602084013e620019d9565b606091505b5091509150620019eb828286620019fc565b979650505050505050565b3b151590565b6060831562001a0d57508162000e17565b82511562001a1e5782518084602001fd5b8160405162461bcd60e51b81526004016200046d919062001d13565b61100c806200238183390190565b600082601f83011262001a59578081fd5b8135602067ffffffffffffffff8083111562001a795762001a7962002351565b8183026040518382820101818110848211171562001a9b5762001a9b62002351565b6040528481528381019250868401828801850189101562001aba578687fd5b8692505b8583101562001ade57803584529284019260019290920191840162001abe565b50979650505050505050565b60006020828403121562001afc578081fd5b813562000e178162002367565b60008060006060848603121562001b1e578182fd5b833562001b2b8162002367565b9250602084013562001b3d8162002367565b929592945050506040919091013590565b60006020828403121562001b60578081fd5b8151801515811462000e17578182fd5b600080600080600080600060e0888a03121562001b8b578283fd5b873562001b988162002367565b9650602088013562001baa8162002367565b95506040880135945060608801359350608088013567ffffffffffffffff8082111562001bd5578485fd5b62001be38b838c0162001a48565b945060a08a013591508082111562001bf9578384fd5b5062001c088a828b0162001a48565b92505060c088013562001c1b8162002367565b8091505092959891949750929550565b60006020828403121562001c3d578081fd5b5035919050565b60006020828403121562001c56578081fd5b5051919050565b6000806040838503121562001c70578182fd5b50508035926020909101359150565b6000825162001c93818460208701620022a7565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b0392831681529116602082015260400190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252825180602084015262001d34816040850160208701620022a7565b601f01601f19169190910160400192915050565b60208082526019908201527f4661726d3a20496e76616c696420737461727420626c6f636b00000000000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c69642072657761726420746f6b656e000000000000604082015260600190565b60208082526021908201527f4661726d3a20496e76616c69642070657263656e7420666f722076657374696e6040820152606760f81b606082015260800190565b6020808252601e908201527f4661726d3a20496e76616c6964206669727374206379636c6520726174650000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252600c908201526b125394d551919250d251539560a21b604082015260600190565b6020808252600f908201526e2330b9369d102327a92124a22222a760891b604082015260600190565b6020808252601b908201527f4661726d3a20496e76616c6964207265647563696e6720726174650000000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c696420696e697469616c2072617465000000000000604082015260600190565b6020808252602d908201527f4661726d3a2043616e6e6f7420636c61696d20746f6b656e2068656c6420627960408201526c081d1a194818dbdb9d1c9858dd609a1b606082015260800190565b60208082526010908201526f4661726d3a204e6f742061637469766560801b604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601a908201527f4661726d3a20496e76616c696420626c6f636b20726577617264000000000000604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b6020808252601c908201527f4661726d3a20496e76616c6964207265647563696e67206379636c6500000000604082015260600190565b60208082526036908201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60408201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b606082015260800190565b90815260200190565b918252602082015260400190565b600082198211156200211a576200211a62002325565b500190565b6000826200213157620021316200233b565b500490565b80825b60018086116200214a57506200217a565b8187048211156200215f576200215f62002325565b808616156200216d57918102915b9490941c93800262002139565b94509492505050565b600062000e1760001984846000826200219f5750600162000e17565b81620021ae5750600062000e17565b8160018114620021c75760028114620021d25762002206565b600191505062000e17565b60ff841115620021e657620021e662002325565b6001841b915084821115620021ff57620021ff62002325565b5062000e17565b5060208310610133831016604e8410600b84101617156200223e575081810a8381111562002238576200223862002325565b62000e17565b6200224d848484600162002136565b80860482111562002262576200226262002325565b02949350505050565b600081600019048311821515161562002288576200228862002325565b500290565b600082821015620022a257620022a262002325565b500390565b60005b83811015620022c4578181015183820152602001620022aa565b83811115620018725750506000910152565b600081620022e857620022e862002325565b506000190190565b600060001982141562002307576200230762002325565b5060010190565b6000826200232057620023206200233b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b03811681146200237d57600080fd5b5056fe608060405234801561001057600080fd5b5060405161100c38038061100c83398101604081905261002f91610090565b6001600081905580546001600160a01b0319166001600160a01b038416179055806100755760405162461bcd60e51b815260040161006c906100c8565b60405180910390fd5b60025550600380546001600160a01b031916331790556100ff565b600080604083850312156100a2578182fd5b82516001600160a01b03811681146100b8578283fd5b6020939093015192949293505050565b60208082526019908201527f56657374696e673a20496e76616c6964206475726174696f6e00000000000000604082015260600190565b610efe8061010e6000396000f3fe608060405234801561001057600080fd5b50600436106100b45760003560e01c806395fcb00d1161007157806395fcb00d1461013c578063ac97b4171461014f578063dd19aa5714610162578063e3ed598414610175578063f3b71c3314610188578063fc0c546a1461019b576100b4565b80631293aafc146100b95780631514617e146100e257806336e9332d146100ea5780634080695e146100ff5780637a5fa298146101125780637c1f241d14610132575b600080fd5b6100cc6100c7366004610af0565b6101a3565b6040516100d99190610ddc565b60405180910390f35b6100cc6101b8565b6100f26101be565b6040516100d99190610b6f565b6100cc61010d366004610ab8565b6101cd565b610125610120366004610af0565b6101e8565b6040516100d99190610dbb565b61013a6102ab565b005b61013a61014a366004610af0565b610322565b61013a61015d366004610b3b565b6103c2565b61013a610170366004610b3b565b6103fb565b6100cc610183366004610ab8565b6104b6565b6100cc610196366004610ab8565b6105ab565b6100f26105fd565b60006101af838361060c565b90505b92915050565b60025481565b6003546001600160a01b031681565b6001600160a01b031660009081526004602052604090205490565b6101f0610a97565b6001600160a01b03831660009081526004602052604090205482106102305760405162461bcd60e51b815260040161022790610cd3565b60405180910390fd5b6001600160a01b038316600090815260046020526040812080548490811061026857634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201604051806060016040529081600082015481526020016001820154815260200160028201548152505090508091505092915050565b600260005414156102ce5760405162461bcd60e51b815260040161022790610d84565b6002600090815533815260046020526040812054905b818110156103195760006102f8338361060c565b111561030757610307816106fc565b8061031181610e7f565b9150506102e4565b50506001600055565b6003546001600160a01b0316331461034c5760405162461bcd60e51b815260040161022790610c39565b600154610364906001600160a01b031633308461088d565b6040805160608101825291825243602080840191825260008484018181526001600160a01b03909616815260048252928320805460018181018355918552919093209351600390910290930192835551908201559051600290910155565b600260005414156103e55760405162461bcd60e51b815260040161022790610d84565b60026000556103f3816106fc565b506001600055565b600360009054906101000a90046001600160a01b03166001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b15801561044957600080fd5b505afa15801561045d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104819190610ad4565b6001600160a01b0316336001600160a01b0316146104b15760405162461bcd60e51b815260040161022790610c39565b600255565b6001600160a01b03811660009081526004602052604081205481805b828110156105a3576001600160a01b038516600090815260046020526040902080548290811061051257634e487b7160e01b600052603260045260246000fd5b90600052602060002090600302016002015460046000876001600160a01b03166001600160a01b03168152602001908152602001600020828154811061056857634e487b7160e01b600052603260045260246000fd5b906000526020600020906003020160000154836105859190610de5565b61058f9190610e3c565b91508061059b81610e7f565b9150506104d2565b509392505050565b6001600160a01b038116600090815260046020526040812054815b818110156105f6576105d8848261060c565b6105e29084610de5565b9250806105ee81610e7f565b9150506105c6565b5050919050565b6001546001600160a01b031681565b6001600160a01b038216600090815260046020526040812080548291908490811061064757634e487b7160e01b600052603260045260246000fd5b600091825260209182902060408051606081018252600390930290910180548352600181015493830184905260020154908201529150431161068d5760009150506101b2565b600081602001514361069f9190610e3c565b9050600060025482106106b4575081516106d1565b60025483516106c4908490610e1d565b6106ce9190610dfd565b90505b6000935082604001518111156106f35760408301516106f09082610e3c565b93505b50505092915050565b33600090815260046020526040902054811061072a5760405162461bcd60e51b815260040161022790610cd3565b6000610736338361060c565b9050600081116107585760405162461bcd60e51b815260040161022790610d4d565b33600090815260046020526040902080548291908490811061078a57634e487b7160e01b600052603260045260246000fd5b9060005260206000209060030201600201546107a69190610de5565b3360009081526004602052604090208054849081106107d557634e487b7160e01b600052603260045260246000fd5b600091825260209091206002600390920201015560015460405163a9059cbb60e01b81526001600160a01b039091169063a9059cbb9061081b9033908590600401610ba7565b602060405180830381600087803b15801561083557600080fd5b505af1158015610849573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061086d9190610b1b565b6108895760405162461bcd60e51b815260040161022790610c65565b5050565b6108e5846323b872dd60e01b8585856040516024016108ae93929190610b83565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526108eb565b50505050565b6000610940826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661097f9092919063ffffffff16565b80519091501561097a578080602001905181019061095e9190610b1b565b61097a5760405162461bcd60e51b815260040161022790610d03565b505050565b606061098e8484600085610998565b90505b9392505050565b6060824710156109ba5760405162461bcd60e51b815260040161022790610bf3565b6109c385610a58565b6109df5760405162461bcd60e51b815260040161022790610c9c565b600080866001600160a01b031685876040516109fb9190610b53565b60006040518083038185875af1925050503d8060008114610a38576040519150601f19603f3d011682016040523d82523d6000602084013e610a3d565b606091505b5091509150610a4d828286610a5e565b979650505050505050565b3b151590565b60608315610a6d575081610991565b825115610a7d5782518084602001fd5b8160405162461bcd60e51b81526004016102279190610bc0565b60405180606001604052806000815260200160008152602001600081525090565b600060208284031215610ac9578081fd5b813561099181610eb0565b600060208284031215610ae5578081fd5b815161099181610eb0565b60008060408385031215610b02578081fd5b8235610b0d81610eb0565b946020939093013593505050565b600060208284031215610b2c578081fd5b81518015158114610991578182fd5b600060208284031215610b4c578081fd5b5035919050565b60008251610b65818460208701610e53565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03929092168252602082015260400190565b6000602082528251806020840152610bdf816040850160208701610e53565b601f01601f19169190910160400192915050565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601290820152712b32b9ba34b7339d102327a92124a22222a760711b604082015260600190565b60208082526018908201527f56657374696e673a207472616e73666572206661696c65640000000000000000604082015260600190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252601690820152750accae6e8d2dcce744092dcecc2d8d2c840d2dcc8caf60531b604082015260600190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526019908201527f56657374696e673a204e6f7468696e6720746f20636c61696d00000000000000604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b81518152602080830151908201526040918201519181019190915260600190565b90815260200190565b60008219821115610df857610df8610e9a565b500190565b600082610e1857634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615610e3757610e37610e9a565b500290565b600082821015610e4e57610e4e610e9a565b500390565b60005b83811015610e6e578181015183820152602001610e56565b838111156108e55750506000910152565b6000600019821415610e9357610e93610e9a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114610ec557600080fd5b5056fea2646970667358221220fcae66cdb70c0d1e102b0f7bcd6fe325642c4a4595d9f1d18363d2cd10583b3964736f6c63430008000033a26469706673582212205832d95509d8ad8023e4f3b75b8e1ae64133466abc4ea8fa53e198ae3b00bc2d64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000033d1986867ed8e0d0bf0808942c3f0b7b0c7d546000000000000000000000000874dbb99a53876c77a0cf5f844b88fc1b1f2f7ad
-----Decoded View---------------
Arg [0] : _factory (address): 0x33D1986867ED8E0d0BF0808942c3f0B7b0c7d546
Arg [1] : _farmGenerator (address): 0x874dbb99a53876c77a0cF5F844b88fc1B1f2F7Ad
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 00000000000000000000000033d1986867ed8e0d0bf0808942c3f0b7b0c7d546
Arg [1] : 000000000000000000000000874dbb99a53876c77a0cf5f844b88fc1b1f2f7ad
Deployed Bytecode Sourcemap
26416:11361:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27051:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27409:44;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;26956:20::-;;;:::i;:::-;;;;;;;:::i;27214:28::-;;;:::i;:::-;;;;;;;:::i;34660:1150::-;;;;;;:::i;:::-;;:::i;:::-;;28193:2013;;;;;;:::i;:::-;;:::i;27251:22::-;;;:::i;26779:25::-;;;:::i;37563:108::-;;;:::i;26719:21::-;;;:::i;37272:283::-;;;;;;:::i;:::-;;:::i;27109:28::-;;;:::i;36742:294::-;;;;;;:::i;:::-;;:::i;37044:220::-;;;;;;:::i;:::-;;:::i;26811:29::-;;;:::i;26690:20::-;;;:::i;30520:188::-;;;;;;:::i;:::-;;:::i;26884:32::-;;;:::i;26847:30::-;;;:::i;27280:32::-;;;:::i;33375:1148::-;;;;;;:::i;:::-;;:::i;26923:26::-;;;:::i;27180:27::-;;;:::i;27021:23::-;;;:::i;35958:387::-;;;:::i;32670:574::-;;;:::i;37679:95::-;;;;;;:::i;:::-;;:::i;31896:669::-;;;;;;:::i;:::-;;:::i;26747:25::-;;;:::i;26985:29::-;;;:::i;27051:27::-;;;;:::o;27409:44::-;;;;;;;;;;;;;;;;;;;:::o;26956:20::-;;;;;;:::o;27214:28::-;;;-1:-1:-1;;;;;27214:28:0;;:::o;34660:1150::-;34746:10;34713:21;34737:20;;;:8;:20;;;;;34776:11;;:22;-1:-1:-1;34776:22:0;34768:47;;;;-1:-1:-1;;;34768:47:0;;;;;;;:::i;:::-;;;;;;;;;34832:8;;;;:16;;:8;:16;34828:61;;;34865:12;:10;:12::i;:::-;34905:11;;:22;;:37;;;;;34941:1;34931:7;:11;34905:37;34901:130;;;34959:7;;:32;;-1:-1:-1;;;34959:32:0;;-1:-1:-1;;;;;34959:7:0;;;;:20;;:32;;34980:10;;34959:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;35006:11:0;:13;;;-1:-1:-1;35006:11:0;-1:-1:-1;35006:11:0;:13;;;:::i;:::-;;;;;;34901:130;35043:16;35107:4;:15;;;35099:4;35078:17;;35064:4;:11;;;:31;;;;:::i;:::-;35063:40;;;;:::i;:::-;35062:60;;;;:::i;:::-;35166:11;;:36;;-1:-1:-1;;;35166:36:0;;35043:79;;-1:-1:-1;35135:28:0;;-1:-1:-1;;;;;35166:11:0;;;;:21;;:36;;35196:4;;35166:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;35135:67;;35228:20;35217:8;:31;35213:95;;;35276:20;35265:31;;35213:95;35358:17;;35320:19;;35358:21;35354:162;;35443:3;35422:17;;35411:8;:28;;;;:::i;:::-;35410:36;;;;:::i;:::-;35461:7;;:43;;-1:-1:-1;;;35461:43:0;;35396:50;;-1:-1:-1;;;;;;35461:7:0;;:18;;:43;;35480:10;;35396:50;;35461:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35354:162;35528:60;35553:10;35565:22;35576:11;35565:8;:22;:::i;:::-;35528:11;;-1:-1:-1;;;;;35528:11:0;;:60;:24;:60::i;:::-;35615:11;;:21;;35629:7;;35615:21;:::i;:::-;35601:35;;;35680:17;;35701:4;;35666:31;;35680:17;35666:31;:::i;:::-;35665:40;;;;:::i;:::-;35647:15;;;;:58;;;;35716:7;:41;;-1:-1:-1;;;;;35716:7:0;35737:10;35749:7;35716:20;:41::i;:::-;35782:10;-1:-1:-1;;;;;35773:29:0;;35794:7;35773:29;;;;;;:::i;:::-;;;;;;;;34660:1150;;;;;:::o;28193:2013::-;28610:13;;-1:-1:-1;;;;;28610:13:0;28588:10;:36;28580:64;;;;-1:-1:-1;;;28580:64:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;28663:35:0;;28655:74;;;;-1:-1:-1;;;28655:74:0;;;;;;;:::i;:::-;28766:4;28748:15;:22;28740:61;;;;-1:-1:-1;;;28740:61:0;;;;;;;:::i;:::-;28880:12;28866:11;:26;28858:64;;;;-1:-1:-1;;;28858:64:0;;;;;;;:::i;:::-;29021:3;28996:18;29015:1;28996:21;;;;;;-1:-1:-1;;;28996:21:0;;;;;;;;;;;;;;;:28;;28988:74;;;;-1:-1:-1;;;28988:74:0;;;;;;;:::i;:::-;29102:1;29081:15;29097:1;29081:18;;;;;;-1:-1:-1;;;29081:18:0;;;;;;;;;;;;;;;:22;29073:65;;;;-1:-1:-1;;;29073:65:0;;;;;;;:::i;:::-;29178:1;29157:15;29173:1;29157:18;;;;;;-1:-1:-1;;;29157:18:0;;;;;;;;;;;;;;;:22;29149:61;;;;-1:-1:-1;;;29149:61:0;;;;;;;:::i;:::-;29250:1;29229:15;29245:1;29229:18;;;;;;-1:-1:-1;;;29229:18:0;;;;;;;;;;;;;;;:22;:50;;;;;29276:3;29255:15;29271:1;29255:18;;;;;;-1:-1:-1;;;29255:18:0;;;;;;;;;;;;;;;:24;29229:50;29221:90;;;;-1:-1:-1;;;29221:90:0;;;;;;;:::i;:::-;29351:1;29330:15;29346:1;29330:18;;;;;;-1:-1:-1;;;29330:18:0;;;;;;;;;;;;;;;:22;29322:63;;;;-1:-1:-1;;;29322:63:0;;;;;;;:::i;:::-;29398:11;:26;;-1:-1:-1;;;;;;29398:26:0;-1:-1:-1;;;;;29398:26:0;;;;;29435:10;:24;;;29470:14;:32;;;29530:18;;;;-1:-1:-1;;29530:18:0;;-1:-1:-1;;;29530:18:0;;;;;;;;;;;;;;;29513:14;:35;;;;29570:15;29586:1;29570:18;;;;;;-1:-1:-1;;;29570:18:0;;;;;;;;;;;;;;;29559:8;:29;;;;29614:15;29630:1;29614:18;;;;;;-1:-1:-1;;;29614:18:0;;;;;;;;;;;;;;;29599:12;:33;;;;29659:15;29675:1;29659:18;;;;;;-1:-1:-1;;;29659:18:0;;;;;;;;;;;;;;;;;;;29643:13;:34;29688:8;:15;;-1:-1:-1;;29688:15:0;29699:4;29688:15;;;:8;29714:14;;-1:-1:-1;;;;;29714:14:0;;-1:-1:-1;;;;;;29714:14:0;;;;;;29768:12;:26;-1:-1:-1;29768:55:0;;29812:11;29768:55;;;29797:12;29768:55;29834:7;:18;;-1:-1:-1;;;;;;29834:18:0;-1:-1:-1;;;;;29834:18:0;;;;;29863:15;:34;;;-1:-1:-1;29908:17:0;:21;;;29946;;29863:34;;-1:-1:-1;;29946:21:0;;-1:-1:-1;;29946:21:0;;-1:-1:-1;;;29946:21:0;;;;;;;;;;;;;;;:25;29942:257;;;30008:18;30027:1;30008:21;;;;;;-1:-1:-1;;;30008:21:0;;;;;;;;;;;;;;;29988:17;:41;;;;30074:12;30089:18;30108:1;30089:21;;;;;;-1:-1:-1;;;30089:21:0;;;;;;;;;;;;;;;30054:57;;;;;:::i;:::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;30044:7:0;:67;;-1:-1:-1;;;;;;30044:67:0;-1:-1:-1;;;;;30044:67:0;;;;;;;;30126:61;;:24;;;;30159:7;-1:-1:-1;;30126:24:0;:61::i;:::-;28193:2013;;;;;;;;:::o;27251:22::-;;;-1:-1:-1;;;;;27251:22:0;;:::o;26779:25::-;;;;:::o;37563:108::-;27703:5;;-1:-1:-1;;;;;27703:5:0;27689:10;:19;27681:47;;;;-1:-1:-1;;;27681:47:0;;;;;;;:::i;:::-;27797:8:::1;::::0;::::1;;:16;;:8:::0;:16:::1;27789:45;;;;-1:-1:-1::0;;;27789:45:0::1;;;;;;;:::i;:::-;37624:12:::2;:10;:12::i;:::-;37647:8;:16:::0;;-1:-1:-1;;37647:16:0::2;::::0;;37563:108::o;26719:21::-;;;-1:-1:-1;;;;;26719:21:0;;:::o;37272:283::-;27703:5;;-1:-1:-1;;;;;27703:5:0;27689:10;:19;27681:47;;;;-1:-1:-1;;;27681:47:0;;;;;;;:::i;:::-;37434:3:::1;37412:18;:25;;37363:135;;;;-1:-1:-1::0;;;37363:135:0::1;;;;;;;:::i;:::-;37509:17;:38:::0;37272:283::o;27109:28::-;;;;:::o;36742:294::-;27703:5;;-1:-1:-1;;;;;27703:5:0;27689:10;:19;27681:47;;;;-1:-1:-1;;;27681:47:0;;;;;;;:::i;:::-;36894:7:::1;::::0;-1:-1:-1;;;;;36886:33:0;;::::1;36894:7:::0;::::1;36886:33;;36878:91;;;;-1:-1:-1::0;;;36878:91:0::1;;;;;;;:::i;:::-;36982:46;-1:-1:-1::0;;;;;36982:34:0;::::1;37017:2:::0;37021:6;36982:34:::1;:46::i;:::-;36742:294:::0;;;:::o;37044:220::-;27703:5;;-1:-1:-1;;;;;27703:5:0;27689:10;:19;27681:47;;;;-1:-1:-1;;;27681:47:0;;;;;;;:::i;:::-;27797:8:::1;::::0;::::1;;:16;;:8:::0;:16:::1;27789:45;;;;-1:-1:-1::0;;;27789:45:0::1;;;;;;;:::i;:::-;37160:1:::2;37144:13;:17;:41;;;;;37182:3;37165:13;:20;;37144:41;37136:81;;;;-1:-1:-1::0;;;37136:81:0::2;;;;;;;:::i;:::-;37228:12;:28:::0;37044:220::o;26811:29::-;;;;:::o;26690:20::-;;;-1:-1:-1;;;;;26690:20:0;;:::o;30520:188::-;30602:7;30665:35;30689:10;30665:23;:35::i;:::-;30629:33;30653:8;30629:23;:33::i;:::-;:71;;;;:::i;:::-;30622:78;30520:188;-1:-1:-1;;;30520:188:0:o;26884:32::-;;;;:::o;26847:30::-;;;;:::o;27280:32::-;;;;:::o;33375:1148::-;27797:8;;;;:16;;:8;:16;27789:45;;;;-1:-1:-1;;;27789:45:0;;;;;;;:::i;:::-;33471:10:::1;33438:21;33462:20:::0;;;:8:::1;:20;::::0;;;;33493:12:::1;:10;:12::i;:::-;33520:11:::0;;:15;33516:633:::1;;33552:16;33616:4;:15;;;33608:4;33587:17;;33573:4;:11;;;:31;;;;:::i;:::-;33572:40;;;;:::i;:::-;33571:60;;;;:::i;:::-;33679:11;::::0;:36:::1;::::0;-1:-1:-1;;;33679:36:0;;33552:79;;-1:-1:-1;33648:28:0::1;::::0;-1:-1:-1;;;;;33679:11:0;;::::1;::::0;:21:::1;::::0;:36:::1;::::0;33709:4:::1;::::0;33679:36:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33648:67;;33745:20;33734:8;:31;33730:103;;;33797:20;33786:31;;33730:103;33891:17;::::0;33849:19:::1;::::0;33891:21;33887:174:::1;;33980:3;33959:17;;33948:8;:28;;;;:::i;:::-;33947:36;;;;:::i;:::-;34002:7;::::0;:43:::1;::::0;-1:-1:-1;;;34002:43:0;;33933:50;;-1:-1:-1;;;;;;34002:7:0::1;::::0;:18:::1;::::0;:43:::1;::::0;34021:10:::1;::::0;33933:50;;34002:43:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33887:174;34077:60;34102:10;34114:22;34125:11:::0;34114:8;:22:::1;:::i;34077:60::-;33516:633;;;;34163:11:::0;;:16;:31;::::1;;;;34193:1;34183:7;:11;34163:31;34159:127;;;34211:7;::::0;:35:::1;::::0;-1:-1:-1;;;34211:35:0;;-1:-1:-1;;;;;34211:7:0;;::::1;::::0;:23:::1;::::0;:35:::1;::::0;34235:10:::1;::::0;34211:35:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;34261:11:0::1;:13:::0;;;-1:-1:-1;34261:11:0;-1:-1:-1;34261:11:0::1;:13;::::0;::::1;:::i;:::-;;;;;;34159:127;34296:7;::::0;:60:::1;::::0;-1:-1:-1;;;;;34296:7:0::1;34321:10;34341:4;34348:7:::0;34296:24:::1;:60::i;:::-;34381:11:::0;;:21:::1;::::0;34395:7;;34381:21:::1;:::i;:::-;34367:35:::0;;;34446:17:::1;::::0;34467:4:::1;::::0;34432:31:::1;::::0;34446:17;34432:31:::1;:::i;:::-;34431:40;;;;:::i;:::-;34413:15;::::0;::::1;:58:::0;34487:28:::1;::::0;34495:10:::1;::::0;34487:28:::1;::::0;::::1;::::0;34507:7;;34487:28:::1;:::i;:::-;;;;;;;;27845:1;33375:1148:::0;:::o;26923:26::-;;;;:::o;27180:27::-;;;-1:-1:-1;;;;;27180:27:0;;:::o;27021:23::-;;;;:::o;35958:387::-;36038:10;36005:21;36029:20;;;:8;:20;;;;;36093:11;;36060:7;;36029:20;;36060:45;;-1:-1:-1;;;;;36060:7:0;;:20;:45::i;:::-;36151:11;;36121:42;;36139:10;;36121:42;;;;36151:11;36121:42;:::i;:::-;;;;;;;;36178:11;;:15;36174:108;;36210:7;;:32;;-1:-1:-1;;;36210:32:0;;-1:-1:-1;;;;;36210:7:0;;;;:20;;:32;;36231:10;;36210:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;36257:11:0;:13;;;-1:-1:-1;36257:11:0;-1:-1:-1;36257:11:0;:13;;;:::i;:::-;;;;;;36174:108;36306:1;36292:15;;;36318;;;;:19;35958:387::o;32670:574::-;27797:8;;;;:16;;:8;:16;27789:45;;;;-1:-1:-1;;;27789:45:0;;;;;;;:::i;:::-;32741:15:::1;;32725:12;:31;32721:70;;32773:7;;32721:70;32821:7;::::0;:32:::1;::::0;-1:-1:-1;;;32821:32:0;;32801:17:::1;::::0;-1:-1:-1;;;;;32821:7:0::1;::::0;:17:::1;::::0;:32:::1;::::0;32847:4:::1;::::0;32821:32:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32801:52:::0;-1:-1:-1;32868:14:0;32864:98:::1;;-1:-1:-1::0;32917:12:0::1;32899:15;:30:::0;32944:7:::1;;32864:98;32972:19;32994:44;33008:15;;33025:12;32994:13;:44::i;:::-;32972:66;;33049:20;33105:4;33087:14;;33073:11;:28;;;;:::i;:::-;33072:37;;;;:::i;:::-;33049:60:::0;-1:-1:-1;33185:9:0;33162:19:::1;33049:60:::0;33177:4:::1;33162:19;:::i;:::-;33161:33;;;;:::i;:::-;33140:17;;:55;;;;:::i;:::-;33120:17;:75:::0;-1:-1:-1;;33224:12:0::1;33206:15;:30:::0;-1:-1:-1;27845:1:0::1;32670:574::o:0;37679:95::-;27703:5;;-1:-1:-1;;;;;27703:5:0;27689:10;:19;27681:47;;;;-1:-1:-1;;;27681:47:0;;;;;;;:::i;:::-;37752:5:::1;:14:::0;;-1:-1:-1;;;;;;37752:14:0::1;-1:-1:-1::0;;;;;37752:14:0;;;::::1;::::0;;;::::1;::::0;;37679:95::o;31896:669::-;-1:-1:-1;;;;;31999:15:0;;;31955:7;31999:15;;;:8;:15;;;;;;32054:17;;32102:7;;:32;;-1:-1:-1;;;32102:32:0;;31955:7;;31999:15;;32054:17;;31955:7;;32102;;:17;;:32;;32128:4;;32102:32;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32082:52;;32164:15;;32149:12;:30;:48;;;;-1:-1:-1;32183:14:0;;;32149:48;:68;;;;-1:-1:-1;32201:8:0;;;;:16;;:8;:16;32149:68;32145:334;;;32234:19;32256:44;32270:15;;32287:12;32256:13;:44::i;:::-;32234:66;;32315:20;32371:4;32353:14;;32339:11;:28;;;;:::i;:::-;32338:37;;;;:::i;:::-;32315:60;-1:-1:-1;32457:9:0;32434:19;32315:60;32449:4;32434:19;:::i;:::-;32433:33;;;;:::i;:::-;32411:56;;:18;:56;:::i;:::-;32390:77;;32145:334;;;32542:15;;;;32498:11;;32534:4;;32498:32;;32512:18;;32498:32;:::i;:::-;32497:41;;;;:::i;:::-;32496:61;;;;:::i;:::-;32489:68;;;;;31896:669;;;;:::o;26747:25::-;;;-1:-1:-1;;;;;26747:25:0;;:::o;26985:29::-;;;;:::o;11777:211::-;11894:86;11914:5;11944:23;;;11969:2;11973:5;11921:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;11921:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;11921:58:0;-1:-1:-1;;;;;;11921:58:0;;;;;;;;;;11894:19;:86::i;12550:670::-;12968:10;;;12967:62;;-1:-1:-1;12984:39:0;;-1:-1:-1;;;12984:39:0;;-1:-1:-1;;;;;12984:15:0;;;;;:39;;13008:4;;13015:7;;12984:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:44;12967:62;12945:166;;;;-1:-1:-1;;;12945:166:0;;;;;;;:::i;:::-;13122:90;13142:5;13172:22;;;13196:7;13205:5;13149:62;;;;;;;;;:::i;30716:938::-;30788:7;30808:19;30854:13;;30840:10;;30831:6;:19;;;;:::i;:::-;30830:37;;;;:::i;:::-;30808:59;-1:-1:-1;30884:16:0;30880:767;;30948:14;;30934:10;;30925:19;;:6;:19;:::i;:::-;30924:38;;;;:::i;:::-;:45;;30965:4;30924:45;:::i;:::-;30917:52;;;;;30880:767;31002:18;31039:14;;31023:13;;:30;;;;:::i;:::-;:37;;31056:4;31023:37;:::i;:::-;31002:58;;31075:9;31103:224;31119:15;31133:1;31119:11;:15;:::i;:::-;31115:1;:19;31103:224;;;31298:13;;31267:6;31272:1;31267:3;:6;:::i;:::-;31262:1;31248:12;;:15;;;;:::i;:::-;31237:8;;31230:15;;:4;:15;:::i;:::-;:33;;;;:::i;:::-;31229:44;;;;:::i;:::-;31228:83;;;;:::i;:::-;31194:117;;:10;:117;:::i;:::-;31160:151;-1:-1:-1;31136:3:0;;;;:::i;:::-;;;;31103:224;;;31387:1;31371:13;;31357:10;;31348:6;:19;;;;:::i;:::-;31347:37;;;;:::i;:::-;:41;31343:259;;;31572:13;;31558:10;;31549:19;;:6;:19;:::i;:::-;31548:37;;;;:::i;:::-;31516:6;31521:1;31516:3;:6;:::i;:::-;31511:1;31497:12;;:15;;;;:::i;:::-;31486:8;;31479:15;;:4;:15;:::i;:::-;:33;;;;:::i;:::-;31478:44;;;;:::i;:::-;31477:109;;;;:::i;:::-;31443:143;;:10;:143;:::i;:::-;31409:177;;31343:259;-1:-1:-1;31625:10:0;-1:-1:-1;31618:17:0;;-1:-1:-1;31618:17:0;11996:285;12140:133;12174:5;12217:27;;;12246:4;12252:2;12256:5;12194:68;;;;;;;;;;:::i;12140:133::-;11996:285;;;;:::o;14527:787::-;14951:23;14990:69;15018:4;14990:69;;;;;;;;;;;;;;;;;14998:5;-1:-1:-1;;;;;14990:27:0;;;:69;;;;;:::i;:::-;15074:17;;14951:108;;-1:-1:-1;15074:21:0;15070:237;;15229:10;15218:30;;;;;;;;;;;;:::i;:::-;15210:85;;;;-1:-1:-1;;;15210:85:0;;;;;;;:::i;6535:229::-;6672:12;6704:52;6726:6;6734:4;6740:1;6743:12;6704:21;:52::i;:::-;6697:59;6535:229;-1:-1:-1;;;;6535:229:0:o;7668:571::-;7838:12;7896:5;7871:21;:30;;7863:81;;;;-1:-1:-1;;;7863:81:0;;;;;;;:::i;:::-;7963:18;7974:6;7963:10;:18::i;:::-;7955:60;;;;-1:-1:-1;;;7955:60:0;;;;;;;:::i;:::-;8089:12;8103:23;8130:6;-1:-1:-1;;;;;8130:11:0;8149:5;8156:4;8130:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8088:73;;;;8179:52;8197:7;8206:10;8218:12;8179:17;:52::i;:::-;8172:59;7668:571;-1:-1:-1;;;;;;;7668:571:0:o;3595:444::-;3975:20;4023:8;;;3595:444::o;10372:777::-;10522:12;10551:7;10547:595;;;-1:-1:-1;10582:10:0;10575:17;;10547:595;10696:17;;:21;10692:439;;10959:10;10953:17;11020:15;11007:10;11003:2;10999:19;10992:44;10907:148;11102:12;11095:20;;-1:-1:-1;;;11095:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;:::o;14:926:1:-;;127:3;120:4;112:6;108:17;104:27;94:2;;149:5;142;135:20;94:2;189:6;176:20;215:4;238:18;275:2;271;268:10;265:2;;;281:18;;:::i;:::-;328:2;324;320:11;360:2;354:9;411:2;406;398:6;394:15;390:24;464:6;452:10;449:22;444:2;432:10;429:18;426:46;423:2;;;475:18;;:::i;:::-;511:2;504:22;561:18;;;595:15;;;;-1:-1:-1;630:15:1;;;664;;;660:24;;657:33;-1:-1:-1;654:2:1;;;707:5;700;693:20;654:2;733:5;724:14;;747:163;761:2;758:1;755:9;747:163;;;818:17;;806:30;;856:12;;;;779:1;772:9;;;;;888:12;;747:163;;;-1:-1:-1;928:6:1;84:856;-1:-1:-1;;;;;;;84:856:1:o;945:259::-;;1057:2;1045:9;1036:7;1032:23;1028:32;1025:2;;;1078:6;1070;1063:22;1025:2;1122:9;1109:23;1141:33;1168:5;1141:33;:::i;1209:470::-;;;;1355:2;1343:9;1334:7;1330:23;1326:32;1323:2;;;1376:6;1368;1361:22;1323:2;1420:9;1407:23;1439:33;1466:5;1439:33;:::i;:::-;1491:5;-1:-1:-1;1548:2:1;1533:18;;1520:32;1561:35;1520:32;1561:35;:::i;:::-;1313:366;;1615:7;;-1:-1:-1;;;1669:2:1;1654:18;;;;1641:32;;1313:366::o;1684:297::-;;1804:2;1792:9;1783:7;1779:23;1775:32;1772:2;;;1825:6;1817;1810:22;1772:2;1862:9;1856:16;1915:5;1908:13;1901:21;1894:5;1891:32;1881:2;;1942:6;1934;1927:22;1986:1226;;;;;;;;2276:3;2264:9;2255:7;2251:23;2247:33;2244:2;;;2298:6;2290;2283:22;2244:2;2342:9;2329:23;2361:33;2388:5;2361:33;:::i;:::-;2413:5;-1:-1:-1;2470:2:1;2455:18;;2442:32;2483:35;2442:32;2483:35;:::i;:::-;2537:7;-1:-1:-1;2591:2:1;2576:18;;2563:32;;-1:-1:-1;2642:2:1;2627:18;;2614:32;;-1:-1:-1;2697:3:1;2682:19;;2669:33;2721:18;2751:14;;;2748:2;;;2783:6;2775;2768:22;2748:2;2811:67;2870:7;2861:6;2850:9;2846:22;2811:67;:::i;:::-;2801:77;;2931:3;2920:9;2916:19;2903:33;2887:49;;2961:2;2951:8;2948:16;2945:2;;;2982:6;2974;2967:22;2945:2;;3010:69;3071:7;3060:8;3049:9;3045:24;3010:69;:::i;:::-;3000:79;;;3131:3;3120:9;3116:19;3103:33;3145:35;3172:7;3145:35;:::i;:::-;3199:7;3189:17;;;2234:978;;;;;;;;;;:::o;3217:190::-;;3329:2;3317:9;3308:7;3304:23;3300:32;3297:2;;;3350:6;3342;3335:22;3297:2;-1:-1:-1;3378:23:1;;3287:120;-1:-1:-1;3287:120:1:o;3412:194::-;;3535:2;3523:9;3514:7;3510:23;3506:32;3503:2;;;3556:6;3548;3541:22;3503:2;-1:-1:-1;3584:16:1;;3493:113;-1:-1:-1;3493:113:1:o;3611:258::-;;;3740:2;3728:9;3719:7;3715:23;3711:32;3708:2;;;3761:6;3753;3746:22;3708:2;-1:-1:-1;;3789:23:1;;;3859:2;3844:18;;;3831:32;;-1:-1:-1;3698:171:1:o;3874:274::-;;4041:6;4035:13;4057:53;4103:6;4098:3;4091:4;4083:6;4079:17;4057:53;:::i;:::-;4126:16;;;;;4011:137;-1:-1:-1;;4011:137:1:o;4153:203::-;-1:-1:-1;;;;;4317:32:1;;;;4299:51;;4287:2;4272:18;;4254:102::o;4361:304::-;-1:-1:-1;;;;;4591:15:1;;;4573:34;;4643:15;;4638:2;4623:18;;4616:43;4523:2;4508:18;;4490:175::o;4670:375::-;-1:-1:-1;;;;;4928:15:1;;;4910:34;;4980:15;;;;4975:2;4960:18;;4953:43;5027:2;5012:18;;5005:34;;;;4860:2;4845:18;;4827:218::o;5050:274::-;-1:-1:-1;;;;;5242:32:1;;;;5224:51;;5306:2;5291:18;;5284:34;5212:2;5197:18;;5179:145::o;5329:187::-;5494:14;;5487:22;5469:41;;5457:2;5442:18;;5424:92::o;6194:383::-;;6343:2;6332:9;6325:21;6375:6;6369:13;6418:6;6413:2;6402:9;6398:18;6391:34;6434:66;6493:6;6488:2;6477:9;6473:18;6468:2;6460:6;6456:15;6434:66;:::i;:::-;6561:2;6540:15;-1:-1:-1;;6536:29:1;6521:45;;;;6568:2;6517:54;;6315:262;-1:-1:-1;;6315:262:1:o;6582:349::-;6784:2;6766:21;;;6823:2;6803:18;;;6796:30;6862:27;6857:2;6842:18;;6835:55;6922:2;6907:18;;6756:175::o;6936:350::-;7138:2;7120:21;;;7177:2;7157:18;;;7150:30;7216:28;7211:2;7196:18;;7189:56;7277:2;7262:18;;7110:176::o;7291:397::-;7493:2;7475:21;;;7532:2;7512:18;;;7505:30;7571:34;7566:2;7551:18;;7544:62;-1:-1:-1;;;7637:2:1;7622:18;;7615:31;7678:3;7663:19;;7465:223::o;7693:354::-;7895:2;7877:21;;;7934:2;7914:18;;;7907:30;7973:32;7968:2;7953:18;;7946:60;8038:2;8023:18;;7867:180::o;8052:402::-;8254:2;8236:21;;;8293:2;8273:18;;;8266:30;8332:34;8327:2;8312:18;;8305:62;-1:-1:-1;;;8398:2:1;8383:18;;8376:36;8444:3;8429:19;;8226:228::o;8459:336::-;8661:2;8643:21;;;8700:2;8680:18;;;8673:30;-1:-1:-1;;;8734:2:1;8719:18;;8712:42;8786:2;8771:18;;8633:162::o;8800:339::-;9002:2;8984:21;;;9041:2;9021:18;;;9014:30;-1:-1:-1;;;9075:2:1;9060:18;;9053:45;9130:2;9115:18;;8974:165::o;9144:351::-;9346:2;9328:21;;;9385:2;9365:18;;;9358:30;9424:29;9419:2;9404:18;;9397:57;9486:2;9471:18;;9318:177::o;9500:350::-;9702:2;9684:21;;;9741:2;9721:18;;;9714:30;9780:28;9775:2;9760:18;;9753:56;9841:2;9826:18;;9674:176::o;9855:409::-;10057:2;10039:21;;;10096:2;10076:18;;;10069:30;10135:34;10130:2;10115:18;;10108:62;-1:-1:-1;;;10201:2:1;10186:18;;10179:43;10254:3;10239:19;;10029:235::o;10269:340::-;10471:2;10453:21;;;10510:2;10490:18;;;10483:30;-1:-1:-1;;;10544:2:1;10529:18;;10522:46;10600:2;10585:18;;10443:166::o;10614:353::-;10816:2;10798:21;;;10855:2;10835:18;;;10828:30;10894:31;10889:2;10874:18;;10867:59;10958:2;10943:18;;10788:179::o;10972:350::-;11174:2;11156:21;;;11213:2;11193:18;;;11186:30;11252:28;11247:2;11232:18;;11225:56;11313:2;11298:18;;11146:176::o;11327:406::-;11529:2;11511:21;;;11568:2;11548:18;;;11541:30;11607:34;11602:2;11587:18;;11580:62;-1:-1:-1;;;11673:2:1;11658:18;;11651:40;11723:3;11708:19;;11501:232::o;11738:352::-;11940:2;11922:21;;;11979:2;11959:18;;;11952:30;12018;12013:2;11998:18;;11991:58;12081:2;12066:18;;11912:178::o;12095:418::-;12297:2;12279:21;;;12336:2;12316:18;;;12309:30;12375:34;12370:2;12355:18;;12348:62;-1:-1:-1;;;12441:2:1;12426:18;;12419:52;12503:3;12488:19;;12269:244::o;12518:177::-;12664:25;;;12652:2;12637:18;;12619:76::o;12700:248::-;12874:25;;;12930:2;12915:18;;12908:34;12862:2;12847:18;;12829:119::o;12953:128::-;;13024:1;13020:6;13017:1;13014:13;13011:2;;;13030:18;;:::i;:::-;-1:-1:-1;13066:9:1;;13001:80::o;13086:120::-;;13152:1;13142:2;;13157:18;;:::i;:::-;-1:-1:-1;13191:9:1;;13132:74::o;13211:453::-;13307:6;13330:5;13344:314;13393:1;13430:2;13420:8;13417:16;13407:2;;13437:5;;;13407:2;13478:4;13473:3;13469:14;13463:4;13460:24;13457:2;;;13487:18;;:::i;:::-;13537:2;13527:8;13523:17;13520:2;;;13552:16;;;;13520:2;13631:17;;;;;13591:15;;13344:314;;;13288:376;;;;;;;:::o;13669:139::-;;13758:44;-1:-1:-1;;13785:8:1;13779:4;13813:922;13897:8;13887:2;;-1:-1:-1;13938:1:1;13952:5;;13887:2;13986:4;13976:2;;-1:-1:-1;14023:1:1;14037:5;;13976:2;14068:4;14086:1;14081:59;;;;14154:1;14149:183;;;;14061:271;;14081:59;14111:1;14102:10;;14125:5;;;14149:183;14186:3;14176:8;14173:17;14170:2;;;14193:18;;:::i;:::-;14249:1;14239:8;14235:16;14226:25;;14277:3;14270:5;14267:14;14264:2;;;14284:18;;:::i;:::-;14317:5;;;14061:271;;14416:2;14406:8;14403:16;14397:3;14391:4;14388:13;14384:36;14378:2;14368:8;14365:16;14360:2;14354:4;14351:12;14347:35;14344:77;14341:2;;;-1:-1:-1;14453:19:1;;;14488:14;;;14485:2;;;14505:18;;:::i;:::-;14538:5;;14341:2;14585:42;14623:3;14613:8;14607:4;14604:1;14585:42;:::i;:::-;14660:6;14655:3;14651:16;14642:7;14639:29;14636:2;;;14671:18;;:::i;:::-;14709:20;;13877:858;-1:-1:-1;;;;13877:858:1:o;14740:168::-;;14846:1;14842;14838:6;14834:14;14831:1;14828:21;14823:1;14816:9;14809:17;14805:45;14802:2;;;14853:18;;:::i;:::-;-1:-1:-1;14893:9:1;;14792:116::o;14913:125::-;;14981:1;14978;14975:8;14972:2;;;14986:18;;:::i;:::-;-1:-1:-1;15023:9:1;;14962:76::o;15043:258::-;15115:1;15125:113;15139:6;15136:1;15133:13;15125:113;;;15215:11;;;15209:18;15196:11;;;15189:39;15161:2;15154:10;15125:113;;;15256:6;15253:1;15250:13;15247:2;;;-1:-1:-1;;15291:1:1;15273:16;;15266:27;15096:205::o;15306:136::-;;15373:5;15363:2;;15382:18;;:::i;:::-;-1:-1:-1;;;15418:18:1;;15353:89::o;15447:135::-;;-1:-1:-1;;15507:17:1;;15504:2;;;15527:18;;:::i;:::-;-1:-1:-1;15574:1:1;15563:13;;15494:88::o;15587:112::-;;15645:1;15635:2;;15650:18;;:::i;:::-;-1:-1:-1;15684:9:1;;15625:74::o;15704:127::-;15765:10;15760:3;15756:20;15753:1;15746:31;15796:4;15793:1;15786:15;15820:4;15817:1;15810:15;15836:127;15897:10;15892:3;15888:20;15885:1;15878:31;15928:4;15925:1;15918:15;15952:4;15949:1;15942:15;15968:127;16029:10;16024:3;16020:20;16017:1;16010:31;16060:4;16057:1;16050:15;16084:4;16081:1;16074:15;16100:133;-1:-1:-1;;;;;16177:31:1;;16167:42;;16157:2;;16223:1;16220;16213:12;16157:2;16147:86;:::o
Swarm Source
ipfs://5832d95509d8ad8023e4f3b75b8e1ae64133466abc4ea8fa53e198ae3b00bc2d
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.