Contract Overview
Balance:
0 MATIC
MATIC Value:
$0.00
Txn Hash | Method |
Block
|
From
|
To
|
Value | [Txn Fee] | |||
---|---|---|---|---|---|---|---|---|---|
0xe4fe84373d2c1ee458f14eeb913d787c8dbdbe2325eb4ecde8939f83d5f7eed7 | 0x60068054 | 29920964 | 7 days 13 hrs ago | 0xfefb836de3eb6b03d8b6c7fce535cdb8da54902a | IN | Create: fPRXY | 0 MATIC | 0.103101091008 |
[ Download CSV Export ]
Contract Name:
fPRXY
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-23 */ /** *Submitted for verification at polygonscan.com on 2022-06-22 */ /** *Submitted for verification at polygonscan.com on 2022-06-15 */ // File: @uniswap/v2-periphery/contracts/interfaces/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: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @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 * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 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); } } } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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 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 `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, 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 `from` to `to` 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 from, address to, uint256 amount ) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.0; /** * @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); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.0; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' 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"); } } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/token/ERC20/ERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/ERC20.sol) pragma solidity ^0.8.0; /** * @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, IERC20, IERC20Metadata { mapping(address => uint256) private _balances; mapping(address => mapping(address => uint256)) private _allowances; uint256 private _totalSupply; 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; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual override returns (uint256) { return _balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `amount`. */ function transfer(address to, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _transfer(owner, to, 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}. * * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 amount) public virtual override returns (bool) { address owner = _msgSender(); _approve(owner, 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}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. * - the caller must have allowance for ``from``'s tokens of at least * `amount`. */ function transferFrom( address from, address to, uint256 amount ) public virtual override returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, amount); _transfer(from, to, 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) { address owner = _msgSender(); _approve(owner, spender, allowance(owner, 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) { address owner = _msgSender(); uint256 currentAllowance = allowance(owner, spender); require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero"); unchecked { _approve(owner, spender, currentAllowance - subtractedValue); } 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: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `from` must have a balance of at least `amount`. */ function _transfer( address from, address to, uint256 amount ) internal virtual { require(from != address(0), "ERC20: transfer from the zero address"); require(to != address(0), "ERC20: transfer to the zero address"); _beforeTokenTransfer(from, to, amount); uint256 fromBalance = _balances[from]; require(fromBalance >= amount, "ERC20: transfer amount exceeds balance"); unchecked { _balances[from] = fromBalance - amount; } _balances[to] += amount; emit Transfer(from, to, amount); _afterTokenTransfer(from, to, 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"); _beforeTokenTransfer(address(0), account, amount); _totalSupply += amount; _balances[account] += amount; emit Transfer(address(0), account, amount); _afterTokenTransfer(address(0), account, amount); } /** * @dev Destroys `amount` tokens from `account`, reducing the * total supply. * * Emits a {Transfer} event with `to` set to the zero address. * * Requirements: * * - `account` cannot be the zero address. * - `account` must have at least `amount` tokens. */ function _burn(address account, uint256 amount) internal virtual { require(account != address(0), "ERC20: burn from the zero address"); _beforeTokenTransfer(account, address(0), amount); uint256 accountBalance = _balances[account]; require(accountBalance >= amount, "ERC20: burn amount exceeds balance"); unchecked { _balances[account] = accountBalance - amount; } _totalSupply -= amount; emit Transfer(account, address(0), amount); _afterTokenTransfer(account, address(0), 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 Updates `owner` s allowance for `spender` based on spent `amount`. * * Does not update the allowance amount in case of infinite allowance. * Revert if not enough allowance is available. * * Might emit an {Approval} event. */ function _spendAllowance( address owner, address spender, uint256 amount ) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { require(currentAllowance >= amount, "ERC20: insufficient allowance"); unchecked { _approve(owner, spender, currentAllowance - 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 {} } // File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol) pragma solidity ^0.8.0; /** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */ abstract contract ERC20Burnable is Context, ERC20 { /** * @dev Destroys `amount` tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 amount) public virtual { _burn(_msgSender(), amount); } /** * @dev Destroys `amount` tokens from `account`, deducting from the caller's * allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `amount`. */ function burnFrom(address account, uint256 amount) public virtual { _spendAllowance(account, _msgSender(), amount); _burn(account, amount); } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _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 Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _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); } } // File: @openzeppelin/contracts/utils/math/SafeMath.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/math/SafeMath.sol) pragma solidity ^0.8.0; // CAUTION // This version of SafeMath should only be used with Solidity 0.8 or later, // because it relies on the compiler's built in overflow checks. /** * @dev Wrappers over Solidity's arithmetic operations. * * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler * now has built in overflow checking. */ 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 subtraction 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; } } } // File: fPrxy.sol pragma solidity ^0.8.0; contract fPRXY is Ownable, ERC20Burnable { using SafeMath for uint256; using SafeERC20 for IERC20; address public treasury = 0xf76FD435Bab7392B52B4123f0A16D8310EfDF8E0; address public btcpxTreasury = 0xd1f4EC7fF772BC382c2345Cc4F57dc4bF13685a9; uint256 public stakingStartDate; uint256 private totalStakeAmount; uint256 public lastUpdateTime; uint256[3] public rewardPerTokenStored; //7.5% = 750 //index0: 0-1000 //index1: 1000-10000 //index2: 100000+ uint256[3] private apy = [300, 500, 700]; uint256 public userCount; uint256 public unstakeLockingPeriod = 1 days; bool public stakingStatus; address public V2_ROUTER = 0xa5E0829CaCEd8fFDD4De3c43696c57F7D7A678ff; address public USDC = 0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174; address public WBTC = 0x1BFD67037B42Cf73acF2047067bd4F2C47D9BfD6; address public PRXY = 0xab3D689C22a2Bb821f50A4Ff0F21A7980dCB8591; address public BTCpx = 0x9C32185b81766a051E08dE671207b34466DD1021; mapping(address => mapping(uint256 => uint256)) public userRewardPerTokenPaidById; mapping(address => uint256) public rewards; mapping(uint256 => address) public userList; mapping(address => bool) internal isExisting; mapping(address => mapping(uint256 => uint256)) public userStakeById; mapping(address => mapping(uint256 => uint256)) public userStakeTimeById; mapping(address => uint256) internal userStake; mapping(address => uint256) public userTotalStakeId; event RewardAdded(uint256 reward); event Staked( address indexed user, uint256 totalStake, uint256 amount, uint256 stakeTime, uint256 stakeId ); event Unstaked( address indexed user, uint256 totalStake, uint256 amount, uint256 unstakeTime, uint256 stakeId ); event RewardPaid(address indexed user, uint256 reward); event RecoverToken(address indexed token, uint256 indexed amount); modifier updateReward(address account) { uint256 _stakeId = userTotalStakeId[account]; if (block.timestamp >= stakingStartDate) { rewardPerTokenStored[0] = rewardPerToken(0); rewardPerTokenStored[1] = rewardPerToken(1); rewardPerTokenStored[2] = rewardPerToken(2); lastUpdateTime = lastTimeRewardApplicable(); for (uint256 i = 0; i < _stakeId; i++) { uint256 _stakeAmount = userStakeById[account][i]; uint256 _apyIndex = _stakeAmount <= 1000e18 ? 0 : (_stakeAmount > 10000e18 ? 2 : 1); if (account != address(0)) { rewards[account] = earned(account, _apyIndex, _stakeAmount, i); userRewardPerTokenPaidById[account][ i ] = rewardPerTokenStored[_apyIndex]; } } } _; } constructor(uint256 _stakingStartDate) ERC20("Farm PRXY", "fPRXY") { stakingStartDate = _stakingStartDate; stakingStatus = true; } function setStakingStatus(bool val) public onlyOwner { stakingStatus = val; } function updateTreasury(address _treasury) external onlyOwner { treasury = _treasury; } //_lockingPeriod should be in seconds li,e 1 days = 86400 seconds function updateLockingPeriod(uint256 _lockingPeriod) external onlyOwner { unstakeLockingPeriod = _lockingPeriod; } function updateBtCpxTreasury(address _treasury) external onlyOwner { btcpxTreasury = _treasury; } function updateApyValue(uint256[3] memory _apy) external onlyOwner { apy = _apy; } function lastTimeRewardApplicable() public view returns (uint256) { return block.timestamp; } function rewardPerToken(uint256 _apyIndex) public view returns (uint256) { if (block.timestamp < stakingStartDate) { return 0; } if (totalSupply() == 0) { return rewardPerTokenStored[_apyIndex]; } return rewardPerTokenStored[_apyIndex].add( lastTimeRewardApplicable() .sub(lastUpdateTime) .mul(rewardRate(_apyIndex)) .mul(1e18) .div(totalSupply()) ); } function earned( address account, uint256 _apyIndex, uint256 _stakeAmount, uint256 _stakingId ) public view returns (uint256 _rewardEarned) { _rewardEarned = _stakeAmount .mul( rewardPerToken(_apyIndex).sub( userRewardPerTokenPaidById[account][_stakingId] ) ) .div(1e18) .add(rewards[account]); } function earnedByList(address account, uint256[] memory _stakeId) external view returns (uint256 _rewardEarned) { for (uint256 i = 0; i < _stakeId.length; i++) { uint256 _stakingId = _stakeId[i]; uint256 _stakeAmount = userStakeById[account][_stakingId]; uint256 _apyIndex = _stakeAmount <= 1000e18 ? 0 : (_stakeAmount > 10000e18 ? 2 : 1); _rewardEarned += earned(account, _apyIndex, _stakeAmount, _stakingId); } } function stake(uint256 amount) external updateReward(_msgSender()) { require(amount > 0, "Cannot stake 0"); require(stakingStatus, "Staking is paused"); if (!isUserExisting(_msgSender())) { userList[userCount] = _msgSender(); userCount++; isExisting[_msgSender()] = true; } IERC20(PRXY).safeTransferFrom(_msgSender(), treasury, amount); _mint(_msgSender(), amount); userStake[_msgSender()] += amount; uint256 _stakeId = userTotalStakeId[_msgSender()]; userStakeById[_msgSender()][_stakeId] = amount; userStakeTimeById[_msgSender()][_stakeId] = block.timestamp; userTotalStakeId[_msgSender()]++; emit Staked( _msgSender(), userStake[_msgSender()], amount, block.timestamp, _stakeId ); } function unstake(uint256 _stakeId) public updateReward(_msgSender()) { require( block.timestamp > userStakeTimeById[_msgSender()][_stakeId].add( unstakeLockingPeriod ), "Not allowed to unstake" ); uint256 _stakeAmount = userStakeById[_msgSender()][_stakeId]; require(_stakeAmount <= userStake[_msgSender()], "Cannot withdraw 0"); userStakeById[_msgSender()][_stakeId] = 0; userStake[_msgSender()] -= _stakeAmount; _burn(_msgSender(), _stakeAmount); IERC20(PRXY).safeTransferFrom(treasury, _msgSender(), _stakeAmount); emit Unstaked( _msgSender(), userStake[_msgSender()], _stakeAmount, block.timestamp, _stakeId ); } function getReward(uint256[] memory _stakeId) public updateReward(_msgSender()) { uint256 reward; for (uint256 i = 0; i < _stakeId.length; i++) { uint256 _stakingId = _stakeId[i]; uint256 _stakeAmount = userStakeById[_msgSender()][_stakingId]; uint256 _apyIndex = _stakeAmount < 1000e18 ? 0 : (_stakeAmount > 10000e18 ? 2 : 1); reward = earned(_msgSender(), _apyIndex, _stakeAmount, _stakingId); } if (reward > 0) { rewards[_msgSender()] = 0; //divide by 1e8 to normalize the multiplication in reward rate) IERC20(BTCpx).safeTransferFrom(btcpxTreasury, _msgSender(), reward.div(1e8)); emit RewardPaid(_msgSender(), reward); } } function getTotalRewardForYear(uint256 _apyIndex) public view returns (uint256) { return apy[_apyIndex] .mul(totalSupply().mul(getPrxyPriceInUsd())) .div(getBtcPriceInUsd().mul(1e10)) .div(10000); } function getTotalRewardForYearByAmount(uint256 _amount) public view returns (uint256) { uint256 apyInfo = _amount < 1000e18 ? apy[0] : (_amount > 10000e18 ? apy[2] : apy[1]); return apyInfo .mul(totalSupply().mul(getPrxyPriceInUsd())) .div(getBtcPriceInUsd().mul(1e10)) .div(10000); } function getOutputAmount(uint256 amountIn, address[] memory path) private view returns (uint256 _output) { uint256[] memory amounts = IUniswapV2Router01(V2_ROUTER).getAmountsOut( amountIn, path ); return amounts[amounts.length - 1]; } function getPrxyPriceInUsd() public view returns (uint256) { address[] memory path = new address[](2); path[0] = PRXY; path[1] = USDC; uint256[] memory amounts = IUniswapV2Router01(V2_ROUTER).getAmountsOut( 1e18, path ); return amounts[amounts.length - 1]; } function getBtcPriceInUsd() public view returns (uint256) { address[] memory path = new address[](2); path[0] = WBTC; path[1] = USDC; uint256[] memory amounts = IUniswapV2Router01(V2_ROUTER).getAmountsOut( 1e8, path ); return amounts[amounts.length - 1]; } function getTVLInUsd() external view returns (uint256) { return (totalSupply().mul(getPrxyPriceInUsd())).div(1 * 10**(18)); } //multiplied by 10**4 make take 6 dp function getAPY() external view returns ( uint256, uint256, uint256 ) { return (apy[0].mul(10**4), apy[1].mul(10**4), apy[2].mul(10**4)); } function rewardRate(uint256 _apyIndex) public view returns (uint256) { //multiplied by 1e8 for decimals return getTotalRewardForYear(_apyIndex).mul(1e8).div(31536000); } function stakeAmount(address account) public view returns (uint256) { return userStake[account]; } function rewardTokenDecimals() external view returns (uint8) { return IERC20Metadata(BTCpx).decimals(); } function stakeTokenDecimals() external view returns (uint8) { return IERC20Metadata(PRXY).decimals(); } function stakeToken() external view returns (address) { return PRXY; } function rewardToken() external view returns (address) { return BTCpx; } function isUserExisting(address _who) public view returns (bool) { return isExisting[_who]; } function recoverExcessToken(address token, uint256 amount) external onlyOwner { IERC20(token).safeTransfer(owner(), amount); emit RecoverToken(token, amount); } function recoverETH() external onlyOwner { payable(owner()).transfer(address(this).balance); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"_stakingStartDate","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","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":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RecoverToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"reward","type":"uint256"}],"name":"RewardPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"totalStake","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"unstakeTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"stakeId","type":"uint256"}],"name":"Unstaked","type":"event"},{"inputs":[],"name":"BTCpx","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRXY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"USDC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V2_ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WBTC","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"btcpxTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"_apyIndex","type":"uint256"},{"internalType":"uint256","name":"_stakeAmount","type":"uint256"},{"internalType":"uint256","name":"_stakingId","type":"uint256"}],"name":"earned","outputs":[{"internalType":"uint256","name":"_rewardEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"_stakeId","type":"uint256[]"}],"name":"earnedByList","outputs":[{"internalType":"uint256","name":"_rewardEarned","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAPY","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBtcPriceInUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrxyPriceInUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_stakeId","type":"uint256[]"}],"name":"getReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getTVLInUsd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apyIndex","type":"uint256"}],"name":"getTotalRewardForYear","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"getTotalRewardForYearByAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_who","type":"address"}],"name":"isUserExisting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastTimeRewardApplicable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdateTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverExcessToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apyIndex","type":"uint256"}],"name":"rewardPerToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"rewardPerTokenStored","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_apyIndex","type":"uint256"}],"name":"rewardRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setStakingStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"stakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakeTokenDecimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingStartDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingStatus","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_stakeId","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeLockingPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[3]","name":"_apy","type":"uint256[3]"}],"name":"updateApyValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"updateBtCpxTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lockingPeriod","type":"uint256"}],"name":"updateLockingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"updateTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"userList","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userRewardPerTokenPaidById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakeById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"userStakeTimeById","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userTotalStakeId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
600680546001600160a01b031990811673f76fd435bab7392b52b4123f0a16d8310efdf8e0179091556007805490911673d1f4ec7ff772bc382c2345cc4f57dc4bf13685a917905560e060405261012c60809081526101f460a0526102bc60c0526200007090600e90600362000248565b50620151806012556013805474a5e0829caced8ffdd4de3c43696c57f7d7a678ff00610100600160a81b0319909116179055601480546001600160a01b0319908116732791bca1f2de4661ed88a30c99a7a9449aa8417417909155601580548216731bfd67037b42cf73acf2047067bd4f2c47d9bfd617905560168054821673ab3d689c22a2bb821f50a4ff0f21a7980dcb859117905560178054909116739c32185b81766a051e08de671207b34466dd10211790553480156200013357600080fd5b5060405162002f1238038062002f12833981016040819052620001569162000325565b604051806040016040528060098152602001684661726d205052585960b81b81525060405180604001604052806005815260200164665052585960d81b815250620001b0620001aa620001f460201b60201c565b620001f8565b8151620001c590600490602085019062000291565b508051620001db90600590602084019062000291565b5050506008556013805460ff191660011790556200037b565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82600381019282156200027f579160200282015b828111156200027f578251829061ffff169055916020019190600101906200025c565b506200028d9291506200030e565b5090565b8280546200029f906200033f565b90600052602060002090601f016020900481019282620002c357600085556200027f565b82601f10620002de57805160ff19168380011785556200027f565b828001600101855582156200027f579182015b828111156200027f578251825591602001919060010190620002f1565b5b808211156200028d57600081556001016200030f565b6000602082840312156200033857600080fd5b5051919050565b600181811c908216806200035457607f821691505b6020821081036200037557634e487b7160e01b600052602260045260246000fd5b50919050565b612b87806200038b6000396000f3fe608060405234801561001057600080fd5b50600436106103ba5760003560e01c806380faa57d116101f4578063aa9700c51161011a578063cce0c89c116100ad578063ed67bf601161007c578063ed67bf6014610879578063f2fde38b14610881578063f7c618c114610894578063fb108836146108a557600080fd5b8063cce0c89c1461081d578063cea0196214610830578063d2cbf7ad14610843578063dd62ed3e1461086657600080fd5b8063bf135267116100e9578063bf135267146107d0578063c04c4d51146107f9578063c8f33c9114610801578063cb18cc6c1461080a57600080fd5b8063aa9700c514610784578063adde17ce14610797578063b8bec6a0146107aa578063bb88078c146107bd57600080fd5b806390224e7e116101925780639f4216e8116101615780639f4216e814610722578063a457c2d71461074b578063a694fc3a1461075e578063a9059cbb1461077157600080fd5b806390224e7e146106df57806395d89b411461070a57806396d7b1d7146107125780639bdcecd11461071a57600080fd5b8063882324b4116101ce578063882324b41461069057806389a30271146106a35780638ada032e146106b65780638da5cb5b146106ce57600080fd5b806380faa57d14610664578063866109c41461066a578063874c120b1461067d57600080fd5b8063484e06d5116102e4578063715018a6116102775780637c228b65116102465780637c228b65146106155780637ccf0226146106355780637e07c0da1461063e5780637f51bb1f1461065157600080fd5b8063715018a6146105bb57806372574e21146105c3578063775972bd146105d657806379cc67901461060257600080fd5b80635fe5b34a116102b35780635fe5b34a1461055957806361d027b31461056c5780636e1286fc1461057f57806370a082311461059257600080fd5b8063484e06d5146104df5780634dede3de146104f257806351ed6a301461051d5780635402d9211461052e57600080fd5b80632b1ace701161035c578063395093511161032b57806339509351146104a35780633990a439146104b657806342966c68146104bf578063455ab53c146104d257600080fd5b80632b1ace701461045c5780632e17de7814610476578063313ce56714610489578063317b3b7f1461049057600080fd5b806307973ccf1161039857806307973ccf14610415578063095ea7b31461041e57806318160ddd1461044157806323b872dd1461044957600080fd5b80630614117a146103bf57806306fdde03146103c95780630700037d146103e7575b600080fd5b6103c76108d0565b005b6103d1610940565b6040516103de9190612597565b60405180910390f35b6104076103f53660046125e6565b60196020526000908152604090205481565b6040519081526020016103de565b61040760115481565b61043161042c366004612601565b6109d2565b60405190151581526020016103de565b600354610407565b61043161045736600461262b565b6109ea565b610464610a10565b60405160ff90911681526020016103de565b6103c7610484366004612667565b610a83565b6012610464565b61040761049e366004612680565b610d71565b6104316104b1366004612601565b610de3565b61040760125481565b6103c76104cd366004612667565b610e05565b6013546104319060ff1681565b6104076104ed36600461278f565b610e0e565b601554610505906001600160a01b031681565b6040516001600160a01b0390911681526020016103de565b6016546001600160a01b0316610505565b61040761053c366004612601565b601860209081526000928352604080842090915290825290205481565b610407610567366004612667565b610ece565b600654610505906001600160a01b031681565b6103c761058d3660046127dd565b610f4a565b6104076105a03660046125e6565b6001600160a01b031660009081526001602052604090205490565b6103c76111bb565b6104076105d1366004612667565b6111f1565b6104316105e43660046125e6565b6001600160a01b03166000908152601b602052604090205460ff1690565b6103c7610610366004612601565b61123c565b6104076106233660046125e6565b601f6020526000908152604090205481565b61040760085481565b6103c761064c366004612812565b611255565b6103c761065f3660046125e6565b61128c565b42610407565b600754610505906001600160a01b031681565b61040761068b366004612667565b6112d8565b61040761069e366004612667565b611360565b601454610505906001600160a01b031681565b6013546105059061010090046001600160a01b031681565b6000546001600160a01b0316610505565b6104076106ed366004612601565b601c60209081526000928352604080842090915290825290205481565b6103d1611377565b610407611386565b61046461139f565b610505610730366004612667565b601a602052600090815260409020546001600160a01b031681565b610431610759366004612601565b6113e9565b6103c761076c366004612667565b61146f565b61043161077f366004612601565b6117b1565b6103c7610792366004612601565b6117bf565b6103c76107a53660046125e6565b611849565b6103c76107b836600461289e565b611895565b6103c76107cb366004612667565b6118d2565b6104076107de3660046125e6565b6001600160a01b03166000908152601e602052604090205490565b610407611901565b610407600a5481565b601654610505906001600160a01b031681565b601754610505906001600160a01b031681565b61040761083e366004612667565b611a3d565b61084b611a58565b604080519384526020840192909252908201526060016103de565b6104076108743660046128bb565b611a93565b610407611abe565b6103c761088f3660046125e6565b611b81565b6017546001600160a01b0316610505565b6104076108b3366004612601565b601d60209081526000928352604080842090915290825290205481565b6000546001600160a01b031633146109035760405162461bcd60e51b81526004016108fa906128ee565b60405180910390fd5b600080546040516001600160a01b03909116914780156108fc02929091818181858888f1935050505015801561093d573d6000803e3d6000fd5b50565b60606004805461094f90612923565b80601f016020809104026020016040519081016040528092919081815260200182805461097b90612923565b80156109c85780601f1061099d576101008083540402835291602001916109c8565b820191906000526020600020905b8154815290600101906020018083116109ab57829003601f168201915b5050505050905090565b6000336109e0818585611c19565b5060019392505050565b6000336109f8858285611d3e565b610a03858585611db2565b60019150505b9392505050565b6016546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610a5a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7e919061295d565b905090565b336000818152601f60205260409020546008544210610bb457610aa660006112d8565b600b55610ab360016112d8565b600c55610ac060026112d8565b600d5542600a5560005b81811015610bb2576001600160a01b0383166000908152601c6020908152604080832084845290915281205490683635c9adc5dea00000821115610b275769021e19e0c9bab24000008211610b20576001610b2a565b6002610b2a565b60005b60ff1690506001600160a01b03851615610b9d57610b4a85828486610d71565b6001600160a01b038616600090815260196020526040902055600b8160038110610b7657610b76612980565b01546001600160a01b03861660009081526018602090815260408083208784529091529020555b50508080610baa906129ac565b915050610aca565b505b610bf2601254601d6000610bc53390565b6001600160a01b031681526020808201929092526040908101600090812088825290925290205490611f80565b4211610c395760405162461bcd60e51b81526020600482015260166024820152754e6f7420616c6c6f77656420746f20756e7374616b6560501b60448201526064016108fa565b336000818152601c60209081526040808320878452825280832054938352601e909152902054811115610ca25760405162461bcd60e51b8152602060048201526011602482015270043616e6e6f74207769746864726177203607c1b60448201526064016108fa565b336000818152601c602090815260408083208884528252808320839055928252601e90529081208054839290610cd99084906129c5565b90915550610cea9050335b82611f8c565b600654610d0f906001600160a01b0316336016546001600160a01b03169190846120d7565b336000818152601e60209081526040918290205482519081529081018490524291810191909152606081018690527fdcfd2b4017d03f7e541021db793b2f9b31e4acdee005f789e52853c390e3e962906080015b60405180910390a250505050565b6001600160a01b03841660009081526019602090815260408083205460188352818420858552909252822054610dda9190610dd490670de0b6b3a764000090610dce90610dc790610dc18b6112d8565b90612142565b889061214e565b9061215a565b90611f80565b95945050505050565b6000336109e0818585610df68383611a93565b610e0091906129dc565b611c19565b61093d33610ce4565b6000805b8251811015610ec7576000838281518110610e2f57610e2f612980565b6020908102919091018101516001600160a01b0387166000908152601c835260408082208383529093529182205490925090683635c9adc5dea00000821115610e915769021e19e0c9bab24000008211610e8a576001610e94565b6002610e94565b60005b60ff169050610ea587828486610d71565b610eaf90866129dc565b94505050508080610ebf906129ac565b915050610e12565b5092915050565b600080683635c9adc5dea000008310610f075769021e19e0c9bab24000008311610efe57600e60015b0154610f0b565b600e6002610ef7565b600e545b9050610a09612710610dce610f2d6402540be400610f27611abe565b9061214e565b610dce610f43610f3b611901565b600354610f27565b869061214e565b336000818152601f6020526040902054600854421061107b57610f6d60006112d8565b600b55610f7a60016112d8565b600c55610f8760026112d8565b600d5542600a5560005b81811015611079576001600160a01b0383166000908152601c6020908152604080832084845290915281205490683635c9adc5dea00000821115610fee5769021e19e0c9bab24000008211610fe7576001610ff1565b6002610ff1565b60005b60ff1690506001600160a01b038516156110645761101185828486610d71565b6001600160a01b038616600090815260196020526040902055600b816003811061103d5761103d612980565b01546001600160a01b03861660009081526018602090815260408083208784529091529020555b50508080611071906129ac565b915050610f91565b505b6000805b845181101561113757600085828151811061109c5761109c612980565b602002602001015190506000601c60006110b33390565b6001600160a01b03168152602080820192909252604090810160009081208582529092528120549150683635c9adc5dea00000821061110b5769021e19e0c9bab2400000821161110457600161110e565b600261110e565b60005b60ff16905061111f33828486610d71565b9450505050808061112f906129ac565b91505061107f565b5080156111b55733600081815260196020526040812055600754611183916001600160a01b039091169061116f846305f5e10061215a565b6017546001600160a01b03169291906120d7565b60405181815233907fe2403640ba68fed3a2f88b7557551d1993f84b99bb10ff833f0cf8db0c5e048690602001610d63565b50505050565b6000546001600160a01b031633146111e55760405162461bcd60e51b81526004016108fa906128ee565b6111ef6000612166565b565b6000611236612710610dce61120d6402540be400610f27611abe565b610dce61121b610f3b611901565b600e886003811061122e5761122e612980565b01549061214e565b92915050565b611247823383611d3e565b6112518282611f8c565b5050565b6000546001600160a01b0316331461127f5760405162461bcd60e51b81526004016108fa906128ee565b611251600e826003612518565b6000546001600160a01b031633146112b65760405162461bcd60e51b81526004016108fa906128ee565b600680546001600160a01b0319166001600160a01b0392909216919091179055565b60006008544210156112ec57506000919050565b60035460000361131157600b826003811061130957611309612980565b015492915050565b61123661134561132060035490565b610dce670de0b6b3a7640000610f2761133888611a3d565b610f27600a54610dc14290565b600b846003811061135857611358612980565b015490611f80565b600b816003811061137057600080fd5b0154905081565b60606005805461094f90612923565b6000610a7e670de0b6b3a7640000610dce610f3b611901565b6017546040805163313ce56760e01b815290516000926001600160a01b03169163313ce5679160048083019260209291908290030181865afa158015610a5a573d6000803e3d6000fd5b600033816113f78286611a93565b9050838110156114575760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016108fa565b6114648286868403611c19565b506001949350505050565b336000818152601f602052604090205460085442106115a05761149260006112d8565b600b5561149f60016112d8565b600c556114ac60026112d8565b600d5542600a5560005b8181101561159e576001600160a01b0383166000908152601c6020908152604080832084845290915281205490683635c9adc5dea000008211156115135769021e19e0c9bab2400000821161150c576001611516565b6002611516565b60005b60ff1690506001600160a01b038516156115895761153685828486610d71565b6001600160a01b038616600090815260196020526040902055600b816003811061156257611562612980565b01546001600160a01b03861660009081526018602090815260408083208784529091529020555b50508080611596906129ac565b9150506114b6565b505b600083116115e15760405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b60448201526064016108fa565b60135460ff166116275760405162461bcd60e51b815260206004820152601160248201527014dd185ada5b99c81a5cc81c185d5cd959607a1b60448201526064016108fa565b611630336105e4565b61169e57601180546000908152601a6020526040812080546001600160a01b0319163317905581549190611663836129ac565b91905055506001601b60006116753390565b6001600160a01b031681526020810191909152604001600020805460ff19169115159190911790555b6116bc336006546016546001600160a01b03908116929116866120d7565b6116c633846121b6565b336000908152601e6020526040812080548592906116e59084906129dc565b9091555050336000818152601f602081815260408084208054601c845282862081875284528286208a9055868652601d8452828620818752845291852042905594845291905282549092909161173a836129ac565b91905055506117463390565b6001600160a01b03167f9cfd25589d1eb8ad71e342a86a8524e83522e3936c0803048c08f6d9ad974f40601e6000336001600160a01b031681526020808201929092526040908101600020548151908152918201889052429082015260608101849052608001610d63565b6000336109e0818585611db2565b6000546001600160a01b031633146117e95760405162461bcd60e51b81526004016108fa906128ee565b61180f6117fe6000546001600160a01b031690565b6001600160a01b0384169083612295565b60405181906001600160a01b038416907ffba2d3bdfb2d601eb66a89783a2c614856101cadce71556753c2edadd60c831c90600090a35050565b6000546001600160a01b031633146118735760405162461bcd60e51b81526004016108fa906128ee565b600780546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b031633146118bf5760405162461bcd60e51b81526004016108fa906128ee565b6013805460ff1916911515919091179055565b6000546001600160a01b031633146118fc5760405162461bcd60e51b81526004016108fa906128ee565b601255565b60408051600280825260608201835260009283929190602083019080368337505060165482519293506001600160a01b03169183915060009061194657611946612980565b6001600160a01b03928316602091820292909201015260145482519116908290600190811061197757611977612980565b6001600160a01b03928316602091820292909201015260135460405163d06ca61f60e01b81526000926101009092049091169063d06ca61f906119c890670de0b6b3a7640000908690600401612a38565b600060405180830381865afa1580156119e5573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a0d9190810190612a51565b90508060018251611a1e91906129c5565b81518110611a2e57611a2e612980565b60200260200101519250505090565b60006112366301e13380610dce6305f5e100610f27866111f1565b60008080611a6a612710600e8361122e565b611a79612710600e600161122e565b611a88612710600e600261122e565b925092509250909192565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205490565b60408051600280825260608201835260009283929190602083019080368337505060155482519293506001600160a01b031691839150600090611b0357611b03612980565b6001600160a01b039283166020918202929092010152601454825191169082906001908110611b3457611b34612980565b6001600160a01b03928316602091820292909201015260135460405163d06ca61f60e01b81526000926101009092049091169063d06ca61f906119c8906305f5e100908690600401612a38565b6000546001600160a01b03163314611bab5760405162461bcd60e51b81526004016108fa906128ee565b6001600160a01b038116611c105760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016108fa565b61093d81612166565b6001600160a01b038316611c7b5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016108fa565b6001600160a01b038216611cdc5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016108fa565b6001600160a01b0383811660008181526002602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000611d4a8484611a93565b905060001981146111b55781811015611da55760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016108fa565b6111b58484848403611c19565b6001600160a01b038316611e165760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016108fa565b6001600160a01b038216611e785760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016108fa565b6001600160a01b03831660009081526001602052604090205481811015611ef05760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016108fa565b6001600160a01b03808516600090815260016020526040808220858503905591851681529081208054849290611f279084906129dc565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611f7391815260200190565b60405180910390a36111b5565b6000610a0982846129dc565b6001600160a01b038216611fec5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016108fa565b6001600160a01b038216600090815260016020526040902054818110156120605760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016108fa565b6001600160a01b038316600090815260016020526040812083830390556003805484929061208f9084906129c5565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611d31565b505050565b6040516001600160a01b03808516602483015283166044820152606481018290526111b59085906323b872dd60e01b906084015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526122c5565b6000610a0982846129c5565b6000610a098284612ad7565b6000610a098284612af6565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03821661220c5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016108fa565b806003600082825461221e91906129dc565b90915550506001600160a01b0382166000908152600160205260408120805483929061224b9084906129dc565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b6040516001600160a01b0383166024820152604481018290526120d290849063a9059cbb60e01b9060640161210b565b600061231a826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166123979092919063ffffffff16565b8051909150156120d257808060200190518101906123389190612b18565b6120d25760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016108fa565b60606123a684846000856123ae565b949350505050565b60608247101561240f5760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b60648201526084016108fa565b6001600160a01b0385163b6124665760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016108fa565b600080866001600160a01b031685876040516124829190612b35565b60006040518083038185875af1925050503d80600081146124bf576040519150601f19603f3d011682016040523d82523d6000602084013e6124c4565b606091505b50915091506124d48282866124df565b979650505050505050565b606083156124ee575081610a09565b8251156124fe5782518084602001fd5b8160405162461bcd60e51b81526004016108fa9190612597565b8260038101928215612546579160200282015b8281111561254657825182559160200191906001019061252b565b50612552929150612556565b5090565b5b808211156125525760008155600101612557565b60005b8381101561258657818101518382015260200161256e565b838111156111b55750506000910152565b60208152600082518060208401526125b681604085016020870161256b565b601f01601f19169190910160400192915050565b80356001600160a01b03811681146125e157600080fd5b919050565b6000602082840312156125f857600080fd5b610a09826125ca565b6000806040838503121561261457600080fd5b61261d836125ca565b946020939093013593505050565b60008060006060848603121561264057600080fd5b612649846125ca565b9250612657602085016125ca565b9150604084013590509250925092565b60006020828403121561267957600080fd5b5035919050565b6000806000806080858703121561269657600080fd5b61269f856125ca565b966020860135965060408601359560600135945092505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff811182821017156126f8576126f86126b9565b604052919050565b600067ffffffffffffffff82111561271a5761271a6126b9565b5060051b60200190565b600082601f83011261273557600080fd5b8135602061274a61274583612700565b6126cf565b82815260059290921b8401810191818101908684111561276957600080fd5b8286015b84811015612784578035835291830191830161276d565b509695505050505050565b600080604083850312156127a257600080fd5b6127ab836125ca565b9150602083013567ffffffffffffffff8111156127c757600080fd5b6127d385828601612724565b9150509250929050565b6000602082840312156127ef57600080fd5b813567ffffffffffffffff81111561280657600080fd5b6123a684828501612724565b60006060828403121561282457600080fd5b82601f83011261283357600080fd5b6040516060810181811067ffffffffffffffff82111715612856576128566126b9565b60405280606084018581111561286b57600080fd5b845b8181101561288557803583526020928301920161286d565b509195945050505050565b801515811461093d57600080fd5b6000602082840312156128b057600080fd5b8135610a0981612890565b600080604083850312156128ce57600080fd5b6128d7836125ca565b91506128e5602084016125ca565b90509250929050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061293757607f821691505b60208210810361295757634e487b7160e01b600052602260045260246000fd5b50919050565b60006020828403121561296f57600080fd5b815160ff81168114610a0957600080fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016129be576129be612996565b5060010190565b6000828210156129d7576129d7612996565b500390565b600082198211156129ef576129ef612996565b500190565b600081518084526020808501945080840160005b83811015612a2d5781516001600160a01b031687529582019590820190600101612a08565b509495945050505050565b8281526040602082015260006123a660408301846129f4565b60006020808385031215612a6457600080fd5b825167ffffffffffffffff811115612a7b57600080fd5b8301601f81018513612a8c57600080fd5b8051612a9a61274582612700565b81815260059190911b82018301908381019087831115612ab957600080fd5b928401925b828410156124d457835182529284019290840190612abe565b6000816000190483118215151615612af157612af1612996565b500290565b600082612b1357634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612b2a57600080fd5b8151610a0981612890565b60008251612b4781846020870161256b565b919091019291505056fea264697066735822122035535641d4e8104d6bf8da2ba2952117db643213d6476915c6a608b56f46dac264736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000000
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _stakingStartDate (uint256): 0
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed ByteCode Sourcemap
44585:11612:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56086:108;;;:::i;:::-;;22998:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45730:42;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;1180:25:1;;;1168:2;1153:18;45730:42:0;1034:177:1;45152:24:0;;;;;;25349:201;;;;;;:::i;:::-;;:::i;:::-;;;1640:14:1;;1633:22;1615:41;;1603:2;1588:18;25349:201:0;1475:187:1;24118:108:0;24206:12;;24118:108;;26130:295;;;;;;:::i;:::-;;:::i;55446:117::-;;;:::i;:::-;;;2172:4:1;2160:17;;;2142:36;;2130:2;2115:18;55446:117:0;2000:184:1;51073:857:0;;;;;;:::i;:::-;;:::i;23960:93::-;24043:2;23960:93;;49125:458;;;;;;:::i;:::-;;:::i;26834:238::-;;;;;;:::i;:::-;;:::i;45183:44::-;;;;;;34376:91;;;;;;:::i;:::-;;:::i;45236:25::-;;;;;;;;;49591:555;;;;;;:::i;:::-;;:::i;45417:64::-;;;;;-1:-1:-1;;;;;45417:64:0;;;;;;-1:-1:-1;;;;;4628:32:1;;;4610:51;;4598:2;4583:18;45417:64:0;4464:203:1;55571:84:0;55643:4;;-1:-1:-1;;;;;55643:4:0;55571:84;;45633:90;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;53100:429;;;;;;:::i;:::-;;:::i;44701:68::-;;;;;-1:-1:-1;;;;;44701:68:0;;;51938:838;;;;;;:::i;:::-;;:::i;24289:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24390:18:0;24363:7;24390:18;;;:9;:18;;;;;;;24289:127;36670:103;;;:::i;52784:308::-;;;;;;:::i;:::-;;:::i;55757:107::-;;;;;;:::i;:::-;-1:-1:-1;;;;;55840:16:0;55816:4;55840:16;;;:10;:16;;;;;;;;;55757:107;34786:164;;;;;;:::i;:::-;;:::i;46087:51::-;;;;;;:::i;:::-;;;;;;;;;;;;;;44858:31;;;;;;48343:96;;;;;;:::i;:::-;;:::i;47908:101::-;;;;;;:::i;:::-;;:::i;48447:107::-;48531:15;48447:107;;44776:73;;;;;-1:-1:-1;;;;;44776:73:0;;;48562:555;;;;;;:::i;:::-;;:::i;44971:38::-;;;;;;:::i;:::-;;:::i;45346:64::-;;;;;-1:-1:-1;;;;;45346:64:0;;;45270:69;;;;;;;;-1:-1:-1;;;;;45270:69:0;;;36019:87;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;36019:87;;45880:68;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;23217:104;;;:::i;54569:139::-;;;:::i;55319:119::-;;;:::i;45779:43::-;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;45779:43:0;;;27575:436;;;;;;:::i;:::-;;:::i;50154:911::-;;;;;;:::i;:::-;;:::i;24622:193::-;;;;;;:::i;:::-;;:::i;55872:206::-;;;;;;:::i;:::-;;:::i;48224:111::-;;;;;;:::i;:::-;;:::i;47809:91::-;;;;;;:::i;:::-;;:::i;48088:128::-;;;;;;:::i;:::-;;:::i;55199:112::-;;;;;;:::i;:::-;-1:-1:-1;;;;;55285:18:0;55258:7;55285:18;;;:9;:18;;;;;;;55199:112;53869:343;;;:::i;44935:29::-;;;;;;45488:64;;;;;-1:-1:-1;;;;;45488:64:0;;;45559:65;;;;;-1:-1:-1;;;;;45559:65:0;;;54999:192;;;;;;:::i;:::-;;:::i;54758:233::-;;;:::i;:::-;;;;6359:25:1;;;6415:2;6400:18;;6393:34;;;;6443:18;;;6436:34;6347:2;6332:18;54758:233:0;6157:319:1;24878:151:0;;;;;;:::i;:::-;;:::i;54220:341::-;;;:::i;36928:201::-;;;;;;:::i;:::-;;:::i;55663:86::-;55736:5;;-1:-1:-1;;;;;55736:5:0;55663:86;;45955:72;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;56086:108;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;;;;;;;;;36065:7;36092:6;;56138:48:::1;::::0;-1:-1:-1;;;;;36092:6:0;;;;56164:21:::1;56138:48:::0;::::1;;;::::0;56164:21;;56138:48;36065:7;56138:48;56164:21;36092:6;56138:48;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;56086:108::o:0;22998:100::-;23052:13;23085:5;23078:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22998:100;:::o;25349:201::-;25432:4;20718:10;25488:32;20718:10;25504:7;25513:6;25488:8;:32::i;:::-;-1:-1:-1;25538:4:0;;25349:201;-1:-1:-1;;;25349:201:0:o;26130:295::-;26261:4;20718:10;26319:38;26335:4;20718:10;26350:6;26319:15;:38::i;:::-;26368:27;26378:4;26384:2;26388:6;26368:9;:27::i;:::-;26413:4;26406:11;;;26130:295;;;;;;:::o;55446:117::-;55539:4;;55524:31;;;-1:-1:-1;;;55524:31:0;;;;55499:5;;-1:-1:-1;;;;;55539:4:0;;55524:29;;:31;;;;;;;;;;;;;;55539:4;55524:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55517:38;;55446:117;:::o;51073:857::-;20718:10;46706:16;46725:25;;;:16;:25;;;;;;46784:16;;46765:15;:35;46761:860;;46843:17;46858:1;46843:14;:17::i;:::-;46817:20;:43;46901:17;46916:1;46901:14;:17::i;:::-;46875:23;:43;46959:17;46974:1;46959:14;:17::i;:::-;46933:23;:43;48531:15;46991:14;:43;47056:9;47051:559;47075:8;47071:1;:12;47051:559;;;-1:-1:-1;;;;;47132:22:0;;47109:20;47132:22;;;:13;:22;;;;;;;;:25;;;;;;;;;;47212:7;47196:23;;;:105;;47284:8;47269:12;:23;:31;;47299:1;47196:105;;47269:31;47295:1;47196:105;;;47243:1;47196:105;47176:125;;;-1:-1:-1;;;;;;47324:21:0;;;47320:275;;47389:43;47396:7;47405:9;47416:12;47430:1;47389:6;:43::i;:::-;-1:-1:-1;;;;;47370:16:0;;;;;;:7;:16;;;;;:62;47544:20;47565:9;47544:31;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;47455:35:0;;;;;;:26;:35;;;;;;;;:86;;;;;;;;:120;47320:275;47090:520;;47085:3;;;;;:::i;:::-;;;;47051:559;;;;46761:860;51210:107:::1;51278:20;;51210:17;:31;51228:12;20718:10:::0;;20638:98;51228:12:::1;-1:-1:-1::0;;;;;51210:31:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;51210:31:0;;;:41;;;;;;;;;;:45:::1;:107::i;:::-;51175:15;:142;51153:214;;;::::0;-1:-1:-1;;;51153:214:0;;8376:2:1;51153:214:0::1;::::0;::::1;8358:21:1::0;8415:2;8395:18;;;8388:30;-1:-1:-1;;;8434:18:1;;;8427:52;8496:18;;51153:214:0::1;8174:346:1::0;51153:214:0::1;20718:10:::0;51378:20:::1;51401:27:::0;;;:13:::1;:27;::::0;;;;;;;:37;;;;;;;;;51473:23;;;:9:::1;:23:::0;;;;;;51457:39;::::1;;51449:69;;;::::0;-1:-1:-1;;;51449:69:0;;8727:2:1;51449:69:0::1;::::0;::::1;8709:21:1::0;8766:2;8746:18;;;8739:30;-1:-1:-1;;;8785:18:1;;;8778:47;8842:18;;51449:69:0::1;8525:341:1::0;51449:69:0::1;20718:10:::0;51569:1:::1;51529:27:::0;;;:13:::1;:27;::::0;;;;;;;:37;;;;;;;;:41;;;51581:23;;;:9:::1;:23:::0;;;;;:39;;51608:12;;51569:1;51581:39:::1;::::0;51608:12;;51581:39:::1;:::i;:::-;::::0;;;-1:-1:-1;51631:33:0::1;::::0;-1:-1:-1;20718:10:0;51637:12:::1;51651;51631:5;:33::i;:::-;51705:8;::::0;51675:67:::1;::::0;-1:-1:-1;;;;;51705:8:0::1;20718:10:::0;51682:4:::1;::::0;-1:-1:-1;;;;;51682:4:0::1;::::0;51675:67;51729:12;51675:29:::1;:67::i;:::-;20718:10:::0;51808:23:::1;::::0;;;:9:::1;:23;::::0;;;;;;;;;51758:164;;9232:25:1;;;9273:18;;;9266:34;;;51873:15:0::1;9316:18:1::0;;;9309:34;;;;9374:2;9359:18;;9352:34;;;51758:164:0::1;::::0;9219:3:1;9204:19;51758:164:0::1;;;;;;;;51142:788;46695:945:::0;51073:857;;:::o;49125:458::-;-1:-1:-1;;;;;49558:16:0;;49283:21;49558:16;;;:7;:16;;;;;;;;;49434:26;:35;;;;;:47;;;;;;;;;49333:242;;49558:16;49333:206;;49534:4;;49333:182;;49382:118;;:25;49397:9;49382:14;:25::i;:::-;:29;;:118::i;:::-;49333:12;;:30;:182::i;:::-;:200;;:206::i;:::-;:224;;:242::i;:::-;49317:258;49125:458;-1:-1:-1;;;;;49125:458:0:o;26834:238::-;26922:4;20718:10;26978:64;20718:10;26994:7;27031:10;27003:25;20718:10;26994:7;27003:9;:25::i;:::-;:38;;;;:::i;:::-;26978:8;:64::i;34376:91::-;34432:27;20718:10;34438:12;20638:98;49591:555;49707:21;;49746:393;49770:8;:15;49766:1;:19;49746:393;;;49807:18;49828:8;49837:1;49828:11;;;;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;49877:22:0;;49854:20;49877:22;;;:13;:22;;;;;;:34;;;;;;;;;;49828:11;;-1:-1:-1;49877:34:0;49962:7;49946:23;;;:97;;50026:8;50011:12;:23;:31;;50041:1;49946:97;;50011:31;50037:1;49946:97;;;49989:1;49946:97;49926:117;;;;50075:52;50082:7;50091:9;50102:12;50116:10;50075:6;:52::i;:::-;50058:69;;;;:::i;:::-;;;49792:347;;;49787:3;;;;;:::i;:::-;;;;49746:393;;;;49591:555;;;;:::o;53100:429::-;53204:7;53229:15;53257:7;53247;:17;:93;;53313:8;53303:7;:18;:36;;53333:3;53337:1;53333:6;;;53247:93;;53303:36;53324:3;53328:1;53324:6;;53247:93;53280:3;:6;53247:93;53229:111;;53371:150;53515:5;53371:121;53463:28;53486:4;53463:18;:16;:18::i;:::-;:22;;:28::i;:::-;53371:69;53401:38;53419:19;:17;:19::i;:::-;24206:12;;53401:13;24118:108;53401:38;53371:7;;:29;:69::i;51938:838::-;20718:10;46706:16;46725:25;;;:16;:25;;;;;;46784:16;;46765:15;:35;46761:860;;46843:17;46858:1;46843:14;:17::i;:::-;46817:20;:43;46901:17;46916:1;46901:14;:17::i;:::-;46875:23;:43;46959:17;46974:1;46959:14;:17::i;:::-;46933:23;:43;48531:15;46991:14;:43;47056:9;47051:559;47075:8;47071:1;:12;47051:559;;;-1:-1:-1;;;;;47132:22:0;;47109:20;47132:22;;;:13;:22;;;;;;;;:25;;;;;;;;;;47212:7;47196:23;;;:105;;47284:8;47269:12;:23;:31;;47299:1;47196:105;;47269:31;47295:1;47196:105;;;47243:1;47196:105;47176:125;;;-1:-1:-1;;;;;;47324:21:0;;;47320:275;;47389:43;47396:7;47405:9;47416:12;47430:1;47389:6;:43::i;:::-;-1:-1:-1;;;;;47370:16:0;;;;;;:7;:16;;;;;:62;47544:20;47565:9;47544:31;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;47455:35:0;;;;;;:26;:35;;;;;;;;:86;;;;;;;;:120;47320:275;47090:520;;47085:3;;;;;:::i;:::-;;;;47051:559;;;;46761:860;52052:14:::1;::::0;52077:394:::1;52101:8;:15;52097:1;:19;52077:394;;;52138:18;52159:8;52168:1;52159:11;;;;;;;;:::i;:::-;;;;;;;52138:32;;52185:20;52208:13;:27;52222:12;20718:10:::0;;20638:98;52222:12:::1;-1:-1:-1::0;;;;;52208:27:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;52208:27:0;;;:39;;;;;;;;;;-1:-1:-1;52297:7:0::1;52282:22:::0;::::1;:96;;52361:8;52346:12;:23;:31;;52376:1;52282:96;;52346:31;52372:1;52282:96;;;52324:1;52282:96;52262:116;;::::0;-1:-1:-1;52402:57:0::1;20718:10:::0;52423:9:::1;52434:12;52448:10;52402:6;:57::i;:::-;52393:66;;52123:348;;;52118:3;;;;;:::i;:::-;;;;52077:394;;;-1:-1:-1::0;52485:10:0;;52481:288:::1;;20718:10:::0;52536:1:::1;52512:21:::0;;;:7:::1;:21;::::0;;;;:25;52660:13:::1;::::0;52629:76:::1;::::0;-1:-1:-1;;;;;52660:13:0;;::::1;::::0;52689:15:::1;:6:::0;52700:3:::1;52689:10;:15::i;:::-;52636:5;::::0;-1:-1:-1;;;;;52636:5:0::1;::::0;52629:76;;:30:::1;:76::i;:::-;52725:32;::::0;1180:25:1;;;20718:10:0;;52725:32:::1;::::0;1168:2:1;1153:18;52725:32:0::1;1034:177:1::0;52481:288:0::1;52041:735;46695:945:::0;51938:838;;:::o;36670:103::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;36735:30:::1;36762:1;36735:18;:30::i;:::-;36670:103::o:0;52784:308::-;52882:7;52927:157;53078:5;52927:128;53026:28;53049:4;53026:18;:16;:18::i;:28::-;52927:76;52964:38;52982:19;:17;:19::i;52964:38::-;52927:3;52931:9;52927:14;;;;;;;:::i;:::-;;;;:36;:76::i;:157::-;52907:177;52784:308;-1:-1:-1;;52784:308:0:o;34786:164::-;34863:46;34879:7;20718:10;34902:6;34863:15;:46::i;:::-;34920:22;34926:7;34935:6;34920:5;:22::i;:::-;34786:164;;:::o;48343:96::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;48421:10:::1;:3;48427:4:::0;48421:10:::1;;:::i;47908:101::-:0;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;47981:8:::1;:20:::0;;-1:-1:-1;;;;;;47981:20:0::1;-1:-1:-1::0;;;;;47981:20:0;;;::::1;::::0;;;::::1;::::0;;47908:101::o;48562:555::-;48626:7;48668:16;;48650:15;:34;48646:75;;;-1:-1:-1;48708:1:0;;48562:555;-1:-1:-1;48562:555:0:o;48646:75::-;24206:12;;48752:1;48735:18;48731:89;;48777:20;48798:9;48777:31;;;;;;;:::i;:::-;;;;48562:555;-1:-1:-1;;48562:555:0:o;48731:89::-;48850:259;48904:190;49080:13;24206:12;;;24118:108;49080:13;48904:149;49048:4;48904:117;48999:21;49010:9;48999:10;:21::i;:::-;48904:68;48957:14;;48904:26;48531:15;;48447:107;48904:190;48850:20;48871:9;48850:31;;;;;;;:::i;:::-;;;;:35;:259::i;44971:38::-;;;;;;;;;;;;;;;-1:-1:-1;44971:38:0;:::o;23217:104::-;23273:13;23306:7;23299:14;;;;;:::i;54569:139::-;54615:7;54642:58;54687:12;54643:38;54661:19;:17;:19::i;55319:119::-;55413:5;;55398:32;;;-1:-1:-1;;;55398:32:0;;;;55373:5;;-1:-1:-1;;;;;55413:5:0;;55398:30;;:32;;;;;;;;;;;;;;55413:5;55398:32;;;;;;;;;;;;;;27575:436;27668:4;20718:10;27668:4;27751:25;20718:10;27768:7;27751:9;:25::i;:::-;27724:52;;27815:15;27795:16;:35;;27787:85;;;;-1:-1:-1;;;27787:85:0;;9732:2:1;27787:85:0;;;9714:21:1;9771:2;9751:18;;;9744:30;9810:34;9790:18;;;9783:62;-1:-1:-1;;;9861:18:1;;;9854:35;9906:19;;27787:85:0;9530:401:1;27787:85:0;27908:60;27917:5;27924:7;27952:15;27933:16;:34;27908:8;:60::i;:::-;-1:-1:-1;27999:4:0;;27575:436;-1:-1:-1;;;;27575:436:0:o;50154:911::-;20718:10;46706:16;46725:25;;;:16;:25;;;;;;46784:16;;46765:15;:35;46761:860;;46843:17;46858:1;46843:14;:17::i;:::-;46817:20;:43;46901:17;46916:1;46901:14;:17::i;:::-;46875:23;:43;46959:17;46974:1;46959:14;:17::i;:::-;46933:23;:43;48531:15;46991:14;:43;47056:9;47051:559;47075:8;47071:1;:12;47051:559;;;-1:-1:-1;;;;;47132:22:0;;47109:20;47132:22;;;:13;:22;;;;;;;;:25;;;;;;;;;;47212:7;47196:23;;;:105;;47284:8;47269:12;:23;:31;;47299:1;47196:105;;47269:31;47295:1;47196:105;;;47243:1;47196:105;47176:125;;;-1:-1:-1;;;;;;47324:21:0;;;47320:275;;47389:43;47396:7;47405:9;47416:12;47430:1;47389:6;:43::i;:::-;-1:-1:-1;;;;;47370:16:0;;;;;;:7;:16;;;;;:62;47544:20;47565:9;47544:31;;;;;;;:::i;:::-;;;-1:-1:-1;;;;;47455:35:0;;;;;;:26;:35;;;;;;;;:86;;;;;;;;:120;47320:275;47090:520;;47085:3;;;;;:::i;:::-;;;;47051:559;;;;46761:860;50249:1:::1;50240:6;:10;50232:37;;;::::0;-1:-1:-1;;;50232:37:0;;10138:2:1;50232:37:0::1;::::0;::::1;10120:21:1::0;10177:2;10157:18;;;10150:30;-1:-1:-1;;;10196:18:1;;;10189:44;10250:18;;50232:37:0::1;9936:338:1::0;50232:37:0::1;50288:13;::::0;::::1;;50280:43;;;::::0;-1:-1:-1;;;50280:43:0;;10481:2:1;50280:43:0::1;::::0;::::1;10463:21:1::0;10520:2;10500:18;;;10493:30;-1:-1:-1;;;10539:18:1;;;10532:47;10596:18;;50280:43:0::1;10279:341:1::0;50280:43:0::1;50339:28;20718:10:::0;50354:12:::1;20638:98:::0;50339:28:::1;50334:168;;50393:9;::::0;;50384:19:::1;::::0;;;:8:::1;:19;::::0;;;;:34;;-1:-1:-1;;;;;;50384:34:0::1;20718:10:::0;50384:34:::1;::::0;;50433:11;;;50393:9;50433:11:::1;::::0;::::1;:::i;:::-;;;;;;50486:4;50459:10;:24;50470:12;20718:10:::0;;20638:98;50470:12:::1;-1:-1:-1::0;;;;;50459:24:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;50459:24:0;:31;;-1:-1:-1;;50459:31:0::1;::::0;::::1;;::::0;;;::::1;::::0;;50334:168:::1;50512:61;20718:10:::0;50556:8:::1;::::0;50519:4:::1;::::0;-1:-1:-1;;;;;50519:4:0;;::::1;::::0;50512:61;50556:8:::1;50566:6:::0;50512:29:::1;:61::i;:::-;50584:27;20718:10:::0;50604:6:::1;50584:5;:27::i;:::-;20718:10:::0;50622:23:::1;::::0;;;:9:::1;:23;::::0;;;;:33;;50649:6;;50622:23;:33:::1;::::0;50649:6;;50622:33:::1;:::i;:::-;::::0;;;-1:-1:-1;;20718:10:0;50666:16:::1;50685:30:::0;;;:16:::1;:30;::::0;;;;;;;;;50726:13:::1;:27:::0;;;;;:37;;;;;;;;:46;;;50783:31;;;:17:::1;:31:::0;;;;;:41;;;;;;;;50827:15:::1;50783:59:::0;;50853:30;;;;;;:32;;50685:30;;50853:32;;::::1;::::0;::::1;:::i;:::-;;;;;;50922:12;20718:10:::0;;20638:98;50922:12:::1;-1:-1:-1::0;;;;;50901:156:0::1;;50949:9;:23;20718:10:::0;-1:-1:-1;;;;;50949:23:0::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;50949:23:0;;50901:156;;9232:25:1;;;9273:18;;;9266:34;;;51008:15:0::1;9316:18:1::0;;;9309:34;9374:2;9359:18;;9352:34;;;9219:3;9204:19;50901:156:0::1;9001:391:1::0;24622:193:0;24701:4;20718:10;24757:28;20718:10;24774:2;24778:6;24757:9;:28::i;55872:206::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;55984:43:::1;56011:7;36065::::0;36092:6;-1:-1:-1;;;;;36092:6:0;;36019:87;56011:7:::1;-1:-1:-1::0;;;;;55984:26:0;::::1;::::0;56020:6;55984:26:::1;:43::i;:::-;56043:27;::::0;56063:6;;-1:-1:-1;;;;;56043:27:0;::::1;::::0;::::1;::::0;;;::::1;55872:206:::0;;:::o;48224:111::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;48302:13:::1;:25:::0;;-1:-1:-1;;;;;;48302:25:0::1;-1:-1:-1::0;;;;;48302:25:0;;;::::1;::::0;;;::::1;::::0;;48224:111::o;47809:91::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;47873:13:::1;:19:::0;;-1:-1:-1;;47873:19:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47809:91::o;48088:128::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;48171:20:::1;:37:::0;48088:128::o;53869:343::-;53963:16;;;53977:1;53963:16;;;;;;;;53919:7;;;;53963:16;53977:1;53963:16;;;;;;;;-1:-1:-1;;54000:4:0;;53990:7;;;;-1:-1:-1;;;;;;54000:4:0;;53990:7;;-1:-1:-1;54000:4:0;;53990:7;;;;:::i;:::-;-1:-1:-1;;;;;53990:14:0;;;:7;;;;;;;;;:14;54025:4;;54015:7;;54025:4;;;54015;;54025;;54015:7;;;;;;:::i;:::-;-1:-1:-1;;;;;54015:14:0;;;:7;;;;;;;;;:14;54086:9;;54067:92;;-1:-1:-1;;;54067:92:0;;54040:24;;54086:9;;;;;;;;54067:43;;:92;;54125:4;;54144;;54067:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;54067:92:0;;;;;;;;;;;;:::i;:::-;54040:119;;54177:7;54202:1;54185:7;:14;:18;;;;:::i;:::-;54177:27;;;;;;;;:::i;:::-;;;;;;;54170:34;;;;53869:343;:::o;54999:192::-;55059:7;55128:55;55174:8;55128:41;55165:3;55128:32;55150:9;55128:21;:32::i;54758:233::-;54840:7;;;54927:17;54938:5;54927:3;54840:7;54927:6;;:17;54946;54957:5;54946:3;54950:1;54946:6;;:17;54965;54976:5;54965:3;54969:1;54965:6;;:17;54919:64;;;;;;54758:233;;;:::o;24878:151::-;-1:-1:-1;;;;;24994:18:0;;;24967:7;24994:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;24878:151::o;54220:341::-;54313:16;;;54327:1;54313:16;;;;;;;;54269:7;;;;54313:16;54327:1;54313:16;;;;;;;;-1:-1:-1;;54350:4:0;;54340:7;;;;-1:-1:-1;;;;;;54350:4:0;;54340:7;;-1:-1:-1;54350:4:0;;54340:7;;;;:::i;:::-;-1:-1:-1;;;;;54340:14:0;;;:7;;;;;;;;;:14;54375:4;;54365:7;;54375:4;;;54365;;54375;;54365:7;;;;;;:::i;:::-;-1:-1:-1;;;;;54365:14:0;;;:7;;;;;;;;;:14;54436:9;;54417:91;;-1:-1:-1;;;54417:91:0;;54390:24;;54436:9;;;;;;;;54417:43;;:91;;54475:3;;54493:4;;54417:91;;;:::i;36928:201::-;36065:7;36092:6;-1:-1:-1;;;;;36092:6:0;20718:10;36239:23;36231:68;;;;-1:-1:-1;;;36231:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37017:22:0;::::1;37009:73;;;::::0;-1:-1:-1;;;37009:73:0;;12895:2:1;37009:73:0::1;::::0;::::1;12877:21:1::0;12934:2;12914:18;;;12907:30;12973:34;12953:18;;;12946:62;-1:-1:-1;;;13024:18:1;;;13017:36;13070:19;;37009:73:0::1;12693:402:1::0;37009:73:0::1;37093:28;37112:8;37093:18;:28::i;31209:380::-:0;-1:-1:-1;;;;;31345:19:0;;31337:68;;;;-1:-1:-1;;;31337:68:0;;13302:2:1;31337:68:0;;;13284:21:1;13341:2;13321:18;;;13314:30;13380:34;13360:18;;;13353:62;-1:-1:-1;;;13431:18:1;;;13424:34;13475:19;;31337:68:0;13100:400:1;31337:68:0;-1:-1:-1;;;;;31424:21:0;;31416:68;;;;-1:-1:-1;;;31416:68:0;;13707:2:1;31416:68:0;;;13689:21:1;13746:2;13726:18;;;13719:30;13785:34;13765:18;;;13758:62;-1:-1:-1;;;13836:18:1;;;13829:32;13878:19;;31416:68:0;13505:398:1;31416:68:0;-1:-1:-1;;;;;31497:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;31549:32;;1180:25:1;;;31549:32:0;;1153:18:1;31549:32:0;;;;;;;;31209:380;;;:::o;31880:453::-;32015:24;32042:25;32052:5;32059:7;32042:9;:25::i;:::-;32015:52;;-1:-1:-1;;32082:16:0;:37;32078:248;;32164:6;32144:16;:26;;32136:68;;;;-1:-1:-1;;;32136:68:0;;14110:2:1;32136:68:0;;;14092:21:1;14149:2;14129:18;;;14122:30;14188:31;14168:18;;;14161:59;14237:18;;32136:68:0;13908:353:1;32136:68:0;32248:51;32257:5;32264:7;32292:6;32273:16;:25;32248:8;:51::i;28490:671::-;-1:-1:-1;;;;;28621:18:0;;28613:68;;;;-1:-1:-1;;;28613:68:0;;14468:2:1;28613:68:0;;;14450:21:1;14507:2;14487:18;;;14480:30;14546:34;14526:18;;;14519:62;-1:-1:-1;;;14597:18:1;;;14590:35;14642:19;;28613:68:0;14266:401:1;28613:68:0;-1:-1:-1;;;;;28700:16:0;;28692:64;;;;-1:-1:-1;;;28692:64:0;;14874:2:1;28692:64:0;;;14856:21:1;14913:2;14893:18;;;14886:30;14952:34;14932:18;;;14925:62;-1:-1:-1;;;15003:18:1;;;14996:33;15046:19;;28692:64:0;14672:399:1;28692:64:0;-1:-1:-1;;;;;28842:15:0;;28820:19;28842:15;;;:9;:15;;;;;;28876:21;;;;28868:72;;;;-1:-1:-1;;;28868:72:0;;15278:2:1;28868:72:0;;;15260:21:1;15317:2;15297:18;;;15290:30;15356:34;15336:18;;;15329:62;-1:-1:-1;;;15407:18:1;;;15400:36;15453:19;;28868:72:0;15076:402:1;28868:72:0;-1:-1:-1;;;;;28976:15:0;;;;;;;:9;:15;;;;;;28994:20;;;28976:38;;29036:13;;;;;;;;:23;;29008:6;;28976:15;29036:23;;29008:6;;29036:23;:::i;:::-;;;;;;;;29092:2;-1:-1:-1;;;;;29077:26:0;29086:4;-1:-1:-1;;;;;29077:26:0;;29096:6;29077:26;;;;1180:25:1;;1168:2;1153:18;;1034:177;29077:26:0;;;;;;;;29116:37;30180:591;40363:98;40421:7;40448:5;40452:1;40448;:5;:::i;30180:591::-;-1:-1:-1;;;;;30264:21:0;;30256:67;;;;-1:-1:-1;;;30256:67:0;;15685:2:1;30256:67:0;;;15667:21:1;15724:2;15704:18;;;15697:30;15763:34;15743:18;;;15736:62;-1:-1:-1;;;15814:18:1;;;15807:31;15855:19;;30256:67:0;15483:397:1;30256:67:0;-1:-1:-1;;;;;30423:18:0;;30398:22;30423:18;;;:9;:18;;;;;;30460:24;;;;30452:71;;;;-1:-1:-1;;;30452:71:0;;16087:2:1;30452:71:0;;;16069:21:1;16126:2;16106:18;;;16099:30;16165:34;16145:18;;;16138:62;-1:-1:-1;;;16216:18:1;;;16209:32;16258:19;;30452:71:0;15885:398:1;30452:71:0;-1:-1:-1;;;;;30559:18:0;;;;;;:9;:18;;;;;30580:23;;;30559:44;;30625:12;:22;;30597:6;;30559:18;30625:22;;30597:6;;30625:22;:::i;:::-;;;;-1:-1:-1;;30665:37:0;;1180:25:1;;;30691:1:0;;-1:-1:-1;;;;;30665:37:0;;;;;1168:2:1;1153:18;30665:37:0;1034:177:1;30715:48:0;30245:526;30180:591;;:::o;16882:248::-;17053:68;;-1:-1:-1;;;;;16546:15:1;;;17053:68:0;;;16528:34:1;16598:15;;16578:18;;;16571:43;16630:18;;;16623:34;;;17026:96:0;;17046:5;;-1:-1:-1;;;17076:27:0;16463:18:1;;17053:68:0;;;;-1:-1:-1;;17053:68:0;;;;;;;;;;;;;;-1:-1:-1;;;;;17053:68:0;-1:-1:-1;;;;;;17053:68:0;;;;;;;;;;17026:19;:96::i;40744:98::-;40802:7;40829:5;40833:1;40829;:5;:::i;41101:98::-;41159:7;41186:5;41190:1;41186;:5;:::i;41500:98::-;41558:7;41585:5;41589:1;41585;:5;:::i;37289:191::-;37363:16;37382:6;;-1:-1:-1;;;;;37399:17:0;;;-1:-1:-1;;;;;;37399:17:0;;;;;;37432:40;;37382:6;;;;;;;37432:40;;37363:16;37432:40;37352:128;37289:191;:::o;29448:399::-;-1:-1:-1;;;;;29532:21:0;;29524:65;;;;-1:-1:-1;;;29524:65:0;;17265:2:1;29524:65:0;;;17247:21:1;17304:2;17284:18;;;17277:30;17343:33;17323:18;;;17316:61;17394:18;;29524:65:0;17063:355:1;29524:65:0;29680:6;29664:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;29697:18:0;;;;;;:9;:18;;;;;:28;;29719:6;;29697:18;:28;;29719:6;;29697:28;:::i;:::-;;;;-1:-1:-1;;29741:37:0;;1180:25:1;;;-1:-1:-1;;;;;29741:37:0;;;29758:1;;29741:37;;1168:2:1;1153:18;29741:37:0;;;;;;;34786:164;;:::o;16663:211::-;16807:58;;-1:-1:-1;;;;;17615:32:1;;16807:58:0;;;17597:51:1;17664:18;;;17657:34;;;16780:86:0;;16800:5;;-1:-1:-1;;;16830:23:0;17570:18:1;;16807:58:0;17423:274:1;19236:716:0;19660:23;19686:69;19714:4;19686:69;;;;;;;;;;;;;;;;;19694:5;-1:-1:-1;;;;;19686:27:0;;;:69;;;;;:::i;:::-;19770:17;;19660:95;;-1:-1:-1;19770:21:0;19766:179;;19867:10;19856:30;;;;;;;;;;;;:::i;:::-;19848:85;;;;-1:-1:-1;;;19848:85:0;;18154:2:1;19848:85:0;;;18136:21:1;18193:2;18173:18;;;18166:30;18232:34;18212:18;;;18205:62;-1:-1:-1;;;18283:18:1;;;18276:40;18333:19;;19848:85:0;17952:406:1;7827:229:0;7964:12;7996:52;8018:6;8026:4;8032:1;8035:12;7996:21;:52::i;:::-;7989:59;7827:229;-1:-1:-1;;;;7827:229:0:o;8947:510::-;9117:12;9175:5;9150:21;:30;;9142:81;;;;-1:-1:-1;;;9142:81:0;;18565:2:1;9142:81:0;;;18547:21:1;18604:2;18584:18;;;18577:30;18643:34;18623:18;;;18616:62;-1:-1:-1;;;18694:18:1;;;18687:36;18740:19;;9142:81:0;18363:402:1;9142:81:0;-1:-1:-1;;;;;5377:19:0;;;9234:60;;;;-1:-1:-1;;;9234:60:0;;18972:2:1;9234:60:0;;;18954:21:1;19011:2;18991:18;;;18984:30;19050:31;19030:18;;;19023:59;19099:18;;9234:60:0;18770:353:1;9234:60:0;9308:12;9322:23;9349:6;-1:-1:-1;;;;;9349:11:0;9368:5;9375:4;9349:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9307:73;;;;9398:51;9415:7;9424:10;9436:12;9398:16;:51::i;:::-;9391:58;8947:510;-1:-1:-1;;;;;;;8947:510:0:o;11633:712::-;11783:12;11812:7;11808:530;;;-1:-1:-1;11843:10:0;11836:17;;11808:530;11957:17;;:21;11953:374;;12155:10;12149:17;12216:15;12203:10;12199:2;12195:19;12188:44;11953:374;12298:12;12291:20;;-1:-1:-1;;;12291:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:258:1;86:1;96:113;110:6;107:1;104:13;96:113;;;186:11;;;180:18;167:11;;;160:39;132:2;125:10;96:113;;;227:6;224:1;221:13;218:48;;;-1:-1:-1;;262:1:1;244:16;;237:27;14:258::o;277:383::-;426:2;415:9;408:21;389:4;458:6;452:13;501:6;496:2;485:9;481:18;474:34;517:66;576:6;571:2;560:9;556:18;551:2;543:6;539:15;517:66;:::i;:::-;644:2;623:15;-1:-1:-1;;619:29:1;604:45;;;;651:2;600:54;;277:383;-1:-1:-1;;277:383:1:o;665:173::-;733:20;;-1:-1:-1;;;;;782:31:1;;772:42;;762:70;;828:1;825;818:12;762:70;665:173;;;:::o;843:186::-;902:6;955:2;943:9;934:7;930:23;926:32;923:52;;;971:1;968;961:12;923:52;994:29;1013:9;994:29;:::i;1216:254::-;1284:6;1292;1345:2;1333:9;1324:7;1320:23;1316:32;1313:52;;;1361:1;1358;1351:12;1313:52;1384:29;1403:9;1384:29;:::i;:::-;1374:39;1460:2;1445:18;;;;1432:32;;-1:-1:-1;;;1216:254:1:o;1667:328::-;1744:6;1752;1760;1813:2;1801:9;1792:7;1788:23;1784:32;1781:52;;;1829:1;1826;1819:12;1781:52;1852:29;1871:9;1852:29;:::i;:::-;1842:39;;1900:38;1934:2;1923:9;1919:18;1900:38;:::i;:::-;1890:48;;1985:2;1974:9;1970:18;1957:32;1947:42;;1667:328;;;;;:::o;2189:180::-;2248:6;2301:2;2289:9;2280:7;2276:23;2272:32;2269:52;;;2317:1;2314;2307:12;2269:52;-1:-1:-1;2340:23:1;;2189:180;-1:-1:-1;2189:180:1:o;2374:391::-;2460:6;2468;2476;2484;2537:3;2525:9;2516:7;2512:23;2508:33;2505:53;;;2554:1;2551;2544:12;2505:53;2577:29;2596:9;2577:29;:::i;:::-;2567:39;2653:2;2638:18;;2625:32;;-1:-1:-1;2704:2:1;2689:18;;2676:32;;2755:2;2740:18;2727:32;;-1:-1:-1;2374:391:1;-1:-1:-1;;;2374:391:1:o;2770:127::-;2831:10;2826:3;2822:20;2819:1;2812:31;2862:4;2859:1;2852:15;2886:4;2883:1;2876:15;2902:275;2973:2;2967:9;3038:2;3019:13;;-1:-1:-1;;3015:27:1;3003:40;;3073:18;3058:34;;3094:22;;;3055:62;3052:88;;;3120:18;;:::i;:::-;3156:2;3149:22;2902:275;;-1:-1:-1;2902:275:1:o;3182:183::-;3242:4;3275:18;3267:6;3264:30;3261:56;;;3297:18;;:::i;:::-;-1:-1:-1;3342:1:1;3338:14;3354:4;3334:25;;3182:183::o;3370:662::-;3424:5;3477:3;3470:4;3462:6;3458:17;3454:27;3444:55;;3495:1;3492;3485:12;3444:55;3531:6;3518:20;3557:4;3581:60;3597:43;3637:2;3597:43;:::i;:::-;3581:60;:::i;:::-;3675:15;;;3761:1;3757:10;;;;3745:23;;3741:32;;;3706:12;;;;3785:15;;;3782:35;;;3813:1;3810;3803:12;3782:35;3849:2;3841:6;3837:15;3861:142;3877:6;3872:3;3869:15;3861:142;;;3943:17;;3931:30;;3981:12;;;;3894;;3861:142;;;-1:-1:-1;4021:5:1;3370:662;-1:-1:-1;;;;;;3370:662:1:o;4037:422::-;4130:6;4138;4191:2;4179:9;4170:7;4166:23;4162:32;4159:52;;;4207:1;4204;4197:12;4159:52;4230:29;4249:9;4230:29;:::i;:::-;4220:39;;4310:2;4299:9;4295:18;4282:32;4337:18;4329:6;4326:30;4323:50;;;4369:1;4366;4359:12;4323:50;4392:61;4445:7;4436:6;4425:9;4421:22;4392:61;:::i;:::-;4382:71;;;4037:422;;;;;:::o;4672:348::-;4756:6;4809:2;4797:9;4788:7;4784:23;4780:32;4777:52;;;4825:1;4822;4815:12;4777:52;4865:9;4852:23;4898:18;4890:6;4887:30;4884:50;;;4930:1;4927;4920:12;4884:50;4953:61;5006:7;4997:6;4986:9;4982:22;4953:61;:::i;5025:758::-;5107:6;5160:2;5148:9;5139:7;5135:23;5131:32;5128:52;;;5176:1;5173;5166:12;5128:52;5225:7;5218:4;5207:9;5203:20;5199:34;5189:62;;5247:1;5244;5237:12;5189:62;5280:2;5274:9;5322:2;5314:6;5310:15;5391:6;5379:10;5376:22;5355:18;5343:10;5340:34;5337:62;5334:88;;;5402:18;;:::i;:::-;5438:2;5431:22;5473:6;5517:2;5502:18;;5532:19;;;5529:39;;;5564:1;5561;5554:12;5529:39;5588:9;5606:146;5622:6;5617:3;5614:15;5606:146;;;5690:17;;5678:30;;5737:4;5728:14;;;;5639;5606:146;;;-1:-1:-1;5771:6:1;;5025:758;-1:-1:-1;;;;;5025:758:1:o;5788:118::-;5874:5;5867:13;5860:21;5853:5;5850:32;5840:60;;5896:1;5893;5886:12;5911:241;5967:6;6020:2;6008:9;5999:7;5995:23;5991:32;5988:52;;;6036:1;6033;6026:12;5988:52;6075:9;6062:23;6094:28;6116:5;6094:28;:::i;6481:260::-;6549:6;6557;6610:2;6598:9;6589:7;6585:23;6581:32;6578:52;;;6626:1;6623;6616:12;6578:52;6649:29;6668:9;6649:29;:::i;:::-;6639:39;;6697:38;6731:2;6720:9;6716:18;6697:38;:::i;:::-;6687:48;;6481:260;;;;;:::o;6746:356::-;6948:2;6930:21;;;6967:18;;;6960:30;7026:34;7021:2;7006:18;;6999:62;7093:2;7078:18;;6746:356::o;7107:380::-;7186:1;7182:12;;;;7229;;;7250:61;;7304:4;7296:6;7292:17;7282:27;;7250:61;7357:2;7349:6;7346:14;7326:18;7323:38;7320:161;;7403:10;7398:3;7394:20;7391:1;7384:31;7438:4;7435:1;7428:15;7466:4;7463:1;7456:15;7320:161;;7107:380;;;:::o;7492:273::-;7560:6;7613:2;7601:9;7592:7;7588:23;7584:32;7581:52;;;7629:1;7626;7619:12;7581:52;7661:9;7655:16;7711:4;7704:5;7700:16;7693:5;7690:27;7680:55;;7731:1;7728;7721:12;7770:127;7831:10;7826:3;7822:20;7819:1;7812:31;7862:4;7859:1;7852:15;7886:4;7883:1;7876:15;7902:127;7963:10;7958:3;7954:20;7951:1;7944:31;7994:4;7991:1;7984:15;8018:4;8015:1;8008:15;8034:135;8073:3;8094:17;;;8091:43;;8114:18;;:::i;:::-;-1:-1:-1;8161:1:1;8150:13;;8034:135::o;8871:125::-;8911:4;8939:1;8936;8933:8;8930:34;;;8944:18;;:::i;:::-;-1:-1:-1;8981:9:1;;8871:125::o;9397:128::-;9437:3;9468:1;9464:6;9461:1;9458:13;9455:39;;;9474:18;;:::i;:::-;-1:-1:-1;9510:9:1;;9397:128::o;10625:461::-;10678:3;10716:5;10710:12;10743:6;10738:3;10731:19;10769:4;10798:2;10793:3;10789:12;10782:19;;10835:2;10828:5;10824:14;10856:1;10866:195;10880:6;10877:1;10874:13;10866:195;;;10945:13;;-1:-1:-1;;;;;10941:39:1;10929:52;;11001:12;;;;11036:15;;;;10977:1;10895:9;10866:195;;;-1:-1:-1;11077:3:1;;10625:461;-1:-1:-1;;;;;10625:461:1:o;11091:358::-;11324:6;11313:9;11306:25;11367:2;11362;11351:9;11347:18;11340:30;11287:4;11387:56;11439:2;11428:9;11424:18;11416:6;11387:56;:::i;11454:881::-;11549:6;11580:2;11623;11611:9;11602:7;11598:23;11594:32;11591:52;;;11639:1;11636;11629:12;11591:52;11672:9;11666:16;11705:18;11697:6;11694:30;11691:50;;;11737:1;11734;11727:12;11691:50;11760:22;;11813:4;11805:13;;11801:27;-1:-1:-1;11791:55:1;;11842:1;11839;11832:12;11791:55;11871:2;11865:9;11894:60;11910:43;11950:2;11910:43;:::i;11894:60::-;11988:15;;;12070:1;12066:10;;;;12058:19;;12054:28;;;12019:12;;;;12094:19;;;12091:39;;;12126:1;12123;12116:12;12091:39;12150:11;;;;12170:135;12186:6;12181:3;12178:15;12170:135;;;12252:10;;12240:23;;12203:12;;;;12283;;;;12170:135;;16668:168;16708:7;16774:1;16770;16766:6;16762:14;16759:1;16756:21;16751:1;16744:9;16737:17;16733:45;16730:71;;;16781:18;;:::i;:::-;-1:-1:-1;16821:9:1;;16668:168::o;16841:217::-;16881:1;16907;16897:132;;16951:10;16946:3;16942:20;16939:1;16932:31;16986:4;16983:1;16976:15;17014:4;17011:1;17004:15;16897:132;-1:-1:-1;17043:9:1;;16841:217::o;17702:245::-;17769:6;17822:2;17810:9;17801:7;17797:23;17793:32;17790:52;;;17838:1;17835;17828:12;17790:52;17870:9;17864:16;17889:28;17911:5;17889:28;:::i;19128:274::-;19257:3;19295:6;19289:13;19311:53;19357:6;19352:3;19345:4;19337:6;19333:17;19311:53;:::i;:::-;19380:16;;;;;19128:274;-1:-1:-1;;19128:274:1:o
Swarm Source
ipfs://35535641d4e8104d6bf8da2ba2952117db643213d6476915c6a608b56f46dac2
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.