More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 349 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 21409335 | 16 days ago | IN | 0 ETH | 0.00145663 | ||||
Withdraw | 21409308 | 16 days ago | IN | 0 ETH | 0.0011195 | ||||
Recover Wrong To... | 21392236 | 18 days ago | IN | 0 ETH | 0.00042723 | ||||
Withdraw | 21385268 | 19 days ago | IN | 0 ETH | 0.00220598 | ||||
Deposit | 21325709 | 28 days ago | IN | 0 ETH | 0.00434298 | ||||
Withdraw | 21311050 | 30 days ago | IN | 0 ETH | 0.0020441 | ||||
Withdraw | 21311045 | 30 days ago | IN | 0 ETH | 0.00141225 | ||||
Withdraw | 21307360 | 30 days ago | IN | 0 ETH | 0.00137921 | ||||
Update Reward Pe... | 21193689 | 46 days ago | IN | 0 ETH | 0.00082938 | ||||
Update Start And... | 21193688 | 46 days ago | IN | 0 ETH | 0.00141047 | ||||
Withdraw | 21182164 | 48 days ago | IN | 0 ETH | 0.00445716 | ||||
Withdraw | 21164652 | 50 days ago | IN | 0 ETH | 0.00178967 | ||||
Withdraw | 21059413 | 65 days ago | IN | 0 ETH | 0.00075145 | ||||
Update Reward Pe... | 20973064 | 77 days ago | IN | 0 ETH | 0.00069758 | ||||
Update Start And... | 20973063 | 77 days ago | IN | 0 ETH | 0.00115599 | ||||
Withdraw | 20962586 | 78 days ago | IN | 0 ETH | 0.00147077 | ||||
Withdraw | 20962577 | 78 days ago | IN | 0 ETH | 0.00234073 | ||||
Withdraw | 20931267 | 83 days ago | IN | 0 ETH | 0.00107636 | ||||
Withdraw | 20852848 | 94 days ago | IN | 0 ETH | 0.00057915 | ||||
Withdraw | 20780797 | 104 days ago | IN | 0 ETH | 0.00093468 | ||||
Withdraw | 20779667 | 104 days ago | IN | 0 ETH | 0.00097843 | ||||
Update Reward Pe... | 20766345 | 106 days ago | IN | 0 ETH | 0.00008408 | ||||
Update Start And... | 20766343 | 106 days ago | IN | 0 ETH | 0.00013488 | ||||
Deposit | 20765538 | 106 days ago | IN | 0 ETH | 0.00067783 | ||||
Withdraw | 20734079 | 110 days ago | IN | 0 ETH | 0.00031202 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
DropsTier1
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-03-25 */ // SPDX-License-Identifier: MIT /*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀.⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠛⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ Drops Lock Marketplace is the first locked liquidity marketplace. This is the Drops Tier 01 Earning Center smart contract. https://drops.site https://t.me/dropserc https://x.com/dropserc $DROPS token address -> 0xA562912e1328eEA987E04c2650EfB5703757850C */ pragma solidity ^0.8.20; /** * @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; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } pragma solidity ^0.8.20; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant NOT_ENTERED = 1; uint256 private constant ENTERED = 2; uint256 private _status; /** * @dev Unauthorized reentrant call. */ error ReentrancyGuardReentrantCall(); constructor() { _status = NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { _nonReentrantBefore(); _; _nonReentrantAfter(); } function _nonReentrantBefore() private { // On the first call to nonReentrant, _status will be NOT_ENTERED if (_status == ENTERED) { revert ReentrancyGuardReentrantCall(); } // Any calls to nonReentrant after this point will fail _status = ENTERED; } function _nonReentrantAfter() private { // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = NOT_ENTERED; } /** * @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a * `nonReentrant` function in the call stack. */ function _reentrancyGuardEntered() internal view returns (bool) { return _status == ENTERED; } } 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); } pragma solidity >=0.6.2; interface IUniswapV2Router02 is IUniswapV2Router01 { function removeLiquidityETHSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountETH); function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountETH); function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable; function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; } // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ 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 value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of 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 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` 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 value) external returns (bool); function decimals() external view returns(uint8); } // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @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. * * The initial owner is set to the address provided by the deployer. 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; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling 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 { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _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); } } 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); } } } } 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"); } } } pragma solidity 0.8.20; contract DropsTier1 is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; IUniswapV2Router02 public hashSwapRouter; address public hashSwapPair; // The address of the smart chef factory address public SMART_CHEF_FACTORY; // Fee wallet address public feeAddress = 0xcdB94D75b5522B0440f638a17bE7f8d70a7745f6; // Whether a limit is set for users bool public hasUserLimit; // Whether contract is initialized bool public isInitialized; // Accrued token per share uint256 public accTokenPerShare; uint256 public bonusEndBlock; uint256 public startBlock; // The block number of the last pool update uint256 public lastRewardBlock; // The pool limit (0 if none) uint256 public poolLimitPerUser; uint256 public rewardPerBlock; // Deposit Fee. uint256 public depositFeeBP; // Withdraw Fee. uint256 public withdrawFeeBP; uint256 public contractLockPeriod; // 6-month in seconds // The precision factor uint256 public PRECISION_FACTOR; // The reward token IERC20 public rewardToken; // The staked token IERC20 public stakedToken; // The total staked amount uint256 public totalstakedAmount = 0; uint256 public withdrawalFeeInterval; uint256 public withdrawalFeeDeadline; mapping(address => UserInfo) public userInfo; struct UserInfo { uint256 amount; // How many staked tokens the user has provided uint256 rewardDebt; // Reward debt uint256 noWithdrawalFeeAfter; uint256 depositTime; uint256 rewardLockedUp; // Reward locked up. } event AdminTokenRecovery(address tokenRecovered, uint256 amount); event Deposit(address indexed user, uint256 amount); event EmergencyWithdraw(address indexed user, uint256 amount); event NewStartAndEndBlocks(uint256 startBlock, uint256 endBlock); event NewRewardPerBlock(uint256 rewardPerBlock); event NewPoolLimit(uint256 poolLimitPerUser); event RewardsStop(uint256 blockNumber); event Withdraw(address indexed user, uint256 amount); event NewFees(uint256 newDepositFeeBP, uint256 newWithdrawFeeBP); event UpdatedFeeAddress(address oldfeeaddress, address newfeeaddress); constructor() Ownable(msg.sender) { SMART_CHEF_FACTORY = msg.sender; } receive() external payable {} /// @notice Initialize the contract /// @param _stakedToken Staked token address /// @param _rewardToken Reward token address /// @param _rewardPerBlock Reward per block (in rewardToken) /// @param _startBlock Start block /// @param _bonusEndBlock End block /// @param _poolLimitPerUser Pool limit per user in stakedToken (if any, else 0) function initialize( IERC20 _stakedToken, IERC20 _rewardToken, uint256 _rewardPerBlock, uint256 _startBlock, uint256 _bonusEndBlock, uint256 _poolLimitPerUser, uint256 _depositFeeBP, uint256 _withdrawFeeBP, uint256 _withdrawalFeeInterval, uint256 _withdrawalFeeDeadline, uint256 _contractLockPeriod ) external { require(!isInitialized, "Already initialized"); require(msg.sender == SMART_CHEF_FACTORY, "Not factory"); require(_depositFeeBP <= 10000, "Cannot be bigger than 100"); require(_withdrawFeeBP <= 10000, "Cannot be bigger than 100"); isInitialized = true; stakedToken = _stakedToken; rewardToken = _rewardToken; rewardPerBlock = _rewardPerBlock; startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; depositFeeBP = _depositFeeBP; withdrawFeeBP = _withdrawFeeBP; withdrawalFeeInterval = _withdrawalFeeInterval; withdrawalFeeDeadline = _withdrawalFeeDeadline; contractLockPeriod = _contractLockPeriod; if (_poolLimitPerUser > 0) { hasUserLimit = true; poolLimitPerUser = _poolLimitPerUser; } uint256 decimalsRewardToken = IERC20(_rewardToken).decimals(); require(decimalsRewardToken < 30, "Must be inferior to 30"); PRECISION_FACTOR = uint256(10**(30-decimalsRewardToken)); // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; } function remainLockTime(address _user) public view returns (uint256) { UserInfo storage user = userInfo[_user]; uint256 timeElapsed = block.timestamp - (user.depositTime); uint256 remainingLockTime = 0; if (user.depositTime == 0) { remainingLockTime = 0; } else if(timeElapsed < contractLockPeriod) { remainingLockTime = (contractLockPeriod - (timeElapsed)) > bonusEndBlock ? bonusEndBlock : (contractLockPeriod - (timeElapsed)); } return remainingLockTime; } /// @notice Deposit staked tokens and collect reward tokens (if any) /// @param _amount Amount to withdraw (in rewardToken) function deposit(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 remainLock = remainLockTime(msg.sender); uint256 depositAmount = _amount; if (hasUserLimit) { require(_amount + user.amount <= poolLimitPerUser, "User amount above limit"); } _updatePool(); if (user.amount > 0) { uint256 pending = (user.amount * accTokenPerShare) / PRECISION_FACTOR - user.rewardDebt; if (pending > 0 || user.rewardLockedUp > 0) { if (remainLock <= 0) { pending = pending + user.rewardLockedUp; rewardToken.safeTransfer(address(msg.sender), pending); user.rewardLockedUp = 0; } else if (pending > 0) { user.rewardLockedUp = user.rewardLockedUp + pending; } } } if (_amount > 0) { require(stakedToken.balanceOf(address(msg.sender)) >= _amount); uint256 beforeStakedTokenTotalBalance = stakedToken.balanceOf(address(this)); if(depositFeeBP > 0) { uint256 depositFee = _amount * depositFeeBP /10000; stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount - depositFee); stakedToken.safeTransferFrom(address(msg.sender), feeAddress, depositFee); } else { stakedToken.safeTransferFrom(address(msg.sender), address(this), _amount); } uint256 depositedAmount = stakedToken.balanceOf(address(this)) - beforeStakedTokenTotalBalance; user.amount = user.amount + depositedAmount; depositAmount = depositedAmount; totalstakedAmount = totalstakedAmount + depositedAmount; uint256 shouldNotWithdrawBefore = block.timestamp + withdrawalFeeInterval; if (shouldNotWithdrawBefore > withdrawalFeeDeadline) { shouldNotWithdrawBefore = withdrawalFeeDeadline; } user.noWithdrawalFeeAfter = shouldNotWithdrawBefore; user.depositTime = block.timestamp; } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; emit Deposit(msg.sender, depositAmount); } /// @notice Withdraw staked tokens and collect reward tokens /// @param _amount Amount to withdraw (in rewardToken) function withdraw(uint256 _amount) external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 remainLock = remainLockTime(msg.sender); require(user.amount >= _amount, "Amount to withdraw too high"); require(remainLock <= 0, "withdraw: locktime remains!"); _updatePool(); uint256 pending = user.amount * accTokenPerShare / PRECISION_FACTOR - user.rewardDebt + user.rewardLockedUp; if (_amount > 0) { uint256 beforestakedtokentotalsupply = stakedToken.balanceOf(address(this)); if(withdrawFeeBP > 0) { uint256 withdrawFee = _amount * withdrawFeeBP / 10000; stakedToken.safeTransfer(address(msg.sender), _amount - withdrawFee); stakedToken.safeTransfer(feeAddress, withdrawFee); } else { stakedToken.safeTransfer(address(msg.sender), _amount); } uint256 withdrawamount = beforestakedtokentotalsupply - stakedToken.balanceOf(address(this)); totalstakedAmount = totalstakedAmount - withdrawamount; user.amount = user.amount - withdrawamount; user.noWithdrawalFeeAfter = block.timestamp + withdrawalFeeInterval; } if (pending > 0) { rewardToken.safeTransfer(address(msg.sender), pending); } user.rewardDebt = (user.amount * accTokenPerShare) / PRECISION_FACTOR; user.rewardLockedUp = 0; emit Withdraw(msg.sender, _amount); } /// @notice Withdraw staked tokens without caring about rewards rewards /// @dev Needs to be for emergency. function emergencyWithdraw() external nonReentrant { UserInfo storage user = userInfo[msg.sender]; uint256 amountToTransfer = user.amount; user.amount = 0; user.rewardDebt = 0; user.rewardLockedUp = 0; if (amountToTransfer > 0) { totalstakedAmount = totalstakedAmount - amountToTransfer; stakedToken.safeTransfer(address(msg.sender), amountToTransfer); } emit EmergencyWithdraw(msg.sender, user.amount); } /// @notice Stop rewards /// @dev Only callable by owner. Needs to be for emergency. function emergencyRewardWithdraw(uint256 _amount) external onlyOwner { rewardToken.safeTransfer(address(msg.sender), _amount); } function recoverWrongTokens(address _tokenAddress, uint256 _tokenAmount) external onlyOwner { IERC20(_tokenAddress).transfer(address(msg.sender), _tokenAmount); emit AdminTokenRecovery(_tokenAddress, _tokenAmount); } function clearStuckBalance(uint256 amountPercentage, address _walletAddress) external onlyOwner { require(_walletAddress != address(this)); uint256 amountETH = address(this).balance; payable(_walletAddress).transfer(amountETH * amountPercentage / 100); } /// @notice Stop rewards /// @dev Only callable by owner function stopReward() external onlyOwner { bonusEndBlock = block.number; } /// @notice Update pool limit per user /// @dev Only callable by owner. /// @param _hasUserLimit Whether the limit remains forced /// @param _poolLimitPerUser New pool limit per user function updatePoolLimitPerUser(bool _hasUserLimit, uint256 _poolLimitPerUser) external onlyOwner { require(hasUserLimit, "Must be set"); if (_hasUserLimit) { require(_poolLimitPerUser > poolLimitPerUser, "New limit must be higher"); poolLimitPerUser = _poolLimitPerUser; } else { hasUserLimit = _hasUserLimit; poolLimitPerUser = 0; } emit NewPoolLimit(poolLimitPerUser); } /// @notice Update reward per block /// @dev Only callable by owner. /// @param _rewardPerBlock The reward per block function updateRewardPerBlock(uint256 _rewardPerBlock) external onlyOwner { rewardPerBlock = _rewardPerBlock; emit NewRewardPerBlock(_rewardPerBlock); } function updateFees(uint256 _newDepositFeeBP, uint256 _newWithdrawFeeBP) external onlyOwner { require(_newDepositFeeBP <= 10000, "Cannot be bigger than 100"); require(_newWithdrawFeeBP <= 10000, "Cannot be bigger than 100"); depositFeeBP = _newDepositFeeBP; withdrawFeeBP = _newWithdrawFeeBP; emit NewFees(depositFeeBP, withdrawFeeBP); } function updateFeeAddress(address newFeeAddress) external { require(msg.sender == feeAddress, "Set: You do not have right permission"); emit UpdatedFeeAddress(feeAddress, newFeeAddress); feeAddress = newFeeAddress; } /// @notice It allows the admin to update start and end blocks /// @dev This function is only callable by owner. /// @param _startBlock The new start block /// @param _bonusEndBlock The new end block function updateStartAndEndBlocks( uint256 _startBlock, uint256 _bonusEndBlock, uint256 _withdrawalFeeInterval, uint256 _withdrawalFeeDeadline, uint256 _contractLockPeriod ) external onlyOwner { require(_startBlock < _bonusEndBlock, "New startBlock must be lower than new endBlock"); require(block.number < _startBlock, "New startBlock must be higher than current block"); startBlock = _startBlock; bonusEndBlock = _bonusEndBlock; withdrawalFeeInterval = _withdrawalFeeInterval; withdrawalFeeDeadline = _withdrawalFeeDeadline; contractLockPeriod = _contractLockPeriod; // Set the lastRewardBlock as the startBlock lastRewardBlock = startBlock; emit NewStartAndEndBlocks(_startBlock, _bonusEndBlock); } /// @notice View function to see pending reward on frontend. /// @param _user User address /// @return uint256 Reward for a given user function pendingReward(address _user) external view returns (uint256) { UserInfo storage user = userInfo[_user]; if (block.number > lastRewardBlock && totalstakedAmount != 0) { uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 vivReward = multiplier * rewardPerBlock; uint256 adjustedTokenPerShare = accTokenPerShare + (vivReward * PRECISION_FACTOR / totalstakedAmount); return user.amount * adjustedTokenPerShare / PRECISION_FACTOR - user.rewardDebt; } else { return user.amount * accTokenPerShare / PRECISION_FACTOR - user.rewardDebt; } } /// @notice Update reward variables of the given pool to be up-to-date. function _updatePool() internal { if (block.number <= lastRewardBlock) { return; } if (totalstakedAmount == 0) { lastRewardBlock = block.number; return; } uint256 multiplier = _getMultiplier(lastRewardBlock, block.number); uint256 vivReward = multiplier * rewardPerBlock; accTokenPerShare = accTokenPerShare + (vivReward * PRECISION_FACTOR / totalstakedAmount); lastRewardBlock = block.number; } /// @notice Return reward multiplier over the given _from to _to block. /// @param _from Block to start /// @param _to Block to finish function _getMultiplier(uint256 _from, uint256 _to) internal view returns (uint256) { if (_to <= bonusEndBlock) { return _to - _from; } else if (_from >= bonusEndBlock) { return 0; } else { return bonusEndBlock - _from; } } function rewardDuration() public view returns (uint256) { return bonusEndBlock - startBlock; } function calcRewardPerBlock() public onlyOwner { require(block.number < startBlock, "Pool has started"); uint256 rewardBal = rewardToken.balanceOf(address(this)); rewardPerBlock = rewardBal / rewardDuration(); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenRecovered","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AdminTokenRecovery","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newDepositFeeBP","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newWithdrawFeeBP","type":"uint256"}],"name":"NewFees","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"poolLimitPerUser","type":"uint256"}],"name":"NewPoolLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"rewardPerBlock","type":"uint256"}],"name":"NewRewardPerBlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startBlock","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endBlock","type":"uint256"}],"name":"NewStartAndEndBlocks","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":false,"internalType":"uint256","name":"blockNumber","type":"uint256"}],"name":"RewardsStop","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"oldfeeaddress","type":"address"},{"indexed":false,"internalType":"address","name":"newfeeaddress","type":"address"}],"name":"UpdatedFeeAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"PRECISION_FACTOR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SMART_CHEF_FACTORY","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accTokenPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusEndBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"calcRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountPercentage","type":"uint256"},{"internalType":"address","name":"_walletAddress","type":"address"}],"name":"clearStuckBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractLockPeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositFeeBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"emergencyRewardWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hasUserLimit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hashSwapPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hashSwapRouter","outputs":[{"internalType":"contract IUniswapV2Router02","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"_stakedToken","type":"address"},{"internalType":"contract IERC20","name":"_rewardToken","type":"address"},{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"},{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"},{"internalType":"uint256","name":"_depositFeeBP","type":"uint256"},{"internalType":"uint256","name":"_withdrawFeeBP","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFeeInterval","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFeeDeadline","type":"uint256"},{"internalType":"uint256","name":"_contractLockPeriod","type":"uint256"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastRewardBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"pendingReward","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolLimitPerUser","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverWrongTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"remainLockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rewardDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardPerBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rewardToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"startBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stopReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalstakedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newFeeAddress","type":"address"}],"name":"updateFeeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newDepositFeeBP","type":"uint256"},{"internalType":"uint256","name":"_newWithdrawFeeBP","type":"uint256"}],"name":"updateFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_hasUserLimit","type":"bool"},{"internalType":"uint256","name":"_poolLimitPerUser","type":"uint256"}],"name":"updatePoolLimitPerUser","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rewardPerBlock","type":"uint256"}],"name":"updateRewardPerBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_startBlock","type":"uint256"},{"internalType":"uint256","name":"_bonusEndBlock","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFeeInterval","type":"uint256"},{"internalType":"uint256","name":"_withdrawalFeeDeadline","type":"uint256"},{"internalType":"uint256","name":"_contractLockPeriod","type":"uint256"}],"name":"updateStartAndEndBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"noWithdrawalFeeAfter","type":"uint256"},{"internalType":"uint256","name":"depositTime","type":"uint256"},{"internalType":"uint256","name":"rewardLockedUp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeeBP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalFeeDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawalFeeInterval","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6080604052600580546001600160a01b03191673cdb94d75b5522b0440f638a17be7f8d70a7745f61790555f601255348015610039575f80fd5b50338061005f57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006881610084565b5060018055600480546001600160a01b031916331790556100d3565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6120d9806100e05f395ff3fe60806040526004361061024c575f3560e01c80638ae39cac11610134578063c50aa8a2116100b3578063dd10546a11610078578063dd10546a1461069c578063eb664296146106bb578063f2fde38b146106d0578063f40f0f52146106ef578063f520e7e51461070e578063f7c618c114610722575f80fd5b8063c50aa8a214610620578063cc7a262e1461063f578063ccd34cd51461065e578063d56dda0114610673578063db2e21bc14610688575f80fd5b8063a9f8d181116100f9578063a9f8d18114610599578063aa07547d146105ae578063b6b55f25146105c3578063bbcaac38146105e2578063bd61719114610601575f80fd5b80638ae39cac146105145780638da5cb5b146105295780638f6629151461054557806392e8990e1461055a578063a0b409051461057a575f80fd5b806341275358116101cb5780636b89bb3f116101905780636b89bb3f1461047a5780636db7943714610499578063715018a6146104b85780637a988f97146104cc5780637e2fd586146104e157806380dc067214610500575f80fd5b806341275358146103e557806348cd4cb11461041c57806354747a701461043157806356a227f21461044657806366fe9f8a14610465575f80fd5b80631aed6553116102115780631aed6553146103435780632e1a7d4d146103585780633279beab14610377578063392e53cd146103965780633f138d4b146103c6575f80fd5b806301a0011f1461025757806301f8a9761461026d57806303dc1f9b1461028c57806313bc67aa146102be5780631959a002146102d3575f80fd5b3661025357005b5f80fd5b348015610262575f80fd5b5061026b610741565b005b348015610278575f80fd5b5061026b610287366004611cb1565b610816565b348015610297575f80fd5b506102ab6102a6366004611cdc565b610859565b6040519081526020015b60405180910390f35b3480156102c9575f80fd5b506102ab600e5481565b3480156102de575f80fd5b5061031b6102ed366004611cdc565b60156020525f9081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102b5565b34801561034e575f80fd5b506102ab60075481565b348015610363575f80fd5b5061026b610372366004611cb1565b6108d8565b348015610382575f80fd5b5061026b610391366004611cb1565b610c0a565b3480156103a1575f80fd5b506005546103b690600160a81b900460ff1681565b60405190151581526020016102b5565b3480156103d1575f80fd5b5061026b6103e0366004611cf7565b610c29565b3480156103f0575f80fd5b50600554610404906001600160a01b031681565b6040516001600160a01b0390911681526020016102b5565b348015610427575f80fd5b506102ab60085481565b34801561043c575f80fd5b506102ab600c5481565b348015610451575f80fd5b5061026b610460366004611d21565b610ce7565b348015610470575f80fd5b506102ab600a5481565b348015610485575f80fd5b5061026b610494366004611d4f565b610d52565b3480156104a4575f80fd5b5061026b6104b3366004611dd0565b610f94565b3480156104c3575f80fd5b5061026b611020565b3480156104d7575f80fd5b506102ab60125481565b3480156104ec575f80fd5b50600254610404906001600160a01b031681565b34801561050b575f80fd5b5061026b611033565b34801561051f575f80fd5b506102ab600b5481565b348015610534575f80fd5b505f546001600160a01b0316610404565b348015610550575f80fd5b506102ab60065481565b348015610565575f80fd5b506005546103b690600160a01b900460ff1681565b348015610585575f80fd5b5061026b610594366004611dfd565b611041565b3480156105a4575f80fd5b506102ab60095481565b3480156105b9575f80fd5b506102ab600d5481565b3480156105ce575f80fd5b5061026b6105dd366004611cb1565b611140565b3480156105ed575f80fd5b5061026b6105fc366004611cdc565b611510565b34801561060c575f80fd5b50600454610404906001600160a01b031681565b34801561062b575f80fd5b5061026b61063a366004611e19565b6115e1565b34801561064a575f80fd5b50601154610404906001600160a01b031681565b348015610669575f80fd5b506102ab600f5481565b34801561067e575f80fd5b506102ab60145481565b348015610693575f80fd5b5061026b611715565b3480156106a7575f80fd5b50600354610404906001600160a01b031681565b3480156106c6575f80fd5b506102ab60135481565b3480156106db575f80fd5b5061026b6106ea366004611cdc565b6117b0565b3480156106fa575f80fd5b506102ab610709366004611cdc565b6117ea565b348015610719575f80fd5b506102ab6118ca565b34801561072d575f80fd5b50601054610404906001600160a01b031681565b6107496118e0565b60085443106107925760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b6010546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190611e50565b90506108066118ca565b6108109082611e7b565b600b5550565b61081e6118e0565b600b8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6001600160a01b0381165f908152601560205260408120600381015482906108819042611e9a565b90505f82600301545f0361089657505f6108d0565b600e548210156108d05760075482600e546108b19190611e9a565b116108c95781600e546108c49190611e9a565b6108cd565b6007545b90505b949350505050565b6108e061190c565b335f818152601560205260408120916108f890610859565b905082825f0154101561094d5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610789565b801561099b5760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a206c6f636b74696d652072656d61696e732100000000006044820152606401610789565b6109a3611936565b5f82600401548360010154600f54600654865f01546109c29190611ead565b6109cc9190611e7b565b6109d69190611e9a565b6109e09190611ec4565b90508315610b81576011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a529190611e50565b600d5490915015610abf575f612710600d5487610a6f9190611ead565b610a799190611e7b565b9050610a9c33610a898389611e9a565b6011546001600160a01b031691906119a3565b600554601154610ab9916001600160a01b039182169116836119a3565b50610ad6565b601154610ad6906001600160a01b031633876119a3565b6011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b409190611e50565b610b4a9083611e9a565b905080601254610b5a9190611e9a565b6012558454610b6a908290611e9a565b8555601354610b799042611ec4565b600286015550505b8015610b9e57601054610b9e906001600160a01b031633836119a3565b600f546006548454610bb09190611ead565b610bba9190611e7b565b60018401555f600484015560405184815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a2505050610c0760018055565b50565b610c126118e0565b601054610c07906001600160a01b031633836119a3565b610c316118e0565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190611ed7565b50604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b610cef6118e0565b306001600160a01b03821603610d03575f80fd5b476001600160a01b0382166108fc6064610d1d8685611ead565b610d279190611e7b565b6040518115909202915f818181858888f19350505050158015610d4c573d5f803e3d5ffd5b50505050565b600554600160a81b900460ff1615610da25760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610789565b6004546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610789565b612710851115610e0c5760405162461bcd60e51b815260040161078990611ef2565b612710841115610e2e5760405162461bcd60e51b815260040161078990611ef2565b6005805460ff60a81b1916600160a81b179055601180546001600160a01b03808e166001600160a01b03199283161790925560108054928d1692909116919091179055600b89905560088890556007879055600c859055600d84905560138390556014829055600e8190558515610eb8576005805460ff60a01b1916600160a01b179055600a8690555b5f8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f199190611f29565b60ff169050601e8110610f675760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b6044820152606401610789565b610f7281601e611e9a565b610f7d90600a612029565b600f55505060085460095550505050505050505050565b610f9c6118e0565b612710821115610fbe5760405162461bcd60e51b815260040161078990611ef2565b612710811115610fe05760405162461bcd60e51b815260040161078990611ef2565b600c829055600d81905560408051838152602081018390527f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf178199101610cdb565b6110286118e0565b6110315f611a0b565b565b61103b6118e0565b43600755565b6110496118e0565b600554600160a01b900460ff166110905760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b6044820152606401610789565b81156110f157600a5481116110e75760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610789565b600a81905561110d565b6005805460ff60a01b1916600160a01b841515021790555f600a555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600a54604051610cdb91815260200190565b61114861190c565b335f8181526015602052604081209161116090610859565b6005549091508390600160a01b900460ff16156111d457600a5483546111869086611ec4565b11156111d45760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d69740000000000000000006044820152606401610789565b6111dc611936565b825415611282575f8360010154600f54600654865f01546111fd9190611ead565b6112079190611e7b565b6112119190611e9a565b90505f81118061122457505f8460040154115b15611280575f831161126457600484015461123f9082611ec4565b601054909150611259906001600160a01b031633836119a3565b5f6004850155611280565b80156112805780846004015461127a9190611ec4565b60048501555b505b83156114bd576011546040516370a0823160e01b815233600482015285916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f29190611e50565b10156112fc575f80fd5b6011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611342573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113669190611e50565b600c54909150156113d7575f612710600c54876113839190611ead565b61138d9190611e7b565b90506113b2333061139e848a611e9a565b6011546001600160a01b0316929190611a5a565b6005546011546113d1916001600160a01b039182169133911684611a5a565b506113ef565b6011546113ef906001600160a01b0316333088611a5a565b6011546040516370a0823160e01b81523060048201525f9183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145d9190611e50565b6114679190611e9a565b8554909150611477908290611ec4565b8555601254909250829061148c908290611ec4565b6012556013545f9061149e9042611ec4565b90506014548111156114af57506014545b600286015550504260038401555b600f5460065484546114cf9190611ead565b6114d99190611e7b565b600184015560405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610bf3565b6005546001600160a01b031633146115785760405162461bcd60e51b815260206004820152602560248201527f5365743a20596f7520646f206e6f742068617665207269676874207065726d6960448201526439b9b4b7b760d91b6064820152608401610789565b600554604080516001600160a01b03928316815291831660208301527fca68aa7805c8a17c09111b6be74d77af7df8318186a2c8d6f2743d137c6d2828910160405180910390a1600580546001600160a01b0319166001600160a01b0392909216919091179055565b6115e96118e0565b83851061164f5760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b6064820152608401610789565b8443106116b75760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b6064820152608401610789565b6008859055600784905560138390556014829055600e819055600985905560408051868152602081018690527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a15050505050565b61171d61190c565b335f908152601560205260408120805482825560018201839055600482019290925590801561176e57806012546117549190611e9a565b60125560115461176e906001600160a01b031633836119a3565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505061103160018055565b6117b86118e0565b6001600160a01b0381166117e157604051631e4fbdf760e01b81525f6004820152602401610789565b610c0781611a0b565b6001600160a01b0381165f90815260156020526040812060095443118015611813575060125415155b15611898575f61182560095443611a92565b90505f600b54826118369190611ead565b90505f601254600f548361184a9190611ead565b6118549190611e7b565b6006546118619190611ec4565b90508360010154600f5482865f015461187a9190611ead565b6118849190611e7b565b61188e9190611e9a565b9695505050505050565b6001810154600f5460065483546118af9190611ead565b6118b99190611e7b565b6118c39190611e9a565b9392505050565b5f6008546007546118db9190611e9a565b905090565b5f546001600160a01b031633146110315760405163118cdaa760e01b8152336004820152602401610789565b60026001540361192f57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600954431161194157565b6012545f036119505743600955565b5f61195d60095443611a92565b90505f600b548261196e9190611ead565b9050601254600f54826119819190611ead565b61198b9190611e7b565b6006546119989190611ec4565b600655505043600955565b6040516001600160a01b038316602482015260448101829052611a0690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ad1565b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d4c9085906323b872dd60e01b906084016119cf565b5f6007548211611aad57611aa68383611e9a565b9050611acb565b6007548310611abd57505f611acb565b82600754611aa69190611e9a565b92915050565b5f611b25826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ba29092919063ffffffff16565b805190915015611a065780806020019051810190611b439190611ed7565b611a065760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610789565b60606108d084845f85856001600160a01b0385163b611c035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610789565b5f80866001600160a01b03168587604051611c1e9190612056565b5f6040518083038185875af1925050503d805f8114611c58576040519150601f19603f3d011682016040523d82523d5f602084013e611c5d565b606091505b5091509150611c6d828286611c78565b979650505050505050565b60608315611c875750816118c3565b825115611c975782518084602001fd5b8160405162461bcd60e51b81526004016107899190612071565b5f60208284031215611cc1575f80fd5b5035919050565b6001600160a01b0381168114610c07575f80fd5b5f60208284031215611cec575f80fd5b81356118c381611cc8565b5f8060408385031215611d08575f80fd5b8235611d1381611cc8565b946020939093013593505050565b5f8060408385031215611d32575f80fd5b823591506020830135611d4481611cc8565b809150509250929050565b5f805f805f805f805f805f6101608c8e031215611d6a575f80fd5b8b35611d7581611cc8565b9a5060208c0135611d8581611cc8565b9a9d9a9c505050506040890135986060810135986080820135985060a0820135975060c0820135965060e0820135955061010082013594506101208201359350610140909101359150565b5f8060408385031215611de1575f80fd5b50508035926020909101359150565b8015158114610c07575f80fd5b5f8060408385031215611e0e575f80fd5b8235611d1381611df0565b5f805f805f60a08688031215611e2d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215611e60575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82611e9557634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611acb57611acb611e67565b8082028115828204841417611acb57611acb611e67565b80820180821115611acb57611acb611e67565b5f60208284031215611ee7575f80fd5b81516118c381611df0565b60208082526019908201527f43616e6e6f7420626520626967676572207468616e2031303000000000000000604082015260600190565b5f60208284031215611f39575f80fd5b815160ff811681146118c3575f80fd5b600181815b80851115611f8357815f1904821115611f6957611f69611e67565b80851615611f7657918102915b93841c9390800290611f4e565b509250929050565b5f82611f9957506001611acb565b81611fa557505f611acb565b8160018114611fbb5760028114611fc557611fe1565b6001915050611acb565b60ff841115611fd657611fd6611e67565b50506001821b611acb565b5060208310610133831016604e8410600b8410161715612004575081810a611acb565b61200e8383611f49565b805f190482111561202157612021611e67565b029392505050565b5f6118c38383611f8b565b5f5b8381101561204e578181015183820152602001612036565b50505f910152565b5f8251612067818460208701612034565b9190910192915050565b602081525f825180602084015261208f816040850160208701612034565b601f01601f1916919091016040019291505056fea2646970667358221220a20ba6409b085fb0868d29a57416de0ce875011015447b5f06ef7c2c7a54318664736f6c63430008140033
Deployed Bytecode
0x60806040526004361061024c575f3560e01c80638ae39cac11610134578063c50aa8a2116100b3578063dd10546a11610078578063dd10546a1461069c578063eb664296146106bb578063f2fde38b146106d0578063f40f0f52146106ef578063f520e7e51461070e578063f7c618c114610722575f80fd5b8063c50aa8a214610620578063cc7a262e1461063f578063ccd34cd51461065e578063d56dda0114610673578063db2e21bc14610688575f80fd5b8063a9f8d181116100f9578063a9f8d18114610599578063aa07547d146105ae578063b6b55f25146105c3578063bbcaac38146105e2578063bd61719114610601575f80fd5b80638ae39cac146105145780638da5cb5b146105295780638f6629151461054557806392e8990e1461055a578063a0b409051461057a575f80fd5b806341275358116101cb5780636b89bb3f116101905780636b89bb3f1461047a5780636db7943714610499578063715018a6146104b85780637a988f97146104cc5780637e2fd586146104e157806380dc067214610500575f80fd5b806341275358146103e557806348cd4cb11461041c57806354747a701461043157806356a227f21461044657806366fe9f8a14610465575f80fd5b80631aed6553116102115780631aed6553146103435780632e1a7d4d146103585780633279beab14610377578063392e53cd146103965780633f138d4b146103c6575f80fd5b806301a0011f1461025757806301f8a9761461026d57806303dc1f9b1461028c57806313bc67aa146102be5780631959a002146102d3575f80fd5b3661025357005b5f80fd5b348015610262575f80fd5b5061026b610741565b005b348015610278575f80fd5b5061026b610287366004611cb1565b610816565b348015610297575f80fd5b506102ab6102a6366004611cdc565b610859565b6040519081526020015b60405180910390f35b3480156102c9575f80fd5b506102ab600e5481565b3480156102de575f80fd5b5061031b6102ed366004611cdc565b60156020525f9081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102b5565b34801561034e575f80fd5b506102ab60075481565b348015610363575f80fd5b5061026b610372366004611cb1565b6108d8565b348015610382575f80fd5b5061026b610391366004611cb1565b610c0a565b3480156103a1575f80fd5b506005546103b690600160a81b900460ff1681565b60405190151581526020016102b5565b3480156103d1575f80fd5b5061026b6103e0366004611cf7565b610c29565b3480156103f0575f80fd5b50600554610404906001600160a01b031681565b6040516001600160a01b0390911681526020016102b5565b348015610427575f80fd5b506102ab60085481565b34801561043c575f80fd5b506102ab600c5481565b348015610451575f80fd5b5061026b610460366004611d21565b610ce7565b348015610470575f80fd5b506102ab600a5481565b348015610485575f80fd5b5061026b610494366004611d4f565b610d52565b3480156104a4575f80fd5b5061026b6104b3366004611dd0565b610f94565b3480156104c3575f80fd5b5061026b611020565b3480156104d7575f80fd5b506102ab60125481565b3480156104ec575f80fd5b50600254610404906001600160a01b031681565b34801561050b575f80fd5b5061026b611033565b34801561051f575f80fd5b506102ab600b5481565b348015610534575f80fd5b505f546001600160a01b0316610404565b348015610550575f80fd5b506102ab60065481565b348015610565575f80fd5b506005546103b690600160a01b900460ff1681565b348015610585575f80fd5b5061026b610594366004611dfd565b611041565b3480156105a4575f80fd5b506102ab60095481565b3480156105b9575f80fd5b506102ab600d5481565b3480156105ce575f80fd5b5061026b6105dd366004611cb1565b611140565b3480156105ed575f80fd5b5061026b6105fc366004611cdc565b611510565b34801561060c575f80fd5b50600454610404906001600160a01b031681565b34801561062b575f80fd5b5061026b61063a366004611e19565b6115e1565b34801561064a575f80fd5b50601154610404906001600160a01b031681565b348015610669575f80fd5b506102ab600f5481565b34801561067e575f80fd5b506102ab60145481565b348015610693575f80fd5b5061026b611715565b3480156106a7575f80fd5b50600354610404906001600160a01b031681565b3480156106c6575f80fd5b506102ab60135481565b3480156106db575f80fd5b5061026b6106ea366004611cdc565b6117b0565b3480156106fa575f80fd5b506102ab610709366004611cdc565b6117ea565b348015610719575f80fd5b506102ab6118ca565b34801561072d575f80fd5b50601054610404906001600160a01b031681565b6107496118e0565b60085443106107925760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b6010546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa1580156107d8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107fc9190611e50565b90506108066118ca565b6108109082611e7b565b600b5550565b61081e6118e0565b600b8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6001600160a01b0381165f908152601560205260408120600381015482906108819042611e9a565b90505f82600301545f0361089657505f6108d0565b600e548210156108d05760075482600e546108b19190611e9a565b116108c95781600e546108c49190611e9a565b6108cd565b6007545b90505b949350505050565b6108e061190c565b335f818152601560205260408120916108f890610859565b905082825f0154101561094d5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f206869676800000000006044820152606401610789565b801561099b5760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a206c6f636b74696d652072656d61696e732100000000006044820152606401610789565b6109a3611936565b5f82600401548360010154600f54600654865f01546109c29190611ead565b6109cc9190611e7b565b6109d69190611e9a565b6109e09190611ec4565b90508315610b81576011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a2e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a529190611e50565b600d5490915015610abf575f612710600d5487610a6f9190611ead565b610a799190611e7b565b9050610a9c33610a898389611e9a565b6011546001600160a01b031691906119a3565b600554601154610ab9916001600160a01b039182169116836119a3565b50610ad6565b601154610ad6906001600160a01b031633876119a3565b6011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b409190611e50565b610b4a9083611e9a565b905080601254610b5a9190611e9a565b6012558454610b6a908290611e9a565b8555601354610b799042611ec4565b600286015550505b8015610b9e57601054610b9e906001600160a01b031633836119a3565b600f546006548454610bb09190611ead565b610bba9190611e7b565b60018401555f600484015560405184815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906020015b60405180910390a2505050610c0760018055565b50565b610c126118e0565b601054610c07906001600160a01b031633836119a3565b610c316118e0565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303815f875af1158015610c7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c9f9190611ed7565b50604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b610cef6118e0565b306001600160a01b03821603610d03575f80fd5b476001600160a01b0382166108fc6064610d1d8685611ead565b610d279190611e7b565b6040518115909202915f818181858888f19350505050158015610d4c573d5f803e3d5ffd5b50505050565b600554600160a81b900460ff1615610da25760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b6044820152606401610789565b6004546001600160a01b03163314610dea5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b6044820152606401610789565b612710851115610e0c5760405162461bcd60e51b815260040161078990611ef2565b612710841115610e2e5760405162461bcd60e51b815260040161078990611ef2565b6005805460ff60a81b1916600160a81b179055601180546001600160a01b03808e166001600160a01b03199283161790925560108054928d1692909116919091179055600b89905560088890556007879055600c859055600d84905560138390556014829055600e8190558515610eb8576005805460ff60a01b1916600160a01b179055600a8690555b5f8a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f199190611f29565b60ff169050601e8110610f675760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b6044820152606401610789565b610f7281601e611e9a565b610f7d90600a612029565b600f55505060085460095550505050505050505050565b610f9c6118e0565b612710821115610fbe5760405162461bcd60e51b815260040161078990611ef2565b612710811115610fe05760405162461bcd60e51b815260040161078990611ef2565b600c829055600d81905560408051838152602081018390527f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf178199101610cdb565b6110286118e0565b6110315f611a0b565b565b61103b6118e0565b43600755565b6110496118e0565b600554600160a01b900460ff166110905760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b6044820152606401610789565b81156110f157600a5481116110e75760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d7573742062652068696768657200000000000000006044820152606401610789565b600a81905561110d565b6005805460ff60a01b1916600160a01b841515021790555f600a555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600a54604051610cdb91815260200190565b61114861190c565b335f8181526015602052604081209161116090610859565b6005549091508390600160a01b900460ff16156111d457600a5483546111869086611ec4565b11156111d45760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d69740000000000000000006044820152606401610789565b6111dc611936565b825415611282575f8360010154600f54600654865f01546111fd9190611ead565b6112079190611e7b565b6112119190611e9a565b90505f81118061122457505f8460040154115b15611280575f831161126457600484015461123f9082611ec4565b601054909150611259906001600160a01b031633836119a3565b5f6004850155611280565b80156112805780846004015461127a9190611ec4565b60048501555b505b83156114bd576011546040516370a0823160e01b815233600482015285916001600160a01b0316906370a0823190602401602060405180830381865afa1580156112ce573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112f29190611e50565b10156112fc575f80fd5b6011546040516370a0823160e01b81523060048201525f916001600160a01b0316906370a0823190602401602060405180830381865afa158015611342573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113669190611e50565b600c54909150156113d7575f612710600c54876113839190611ead565b61138d9190611e7b565b90506113b2333061139e848a611e9a565b6011546001600160a01b0316929190611a5a565b6005546011546113d1916001600160a01b039182169133911684611a5a565b506113ef565b6011546113ef906001600160a01b0316333088611a5a565b6011546040516370a0823160e01b81523060048201525f9183916001600160a01b03909116906370a0823190602401602060405180830381865afa158015611439573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061145d9190611e50565b6114679190611e9a565b8554909150611477908290611ec4565b8555601254909250829061148c908290611ec4565b6012556013545f9061149e9042611ec4565b90506014548111156114af57506014545b600286015550504260038401555b600f5460065484546114cf9190611ead565b6114d99190611e7b565b600184015560405181815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c90602001610bf3565b6005546001600160a01b031633146115785760405162461bcd60e51b815260206004820152602560248201527f5365743a20596f7520646f206e6f742068617665207269676874207065726d6960448201526439b9b4b7b760d91b6064820152608401610789565b600554604080516001600160a01b03928316815291831660208301527fca68aa7805c8a17c09111b6be74d77af7df8318186a2c8d6f2743d137c6d2828910160405180910390a1600580546001600160a01b0319166001600160a01b0392909216919091179055565b6115e96118e0565b83851061164f5760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b6064820152608401610789565b8443106116b75760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b6064820152608401610789565b6008859055600784905560138390556014829055600e819055600985905560408051868152602081018690527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a15050505050565b61171d61190c565b335f908152601560205260408120805482825560018201839055600482019290925590801561176e57806012546117549190611e9a565b60125560115461176e906001600160a01b031633836119a3565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a2505061103160018055565b6117b86118e0565b6001600160a01b0381166117e157604051631e4fbdf760e01b81525f6004820152602401610789565b610c0781611a0b565b6001600160a01b0381165f90815260156020526040812060095443118015611813575060125415155b15611898575f61182560095443611a92565b90505f600b54826118369190611ead565b90505f601254600f548361184a9190611ead565b6118549190611e7b565b6006546118619190611ec4565b90508360010154600f5482865f015461187a9190611ead565b6118849190611e7b565b61188e9190611e9a565b9695505050505050565b6001810154600f5460065483546118af9190611ead565b6118b99190611e7b565b6118c39190611e9a565b9392505050565b5f6008546007546118db9190611e9a565b905090565b5f546001600160a01b031633146110315760405163118cdaa760e01b8152336004820152602401610789565b60026001540361192f57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600954431161194157565b6012545f036119505743600955565b5f61195d60095443611a92565b90505f600b548261196e9190611ead565b9050601254600f54826119819190611ead565b61198b9190611e7b565b6006546119989190611ec4565b600655505043600955565b6040516001600160a01b038316602482015260448101829052611a0690849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611ad1565b505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610d4c9085906323b872dd60e01b906084016119cf565b5f6007548211611aad57611aa68383611e9a565b9050611acb565b6007548310611abd57505f611acb565b82600754611aa69190611e9a565b92915050565b5f611b25826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611ba29092919063ffffffff16565b805190915015611a065780806020019051810190611b439190611ed7565b611a065760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610789565b60606108d084845f85856001600160a01b0385163b611c035760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610789565b5f80866001600160a01b03168587604051611c1e9190612056565b5f6040518083038185875af1925050503d805f8114611c58576040519150601f19603f3d011682016040523d82523d5f602084013e611c5d565b606091505b5091509150611c6d828286611c78565b979650505050505050565b60608315611c875750816118c3565b825115611c975782518084602001fd5b8160405162461bcd60e51b81526004016107899190612071565b5f60208284031215611cc1575f80fd5b5035919050565b6001600160a01b0381168114610c07575f80fd5b5f60208284031215611cec575f80fd5b81356118c381611cc8565b5f8060408385031215611d08575f80fd5b8235611d1381611cc8565b946020939093013593505050565b5f8060408385031215611d32575f80fd5b823591506020830135611d4481611cc8565b809150509250929050565b5f805f805f805f805f805f6101608c8e031215611d6a575f80fd5b8b35611d7581611cc8565b9a5060208c0135611d8581611cc8565b9a9d9a9c505050506040890135986060810135986080820135985060a0820135975060c0820135965060e0820135955061010082013594506101208201359350610140909101359150565b5f8060408385031215611de1575f80fd5b50508035926020909101359150565b8015158114610c07575f80fd5b5f8060408385031215611e0e575f80fd5b8235611d1381611df0565b5f805f805f60a08688031215611e2d575f80fd5b505083359560208501359550604085013594606081013594506080013592509050565b5f60208284031215611e60575f80fd5b5051919050565b634e487b7160e01b5f52601160045260245ffd5b5f82611e9557634e487b7160e01b5f52601260045260245ffd5b500490565b81810381811115611acb57611acb611e67565b8082028115828204841417611acb57611acb611e67565b80820180821115611acb57611acb611e67565b5f60208284031215611ee7575f80fd5b81516118c381611df0565b60208082526019908201527f43616e6e6f7420626520626967676572207468616e2031303000000000000000604082015260600190565b5f60208284031215611f39575f80fd5b815160ff811681146118c3575f80fd5b600181815b80851115611f8357815f1904821115611f6957611f69611e67565b80851615611f7657918102915b93841c9390800290611f4e565b509250929050565b5f82611f9957506001611acb565b81611fa557505f611acb565b8160018114611fbb5760028114611fc557611fe1565b6001915050611acb565b60ff841115611fd657611fd6611e67565b50506001821b611acb565b5060208310610133831016604e8410600b8410161715612004575081810a611acb565b61200e8383611f49565b805f190482111561202157612021611e67565b029392505050565b5f6118c38383611f8b565b5f5b8381101561204e578181015183820152602001612036565b50505f910152565b5f8251612067818460208701612034565b9190910192915050565b602081525f825180602084015261208f816040850160208701612034565b601f01601f1916919091016040019291505056fea2646970667358221220a20ba6409b085fb0868d29a57416de0ce875011015447b5f06ef7c2c7a54318664736f6c63430008140033
Deployed Bytecode Sourcemap
28363:15861:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43978:243;;;;;;;;;;;;;:::i;:::-;;40029:175;;;;;;;;;;-1:-1:-1;40029:175:0;;;;;:::i;:::-;;:::i;32838:588::-;;;;;;;;;;-1:-1:-1;32838:588:0;;;;;:::i;:::-;;:::i;:::-;;;733:25:1;;;721:2;706:18;32838:588:0;;;;;;;;29346:33;;;;;;;;;;;;;;;;29764:44;;;;;;;;;;-1:-1:-1;29764:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1028:25:1;;;1084:2;1069:18;;1062:34;;;;1112:18;;;1105:34;;;;1170:2;1155:18;;1148:34;1213:3;1198:19;;1191:35;1015:3;1000:19;29764:44:0;769:463:1;28950:28:0;;;;;;;;;;;;;;;;36058:1552;;;;;;;;;;-1:-1:-1;36058:1552:0;;;;;:::i;:::-;;:::i;38351:142::-;;;;;;;;;;-1:-1:-1;38351:142:0;;;;;:::i;:::-;;:::i;28842:25::-;;;;;;;;;;-1:-1:-1;28842:25:0;;;;-1:-1:-1;;;28842:25:0;;;;;;;;;1402:14:1;;1395:22;1377:41;;1365:2;1350:18;28842:25:0;1237:187:1;38503:239:0;;;;;;;;;;-1:-1:-1;38503:239:0;;;;;:::i;:::-;;:::i;28649:70::-;;;;;;;;;;-1:-1:-1;28649:70:0;;;;-1:-1:-1;;;;;28649:70:0;;;;;;-1:-1:-1;;;;;1913:32:1;;;1895:51;;1883:2;1868:18;28649:70:0;1749:203:1;28991:25:0;;;;;;;;;;;;;;;;29251:27;;;;;;;;;;;;;;;;38750:286;;;;;;;;;;-1:-1:-1;38750:286:0;;;;;:::i;:::-;;:::i;29148:31::-;;;;;;;;;;;;;;;;31224:1606;;;;;;;;;;-1:-1:-1;31224:1606:0;;;;;:::i;:::-;;:::i;40212:395::-;;;;;;;;;;-1:-1:-1;40212:395:0;;;;;:::i;:::-;;:::i;15865:103::-;;;;;;;;;;;;;:::i;29627:36::-;;;;;;;;;;;;;;;;28459:40;;;;;;;;;;-1:-1:-1;28459:40:0;;;;-1:-1:-1;;;;;28459:40:0;;;39115:88;;;;;;;;;;;;;:::i;29192:29::-;;;;;;;;;;;;;;;;15190:87;;;;;;;;;;-1:-1:-1;15236:7:0;15263:6;-1:-1:-1;;;;;15263:6:0;15190:87;;28908:31;;;;;;;;;;;;;;;;28769:24;;;;;;;;;;-1:-1:-1;28769:24:0;;;;-1:-1:-1;;;28769:24:0;;;;;;39414:475;;;;;;;;;;-1:-1:-1;39414:475:0;;;;;:::i;:::-;;:::i;29074:30::-;;;;;;;;;;;;;;;;29309:28;;;;;;;;;;;;;;;;33568:2356;;;;;;;;;;-1:-1:-1;33568:2356:0;;;;;:::i;:::-;;:::i;40615:248::-;;;;;;;;;;-1:-1:-1;40615:248:0;;;;;:::i;:::-;;:::i;28588:33::-;;;;;;;;;;-1:-1:-1;28588:33:0;;;;-1:-1:-1;;;;;28588:33:0;;;41091:855;;;;;;;;;;-1:-1:-1;41091:855:0;;;;;:::i;:::-;;:::i;29563:25::-;;;;;;;;;;-1:-1:-1;29563:25:0;;;;-1:-1:-1;;;;;29563:25:0;;;29439:31;;;;;;;;;;;;;;;;29718:36;;;;;;;;;;;;;;;;37736:512;;;;;;;;;;;;;:::i;28508:27::-;;;;;;;;;;-1:-1:-1;28508:27:0;;;;-1:-1:-1;;;;;28508:27:0;;;29675:36;;;;;;;;;;;;;;;;16123:220;;;;;;;;;;-1:-1:-1;16123:220:0;;;;;:::i;:::-;;:::i;42104:689::-;;;;;;;;;;-1:-1:-1;42104:689:0;;;;;:::i;:::-;;:::i;43862:108::-;;;;;;;;;;;;;:::i;29504:25::-;;;;;;;;;;-1:-1:-1;29504:25:0;;;;-1:-1:-1;;;;;29504:25:0;;;43978:243;15076:13;:11;:13::i;:::-;44059:10:::1;;44044:12;:25;44036:54;;;::::0;-1:-1:-1;;;44036:54:0;;5127:2:1;44036:54:0::1;::::0;::::1;5109:21:1::0;5166:2;5146:18;;;5139:30;-1:-1:-1;;;5185:18:1;;;5178:46;5241:18;;44036:54:0::1;;;;;;;;;44121:11;::::0;:36:::1;::::0;-1:-1:-1;;;44121:36:0;;44151:4:::1;44121:36;::::0;::::1;1895:51:1::0;44101:17:0::1;::::0;-1:-1:-1;;;;;44121:11:0::1;::::0;:21:::1;::::0;1868:18:1;;44121:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44101:56;;44197:16;:14;:16::i;:::-;44185:28;::::0;:9;:28:::1;:::i;:::-;44168:14;:45:::0;-1:-1:-1;43978:243:0:o;40029:175::-;15076:13;:11;:13::i;:::-;40114:14:::1;:32:::0;;;40162:34:::1;::::0;733:25:1;;;40162:34:0::1;::::0;721:2:1;706:18;40162:34:0::1;;;;;;;40029:175:::0;:::o;32838:588::-;-1:-1:-1;;;;;32975:15:0;;32926:7;32975:15;;;:8;:15;;;;;33042:16;;;;32926:7;;33023:36;;:15;:36;:::i;:::-;33001:58;;33070:25;33114:4;:16;;;33134:1;33114:21;33110:272;;-1:-1:-1;33172:1:0;33110:272;;;33208:18;;33194:11;:32;33191:191;;;33302:13;;33286:11;33264:18;;:34;;;;:::i;:::-;33263:52;:107;;33357:11;33335:18;;:34;;;;:::i;:::-;33263:107;;;33318:13;;33263:107;33243:127;;33191:191;33401:17;32838:588;-1:-1:-1;;;;32838:588:0:o;36058:1552::-;4860:21;:19;:21::i;:::-;36159:10:::1;36126:21;36150:20:::0;;;:8:::1;:20;::::0;;;;;36202:26:::1;::::0;:14:::1;:26::i;:::-;36181:47;;36262:7;36247:4;:11;;;:22;;36239:62;;;::::0;-1:-1:-1;;;36239:62:0;;6148:2:1;36239:62:0::1;::::0;::::1;6130:21:1::0;6187:2;6167:18;;;6160:30;6226:29;6206:18;;;6199:57;6273:18;;36239:62:0::1;5946:351:1::0;36239:62:0::1;36320:15:::0;;36312:55:::1;;;::::0;-1:-1:-1;;;36312:55:0;;6504:2:1;36312:55:0::1;::::0;::::1;6486:21:1::0;6543:2;6523:18;;;6516:30;6582:29;6562:18;;;6555:57;6629:18;;36312:55:0::1;6302:351:1::0;36312:55:0::1;36378:13;:11;:13::i;:::-;36404:15;36492:4;:19;;;36474:4;:15;;;36455:16;;36436;;36422:4;:11;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;:89;;;;:::i;:::-;36404:107:::0;-1:-1:-1;36528:11:0;;36524:808:::1;;36595:11;::::0;:36:::1;::::0;-1:-1:-1;;;36595:36:0;;36625:4:::1;36595:36;::::0;::::1;1895:51:1::0;36556:36:0::1;::::0;-1:-1:-1;;;;;36595:11:0::1;::::0;:21:::1;::::0;1868:18:1;;36595:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36649:13;::::0;36556:75;;-1:-1:-1;36649:17:0;36646:360:::1;;36687:19;36735:5;36719:13;;36709:7;:23;;;;:::i;:::-;:31;;;;:::i;:::-;36687:53:::0;-1:-1:-1;36759:68:0::1;36792:10;36805:21;36687:53:::0;36805:7;:21:::1;:::i;:::-;36759:11;::::0;-1:-1:-1;;;;;36759:11:0::1;::::0;:68;:24:::1;:68::i;:::-;36871:10;::::0;36846:11:::1;::::0;:49:::1;::::0;-1:-1:-1;;;;;36846:11:0;;::::1;::::0;36871:10:::1;36883:11:::0;36846:24:::1;:49::i;:::-;36668:243;36646:360;;;36936:11;::::0;:54:::1;::::0;-1:-1:-1;;;;;36936:11:0::1;36969:10;36982:7:::0;36936:24:::1;:54::i;:::-;37076:11;::::0;:36:::1;::::0;-1:-1:-1;;;37076:36:0;;37106:4:::1;37076:36;::::0;::::1;1895:51:1::0;37020:22:0::1;::::0;-1:-1:-1;;;;;37076:11:0::1;::::0;:21:::1;::::0;1868:18:1;;37076:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37045:67;::::0;:28;:67:::1;:::i;:::-;37020:92;;37167:14;37147:17;;:34;;;;:::i;:::-;37127:17;:54:::0;37210:11;;:28:::1;::::0;37224:14;;37210:28:::1;:::i;:::-;37196:42:::0;;37299:21:::1;::::0;37281:39:::1;::::0;:15:::1;:39;:::i;:::-;37253:25;::::0;::::1;:67:::0;-1:-1:-1;;36524:808:0::1;37348:11:::0;;37344:98:::1;;37376:11;::::0;:54:::1;::::0;-1:-1:-1;;;;;37376:11:0::1;37409:10;37422:7:::0;37376:24:::1;:54::i;:::-;37507:16;::::0;37487::::1;::::0;37473:11;;:30:::1;::::0;37487:16;37473:30:::1;:::i;:::-;37472:51;;;;:::i;:::-;37454:15;::::0;::::1;:69:::0;37556:1:::1;37534:19;::::0;::::1;:23:::0;37573:29:::1;::::0;733:25:1;;;37582:10:0::1;::::0;37573:29:::1;::::0;721:2:1;706:18;37573:29:0::1;;;;;;;;36115:1495;;;4904:20:::0;4195:1;5446:21;;5263:212;4904:20;36058:1552;:::o;38351:142::-;15076:13;:11;:13::i;:::-;38431:11:::1;::::0;:54:::1;::::0;-1:-1:-1;;;;;38431:11:0::1;38464:10;38477:7:::0;38431:24:::1;:54::i;38503:239::-:0;15076:13;:11;:13::i;:::-;38606:65:::1;::::0;-1:-1:-1;;;38606:65:0;;38645:10:::1;38606:65;::::0;::::1;7135:51:1::0;7202:18;;;7195:34;;;-1:-1:-1;;;;;38606:30:0;::::1;::::0;::::1;::::0;7108:18:1;;38606:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38687:47:0::1;::::0;;-1:-1:-1;;;;;7153:32:1;;7135:51;;7217:2;7202:18;;7195:34;;;38687:47:0::1;::::0;7108:18:1;38687:47:0::1;;;;;;;;38503:239:::0;;:::o;38750:286::-;15076:13;:11;:13::i;:::-;38891:4:::1;-1:-1:-1::0;;;;;38865:31:0;::::1;::::0;38857:40:::1;;;::::0;::::1;;38928:21;-1:-1:-1::0;;;;;38960:32:0;::::1;:68;39024:3;38993:28;39005:16:::0;38928:21;38993:28:::1;:::i;:::-;:34;;;;:::i;:::-;38960:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;38846:190;38750:286:::0;;:::o;31224:1606::-;31658:13;;-1:-1:-1;;;31658:13:0;;;;31657:14;31649:46;;;;-1:-1:-1;;;31649:46:0;;7692:2:1;31649:46:0;;;7674:21:1;7731:2;7711:18;;;7704:30;-1:-1:-1;;;7750:18:1;;;7743:49;7809:18;;31649:46:0;7490:343:1;31649:46:0;31728:18;;-1:-1:-1;;;;;31728:18:0;31714:10;:32;31706:56;;;;-1:-1:-1;;;31706:56:0;;8040:2:1;31706:56:0;;;8022:21:1;8079:2;8059:18;;;8052:30;-1:-1:-1;;;8098:18:1;;;8091:41;8149:18;;31706:56:0;7838:335:1;31706:56:0;31798:5;31781:13;:22;;31773:60;;;;-1:-1:-1;;;31773:60:0;;;;;;;:::i;:::-;31870:5;31852:14;:23;;31844:61;;;;-1:-1:-1;;;31844:61:0;;;;;;;:::i;:::-;31918:13;:20;;-1:-1:-1;;;;31918:20:0;-1:-1:-1;;;31918:20:0;;;31951:11;:26;;-1:-1:-1;;;;;31951:26:0;;;-1:-1:-1;;;;;;31951:26:0;;;;;;;31988:11;:26;;;;;;;;;;;;;;;32025:14;:32;;;32068:10;:24;;;32103:13;:30;;;32144:12;:28;;;32183:13;:30;;;32224:21;:46;;;32281:21;:46;;;32338:18;:40;;;32393:21;;32389:124;;32431:12;:19;;-1:-1:-1;;;;32431:19:0;-1:-1:-1;;;32431:19:0;;;32465:16;:36;;;32389:124;32525:27;32562:12;-1:-1:-1;;;;;32555:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32525:61;;;;32627:2;32605:19;:24;32597:59;;;;-1:-1:-1;;;32597:59:0;;9012:2:1;32597:59:0;;;8994:21:1;9051:2;9031:18;;;9024:30;-1:-1:-1;;;9070:18:1;;;9063:52;9132:18;;32597:59:0;8810:346:1;32597:59:0;32701:22;32704:19;32701:2;:22;:::i;:::-;32696:28;;:2;:28;:::i;:::-;32669:16;:56;-1:-1:-1;;32810:10:0;;32792:15;:28;-1:-1:-1;;;;;;;;;;31224:1606:0:o;40212:395::-;15076:13;:11;:13::i;:::-;40351:5:::1;40331:16;:25;;40323:63;;;;-1:-1:-1::0;;;40323:63:0::1;;;;;;;:::i;:::-;40426:5;40405:17;:26;;40397:64;;;;-1:-1:-1::0;;;40397:64:0::1;;;;;;;:::i;:::-;40472:12;:31:::0;;;40514:13:::1;:33:::0;;;40563:36:::1;::::0;;10709:25:1;;;10765:2;10750:18;;10743:34;;;40563:36:0::1;::::0;10682:18:1;40563:36:0::1;10535:248:1::0;15865:103:0;15076:13;:11;:13::i;:::-;15930:30:::1;15957:1;15930:18;:30::i;:::-;15865:103::o:0;39115:88::-;15076:13;:11;:13::i;:::-;39183:12:::1;39167:13;:28:::0;39115:88::o;39414:475::-;15076:13;:11;:13::i;:::-;39531:12:::1;::::0;-1:-1:-1;;;39531:12:0;::::1;;;39523:36;;;::::0;-1:-1:-1;;;39523:36:0;;10990:2:1;39523:36:0::1;::::0;::::1;10972:21:1::0;11029:2;11009:18;;;11002:30;-1:-1:-1;;;11048:18:1;;;11041:41;11099:18;;39523:36:0::1;10788:335:1::0;39523:36:0::1;39574:13;39570:266;;;39632:16;;39612:17;:36;39604:73;;;::::0;-1:-1:-1;;;39604:73:0;;11330:2:1;39604:73:0::1;::::0;::::1;11312:21:1::0;11369:2;11349:18;;;11342:30;11408:26;11388:18;;;11381:54;11452:18;;39604:73:0::1;11128:348:1::0;39604:73:0::1;39692:16;:36:::0;;;39570:266:::1;;;39761:12;:28:::0;;-1:-1:-1;;;;39761:28:0::1;-1:-1:-1::0;;;39761:28:0;::::1;;;;::::0;;-1:-1:-1;39804:16:0::1;:20:::0;39570:266:::1;39851:30;39864:16;;39851:30;;;;733:25:1::0;;721:2;706:18;;587:177;33568:2356:0;4860:21;:19;:21::i;:::-;33668:10:::1;33635:21;33659:20:::0;;;:8:::1;:20;::::0;;;;;33711:26:::1;::::0;:14:::1;:26::i;:::-;33794:12;::::0;33690:47;;-1:-1:-1;33772:7:0;;-1:-1:-1;;;33794:12:0;::::1;;;33790:122;;;33856:16;::::0;33841:11;;33831:21:::1;::::0;:7;:21:::1;:::i;:::-;:41;;33823:77;;;::::0;-1:-1:-1;;;33823:77:0;;11683:2:1;33823:77:0::1;::::0;::::1;11665:21:1::0;11722:2;11702:18;;;11695:30;11761:25;11741:18;;;11734:53;11804:18;;33823:77:0::1;11481:347:1::0;33823:77:0::1;33924:13;:11;:13::i;:::-;33952:11:::0;;:15;33948:562:::1;;33984:15;34056:4;:15;;;34037:16;;34017;;34003:4;:11;;;:30;;;;:::i;:::-;34002:51;;;;:::i;:::-;:69;;;;:::i;:::-;33984:87;;34101:1;34091:7;:11;:38;;;;34128:1;34106:4;:19;;;:23;34091:38;34087:421;;;34170:1;34156:10;:15;34152:345;;34218:19;::::0;::::1;::::0;34208:29:::1;::::0;:7;:29:::1;:::i;:::-;34262:11;::::0;34198:39;;-1:-1:-1;34262:54:0::1;::::0;-1:-1:-1;;;;;34262:11:0::1;34295:10;34198:39:::0;34262:24:::1;:54::i;:::-;34363:1;34341:19;::::0;::::1;:23:::0;34152:345:::1;;;34390:11:::0;;34386:111:::1;;34470:7;34448:4;:19;;;:29;;;;:::i;:::-;34426:19;::::0;::::1;:51:::0;34386:111:::1;33969:541;33948:562;34526:11:::0;;34522:1263:::1;;34562:11;::::0;:42:::1;::::0;-1:-1:-1;;;34562:42:0;;34592:10:::1;34562:42;::::0;::::1;1895:51:1::0;34608:7:0;;-1:-1:-1;;;;;34562:11:0::1;::::0;:21:::1;::::0;1868:18:1;;34562:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;34554:62;;;::::0;::::1;;34671:11;::::0;:36:::1;::::0;-1:-1:-1;;;34671:36:0;;34701:4:::1;34671:36;::::0;::::1;1895:51:1::0;34631:37:0::1;::::0;-1:-1:-1;;;;;34671:11:0::1;::::0;:21:::1;::::0;1868:18:1;;34671:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34725:12;::::0;34631:76;;-1:-1:-1;34725:16:0;34722:417:::1;;34762:18;34807:5;34793:12;;34783:7;:22;;;;:::i;:::-;:29;;;;:::i;:::-;34762:50:::0;-1:-1:-1;34831:86:0::1;34868:10;34889:4;34896:20;34762:50:::0;34896:7;:20:::1;:::i;:::-;34831:11;::::0;-1:-1:-1;;;;;34831:11:0::1;::::0;:86;;:28:::1;:86::i;:::-;34986:10;::::0;34936:11:::1;::::0;:73:::1;::::0;-1:-1:-1;;;;;34936:11:0;;::::1;::::0;34973:10:::1;::::0;34986::::1;34998::::0;34936:28:::1;:73::i;:::-;34743:282;34722:417;;;35050:11;::::0;:73:::1;::::0;-1:-1:-1;;;;;35050:11:0::1;35087:10;35108:4;35115:7:::0;35050:28:::1;:73::i;:::-;35179:11;::::0;:36:::1;::::0;-1:-1:-1;;;35179:36:0;;35209:4:::1;35179:36;::::0;::::1;1895:51:1::0;35153:23:0::1;::::0;35218:29;;-1:-1:-1;;;;;35179:11:0;;::::1;::::0;:21:::1;::::0;1868:18:1;;35179:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;35276:11:::0;;35153:94;;-1:-1:-1;35276:29:0::1;::::0;35153:94;;35276:29:::1;:::i;:::-;35262:43:::0;;35386:17:::1;::::0;35336:15;;-1:-1:-1;35336:15:0;;35386:35:::1;::::0;35336:15;;35386:35:::1;:::i;:::-;35366:17;:55:::0;35488:21:::1;::::0;35436:31:::1;::::0;35470:39:::1;::::0;:15:::1;:39;:::i;:::-;35436:73;;35554:21;;35528:23;:47;35524:135;;;-1:-1:-1::0;35622:21:0::1;::::0;35524:135:::1;35673:25;::::0;::::1;:51:::0;-1:-1:-1;;35758:15:0::1;35739:16;::::0;::::1;:34:::0;34522:1263:::1;35850:16;::::0;35830::::1;::::0;35816:11;;:30:::1;::::0;35830:16;35816:30:::1;:::i;:::-;35815:51;;;;:::i;:::-;35797:15;::::0;::::1;:69:::0;35882:34:::1;::::0;733:25:1;;;35890:10:0::1;::::0;35882:34:::1;::::0;721:2:1;706:18;35882:34:0::1;587:177:1::0;40615:248:0;40706:10;;-1:-1:-1;;;;;40706:10:0;40692;:24;40684:74;;;;-1:-1:-1;;;40684:74:0;;12035:2:1;40684:74:0;;;12017:21:1;12074:2;12054:18;;;12047:30;12113:34;12093:18;;;12086:62;-1:-1:-1;;;12164:18:1;;;12157:35;12209:19;;40684:74:0;11833:401:1;40684:74:0;40792:10;;40774:44;;;-1:-1:-1;;;;;40792:10:0;;;12451:34:1;;12521:15;;;12516:2;12501:18;;12494:43;40774:44:0;;12386:18:1;40774:44:0;;;;;;;40829:10;:26;;-1:-1:-1;;;;;;40829:26:0;-1:-1:-1;;;;;40829:26:0;;;;;;;;;;40615:248::o;41091:855::-;15076:13;:11;:13::i;:::-;41370:14:::1;41356:11;:28;41348:87;;;::::0;-1:-1:-1;;;41348:87:0;;12750:2:1;41348:87:0::1;::::0;::::1;12732:21:1::0;12789:2;12769:18;;;12762:30;12828:34;12808:18;;;12801:62;-1:-1:-1;;;12879:18:1;;;12872:44;12933:19;;41348:87:0::1;12548:410:1::0;41348:87:0::1;41469:11;41454:12;:26;41446:87;;;::::0;-1:-1:-1;;;41446:87:0;;13165:2:1;41446:87:0::1;::::0;::::1;13147:21:1::0;13204:2;13184:18;;;13177:30;13243:34;13223:18;;;13216:62;-1:-1:-1;;;13294:18:1;;;13287:46;13350:19;;41446:87:0::1;12963:412:1::0;41446:87:0::1;41546:10;:24:::0;;;41581:13:::1;:30:::0;;;41622:21:::1;:46:::0;;;41679:21:::1;:46:::0;;;41736:18:::1;:40:::0;;;41843:15:::1;:28:::0;;;41889:49:::1;::::0;;10709:25:1;;;10765:2;10750:18;;10743:34;;;41889:49:0::1;::::0;10682:18:1;41889:49:0::1;;;;;;;41091:855:::0;;;;;:::o;37736:512::-;4860:21;:19;:21::i;:::-;37831:10:::1;37798:21;37822:20:::0;;;:8:::1;:20;::::0;;;;37880:11;;37902:15;;;-1:-1:-1;37928:15:0;::::1;:19:::0;;;37958::::1;::::0;::::1;:23:::0;;;;37822:20;37998;;37994:187:::1;;38075:16;38055:17;;:36;;;;:::i;:::-;38035:17;:56:::0;38106:11:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;38106:11:0::1;38139:10;38152:16:::0;38106:24:::1;:63::i;:::-;38228:11:::0;;38198:42:::1;::::0;733:25:1;;;38216:10:0::1;::::0;38198:42:::1;::::0;721:2:1;706:18;38198:42:0::1;;;;;;;37787:461;;4904:20:::0;4195:1;5446:21;;5263:212;16123:220;15076:13;:11;:13::i;:::-;-1:-1:-1;;;;;16208:22:0;::::1;16204:93;;16254:31;::::0;-1:-1:-1;;;16254:31:0;;16282:1:::1;16254:31;::::0;::::1;1895:51:1::0;1868:18;;16254:31:0::1;1749:203:1::0;16204:93:0::1;16307:28;16326:8;16307:18;:28::i;42104:689::-:0;-1:-1:-1;;;;;42209:15:0;;42165:7;42209:15;;;:8;:15;;;;;42254;;42239:12;:30;:56;;;;-1:-1:-1;42273:17:0;;:22;;42239:56;42235:551;;;42312:18;42333:45;42348:15;;42365:12;42333:14;:45::i;:::-;42312:66;;42393:17;42426:14;;42413:10;:27;;;;:::i;:::-;42393:47;;42455:29;42555:17;;42536:16;;42524:9;:28;;;;:::i;:::-;:48;;;;:::i;:::-;42504:16;;:69;;;;:::i;:::-;42455:118;;42652:4;:15;;;42633:16;;42609:21;42595:4;:11;;;:35;;;;:::i;:::-;:54;;;;:::i;:::-;:72;;;;:::i;:::-;42588:79;42104:689;-1:-1:-1;;;;;;42104:689:0:o;42235:551::-;42759:15;;;;42740:16;;42721;;42707:11;;:30;;42721:16;42707:30;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;42700:74;42104:689;-1:-1:-1;;;42104:689:0:o;43862:108::-;43909:7;43952:10;;43936:13;;:26;;;;:::i;:::-;43929:33;;43862:108;:::o;15355:166::-;15236:7;15263:6;-1:-1:-1;;;;;15263:6:0;2320:10;15415:23;15411:103;;15462:40;;-1:-1:-1;;;15462:40:0;;2320:10;15462:40;;;1895:51:1;1868:18;;15462:40:0;1749:203:1;4940:315:0;4238:1;5069:7;;:18;5065:88;;5111:30;;-1:-1:-1;;;5111:30:0;;;;;;;;;;;5065:88;4238:1;5230:7;:17;4940:315::o;42878:515::-;42941:15;;42925:12;:31;42921:70;;42878:515::o;42921:70::-;43007:17;;43028:1;43007:22;43003:106;;43064:12;43046:15;:30;42878:515::o;43003:106::-;43121:18;43142:45;43157:15;;43174:12;43142:14;:45::i;:::-;43121:66;;43198:17;43231:14;;43218:10;:27;;;;:::i;:::-;43198:47;;43326:17;;43307:16;;43295:9;:28;;;;:::i;:::-;:48;;;;:::i;:::-;43275:16;;:69;;;;:::i;:::-;43256:16;:88;-1:-1:-1;;43373:12:0;43355:15;:30;42878:515::o;25040:211::-;25184:58;;-1:-1:-1;;;;;7153:32:1;;25184:58:0;;;7135:51:1;7202:18;;;7195:34;;;25157:86:0;;25177:5;;-1:-1:-1;;;25207:23:0;7108:18:1;;25184:58:0;;;;-1:-1:-1;;25184:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25184:58:0;-1:-1:-1;;;;;;25184:58:0;;;;;;;;;;25157:19;:86::i;:::-;25040:211;;;:::o;16503:191::-;16577:16;16596:6;;-1:-1:-1;;;;;16613:17:0;;;-1:-1:-1;;;;;;16613:17:0;;;;;;16646:40;;16596:6;;;;;;;16646:40;;16577:16;16646:40;16566:128;16503:191;:::o;25259:248::-;25430:68;;-1:-1:-1;;;;;13638:15:1;;;25430:68:0;;;13620:34:1;13690:15;;13670:18;;;13663:43;13722:18;;;13715:34;;;25403:96:0;;25423:5;;-1:-1:-1;;;25453:27:0;13555:18:1;;25430:68:0;13380:375:1;43551:303:0;43626:7;43657:13;;43650:3;:20;43646:201;;43694:11;43700:5;43694:3;:11;:::i;:::-;43687:18;;;;43646:201;43736:13;;43727:5;:22;43723:124;;-1:-1:-1;43773:1:0;43766:8;;43723:124;43830:5;43814:13;;:21;;;;:::i;43723:124::-;43551:303;;;;:::o;27613:716::-;28037:23;28063:69;28091:4;28063:69;;;;;;;;;;;;;;;;;28071:5;-1:-1:-1;;;;;28063:27:0;;;:69;;;;;:::i;:::-;28147:17;;28037:95;;-1:-1:-1;28147:21:0;28143:179;;28244:10;28233:30;;;;;;;;;;;;:::i;:::-;28225:85;;;;-1:-1:-1;;;28225:85:0;;13962:2:1;28225:85:0;;;13944:21:1;14001:2;13981:18;;;13974:30;14040:34;14020:18;;;14013:62;-1:-1:-1;;;14091:18:1;;;14084:40;14141:19;;28225:85:0;13760:406:1;20456:229:0;20593:12;20625:52;20647:6;20655:4;20661:1;20664:12;20593;-1:-1:-1;;;;;18006:19:0;;;21863:60;;;;-1:-1:-1;;;21863:60:0;;14780:2:1;21863:60:0;;;14762:21:1;14819:2;14799:18;;;14792:30;14858:31;14838:18;;;14831:59;14907:18;;21863:60:0;14578:353:1;21863:60:0;21937:12;21951:23;21978:6;-1:-1:-1;;;;;21978:11:0;21997:5;22004:4;21978:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21936:73;;;;22027:51;22044:7;22053:10;22065:12;22027:16;:51::i;:::-;22020:58;21576:510;-1:-1:-1;;;;;;;21576:510:0:o;24262:712::-;24412:12;24441:7;24437:530;;;-1:-1:-1;24472:10:0;24465:17;;24437:530;24586:17;;:21;24582:374;;24784:10;24778:17;24845:15;24832:10;24828:2;24824:19;24817:44;24582:374;24927:12;24920:20;;-1:-1:-1;;;24920:20:0;;;;;;;;:::i;14:180:1:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;-1:-1:-1;165:23:1;;14:180;-1:-1:-1;14:180:1:o;199:131::-;-1:-1:-1;;;;;274:31:1;;264:42;;254:70;;320:1;317;310:12;335:247;394:6;447:2;435:9;426:7;422:23;418:32;415:52;;;463:1;460;453:12;415:52;502:9;489:23;521:31;546:5;521:31;:::i;1429:315::-;1497:6;1505;1558:2;1546:9;1537:7;1533:23;1529:32;1526:52;;;1574:1;1571;1564:12;1526:52;1613:9;1600:23;1632:31;1657:5;1632:31;:::i;:::-;1682:5;1734:2;1719:18;;;;1706:32;;-1:-1:-1;;;1429:315:1:o;1957:::-;2025:6;2033;2086:2;2074:9;2065:7;2061:23;2057:32;2054:52;;;2102:1;2099;2092:12;2054:52;2138:9;2125:23;2115:33;;2198:2;2187:9;2183:18;2170:32;2211:31;2236:5;2211:31;:::i;:::-;2261:5;2251:15;;;1957:315;;;;;:::o;2277:1038::-;2454:6;2462;2470;2478;2486;2494;2502;2510;2518;2526;2534:7;2588:3;2576:9;2567:7;2563:23;2559:33;2556:53;;;2605:1;2602;2595:12;2556:53;2644:9;2631:23;2663:31;2688:5;2663:31;:::i;:::-;2713:5;-1:-1:-1;2770:2:1;2755:18;;2742:32;2783:33;2742:32;2783:33;:::i;:::-;2277:1038;;2835:7;;-1:-1:-1;;;;2889:2:1;2874:18;;2861:32;;2940:2;2925:18;;2912:32;;2991:3;2976:19;;2963:33;;-1:-1:-1;3043:3:1;3028:19;;3015:33;;-1:-1:-1;3095:3:1;3080:19;;3067:33;;-1:-1:-1;3147:3:1;3132:19;;3119:33;;-1:-1:-1;3199:3:1;3184:19;;3171:33;;-1:-1:-1;3251:3:1;3236:19;;3223:33;;-1:-1:-1;3304:3:1;3289:19;;;3276:33;;-1:-1:-1;2277:1038:1:o;3320:248::-;3388:6;3396;3449:2;3437:9;3428:7;3424:23;3420:32;3417:52;;;3465:1;3462;3455:12;3417:52;-1:-1:-1;;3488:23:1;;;3558:2;3543:18;;;3530:32;;-1:-1:-1;3320:248:1:o;3807:118::-;3893:5;3886:13;3879:21;3872:5;3869:32;3859:60;;3915:1;3912;3905:12;3930:309;3995:6;4003;4056:2;4044:9;4035:7;4031:23;4027:32;4024:52;;;4072:1;4069;4062:12;4024:52;4111:9;4098:23;4130:28;4152:5;4130:28;:::i;4244:454::-;4339:6;4347;4355;4363;4371;4424:3;4412:9;4403:7;4399:23;4395:33;4392:53;;;4441:1;4438;4431:12;4392:53;-1:-1:-1;;4464:23:1;;;4534:2;4519:18;;4506:32;;-1:-1:-1;4585:2:1;4570:18;;4557:32;;4636:2;4621:18;;4608:32;;-1:-1:-1;4687:3:1;4672:19;4659:33;;-1:-1:-1;4244:454:1;-1:-1:-1;4244:454:1:o;5270:184::-;5340:6;5393:2;5381:9;5372:7;5368:23;5364:32;5361:52;;;5409:1;5406;5399:12;5361:52;-1:-1:-1;5432:16:1;;5270:184;-1:-1:-1;5270:184:1:o;5459:127::-;5520:10;5515:3;5511:20;5508:1;5501:31;5551:4;5548:1;5541:15;5575:4;5572:1;5565:15;5591:217;5631:1;5657;5647:132;;5701:10;5696:3;5692:20;5689:1;5682:31;5736:4;5733:1;5726:15;5764:4;5761:1;5754:15;5647:132;-1:-1:-1;5793:9:1;;5591:217::o;5813:128::-;5880:9;;;5901:11;;;5898:37;;;5915:18;;:::i;6658:168::-;6731:9;;;6762;;6779:15;;;6773:22;;6759:37;6749:71;;6800:18;;:::i;6831:125::-;6896:9;;;6917:10;;;6914:36;;;6930:18;;:::i;7240:245::-;7307:6;7360:2;7348:9;7339:7;7335:23;7331:32;7328:52;;;7376:1;7373;7366:12;7328:52;7408:9;7402:16;7427:28;7449:5;7427:28;:::i;8178:349::-;8380:2;8362:21;;;8419:2;8399:18;;;8392:30;8458:27;8453:2;8438:18;;8431:55;8518:2;8503:18;;8178:349::o;8532:273::-;8600:6;8653:2;8641:9;8632:7;8628:23;8624:32;8621:52;;;8669:1;8666;8659:12;8621:52;8701:9;8695:16;8751:4;8744:5;8740:16;8733:5;8730:27;8720:55;;8771:1;8768;8761:12;9161:422;9250:1;9293:5;9250:1;9307:270;9328:7;9318:8;9315:21;9307:270;;;9387:4;9383:1;9379:6;9375:17;9369:4;9366:27;9363:53;;;9396:18;;:::i;:::-;9446:7;9436:8;9432:22;9429:55;;;9466:16;;;;9429:55;9545:22;;;;9505:15;;;;9307:270;;;9311:3;9161:422;;;;;:::o;9588:806::-;9637:5;9667:8;9657:80;;-1:-1:-1;9708:1:1;9722:5;;9657:80;9756:4;9746:76;;-1:-1:-1;9793:1:1;9807:5;;9746:76;9838:4;9856:1;9851:59;;;;9924:1;9919:130;;;;9831:218;;9851:59;9881:1;9872:10;;9895:5;;;9919:130;9956:3;9946:8;9943:17;9940:43;;;9963:18;;:::i;:::-;-1:-1:-1;;10019:1:1;10005:16;;10034:5;;9831:218;;10133:2;10123:8;10120:16;10114:3;10108:4;10105:13;10101:36;10095:2;10085:8;10082:16;10077:2;10071:4;10068:12;10064:35;10061:77;10058:159;;;-1:-1:-1;10170:19:1;;;10202:5;;10058:159;10249:34;10274:8;10268:4;10249:34;:::i;:::-;10319:6;10315:1;10311:6;10307:19;10298:7;10295:32;10292:58;;;10330:18;;:::i;:::-;10368:20;;9588:806;-1:-1:-1;;;9588:806:1:o;10399:131::-;10459:5;10488:36;10515:8;10509:4;10488:36;:::i;14936:250::-;15021:1;15031:113;15045:6;15042:1;15039:13;15031:113;;;15121:11;;;15115:18;15102:11;;;15095:39;15067:2;15060:10;15031:113;;;-1:-1:-1;;15178:1:1;15160:16;;15153:27;14936:250::o;15191:287::-;15320:3;15358:6;15352:13;15374:66;15433:6;15428:3;15421:4;15413:6;15409:17;15374:66;:::i;:::-;15456:16;;;;;15191:287;-1:-1:-1;;15191:287:1:o;15483:396::-;15632:2;15621:9;15614:21;15595:4;15664:6;15658:13;15707:6;15702:2;15691:9;15687:18;15680:34;15723:79;15795:6;15790:2;15779:9;15775:18;15770:2;15762:6;15758:15;15723:79;:::i;:::-;15863:2;15842:15;-1:-1:-1;;15838:29:1;15823:45;;;;15870:2;15819:54;;15483:396;-1:-1:-1;;15483:396:1:o
Swarm Source
ipfs://a20ba6409b085fb0868d29a57416de0ce875011015447b5f06ef7c2c7a543186
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.143823 | 4,312.994 | $620.31 |
Loading...
Loading
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.