More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 549 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 20570371 | 182 days ago | IN | 0 ETH | 0.00052432 | ||||
Emergency Withdr... | 20336186 | 214 days ago | IN | 0 ETH | 0.00047484 | ||||
Clear Stuck Bala... | 20336179 | 214 days ago | IN | 0 ETH | 0.00018459 | ||||
Withdraw | 20336165 | 214 days ago | IN | 0 ETH | 0.00091256 | ||||
Emergency Reward... | 20187724 | 235 days ago | IN | 0 ETH | 0.00017489 | ||||
Withdraw | 20147777 | 241 days ago | IN | 0 ETH | 0.0007803 | ||||
Withdraw | 20132484 | 243 days ago | IN | 0 ETH | 0.00075859 | ||||
Withdraw | 20127685 | 243 days ago | IN | 0 ETH | 0.00127022 | ||||
Withdraw | 20127469 | 243 days ago | IN | 0 ETH | 0.00063762 | ||||
Withdraw | 20127448 | 243 days ago | IN | 0 ETH | 0.00046877 | ||||
Withdraw | 20014963 | 259 days ago | IN | 0 ETH | 0.00075492 | ||||
Withdraw | 20014957 | 259 days ago | IN | 0 ETH | 0.00033732 | ||||
Withdraw | 20014951 | 259 days ago | IN | 0 ETH | 0.00052379 | ||||
Withdraw | 20011076 | 260 days ago | IN | 0 ETH | 0.00101781 | ||||
Withdraw | 20011062 | 260 days ago | IN | 0 ETH | 0.00072701 | ||||
Withdraw | 20010539 | 260 days ago | IN | 0 ETH | 0.00135752 | ||||
Withdraw | 20006847 | 260 days ago | IN | 0 ETH | 0.00057061 | ||||
Withdraw | 20006837 | 260 days ago | IN | 0 ETH | 0.00063045 | ||||
Withdraw | 19994741 | 262 days ago | IN | 0 ETH | 0.00070114 | ||||
Withdraw | 19982582 | 264 days ago | IN | 0 ETH | 0.0007752 | ||||
Withdraw | 19982572 | 264 days ago | IN | 0 ETH | 0.00093406 | ||||
Withdraw | 19982568 | 264 days ago | IN | 0 ETH | 0.00073665 | ||||
Withdraw | 19982224 | 264 days ago | IN | 0 ETH | 0.00058854 | ||||
Withdraw | 19974194 | 265 days ago | IN | 0 ETH | 0.00125363 | ||||
Withdraw | 19974163 | 265 days ago | IN | 0 ETH | 0.00065787 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DropsTier3
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-09 */ // SPDX-License-Identifier: MIT /*⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀.⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣾⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⣿⣿⣧⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣾⣿⣿⣿⣿⣿⣿⣿⣿⣷⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡄⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠈⢻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡟⠁⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠙⠻⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠙⠛⠛⠛⠛⠋⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ Drops Lock Marketplace is the first locked liquidity marketplace. This is the Drops Tier 03 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 DropsTier3 is Ownable, ReentrancyGuard { using SafeERC20 for IERC20; uint256 public minDeposit; 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"); } uint256 amountDeposited = userInfo[msg.sender].amount; _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":"minDeposit","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
6080604052600680546001600160a01b03191673cdb94d75b5522b0440f638a17be7f8d70a7745f6179055600060135534801561003b57600080fd5b50338061006257604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b61006b81610087565b5060018055600580546001600160a01b031916331790556100d7565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6121c3806100e66000396000f3fe6080604052600436106102605760003560e01c806380dc067211610144578063c50aa8a2116100b6578063dd10546a1161007a578063dd10546a146106ed578063eb6642961461070d578063f2fde38b14610723578063f40f0f5214610743578063f520e7e514610763578063f7c618c11461077857600080fd5b8063c50aa8a21461066c578063cc7a262e1461068c578063ccd34cd5146106ac578063d56dda01146106c2578063db2e21bc146106d857600080fd5b8063a0b4090511610108578063a0b40905146105c0578063a9f8d181146105e0578063aa07547d146105f6578063b6b55f251461060c578063bbcaac381461062c578063bd6171911461064c57600080fd5b806380dc0672146105405780638ae39cac146105555780638da5cb5b1461056b5780638f6629151461058957806392e8990e1461059f57600080fd5b806341275358116101dd57806366fe9f8a116101a157806366fe9f8a1461049f5780636b89bb3f146104b55780636db79437146104d5578063715018a6146104f55780637a988f971461050a5780637e2fd5861461052057600080fd5b8063412753581461040557806341b3d1851461043d57806348cd4cb11461045357806354747a701461046957806356a227f21461047f57600080fd5b80631aed6553116102245780631aed65531461035e5780632e1a7d4d146103745780633279beab14610394578063392e53cd146103b45780633f138d4b146103e557600080fd5b806301a0011f1461026c57806301f8a9761461028357806303dc1f9b146102a357806313bc67aa146102d65780631959a002146102ec57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b50610281610798565b005b34801561028f57600080fd5b5061028161029e366004611d6d565b610870565b3480156102af57600080fd5b506102c36102be366004611d9b565b6108b3565b6040519081526020015b60405180910390f35b3480156102e257600080fd5b506102c3600f5481565b3480156102f857600080fd5b50610336610307366004611d9b565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b34801561036a57600080fd5b506102c360085481565b34801561038057600080fd5b5061028161038f366004611d6d565b610936565b3480156103a057600080fd5b506102816103af366004611d6d565b610c73565b3480156103c057600080fd5b506006546103d590600160a81b900460ff1681565b60405190151581526020016102cd565b3480156103f157600080fd5b50610281610400366004611db8565b610c92565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016102cd565b34801561044957600080fd5b506102c360025481565b34801561045f57600080fd5b506102c360095481565b34801561047557600080fd5b506102c3600d5481565b34801561048b57600080fd5b5061028161049a366004611de4565b610d53565b3480156104ab57600080fd5b506102c3600b5481565b3480156104c157600080fd5b506102816104d0366004611e14565b610dc2565b3480156104e157600080fd5b506102816104f0366004611e9c565b611007565b34801561050157600080fd5b50610281611093565b34801561051657600080fd5b506102c360135481565b34801561052c57600080fd5b50600354610425906001600160a01b031681565b34801561054c57600080fd5b506102816110a7565b34801561056157600080fd5b506102c3600c5481565b34801561057757600080fd5b506000546001600160a01b0316610425565b34801561059557600080fd5b506102c360075481565b3480156105ab57600080fd5b506006546103d590600160a01b900460ff1681565b3480156105cc57600080fd5b506102816105db366004611ecc565b6110b5565b3480156105ec57600080fd5b506102c3600a5481565b34801561060257600080fd5b506102c3600e5481565b34801561061857600080fd5b50610281610627366004611d6d565b6111b5565b34801561063857600080fd5b50610281610647366004611d9b565b6115b7565b34801561065857600080fd5b50600554610425906001600160a01b031681565b34801561067857600080fd5b50610281610687366004611eea565b611688565b34801561069857600080fd5b50601254610425906001600160a01b031681565b3480156106b857600080fd5b506102c360105481565b3480156106ce57600080fd5b506102c360155481565b3480156106e457600080fd5b506102816117bc565b3480156106f957600080fd5b50600454610425906001600160a01b031681565b34801561071957600080fd5b506102c360145481565b34801561072f57600080fd5b5061028161073e366004611d9b565b611858565b34801561074f57600080fd5b506102c361075e366004611d9b565b611893565b34801561076f57600080fd5b506102c3611978565b34801561078457600080fd5b50601154610425906001600160a01b031681565b6107a061198f565b60095443106107e95760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b6011546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190611f25565b9050610860611978565b61086a9082611f54565b600c5550565b61087861198f565b600c8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6001600160a01b0381166000908152601660205260408120600381015482906108dc9042611f76565b9050600082600301546000036108f45750600061092e565b600f5482101561092e5760085482600f5461090f9190611f76565b116109275781600f546109229190611f76565b61092b565b6008545b90505b949350505050565b61093e6119bc565b33600081815260166020526040812091610957906108b3565b905082826000015410156109ad5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f2068696768000000000060448201526064016107e0565b80156109fb5760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a206c6f636b74696d652072656d61696e7321000000000060448201526064016107e0565b610a036119e6565b6000826004015483600101546010546007548660000154610a249190611f89565b610a2e9190611f54565b610a389190611f76565b610a429190611fa0565b90508315610bea576012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190611f25565b600e5490915015610b25576000612710600e5487610ad59190611f89565b610adf9190611f54565b9050610b0233610aef8389611f76565b6012546001600160a01b03169190611a56565b600654601254610b1f916001600160a01b03918216911683611a56565b50610b3c565b601254610b3c906001600160a01b03163387611a56565b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba99190611f25565b610bb39083611f76565b905080601354610bc39190611f76565b6013558454610bd3908290611f76565b8555601454610be29042611fa0565b600286015550505b8015610c0757601154610c07906001600160a01b03163383611a56565b6010546007548454610c199190611f89565b610c239190611f54565b60018401556000600484015560405184815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505050610c7060018055565b50565b610c7b61198f565b601154610c70906001600160a01b03163383611a56565b610c9a61198f565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0b9190611fb3565b50604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b610d5b61198f565b306001600160a01b03821603610d7057600080fd5b476001600160a01b0382166108fc6064610d8a8685611f89565b610d949190611f54565b6040518115909202916000818181858888f19350505050158015610dbc573d6000803e3d6000fd5b50505050565b600654600160a81b900460ff1615610e125760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107e0565b6005546001600160a01b03163314610e5a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b60448201526064016107e0565b612710851115610e7c5760405162461bcd60e51b81526004016107e090611fd0565b612710841115610e9e5760405162461bcd60e51b81526004016107e090611fd0565b6006805460ff60a81b1916600160a81b179055601280546001600160a01b03808e166001600160a01b03199283161790925560118054928d1692909116919091179055600c89905560098890556008879055600d859055600e84905560148390556015829055600f8190558515610f28576006805460ff60a01b1916600160a01b179055600b8690555b60008a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c9190612007565b60ff169050601e8110610fda5760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b60448201526064016107e0565b610fe581601e611f76565b610ff090600a61210e565b6010555050600954600a5550505050505050505050565b61100f61198f565b6127108211156110315760405162461bcd60e51b81526004016107e090611fd0565b6127108111156110535760405162461bcd60e51b81526004016107e090611fd0565b600d829055600e81905560408051838152602081018390527f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf178199101610d47565b61109b61198f565b6110a56000611abe565b565b6110af61198f565b43600855565b6110bd61198f565b600654600160a01b900460ff166111045760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b60448201526064016107e0565b811561116557600b54811161115b5760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d75737420626520686967686572000000000000000060448201526064016107e0565b600b819055611182565b6006805460ff60a01b1916600160a01b841515021790556000600b555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600b54604051610d4791815260200190565b6111bd6119bc565b336000818152601660205260408120916111d6906108b3565b6006549091508390600160a01b900460ff161561124a57600b5483546111fc9086611fa0565b111561124a5760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d697400000000000000000060448201526064016107e0565b336000908152601660205260409020546112626119e6565b83541561130e576000846001015460105460075487600001546112859190611f89565b61128f9190611f54565b6112999190611f76565b905060008111806112ae575060008560040154115b1561130c57600084116112f05760048501546112ca9082611fa0565b6011549091506112e4906001600160a01b03163383611a56565b6000600486015561130c565b801561130c578085600401546113069190611fa0565b60048601555b505b8415611554576012546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190611f25565b101561138b57600080fd5b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190611f25565b600d549091501561146a576000612710600d54886114169190611f89565b6114209190611f54565b90506114453330611431848b611f76565b6012546001600160a01b0316929190611b0e565b600654601254611464916001600160a01b039182169133911684611b0e565b50611482565b601254611482906001600160a01b0316333089611b0e565b6012546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190611f25565b6114fd9190611f76565b865490915061150d908290611fa0565b86556013549093508390611522908290611fa0565b6013556014546000906115359042611fa0565b905060155481111561154657506015545b600287015550504260038501555b60105460075485546115669190611f89565b6115709190611f54565b600185015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250505050610c7060018055565b6006546001600160a01b0316331461161f5760405162461bcd60e51b815260206004820152602560248201527f5365743a20596f7520646f206e6f742068617665207269676874207065726d6960448201526439b9b4b7b760d91b60648201526084016107e0565b600654604080516001600160a01b03928316815291831660208301527fca68aa7805c8a17c09111b6be74d77af7df8318186a2c8d6f2743d137c6d2828910160405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b61169061198f565b8385106116f65760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b60648201526084016107e0565b84431061175e5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b60648201526084016107e0565b6009859055600884905560148390556015829055600f819055600a85905560408051868152602081018690527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a15050505050565b6117c46119bc565b336000908152601660205260408120805482825560018201839055600482019290925590801561181657806013546117fc9190611f76565b601355601254611816906001600160a01b03163383611a56565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506110a560018055565b61186061198f565b6001600160a01b03811661188a57604051631e4fbdf760e01b8152600060048201526024016107e0565b610c7081611abe565b6001600160a01b0381166000908152601660205260408120600a54431180156118bd575060135415155b156119465760006118d0600a5443611b46565b90506000600c54826118e29190611f89565b90506000601354601054836118f79190611f89565b6119019190611f54565b60075461190e9190611fa0565b905083600101546010548286600001546119289190611f89565b6119329190611f54565b61193c9190611f76565b9695505050505050565b6001810154601054600754835461195d9190611f89565b6119679190611f54565b6119719190611f76565b9392505050565b600060095460085461198a9190611f76565b905090565b6000546001600160a01b031633146110a55760405163118cdaa760e01b81523360048201526024016107e0565b6002600154036119df57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600a5443116119f157565b601354600003611a015743600a55565b6000611a0f600a5443611b46565b90506000600c5482611a219190611f89565b905060135460105482611a349190611f89565b611a3e9190611f54565b600754611a4b9190611fa0565b600755505043600a55565b6040516001600160a01b038316602482015260448101829052611ab990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b87565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610dbc9085906323b872dd60e01b90608401611a82565b60006008548211611b6257611b5b8383611f76565b9050611b81565b6008548310611b7357506000611b81565b82600854611b5b9190611f76565b92915050565b6000611bdc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c599092919063ffffffff16565b805190915015611ab95780806020019051810190611bfa9190611fb3565b611ab95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e0565b606061092e8484600085856001600160a01b0385163b611cbb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e0565b600080866001600160a01b03168587604051611cd7919061213e565b60006040518083038185875af1925050503d8060008114611d14576040519150601f19603f3d011682016040523d82523d6000602084013e611d19565b606091505b5091509150611d29828286611d34565b979650505050505050565b60608315611d43575081611971565b825115611d535782518084602001fd5b8160405162461bcd60e51b81526004016107e0919061215a565b600060208284031215611d7f57600080fd5b5035919050565b6001600160a01b0381168114610c7057600080fd5b600060208284031215611dad57600080fd5b813561197181611d86565b60008060408385031215611dcb57600080fd5b8235611dd681611d86565b946020939093013593505050565b60008060408385031215611df757600080fd5b823591506020830135611e0981611d86565b809150509250929050565b60008060008060008060008060008060006101608c8e031215611e3657600080fd5b8b35611e4181611d86565b9a5060208c0135611e5181611d86565b9a9d9a9c505050506040890135986060810135986080820135985060a0820135975060c0820135965060e0820135955061010082013594506101208201359350610140909101359150565b60008060408385031215611eaf57600080fd5b50508035926020909101359150565b8015158114610c7057600080fd5b60008060408385031215611edf57600080fd5b8235611dd681611ebe565b600080600080600060a08688031215611f0257600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215611f3757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611f7157634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115611b8157611b81611f3e565b8082028115828204841417611b8157611b81611f3e565b80820180821115611b8157611b81611f3e565b600060208284031215611fc557600080fd5b815161197181611ebe565b60208082526019908201527f43616e6e6f7420626520626967676572207468616e2031303000000000000000604082015260600190565b60006020828403121561201957600080fd5b815160ff8116811461197157600080fd5b600181815b8085111561206557816000190482111561204b5761204b611f3e565b8085161561205857918102915b93841c939080029061202f565b509250929050565b60008261207c57506001611b81565b8161208957506000611b81565b816001811461209f57600281146120a9576120c5565b6001915050611b81565b60ff8411156120ba576120ba611f3e565b50506001821b611b81565b5060208310610133831016604e8410600b84101617156120e8575081810a611b81565b6120f2838361202a565b806000190482111561210657612106611f3e565b029392505050565b6000611971838361206d565b60005b8381101561213557818101518382015260200161211d565b50506000910152565b6000825161215081846020870161211a565b9190910192915050565b602081526000825180602084015261217981604085016020870161211a565b601f01601f1916919091016040019291505056fea2646970667358221220cd57914377746e1845dc7f0fdc5dc8122f65dfcfb627cd9acbf761d603936b4664736f6c63430008180033
Deployed Bytecode
0x6080604052600436106102605760003560e01c806380dc067211610144578063c50aa8a2116100b6578063dd10546a1161007a578063dd10546a146106ed578063eb6642961461070d578063f2fde38b14610723578063f40f0f5214610743578063f520e7e514610763578063f7c618c11461077857600080fd5b8063c50aa8a21461066c578063cc7a262e1461068c578063ccd34cd5146106ac578063d56dda01146106c2578063db2e21bc146106d857600080fd5b8063a0b4090511610108578063a0b40905146105c0578063a9f8d181146105e0578063aa07547d146105f6578063b6b55f251461060c578063bbcaac381461062c578063bd6171911461064c57600080fd5b806380dc0672146105405780638ae39cac146105555780638da5cb5b1461056b5780638f6629151461058957806392e8990e1461059f57600080fd5b806341275358116101dd57806366fe9f8a116101a157806366fe9f8a1461049f5780636b89bb3f146104b55780636db79437146104d5578063715018a6146104f55780637a988f971461050a5780637e2fd5861461052057600080fd5b8063412753581461040557806341b3d1851461043d57806348cd4cb11461045357806354747a701461046957806356a227f21461047f57600080fd5b80631aed6553116102245780631aed65531461035e5780632e1a7d4d146103745780633279beab14610394578063392e53cd146103b45780633f138d4b146103e557600080fd5b806301a0011f1461026c57806301f8a9761461028357806303dc1f9b146102a357806313bc67aa146102d65780631959a002146102ec57600080fd5b3661026757005b600080fd5b34801561027857600080fd5b50610281610798565b005b34801561028f57600080fd5b5061028161029e366004611d6d565b610870565b3480156102af57600080fd5b506102c36102be366004611d9b565b6108b3565b6040519081526020015b60405180910390f35b3480156102e257600080fd5b506102c3600f5481565b3480156102f857600080fd5b50610336610307366004611d9b565b601660205260009081526040902080546001820154600283015460038401546004909401549293919290919085565b604080519586526020860194909452928401919091526060830152608082015260a0016102cd565b34801561036a57600080fd5b506102c360085481565b34801561038057600080fd5b5061028161038f366004611d6d565b610936565b3480156103a057600080fd5b506102816103af366004611d6d565b610c73565b3480156103c057600080fd5b506006546103d590600160a81b900460ff1681565b60405190151581526020016102cd565b3480156103f157600080fd5b50610281610400366004611db8565b610c92565b34801561041157600080fd5b50600654610425906001600160a01b031681565b6040516001600160a01b0390911681526020016102cd565b34801561044957600080fd5b506102c360025481565b34801561045f57600080fd5b506102c360095481565b34801561047557600080fd5b506102c3600d5481565b34801561048b57600080fd5b5061028161049a366004611de4565b610d53565b3480156104ab57600080fd5b506102c3600b5481565b3480156104c157600080fd5b506102816104d0366004611e14565b610dc2565b3480156104e157600080fd5b506102816104f0366004611e9c565b611007565b34801561050157600080fd5b50610281611093565b34801561051657600080fd5b506102c360135481565b34801561052c57600080fd5b50600354610425906001600160a01b031681565b34801561054c57600080fd5b506102816110a7565b34801561056157600080fd5b506102c3600c5481565b34801561057757600080fd5b506000546001600160a01b0316610425565b34801561059557600080fd5b506102c360075481565b3480156105ab57600080fd5b506006546103d590600160a01b900460ff1681565b3480156105cc57600080fd5b506102816105db366004611ecc565b6110b5565b3480156105ec57600080fd5b506102c3600a5481565b34801561060257600080fd5b506102c3600e5481565b34801561061857600080fd5b50610281610627366004611d6d565b6111b5565b34801561063857600080fd5b50610281610647366004611d9b565b6115b7565b34801561065857600080fd5b50600554610425906001600160a01b031681565b34801561067857600080fd5b50610281610687366004611eea565b611688565b34801561069857600080fd5b50601254610425906001600160a01b031681565b3480156106b857600080fd5b506102c360105481565b3480156106ce57600080fd5b506102c360155481565b3480156106e457600080fd5b506102816117bc565b3480156106f957600080fd5b50600454610425906001600160a01b031681565b34801561071957600080fd5b506102c360145481565b34801561072f57600080fd5b5061028161073e366004611d9b565b611858565b34801561074f57600080fd5b506102c361075e366004611d9b565b611893565b34801561076f57600080fd5b506102c3611978565b34801561078457600080fd5b50601154610425906001600160a01b031681565b6107a061198f565b60095443106107e95760405162461bcd60e51b815260206004820152601060248201526f141bdbdb081a185cc81cdd185c9d195960821b60448201526064015b60405180910390fd5b6011546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610832573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108569190611f25565b9050610860611978565b61086a9082611f54565b600c5550565b61087861198f565b600c8190556040518181527f0c4d677eef92893ac7ec52faf8140fc6c851ab4736302b4f3a89dfb20696a0df9060200160405180910390a150565b6001600160a01b0381166000908152601660205260408120600381015482906108dc9042611f76565b9050600082600301546000036108f45750600061092e565b600f5482101561092e5760085482600f5461090f9190611f76565b116109275781600f546109229190611f76565b61092b565b6008545b90505b949350505050565b61093e6119bc565b33600081815260166020526040812091610957906108b3565b905082826000015410156109ad5760405162461bcd60e51b815260206004820152601b60248201527f416d6f756e7420746f20776974686472617720746f6f2068696768000000000060448201526064016107e0565b80156109fb5760405162461bcd60e51b815260206004820152601b60248201527f77697468647261773a206c6f636b74696d652072656d61696e7321000000000060448201526064016107e0565b610a036119e6565b6000826004015483600101546010546007548660000154610a249190611f89565b610a2e9190611f54565b610a389190611f76565b610a429190611fa0565b90508315610bea576012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610a93573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ab79190611f25565b600e5490915015610b25576000612710600e5487610ad59190611f89565b610adf9190611f54565b9050610b0233610aef8389611f76565b6012546001600160a01b03169190611a56565b600654601254610b1f916001600160a01b03918216911683611a56565b50610b3c565b601254610b3c906001600160a01b03163387611a56565b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610b85573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ba99190611f25565b610bb39083611f76565b905080601354610bc39190611f76565b6013558454610bd3908290611f76565b8555601454610be29042611fa0565b600286015550505b8015610c0757601154610c07906001600160a01b03163383611a56565b6010546007548454610c199190611f89565b610c239190611f54565b60018401556000600484015560405184815233907f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a94243649060200160405180910390a2505050610c7060018055565b50565b610c7b61198f565b601154610c70906001600160a01b03163383611a56565b610c9a61198f565b60405163a9059cbb60e01b8152336004820152602481018290526001600160a01b0383169063a9059cbb906044016020604051808303816000875af1158015610ce7573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d0b9190611fb3565b50604080516001600160a01b0384168152602081018390527f74545154aac348a3eac92596bd1971957ca94795f4e954ec5f613b55fab7812991015b60405180910390a15050565b610d5b61198f565b306001600160a01b03821603610d7057600080fd5b476001600160a01b0382166108fc6064610d8a8685611f89565b610d949190611f54565b6040518115909202916000818181858888f19350505050158015610dbc573d6000803e3d6000fd5b50505050565b600654600160a81b900460ff1615610e125760405162461bcd60e51b8152602060048201526013602482015272105b1c9958591e481a5b9a5d1a585b1a5e9959606a1b60448201526064016107e0565b6005546001600160a01b03163314610e5a5760405162461bcd60e51b815260206004820152600b60248201526a4e6f7420666163746f727960a81b60448201526064016107e0565b612710851115610e7c5760405162461bcd60e51b81526004016107e090611fd0565b612710841115610e9e5760405162461bcd60e51b81526004016107e090611fd0565b6006805460ff60a81b1916600160a81b179055601280546001600160a01b03808e166001600160a01b03199283161790925560118054928d1692909116919091179055600c89905560098890556008879055600d859055600e84905560148390556015829055600f8190558515610f28576006805460ff60a01b1916600160a01b179055600b8690555b60008a6001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015610f68573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8c9190612007565b60ff169050601e8110610fda5760405162461bcd60e51b815260206004820152601660248201527504d75737420626520696e666572696f7220746f2033360541b60448201526064016107e0565b610fe581601e611f76565b610ff090600a61210e565b6010555050600954600a5550505050505050505050565b61100f61198f565b6127108211156110315760405162461bcd60e51b81526004016107e090611fd0565b6127108111156110535760405162461bcd60e51b81526004016107e090611fd0565b600d829055600e81905560408051838152602081018390527f0aaa05fba10caab20c7dfcd757223e489dbd2313a5e1add54bca74aceaf178199101610d47565b61109b61198f565b6110a56000611abe565b565b6110af61198f565b43600855565b6110bd61198f565b600654600160a01b900460ff166111045760405162461bcd60e51b815260206004820152600b60248201526a135d5cdd081899481cd95d60aa1b60448201526064016107e0565b811561116557600b54811161115b5760405162461bcd60e51b815260206004820152601860248201527f4e6577206c696d6974206d75737420626520686967686572000000000000000060448201526064016107e0565b600b819055611182565b6006805460ff60a01b1916600160a01b841515021790556000600b555b7f241f67ee5f41b7a5cabf911367329be7215900f602ebfc47f89dce2a6bcd847c600b54604051610d4791815260200190565b6111bd6119bc565b336000818152601660205260408120916111d6906108b3565b6006549091508390600160a01b900460ff161561124a57600b5483546111fc9086611fa0565b111561124a5760405162461bcd60e51b815260206004820152601760248201527f5573657220616d6f756e742061626f7665206c696d697400000000000000000060448201526064016107e0565b336000908152601660205260409020546112626119e6565b83541561130e576000846001015460105460075487600001546112859190611f89565b61128f9190611f54565b6112999190611f76565b905060008111806112ae575060008560040154115b1561130c57600084116112f05760048501546112ca9082611fa0565b6011549091506112e4906001600160a01b03163383611a56565b6000600486015561130c565b801561130c578085600401546113069190611fa0565b60048601555b505b8415611554576012546040516370a0823160e01b815233600482015286916001600160a01b0316906370a0823190602401602060405180830381865afa15801561135c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113809190611f25565b101561138b57600080fd5b6012546040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa1580156113d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113f89190611f25565b600d549091501561146a576000612710600d54886114169190611f89565b6114209190611f54565b90506114453330611431848b611f76565b6012546001600160a01b0316929190611b0e565b600654601254611464916001600160a01b039182169133911684611b0e565b50611482565b601254611482906001600160a01b0316333089611b0e565b6012546040516370a0823160e01b815230600482015260009183916001600160a01b03909116906370a0823190602401602060405180830381865afa1580156114cf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f39190611f25565b6114fd9190611f76565b865490915061150d908290611fa0565b86556013549093508390611522908290611fa0565b6013556014546000906115359042611fa0565b905060155481111561154657506015545b600287015550504260038501555b60105460075485546115669190611f89565b6115709190611f54565b600185015560405182815233907fe1fffcc4923d04b559f4d29a8bfc6cda04eb5b0d3c460751c2402c5c5cc9109c9060200160405180910390a250505050610c7060018055565b6006546001600160a01b0316331461161f5760405162461bcd60e51b815260206004820152602560248201527f5365743a20596f7520646f206e6f742068617665207269676874207065726d6960448201526439b9b4b7b760d91b60648201526084016107e0565b600654604080516001600160a01b03928316815291831660208301527fca68aa7805c8a17c09111b6be74d77af7df8318186a2c8d6f2743d137c6d2828910160405180910390a1600680546001600160a01b0319166001600160a01b0392909216919091179055565b61169061198f565b8385106116f65760405162461bcd60e51b815260206004820152602e60248201527f4e6577207374617274426c6f636b206d757374206265206c6f7765722074686160448201526d6e206e657720656e64426c6f636b60901b60648201526084016107e0565b84431061175e5760405162461bcd60e51b815260206004820152603060248201527f4e6577207374617274426c6f636b206d7573742062652068696768657220746860448201526f616e2063757272656e7420626c6f636b60801b60648201526084016107e0565b6009859055600884905560148390556015829055600f819055600a85905560408051868152602081018690527f7cd0ab87d19036f3dfadadb232c78aa4879dda3f0c994a9d637532410ee2ce06910160405180910390a15050505050565b6117c46119bc565b336000908152601660205260408120805482825560018201839055600482019290925590801561181657806013546117fc9190611f76565b601355601254611816906001600160a01b03163383611a56565b815460405190815233907f5fafa99d0643513820be26656b45130b01e1c03062e1266bf36f88cbd3bd96959060200160405180910390a250506110a560018055565b61186061198f565b6001600160a01b03811661188a57604051631e4fbdf760e01b8152600060048201526024016107e0565b610c7081611abe565b6001600160a01b0381166000908152601660205260408120600a54431180156118bd575060135415155b156119465760006118d0600a5443611b46565b90506000600c54826118e29190611f89565b90506000601354601054836118f79190611f89565b6119019190611f54565b60075461190e9190611fa0565b905083600101546010548286600001546119289190611f89565b6119329190611f54565b61193c9190611f76565b9695505050505050565b6001810154601054600754835461195d9190611f89565b6119679190611f54565b6119719190611f76565b9392505050565b600060095460085461198a9190611f76565b905090565b6000546001600160a01b031633146110a55760405163118cdaa760e01b81523360048201526024016107e0565b6002600154036119df57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b600a5443116119f157565b601354600003611a015743600a55565b6000611a0f600a5443611b46565b90506000600c5482611a219190611f89565b905060135460105482611a349190611f89565b611a3e9190611f54565b600754611a4b9190611fa0565b600755505043600a55565b6040516001600160a01b038316602482015260448101829052611ab990849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611b87565b505050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6040516001600160a01b0380851660248301528316604482015260648101829052610dbc9085906323b872dd60e01b90608401611a82565b60006008548211611b6257611b5b8383611f76565b9050611b81565b6008548310611b7357506000611b81565b82600854611b5b9190611f76565b92915050565b6000611bdc826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316611c599092919063ffffffff16565b805190915015611ab95780806020019051810190611bfa9190611fb3565b611ab95760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016107e0565b606061092e8484600085856001600160a01b0385163b611cbb5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016107e0565b600080866001600160a01b03168587604051611cd7919061213e565b60006040518083038185875af1925050503d8060008114611d14576040519150601f19603f3d011682016040523d82523d6000602084013e611d19565b606091505b5091509150611d29828286611d34565b979650505050505050565b60608315611d43575081611971565b825115611d535782518084602001fd5b8160405162461bcd60e51b81526004016107e0919061215a565b600060208284031215611d7f57600080fd5b5035919050565b6001600160a01b0381168114610c7057600080fd5b600060208284031215611dad57600080fd5b813561197181611d86565b60008060408385031215611dcb57600080fd5b8235611dd681611d86565b946020939093013593505050565b60008060408385031215611df757600080fd5b823591506020830135611e0981611d86565b809150509250929050565b60008060008060008060008060008060006101608c8e031215611e3657600080fd5b8b35611e4181611d86565b9a5060208c0135611e5181611d86565b9a9d9a9c505050506040890135986060810135986080820135985060a0820135975060c0820135965060e0820135955061010082013594506101208201359350610140909101359150565b60008060408385031215611eaf57600080fd5b50508035926020909101359150565b8015158114610c7057600080fd5b60008060408385031215611edf57600080fd5b8235611dd681611ebe565b600080600080600060a08688031215611f0257600080fd5b505083359560208501359550604085013594606081013594506080013592509050565b600060208284031215611f3757600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600082611f7157634e487b7160e01b600052601260045260246000fd5b500490565b81810381811115611b8157611b81611f3e565b8082028115828204841417611b8157611b81611f3e565b80820180821115611b8157611b81611f3e565b600060208284031215611fc557600080fd5b815161197181611ebe565b60208082526019908201527f43616e6e6f7420626520626967676572207468616e2031303000000000000000604082015260600190565b60006020828403121561201957600080fd5b815160ff8116811461197157600080fd5b600181815b8085111561206557816000190482111561204b5761204b611f3e565b8085161561205857918102915b93841c939080029061202f565b509250929050565b60008261207c57506001611b81565b8161208957506000611b81565b816001811461209f57600281146120a9576120c5565b6001915050611b81565b60ff8411156120ba576120ba611f3e565b50506001821b611b81565b5060208310610133831016604e8410600b84101617156120e8575081810a611b81565b6120f2838361202a565b806000190482111561210657612106611f3e565b029392505050565b6000611971838361206d565b60005b8381101561213557818101518382015260200161211d565b50506000910152565b6000825161215081846020870161211a565b9190910192915050565b602081526000825180602084015261217981604085016020870161211a565b601f01601f1916919091016040019291505056fea2646970667358221220cd57914377746e1845dc7f0fdc5dc8122f65dfcfb627cd9acbf761d603936b4664736f6c63430008180033
Deployed Bytecode Sourcemap
28376:15971:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44101:243;;;;;;;;;;;;;:::i;:::-;;40152:175;;;;;;;;;;-1:-1:-1;40152:175:0;;;;;:::i;:::-;;:::i;32883:588::-;;;;;;;;;;-1:-1:-1;32883:588:0;;;;;:::i;:::-;;:::i;:::-;;;733:25:1;;;721:2;706:18;32883:588:0;;;;;;;;29393:33;;;;;;;;;;;;;;;;29811:44;;;;;;;;;;-1:-1:-1;29811: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;29811:44:0;769:463:1;28997:28:0;;;;;;;;;;;;;;;;36181:1552;;;;;;;;;;-1:-1:-1;36181:1552:0;;;;;:::i;:::-;;:::i;38474:142::-;;;;;;;;;;-1:-1:-1;38474:142:0;;;;;:::i;:::-;;:::i;28889:25::-;;;;;;;;;;-1:-1:-1;28889:25:0;;;;-1:-1:-1;;;28889:25:0;;;;;;;;;1402:14:1;;1395:22;1377:41;;1365:2;1350:18;28889:25:0;1237:187:1;38626:239:0;;;;;;;;;;-1:-1:-1;38626:239:0;;;;;:::i;:::-;;:::i;28696:70::-;;;;;;;;;;-1:-1:-1;28696:70:0;;;;-1:-1:-1;;;;;28696:70:0;;;;;;-1:-1:-1;;;;;1913:32:1;;;1895:51;;1883:2;1868:18;28696:70:0;1749:203:1;28472:25:0;;;;;;;;;;;;;;;;29038;;;;;;;;;;;;;;;;29298:27;;;;;;;;;;;;;;;;38873:286;;;;;;;;;;-1:-1:-1;38873:286:0;;;;;:::i;:::-;;:::i;29195:31::-;;;;;;;;;;;;;;;;31271:1604;;;;;;;;;;-1:-1:-1;31271:1604:0;;;;;:::i;:::-;;:::i;40335:395::-;;;;;;;;;;-1:-1:-1;40335:395:0;;;;;:::i;:::-;;:::i;15877:103::-;;;;;;;;;;;;;:::i;29674:36::-;;;;;;;;;;;;;;;;28506:40;;;;;;;;;;-1:-1:-1;28506:40:0;;;;-1:-1:-1;;;;;28506:40:0;;;39238:88;;;;;;;;;;;;;:::i;29239:29::-;;;;;;;;;;;;;;;;15202:87;;;;;;;;;;-1:-1:-1;15248:7:0;15275:6;-1:-1:-1;;;;;15275:6:0;15202:87;;28955:31;;;;;;;;;;;;;;;;28816:24;;;;;;;;;;-1:-1:-1;28816:24:0;;;;-1:-1:-1;;;28816:24:0;;;;;;39537:475;;;;;;;;;;-1:-1:-1;39537:475:0;;;;;:::i;:::-;;:::i;29121:30::-;;;;;;;;;;;;;;;;29356:28;;;;;;;;;;;;;;;;33613:2434;;;;;;;;;;-1:-1:-1;33613:2434:0;;;;;:::i;:::-;;:::i;40738:248::-;;;;;;;;;;-1:-1:-1;40738:248:0;;;;;:::i;:::-;;:::i;28635:33::-;;;;;;;;;;-1:-1:-1;28635:33:0;;;;-1:-1:-1;;;;;28635:33:0;;;41214:855;;;;;;;;;;-1:-1:-1;41214:855:0;;;;;:::i;:::-;;:::i;29610:25::-;;;;;;;;;;-1:-1:-1;29610:25:0;;;;-1:-1:-1;;;;;29610:25:0;;;29486:31;;;;;;;;;;;;;;;;29765:36;;;;;;;;;;;;;;;;37859:512;;;;;;;;;;;;;:::i;28555:27::-;;;;;;;;;;-1:-1:-1;28555:27:0;;;;-1:-1:-1;;;;;28555:27:0;;;29722:36;;;;;;;;;;;;;;;;16135:220;;;;;;;;;;-1:-1:-1;16135:220:0;;;;;:::i;:::-;;:::i;42227:689::-;;;;;;;;;;-1:-1:-1;42227:689:0;;;;;:::i;:::-;;:::i;43985:108::-;;;;;;;;;;;;;:::i;29551:25::-;;;;;;;;;;-1:-1:-1;29551:25:0;;;;-1:-1:-1;;;;;29551:25:0;;;44101:243;15088:13;:11;:13::i;:::-;44182:10:::1;;44167:12;:25;44159:54;;;::::0;-1:-1:-1;;;44159:54:0;;5127:2:1;44159: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;;44159:54:0::1;;;;;;;;;44244:11;::::0;:36:::1;::::0;-1:-1:-1;;;44244:36:0;;44274:4:::1;44244:36;::::0;::::1;1895:51:1::0;44224:17:0::1;::::0;-1:-1:-1;;;;;44244:11:0::1;::::0;:21:::1;::::0;1868:18:1;;44244:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44224:56;;44320:16;:14;:16::i;:::-;44308:28;::::0;:9;:28:::1;:::i;:::-;44291:14;:45:::0;-1:-1:-1;44101:243:0:o;40152:175::-;15088:13;:11;:13::i;:::-;40237:14:::1;:32:::0;;;40285:34:::1;::::0;733:25:1;;;40285:34:0::1;::::0;721:2:1;706:18;40285:34:0::1;;;;;;;40152:175:::0;:::o;32883:588::-;-1:-1:-1;;;;;33020:15:0;;32971:7;33020:15;;;:8;:15;;;;;33087:16;;;;32971:7;;33068:36;;:15;:36;:::i;:::-;33046:58;;33115:25;33159:4;:16;;;33179:1;33159:21;33155:272;;-1:-1:-1;33217:1:0;33155:272;;;33253:18;;33239:11;:32;33236:191;;;33347:13;;33331:11;33309:18;;:34;;;;:::i;:::-;33308:52;:107;;33402:11;33380:18;;:34;;;;:::i;:::-;33308:107;;;33363:13;;33308:107;33288:127;;33236:191;33446:17;32883:588;-1:-1:-1;;;;32883:588:0:o;36181:1552::-;4872:21;:19;:21::i;:::-;36282:10:::1;36249:21;36273:20:::0;;;:8:::1;:20;::::0;;;;;36325:26:::1;::::0;:14:::1;:26::i;:::-;36304:47;;36385:7;36370:4;:11;;;:22;;36362:62;;;::::0;-1:-1:-1;;;36362:62:0;;6148:2:1;36362:62:0::1;::::0;::::1;6130:21:1::0;6187:2;6167:18;;;6160:30;6226:29;6206:18;;;6199:57;6273:18;;36362:62:0::1;5946:351:1::0;36362:62:0::1;36443:15:::0;;36435:55:::1;;;::::0;-1:-1:-1;;;36435:55:0;;6504:2:1;36435:55:0::1;::::0;::::1;6486:21:1::0;6543:2;6523:18;;;6516:30;6582:29;6562:18;;;6555:57;6629:18;;36435:55:0::1;6302:351:1::0;36435:55:0::1;36501:13;:11;:13::i;:::-;36527:15;36615:4;:19;;;36597:4;:15;;;36578:16;;36559;;36545:4;:11;;;:30;;;;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;:89;;;;:::i;:::-;36527:107:::0;-1:-1:-1;36651:11:0;;36647:808:::1;;36718:11;::::0;:36:::1;::::0;-1:-1:-1;;;36718:36:0;;36748:4:::1;36718:36;::::0;::::1;1895:51:1::0;36679:36:0::1;::::0;-1:-1:-1;;;;;36718:11:0::1;::::0;:21:::1;::::0;1868:18:1;;36718:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;36772:13;::::0;36679:75;;-1:-1:-1;36772:17:0;36769:360:::1;;36810:19;36858:5;36842:13;;36832:7;:23;;;;:::i;:::-;:31;;;;:::i;:::-;36810:53:::0;-1:-1:-1;36882:68:0::1;36915:10;36928:21;36810:53:::0;36928:7;:21:::1;:::i;:::-;36882:11;::::0;-1:-1:-1;;;;;36882:11:0::1;::::0;:68;:24:::1;:68::i;:::-;36994:10;::::0;36969:11:::1;::::0;:49:::1;::::0;-1:-1:-1;;;;;36969:11:0;;::::1;::::0;36994:10:::1;37006:11:::0;36969:24:::1;:49::i;:::-;36791:243;36769:360;;;37059:11;::::0;:54:::1;::::0;-1:-1:-1;;;;;37059:11:0::1;37092:10;37105:7:::0;37059:24:::1;:54::i;:::-;37199:11;::::0;:36:::1;::::0;-1:-1:-1;;;37199:36:0;;37229:4:::1;37199:36;::::0;::::1;1895:51:1::0;37143:22:0::1;::::0;-1:-1:-1;;;;;37199:11:0::1;::::0;:21:::1;::::0;1868:18:1;;37199:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;37168:67;::::0;:28;:67:::1;:::i;:::-;37143:92;;37290:14;37270:17;;:34;;;;:::i;:::-;37250:17;:54:::0;37333:11;;:28:::1;::::0;37347:14;;37333:28:::1;:::i;:::-;37319:42:::0;;37422:21:::1;::::0;37404:39:::1;::::0;:15:::1;:39;:::i;:::-;37376:25;::::0;::::1;:67:::0;-1:-1:-1;;36647:808:0::1;37471:11:::0;;37467:98:::1;;37499:11;::::0;:54:::1;::::0;-1:-1:-1;;;;;37499:11:0::1;37532:10;37545:7:::0;37499:24:::1;:54::i;:::-;37630:16;::::0;37610::::1;::::0;37596:11;;:30:::1;::::0;37610:16;37596:30:::1;:::i;:::-;37595:51;;;;:::i;:::-;37577:15;::::0;::::1;:69:::0;37679:1:::1;37657:19;::::0;::::1;:23:::0;37696:29:::1;::::0;733:25:1;;;37705:10:0::1;::::0;37696:29:::1;::::0;721:2:1;706:18;37696:29:0::1;;;;;;;36238:1495;;;4916:20:::0;4207:1;5458:21;;5275:212;4916:20;36181:1552;:::o;38474:142::-;15088:13;:11;:13::i;:::-;38554:11:::1;::::0;:54:::1;::::0;-1:-1:-1;;;;;38554:11:0::1;38587:10;38600:7:::0;38554:24:::1;:54::i;38626:239::-:0;15088:13;:11;:13::i;:::-;38729:65:::1;::::0;-1:-1:-1;;;38729:65:0;;38768:10:::1;38729:65;::::0;::::1;7135:51:1::0;7202:18;;;7195:34;;;-1:-1:-1;;;;;38729:30:0;::::1;::::0;::::1;::::0;7108:18:1;;38729:65:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;38810:47:0::1;::::0;;-1:-1:-1;;;;;7153:32:1;;7135:51;;7217:2;7202:18;;7195:34;;;38810:47:0::1;::::0;7108:18:1;38810:47:0::1;;;;;;;;38626:239:::0;;:::o;38873:286::-;15088:13;:11;:13::i;:::-;39014:4:::1;-1:-1:-1::0;;;;;38988:31:0;::::1;::::0;38980:40:::1;;;::::0;::::1;;39051:21;-1:-1:-1::0;;;;;39083:32:0;::::1;:68;39147:3;39116:28;39128:16:::0;39051:21;39116:28:::1;:::i;:::-;:34;;;;:::i;:::-;39083:68;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;38969:190;38873:286:::0;;:::o;31271:1604::-;31705:13;;-1:-1:-1;;;31705:13:0;;;;31704:14;31696:46;;;;-1:-1:-1;;;31696:46:0;;7692:2:1;31696:46:0;;;7674:21:1;7731:2;7711:18;;;7704:30;-1:-1:-1;;;7750:18:1;;;7743:49;7809:18;;31696:46:0;7490:343:1;31696:46:0;31775:18;;-1:-1:-1;;;;;31775:18:0;31761:10;:32;31753:56;;;;-1:-1:-1;;;31753:56:0;;8040:2:1;31753:56:0;;;8022:21:1;8079:2;8059:18;;;8052:30;-1:-1:-1;;;8098:18:1;;;8091:41;8149:18;;31753:56:0;7838:335:1;31753:56:0;31845:5;31828:13;:22;;31820:60;;;;-1:-1:-1;;;31820:60:0;;;;;;;:::i;:::-;31917:5;31899:14;:23;;31891:61;;;;-1:-1:-1;;;31891:61:0;;;;;;;:::i;:::-;31963:13;:20;;-1:-1:-1;;;;31963:20:0;-1:-1:-1;;;31963:20:0;;;31996:11;:26;;-1:-1:-1;;;;;31996:26:0;;;-1:-1:-1;;;;;;31996:26:0;;;;;;;32033:11;:26;;;;;;;;;;;;;;;32070:14;:32;;;32113:10;:24;;;-1:-1:-1;32148:30:0;;;32189:12;:28;;;32228:13;:30;;;32269:21;:46;;;31963:13;32326:46;;;32383:18;:40;;;32438:21;;32434:124;;32476:12;:19;;-1:-1:-1;;;;32476:19:0;-1:-1:-1;;;32476:19:0;;;32510:16;:36;;;32434:124;32570:27;32607:12;-1:-1:-1;;;;;32600:29:0;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32570:61;;;;32672:2;32650:19;:24;32642:59;;;;-1:-1:-1;;;32642:59:0;;9012:2:1;32642:59:0;;;8994:21:1;9051:2;9031:18;;;9024:30;-1:-1:-1;;;9070:18:1;;;9063:52;9132:18;;32642:59:0;8810:346:1;32642:59:0;32746:22;32749:19;32746:2;:22;:::i;:::-;32741:28;;:2;:28;:::i;:::-;32714:16;:56;-1:-1:-1;;32855:10:0;;32837:15;:28;-1:-1:-1;;;;;;;;;;31271:1604:0:o;40335:395::-;15088:13;:11;:13::i;:::-;40474:5:::1;40454:16;:25;;40446:63;;;;-1:-1:-1::0;;;40446:63:0::1;;;;;;;:::i;:::-;40549:5;40528:17;:26;;40520:64;;;;-1:-1:-1::0;;;40520:64:0::1;;;;;;;:::i;:::-;40595:12;:31:::0;;;40637:13:::1;:33:::0;;;40686:36:::1;::::0;;10703:25:1;;;10759:2;10744:18;;10737:34;;;40686:36:0::1;::::0;10676:18:1;40686:36:0::1;10529:248:1::0;15877:103:0;15088:13;:11;:13::i;:::-;15942:30:::1;15969:1;15942:18;:30::i;:::-;15877:103::o:0;39238:88::-;15088:13;:11;:13::i;:::-;39306:12:::1;39290:13;:28:::0;39238:88::o;39537:475::-;15088:13;:11;:13::i;:::-;39654:12:::1;::::0;-1:-1:-1;;;39654:12:0;::::1;;;39646:36;;;::::0;-1:-1:-1;;;39646:36:0;;10984:2:1;39646:36:0::1;::::0;::::1;10966:21:1::0;11023:2;11003:18;;;10996:30;-1:-1:-1;;;11042:18:1;;;11035:41;11093:18;;39646:36:0::1;10782:335:1::0;39646:36:0::1;39697:13;39693:266;;;39755:16;;39735:17;:36;39727:73;;;::::0;-1:-1:-1;;;39727:73:0;;11324:2:1;39727:73:0::1;::::0;::::1;11306:21:1::0;11363:2;11343:18;;;11336:30;11402:26;11382:18;;;11375:54;11446:18;;39727:73:0::1;11122:348:1::0;39727:73:0::1;39815:16;:36:::0;;;39693:266:::1;;;39884:12;:28:::0;;-1:-1:-1;;;;39884:28:0::1;-1:-1:-1::0;;;39884:28:0;::::1;;;;::::0;;-1:-1:-1;39927:16:0::1;:20:::0;39693:266:::1;39974:30;39987:16;;39974:30;;;;733:25:1::0;;721:2;706:18;;587:177;33613:2434:0;4872:21;:19;:21::i;:::-;33713:10:::1;33680:21;33704:20:::0;;;:8:::1;:20;::::0;;;;;33756:26:::1;::::0;:14:::1;:26::i;:::-;33849:12;::::0;33735:47;;-1:-1:-1;33817:7:0;;-1:-1:-1;;;33849:12:0;::::1;;;33845:122;;;33911:16;::::0;33896:11;;33886:21:::1;::::0;:7;:21:::1;:::i;:::-;:41;;33878:77;;;::::0;-1:-1:-1;;;33878:77:0;;11677:2:1;33878:77:0::1;::::0;::::1;11659:21:1::0;11716:2;11696:18;;;11689:30;11755:25;11735:18;;;11728:53;11798:18;;33878:77:0::1;11475:347:1::0;33878:77:0::1;34014:10;33979:23;34005:20:::0;;;:8:::1;:20;::::0;;;;:27;34047:13:::1;:11;:13::i;:::-;34075:11:::0;;:15;34071:562:::1;;34107:15;34179:4;:15;;;34160:16;;34140;;34126:4;:11;;;:30;;;;:::i;:::-;34125:51;;;;:::i;:::-;:69;;;;:::i;:::-;34107:87;;34224:1;34214:7;:11;:38;;;;34251:1;34229:4;:19;;;:23;34214:38;34210:421;;;34293:1;34279:10;:15;34275:345;;34341:19;::::0;::::1;::::0;34331:29:::1;::::0;:7;:29:::1;:::i;:::-;34385:11;::::0;34321:39;;-1:-1:-1;34385:54:0::1;::::0;-1:-1:-1;;;;;34385:11:0::1;34418:10;34321:39:::0;34385:24:::1;:54::i;:::-;34486:1;34464:19;::::0;::::1;:23:::0;34275:345:::1;;;34513:11:::0;;34509:111:::1;;34593:7;34571:4;:19;;;:29;;;;:::i;:::-;34549:19;::::0;::::1;:51:::0;34509:111:::1;34092:541;34071:562;34649:11:::0;;34645:1263:::1;;34685:11;::::0;:42:::1;::::0;-1:-1:-1;;;34685:42:0;;34715:10:::1;34685:42;::::0;::::1;1895:51:1::0;34731:7:0;;-1:-1:-1;;;;;34685:11:0::1;::::0;:21:::1;::::0;1868:18:1;;34685:42:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;34677:62;;;::::0;::::1;;34794:11;::::0;:36:::1;::::0;-1:-1:-1;;;34794:36:0;;34824:4:::1;34794:36;::::0;::::1;1895:51:1::0;34754:37:0::1;::::0;-1:-1:-1;;;;;34794:11:0::1;::::0;:21:::1;::::0;1868:18:1;;34794:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34848:12;::::0;34754:76;;-1:-1:-1;34848:16:0;34845:417:::1;;34885:18;34930:5;34916:12;;34906:7;:22;;;;:::i;:::-;:29;;;;:::i;:::-;34885:50:::0;-1:-1:-1;34954:86:0::1;34991:10;35012:4;35019:20;34885:50:::0;35019:7;:20:::1;:::i;:::-;34954:11;::::0;-1:-1:-1;;;;;34954:11:0::1;::::0;:86;;:28:::1;:86::i;:::-;35109:10;::::0;35059:11:::1;::::0;:73:::1;::::0;-1:-1:-1;;;;;35059:11:0;;::::1;::::0;35096:10:::1;::::0;35109::::1;35121::::0;35059:28:::1;:73::i;:::-;34866:282;34845:417;;;35173:11;::::0;:73:::1;::::0;-1:-1:-1;;;;;35173:11:0::1;35210:10;35231:4;35238:7:::0;35173:28:::1;:73::i;:::-;35302:11;::::0;:36:::1;::::0;-1:-1:-1;;;35302:36:0;;35332:4:::1;35302:36;::::0;::::1;1895:51:1::0;35276:23:0::1;::::0;35341:29;;-1:-1:-1;;;;;35302:11:0;;::::1;::::0;:21:::1;::::0;1868:18:1;;35302:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:68;;;;:::i;:::-;35399:11:::0;;35276:94;;-1:-1:-1;35399:29:0::1;::::0;35276:94;;35399:29:::1;:::i;:::-;35385:43:::0;;35509:17:::1;::::0;35459:15;;-1:-1:-1;35459:15:0;;35509:35:::1;::::0;35459:15;;35509:35:::1;:::i;:::-;35489:17;:55:::0;35611:21:::1;::::0;35559:31:::1;::::0;35593:39:::1;::::0;:15:::1;:39;:::i;:::-;35559:73;;35677:21;;35651:23;:47;35647:135;;;-1:-1:-1::0;35745:21:0::1;::::0;35647:135:::1;35796:25;::::0;::::1;:51:::0;-1:-1:-1;;35881:15:0::1;35862:16;::::0;::::1;:34:::0;34645:1263:::1;35973:16;::::0;35953::::1;::::0;35939:11;;:30:::1;::::0;35953:16;35939:30:::1;:::i;:::-;35938:51;;;;:::i;:::-;35920:15;::::0;::::1;:69:::0;36005:34:::1;::::0;733:25:1;;;36013:10:0::1;::::0;36005:34:::1;::::0;721:2:1;706:18;36005:34:0::1;;;;;;;33669:2378;;;;4916:20:::0;4207:1;5458:21;;5275:212;40738:248;40829:10;;-1:-1:-1;;;;;40829:10:0;40815;:24;40807:74;;;;-1:-1:-1;;;40807:74:0;;12029:2:1;40807:74:0;;;12011:21:1;12068:2;12048:18;;;12041:30;12107:34;12087:18;;;12080:62;-1:-1:-1;;;12158:18:1;;;12151:35;12203:19;;40807:74:0;11827:401:1;40807:74:0;40915:10;;40897:44;;;-1:-1:-1;;;;;40915:10:0;;;12445:34:1;;12515:15;;;12510:2;12495:18;;12488:43;40897:44:0;;12380:18:1;40897:44:0;;;;;;;40952:10;:26;;-1:-1:-1;;;;;;40952:26:0;-1:-1:-1;;;;;40952:26:0;;;;;;;;;;40738:248::o;41214:855::-;15088:13;:11;:13::i;:::-;41493:14:::1;41479:11;:28;41471:87;;;::::0;-1:-1:-1;;;41471:87:0;;12744:2:1;41471:87:0::1;::::0;::::1;12726:21:1::0;12783:2;12763:18;;;12756:30;12822:34;12802:18;;;12795:62;-1:-1:-1;;;12873:18:1;;;12866:44;12927:19;;41471:87:0::1;12542:410:1::0;41471:87:0::1;41592:11;41577:12;:26;41569:87;;;::::0;-1:-1:-1;;;41569:87:0;;13159:2:1;41569:87:0::1;::::0;::::1;13141:21:1::0;13198:2;13178:18;;;13171:30;13237:34;13217:18;;;13210:62;-1:-1:-1;;;13288:18:1;;;13281:46;13344:19;;41569:87:0::1;12957:412:1::0;41569:87:0::1;41669:10;:24:::0;;;41704:13:::1;:30:::0;;;41745:21:::1;:46:::0;;;41802:21:::1;:46:::0;;;41859:18:::1;:40:::0;;;41966:15:::1;:28:::0;;;42012:49:::1;::::0;;10703:25:1;;;10759:2;10744:18;;10737:34;;;42012:49:0::1;::::0;10676:18:1;42012:49:0::1;;;;;;;41214:855:::0;;;;;:::o;37859:512::-;4872:21;:19;:21::i;:::-;37954:10:::1;37921:21;37945:20:::0;;;:8:::1;:20;::::0;;;;38003:11;;38025:15;;;-1:-1:-1;38051:15:0;::::1;:19:::0;;;38081::::1;::::0;::::1;:23:::0;;;;37945:20;38121;;38117:187:::1;;38198:16;38178:17;;:36;;;;:::i;:::-;38158:17;:56:::0;38229:11:::1;::::0;:63:::1;::::0;-1:-1:-1;;;;;38229:11:0::1;38262:10;38275:16:::0;38229:24:::1;:63::i;:::-;38351:11:::0;;38321:42:::1;::::0;733:25:1;;;38339:10:0::1;::::0;38321:42:::1;::::0;721:2:1;706:18;38321:42:0::1;;;;;;;37910:461;;4916:20:::0;4207:1;5458:21;;5275:212;16135:220;15088:13;:11;:13::i;:::-;-1:-1:-1;;;;;16220:22:0;::::1;16216:93;;16266:31;::::0;-1:-1:-1;;;16266:31:0;;16294:1:::1;16266:31;::::0;::::1;1895:51:1::0;1868:18;;16266:31:0::1;1749:203:1::0;16216:93:0::1;16319:28;16338:8;16319:18;:28::i;42227:689::-:0;-1:-1:-1;;;;;42332:15:0;;42288:7;42332:15;;;:8;:15;;;;;42377;;42362:12;:30;:56;;;;-1:-1:-1;42396:17:0;;:22;;42362:56;42358:551;;;42435:18;42456:45;42471:15;;42488:12;42456:14;:45::i;:::-;42435:66;;42516:17;42549:14;;42536:10;:27;;;;:::i;:::-;42516:47;;42578:29;42678:17;;42659:16;;42647:9;:28;;;;:::i;:::-;:48;;;;:::i;:::-;42627:16;;:69;;;;:::i;:::-;42578:118;;42775:4;:15;;;42756:16;;42732:21;42718:4;:11;;;:35;;;;:::i;:::-;:54;;;;:::i;:::-;:72;;;;:::i;:::-;42711:79;42227:689;-1:-1:-1;;;;;;42227:689:0:o;42358:551::-;42882:15;;;;42863:16;;42844;;42830:11;;:30;;42844:16;42830:30;:::i;:::-;:49;;;;:::i;:::-;:67;;;;:::i;:::-;42823:74;42227:689;-1:-1:-1;;;42227:689:0:o;43985:108::-;44032:7;44075:10;;44059:13;;:26;;;;:::i;:::-;44052:33;;43985:108;:::o;15367:166::-;15248:7;15275:6;-1:-1:-1;;;;;15275:6:0;2332:10;15427:23;15423:103;;15474:40;;-1:-1:-1;;;15474:40:0;;2332:10;15474:40;;;1895:51:1;1868:18;;15474:40:0;1749:203:1;4952:315:0;4250:1;5081:7;;:18;5077:88;;5123:30;;-1:-1:-1;;;5123:30:0;;;;;;;;;;;5077:88;4250:1;5242:7;:17;4952:315::o;43001:515::-;43064:15;;43048:12;:31;43044:70;;43001:515::o;43044:70::-;43130:17;;43151:1;43130:22;43126:106;;43187:12;43169:15;:30;43001:515::o;43126:106::-;43244:18;43265:45;43280:15;;43297:12;43265:14;:45::i;:::-;43244:66;;43321:17;43354:14;;43341:10;:27;;;;:::i;:::-;43321:47;;43449:17;;43430:16;;43418:9;:28;;;;:::i;:::-;:48;;;;:::i;:::-;43398:16;;:69;;;;:::i;:::-;43379:16;:88;-1:-1:-1;;43496:12:0;43478:15;:30;43001:515::o;25052:211::-;25196:58;;-1:-1:-1;;;;;7153:32:1;;25196:58:0;;;7135:51:1;7202:18;;;7195:34;;;25169:86:0;;25189:5;;-1:-1:-1;;;25219:23:0;7108:18:1;;25196:58:0;;;;-1:-1:-1;;25196:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;25196:58:0;-1:-1:-1;;;;;;25196:58:0;;;;;;;;;;25169:19;:86::i;:::-;25052:211;;;:::o;16515:191::-;16589:16;16608:6;;-1:-1:-1;;;;;16625:17:0;;;-1:-1:-1;;;;;;16625:17:0;;;;;;16658:40;;16608:6;;;;;;;16658:40;;16589:16;16658:40;16578:128;16515:191;:::o;25271:248::-;25442:68;;-1:-1:-1;;;;;13632:15:1;;;25442:68:0;;;13614:34:1;13684:15;;13664:18;;;13657:43;13716:18;;;13709:34;;;25415:96:0;;25435:5;;-1:-1:-1;;;25465:27:0;13549:18:1;;25442:68:0;13374:375:1;43674:303:0;43749:7;43780:13;;43773:3;:20;43769:201;;43817:11;43823:5;43817:3;:11;:::i;:::-;43810:18;;;;43769:201;43859:13;;43850:5;:22;43846:124;;-1:-1:-1;43896:1:0;43889:8;;43846:124;43953:5;43937:13;;:21;;;;:::i;43846:124::-;43674:303;;;;:::o;27625:716::-;28049:23;28075:69;28103:4;28075:69;;;;;;;;;;;;;;;;;28083:5;-1:-1:-1;;;;;28075:27:0;;;:69;;;;;:::i;:::-;28159:17;;28049:95;;-1:-1:-1;28159:21:0;28155:179;;28256:10;28245:30;;;;;;;;;;;;:::i;:::-;28237:85;;;;-1:-1:-1;;;28237:85:0;;13956:2:1;28237:85:0;;;13938:21:1;13995:2;13975:18;;;13968:30;14034:34;14014:18;;;14007:62;-1:-1:-1;;;14085:18:1;;;14078:40;14135:19;;28237:85:0;13754:406:1;20468:229:0;20605:12;20637:52;20659:6;20667:4;20673:1;20676:12;20605;-1:-1:-1;;;;;18018:19:0;;;21875:60;;;;-1:-1:-1;;;21875:60:0;;14774:2:1;21875:60:0;;;14756:21:1;14813:2;14793:18;;;14786:30;14852:31;14832:18;;;14825:59;14901:18;;21875:60:0;14572:353:1;21875:60:0;21949:12;21963:23;21990:6;-1:-1:-1;;;;;21990:11:0;22009:5;22016:4;21990:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21948:73;;;;22039:51;22056:7;22065:10;22077:12;22039:16;:51::i;:::-;22032:58;21588:510;-1:-1:-1;;;;;;;21588:510:0:o;24274:712::-;24424:12;24453:7;24449:530;;;-1:-1:-1;24484:10:0;24477:17;;24449:530;24598:17;;:21;24594:374;;24796:10;24790:17;24857:15;24844:10;24840:2;24836:19;24829:44;24594:374;24939:12;24932:20;;-1:-1:-1;;;24932: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:416;9250:1;9287:5;9250:1;9301:270;9322:7;9312:8;9309:21;9301:270;;;9381:4;9377:1;9373:6;9369:17;9363:4;9360:27;9357:53;;;9390:18;;:::i;:::-;9440:7;9430:8;9426:22;9423:55;;;9460:16;;;;9423:55;9539:22;;;;9499:15;;;;9301:270;;;9305:3;9161:416;;;;;:::o;9582:806::-;9631:5;9661:8;9651:80;;-1:-1:-1;9702:1:1;9716:5;;9651:80;9750:4;9740:76;;-1:-1:-1;9787:1:1;9801:5;;9740:76;9832:4;9850:1;9845:59;;;;9918:1;9913:130;;;;9825:218;;9845:59;9875:1;9866:10;;9889:5;;;9913:130;9950:3;9940:8;9937:17;9934:43;;;9957:18;;:::i;:::-;-1:-1:-1;;10013:1:1;9999:16;;10028:5;;9825:218;;10127:2;10117:8;10114:16;10108:3;10102:4;10099:13;10095:36;10089:2;10079:8;10076:16;10071:2;10065:4;10062:12;10058:35;10055:77;10052:159;;;-1:-1:-1;10164:19:1;;;10196:5;;10052:159;10243:34;10268:8;10262:4;10243:34;:::i;:::-;10313:6;10309:1;10305:6;10301:19;10292:7;10289:32;10286:58;;;10324:18;;:::i;:::-;10362:20;;9582:806;-1:-1:-1;;;9582:806:1:o;10393:131::-;10453:5;10482:36;10509:8;10503:4;10482:36;:::i;14930:250::-;15015:1;15025:113;15039:6;15036:1;15033:13;15025:113;;;15115:11;;;15109:18;15096:11;;;15089:39;15061:2;15054:10;15025:113;;;-1:-1:-1;;15172:1:1;15154:16;;15147:27;14930:250::o;15185:287::-;15314:3;15352:6;15346:13;15368:66;15427:6;15422:3;15415:4;15407:6;15403:17;15368:66;:::i;:::-;15450:16;;;;;15185:287;-1:-1:-1;;15185:287:1:o;15477:396::-;15626:2;15615:9;15608:21;15589:4;15658:6;15652:13;15701:6;15696:2;15685:9;15681:18;15674:34;15717:79;15789:6;15784:2;15773:9;15769:18;15764:2;15756:6;15752:15;15717:79;:::i;:::-;15857:2;15836:15;-1:-1:-1;;15832:29:1;15817:45;;;;15864:2;15813:54;;15477:396;-1:-1:-1;;15477:396:1:o
Swarm Source
ipfs://cd57914377746e1845dc7f0fdc5dc8122f65dfcfb627cd9acbf761d603936b46
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.