Contract
0x18cd511b4ad613308bd0c795e85fbd8be1a0af94
2
Contract Overview
My Name Tag:
Not Available, login to update
[ Download CSV Export ]
Latest 2 internal transactions
Parent Txn Hash | Block | From | To | Value | |||
---|---|---|---|---|---|---|---|
0xa2f0992535bcc4a4d1b5ba9ad20afdce1f783508263ecc43999b3aac86733271 | 29811059 | 109 days 9 hrs ago | 0x98e7bd81ec2e5de378617ce9161aea5eee776b0a | 0x18cd511b4ad613308bd0c795e85fbd8be1a0af94 | 1 FTM | ||
0xbf76c482fd7bddfb4ced2bbe982a5e46f4274b62fd3a27a5c313d24e486e20d3 | 24481271 | 164 days 10 hrs ago | 0x9a9205be64b7da379db034bb0d360048f92dba52 | Contract Creation | 0 FTM |
[ Download CSV Export ]
Contract Name:
Masterchef
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at FtmScan.com on 2021-12-09 */ // File: libs/IUniswapV2Factory.sol pragma solidity >=0.5.0; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); function feeTo() external view returns (address); function feeToSetter() external view returns (address); function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs(uint) external view returns (address pair); function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); function setFeeTo(address) external; function setFeeToSetter(address) external; } // File: libs/IUniswapV2Pair.sol pragma solidity >=0.5.0; interface IUniswapV2Pair { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function skim(address to) external; function sync() external; function initialize(address, address) external; } // File: libs/IUniswapV2Router01.sol pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); function removeLiquidityWithPermit( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB); function removeLiquidityETHWithPermit( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); } // File: libs/IUniswapV2Router02.sol pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // File: Masterchef.sol pragma solidity ^0.8.7; /** * @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) { return msg.data; } } /** * @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() { _transferOwnership(_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 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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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; 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"); (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"); (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"); (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"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal 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 assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @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); } /** * @dev Interface for the optional metadata functions from the ERC20 standard. * * _Available since v4.1._ */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } /** * @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' 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 require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * For a generic mechanism see {ERC20PresetMinterPauser}. * * TIP: For a detailed writeup see our guide * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. * * Finally, the non-standard {decreaseAllowance} and {increaseAllowance} * functions have been added to mitigate the well-known issues around setting * allowances. See {IERC20-approve}. */ contract ERC20 is Context, Ownable, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; uint256 constant MAXCAPSUPPLY = 11000 ether; string private _name; string private _symbol; /** * @dev Sets the values for {name} and {symbol}. * * The default value of {decimals} is 18. To select a different value for * {decimals} you should overload it. * * All two of these values are immutable: they can only be set once during * construction. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the value {ERC20} uses, unless this function is * overridden; * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual override returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _totalSupply; } function maxSupply() public pure returns (uint256) { return MAXCAPSUPPLY; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `recipient` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address recipient, uint256 amount) public virtual override returns (bool) { _transfer(_msgSender(), recipient, amount); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual override returns (uint256) { return _allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { _approve(_msgSender(), spender, amount); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * Requirements: * * - `sender` and `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. * - the caller must have allowance for ``sender``'s tokens of at least * `amount`. */ function transferFrom( address sender, address recipient, uint256 amount ) public virtual override returns (bool) { _transfer(sender, recipient, amount); uint256 currentAllowance = _allowances[sender][_msgSender()]; require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance"); unchecked { _approve(sender, _msgSender(), currentAllowance - amount); } return true; } /** * @dev Atomically increases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. */ function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) { _approve(_msgSender(), spender, _allowances[_msgSender()][spender] + addedValue); return true; } /** * @dev Atomically decreases the allowance granted to `spender` by the caller. * * This is an alternative to {approve} that can be used as a mitigation for * problems described in {IERC20-approve}. * * Emits an {Approval} event indicating the updated allowance. * * Requirements: * * - `spender` cannot be the zero address. * - `spender` must have allowance for the caller of at least * `subtractedValue`. */ function decreaseAllowance(address spender, uint256 subtractedValue) public virtual returns (bool) { uint256 currentAllowance = _allowances[_msgSender()][spender]; require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(_msgSender(), spender, currentAllowance - subtractedValue); } return true; } /** * @dev Creates `amount` tokens and assigns them to `msg.sender`, increasing * the total supply. * * Requirements * * - `msg.sender` must be the token owner */ function mint(uint256 amount) public onlyOwner returns (bool) { _mint(_msgSender(), amount); return true; } /** * @dev Moves `amount` of tokens from `sender` to `recipient`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * Requirements: * * - `sender` cannot be the zero address. * - `recipient` cannot be the zero address. * - `sender` must have a balance of at least `amount`. */ function _transfer( address sender, address recipient, uint256 amount ) internal virtual { require(sender != address(0), "ERC20: transfer from the zero address"); require(recipient != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(sender, recipient, amount); uint256 senderBalance = _balances[sender]; require(senderBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[sender] = senderBalance - amount; } _balances[recipient] += amount; emit Transfer(sender, recipient, amount); _afterTokenTransfer(sender, recipient, amount); } /** @dev Creates `amount` tokens and assigns them to `account`, increasing * the total supply. * * Emits a {Transfer} event with `from` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. */ function _mint(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: mint to the zero address"); require(_totalSupply + amount <= MAXCAPSUPPLY, "Max supply reached"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. */ function _approve( address owner, address spender, uint256 amount ) internal virtual { require(owner != address(0), "ERC20: approve from the zero address"); require(spender != address(0), "ERC20: approve to the zero address"); _allowances[owner][spender] = amount; emit Approval(owner, spender, amount); } /** * @dev Hook that is called before any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * will be transferred to `to`. * - when `from` is zero, `amount` tokens will be minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 amount ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens * has been transferred to `to`. * - when `from` is zero, `amount` tokens have been minted for `to`. * - when `to` is zero, `amount` of ``from``'s tokens have been burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 amount ) internal virtual {} } contract DNA is ERC20('DNA Genesys', 'DNA') { using SafeERC20 for IERC20; uint16 public transferTaxRate = 500; // Burn rate % of transfer tax. (default 0% x 5% = 0% of total amount). uint16 public burnRate = 0; // Max transfer tax rate: 5%. uint16 public constant MAXIMUM_TRANSFER_TAX_RATE = 500; // Burn address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Automatic swap and liquify enabled bool public swapAndLiquifyEnabled = false; // Min amount to liquify. (default 0.01 Token) uint256 public minAmountToLiquify = 0.05 ether; // The swap router, modifiable. Will be changed to BlossomSwap's router when our own AMM release IUniswapV2Router02 public genesysSwapRouter; // The trading pair address public genesysSwapPair; // In swap and liquify bool private _inSwapAndLiquify; // The operator can only update the transfer tax rate address public _operator; // Events event OperatorTransferred(address indexed previousOperator, address indexed newOperator); event TransferTaxRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); event BurnRateUpdated(address indexed operator, uint256 previousRate, uint256 newRate); event SwapAndLiquifyEnabledUpdated(address indexed operator, bool enabled); event MinAmountToLiquifyUpdated(address indexed operator, uint256 previousAmount, uint256 newAmount); event genesysSwapRouterUpdated(address indexed operator, address indexed router, address indexed pair); event SwapAndLiquify(uint256 tokensSwapped, uint256 ethReceived, uint256 tokensIntoLiqudity); modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } modifier lockTheSwap { _inSwapAndLiquify = true; _; _inSwapAndLiquify = false; } modifier transferTaxFree { uint16 _transferTaxRate = transferTaxRate; transferTaxRate = 0; _; transferTaxRate = _transferTaxRate; } constructor() { _operator = _msgSender(); _mint(_msgSender(), uint256(500000000000000000000)); // 500 tokens for initial liquidity } function mint(address to, uint256 amount) public onlyOwner { _mint(to, amount); } /// @dev overrides transfer function to meet tokenomics of GENESYS function _transfer(address sender, address recipient, uint256 amount) internal virtual override { // swap and liquify if ( swapAndLiquifyEnabled == true && _inSwapAndLiquify == false && address(genesysSwapRouter) != address(0) && genesysSwapPair != address(0) && sender != genesysSwapPair && sender != owner() ) { swapAndLiquify(); } if (recipient == BURN_ADDRESS || transferTaxRate == 0 || sender == owner() || recipient == owner() || sender == operator() || recipient == operator()) { super._transfer(sender, recipient, amount); } else { // default tax is 5% of every transfer uint256 taxAmount = amount * transferTaxRate/10000; uint256 burnAmount = taxAmount * burnRate/100; uint256 liquidityAmount = taxAmount - burnAmount; require(taxAmount == burnAmount + liquidityAmount, "GENESYS::transfer: Burn value invalid"); // default 95% of transfer sent to recipient uint256 sendAmount = amount - taxAmount; require(amount == sendAmount + taxAmount, "GENESYS::transfer: Tax value invalid"); super._transfer(sender, BURN_ADDRESS, burnAmount); super._transfer(sender, address(this), liquidityAmount); super._transfer(sender, recipient, sendAmount); } } /// @dev Swap and liquify function swapAndLiquify() private lockTheSwap transferTaxFree { uint256 contractTokenBalance = balanceOf(address(this)); if (contractTokenBalance >= minAmountToLiquify) { // only min amount to liquify uint256 liquifyAmount = contractTokenBalance; // split the liquify amount into halves uint256 half = liquifyAmount/2; uint256 otherHalf = liquifyAmount - half; // capture the contract's current ETH balance. // this is so that we can capture exactly the amount of ETH that the // swap creates, and not make the liquidity event include any ETH that // has been manually sent to the contract uint256 initialBalance = address(this).balance; // swap tokens for ETH swapTokensForEth(half); // how much ETH did we just swap into? uint256 newBalance = address(this).balance - initialBalance; // add liquidity addLiquidity(otherHalf, newBalance); emit SwapAndLiquify(half, newBalance, otherHalf); } } /// @dev Swap tokens for eth function swapTokensForEth(uint256 tokenAmount) private { // generate the GENESYSSwap pair path of token -> weth address[] memory path = new address[](2); path[0] = address(this); path[1] = genesysSwapRouter.WETH(); _approve(address(this), address(genesysSwapRouter), tokenAmount); // make the swap genesysSwapRouter.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, // accept any amount of ETH path, address(this), block.timestamp ); } /// @dev Add liquidity function addLiquidity(uint256 tokenAmount, uint256 ethAmount) private { // approve token transfer to cover all possible scenarios _approve(address(this), address(genesysSwapRouter), tokenAmount); // add the liquidity genesysSwapRouter.addLiquidityETH{value: ethAmount}( address(this), tokenAmount, 0, // slippage is unavoidable 0, // slippage is unavoidable address(BURN_ADDRESS), block.timestamp ); } // To receive AVAX from genesysSwapRouter when swapping receive() external payable {} /** * @dev Update the transfer tax rate. * Can only be called by the current operator. */ function updateTransferTaxRate(uint16 _transferTaxRate) public onlyOperator { require(_transferTaxRate <= MAXIMUM_TRANSFER_TAX_RATE, "GENESYS::updateTransferTaxRate: Transfer tax rate must not exceed the maximum rate."); emit TransferTaxRateUpdated(msg.sender, transferTaxRate, _transferTaxRate); transferTaxRate = _transferTaxRate; } /** * @dev Update the burn rate. * Can only be called by the current operator. */ function updateBurnRate(uint16 _burnRate) public onlyOperator { require(_burnRate <= 100, "GENESYS::updateBurnRate: Burn rate must not exceed the maximum rate."); emit BurnRateUpdated(msg.sender, burnRate, _burnRate); burnRate = _burnRate; } /** * @dev Update the min amount to liquify. * Can only be called by the current operator. */ function updateMinAmountToLiquify(uint256 _minAmount) public onlyOperator { emit MinAmountToLiquifyUpdated(msg.sender, minAmountToLiquify, _minAmount); minAmountToLiquify = _minAmount; } /** * @dev Update the swapAndLiquifyEnabled. * Can only be called by the current operator. */ function updateSwapAndLiquifyEnabled(bool _enabled) public onlyOperator { emit SwapAndLiquifyEnabledUpdated(msg.sender, _enabled); swapAndLiquifyEnabled = _enabled; } /** * @dev Update the swap router. * Can only be called by the current operator. */ function updategenesysSwapRouter(address _router) public onlyOwner { require(address(genesysSwapRouter) == address(0), "Router already set"); genesysSwapRouter = IUniswapV2Router02(_router); genesysSwapPair = IUniswapV2Factory(genesysSwapRouter.factory()).getPair(address(this), genesysSwapRouter.WETH()); require(genesysSwapPair != address(0), "GENESYS::updategenesysSwapRouter: Invalid pair address."); emit genesysSwapRouterUpdated(msg.sender, address(genesysSwapRouter), genesysSwapPair); } /** * @dev Returns the address of the current operator. */ function operator() public view returns (address) { return _operator; } /** * @dev Transfers operator of the contract to a new account (`newOperator`). * Can only be called by the current operator. */ function transferOperator(address newOperator) public onlyOperator { require(newOperator != address(0), "GENESYS::transferOperator: new operator is the zero address"); emit OperatorTransferred(_operator, newOperator); _operator = newOperator; } /** * @dev can retrive FTM dust that are stuck in the contract */ function withdrawStuckToken(address _token) public onlyOperator { require(_token != address(this), "GENESYS::Token address can't be this address"); uint256 amount = IERC20(_token).balanceOf(address(this)); IERC20(_token).safeTransfer(address(_operator), amount); } } 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; } } library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { return a + b; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { return a * b; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b <= a, errorMessage); return a - b; } } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a / b; } } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { unchecked { require(b > 0, errorMessage); return a % b; } } } // MasterChef is the master of DNA. He can make Dna and he is a fair guy. // // Note that it's ownable and the owner wields tremendous power. The ownership // will be transferred to a governance smart contract once DNA is sufficiently // distributed and the community can show to govern itself. // // Have fun reading it. Hopefully it's bug-free. God bless. contract Masterchef is Ownable, ReentrancyGuard { using SafeMath for uint256; using SafeERC20 for IERC20; // Info of each user. struct UserInfo { uint256 amount; // How many LP tokens the user has provided. uint256 rewardDebt; // Reward debt. See explanation below. uint256 rewardLockedUp; // Reward locked up. uint256 nextHarvestUntil; // When can the user harvest again. // // We do some fancy math here. Basically, any point in time, the amount of DNA // entitled to a user but is pending to be distributed is: // // pending reward = (user.amount * pool.accDnaPerShare) - user.rewardDebt // // Whenever a user deposits or withdraws LP tokens to a pool. Here's what happens: // 1. The pool's `accDnaPerShare` (and `lastRewardSecond`) gets updated. // 2. User receives the pending reward sent to his/her address. // 3. User's `amount` gets updated. // 4. User's `rewardDebt` gets updated. } // Info of each pool. struct PoolInfo { IERC20 lpToken; // Address of LP token contract. uint256 allocPoint; // How many allocation points assigned to this pool. uint256 lastRewardSecond; // Last second that DNAs distribution occurs. uint256 accDnaPerShare; // Accumulated DNAs per share, times 1e18. See below. uint16 depositFeeBP; // Deposit fee in basis points uint256 harvestInterval; // Harvest interval in seconds uint256 lpSupply; } // The DNA TOKEN! DNA public immutable dna; // Dev address. address public devaddr; // Deposit Fee address address public feeAddress; // Operator only allowed to set the Alloc Points address public _operator; // DNA tokens created per second. uint256 public dnaPerSecond; // Max harvest interval: 2 hours. uint256 public constant MAXIMUM_HARVEST_INTERVAL = 2 hours; // Info of each pool. PoolInfo[] public poolInfo; // Info of each user that stakes LP tokens. mapping(uint256 => mapping(address => UserInfo)) public userInfo; // Total allocation points. Must be the sum of all allocation points in all pools. uint256 public totalAllocPoint = 0; // The block timestamp when DNA farming starts. uint256 public startTime; // Maximum DnaPerTime uint256 public MAX_EMISSION_RATE = 0.02 ether; // Initial DnaPerTime uint256 public EMISSION_RATE = 0.0035 ether; event Deposit(address indexed user, uint256 indexed pid, uint256 amount); event Withdraw(address indexed user, uint256 indexed pid, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 indexed pid, uint256 amount); event SetFeeAddress(address indexed user, address indexed newAddress); event SetDevAddress(address indexed user, address indexed newAddress); event UpdateEmissionRate(address indexed user, uint256 dnaPerSecond); event RewardLockedUp(address indexed user, uint256 indexed pid, uint256 amountLockedUp); event addPool(uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 depositFeeBP, uint256 harvestInterval); event setPool(uint256 indexed pid, address lpToken, uint256 allocPoint, uint256 depositFeeBP, uint256 harvestInterval); event UpdateStartTime(uint256 newStartTime); event DnaMintError(bytes reason); modifier onlyOperator() { require(_operator == msg.sender, "operator: caller is not the operator"); _; } constructor( DNA _dna, address _devaddr, address _feeAddress, // uint256 _DnaPerTime, uint256 _startTime ) { dna = _dna; devaddr = _devaddr; feeAddress = _feeAddress; dnaPerSecond = EMISSION_RATE; startTime = _startTime; _operator = _devaddr; } function poolLength() external view returns (uint256) { return poolInfo.length; } mapping(IERC20 => bool) public poolExistence; modifier nonDuplicated(IERC20 _lpToken) { require(poolExistence[_lpToken] == false, "nonDuplicated: duplicated"); _; } function blockTimestamp() external view returns (uint time) { // to assist with countdowns on site time = block.timestamp; } function userPoolLockup(uint _pid, address _user) external view returns (uint256 lock) { UserInfo storage user = userInfo[_pid][_user]; lock = user.nextHarvestUntil <= block.timestamp ? 0 : user.nextHarvestUntil - block.timestamp; } function addInitialPools(IERC20 _DNAwFTMPair, IERC20 _DNAUSDCPair) external onlyOwner{ require(poolInfo.length == 0, "addInitialPools: Initial Pools has already been added"); add(3000, IERC20(_DNAUSDCPair), 0, 3600, false); // DNA-USDC 0 add(3000, IERC20(_DNAwFTMPair), 0, 3600, false); // DNA-wFTM 1 add(1500, IERC20(0x2b4C76d0dc16BE1C31D4C1DC53bF9B45987Fc75c), 400, 7200, false); // wFTM-USDC 2 add(1500, IERC20(0xf0702249F4D3A25cD3DED7859a165693685Ab577), 400, 7200, false); // wETH-wFTM 3 add(1500, IERC20(0xFdef392aDc84607135C24ca45DE5452d77aa10DE), 400, 7200, false); // USDC-fUSDT 4 add(1500, IERC20(0xEc7178F4C41f346b2721907F5cF7628E388A7a58), 400, 7200, false); // BOO-wFTM 5 add(2000, dna, 0, 3600, false); // DNA solo staking 6 add(1000, IERC20(0x04068DA6C83AFCFA0e13ba15A6696662335D5B75), 400, 7200, false); // USDC solo staking 7 add(1000, IERC20(0x21be370D5312f44cB42ce377BC9b8a0cEF1A4C83), 400, 7200, false); // wFTM solo staking 8 add(1000, IERC20(0x940F41F0ec9ba1A34CF001cc03347ac092F5F6B5), 400, 7200, false); // fUSDT solo staking 9 add(1000, IERC20(0x74b23882a30290451A17c44f4F05243b6b58C76d), 400, 7200, false); // wETH solo staking 10 add(1000, IERC20(0x321162Cd933E2Be498Cd2267a90534A804051b11), 400, 7200, false); // wBTC solo staking 11 add(1000, IERC20(0x8D11eC38a3EB5E956B052f67Da8Bdc9bef8Abf3E), 400, 7200, false); // DAI solo staking 12 add(1000, IERC20(0x841FAD6EAe12c286d1Fd18d1d525DFfA75C7EFFE), 400, 7200, false); // BOO solo staking 13 } function setAllocPoints(uint256 _pid, uint256 _allocPoint, bool _withUpdate) public onlyOperator { if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; } function setNextBoost() external onlyOperator { setAllocPoints(0, poolInfo[0].allocPoint + 1000, true); setAllocPoints(1, poolInfo[1].allocPoint + 1000, false); setAllocPoints(2, poolInfo[2].allocPoint + 250, false); setAllocPoints(3, poolInfo[3].allocPoint + 250, false); setAllocPoints(4, poolInfo[4].allocPoint + 250, false); setAllocPoints(5, poolInfo[5].allocPoint + 250, false); setAllocPoints(6, poolInfo[6].allocPoint + 900, false); setAllocPoints(7, poolInfo[7].allocPoint + 200, false); setAllocPoints(8, poolInfo[8].allocPoint + 200, false); setAllocPoints(9, poolInfo[9].allocPoint + 200, false); setAllocPoints(10, poolInfo[10].allocPoint + 200, false); setAllocPoints(11, poolInfo[11].allocPoint + 200, false); setAllocPoints(12, poolInfo[12].allocPoint + 200, false); setAllocPoints(13, poolInfo[13].allocPoint + 200, false); } // Add a new lp to the pool. Can only be called by the owner. function add(uint256 _allocPoint, IERC20 _lpToken, uint16 _depositFeeBP, uint256 _harvestInterval, bool _withUpdate) public onlyOwner nonDuplicated(_lpToken) { // valid ERC20 token require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "add: invalid harvest interval"); _lpToken.balanceOf(address(this)); require(_depositFeeBP <= 400, "add: invalid deposit fee basis points"); if (_withUpdate) { massUpdatePools(); } uint256 lastRewardSecond = block.timestamp > startTime ? block.timestamp : startTime; totalAllocPoint = totalAllocPoint.add(_allocPoint); poolExistence[_lpToken] = true; poolInfo.push( PoolInfo({ lpToken : _lpToken, allocPoint : _allocPoint, lastRewardSecond : lastRewardSecond, accDnaPerShare : 0, depositFeeBP : _depositFeeBP, harvestInterval: _harvestInterval, lpSupply: 0 }) ); emit addPool(poolInfo.length - 1, address(_lpToken), _allocPoint, _depositFeeBP, _harvestInterval); } // Update the given pool's DNA allocation point and deposit fee. Can only be called by the owner. function set(uint256 _pid, uint256 _allocPoint, uint16 _depositFeeBP, uint256 _harvestInterval, bool _withUpdate) external onlyOwner { require(_depositFeeBP <= 400, "set: invalid deposit fee basis points"); require(_harvestInterval <= MAXIMUM_HARVEST_INTERVAL, "set: invalid harvest interval"); if (_withUpdate) { massUpdatePools(); } totalAllocPoint = totalAllocPoint.sub(poolInfo[_pid].allocPoint).add(_allocPoint); poolInfo[_pid].allocPoint = _allocPoint; poolInfo[_pid].depositFeeBP = _depositFeeBP; poolInfo[_pid].harvestInterval = _harvestInterval; // * 1 HOURS LEVATO emit setPool(_pid, address(poolInfo[_pid].lpToken), _allocPoint, _depositFeeBP, _harvestInterval); } // Return reward multiplier over the given _from to _to block. function getMultiplier(uint256 _from, uint256 _to) public pure returns (uint256) { return _to.sub(_from); } // View function to see pending Dnas on frontend. function pendingDna(uint256 _pid, address _user) external view returns (uint256) { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][_user]; uint256 accDnaPerShare = pool.accDnaPerShare; if (block.timestamp > pool.lastRewardSecond && pool.lpSupply != 0 && totalAllocPoint > 0) { uint256 multiplier = getMultiplier(pool.lastRewardSecond, block.timestamp); uint256 dnaReward = multiplier.mul(dnaPerSecond).mul(pool.allocPoint).div(totalAllocPoint); if (dna.totalSupply().add(dnaReward) > dna.maxSupply()) { dnaReward = dna.maxSupply() - dna.totalSupply(); } accDnaPerShare = accDnaPerShare.add(dnaReward.mul(1e18).div(pool.lpSupply)); } uint256 pending = user.amount.mul(accDnaPerShare).div(1e18).sub(user.rewardDebt); return pending.add(user.rewardLockedUp); } function canHarvest(uint256 _pid, address _user) internal view returns (bool) { UserInfo storage user = userInfo[_pid][_user]; return block.timestamp >= user.nextHarvestUntil; } // Update reward variables for all pools. Be careful of gas spending! function massUpdatePools() public { uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { updatePool(pid); } } // Update reward variables of the given pool to be up-to-date. function updatePool(uint256 _pid) public { PoolInfo storage pool = poolInfo[_pid]; if (block.timestamp <= pool.lastRewardSecond) { return; } if (pool.lpSupply == 0 || pool.allocPoint == 0) { pool.lastRewardSecond = block.timestamp; return; } uint256 multiplier = getMultiplier(pool.lastRewardSecond, block.timestamp); uint256 dnaReward = multiplier.mul(dnaPerSecond).mul(pool.allocPoint).div(totalAllocPoint); uint256 devReward = dnaReward/10; uint256 totalRewards = dna.totalSupply() + devReward + dnaReward; if (totalRewards <= dna.maxSupply()) { // mint dev reward as normal as not at maxSupply dna.mint(devaddr, devReward); } else { // update dnaReward to difference dnaReward = dna.maxSupply() - dna.totalSupply(); } if (dnaReward != 0) { // only mint to MC and calculate and update accDnaPerShare if dnaReward is non 0 dna.mint(address(this), dnaReward); pool.accDnaPerShare = pool.accDnaPerShare + (dnaReward * 1e18 / pool.lpSupply); } pool.lastRewardSecond = block.timestamp; } // Deposit LP tokens to MasterChef for DNA allocation. function deposit(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; updatePool(_pid); payOrLockupPending(_pid); if (_amount > 0) { uint256 balanceBefore = pool.lpToken.balanceOf(address(this)); pool.lpToken.safeTransferFrom(address(msg.sender), address(this), _amount); _amount = pool.lpToken.balanceOf(address(this)) - balanceBefore; if (pool.depositFeeBP > 0) { uint256 depositFee = _amount.mul(pool.depositFeeBP).div(10000); pool.lpToken.safeTransfer(feeAddress, depositFee); user.amount = user.amount.add(_amount).sub(depositFee); pool.lpSupply = pool.lpSupply.add(_amount).sub(depositFee); } else { user.amount = user.amount.add(_amount); pool.lpSupply = pool.lpSupply.add(_amount); } } user.rewardDebt = user.amount.mul(pool.accDnaPerShare).div(1e18); emit Deposit(msg.sender, _pid, _amount); } // Withdraw LP tokens from MasterChef. function withdraw(uint256 _pid, uint256 _amount) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; require(user.amount >= _amount, "withdraw: not good"); updatePool(_pid); payOrLockupPending(_pid); if (_amount > 0) { user.amount = user.amount.sub(_amount); pool.lpToken.safeTransfer(address(msg.sender), _amount); pool.lpSupply = pool.lpSupply.sub(_amount); } user.rewardDebt = user.amount.mul(pool.accDnaPerShare).div(1e18); emit Withdraw(msg.sender, _pid, _amount); } // Withdraw without caring about rewards. EMERGENCY ONLY. function emergencyWithdraw(uint256 _pid) external nonReentrant { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; uint256 amount = user.amount; user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; user.nextHarvestUntil = 0; pool.lpToken.safeTransfer(address(msg.sender), amount); if (pool.lpSupply >= amount) { pool.lpSupply = pool.lpSupply.sub(amount); } else { pool.lpSupply = 0; } emit EmergencyWithdraw(msg.sender, _pid, amount); } function payOrLockupPending(uint256 _pid) internal { PoolInfo storage pool = poolInfo[_pid]; UserInfo storage user = userInfo[_pid][msg.sender]; if (user.nextHarvestUntil == 0) { user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); } uint256 pending = user.amount.mul(pool.accDnaPerShare).div(1e18).sub(user.rewardDebt); if (canHarvest(_pid, msg.sender)) { if (pending > 0 || user.rewardLockedUp > 0) { uint256 totalRewards = pending.add(user.rewardLockedUp); user.rewardLockedUp = 0; user.nextHarvestUntil = block.timestamp.add(pool.harvestInterval); safeDnaTransfer(msg.sender, totalRewards); } } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp.add(pending); emit RewardLockedUp(msg.sender, _pid, pending); } } // Safe test transfer function, just in case if rounding error causes pool to not have enough DNAs. function safeDnaTransfer(address _to, uint256 _amount) internal { uint256 dnaBal = dna.balanceOf(address(this)); bool transferSuccess = false; if (_amount > dnaBal) { transferSuccess = dna.transfer(_to, dnaBal); } else { transferSuccess = dna.transfer(_to, _amount); } require(transferSuccess, "safeDnaTransfer: transfer failed"); } // Update dev address. function setDevAddress(address _devaddr) external { require(msg.sender == devaddr, "dev: wut?"); require(_devaddr != address(0), "!nonzero"); devaddr = _devaddr; emit SetDevAddress(msg.sender, _devaddr); } function setFeeAddress(address _feeAddress) external { require(msg.sender == feeAddress, "setFeeAddress: FORBIDDEN"); require(_feeAddress != address(0), "!nonzero"); feeAddress = _feeAddress; emit SetFeeAddress(msg.sender, _feeAddress); } // Pancake has to add hidden dummy pools inorder to alter the emission, here we make it simple and transparent to all. function updateEmissionRate(uint256 _dnaPerSecond) external onlyOwner { require(_dnaPerSecond <= MAX_EMISSION_RATE, "Emmision Rate must no exceed max emission rate"); massUpdatePools(); dnaPerSecond = _dnaPerSecond; emit UpdateEmissionRate(msg.sender, _dnaPerSecond); } // Only update before start of farm function updateStartTime(uint256 _newStartTime) external onlyOwner { require(block.timestamp < startTime, "cannot change start time if farm has already started"); require(block.timestamp < _newStartTime, "cannot set start time in the past"); uint256 length = poolInfo.length; for (uint256 pid = 0; pid < length; ++pid) { PoolInfo storage pool = poolInfo[pid]; pool.lastRewardSecond = _newStartTime; } startTime = _newStartTime; emit UpdateStartTime(startTime); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract DNA","name":"_dna","type":"address"},{"internalType":"address","name":"_devaddr","type":"address"},{"internalType":"address","name":"_feeAddress","type":"address"},{"internalType":"uint256","name":"_startTime","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"reason","type":"bytes"}],"name":"DnaMintError","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountLockedUp","type":"uint256"}],"name":"RewardLockedUp","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetDevAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newAddress","type":"address"}],"name":"SetFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"dnaPerSecond","type":"uint256"}],"name":"UpdateEmissionRate","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newStartTime","type":"uint256"}],"name":"UpdateStartTime","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFeeBP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"}],"name":"addPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"pid","type":"uint256"},{"indexed":false,"internalType":"address","name":"lpToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"allocPoint","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"depositFeeBP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"harvestInterval","type":"uint256"}],"name":"setPool","type":"event"},{"inputs":[],"name":"EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAXIMUM_HARVEST_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EMISSION_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_operator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"contract IERC20","name":"_lpToken","type":"address"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"add","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_DNAwFTMPair","type":"address"},{"internalType":"contract IERC20","name":"_DNAUSDCPair","type":"address"}],"name":"addInitialPools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"blockTimestamp","outputs":[{"internalType":"uint256","name":"time","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"devaddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dna","outputs":[{"internalType":"contract DNA","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dnaPerSecond","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_from","type":"uint256"},{"internalType":"uint256","name":"_to","type":"uint256"}],"name":"getMultiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"massUpdatePools","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingDna","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"name":"poolExistence","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poolInfo","outputs":[{"internalType":"contract IERC20","name":"lpToken","type":"address"},{"internalType":"uint256","name":"allocPoint","type":"uint256"},{"internalType":"uint256","name":"lastRewardSecond","type":"uint256"},{"internalType":"uint256","name":"accDnaPerShare","type":"uint256"},{"internalType":"uint16","name":"depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"harvestInterval","type":"uint256"},{"internalType":"uint256","name":"lpSupply","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"uint16","name":"_depositFeeBP","type":"uint16"},{"internalType":"uint256","name":"_harvestInterval","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"set","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_allocPoint","type":"uint256"},{"internalType":"bool","name":"_withUpdate","type":"bool"}],"name":"setAllocPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_devaddr","type":"address"}],"name":"setDevAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeAddress","type":"address"}],"name":"setFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setNextBoost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAllocPoint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_dnaPerSecond","type":"uint256"}],"name":"updateEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"}],"name":"updatePool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newStartTime","type":"uint256"}],"name":"updateStartTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"},{"internalType":"uint256","name":"nextHarvestUntil","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"userPoolLockup","outputs":[{"internalType":"uint256","name":"lock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_pid","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052600060085566470de4df820000600a55660c6f3b40b6c000600b553480156200002c57600080fd5b5060405162002ff238038062002ff28339810160408190526200004f916200010f565b6200005a33620000bf565b6001805560609390931b6001600160601b031916608052600280546001600160a01b03199081166001600160a01b039485169081179092556003805482169390941692909217909255600b546005556009929092556004805490921617905562000182565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b600080600080608085870312156200012657600080fd5b8451620001338162000169565b6020860151909450620001468162000169565b6040860151909350620001598162000169565b6060959095015193969295505050565b6001600160a01b03811681146200017f57600080fd5b50565b60805160601c612def620002036000396000818161037a01528181610e5b01528181610f0201528181610fc001528181611025015281816110b60152818161117401528181611a2c01528181611fe0015281816120750152818161210c0152818161219d015281816125f6015281816126aa01526127530152612def6000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80637e9040901161011a578063c54aabae116100ad578063de73149d1161007c578063de73149d146104cb578063e2bbb158146104d4578063e98e81c7146104e7578063f16fe42e146104f0578063f2fde38b1461050357600080fd5b8063c54aabae1461045f578063cbd258b514610472578063d0d41fe1146104a5578063d49e77cd146104b857600080fd5b806393f1a40b116100e957806393f1a40b146103d3578063adb6183214610433578063af018de814610439578063b4fa212e1461044c57600080fd5b80637e904090146103755780638705fcd41461039c5780638da5cb5b146103af5780638dbb1e3a146103c057600080fd5b8063412753581161019d5780635312ea8e1161016c5780635312ea8e1461032b578063630b5ba11461033e57806370b0a8431461034657806373ace3371461035957806378e979251461036c57600080fd5b806341275358146102d1578063436cc3d6146102fc578063441a3e701461030557806351eb05a61461031857600080fd5b80631526fe27116101d95780631526fe271461025757806317caf6f1146102ad5780632143e545146102b6578063300ff05e146102c957600080fd5b806301b8199a1461020b57806306bcf02f14610227578063081e3eda1461023c5780630ba84cd214610244575b600080fd5b610214600b5481565b6040519081526020015b60405180910390f35b61023a610235366004612a76565b610516565b005b600654610214565b61023a610252366004612a76565b610697565b61026a610265366004612a76565b61076f565b604080516001600160a01b039098168852602088019690965294860193909352606085019190915261ffff16608084015260a083015260c082015260e00161021e565b61021460085481565b61023a6102c4366004612b85565b6107cc565b61023a610a15565b6003546102e4906001600160a01b031681565b6040516001600160a01b03909116815260200161021e565b610214600a5481565b61023a610313366004612b2a565b610c45565b61023a610326366004612a76565b610db1565b61023a610339366004612a76565b61121f565b61023a61131a565b6004546102e4906001600160a01b031681565b61023a610367366004612b4c565b611345565b61021460095481565b6102e47f000000000000000000000000000000000000000000000000000000000000000081565b61023a6103aa366004612a03565b6113cb565b6000546001600160a01b03166102e4565b6102146103ce366004612b2a565b6114b2565b6104136103e1366004612aa8565b600760209081526000928352604080842090915290825290208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161021e565b42610214565b61023a610447366004612acd565b6114c5565b61023a61045a366004612a3d565b6118c6565b61021461046d366004612aa8565b611b6f565b610495610480366004612a03565b600c6020526000908152604090205460ff1681565b604051901515815260200161021e565b61023a6104b3366004612a03565b611bbd565b6002546102e4906001600160a01b031681565b610214611c2081565b61023a6104e2366004612b2a565b611c90565b61021460055481565b6102146104fe366004612aa8565b611f2e565b61023a610511366004612a03565b6122b5565b6000546001600160a01b031633146105495760405162461bcd60e51b815260040161054090612c03565b60405180910390fd5b60095442106105b75760405162461bcd60e51b815260206004820152603460248201527f63616e6e6f74206368616e67652073746172742074696d65206966206661726d604482015273081a185cc8185b1c9958591e481cdd185c9d195960621b6064820152608401610540565b8042106106105760405162461bcd60e51b815260206004820152602160248201527f63616e6e6f74207365742073746172742074696d6520696e20746865207061736044820152601d60fa1b6064820152608401610540565b60065460005b8181101561065a5760006006828154811061063357610633612d80565b600091825260209091206002600790920201018490555061065381612d4f565b9050610616565b5060098290556040518281527fa09018266c541576eb124551c9c57c82a8129add3ba6777a5974b1d0e6252e999060200160405180910390a15050565b6000546001600160a01b031633146106c15760405162461bcd60e51b815260040161054090612c03565b600a5481111561072a5760405162461bcd60e51b815260206004820152602e60248201527f456d6d6973696f6e2052617465206d757374206e6f20657863656564206d617860448201526d20656d697373696f6e207261746560901b6064820152608401610540565b61073261131a565b600581905560405181815233907fe2492e003bbe8afa53088b406f0c1cb5d9e280370fc72a74cf116ffd343c40539060200160405180910390a250565b6006818154811061077f57600080fd5b600091825260209091206007909102018054600182015460028301546003840154600485015460058601546006909601546001600160a01b03909516965092949193909261ffff16919087565b6000546001600160a01b031633146107f65760405162461bcd60e51b815260040161054090612c03565b6101908361ffff16111561085a5760405162461bcd60e51b815260206004820152602560248201527f7365743a20696e76616c6964206465706f7369742066656520626173697320706044820152646f696e747360d81b6064820152608401610540565b611c208211156108ac5760405162461bcd60e51b815260206004820152601d60248201527f7365743a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610540565b80156108ba576108ba61131a565b6108fd846108f7600688815481106108d4576108d4612d80565b90600052602060002090600702016001015460085461235090919063ffffffff16565b9061235c565b600881905550836006868154811061091757610917612d80565b906000526020600020906007020160010181905550826006868154811061094057610940612d80565b906000526020600020906007020160040160006101000a81548161ffff021916908361ffff160217905550816006868154811061097f5761097f612d80565b906000526020600020906007020160050181905550847f36827d169b59bf0b4d3ab4bd61bbb4a14da7a393262ac5ac0f42f748a1ea9449600687815481106109c9576109c9612d80565b60009182526020918290206007919091020154604080516001600160a01b03909216825291810188905261ffff8716818301526060810186905290519081900360800190a25050505050565b6004546001600160a01b03163314610a3f5760405162461bcd60e51b815260040161054090612c38565b610a7e60006006600081548110610a5857610a58612d80565b9060005260206000209060070201600101546103e8610a779190612cb3565b6001611345565b610abd60016006600181548110610a9757610a97612d80565b9060005260206000209060070201600101546103e8610ab69190612cb3565b6000611345565b610af460026006600281548110610ad657610ad6612d80565b90600052602060002090600702016001015460fa610ab69190612cb3565b610b0d60036006600381548110610ad657610ad6612d80565b610b2660046006600481548110610ad657610ad6612d80565b610b3f60056006600581548110610ad657610ad6612d80565b610b76600680600681548110610b5757610b57612d80565b906000526020600020906007020160010154610384610ab69190612cb3565b610bad60076006600781548110610b8f57610b8f612d80565b90600052602060002090600702016001015460c8610ab69190612cb3565b610bc660086006600881548110610b8f57610b8f612d80565b610bdf60096006600981548110610b8f57610b8f612d80565b610bf8600a6006600a81548110610b8f57610b8f612d80565b610c11600b6006600b81548110610b8f57610b8f612d80565b610c2a600c6006600c81548110610b8f57610b8f612d80565b610c43600d6006600d81548110610b8f57610b8f612d80565b565b60026001541415610c685760405162461bcd60e51b815260040161054090612c7c565b6002600181905550600060068381548110610c8557610c85612d80565b6000918252602080832086845260078083526040808620338752909352919093208054929091029092019250831115610cf55760405162461bcd60e51b81526020600482015260126024820152711dda5d1a191c985dce881b9bdd0819dbdbd960721b6044820152606401610540565b610cfe84610db1565b610d0784612368565b8215610d46578054610d199084612350565b81558154610d31906001600160a01b031633856124d6565b6006820154610d409084612350565b60068301555b60038201548154610d6a91670de0b6b3a764000091610d649161253e565b9061254a565b6001820155604051838152849033907ff279e6a1f5e320cca91135676d9cb6e44ca8a08c0b88342bcdb1144f6511b568906020015b60405180910390a35050600180555050565b600060068281548110610dc657610dc6612d80565b9060005260206000209060070201905080600201544211610de5575050565b60068101541580610df857506001810154155b15610e07574260029091015550565b6000610e178260020154426114b2565b90506000610e44600854610d648560010154610e3e6005548761253e90919063ffffffff16565b9061253e565b90506000610e53600a83612ccb565b9050600082827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b158015610eb257600080fd5b505afa158015610ec6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610eea9190612a8f565b610ef49190612cb3565b610efe9190612cb3565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b158015610f5957600080fd5b505afa158015610f6d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f919190612a8f565b8111611023576002546040516340c10f1960e01b81526001600160a01b039182166004820152602481018490527f0000000000000000000000000000000000000000000000000000000000000000909116906340c10f1990604401600060405180830381600087803b15801561100657600080fd5b505af115801561101a573d6000803e3d6000fd5b50505050611152565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561107c57600080fd5b505afa158015611090573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110b49190612a8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561110d57600080fd5b505afa158015611121573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111459190612a8f565b61114f9190612d0c565b92505b821561120e576040516340c10f1960e01b8152306004820152602481018490527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b1580156111c057600080fd5b505af11580156111d4573d6000803e3d6000fd5b5050505060068501546111ef84670de0b6b3a7640000612ced565b6111f99190612ccb565b85600301546112089190612cb3565b60038601555b428560020181905550505050505050565b600260015414156112425760405162461bcd60e51b815260040161054090612c7c565b600260018190555060006006828154811061125f5761125f612d80565b6000918252602080832085845260078083526040808620338088529452852080548682556001820187905560028201879055600382019690965593020180549094509192916112ba916001600160a01b0390911690836124d6565b808360060154106112de5760068301546112d49082612350565b60068401556112e6565b600060068401555b604051818152849033907fbb757047c2b5f3974fe26b7c10f732e7bce710b0952a71082702781e62ae059590602001610d9f565b60065460005b818110156113415761133181610db1565b61133a81612d4f565b9050611320565b5050565b6004546001600160a01b0316331461136f5760405162461bcd60e51b815260040161054090612c38565b801561137d5761137d61131a565b611397826108f7600686815481106108d4576108d4612d80565b60088190555081600684815481106113b1576113b1612d80565b906000526020600020906007020160010181905550505050565b6003546001600160a01b031633146114255760405162461bcd60e51b815260206004820152601860248201527f736574466565416464726573733a20464f5242494444454e00000000000000006044820152606401610540565b6001600160a01b0381166114665760405162461bcd60e51b8152602060048201526008602482015267216e6f6e7a65726f60c01b6044820152606401610540565b600380546001600160a01b0319166001600160a01b03831690811790915560405133907fd44190acf9d04bdb5d3a1aafff7e6dee8b40b93dfb8c5d3f0eea4b9f4539c3f790600090a350565b60006114be8284612350565b9392505050565b6000546001600160a01b031633146114ef5760405162461bcd60e51b815260040161054090612c03565b6001600160a01b0384166000908152600c6020526040902054849060ff161561155a5760405162461bcd60e51b815260206004820152601960248201527f6e6f6e4475706c6963617465643a206475706c696361746564000000000000006044820152606401610540565b611c208311156115ac5760405162461bcd60e51b815260206004820152601d60248201527f6164643a20696e76616c6964206861727665737420696e74657276616c0000006044820152606401610540565b6040516370a0823160e01b81523060048201526001600160a01b038616906370a082319060240160206040518083038186803b1580156115eb57600080fd5b505afa1580156115ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116239190612a8f565b506101908461ffff1611156116885760405162461bcd60e51b815260206004820152602560248201527f6164643a20696e76616c6964206465706f7369742066656520626173697320706044820152646f696e747360d81b6064820152608401610540565b81156116965761169661131a565b600060095442116116a9576009546116ab565b425b6008549091506116bb908861235c565b6008556001600160a01b038681166000818152600c602090815260408083208054600160ff199091168117909155815160e0810183529485529184018c81529084018681526060850184815261ffff8c81166080880190815260a088018d815260c0890188815260068054808a0182559981905299517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f6007909a02998a0180546001600160a01b03191691909c1617909a5594517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4088015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4187015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4286015590517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d438501805461ffff191691909216179055517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d4483015592517ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d45909101555461186a9190612d0c565b604080516001600160a01b0389168152602081018a905261ffff8816818301526060810187905290517fc41fe02d8a75a569360eea2c70ee580feedf237d973b8e23e8dbd5cb57d2df2d9181900360800190a250505050505050565b6000546001600160a01b031633146118f05760405162461bcd60e51b815260040161054090612c03565b6006541561195e5760405162461bcd60e51b815260206004820152603560248201527f616464496e697469616c506f6f6c733a20496e697469616c20506f6f6c732068604482015274185cc8185b1c9958591e481899595b881859191959605a1b6064820152608401610540565b611971610bb8826000610e1060006114c5565b611984610bb8836000610e1060006114c5565b6119ac6105dc732b4c76d0dc16be1c31d4c1dc53bf9b45987fc75c610190611c2060006114c5565b6119d46105dc73f0702249f4d3a25cd3ded7859a165693685ab577610190611c2060006114c5565b6119fc6105dc73fdef392adc84607135c24ca45de5452d77aa10de610190611c2060006114c5565b611a246105dc73ec7178f4c41f346b2721907f5cf7628e388a7a58610190611c2060006114c5565b611a576107d07f00000000000000000000000000000000000000000000000000000000000000006000610e1060006114c5565b611a7f6103e87304068da6c83afcfa0e13ba15a6696662335d5b75610190611c2060006114c5565b611aa76103e87321be370d5312f44cb42ce377bc9b8a0cef1a4c83610190611c2060006114c5565b611acf6103e873940f41f0ec9ba1a34cf001cc03347ac092f5f6b5610190611c2060006114c5565b611af76103e87374b23882a30290451a17c44f4f05243b6b58c76d610190611c2060006114c5565b611b1f6103e873321162cd933e2be498cd2267a90534a804051b11610190611c2060006114c5565b611b476103e8738d11ec38a3eb5e956b052f67da8bdc9bef8abf3e610190611c2060006114c5565b6113416103e873841fad6eae12c286d1fd18d1d525dffa75c7effe610190611c2060006114c5565b60008281526007602090815260408083206001600160a01b038516845290915281206003810154421015611bb257428160030154611bad9190612d0c565b611bb5565b60005b949350505050565b6002546001600160a01b03163314611c035760405162461bcd60e51b81526020600482015260096024820152686465763a207775743f60b81b6044820152606401610540565b6001600160a01b038116611c445760405162461bcd60e51b8152602060048201526008602482015267216e6f6e7a65726f60c01b6044820152606401610540565b600280546001600160a01b0319166001600160a01b03831690811790915560405133907f618c54559e94f1499a808aad71ee8729f8e74e8c48e979616328ce493a1a52e790600090a350565b60026001541415611cb35760405162461bcd60e51b815260040161054090612c7c565b6002600181905550600060068381548110611cd057611cd0612d80565b60009182526020808320868452600780835260408086203387529093529190932091029091019150611d0184610db1565b611d0a84612368565b8215611ed75781546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a082319060240160206040518083038186803b158015611d5357600080fd5b505afa158015611d67573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d8b9190612a8f565b8354909150611da5906001600160a01b0316333087612556565b82546040516370a0823160e01b815230600482015282916001600160a01b0316906370a082319060240160206040518083038186803b158015611de757600080fd5b505afa158015611dfb573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e1f9190612a8f565b611e299190612d0c565b600484015490945061ffff1615611eb2576004830154600090611e599061271090610d6490889061ffff1661253e565b6003548554919250611e78916001600160a01b039081169116836124d6565b8254611e90908290611e8a908861235c565b90612350565b83556006840154611ea7908290611e8a908861235c565b600685015550611ed5565b8154611ebe908561235c565b82556006830154611ecf908561235c565b60068401555b505b60038201548154611ef591670de0b6b3a764000091610d649161253e565b6001820155604051838152849033907f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a1590602001610d9f565b60008060068481548110611f4457611f44612d80565b60009182526020808320878452600780835260408086206001600160a01b038a168752909352919093209102909101600381015460028201549193509042118015611f925750600683015415155b8015611fa057506000600854115b15612264576000611fb58460020154426114b2565b90506000611fdc600854610d648760010154610e3e6005548761253e90919063ffffffff16565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b15801561203757600080fd5b505afa15801561204b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061206f9190612a8f565b612104827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b1580156120cc57600080fd5b505afa1580156120e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108f79190612a8f565b1115612239577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b815260040160206040518083038186803b15801561216357600080fd5b505afa158015612177573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061219b9190612a8f565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d5abeb016040518163ffffffff1660e01b815260040160206040518083038186803b1580156121f457600080fd5b505afa158015612208573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061222c9190612a8f565b6122369190612d0c565b90505b600685015461225f9061225890610d6484670de0b6b3a764000061253e565b849061235c565b925050505b60006122918360010154611e8a670de0b6b3a7640000610d6486886000015461253e90919063ffffffff16565b90506122aa83600201548261235c90919063ffffffff16565b979650505050505050565b6000546001600160a01b031633146122df5760405162461bcd60e51b815260040161054090612c03565b6001600160a01b0381166123445760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610540565b61234d8161258e565b50565b60006114be8284612d0c565b60006114be8284612cb3565b60006006828154811061237d5761237d612d80565b60009182526020808320858452600780835260408086203387529093529190932060038101549290910290920192506123c65760058201546123c090429061235c565b60038201555b60006123f78260010154611e8a670de0b6b3a7640000610d648760030154876000015461253e90919063ffffffff16565b6000858152600760209081526040808320338452909152902060030154909150421061247e576000811180612430575060008260020154115b1561247957600061244e83600201548361235c90919063ffffffff16565b60006002850155600585015490915061246890429061235c565b600384015561247733826125de565b505b6124d0565b80156124d0576002820154612493908261235c565b6002830155604051818152849033907fee470483107f579a55c754fa00613c45a9a3b617a418b39cb0be97e5381ba7c19060200160405180910390a35b50505050565b6040516001600160a01b03831660248201526044810182905261253990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b03199093169290921790915261281f565b505050565b60006114be8284612ced565b60006114be8284612ccb565b6040516001600160a01b03808516602483015283166044820152606481018290526124d09085906323b872dd60e01b90608401612502565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a082319060240160206040518083038186803b15801561264057600080fd5b505afa158015612654573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126789190612a8f565b905060008183111561272d5760405163a9059cbb60e01b81526001600160a01b038581166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b1580156126ee57600080fd5b505af1158015612702573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127269190612a20565b90506127d2565b60405163a9059cbb60e01b81526001600160a01b038581166004830152602482018590527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90604401602060405180830381600087803b15801561279757600080fd5b505af11580156127ab573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127cf9190612a20565b90505b806124d05760405162461bcd60e51b815260206004820181905260248201527f73616665446e615472616e736665723a207472616e73666572206661696c65646044820152606401610540565b6000612874826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166128f19092919063ffffffff16565b80519091501561253957808060200190518101906128929190612a20565b6125395760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610540565b6060611bb5848460008585843b61294a5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610540565b600080866001600160a01b031685876040516129669190612bb4565b60006040518083038185875af1925050503d80600081146129a3576040519150601f19603f3d011682016040523d82523d6000602084013e6129a8565b606091505b50915091506122aa828286606083156129c25750816114be565b8251156129d25782518084602001fd5b8160405162461bcd60e51b81526004016105409190612bd0565b803561ffff811681146129fe57600080fd5b919050565b600060208284031215612a1557600080fd5b81356114be81612d96565b600060208284031215612a3257600080fd5b81516114be81612dab565b60008060408385031215612a5057600080fd5b8235612a5b81612d96565b91506020830135612a6b81612d96565b809150509250929050565b600060208284031215612a8857600080fd5b5035919050565b600060208284031215612aa157600080fd5b5051919050565b60008060408385031215612abb57600080fd5b823591506020830135612a6b81612d96565b600080600080600060a08688031215612ae557600080fd5b853594506020860135612af781612d96565b9350612b05604087016129ec565b9250606086013591506080860135612b1c81612dab565b809150509295509295909350565b60008060408385031215612b3d57600080fd5b50508035926020909101359150565b600080600060608486031215612b6157600080fd5b83359250602084013591506040840135612b7a81612dab565b809150509250925092565b600080600080600060a08688031215612b9d57600080fd5b8535945060208601359350612b05604087016129ec565b60008251612bc6818460208701612d23565b9190910192915050565b6020815260008251806020840152612bef816040850160208701612d23565b601f01601f19169190910160400192915050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f6f70657261746f723a2063616c6c6572206973206e6f7420746865206f70657260408201526330ba37b960e11b606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60008219821115612cc657612cc6612d6a565b500190565b600082612ce857634e487b7160e01b600052601260045260246000fd5b500490565b6000816000190483118215151615612d0757612d07612d6a565b500290565b600082821015612d1e57612d1e612d6a565b500390565b60005b83811015612d3e578181015183820152602001612d26565b838111156124d05750506000910152565b6000600019821415612d6357612d63612d6a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038116811461234d57600080fd5b801515811461234d57600080fdfea264697066735822122022850f4c2a28963e6378755cbda86048ffac551a36977544cd8b24e12bd196aa64736f6c63430008070033000000000000000000000000f8b234a1ce59991006930de8b0525f90139827460000000000000000000000009a9205be64b7da379db034bb0d360048f92dba520000000000000000000000009a9205be64b7da379db034bb0d360048f92dba520000000000000000000000000000000000000000000000000000000061b8e9b0
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f8b234a1ce59991006930de8b0525f90139827460000000000000000000000009a9205be64b7da379db034bb0d360048f92dba520000000000000000000000009a9205be64b7da379db034bb0d360048f92dba520000000000000000000000000000000000000000000000000000000061b8e9b0
-----Decoded View---------------
Arg [0] : _dna (address): 0xf8b234a1ce59991006930de8b0525f9013982746
Arg [1] : _devaddr (address): 0x9a9205be64b7da379db034bb0d360048f92dba52
Arg [2] : _feeAddress (address): 0x9a9205be64b7da379db034bb0d360048f92dba52
Arg [3] : _startTime (uint256): 1639508400
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000f8b234a1ce59991006930de8b0525f9013982746
Arg [1] : 0000000000000000000000009a9205be64b7da379db034bb0d360048f92dba52
Arg [2] : 0000000000000000000000009a9205be64b7da379db034bb0d360048f92dba52
Arg [3] : 0000000000000000000000000000000000000000000000000000000061b8e9b0
Deployed ByteCode Sourcemap
56092:18670:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58649:43;;;;;;;;;15018:25:1;;;15006:2;14991:18;58649:43:0;;;;;;;;74201:558;;;;;;:::i;:::-;;:::i;:::-;;60108:95;60180:8;:15;60108:95;;73842:310;;;;;;:::i;:::-;;:::i;58174:26::-;;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;6181:32:1;;;6163:51;;6245:2;6230:18;;6223:34;;;;6273:18;;;6266:34;;;;6331:2;6316:18;;6309:34;;;;6392:6;6380:19;6374:3;6359:19;;6352:48;6201:3;6416:19;;6409:35;6475:3;6460:19;;6453:35;6150:3;6135:19;58174:26:0;5835:659:1;58415:34:0;;;;;;65175:776;;;;;;:::i;:::-;;:::i;62786:1029::-;;;:::i;57853:25::-;;;;;-1:-1:-1;;;;;57853:25:0;;;;;;-1:-1:-1;;;;;4278:32:1;;;4260:51;;4248:2;4233:18;57853:25:0;4114:203:1;58570:45:0;;;;;;70246:670;;;;;;:::i;:::-;;:::i;67700:1259::-;;;;;;:::i;:::-;;:::i;70987:632::-;;;;;;:::i;:::-;;:::i;67444:180::-;;;:::i;57939:24::-;;;;;-1:-1:-1;;;;;57939:24:0;;;62460:318;;;;;;:::i;:::-;;:::i;58509:24::-;;;;;;57744;;;;;73431:279;;;;;;:::i;:::-;;:::i;9977:87::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;9977:87;;66027:121;;;;;;:::i;:::-;;:::i;58256:64::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15285:25:1;;;15341:2;15326:18;;15319:34;;;;15369:18;;;15362:34;15427:2;15412:18;;15405:34;15272:3;15257:19;58256:64:0;15054:391:1;60415:138:0;60530:15;60415:138;;63890:1174;;;;;;:::i;:::-;;:::i;60832:1620::-;;;;;;:::i;:::-;;:::i;60565:255::-;;;;;;:::i;:::-;;:::i;60211:44::-;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5580:14:1;;5573:22;5555:41;;5543:2;5528:18;60211:44:0;5415:187:1;73175:248:0;;;;;;:::i;:::-;;:::i;57796:22::-;;;;;-1:-1:-1;;;;;57796:22:0;;;58082:58;;58133:7;58082:58;;69031:1163;;;;;;:::i;:::-;;:::i;58009:27::-;;;;;;66211:938;;;;;;:::i;:::-;;:::i;10432:201::-;;;;;;:::i;:::-;;:::i;74201:558::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;;;;;;;;;74305:9:::1;;74287:15;:27;74279:92;;;::::0;-1:-1:-1;;;74279:92:0;;9742:2:1;74279:92:0::1;::::0;::::1;9724:21:1::0;9781:2;9761:18;;;9754:30;9820:34;9800:18;;;9793:62;-1:-1:-1;;;9871:18:1;;;9864:50;9931:19;;74279:92:0::1;9540:416:1::0;74279:92:0::1;74408:13;74390:15;:31;74382:77;;;::::0;-1:-1:-1;;;74382:77:0;;8667:2:1;74382:77:0::1;::::0;::::1;8649:21:1::0;8706:2;8686:18;;;8679:30;8745:34;8725:18;;;8718:62;-1:-1:-1;;;8796:18:1;;;8789:31;8837:19;;74382:77:0::1;8465:397:1::0;74382:77:0::1;74487:8;:15:::0;74470:14:::1;74513:159;74541:6;74535:3;:12;74513:159;;;74571:21;74595:8;74604:3;74595:13;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;74623:21:::1;74595:13;::::0;;::::1;;74623:21;:37:::0;;;-1:-1:-1;74549:5:0::1;::::0;::::1;:::i;:::-;;;74513:159;;;-1:-1:-1::0;74682:9:0::1;:25:::0;;;74725:26:::1;::::0;15018:25:1;;;74725:26:0::1;::::0;15006:2:1;14991:18;74725:26:0::1;;;;;;;74268:491;74201:558:::0;:::o;73842:310::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;73948:17:::1;;73931:13;:34;;73923:93;;;::::0;-1:-1:-1;;;73923:93:0;;10930:2:1;73923:93:0::1;::::0;::::1;10912:21:1::0;10969:2;10949:18;;;10942:30;11008:34;10988:18;;;10981:62;-1:-1:-1;;;11059:18:1;;;11052:44;11113:19;;73923:93:0::1;10728:410:1::0;73923:93:0::1;74027:17;:15;:17::i;:::-;74055:12;:28:::0;;;74099:45:::1;::::0;15018:25:1;;;74118:10:0::1;::::0;74099:45:::1;::::0;15006:2:1;14991:18;74099:45:0::1;;;;;;;73842:310:::0;:::o;58174:26::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;58174:26:0;;;;-1:-1:-1;58174:26:0;;;;;;;;;;;:::o;65175:776::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;65344:3:::1;65327:13;:20;;;;65319:70;;;::::0;-1:-1:-1;;;65319:70:0;;10163:2:1;65319:70:0::1;::::0;::::1;10145:21:1::0;10202:2;10182:18;;;10175:30;10241:34;10221:18;;;10214:62;-1:-1:-1;;;10292:18:1;;;10285:35;10337:19;;65319:70:0::1;9961:401:1::0;65319:70:0::1;58133:7;65408:16;:44;;65400:86;;;::::0;-1:-1:-1;;;65400:86:0;;11345:2:1;65400:86:0::1;::::0;::::1;11327:21:1::0;11384:2;11364:18;;;11357:30;11423:31;11403:18;;;11396:59;11472:18;;65400:86:0::1;11143:353:1::0;65400:86:0::1;65501:11;65497:61;;;65529:17;:15;:17::i;:::-;65586:63;65637:11;65586:46;65606:8;65615:4;65606:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;;65586:15;;:19;;:46;;;;:::i;:::-;:50:::0;::::1;:63::i;:::-;65568:15;:81;;;;65688:11;65660:8;65669:4;65660:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;65740:13;65710:8;65719:4;65710:14;;;;;;;;:::i;:::-;;;;;;;;;;;:27;;;:43;;;;;;;;;;;;;;;;;;65797:16;65764:8;65773:4;65764:14;;;;;;;;:::i;:::-;;;;;;;;;;;:30;;:49;;;;65859:4;65851:92;65873:8;65882:4;65873:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;::::1;::::0;;;::::1;;:22:::0;65851:92:::1;::::0;;-1:-1:-1;;;;;65873:22:0;;::::1;5211:51:1::0;;5278:18;;;5271:34;;;5353:6;5341:19;;5321:18;;;5314:47;5392:2;5377:18;;5370:34;;;65851:92:0;;;;;;5198:3:1;65851:92:0;;::::1;65175:776:::0;;;;;:::o;62786:1029::-;59656:9;;-1:-1:-1;;;;;59656:9:0;59669:10;59656:23;59648:72;;;;-1:-1:-1;;;59648:72:0;;;;;;;:::i;:::-;62847:54:::1;62862:1;62865:8;62874:1;62865:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;62890:4;62865:29;;;;:::i;:::-;62896:4;62847:14;:54::i;:::-;62916:55;62931:1;62934:8;62943:1;62934:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;62959:4;62934:29;;;;:::i;:::-;62965:5;62916:14;:55::i;:::-;62986:54;63001:1;63004:8;63013:1;63004:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;63029:3;63004:28;;;;:::i;62986:54::-;63055;63070:1;63073:8;63082:1;63073:11;;;;;;;;:::i;63055:54::-;63124;63139:1;63142:8;63151:1;63142:11;;;;;;;;:::i;63124:54::-;63193;63208:1;63211:8;63220:1;63211:11;;;;;;;;:::i;63193:54::-;63262;63277:1;63280:8:::0;63289:1:::1;63280:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;63305:3;63280:28;;;;:::i;63262:54::-;63331;63346:1;63349:8;63358:1;63349:11;;;;;;;;:::i;:::-;;;;;;;;;;;:22;;;63374:3;63349:28;;;;:::i;63331:54::-;63400;63415:1;63418:8;63427:1;63418:11;;;;;;;;:::i;63400:54::-;63469;63484:1;63487:8;63496:1;63487:11;;;;;;;;:::i;63469:54::-;63538:56;63553:2;63557:8;63566:2;63557:12;;;;;;;;:::i;63538:56::-;63609;63624:2;63628:8;63637:2;63628:12;;;;;;;;:::i;63609:56::-;63680;63695:2;63699:8;63708:2;63699:12;;;;;;;;:::i;63680:56::-;63751;63766:2;63770:8;63779:2;63770:12;;;;;;;;:::i;63751:56::-;62786:1029::o:0;70246:670::-;48264:1;48860:7;;:19;;48852:63;;;;-1:-1:-1;;;48852:63:0;;;;;;;:::i;:::-;48264:1;48993:7;:18;;;;70328:21:::1;70352:8;70361:4;70352:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;70401;;;70352::::1;70401::::0;;;;;;;70416:10:::1;70401:26:::0;;;;;;;;;70446:11;;70352:14;;;::::1;::::0;;::::1;::::0;-1:-1:-1;;;70446:22:0::1;70438:53;;;::::0;-1:-1:-1;;;70438:53:0;;12888:2:1;70438:53:0::1;::::0;::::1;12870:21:1::0;12927:2;12907:18;;;12900:30;-1:-1:-1;;;12946:18:1;;;12939:48;13004:18;;70438:53:0::1;12686:342:1::0;70438:53:0::1;70502:16;70513:4;70502:10;:16::i;:::-;70529:24;70548:4;70529:18;:24::i;:::-;70578:11:::0;;70574:209:::1;;70620:11:::0;;:24:::1;::::0;70636:7;70620:15:::1;:24::i;:::-;70606:38:::0;;70659:12;;:55:::1;::::0;-1:-1:-1;;;;;70659:12:0::1;70693:10;70706:7:::0;70659:25:::1;:55::i;:::-;70745:13;::::0;::::1;::::0;:26:::1;::::0;70763:7;70745:17:::1;:26::i;:::-;70729:13;::::0;::::1;:42:::0;70574:209:::1;70827:19;::::0;::::1;::::0;70811:11;;:46:::1;::::0;70852:4:::1;::::0;70811:36:::1;::::0;:15:::1;:36::i;:::-;:40:::0;::::1;:46::i;:::-;70793:15;::::0;::::1;:64:::0;70873:35:::1;::::0;15018:25:1;;;70894:4:0;;70882:10:::1;::::0;70873:35:::1;::::0;15006:2:1;14991:18;70873:35:0::1;;;;;;;;-1:-1:-1::0;;48220:1:0;49172:22;;-1:-1:-1;;70246:670:0:o;67700:1259::-;67752:21;67776:8;67785:4;67776:14;;;;;;;;:::i;:::-;;;;;;;;;;;67752:38;;67824:4;:21;;;67805:15;:40;67801:79;;67862:7;67700:1259;:::o;67801:79::-;67894:13;;;;:18;;:42;;-1:-1:-1;67916:15:0;;;;:20;67894:42;67890:135;;;67977:15;67953:21;;;;:39;-1:-1:-1;67700:1259:0:o;67890:135::-;68035:18;68056:53;68070:4;:21;;;68093:15;68056:13;:53::i;:::-;68035:74;;68120:17;68140:70;68194:15;;68140:49;68173:4;:15;;;68140:28;68155:12;;68140:10;:14;;:28;;;;:::i;:::-;:32;;:49::i;:70::-;68120:90;-1:-1:-1;68221:17:0;68241:12;68251:2;68120:90;68241:12;:::i;:::-;68221:32;;68264:20;68319:9;68307;68287:3;-1:-1:-1;;;;;68287:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:29;;;;:::i;:::-;:41;;;;:::i;:::-;68264:64;;68361:3;-1:-1:-1;;;;;68361:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68345:12;:31;68341:281;;68464:7;;68455:28;;-1:-1:-1;;;68455:28:0;;-1:-1:-1;;;;;68464:7:0;;;68455:28;;;4876:51:1;4943:18;;;4936:34;;;68455:3:0;:8;;;;;;4849:18:1;;68455:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68341:281;;;68593:3;-1:-1:-1;;;;;68593:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68575:3;-1:-1:-1;;;;;68575:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;;:::i;:::-;68563:47;;68341:281;68638:14;;68634:268;;68763:34;;-1:-1:-1;;;68763:34:0;;68780:4;68763:34;;;4876:51:1;4943:18;;;4936:34;;;68763:3:0;-1:-1:-1;;;;;68763:8:0;;;;4849:18:1;;68763:34:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;68876:13:0;;;;68857:16;:9;68869:4;68857:16;:::i;:::-;:32;;;;:::i;:::-;68834:4;:19;;;:56;;;;:::i;:::-;68812:19;;;:78;68634:268;68936:15;68912:4;:21;;:39;;;;67741:1218;;;;;67700:1259;:::o;70987:632::-;48264:1;48860:7;;:19;;48852:63;;;;-1:-1:-1;;;48852:63:0;;;;;;;:::i;:::-;48264:1;48993:7;:18;;;;71061:21:::1;71085:8;71094:4;71085:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;71134;;;71085::::1;71134::::0;;;;;;;71149:10:::1;71134:26:::0;;;;;;;71188:11;;71210:15;;;-1:-1:-1;71236:15:0;::::1;:19:::0;;;71266::::1;::::0;::::1;:23:::0;;;71300:21:::1;::::0;::::1;:25:::0;;;;71085:14;::::1;;71336:12:::0;;71085:14;;-1:-1:-1;71134:26:0;;71188:11;71336:54:::1;::::0;-1:-1:-1;;;;;71336:12:0;;::::1;::::0;71188:11;71336:25:::1;:54::i;:::-;71425:6;71407:4;:13;;;:24;71403:148;;71464:13;::::0;::::1;::::0;:25:::1;::::0;71482:6;71464:17:::1;:25::i;:::-;71448:13;::::0;::::1;:41:::0;71403:148:::1;;;71538:1;71522:13;::::0;::::1;:17:::0;71403:148:::1;71568:43;::::0;15018:25:1;;;71598:4:0;;71586:10:::1;::::0;71568:43:::1;::::0;15006:2:1;14991:18;71568:43:0::1;14872:177:1::0;67444:180:0;67506:8;:15;67489:14;67532:85;67560:6;67554:3;:12;67532:85;;;67590:15;67601:3;67590:10;:15::i;:::-;67568:5;;;:::i;:::-;;;67532:85;;;;67478:146;67444:180::o;62460:318::-;59656:9;;-1:-1:-1;;;;;59656:9:0;59669:10;59656:23;59648:72;;;;-1:-1:-1;;;59648:72:0;;;;;;;:::i;:::-;62572:11:::1;62568:61;;;62600:17;:15;:17::i;:::-;62657:63;62708:11;62657:46;62677:8;62686:4;62677:14;;;;;;;;:::i;62657:63::-;62639:15;:81;;;;62759:11;62731:8;62740:4;62731:14;;;;;;;;:::i;:::-;;;;;;;;;;;:25;;:39;;;;62460:318:::0;;;:::o;73431:279::-;73517:10;;-1:-1:-1;;;;;73517:10:0;73503;:24;73495:61;;;;-1:-1:-1;;;73495:61:0;;13589:2:1;73495:61:0;;;13571:21:1;13628:2;13608:18;;;13601:30;13667:26;13647:18;;;13640:54;13711:18;;73495:61:0;13387:348:1;73495:61:0;-1:-1:-1;;;;;73575:25:0;;73567:46;;;;-1:-1:-1;;;73567:46:0;;9406:2:1;73567:46:0;;;9388:21:1;9445:1;9425:18;;;9418:29;-1:-1:-1;;;9463:18:1;;;9456:38;9511:18;;73567:46:0;9204:331:1;73567:46:0;73624:10;:24;;-1:-1:-1;;;;;;73624:24:0;-1:-1:-1;;;;;73624:24:0;;;;;;;;73664:38;;73678:10;;73664:38;;-1:-1:-1;;73664:38:0;73431:279;:::o;66027:121::-;66099:7;66126:14;:3;66134:5;66126:7;:14::i;:::-;66119:21;66027:121;-1:-1:-1;;;66027:121:0:o;63890:1174::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;60321:23:0;::::1;;::::0;;;:13:::1;:23;::::0;;;;;64038:8;;60321:23:::1;;:32;60313:70;;;::::0;-1:-1:-1;;;60313:70:0;;13235:2:1;60313:70:0::1;::::0;::::1;13217:21:1::0;13274:2;13254:18;;;13247:30;13313:27;13293:18;;;13286:55;13358:18;;60313:70:0::1;13033:349:1::0;60313:70:0::1;58133:7:::2;64097:16;:44;;64089:86;;;::::0;-1:-1:-1;;;64089:86:0;;7902:2:1;64089:86:0::2;::::0;::::2;7884:21:1::0;7941:2;7921:18;;;7914:30;7980:31;7960:18;;;7953:59;8029:18;;64089:86:0::2;7700:353:1::0;64089:86:0::2;64186:33;::::0;-1:-1:-1;;;64186:33:0;;64213:4:::2;64186:33;::::0;::::2;4260:51:1::0;-1:-1:-1;;;;;64186:18:0;::::2;::::0;::::2;::::0;4233::1;;64186:33:0::2;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;64257:3;64240:13;:20;;;;64232:70;;;::::0;-1:-1:-1;;;64232:70:0;;7089:2:1;64232:70:0::2;::::0;::::2;7071:21:1::0;7128:2;7108:18;;;7101:30;7167:34;7147:18;;;7140:62;-1:-1:-1;;;7218:18:1;;;7211:35;7263:19;;64232:70:0::2;6887:401:1::0;64232:70:0::2;64317:11;64313:61;;;64345:17;:15;:17::i;:::-;64384:24;64429:9;;64411:15;:27;:57;;64459:9;;64411:57;;;64441:15;64411:57;64497:15;::::0;64384:84;;-1:-1:-1;64497:32:0::2;::::0;64517:11;64497:19:::2;:32::i;:::-;64479:15;:50:::0;-1:-1:-1;;;;;64540:23:0;;::::2;;::::0;;;:13:::2;:23;::::0;;;;;;;:30;;64566:4:::2;-1:-1:-1::0;;64540:30:0;;::::2;::::0;::::2;::::0;;;64609:325;;::::2;::::0;::::2;::::0;;;;;;;::::2;::::0;;;;;;;;;;;;;;;::::2;::::0;;::::2;::::0;;;;;;;;;;;;;;;;;;64581:8:::2;:364:::0;;;;::::2;::::0;;;;;;;;;::::2;::::0;;::::2;::::0;;::::2;::::0;;-1:-1:-1;;;;;;64581:364:0::2;::::0;;;::::2;;::::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;64581:364:0::2;::::0;;;::::2;;::::0;;;;;;;;;;;;;;64971:15;:19:::2;::::0;64566:4;64971:19:::2;:::i;:::-;64963:93;::::0;;-1:-1:-1;;;;;5229:32:1;;5211:51;;5293:2;5278:18;;5271:34;;;5353:6;5341:19;;5321:18;;;5314:47;5392:2;5377:18;;5370:34;;;64963:93:0;;::::2;::::0;;;;5198:3:1;64963:93:0;;::::2;64048:1016;10268:1:::1;63890:1174:::0;;;;;:::o;60832:1620::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;60936:8:::1;:15:::0;:20;60928:86:::1;;;::::0;-1:-1:-1;;;60928:86:0;;12466:2:1;60928:86:0::1;::::0;::::1;12448:21:1::0;12505:2;12485:18;;;12478:30;12544:34;12524:18;;;12517:62;-1:-1:-1;;;12595:18:1;;;12588:51;12656:19;;60928:86:0::1;12264:417:1::0;60928:86:0::1;61025:47;61029:4;61042:12;61057:1;61060:4;61066:5;61025:3;:47::i;:::-;61097;61101:4;61114:12;61129:1;61132:4;61138:5;61097:3;:47::i;:::-;61173:79;61177:4;61190:42;61235:3;61240:4;61246:5;61173:3;:79::i;:::-;61278;61282:4;61295:42;61340:3;61345:4;61351:5;61278:3;:79::i;:::-;61383;61387:4;61400:42;61445:3;61450:4;61456:5;61383:3;:79::i;:::-;61490;61494:4;61507:42;61552:3;61557:4;61563:5;61490:3;:79::i;:::-;61594:30;61598:4;61604:3;61609:1;61612:4;61618:5;61594:3;:30::i;:::-;61661:79;61665:4;61678:42;61723:3;61728:4;61734:5;61661:3;:79::i;:::-;61774;61778:4;61791:42;61836:3;61841:4;61847:5;61774:3;:79::i;:::-;61887;61891:4;61904:42;61949:3;61954:4;61960:5;61887:3;:79::i;:::-;62001;62005:4;62018:42;62063:3;62068:4;62074:5;62001:3;:79::i;:::-;62115;62119:4;62132:42;62177:3;62182:4;62188:5;62115:3;:79::i;:::-;62229;62233:4;62246:42;62291:3;62296:4;62302:5;62229:3;:79::i;:::-;62342;62346:4;62359:42;62404:3;62409:4;62415:5;62342:3;:79::i;60565:255::-:0;60638:12;60687:14;;;:8;:14;;;;;;;;-1:-1:-1;;;;;60687:21:0;;;;;;;;;60726;;;;60751:15;-1:-1:-1;60726:40:0;:86;;60797:15;60773:4;:21;;;:39;;;;:::i;:::-;60726:86;;;60769:1;60726:86;60719:93;60565:255;-1:-1:-1;;;;60565:255:0:o;73175:248::-;73258:7;;-1:-1:-1;;;;;73258:7:0;73244:10;:21;73236:43;;;;-1:-1:-1;;;73236:43:0;;9069:2:1;73236:43:0;;;9051:21:1;9108:1;9088:18;;;9081:29;-1:-1:-1;;;9126:18:1;;;9119:39;9175:18;;73236:43:0;8867:332:1;73236:43:0;-1:-1:-1;;;;;73298:22:0;;73290:43;;;;-1:-1:-1;;;73290:43:0;;9406:2:1;73290:43:0;;;9388:21:1;9445:1;9425:18;;;9418:29;-1:-1:-1;;;9463:18:1;;;9456:38;9511:18;;73290:43:0;9204:331:1;73290:43:0;73346:7;:18;;-1:-1:-1;;;;;;73346:18:0;-1:-1:-1;;;;;73346:18:0;;;;;;;;73380:35;;73394:10;;73380:35;;-1:-1:-1;;73380:35:0;73175:248;:::o;69031:1163::-;48264:1;48860:7;;:19;;48852:63;;;;-1:-1:-1;;;48852:63:0;;;;;;;:::i;:::-;48264:1;48993:7;:18;;;;69112:21:::1;69136:8;69145:4;69136:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;69185;;;69136::::1;69185::::0;;;;;;;69200:10:::1;69185:26:::0;;;;;;;;;69136:14;::::1;::::0;;::::1;::::0;-1:-1:-1;69222:16:0::1;69194:4:::0;69222:10:::1;:16::i;:::-;69249:24;69268:4;69249:18;:24::i;:::-;69298:11:::0;;69294:768:::1;;69350:12:::0;;:37:::1;::::0;-1:-1:-1;;;69350:37:0;;69381:4:::1;69350:37;::::0;::::1;4260:51:1::0;69326:21:0::1;::::0;-1:-1:-1;;;;;69350:12:0::1;::::0;:22:::1;::::0;4233:18:1;;69350:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69402:12:::0;;69326:61;;-1:-1:-1;69402:74:0::1;::::0;-1:-1:-1;;;;;69402:12:0::1;69440:10;69461:4;69468:7:::0;69402:29:::1;:74::i;:::-;69501:12:::0;;:37:::1;::::0;-1:-1:-1;;;69501:37:0;;69532:4:::1;69501:37;::::0;::::1;4260:51:1::0;69541:13:0;;-1:-1:-1;;;;;69501:12:0::1;::::0;:22:::1;::::0;4233:18:1;;69501:37:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;69573:17;::::0;::::1;::::0;69491:63;;-1:-1:-1;69573:17:0::1;;:21:::0;69569:482:::1;;69648:17;::::0;::::1;::::0;69615:18:::1;::::0;69636:41:::1;::::0;69671:5:::1;::::0;69636:30:::1;::::0;:7;;69648:17:::1;;69636:11;:30::i;:41::-;69722:10;::::0;69696:12;;69615:62;;-1:-1:-1;69696:49:0::1;::::0;-1:-1:-1;;;;;69696:12:0;;::::1;::::0;69722:10:::1;69615:62:::0;69696:25:::1;:49::i;:::-;69778:11:::0;;:40:::1;::::0;69807:10;;69778:24:::1;::::0;69794:7;69778:15:::1;:24::i;:::-;:28:::0;::::1;:40::i;:::-;69764:54:::0;;69853:13:::1;::::0;::::1;::::0;:42:::1;::::0;69884:10;;69853:26:::1;::::0;69871:7;69853:17:::1;:26::i;:42::-;69837:13;::::0;::::1;:58:::0;-1:-1:-1;69569:482:0::1;;;69950:11:::0;;:24:::1;::::0;69966:7;69950:15:::1;:24::i;:::-;69936:38:::0;;70009:13:::1;::::0;::::1;::::0;:26:::1;::::0;70027:7;70009:17:::1;:26::i;:::-;69993:13;::::0;::::1;:42:::0;69569:482:::1;69311:751;69294:768;70106:19;::::0;::::1;::::0;70090:11;;:46:::1;::::0;70131:4:::1;::::0;70090:36:::1;::::0;:15:::1;:36::i;:46::-;70072:15;::::0;::::1;:64:::0;70152:34:::1;::::0;15018:25:1;;;70172:4:0;;70160:10:::1;::::0;70152:34:::1;::::0;15006:2:1;14991:18;70152:34:0::1;14872:177:1::0;66211:938:0;66283:7;66303:21;66327:8;66336:4;66327:14;;;;;;;;:::i;:::-;;;;;;;;;66376;;;66327;66376;;;;;;;-1:-1:-1;;;;;66376:21:0;;;;;;;;;;;66327:14;;;;;66433:19;;;;66485:21;;;;66327:14;;-1:-1:-1;66433:19:0;66467:15;:39;:61;;;;-1:-1:-1;66510:13:0;;;;:18;;66467:61;:84;;;;;66550:1;66532:15;;:19;66467:84;66463:538;;;66568:18;66589:53;66603:4;:21;;;66626:15;66589:13;:53::i;:::-;66568:74;;66657:17;66677:70;66731:15;;66677:49;66710:4;:15;;;66677:28;66692:12;;66677:10;:14;;:28;;;;:::i;:70::-;66657:90;;66801:3;-1:-1:-1;;;;;66801:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66766:32;66788:9;66766:3;-1:-1:-1;;;;;66766:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:32::-;:50;66762:138;;;66867:3;-1:-1:-1;;;;;66867:15:0;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66849:3;-1:-1:-1;;;;;66849:13:0;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;;:::i;:::-;66837:47;;66762:138;66974:13;;;;66931:58;;66950:38;;:19;:9;66964:4;66950:13;:19::i;:38::-;66931:14;;:18;:58::i;:::-;66914:75;;66553:448;;66463:538;67011:15;67029:62;67075:4;:15;;;67029:41;67065:4;67029:31;67045:14;67029:4;:11;;;:15;;:31;;;;:::i;:62::-;67011:80;;67109:32;67121:4;:19;;;67109:7;:11;;:32;;;;:::i;:::-;67102:39;66211:938;-1:-1:-1;;;;;;;66211:938:0:o;10432:201::-;10023:7;10050:6;-1:-1:-1;;;;;10050:6:0;8924:10;10197:23;10189:68;;;;-1:-1:-1;;;10189:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10521:22:0;::::1;10513:73;;;::::0;-1:-1:-1;;;10513:73:0;;7495:2:1;10513:73:0::1;::::0;::::1;7477:21:1::0;7534:2;7514:18;;;7507:30;7573:34;7553:18;;;7546:62;-1:-1:-1;;;7624:18:1;;;7617:36;7670:19;;10513:73:0::1;7293:402:1::0;10513:73:0::1;10597:28;10616:8;10597:18;:28::i;:::-;10432:201:::0;:::o;51941:98::-;51999:7;52026:5;52030:1;52026;:5;:::i;51560:98::-;51618:7;51645:5;51649:1;51645;:5;:::i;71631:978::-;71693:21;71717:8;71726:4;71717:14;;;;;;;;:::i;:::-;;;;;;;;;71766;;;71717;71766;;;;;;;71781:10;71766:26;;;;;;;;;71809:21;;;;71717:14;;;;;;;;-1:-1:-1;71805:124:0;;71896:20;;;;71876:41;;:15;;:19;:41::i;:::-;71852:21;;;:65;71805:124;71941:15;71959:67;72010:4;:15;;;71959:46;72000:4;71959:36;71975:4;:19;;;71959:4;:11;;;:15;;:36;;;;:::i;:67::-;67233:4;67274:14;;;:8;:14;;;;;;;;72058:10;67274:21;;;;;;;67332;;;71941:85;;-1:-1:-1;67313:15:0;:40;72037:565;;72100:1;72090:7;:11;:38;;;;72127:1;72105:4;:19;;;:23;72090:38;72086:340;;;72149:20;72172:32;72184:4;:19;;;72172:7;:11;;:32;;;;:::i;:::-;72247:1;72225:19;;;:23;72311:20;;;;72149:55;;-1:-1:-1;72291:41:0;;:15;;:19;:41::i;:::-;72267:21;;;:65;72369:41;72385:10;72397:12;72369:15;:41::i;:::-;72130:296;72086:340;72037:565;;;72447:11;;72443:159;;72497:19;;;;:32;;72521:7;72497:23;:32::i;:::-;72475:19;;;:54;72549:41;;15018:25:1;;;72576:4:0;;72564:10;;72549:41;;15006:2:1;14991:18;72549:41:0;;;;;;;72443:159;71682:927;;;71631:978;:::o;22822:211::-;22966:58;;-1:-1:-1;;;;;4894:32:1;;22966:58:0;;;4876:51:1;4943:18;;;4936:34;;;22939:86:0;;22959:5;;-1:-1:-1;;;22989:23:0;4849:18:1;;22966:58:0;;;;-1:-1:-1;;22966:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;22966:58:0;-1:-1:-1;;;;;;22966:58:0;;;;;;;;;;22939:19;:86::i;:::-;22822:211;;;:::o;52298:98::-;52356:7;52383:5;52387:1;52383;:5;:::i;52697:98::-;52755:7;52782:5;52786:1;52782;:5;:::i;23041:248::-;23212:68;;-1:-1:-1;;;;;4580:15:1;;;23212:68:0;;;4562:34:1;4632:15;;4612:18;;;4605:43;4664:18;;;4657:34;;;23185:96:0;;23205:5;;-1:-1:-1;;;23235:27:0;4497:18:1;;23212:68:0;4322:375:1;10793:191:0;10867:16;10886:6;;-1:-1:-1;;;;;10903:17:0;;;-1:-1:-1;;;;;;10903:17:0;;;;;;10936:40;;10886:6;;;;;;;10936:40;;10867:16;10936:40;10856:128;10793:191;:::o;72722:417::-;72814:28;;-1:-1:-1;;;72814:28:0;;72836:4;72814:28;;;4260:51:1;72797:14:0;;72814:3;-1:-1:-1;;;;;72814:13:0;;;;4233:18:1;;72814:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72797:45;;72853:20;72906:6;72896:7;:16;72892:169;;;72947:25;;-1:-1:-1;;;72947:25:0;;-1:-1:-1;;;;;4894:32:1;;;72947:25:0;;;4876:51:1;4943:18;;;4936:34;;;72947:3:0;:12;;;;4849:18:1;;72947:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;72929:43;;72892:169;;;73023:26;;-1:-1:-1;;;73023:26:0;;-1:-1:-1;;;;;4894:32:1;;;73023:26:0;;;4876:51:1;4943:18;;;4936:34;;;73023:3:0;:12;;;;4849:18:1;;73023:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;73005:44;;72892:169;73079:15;73071:60;;;;-1:-1:-1;;;73071:60:0;;14353:2:1;73071:60:0;;;14335:21:1;;;14372:18;;;14365:30;14431:34;14411:18;;;14404:62;14483:18;;73071:60:0;14151:356:1;25395:716:0;25819:23;25845:69;25873:4;25845:69;;;;;;;;;;;;;;;;;25853:5;-1:-1:-1;;;;;25845:27:0;;;:69;;;;;:::i;:::-;25929:17;;25819:95;;-1:-1:-1;25929:21:0;25925:179;;26026:10;26015:30;;;;;;;;;;;;:::i;:::-;26007:85;;;;-1:-1:-1;;;26007:85:0;;13942:2:1;26007:85:0;;;13924:21:1;13981:2;13961:18;;;13954:30;14020:34;14000:18;;;13993:62;-1:-1:-1;;;14071:18:1;;;14064:40;14121:19;;26007:85:0;13740:406:1;14478:229:0;14615:12;14647:52;14669:6;14677:4;14683:1;14686:12;14615;11995:20;;15885:60;;;;-1:-1:-1;;;15885:60:0;;12108:2:1;15885:60:0;;;12090:21:1;12147:2;12127:18;;;12120:30;12186:31;12166:18;;;12159:59;12235:18;;15885:60:0;11906:353:1;15885:60:0;15959:12;15973:23;16000:6;-1:-1:-1;;;;;16000:11:0;16019:5;16026:4;16000:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15958:73;;;;16049:51;16066:7;16075:10;16087:12;18434;18463:7;18459:530;;;-1:-1:-1;18494:10:0;18487:17;;18459:530;18608:17;;:21;18604:374;;18806:10;18800:17;18867:15;18854:10;18850:2;18846:19;18839:44;18604:374;18949:12;18942:20;;-1:-1:-1;;;18942:20:0;;;;;;;;:::i;14:159:1:-;81:20;;141:6;130:18;;120:29;;110:57;;163:1;160;153:12;110:57;14:159;;;:::o;178:247::-;237:6;290:2;278:9;269:7;265:23;261:32;258:52;;;306:1;303;296:12;258:52;345:9;332:23;364:31;389:5;364:31;:::i;430:245::-;497:6;550:2;538:9;529:7;525:23;521:32;518:52;;;566:1;563;556:12;518:52;598:9;592:16;617:28;639:5;617:28;:::i;947:418::-;1045:6;1053;1106:2;1094:9;1085:7;1081:23;1077:32;1074:52;;;1122:1;1119;1112:12;1074:52;1161:9;1148:23;1180:31;1205:5;1180:31;:::i;:::-;1230:5;-1:-1:-1;1287:2:1;1272:18;;1259:32;1300:33;1259:32;1300:33;:::i;:::-;1352:7;1342:17;;;947:418;;;;;:::o;1370:180::-;1429:6;1482:2;1470:9;1461:7;1457:23;1453:32;1450:52;;;1498:1;1495;1488:12;1450:52;-1:-1:-1;1521:23:1;;1370:180;-1:-1:-1;1370:180:1:o;1555:184::-;1625:6;1678:2;1666:9;1657:7;1653:23;1649:32;1646:52;;;1694:1;1691;1684:12;1646:52;-1:-1:-1;1717:16:1;;1555:184;-1:-1:-1;1555:184:1:o;1744:315::-;1812:6;1820;1873:2;1861:9;1852:7;1848:23;1844:32;1841:52;;;1889:1;1886;1879:12;1841:52;1925:9;1912:23;1902:33;;1985:2;1974:9;1970:18;1957:32;1998:31;2023:5;1998:31;:::i;2064:607::-;2170:6;2178;2186;2194;2202;2255:3;2243:9;2234:7;2230:23;2226:33;2223:53;;;2272:1;2269;2262:12;2223:53;2308:9;2295:23;2285:33;;2368:2;2357:9;2353:18;2340:32;2381:31;2406:5;2381:31;:::i;:::-;2431:5;-1:-1:-1;2455:37:1;2488:2;2473:18;;2455:37;:::i;:::-;2445:47;;2539:2;2528:9;2524:18;2511:32;2501:42;;2595:3;2584:9;2580:19;2567:33;2609:30;2631:7;2609:30;:::i;:::-;2658:7;2648:17;;;2064:607;;;;;;;;:::o;2676:248::-;2744:6;2752;2805:2;2793:9;2784:7;2780:23;2776:32;2773:52;;;2821:1;2818;2811:12;2773:52;-1:-1:-1;;2844:23:1;;;2914:2;2899:18;;;2886:32;;-1:-1:-1;2676:248:1:o;2929:377::-;3003:6;3011;3019;3072:2;3060:9;3051:7;3047:23;3043:32;3040:52;;;3088:1;3085;3078:12;3040:52;3124:9;3111:23;3101:33;;3181:2;3170:9;3166:18;3153:32;3143:42;;3235:2;3224:9;3220:18;3207:32;3248:28;3270:5;3248:28;:::i;:::-;3295:5;3285:15;;;2929:377;;;;;:::o;3311:519::-;3402:6;3410;3418;3426;3434;3487:3;3475:9;3466:7;3462:23;3458:33;3455:53;;;3504:1;3501;3494:12;3455:53;3540:9;3527:23;3517:33;;3597:2;3586:9;3582:18;3569:32;3559:42;;3620:37;3653:2;3642:9;3638:18;3620:37;:::i;3835:274::-;3964:3;4002:6;3996:13;4018:53;4064:6;4059:3;4052:4;4044:6;4040:17;4018:53;:::i;:::-;4087:16;;;;;3835:274;-1:-1:-1;;3835:274:1:o;6499:383::-;6648:2;6637:9;6630:21;6611:4;6680:6;6674:13;6723:6;6718:2;6707:9;6703:18;6696:34;6739:66;6798:6;6793:2;6782:9;6778:18;6773:2;6765:6;6761:15;6739:66;:::i;:::-;6866:2;6845:15;-1:-1:-1;;6841:29:1;6826:45;;;;6873:2;6822:54;;6499:383;-1:-1:-1;;6499:383:1:o;10367:356::-;10569:2;10551:21;;;10588:18;;;10581:30;10647:34;10642:2;10627:18;;10620:62;10714:2;10699:18;;10367:356::o;11501:400::-;11703:2;11685:21;;;11742:2;11722:18;;;11715:30;11781:34;11776:2;11761:18;;11754:62;-1:-1:-1;;;11847:2:1;11832:18;;11825:34;11891:3;11876:19;;11501:400::o;14512:355::-;14714:2;14696:21;;;14753:2;14733:18;;;14726:30;14792:33;14787:2;14772:18;;14765:61;14858:2;14843:18;;14512:355::o;15450:128::-;15490:3;15521:1;15517:6;15514:1;15511:13;15508:39;;;15527:18;;:::i;:::-;-1:-1:-1;15563:9:1;;15450:128::o;15583:217::-;15623:1;15649;15639:132;;15693:10;15688:3;15684:20;15681:1;15674:31;15728:4;15725:1;15718:15;15756:4;15753:1;15746:15;15639:132;-1:-1:-1;15785:9:1;;15583:217::o;15805:168::-;15845:7;15911:1;15907;15903:6;15899:14;15896:1;15893:21;15888:1;15881:9;15874:17;15870:45;15867:71;;;15918:18;;:::i;:::-;-1:-1:-1;15958:9:1;;15805:168::o;15978:125::-;16018:4;16046:1;16043;16040:8;16037:34;;;16051:18;;:::i;:::-;-1:-1:-1;16088:9:1;;15978:125::o;16108:258::-;16180:1;16190:113;16204:6;16201:1;16198:13;16190:113;;;16280:11;;;16274:18;16261:11;;;16254:39;16226:2;16219:10;16190:113;;;16321:6;16318:1;16315:13;16312:48;;;-1:-1:-1;;16356:1:1;16338:16;;16331:27;16108:258::o;16371:135::-;16410:3;-1:-1:-1;;16431:17:1;;16428:43;;;16451:18;;:::i;:::-;-1:-1:-1;16498:1:1;16487:13;;16371:135::o;16511:127::-;16572:10;16567:3;16563:20;16560:1;16553:31;16603:4;16600:1;16593:15;16627:4;16624:1;16617:15;16643:127;16704:10;16699:3;16695:20;16692:1;16685:31;16735:4;16732:1;16725:15;16759:4;16756:1;16749:15;16775:131;-1:-1:-1;;;;;16850:31:1;;16840:42;;16830:70;;16896:1;16893;16886:12;16911:118;16997:5;16990:13;16983:21;16976:5;16973:32;16963:60;;17019:1;17016;17009:12
Swarm Source
ipfs://22850f4c2a28963e6378755cbda86048ffac551a36977544cd8b24e12bd196aa
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Validator ID :
0 FTM
Amount Staked
0
Amount Delegated
0
Staking Total
0
Staking Start Epoch
0
Staking Start Time
0
Proof of Importance
0
Origination Score
0
Validation Score
0
Active
0
Online
0
Downtime
0 s
Address | Amount | claimed Rewards | Created On Epoch | Created On |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.