More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 51 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 21265947 | 9 days ago | IN | 0 ETH | 0.0023802 | ||||
Release | 21211929 | 16 days ago | IN | 0 ETH | 0.00080425 | ||||
Release | 21137904 | 27 days ago | IN | 0 ETH | 0.00183494 | ||||
Release | 21122611 | 29 days ago | IN | 0 ETH | 0.00133548 | ||||
Release | 21072590 | 36 days ago | IN | 0 ETH | 0.00193417 | ||||
Release | 21039192 | 40 days ago | IN | 0 ETH | 0.00036218 | ||||
Release | 21010749 | 44 days ago | IN | 0 ETH | 0.00067464 | ||||
Claim Referral C... | 20993691 | 47 days ago | IN | 0 ETH | 0.00264795 | ||||
Claim Referral C... | 20972811 | 50 days ago | IN | 0 ETH | 0.00189661 | ||||
Update Referral ... | 20971996 | 50 days ago | IN | 0 ETH | 0.00159347 | ||||
Release | 20971664 | 50 days ago | IN | 0 ETH | 0.00399402 | ||||
Release | 20971411 | 50 days ago | IN | 0 ETH | 0.00264238 | ||||
Release | 20958101 | 52 days ago | IN | 0 ETH | 0.00114064 | ||||
Release | 20929864 | 56 days ago | IN | 0 ETH | 0.00261094 | ||||
Release | 20929858 | 56 days ago | IN | 0 ETH | 0.00447008 | ||||
Release | 20916833 | 58 days ago | IN | 0 ETH | 0.00136349 | ||||
Release | 20909091 | 59 days ago | IN | 0 ETH | 0.00080821 | ||||
Claim Referral C... | 20908559 | 59 days ago | IN | 0 ETH | 0.00059536 | ||||
Release | 20908396 | 59 days ago | IN | 0 ETH | 0.00098586 | ||||
Release | 20907656 | 59 days ago | IN | 0 ETH | 0.00214441 | ||||
Set Presale Toke... | 20907653 | 59 days ago | IN | 0 ETH | 0.00090207 | ||||
Set TGE Time | 20907571 | 59 days ago | IN | 0 ETH | 0.00130067 | ||||
Add Beneficiarie... | 20907430 | 59 days ago | IN | 0 ETH | 0.09049308 | ||||
Add Beneficiarie... | 20907411 | 59 days ago | IN | 0 ETH | 0.04334932 | ||||
Update Referral ... | 20907283 | 59 days ago | IN | 0 ETH | 0.00250337 |
Latest 17 internal transactions
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20887150 | 62 days ago | 0.64 ETH | ||||
20882384 | 62 days ago | 0.095 ETH | ||||
20880508 | 63 days ago | 0.066 ETH | ||||
20865143 | 65 days ago | 0.06 ETH | ||||
20850192 | 67 days ago | 0.093 ETH | ||||
20803240 | 73 days ago | 0.01 ETH | ||||
20773469 | 78 days ago | 0.055 ETH | ||||
20725064 | 84 days ago | 0.043 ETH | ||||
20724155 | 84 days ago | 0.045 ETH | ||||
20724072 | 84 days ago | 0.01 ETH | ||||
20722079 | 85 days ago | 0.01 ETH | ||||
20721908 | 85 days ago | 0.68 ETH | ||||
20721860 | 85 days ago | 0.04 ETH | ||||
20721812 | 85 days ago | 0.131 ETH | ||||
20721681 | 85 days ago | 0.015 ETH | ||||
20720815 | 85 days ago | 0.01 ETH | ||||
20713515 | 86 days ago | 0.0005 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
MineAIETH
Compiler Version
v0.8.24+commit.e11b9ed9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-07 */ // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) 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; } } // File: @openzeppelin/contracts/utils/Pausable.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Pausable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { bool private _paused; /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); /** * @dev The operation failed because the contract is paused. */ error EnforcedPause(); /** * @dev The operation failed because the contract is not paused. */ error ExpectedPause(); /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { if (paused()) { revert EnforcedPause(); } } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { if (!paused()) { revert ExpectedPause(); } } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/Ownable.sol // 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); } } // File: @chainlink/contracts/src/v0.8/shared/interfaces/AggregatorV3Interface.sol pragma solidity ^0.8.0; // solhint-disable-next-line interface-starts-with-i interface AggregatorV3Interface { function decimals() external view returns (uint8); function description() external view returns (string memory); function version() external view returns (uint256); function getRoundData( uint80 _roundId ) external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); function latestRoundData() external view returns ( uint80 roundId, int256 answer, uint256 startedAt, uint256 updatedAt, uint80 answeredInRound ); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval( address indexed owner, address indexed spender, uint256 value ); /** * @dev Returns the 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); } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/interfaces/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC20Metadata.sol) pragma solidity ^0.8.20; // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @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://consensys.net/diligence/blog/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.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @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 or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * 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. */ function functionCall( address target, bytes memory data ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @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`. */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall( address target, bytes memory data ) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall( address target, bytes memory data ) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult( bool success, bytes memory returndata ) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // 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 /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance( address spender, uint256 currentAllowance, uint256 requestedDecrease ); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeCall(token.transferFrom, (from, to, value)) ); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance( IERC20 token, address spender, uint256 requestedDecrease ) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance( spender, currentAllowance, requestedDecrease ); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove( IERC20 token, address spender, uint256 value ) internal { bytes memory approvalCall = abi.encodeCall( token.approve, (spender, value) ); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn( token, abi.encodeCall(token.approve, (spender, 0)) ); _callOptionalReturn(token, approvalCall); } } /** * @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); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @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). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool( IERC20 token, bytes memory data ) private returns (bool) { // 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 cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: @openzeppelin/contracts/utils/math/Math.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/math/Math.sol) pragma solidity ^0.8.20; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { /** * @dev Muldiv operation overflow. */ error MathOverflowedMulDiv(); enum Rounding { Floor, // Toward negative infinity Ceil, // Toward positive infinity Trunc, // Toward zero Expand // Away from zero } /** * @dev Returns the addition of two unsigned integers, with an overflow flag. */ function tryAdd( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } } /** * @dev Returns the subtraction of two unsigned integers, with an overflow flag. */ function trySub( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b > a) return (false, 0); return (true, a - b); } } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. */ function tryMul( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. */ function tryDiv( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a / b); } } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. */ function tryMod( uint256 a, uint256 b ) internal pure returns (bool, uint256) { unchecked { if (b == 0) return (false, 0); return (true, a % b); } } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds towards infinity instead * of rounding towards zero. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { if (b == 0) { // Guarantee the same behavior as in a regular Solidity division. return a / b; } // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or * denominator == 0. * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) with further edits by * Uniswap Labs also under MIT license. */ function mulDiv( uint256 x, uint256 y, uint256 denominator ) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0 = x * y; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. if (denominator <= prod1) { revert MathOverflowedMulDiv(); } /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. // Always >= 1. See https://cs.stackexchange.com/q/138556/92363. uint256 twos = denominator & (0 - denominator); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also // works in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv( uint256 x, uint256 y, uint256 denominator, Rounding rounding ) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (unsignedRoundsUp(rounding) && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded * towards zero. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt( uint256 a, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (unsignedRoundsUp(rounding) && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (unsignedRoundsUp(rounding) && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10 of a positive value rounded towards zero. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (unsignedRoundsUp(rounding) && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256 of a positive value rounded towards zero. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256( uint256 value, Rounding rounding ) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + ( unsignedRoundsUp(rounding) && 1 << (result << 3) < value ? 1 : 0 ); } } /** * @dev Returns whether a provided rounding mode is considered rounding up for unsigned integers. */ function unsignedRoundsUp(Rounding rounding) internal pure returns (bool) { return uint8(rounding) % 2 == 1; } } // File: contracts/MineAIETH.sol //SPDX-License-Identifier: MIT pragma solidity ^0.8.0; struct UserInfo { uint256 stackedAmount; uint256 referralCommissionClaimed; uint256 referralCount; uint256 referralCommission; bool enable; } struct VestingSchedule { uint256 tgePercentage; uint256 releaseInterval; // in seconds uint256 releasePercentage; bool initialized; } struct Beneficiary { uint256 amount; uint256 released; uint256 vestingType; uint256 startTime; bool tgeClaimed; } contract MineAIETH is Pausable, Ownable { using SafeERC20 for IERC20Metadata; uint256 private _priceInUSD; address[] private _supportedTokensList; address private _treasaryWallet; uint256 private _totalTokensSold; uint256 private _totalETHCollected; uint256 private _totalUSDCollected; uint256 private _totalReferral; uint256 private _totalBonus; uint256 private _minContributionInUSD; bool private _isTransacting; address private _priceOracleAddressNative; address private _presaleTokenContract; mapping(address => bool) private _mappingSupportedTokens; mapping(address => UserInfo) public _mappingUserInfo; uint256 public referralCount; uint256 public userCount; mapping(uint256 => address) public _mappingReferralIndex; mapping(uint256 => address) public _mappingUserIndex; uint256 vestingScheduleCount; uint256 currentRound; uint public referralPercentage; mapping(uint256 => VestingSchedule) public vestingSchedules; mapping(address => Beneficiary[]) public beneficiaries; event TokensReleased(address beneficiary, uint256 amount); event SupportedTokenAdded(address tokenContract); event SupportedTokenRemoved(address tokenContract); event ReferralPercentageUpdated(uint256 referralPercentage); event VestingScheduleAdded( uint256 vestingScheduleCount, uint256 tgePercentage, uint256 releaseInterval, uint256 releasePercentage ); event TGETimeSet(uint256 tgeTime); event BeneficiaryAdded( address beneficiary, uint256 amount, uint256 vestingType, uint256 startTime ); event ReferralCommissionEarned( address referralAddress, uint256 referralCommission ); event ReferralCommissionClaimed( address referralAddress, uint256 referralCommissionClaimed ); uint256 tgeTime; struct StakeInfo { uint256 amount; // Staked amount by the user uint256 timestamp; // Timestamp of when the user staked } mapping(address => StakeInfo) public stakes; // Mapping to store each user's stake info address[] public stakers; // Array to keep track of all stakers constructor( uint256 priceInUSD_, address treasaryWallet_, address nativePriceOracle_ ) Ownable(msg.sender) { _priceInUSD = priceInUSD_; _treasaryWallet = treasaryWallet_; _minContributionInUSD = 1 * 1 ether; _priceOracleAddressNative = nativePriceOracle_; _addVestingSchedule(10, 1 days, 1); _addVestingSchedule(20, 1 days, 2); currentRound = 1; referralPercentage = 5; } receive() external payable {} event BuyWithNative( address userAddress, uint256 valueInWei, uint256 tokenSold, uint256 priceInUSD, uint256 bonus ); event BuyWithToken( address userAddress, address tokenContract, uint256 valueInWei, uint256 tokenSold, uint256 priceInUSD, uint256 bonus ); modifier noReetency() { require(!_isTransacting, "Transaction in progress"); _isTransacting = true; _; _isTransacting = false; } function getPresaleAnalytics() external view returns ( uint256 totalTokensSold, uint256 totalETHCollected, uint256 totalUSDValue, uint256 totalReferralAmount, uint256 totalBonus ) { totalTokensSold = _totalTokensSold; totalETHCollected = _totalETHCollected; totalUSDValue = _totalUSDCollected; totalReferralAmount = _totalReferral; totalBonus = _totalBonus; } function getUserInfo(address user) external view returns (UserInfo memory) { return _mappingUserInfo[user]; } function getPresaleTokenContract() external view returns (address) { return _presaleTokenContract; } function setPresaleTokenContract( address _contractAddress ) external onlyOwner { _presaleTokenContract = _contractAddress; } function getPriceOracleNative() external view returns (address) { return _priceOracleAddressNative; } function setPriceOracleNative(address _contractAddress) external onlyOwner { _priceOracleAddressNative = _contractAddress; } function getMinContributionUSD() external view returns (uint256) { return _minContributionInUSD; } function setMinContributionUSD(uint256 _valueInWei) external onlyOwner { _minContributionInUSD = _valueInWei; } function getPresalePricePerUSD() external view returns (uint256) { return _priceInUSD; } function setPricePerUSD(uint256 priceInUSD_) external onlyOwner { _priceInUSD = priceInUSD_; } function getTreasaryWallet() external view returns (address) { return _treasaryWallet; } function setTreasaryWallet(address treasaryWallet_) external onlyOwner { _treasaryWallet = treasaryWallet_; } function getSupportedTokensList() external view returns (address[] memory contractAddress) { contractAddress = _supportedTokensList; } function addSupportedToken(address tokenContract_) external onlyOwner { bool isTokenSupported = _mappingSupportedTokens[tokenContract_]; require( !isTokenSupported, "Token already added in supported tokens list" ); _mappingSupportedTokens[tokenContract_] = true; _supportedTokensList.push(tokenContract_); emit SupportedTokenAdded(tokenContract_); } function removeSupportedToken(address tokenContract_) external onlyOwner { bool isTokenSupported = _mappingSupportedTokens[tokenContract_]; require( isTokenSupported, "Token already removed or not added in supported tokens list" ); _mappingSupportedTokens[tokenContract_] = false; address[] memory supportedTokensList = _supportedTokensList; for (uint256 i; i < supportedTokensList.length; ++i) { if (_supportedTokensList[i] == tokenContract_) { _supportedTokensList[i] = _supportedTokensList[ _supportedTokensList.length - 1 ]; _supportedTokensList.pop(); emit SupportedTokenRemoved(tokenContract_); break; } } } function _getPriceFromOracle( address oracleAddress_ ) private view returns (uint256 valueInUSD) { (, int256 answer, , , ) = AggregatorV3Interface(oracleAddress_) .latestRoundData(); valueInUSD = _toWeiFromDecimals( uint256(answer), AggregatorV3Interface(oracleAddress_).decimals() ); } function getETHPrice() external view returns (uint256) { return _getPriceFromOracle(_priceOracleAddressNative); } function getTokenByETH( uint256 _msgValue ) external view returns (uint256 valueInTokens) { uint256 msgValueUSD = (_getPriceFromOracle(_priceOracleAddressNative) * _msgValue) / 1 ether; valueInTokens = (msgValueUSD / _priceInUSD) * 1 ether; } function isReferralAddress(address _user) public pure returns (bool) { return _user != address(0); } // Function to determine bonus percentage based on value in wei function getBonusPercentage( uint256 valueInWei ) internal pure returns (uint256) { if (valueInWei >= 20_000 * 1e18) return 15; if (valueInWei >= 15_000 * 1e18) return 13; if (valueInWei >= 10_000 * 1e18) return 10; if (valueInWei >= 5_000 * 1e18) return 8; if (valueInWei >= 1_500 * 1e18) return 5; return 0; } function buyWithToken( address tokenContract_, uint256 valueInWei_, address referralAddress, bool isStack ) external noReetency whenNotPaused { require( _mappingSupportedTokens[tokenContract_], "Token is not supported" ); address msgSender = msg.sender; // Calculate once and use multiple times uint256 valueInUsd = valueInWei_; uint256 valueInTokens = (valueInUsd * 1 ether) / _priceInUSD; uint256 bonusPercentage = getBonusPercentage(valueInUsd); uint256 bonusTokens = (valueInTokens * bonusPercentage) / 100; uint256 totalTokens = bonusTokens + valueInTokens; uint256 referralAmount = 0; // Process referral only if applicable if (isReferralAddress(referralAddress)) { referralAmount = (valueInTokens * referralPercentage) / 100; UserInfo storage referralInfo = _mappingUserInfo[referralAddress]; referralInfo.referralCommission += referralAmount; referralInfo.referralCount += 1; // Update only if not already enabled if (!referralInfo.enable) { referralInfo.enable = true; _mappingReferralIndex[referralCount++] = referralAddress; } emit ReferralCommissionEarned( referralAddress, referralInfo.referralCommission ); } require( valueInUsd >= _minContributionInUSD, "Value less than min contribution" ); // Use the calculated amount for transfer uint256 tokensToTransfer = _weiToTokens(tokenContract_, valueInWei_); IERC20Metadata(tokenContract_).safeTransferFrom( msgSender, _treasaryWallet, tokensToTransfer ); UserInfo storage userInfo = _mappingUserInfo[msgSender]; userInfo.stackedAmount += totalTokens; // Update only if not already enabled if (!userInfo.enable) { userInfo.enable = true; _mappingUserIndex[userCount++] = msgSender; } // Batch update of totals _totalTokensSold += totalTokens; _totalUSDCollected += valueInWei_; _totalReferral += referralAmount; _totalBonus += bonusTokens; emit BuyWithToken( msgSender, tokenContract_, valueInWei_, valueInTokens, _priceInUSD, bonusTokens ); if (isStack) { stake(msgSender, totalTokens); } else { addBeneficiary(msgSender, totalTokens, currentRound); } } function buyWithNative( address referralAddress, bool isStack ) external payable noReetency whenNotPaused { address msgSender = msg.sender; uint256 msgValue = msg.value; uint256 msgValueUSD = (_getPriceFromOracle(_priceOracleAddressNative) * msgValue) / 1 ether; uint256 referralAmount = 0; uint256 valueInTokens = (msgValueUSD * 1 ether) / _priceInUSD; uint256 bonusPercentage = getBonusPercentage(msgValueUSD); uint256 bonusTokens = (valueInTokens * bonusPercentage) / 100; uint256 totalTokens = bonusTokens + valueInTokens; if (isReferralAddress(referralAddress)) { referralAmount = (valueInTokens * referralPercentage) / 100; UserInfo storage referralInfo = _mappingUserInfo[referralAddress]; referralInfo.referralCommission += referralAmount; referralInfo.referralCount += 1; if (!referralInfo.enable) { referralInfo.enable = true; _mappingReferralIndex[referralCount++] = referralAddress; } emit ReferralCommissionEarned( referralAddress, referralInfo.referralCommission ); } require( msgValueUSD >= _minContributionInUSD, "Value less then min contribution" ); payable(_treasaryWallet).transfer(msgValue); UserInfo storage userInfo = _mappingUserInfo[msgSender]; userInfo.stackedAmount += totalTokens; if (!userInfo.enable) { userInfo.enable = true; _mappingUserIndex[userCount++] = msgSender; } _totalTokensSold += totalTokens; _totalUSDCollected += msgValueUSD; _totalETHCollected += msgValue; _totalReferral += referralAmount; _totalBonus += bonusTokens; emit BuyWithNative( msgSender, msgValue, valueInTokens, _priceInUSD, bonusTokens ); if (isStack) { stake(msgSender, totalTokens); } else { addBeneficiary(msgSender, totalTokens, currentRound); } } function _toWeiFromDecimals( uint256 valueInTokens_, uint256 from_ ) private pure returns (uint256 valueInWei) { valueInWei = (valueInTokens_ * 1 ether) / 10 ** from_; } function _toWei( address tokenContract_, uint256 valueInTokens_ ) private view returns (uint256 valueInWei) { valueInWei = ((valueInTokens_ * 1 ether) / 10 ** IERC20Metadata(tokenContract_).decimals()); } function _weiToTokens( address tokenContract_, uint256 valueInWei_ ) private view returns (uint256 valueInToken) { valueInToken = (valueInWei_ * 10 ** IERC20Metadata(tokenContract_).decimals()) / 1 ether; } function withdrawTokens( address _tokenContract, uint256 _valueInWei ) external noReetency onlyOwner { IERC20Metadata(_tokenContract).safeTransfer(owner(), _valueInWei); } function withdrawETH() external onlyOwner noReetency { payable(owner()).transfer(address(this).balance); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function addBeneficiary( address _beneficiary, uint256 _amount, uint256 _vestingType ) internal { beneficiaries[_beneficiary].push( Beneficiary({ amount: _amount, released: 0, vestingType: _vestingType, startTime: block.timestamp, tgeClaimed: false }) ); emit BeneficiaryAdded( _beneficiary, _amount, _vestingType, block.timestamp ); } function release(uint256 _id) external { require(tgeTime != 0, "TGE has not started yet"); Beneficiary[] storage beneficiaryArray = beneficiaries[msg.sender]; require(_id < beneficiaryArray.length, "Invalid vesting schedule ID"); Beneficiary storage beneficiary = beneficiaryArray[_id]; VestingSchedule storage schedule = vestingSchedules[ beneficiary.vestingType ]; uint256 elapsedTime = block.timestamp - Math.max(tgeTime, beneficiary.startTime); uint256 releasable; if (!beneficiary.tgeClaimed && schedule.tgePercentage != 0) { // Claim TGE tokens releasable = (beneficiary.amount * schedule.tgePercentage) / 100; beneficiary.tgeClaimed = true; } else { // Calculate vested tokens require( elapsedTime >= schedule.releaseInterval, "Vesting period has not started" ); uint256 phases = elapsedTime / schedule.releaseInterval; uint256 totalReleasePercentage = schedule.tgePercentage + (phases * schedule.releasePercentage); totalReleasePercentage = Math.min(totalReleasePercentage, 100); uint256 totalReleasable = (beneficiary.amount * totalReleasePercentage) / 100; releasable = totalReleasable - beneficiary.released; } require(releasable > 0, "No releasable tokens"); beneficiary.released += releasable; _releaseTokens(msg.sender, releasable); } function _releaseTokens(address _beneficiary, uint256 _amount) internal { IERC20Metadata(_presaleTokenContract).safeTransfer( _beneficiary, _toWei(_presaleTokenContract, _amount) ); emit TokensReleased(_beneficiary, _amount); } function changeRound(uint256 vestingType) external onlyOwner { currentRound = vestingType; } function addBeneficiaries( address[] memory _beneficiaries, uint256[] memory _amounts, uint256 _vestingType ) external onlyOwner { for (uint256 i = 0; i < _beneficiaries.length; i++) { beneficiaries[_beneficiaries[i]].push( Beneficiary({ amount: _amounts[i], released: 0, vestingType: _vestingType, startTime: block.timestamp, tgeClaimed: false }) ); } } function _addVestingSchedule( uint256 tgePercentage, uint256 releaseInterval, uint256 releasePercentage ) internal returns (uint256) { vestingSchedules[vestingScheduleCount++] = VestingSchedule({ tgePercentage: tgePercentage, releaseInterval: releaseInterval, releasePercentage: releasePercentage, initialized: true }); emit VestingScheduleAdded( vestingScheduleCount, tgePercentage, releaseInterval, releasePercentage ); return vestingScheduleCount; } function addVestingSchedule( uint256 tgePercentage, uint256 releaseInterval, uint256 releasePercentage ) external onlyOwner returns (uint256) { return _addVestingSchedule( tgePercentage, releaseInterval, releasePercentage ); } function setTGETime() external onlyOwner { tgeTime = block.timestamp; emit TGETimeSet(tgeTime); } function setReferralPercentage( uint256 _referralPercentage ) external onlyOwner { referralPercentage = _referralPercentage; emit ReferralPercentageUpdated(_referralPercentage); } function claimReferralCommission() external { UserInfo storage info = _mappingUserInfo[msg.sender]; uint256 commissionAmount = _toWei( _presaleTokenContract, info.referralCommission ); // Ensure that the amount to transfer is greater than zero require(commissionAmount > 0, "No commission to claim"); // Transfer the commission to the sender IERC20Metadata(_presaleTokenContract).safeTransfer( msg.sender, commissionAmount ); // Update the claimed commission info.referralCommissionClaimed += info.referralCommission; // Reset the referral commission to zero after claiming info.referralCommission = 0; emit ReferralCommissionClaimed( msg.sender, info.referralCommissionClaimed ); } function updateReferralInfoBatch( address[] memory _referralAddresses, uint256[] memory _referralCounts, uint256[] memory _referralCommissions ) external onlyOwner { require( _referralAddresses.length == _referralCounts.length && _referralAddresses.length == _referralCommissions.length, "Input arrays must have the same length" ); for (uint256 i = 0; i < _referralAddresses.length; i++) { UserInfo storage referralInfo = _mappingUserInfo[ _referralAddresses[i] ]; referralInfo.referralCount = _referralCounts[i]; referralInfo.referralCommission = _referralCommissions[i]; referralInfo.enable = true; } } function getBuyInfo( address _user ) public view returns (Beneficiary[] memory) { return beneficiaries[_user]; } function stake(address user, uint256 tokenAmount) internal { if (stakes[user].amount == 0) { stakers.push(user); // Add new staker if they are staking for the first time } stakes[user].amount += tokenAmount; // Update the staked amount stakes[user].timestamp = block.timestamp; // Record the timestamp of the stake } // Function to get all stakers and their staked amounts function getAllStakers() external view returns (address[] memory, uint256[] memory) { uint256 stakerCount = stakers.length; uint256[] memory amounts = new uint256[](stakerCount); for (uint256 i = 0; i < stakerCount; i++) { amounts[i] = stakes[stakers[i]].amount; } return (stakers, amounts); } // Function to get the staking amount of a specific user function getStakeAmount(address user) external view returns (uint256) { return stakes[user].amount; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"uint256","name":"priceInUSD_","type":"uint256"},{"internalType":"address","name":"treasaryWallet_","type":"address"},{"internalType":"address","name":"nativePriceOracle_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vestingType","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"startTime","type":"uint256"}],"name":"BeneficiaryAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"valueInWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"BuyWithNative","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"},{"indexed":false,"internalType":"uint256","name":"valueInWei","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tokenSold","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"priceInUSD","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"bonus","type":"uint256"}],"name":"BuyWithToken","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":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"referralCommissionClaimed","type":"uint256"}],"name":"ReferralCommissionClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"referralAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"referralCommission","type":"uint256"}],"name":"ReferralCommissionEarned","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"referralPercentage","type":"uint256"}],"name":"ReferralPercentageUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"}],"name":"SupportedTokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenContract","type":"address"}],"name":"SupportedTokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"tgeTime","type":"uint256"}],"name":"TGETimeSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokensReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"vestingScheduleCount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"tgePercentage","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseInterval","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releasePercentage","type":"uint256"}],"name":"VestingScheduleAdded","type":"event"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_mappingReferralIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_mappingUserIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mappingUserInfo","outputs":[{"internalType":"uint256","name":"stackedAmount","type":"uint256"},{"internalType":"uint256","name":"referralCommissionClaimed","type":"uint256"},{"internalType":"uint256","name":"referralCount","type":"uint256"},{"internalType":"uint256","name":"referralCommission","type":"uint256"},{"internalType":"bool","name":"enable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_beneficiaries","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"uint256","name":"_vestingType","type":"uint256"}],"name":"addBeneficiaries","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"}],"name":"addSupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tgePercentage","type":"uint256"},{"internalType":"uint256","name":"releaseInterval","type":"uint256"},{"internalType":"uint256","name":"releasePercentage","type":"uint256"}],"name":"addVestingSchedule","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"beneficiaries","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"uint256","name":"vestingType","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"bool","name":"tgeClaimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"referralAddress","type":"address"},{"internalType":"bool","name":"isStack","type":"bool"}],"name":"buyWithNative","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"},{"internalType":"uint256","name":"valueInWei_","type":"uint256"},{"internalType":"address","name":"referralAddress","type":"address"},{"internalType":"bool","name":"isStack","type":"bool"}],"name":"buyWithToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestingType","type":"uint256"}],"name":"changeRound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimReferralCommission","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getAllStakers","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"getBuyInfo","outputs":[{"components":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"uint256","name":"vestingType","type":"uint256"},{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"bool","name":"tgeClaimed","type":"bool"}],"internalType":"struct Beneficiary[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getETHPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinContributionUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleAnalytics","outputs":[{"internalType":"uint256","name":"totalTokensSold","type":"uint256"},{"internalType":"uint256","name":"totalETHCollected","type":"uint256"},{"internalType":"uint256","name":"totalUSDValue","type":"uint256"},{"internalType":"uint256","name":"totalReferralAmount","type":"uint256"},{"internalType":"uint256","name":"totalBonus","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresalePricePerUSD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPresaleTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPriceOracleNative","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getStakeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getSupportedTokensList","outputs":[{"internalType":"address[]","name":"contractAddress","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_msgValue","type":"uint256"}],"name":"getTokenByETH","outputs":[{"internalType":"uint256","name":"valueInTokens","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTreasaryWallet","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserInfo","outputs":[{"components":[{"internalType":"uint256","name":"stackedAmount","type":"uint256"},{"internalType":"uint256","name":"referralCommissionClaimed","type":"uint256"},{"internalType":"uint256","name":"referralCount","type":"uint256"},{"internalType":"uint256","name":"referralCommission","type":"uint256"},{"internalType":"bool","name":"enable","type":"bool"}],"internalType":"struct UserInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isReferralAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"referralPercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenContract_","type":"address"}],"name":"removeSupportedToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_valueInWei","type":"uint256"}],"name":"setMinContributionUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setPresaleTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"setPriceOracleNative","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"priceInUSD_","type":"uint256"}],"name":"setPricePerUSD","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_referralPercentage","type":"uint256"}],"name":"setReferralPercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setTGETime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"treasaryWallet_","type":"address"}],"name":"setTreasaryWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakes","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"timestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_referralAddresses","type":"address[]"},{"internalType":"uint256[]","name":"_referralCounts","type":"uint256[]"},{"internalType":"uint256[]","name":"_referralCommissions","type":"uint256[]"}],"name":"updateReferralInfoBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"vestingSchedules","outputs":[{"internalType":"uint256","name":"tgePercentage","type":"uint256"},{"internalType":"uint256","name":"releaseInterval","type":"uint256"},{"internalType":"uint256","name":"releasePercentage","type":"uint256"},{"internalType":"bool","name":"initialized","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenContract","type":"address"},{"internalType":"uint256","name":"_valueInWei","type":"uint256"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801562000010575f80fd5b506040516200342f3803806200342f833981016040819052620000339162000239565b5f805460ff1916905533806200006257604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6200006d81620000f5565b506001838155600380546001600160a01b0319166001600160a01b0385811691909117909155670de0b6b3a7640000600955600a8054610100600160a81b03191661010092851692909202919091178155620000ce9162015180906200014d565b50620000e160146201518060026200014d565b50506001601355505060056014556200029c565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b604080516080810182528481526020810184905290810182905260016060820152601280545f9291601591849182620001868362000277565b90915550815260208082019290925260409081015f20835181558383015160018201558382015160028201556060938401516003909101805460ff1916911515919091179055601254815190815291820187905281018590529081018390527ffb857b5ffd91e3fbb73825c1ad7f178bf8ddc437f75f461572f81a05d4e9a1a09060800160405180910390a1506012549392505050565b80516001600160a01b038116811462000234575f80fd5b919050565b5f805f606084860312156200024c575f80fd5b835192506200025e602085016200021d565b91506200026e604085016200021d565b90509250925092565b5f600182016200029557634e487b7160e01b5f52601160045260245ffd5b5060010190565b61318580620002aa5f395ff3fe6080604052600436106102a8575f3560e01c8063703aa76d1161016f57806396ea8b9c116100d8578063b7d0111511610092578063e83569f71161006d578063e83569f714610920578063f2fde38b14610934578063fd5e6dd114610953578063ff82995a14610972575f80fd5b8063b7d01115146108b0578063dd33e547146108d8578063e086e5ec1461090c575f80fd5b806396ea8b9c14610816578063a0311bd41461082b578063a4066c971461084a578063a607a8d914610869578063a64615211461087d578063b07de03e14610891575f80fd5b80638456cb59116101295780638456cb591461074d57806389af1fc51461076157806389b523601461077e5780638b35e1c2146107935780638da5cb5b146107b257806391ac6c9b146107d3575f80fd5b8063703aa76d1461065b578063715018a61461068f57806376319190146106a3578063807149f2146106c2578063825ee2c9146106e15780638327ffc21461072c575f80fd5b806337bdc99b116102115780636386c1c7116101cb5780636386c1c714610556578063685ac12b146105825780636aace62d146105965780636d3cbe21146105b55780636d69fcaf1461061a5780636e4f88c814610639575f80fd5b806337bdc99b1461046d578063390adde51461048c5780633f4ba83a146104b857806350741891146104cc578063529849e9146104eb5780635c975abb14610534575f80fd5b80630e5b1234116102625780630e5b1234146103945780631273c508146103a75780631477a12d146103c957806315f94c77146103e857806316934fc4146104075780631bfa0ce01461044e575f80fd5b806303180073146102b357806303411f16146102d457806306b091f91461030a57806307973ccf146103295780630ac44e021461034c5780630c2eb40314610360575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102d26102cd366004612a14565b610991565b005b3480156102df575f80fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610315575f80fd5b506102d2610324366004612a2d565b6109bb565b348015610334575f80fd5b5061033e600f5481565b604051908152602001610301565b348015610357575f80fd5b506102d2610a2f565b34801561036b575f80fd5b5061033e61037a366004612a14565b6001600160a01b03165f9081526018602052604090205490565b6102d26103a2366004612a62565b610b22565b3480156103b2575f80fd5b50600a5461010090046001600160a01b03166102ed565b3480156103d4575f80fd5b506102d26103e3366004612a14565b610f43565b3480156103f3575f80fd5b506102d2610402366004612bce565b610f73565b348015610412575f80fd5b50610439610421366004612a14565b60186020525f90815260409020805460019091015482565b60408051928352602083019190915201610301565b348015610459575f80fd5b506102d2610468366004612c50565b611093565b348015610478575f80fd5b506102d2610487366004612c50565b6110a0565b348015610497575f80fd5b506104ab6104a6366004612a14565b61132a565b6040516103019190612c67565b3480156104c3575f80fd5b506102d26113ce565b3480156104d7575f80fd5b506102d26104e6366004612ce1565b6113e0565b3480156104f6575f80fd5b5061050a610505366004612a2d565b6114cc565b6040805195865260208601949094529284019190915260608301521515608082015260a001610301565b34801561053f575f80fd5b505f5460ff165b6040519015158152602001610301565b348015610561575f80fd5b50610575610570366004612a14565b611519565b6040516103019190612d49565b34801561058d575f80fd5b5060095461033e565b3480156105a1575f80fd5b506102d26105b0366004612c50565b6115a4565b3480156105c0575f80fd5b506105f86105cf366004612c50565b60156020525f908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610301565b348015610625575f80fd5b506102d2610634366004612a14565b6115b1565b348015610644575f80fd5b5061064d6116cc565b604051610301929190612dc7565b348015610666575f80fd5b506102ed610675366004612c50565b60116020525f90815260409020546001600160a01b031681565b34801561069a575f80fd5b506102d26117ed565b3480156106ae575f80fd5b506102d26106bd366004612a14565b6117fe565b3480156106cd575f80fd5b506102d26106dc366004612c50565b611a40565b3480156106ec575f80fd5b5061050a6106fb366004612a14565b600d6020525f9081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b348015610737575f80fd5b50610740611a4d565b6040516103019190612e1c565b348015610758575f80fd5b506102d2611aad565b34801561076c575f80fd5b50600b546001600160a01b03166102ed565b348015610789575f80fd5b5061033e600e5481565b34801561079e575f80fd5b5061033e6107ad366004612e2e565b611abd565b3480156107bd575f80fd5b505f5461010090046001600160a01b03166102ed565b3480156107de575f80fd5b50600454600554600654600754600854604080519586526020860194909452928401919091526060830152608082015260a001610301565b348015610821575f80fd5b5061033e60145481565b348015610836575f80fd5b506102d2610845366004612c50565b611adb565b348015610855575f80fd5b506102d2610864366004612e57565b611b1e565b348015610874575f80fd5b5061033e611f58565b348015610888575f80fd5b5060015461033e565b34801561089c575f80fd5b5061033e6108ab366004612c50565b611f79565b3480156108bb575f80fd5b506105466108ca366004612a14565b6001600160a01b0316151590565b3480156108e3575f80fd5b506102ed6108f2366004612c50565b60106020525f90815260409020546001600160a01b031681565b348015610917575f80fd5b506102d2611fd9565b34801561092b575f80fd5b506102d261206a565b34801561093f575f80fd5b506102d261094e366004612a14565b6120ae565b34801561095e575f80fd5b506102ed61096d366004612c50565b6120eb565b34801561097d575f80fd5b506102d261098c366004612a14565b612113565b61099961213d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5460ff16156109e75760405162461bcd60e51b81526004016109de90612ea3565b60405180910390fd5b600a805460ff191660011790556109fc61213d565b5f54610a219061010090046001600160a01b03166001600160a01b038416908361216f565b5050600a805460ff19169055565b335f908152600d60205260408120600b546003820154919291610a5b916001600160a01b0316906121d3565b90505f8111610aa55760405162461bcd60e51b81526020600482015260166024820152754e6f20636f6d6d697373696f6e20746f20636c61696d60501b60448201526064016109de565b600b54610abc906001600160a01b0316338361216f565b8160030154826001015f828254610ad39190612eee565b90915550505f600383015560018201546040805133815260208101929092527f54bbe0cc786abd8b814b1316f59ce8983c2766a89e42e932c559f82fbd12582091015b60405180910390a15050565b600a5460ff1615610b455760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff19166001179055610b5a61225b565b600a54339034905f90670de0b6b3a7640000908390610b869061010090046001600160a01b031661227e565b610b909190612f01565b610b9a9190612f18565b90505f8060015483670de0b6b3a7640000610bb59190612f01565b610bbf9190612f18565b90505f610bcb84612352565b90505f6064610bda8385612f01565b610be49190612f18565b90505f610bf18483612eee565b90506001600160a01b038a1615610d1b57606460145485610c129190612f01565b610c1c9190612f18565b6001600160a01b038b165f908152600d602052604081206003810180549398509092889290610c4c908490612eee565b925050819055506001816002015f828254610c679190612eee565b9091555050600481015460ff16610cd15760048101805460ff19166001179055600e80548c916010915f9182610c9c83612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6003810154604080516001600160a01b038e16815260208101929092527fa502aa2e83bde1764a6d4a1a69761fdcce0a0b37228d397547dc06b832f43719910160405180910390a1505b600954861015610d6d5760405162461bcd60e51b815260206004820181905260248201527f56616c7565206c657373207468656e206d696e20636f6e747269627574696f6e60448201526064016109de565b6003546040516001600160a01b039091169088156108fc029089905f818181858888f19350505050158015610da4573d5f803e3d5ffd5b506001600160a01b0388165f908152600d60205260408120805490918391839190610dd0908490612eee565b9091555050600481015460ff16610e3a5760048101805460ff19166001179055600f80548a916011915f9182610e0583612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8160045f828254610e4b9190612eee565b925050819055508660065f828254610e639190612eee565b925050819055508760055f828254610e7b9190612eee565b925050819055508560075f828254610e939190612eee565b925050819055508260085f828254610eab9190612eee565b9091555050600154604080516001600160a01b038c168152602081018b9052808201889052606081019290925260808201859052517ff775dfcefadd27a167cbe7b298b447bcf699b954d23b53558130c75c8acc7e709181900360a00190a18915610f1f57610f1a89836123d6565b610f2c565b610f2c898360135461248b565b5050600a805460ff19169055505050505050505050565b610f4b61213d565b600a80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610f7b61213d565b81518351148015610f8d575080518351145b610fe85760405162461bcd60e51b815260206004820152602660248201527f496e70757420617272617973206d7573742068617665207468652073616d65206044820152650d8cadccee8d60d31b60648201526084016109de565b5f5b835181101561108d575f600d5f86848151811061100957611009612f4f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20905083828151811061104457611044612f4f565b6020026020010151816002018190555082828151811061106657611066612f4f565b60209081029190910101516003820155600401805460ff1916600190811790915501610fea565b50505050565b61109b61213d565b600955565b6017545f036110f15760405162461bcd60e51b815260206004820152601760248201527f54474520686173206e6f7420737461727465642079657400000000000000000060448201526064016109de565b335f9081526016602052604090208054821061114f5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642076657374696e67207363686564756c65204944000000000060448201526064016109de565b5f81838154811061116257611162612f4f565b905f5260205f20906005020190505f60155f836002015481526020019081526020015f2090505f611199601754846003015461255d565b6111a39042612f63565b60048401549091505f9060ff161580156111bd5750825415155b156111f257825484546064916111d291612f01565b6111dc9190612f18565b60048501805460ff1916600117905590506112b9565b82600101548210156112465760405162461bcd60e51b815260206004820152601e60248201527f56657374696e6720706572696f6420686173206e6f742073746172746564000060448201526064016109de565b5f8360010154836112579190612f18565b90505f84600201548261126a9190612f01565b85546112769190612eee565b9050611283816064612574565b90505f606482885f01546112979190612f01565b6112a19190612f18565b90508660010154816112b39190612f63565b93505050505b5f81116112ff5760405162461bcd60e51b81526020600482015260146024820152734e6f2072656c65617361626c6520746f6b656e7360601b60448201526064016109de565b80846001015f8282546113129190612eee565b9091555061132290503382612582565b505050505050565b6001600160a01b0381165f908152601660209081526040808320805482518185028101850190935280835260609492939192909184015b828210156113c3575f8481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101611361565b505050509050919050565b6113d661213d565b6113de6125f0565b565b6113e861213d565b5f5b835181101561108d5760165f85838151811061140857611408612f4f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060a0016040528085848151811061144c5761144c612f4f565b60209081029190910181015182525f8282018190526040808401889052426060808601919091526080948501839052865460018082018955978452928490208651600590940201928355928501518287015584015160028201559083015160038201559101516004909101805460ff1916911515919091179055016113ea565b6016602052815f5260405f2081815481106114e5575f80fd5b5f91825260209091206005909102018054600182015460028301546003840154600490940154929550909350919060ff1685565b6115486040518060a001604052805f81526020015f81526020015f81526020015f81526020015f151581525090565b506001600160a01b03165f908152600d6020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154606082015260049091015460ff161515608082015290565b6115ac61213d565b600155565b6115b961213d565b6001600160a01b0381165f908152600c602052604090205460ff1680156116375760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e20616c726561647920616464656420696e20737570706f7274656460448201526b081d1bdad95b9cc81b1a5cdd60a21b60648201526084016109de565b6001600160a01b0382165f818152600c60209081526040808320805460ff191660019081179091556002805491820181559093527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90920180546001600160a01b0319168417905590519182527fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d79101610b16565b60195460609081905f8167ffffffffffffffff8111156116ee576116ee612a97565b604051908082528060200260200182016040528015611717578160200160208202803683370190505b5090505f5b828110156117855760185f6019838154811061173a5761173a612f4f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061177257611772612f4f565b602090810291909101015260010161171c565b50601981818054806020026020016040519081016040528092919081815260200182805480156117dc57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116117be575b505050505091509350935050509091565b6117f561213d565b6113de5f61263c565b61180661213d565b6001600160a01b0381165f908152600c602052604090205460ff16806118945760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e20616c72656164792072656d6f766564206f72206e6f742061646460448201527f656420696e20737570706f7274656420746f6b656e73206c697374000000000060648201526084016109de565b6001600160a01b0382165f908152600c60209081526040808320805460ff1916905560028054825181850281018501909352808352919290919083018282801561190557602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116118e7575b505050505090505f5b815181101561108d57836001600160a01b03166002828154811061193457611934612f4f565b5f918252602090912001546001600160a01b031603611a38576002805461195d90600190612f63565b8154811061196d5761196d612f4f565b5f91825260209091200154600280546001600160a01b03909216918390811061199857611998612f4f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028054806119d4576119d4612f76565b5f8281526020908190205f19908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527fbea12876694c4055c71f74308f752b9027cf3d554194000a366abddfc239a306910160405180910390a161108d565b60010161190e565b611a4861213d565b601355565b60606002805480602002602001604051908101604052809291908181526020018280548015611aa357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611a85575b5050505050905090565b611ab561213d565b6113de612694565b5f611ac661213d565b611ad18484846126d0565b90505b9392505050565b611ae361213d565b60148190556040518181527f19442b8628d48f50974606261c2be961f20e88dd787145ea2e83b5e2ca82cd889060200160405180910390a150565b600a5460ff1615611b415760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff19166001179055611b5661225b565b6001600160a01b0384165f908152600c602052604090205460ff16611bb65760405162461bcd60e51b8152602060048201526016602482015275151bdad95b881a5cc81b9bdd081cdd5c1c1bdc9d195960521b60448201526064016109de565b600154339084905f90611bd183670de0b6b3a7640000612f01565b611bdb9190612f18565b90505f611be783612352565b90505f6064611bf68385612f01565b611c009190612f18565b90505f611c0d8483612eee565b90505f6001600160a01b03891615611d3857606460145486611c2f9190612f01565b611c399190612f18565b6001600160a01b038a165f908152600d602052604081206003810180549394509092849290611c69908490612eee565b925050819055506001816002015f828254611c849190612eee565b9091555050600481015460ff16611cee5760048101805460ff19166001179055600e80548b916010915f9182611cb983612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6003810154604080516001600160a01b038d16815260208101929092527fa502aa2e83bde1764a6d4a1a69761fdcce0a0b37228d397547dc06b832f43719910160405180910390a1505b600954861015611d8a5760405162461bcd60e51b815260206004820181905260248201527f56616c7565206c657373207468616e206d696e20636f6e747269627574696f6e60448201526064016109de565b5f611d958c8c61279e565b600354909150611db4906001600160a01b038e8116918b91168461281d565b6001600160a01b0388165f908152600d60205260408120805490918591839190611ddf908490612eee565b9091555050600481015460ff16611e495760048101805460ff19166001179055600f80548a916011915f9182611e1483612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8360045f828254611e5a9190612eee565b925050819055508b60065f828254611e729190612eee565b925050819055508260075f828254611e8a9190612eee565b925050819055508460085f828254611ea29190612eee565b925050819055507fa564aa25b65a3273915f1ae09b560f7c6f97e4a92a5c86a2f63d84a6418da9ab898e8e8a6001548a604051611f15969594939291906001600160a01b03968716815294909516602085015260408401929092526060830152608082015260a081019190915260c00190565b60405180910390a18915611f3257611f2d89856123d6565b611f3f565b611f3f898560135461248b565b5050600a805460ff191690555050505050505050505050565b600a545f90611f749061010090046001600160a01b031661227e565b905090565b5f80670de0b6b3a764000083611fa3600a60019054906101000a90046001600160a01b031661227e565b611fad9190612f01565b611fb79190612f18565b905060015481611fc79190612f18565b611ad490670de0b6b3a7640000612f01565b611fe161213d565b600a5460ff16156120045760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff191660011790556120285f546001600160a01b036101009091041690565b6001600160a01b03166108fc4790811502906040515f60405180830381858888f1935050505015801561205d573d5f803e3d5ffd5b50600a805460ff19169055565b61207261213d565b4260178190556040519081527fa6381d09fbfba27612275dc45833822067bc2dfc8f7557883982d124a1244304906020015b60405180910390a1565b6120b661213d565b6001600160a01b0381166120df57604051631e4fbdf760e01b81525f60048201526024016109de565b6120e88161263c565b50565b601981815481106120fa575f80fd5b5f918252602090912001546001600160a01b0316905081565b61211b61213d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b036101009091041633146113de5760405163118cdaa760e01b81523360048201526024016109de565b6040516001600160a01b038381166024830152604482018390526121ce91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612856565b505050565b5f826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122349190612f8a565b61223f90600a61308a565b61225183670de0b6b3a7640000612f01565b611ad49190612f18565b5f5460ff16156113de5760405163d93c066560e01b815260040160405180910390fd5b5f80826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156122bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e091906130b1565b505050915050611ad481846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190612f8a565b60ff166128b7565b5f69043c33c1937564800000821061236c5750600f919050565b69032d26d12e980b60000082106123855750600d919050565b69021e19e0c9bab2400000821061239e5750600a919050565b69010f0cf064dd5920000082106123b757506008919050565b685150ae84a8cdf0000082106123cf57506005919050565b505f919050565b6001600160a01b0382165f90815260186020526040812054900361243f57601980546001810182555f919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382165f9081526018602052604081208054839290612466908490612eee565b9091555050506001600160a01b03165f90815260186020526040902042600190910155565b6001600160a01b0383165f818152601660209081526040808320815160a08101835287815280840185815281840188815242606080850182815260808087018b8152885460018082018b55998d529b8b902097516005909c029097019a8b559451968a0196909655915160028901559351600388015591516004909601805460ff1916961515969096179095558251958652928501879052908401859052908301527f3c68c90bb3ef39886091529d350c03d7c3648177c30376125370608acc3068d4910160405180910390a1505050565b5f81831161256b5781611ad4565b50815b92915050565b5f81831061256b5781611ad4565b600b546125b190839061259e906001600160a01b0316846121d3565b600b546001600160a01b0316919061216f565b604080516001600160a01b0384168152602081018390527fc7798891864187665ac6dd119286e44ec13f014527aeeb2b8eb3fd413df931799101610b16565b6125f86128d5565b5f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b0390911681526020016120a4565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b61269c61225b565b5f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126243390565b604080516080810182528481526020810184905290810182905260016060820152601280545f929160159184918261270783612f37565b90915550815260208082019290925260409081015f20835181558383015160018201558382015160028201556060938401516003909101805460ff1916911515919091179055601254815190815291820187905281018590529081018390527ffb857b5ffd91e3fbb73825c1ad7f178bf8ddc437f75f461572f81a05d4e9a1a09060800160405180910390a1506012549392505050565b5f670de0b6b3a7640000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128089190612f8a565b61281390600a61308a565b6122519084612f01565b6040516001600160a01b03848116602483015283811660448301526064820183905261108d9186918216906323b872dd9060840161219c565b5f61286a6001600160a01b038416836128f7565b905080515f1415801561288e57508080602001905181019061288c91906130fd565b155b156121ce57604051635274afe760e01b81526001600160a01b03841660048201526024016109de565b5f6128c382600a613118565b61225184670de0b6b3a7640000612f01565b5f5460ff166113de57604051638dfc202b60e01b815260040160405180910390fd5b6060611ad483835f845f80856001600160a01b0316848660405161291b9190613123565b5f6040518083038185875af1925050503d805f8114612955576040519150601f19603f3d011682016040523d82523d5f602084013e61295a565b606091505b509150915061296a868383612974565b9695505050505050565b60608261298957612984826129d0565b611ad4565b81511580156129a057506001600160a01b0384163b155b156129c957604051639996b31560e01b81526001600160a01b03851660048201526024016109de565b5080611ad4565b8051156129e05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114612a0f575f80fd5b919050565b5f60208284031215612a24575f80fd5b611ad4826129f9565b5f8060408385031215612a3e575f80fd5b612a47836129f9565b946020939093013593505050565b80151581146120e8575f80fd5b5f8060408385031215612a73575f80fd5b612a7c836129f9565b91506020830135612a8c81612a55565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612ad457612ad4612a97565b604052919050565b5f67ffffffffffffffff821115612af557612af5612a97565b5060051b60200190565b5f82601f830112612b0e575f80fd5b81356020612b23612b1e83612adc565b612aab565b8083825260208201915060208460051b870101935086841115612b44575f80fd5b602086015b84811015612b6757612b5a816129f9565b8352918301918301612b49565b509695505050505050565b5f82601f830112612b81575f80fd5b81356020612b91612b1e83612adc565b8083825260208201915060208460051b870101935086841115612bb2575f80fd5b602086015b84811015612b675780358352918301918301612bb7565b5f805f60608486031215612be0575f80fd5b833567ffffffffffffffff80821115612bf7575f80fd5b612c0387838801612aff565b94506020860135915080821115612c18575f80fd5b612c2487838801612b72565b93506040860135915080821115612c39575f80fd5b50612c4686828701612b72565b9150509250925092565b5f60208284031215612c60575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b81811015612cd557612cc2838551805182526020810151602083015260408101516040830152606081015160608301526080810151151560808301525050565b9284019260a09290920191600101612c82565b50909695505050505050565b5f805f60608486031215612cf3575f80fd5b833567ffffffffffffffff80821115612d0a575f80fd5b612d1687838801612aff565b94506020860135915080821115612d2b575f80fd5b50612d3886828701612b72565b925050604084013590509250925092565b60a0810161256e8284805182526020810151602083015260408101516040830152606081015160608301526080810151151560808301525050565b5f815180845260208085019450602084015f5b83811015612dbc5781516001600160a01b031687529582019590820190600101612d97565b509495945050505050565b604081525f612dd96040830185612d84565b8281036020848101919091528451808352858201928201905f5b81811015612e0f57845183529383019391830191600101612df3565b5090979650505050505050565b602081525f611ad46020830184612d84565b5f805f60608486031215612e40575f80fd5b505081359360208301359350604090920135919050565b5f805f8060808587031215612e6a575f80fd5b612e73856129f9565b935060208501359250612e88604086016129f9565b91506060850135612e9881612a55565b939692955090935050565b60208082526017908201527f5472616e73616374696f6e20696e2070726f6772657373000000000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561256e5761256e612eda565b808202811582820484141761256e5761256e612eda565b5f82612f3257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612f4857612f48612eda565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561256e5761256e612eda565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215612f9a575f80fd5b815160ff81168114611ad4575f80fd5b600181815b80851115612fe457815f1904821115612fca57612fca612eda565b80851615612fd757918102915b93841c9390800290612faf565b509250929050565b5f82612ffa5750600161256e565b8161300657505f61256e565b816001811461301c576002811461302657613042565b600191505061256e565b60ff84111561303757613037612eda565b50506001821b61256e565b5060208310610133831016604e8410600b8410161715613065575081810a61256e565b61306f8383612faa565b805f190482111561308257613082612eda565b029392505050565b5f611ad460ff841683612fec565b805169ffffffffffffffffffff81168114612a0f575f80fd5b5f805f805f60a086880312156130c5575f80fd5b6130ce86613098565b94506020860151935060408601519250606086015191506130f160808701613098565b90509295509295909350565b5f6020828403121561310d575f80fd5b8151611ad481612a55565b5f611ad48383612fec565b5f82515f5b818110156131425760208186018101518583015201613128565b505f92019182525091905056fea26469706673582212201821934dce0f6d662c9c468440110feea1aa6efb33f6a74c61743b74d4db90bb64736f6c634300081800330000000000000000000000000000000000000000000000000000b5e620f480000000000000000000000000006da180ed33e28bda8cdc99cf706fc6ebcb208ea20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode
0x6080604052600436106102a8575f3560e01c8063703aa76d1161016f57806396ea8b9c116100d8578063b7d0111511610092578063e83569f71161006d578063e83569f714610920578063f2fde38b14610934578063fd5e6dd114610953578063ff82995a14610972575f80fd5b8063b7d01115146108b0578063dd33e547146108d8578063e086e5ec1461090c575f80fd5b806396ea8b9c14610816578063a0311bd41461082b578063a4066c971461084a578063a607a8d914610869578063a64615211461087d578063b07de03e14610891575f80fd5b80638456cb59116101295780638456cb591461074d57806389af1fc51461076157806389b523601461077e5780638b35e1c2146107935780638da5cb5b146107b257806391ac6c9b146107d3575f80fd5b8063703aa76d1461065b578063715018a61461068f57806376319190146106a3578063807149f2146106c2578063825ee2c9146106e15780638327ffc21461072c575f80fd5b806337bdc99b116102115780636386c1c7116101cb5780636386c1c714610556578063685ac12b146105825780636aace62d146105965780636d3cbe21146105b55780636d69fcaf1461061a5780636e4f88c814610639575f80fd5b806337bdc99b1461046d578063390adde51461048c5780633f4ba83a146104b857806350741891146104cc578063529849e9146104eb5780635c975abb14610534575f80fd5b80630e5b1234116102625780630e5b1234146103945780631273c508146103a75780631477a12d146103c957806315f94c77146103e857806316934fc4146104075780631bfa0ce01461044e575f80fd5b806303180073146102b357806303411f16146102d457806306b091f91461030a57806307973ccf146103295780630ac44e021461034c5780630c2eb40314610360575f80fd5b366102af57005b5f80fd5b3480156102be575f80fd5b506102d26102cd366004612a14565b610991565b005b3480156102df575f80fd5b506003546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b348015610315575f80fd5b506102d2610324366004612a2d565b6109bb565b348015610334575f80fd5b5061033e600f5481565b604051908152602001610301565b348015610357575f80fd5b506102d2610a2f565b34801561036b575f80fd5b5061033e61037a366004612a14565b6001600160a01b03165f9081526018602052604090205490565b6102d26103a2366004612a62565b610b22565b3480156103b2575f80fd5b50600a5461010090046001600160a01b03166102ed565b3480156103d4575f80fd5b506102d26103e3366004612a14565b610f43565b3480156103f3575f80fd5b506102d2610402366004612bce565b610f73565b348015610412575f80fd5b50610439610421366004612a14565b60186020525f90815260409020805460019091015482565b60408051928352602083019190915201610301565b348015610459575f80fd5b506102d2610468366004612c50565b611093565b348015610478575f80fd5b506102d2610487366004612c50565b6110a0565b348015610497575f80fd5b506104ab6104a6366004612a14565b61132a565b6040516103019190612c67565b3480156104c3575f80fd5b506102d26113ce565b3480156104d7575f80fd5b506102d26104e6366004612ce1565b6113e0565b3480156104f6575f80fd5b5061050a610505366004612a2d565b6114cc565b6040805195865260208601949094529284019190915260608301521515608082015260a001610301565b34801561053f575f80fd5b505f5460ff165b6040519015158152602001610301565b348015610561575f80fd5b50610575610570366004612a14565b611519565b6040516103019190612d49565b34801561058d575f80fd5b5060095461033e565b3480156105a1575f80fd5b506102d26105b0366004612c50565b6115a4565b3480156105c0575f80fd5b506105f86105cf366004612c50565b60156020525f908152604090208054600182015460028301546003909301549192909160ff1684565b6040805194855260208501939093529183015215156060820152608001610301565b348015610625575f80fd5b506102d2610634366004612a14565b6115b1565b348015610644575f80fd5b5061064d6116cc565b604051610301929190612dc7565b348015610666575f80fd5b506102ed610675366004612c50565b60116020525f90815260409020546001600160a01b031681565b34801561069a575f80fd5b506102d26117ed565b3480156106ae575f80fd5b506102d26106bd366004612a14565b6117fe565b3480156106cd575f80fd5b506102d26106dc366004612c50565b611a40565b3480156106ec575f80fd5b5061050a6106fb366004612a14565b600d6020525f9081526040902080546001820154600283015460038401546004909401549293919290919060ff1685565b348015610737575f80fd5b50610740611a4d565b6040516103019190612e1c565b348015610758575f80fd5b506102d2611aad565b34801561076c575f80fd5b50600b546001600160a01b03166102ed565b348015610789575f80fd5b5061033e600e5481565b34801561079e575f80fd5b5061033e6107ad366004612e2e565b611abd565b3480156107bd575f80fd5b505f5461010090046001600160a01b03166102ed565b3480156107de575f80fd5b50600454600554600654600754600854604080519586526020860194909452928401919091526060830152608082015260a001610301565b348015610821575f80fd5b5061033e60145481565b348015610836575f80fd5b506102d2610845366004612c50565b611adb565b348015610855575f80fd5b506102d2610864366004612e57565b611b1e565b348015610874575f80fd5b5061033e611f58565b348015610888575f80fd5b5060015461033e565b34801561089c575f80fd5b5061033e6108ab366004612c50565b611f79565b3480156108bb575f80fd5b506105466108ca366004612a14565b6001600160a01b0316151590565b3480156108e3575f80fd5b506102ed6108f2366004612c50565b60106020525f90815260409020546001600160a01b031681565b348015610917575f80fd5b506102d2611fd9565b34801561092b575f80fd5b506102d261206a565b34801561093f575f80fd5b506102d261094e366004612a14565b6120ae565b34801561095e575f80fd5b506102ed61096d366004612c50565b6120eb565b34801561097d575f80fd5b506102d261098c366004612a14565b612113565b61099961213d565b600380546001600160a01b0319166001600160a01b0392909216919091179055565b600a5460ff16156109e75760405162461bcd60e51b81526004016109de90612ea3565b60405180910390fd5b600a805460ff191660011790556109fc61213d565b5f54610a219061010090046001600160a01b03166001600160a01b038416908361216f565b5050600a805460ff19169055565b335f908152600d60205260408120600b546003820154919291610a5b916001600160a01b0316906121d3565b90505f8111610aa55760405162461bcd60e51b81526020600482015260166024820152754e6f20636f6d6d697373696f6e20746f20636c61696d60501b60448201526064016109de565b600b54610abc906001600160a01b0316338361216f565b8160030154826001015f828254610ad39190612eee565b90915550505f600383015560018201546040805133815260208101929092527f54bbe0cc786abd8b814b1316f59ce8983c2766a89e42e932c559f82fbd12582091015b60405180910390a15050565b600a5460ff1615610b455760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff19166001179055610b5a61225b565b600a54339034905f90670de0b6b3a7640000908390610b869061010090046001600160a01b031661227e565b610b909190612f01565b610b9a9190612f18565b90505f8060015483670de0b6b3a7640000610bb59190612f01565b610bbf9190612f18565b90505f610bcb84612352565b90505f6064610bda8385612f01565b610be49190612f18565b90505f610bf18483612eee565b90506001600160a01b038a1615610d1b57606460145485610c129190612f01565b610c1c9190612f18565b6001600160a01b038b165f908152600d602052604081206003810180549398509092889290610c4c908490612eee565b925050819055506001816002015f828254610c679190612eee565b9091555050600481015460ff16610cd15760048101805460ff19166001179055600e80548c916010915f9182610c9c83612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6003810154604080516001600160a01b038e16815260208101929092527fa502aa2e83bde1764a6d4a1a69761fdcce0a0b37228d397547dc06b832f43719910160405180910390a1505b600954861015610d6d5760405162461bcd60e51b815260206004820181905260248201527f56616c7565206c657373207468656e206d696e20636f6e747269627574696f6e60448201526064016109de565b6003546040516001600160a01b039091169088156108fc029089905f818181858888f19350505050158015610da4573d5f803e3d5ffd5b506001600160a01b0388165f908152600d60205260408120805490918391839190610dd0908490612eee565b9091555050600481015460ff16610e3a5760048101805460ff19166001179055600f80548a916011915f9182610e0583612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8160045f828254610e4b9190612eee565b925050819055508660065f828254610e639190612eee565b925050819055508760055f828254610e7b9190612eee565b925050819055508560075f828254610e939190612eee565b925050819055508260085f828254610eab9190612eee565b9091555050600154604080516001600160a01b038c168152602081018b9052808201889052606081019290925260808201859052517ff775dfcefadd27a167cbe7b298b447bcf699b954d23b53558130c75c8acc7e709181900360a00190a18915610f1f57610f1a89836123d6565b610f2c565b610f2c898360135461248b565b5050600a805460ff19169055505050505050505050565b610f4b61213d565b600a80546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b610f7b61213d565b81518351148015610f8d575080518351145b610fe85760405162461bcd60e51b815260206004820152602660248201527f496e70757420617272617973206d7573742068617665207468652073616d65206044820152650d8cadccee8d60d31b60648201526084016109de565b5f5b835181101561108d575f600d5f86848151811061100957611009612f4f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20905083828151811061104457611044612f4f565b6020026020010151816002018190555082828151811061106657611066612f4f565b60209081029190910101516003820155600401805460ff1916600190811790915501610fea565b50505050565b61109b61213d565b600955565b6017545f036110f15760405162461bcd60e51b815260206004820152601760248201527f54474520686173206e6f7420737461727465642079657400000000000000000060448201526064016109de565b335f9081526016602052604090208054821061114f5760405162461bcd60e51b815260206004820152601b60248201527f496e76616c69642076657374696e67207363686564756c65204944000000000060448201526064016109de565b5f81838154811061116257611162612f4f565b905f5260205f20906005020190505f60155f836002015481526020019081526020015f2090505f611199601754846003015461255d565b6111a39042612f63565b60048401549091505f9060ff161580156111bd5750825415155b156111f257825484546064916111d291612f01565b6111dc9190612f18565b60048501805460ff1916600117905590506112b9565b82600101548210156112465760405162461bcd60e51b815260206004820152601e60248201527f56657374696e6720706572696f6420686173206e6f742073746172746564000060448201526064016109de565b5f8360010154836112579190612f18565b90505f84600201548261126a9190612f01565b85546112769190612eee565b9050611283816064612574565b90505f606482885f01546112979190612f01565b6112a19190612f18565b90508660010154816112b39190612f63565b93505050505b5f81116112ff5760405162461bcd60e51b81526020600482015260146024820152734e6f2072656c65617361626c6520746f6b656e7360601b60448201526064016109de565b80846001015f8282546113129190612eee565b9091555061132290503382612582565b505050505050565b6001600160a01b0381165f908152601660209081526040808320805482518185028101850190935280835260609492939192909184015b828210156113c3575f8481526020908190206040805160a081018252600586029092018054835260018082015484860152600282015492840192909252600381015460608401526004015460ff16151560808301529083529092019101611361565b505050509050919050565b6113d661213d565b6113de6125f0565b565b6113e861213d565b5f5b835181101561108d5760165f85838151811061140857611408612f4f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f206040518060a0016040528085848151811061144c5761144c612f4f565b60209081029190910181015182525f8282018190526040808401889052426060808601919091526080948501839052865460018082018955978452928490208651600590940201928355928501518287015584015160028201559083015160038201559101516004909101805460ff1916911515919091179055016113ea565b6016602052815f5260405f2081815481106114e5575f80fd5b5f91825260209091206005909102018054600182015460028301546003840154600490940154929550909350919060ff1685565b6115486040518060a001604052805f81526020015f81526020015f81526020015f81526020015f151581525090565b506001600160a01b03165f908152600d6020908152604091829020825160a081018452815481526001820154928101929092526002810154928201929092526003820154606082015260049091015460ff161515608082015290565b6115ac61213d565b600155565b6115b961213d565b6001600160a01b0381165f908152600c602052604090205460ff1680156116375760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e20616c726561647920616464656420696e20737570706f7274656460448201526b081d1bdad95b9cc81b1a5cdd60a21b60648201526084016109de565b6001600160a01b0382165f818152600c60209081526040808320805460ff191660019081179091556002805491820181559093527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace90920180546001600160a01b0319168417905590519182527fd1be2e90bd3d24839d9dd94ad871068e1f9688b02fa43f2a62c9975dfa9de2d79101610b16565b60195460609081905f8167ffffffffffffffff8111156116ee576116ee612a97565b604051908082528060200260200182016040528015611717578160200160208202803683370190505b5090505f5b828110156117855760185f6019838154811061173a5761173a612f4f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054825183908390811061177257611772612f4f565b602090810291909101015260010161171c565b50601981818054806020026020016040519081016040528092919081815260200182805480156117dc57602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116117be575b505050505091509350935050509091565b6117f561213d565b6113de5f61263c565b61180661213d565b6001600160a01b0381165f908152600c602052604090205460ff16806118945760405162461bcd60e51b815260206004820152603b60248201527f546f6b656e20616c72656164792072656d6f766564206f72206e6f742061646460448201527f656420696e20737570706f7274656420746f6b656e73206c697374000000000060648201526084016109de565b6001600160a01b0382165f908152600c60209081526040808320805460ff1916905560028054825181850281018501909352808352919290919083018282801561190557602002820191905f5260205f20905b81546001600160a01b031681526001909101906020018083116118e7575b505050505090505f5b815181101561108d57836001600160a01b03166002828154811061193457611934612f4f565b5f918252602090912001546001600160a01b031603611a38576002805461195d90600190612f63565b8154811061196d5761196d612f4f565b5f91825260209091200154600280546001600160a01b03909216918390811061199857611998612f4f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555060028054806119d4576119d4612f76565b5f8281526020908190205f19908301810180546001600160a01b03191690559091019091556040516001600160a01b03861681527fbea12876694c4055c71f74308f752b9027cf3d554194000a366abddfc239a306910160405180910390a161108d565b60010161190e565b611a4861213d565b601355565b60606002805480602002602001604051908101604052809291908181526020018280548015611aa357602002820191905f5260205f20905b81546001600160a01b03168152600190910190602001808311611a85575b5050505050905090565b611ab561213d565b6113de612694565b5f611ac661213d565b611ad18484846126d0565b90505b9392505050565b611ae361213d565b60148190556040518181527f19442b8628d48f50974606261c2be961f20e88dd787145ea2e83b5e2ca82cd889060200160405180910390a150565b600a5460ff1615611b415760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff19166001179055611b5661225b565b6001600160a01b0384165f908152600c602052604090205460ff16611bb65760405162461bcd60e51b8152602060048201526016602482015275151bdad95b881a5cc81b9bdd081cdd5c1c1bdc9d195960521b60448201526064016109de565b600154339084905f90611bd183670de0b6b3a7640000612f01565b611bdb9190612f18565b90505f611be783612352565b90505f6064611bf68385612f01565b611c009190612f18565b90505f611c0d8483612eee565b90505f6001600160a01b03891615611d3857606460145486611c2f9190612f01565b611c399190612f18565b6001600160a01b038a165f908152600d602052604081206003810180549394509092849290611c69908490612eee565b925050819055506001816002015f828254611c849190612eee565b9091555050600481015460ff16611cee5760048101805460ff19166001179055600e80548b916010915f9182611cb983612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b6003810154604080516001600160a01b038d16815260208101929092527fa502aa2e83bde1764a6d4a1a69761fdcce0a0b37228d397547dc06b832f43719910160405180910390a1505b600954861015611d8a5760405162461bcd60e51b815260206004820181905260248201527f56616c7565206c657373207468616e206d696e20636f6e747269627574696f6e60448201526064016109de565b5f611d958c8c61279e565b600354909150611db4906001600160a01b038e8116918b91168461281d565b6001600160a01b0388165f908152600d60205260408120805490918591839190611ddf908490612eee565b9091555050600481015460ff16611e495760048101805460ff19166001179055600f80548a916011915f9182611e1483612f37565b9190505581526020019081526020015f205f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505b8360045f828254611e5a9190612eee565b925050819055508b60065f828254611e729190612eee565b925050819055508260075f828254611e8a9190612eee565b925050819055508460085f828254611ea29190612eee565b925050819055507fa564aa25b65a3273915f1ae09b560f7c6f97e4a92a5c86a2f63d84a6418da9ab898e8e8a6001548a604051611f15969594939291906001600160a01b03968716815294909516602085015260408401929092526060830152608082015260a081019190915260c00190565b60405180910390a18915611f3257611f2d89856123d6565b611f3f565b611f3f898560135461248b565b5050600a805460ff191690555050505050505050505050565b600a545f90611f749061010090046001600160a01b031661227e565b905090565b5f80670de0b6b3a764000083611fa3600a60019054906101000a90046001600160a01b031661227e565b611fad9190612f01565b611fb79190612f18565b905060015481611fc79190612f18565b611ad490670de0b6b3a7640000612f01565b611fe161213d565b600a5460ff16156120045760405162461bcd60e51b81526004016109de90612ea3565b600a805460ff191660011790556120285f546001600160a01b036101009091041690565b6001600160a01b03166108fc4790811502906040515f60405180830381858888f1935050505015801561205d573d5f803e3d5ffd5b50600a805460ff19169055565b61207261213d565b4260178190556040519081527fa6381d09fbfba27612275dc45833822067bc2dfc8f7557883982d124a1244304906020015b60405180910390a1565b6120b661213d565b6001600160a01b0381166120df57604051631e4fbdf760e01b81525f60048201526024016109de565b6120e88161263c565b50565b601981815481106120fa575f80fd5b5f918252602090912001546001600160a01b0316905081565b61211b61213d565b600b80546001600160a01b0319166001600160a01b0392909216919091179055565b5f546001600160a01b036101009091041633146113de5760405163118cdaa760e01b81523360048201526024016109de565b6040516001600160a01b038381166024830152604482018390526121ce91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050612856565b505050565b5f826001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612210573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122349190612f8a565b61223f90600a61308a565b61225183670de0b6b3a7640000612f01565b611ad49190612f18565b5f5460ff16156113de5760405163d93c066560e01b815260040160405180910390fd5b5f80826001600160a01b031663feaf968c6040518163ffffffff1660e01b815260040160a060405180830381865afa1580156122bc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122e091906130b1565b505050915050611ad481846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015612326573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190612f8a565b60ff166128b7565b5f69043c33c1937564800000821061236c5750600f919050565b69032d26d12e980b60000082106123855750600d919050565b69021e19e0c9bab2400000821061239e5750600a919050565b69010f0cf064dd5920000082106123b757506008919050565b685150ae84a8cdf0000082106123cf57506005919050565b505f919050565b6001600160a01b0382165f90815260186020526040812054900361243f57601980546001810182555f919091527f944998273e477b495144fb8794c914197f3ccb46be2900f4698fd0ef743c96950180546001600160a01b0319166001600160a01b0384161790555b6001600160a01b0382165f9081526018602052604081208054839290612466908490612eee565b9091555050506001600160a01b03165f90815260186020526040902042600190910155565b6001600160a01b0383165f818152601660209081526040808320815160a08101835287815280840185815281840188815242606080850182815260808087018b8152885460018082018b55998d529b8b902097516005909c029097019a8b559451968a0196909655915160028901559351600388015591516004909601805460ff1916961515969096179095558251958652928501879052908401859052908301527f3c68c90bb3ef39886091529d350c03d7c3648177c30376125370608acc3068d4910160405180910390a1505050565b5f81831161256b5781611ad4565b50815b92915050565b5f81831061256b5781611ad4565b600b546125b190839061259e906001600160a01b0316846121d3565b600b546001600160a01b0316919061216f565b604080516001600160a01b0384168152602081018390527fc7798891864187665ac6dd119286e44ec13f014527aeeb2b8eb3fd413df931799101610b16565b6125f86128d5565b5f805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b0390911681526020016120a4565b5f80546001600160a01b03838116610100818102610100600160a81b0319851617855560405193049190911692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a35050565b61269c61225b565b5f805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586126243390565b604080516080810182528481526020810184905290810182905260016060820152601280545f929160159184918261270783612f37565b90915550815260208082019290925260409081015f20835181558383015160018201558382015160028201556060938401516003909101805460ff1916911515919091179055601254815190815291820187905281018590529081018390527ffb857b5ffd91e3fbb73825c1ad7f178bf8ddc437f75f461572f81a05d4e9a1a09060800160405180910390a1506012549392505050565b5f670de0b6b3a7640000836001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa1580156127e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906128089190612f8a565b61281390600a61308a565b6122519084612f01565b6040516001600160a01b03848116602483015283811660448301526064820183905261108d9186918216906323b872dd9060840161219c565b5f61286a6001600160a01b038416836128f7565b905080515f1415801561288e57508080602001905181019061288c91906130fd565b155b156121ce57604051635274afe760e01b81526001600160a01b03841660048201526024016109de565b5f6128c382600a613118565b61225184670de0b6b3a7640000612f01565b5f5460ff166113de57604051638dfc202b60e01b815260040160405180910390fd5b6060611ad483835f845f80856001600160a01b0316848660405161291b9190613123565b5f6040518083038185875af1925050503d805f8114612955576040519150601f19603f3d011682016040523d82523d5f602084013e61295a565b606091505b509150915061296a868383612974565b9695505050505050565b60608261298957612984826129d0565b611ad4565b81511580156129a057506001600160a01b0384163b155b156129c957604051639996b31560e01b81526001600160a01b03851660048201526024016109de565b5080611ad4565b8051156129e05780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114612a0f575f80fd5b919050565b5f60208284031215612a24575f80fd5b611ad4826129f9565b5f8060408385031215612a3e575f80fd5b612a47836129f9565b946020939093013593505050565b80151581146120e8575f80fd5b5f8060408385031215612a73575f80fd5b612a7c836129f9565b91506020830135612a8c81612a55565b809150509250929050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612ad457612ad4612a97565b604052919050565b5f67ffffffffffffffff821115612af557612af5612a97565b5060051b60200190565b5f82601f830112612b0e575f80fd5b81356020612b23612b1e83612adc565b612aab565b8083825260208201915060208460051b870101935086841115612b44575f80fd5b602086015b84811015612b6757612b5a816129f9565b8352918301918301612b49565b509695505050505050565b5f82601f830112612b81575f80fd5b81356020612b91612b1e83612adc565b8083825260208201915060208460051b870101935086841115612bb2575f80fd5b602086015b84811015612b675780358352918301918301612bb7565b5f805f60608486031215612be0575f80fd5b833567ffffffffffffffff80821115612bf7575f80fd5b612c0387838801612aff565b94506020860135915080821115612c18575f80fd5b612c2487838801612b72565b93506040860135915080821115612c39575f80fd5b50612c4686828701612b72565b9150509250925092565b5f60208284031215612c60575f80fd5b5035919050565b602080825282518282018190525f9190848201906040850190845b81811015612cd557612cc2838551805182526020810151602083015260408101516040830152606081015160608301526080810151151560808301525050565b9284019260a09290920191600101612c82565b50909695505050505050565b5f805f60608486031215612cf3575f80fd5b833567ffffffffffffffff80821115612d0a575f80fd5b612d1687838801612aff565b94506020860135915080821115612d2b575f80fd5b50612d3886828701612b72565b925050604084013590509250925092565b60a0810161256e8284805182526020810151602083015260408101516040830152606081015160608301526080810151151560808301525050565b5f815180845260208085019450602084015f5b83811015612dbc5781516001600160a01b031687529582019590820190600101612d97565b509495945050505050565b604081525f612dd96040830185612d84565b8281036020848101919091528451808352858201928201905f5b81811015612e0f57845183529383019391830191600101612df3565b5090979650505050505050565b602081525f611ad46020830184612d84565b5f805f60608486031215612e40575f80fd5b505081359360208301359350604090920135919050565b5f805f8060808587031215612e6a575f80fd5b612e73856129f9565b935060208501359250612e88604086016129f9565b91506060850135612e9881612a55565b939692955090935050565b60208082526017908201527f5472616e73616374696f6e20696e2070726f6772657373000000000000000000604082015260600190565b634e487b7160e01b5f52601160045260245ffd5b8082018082111561256e5761256e612eda565b808202811582820484141761256e5761256e612eda565b5f82612f3257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60018201612f4857612f48612eda565b5060010190565b634e487b7160e01b5f52603260045260245ffd5b8181038181111561256e5761256e612eda565b634e487b7160e01b5f52603160045260245ffd5b5f60208284031215612f9a575f80fd5b815160ff81168114611ad4575f80fd5b600181815b80851115612fe457815f1904821115612fca57612fca612eda565b80851615612fd757918102915b93841c9390800290612faf565b509250929050565b5f82612ffa5750600161256e565b8161300657505f61256e565b816001811461301c576002811461302657613042565b600191505061256e565b60ff84111561303757613037612eda565b50506001821b61256e565b5060208310610133831016604e8410600b8410161715613065575081810a61256e565b61306f8383612faa565b805f190482111561308257613082612eda565b029392505050565b5f611ad460ff841683612fec565b805169ffffffffffffffffffff81168114612a0f575f80fd5b5f805f805f60a086880312156130c5575f80fd5b6130ce86613098565b94506020860151935060408601519250606086015191506130f160808701613098565b90509295509295909350565b5f6020828403121561310d575f80fd5b8151611ad481612a55565b5f611ad48383612fec565b5f82515f5b818110156131425760208186018101518583015201613128565b505f92019182525091905056fea26469706673582212201821934dce0f6d662c9c468440110feea1aa6efb33f6a74c61743b74d4db90bb64736f6c63430008180033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000000000000000000000b5e620f480000000000000000000000000006da180ed33e28bda8cdc99cf706fc6ebcb208ea20000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
-----Decoded View---------------
Arg [0] : priceInUSD_ (uint256): 200000000000000
Arg [1] : treasaryWallet_ (address): 0x6da180eD33e28BDa8cDc99CF706fC6eBcB208EA2
Arg [2] : nativePriceOracle_ (address): 0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000b5e620f48000
Arg [1] : 0000000000000000000000006da180ed33e28bda8cdc99cf706fc6ebcb208ea2
Arg [2] : 0000000000000000000000005f4ec3df9cbd43714fe2740f5e3616155c5b8419
Deployed Bytecode Sourcemap
45350:22034:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50564:123;;;;;;;;;;-1:-1:-1;50564:123:0;;;;;:::i;:::-;;:::i;:::-;;50454:102;;;;;;;;;;-1:-1:-1;50533:15:0;;-1:-1:-1;;;;;50533:15:0;50454:102;;;-1:-1:-1;;;;;547:32:1;;;529:51;;517:2;502:18;50454:102:0;;;;;;;;59439:208;;;;;;;;;;-1:-1:-1;59439:208:0;;;;;:::i;:::-;;:::i;46086:24::-;;;;;;;;;;;;;;;;;;;996:25:1;;;984:2;969:18;46086:24:0;850:177:1;64494:901:0;;;;;;;;;;;;;:::i;67266:115::-;;;;;;;;;;-1:-1:-1;67266:115:0;;;;;:::i;:::-;-1:-1:-1;;;;;67354:12:0;67327:7;67354:12;;;:6;:12;;;;;:19;;67266:115;56393:2285;;;;;;:::i;:::-;;:::i;49706:115::-;;;;;;;;;;-1:-1:-1;49788:25:0;;;;;-1:-1:-1;;;;;49788:25:0;49706:115;;49829:138;;;;;;;;;;-1:-1:-1;49829:138:0;;;;;:::i;:::-;;:::i;65403:804::-;;;;;;;;;;-1:-1:-1;65403:804:0;;;;;:::i;:::-;;:::i;47519:43::-;;;;;;;;;;-1:-1:-1;47519:43:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;4427:25:1;;;4483:2;4468:18;;4461:34;;;;4400:18;47519:43:0;4253:248:1;50095:125:0;;;;;;;;;;-1:-1:-1;50095:125:0;;;;;:::i;:::-;;:::i;60506:1632::-;;;;;;;;;;-1:-1:-1;60506:1632:0;;;;;:::i;:::-;;:::i;66215:140::-;;;;;;;;;;-1:-1:-1;66215:140:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;59852:65::-;;;;;;;;;;;;;:::i;62553:574::-;;;;;;;;;;-1:-1:-1;62553:574:0;;;;;:::i;:::-;;:::i;46414:54::-;;;;;;;;;;-1:-1:-1;46414:54:0;;;;;:::i;:::-;;:::i;:::-;;;;6673:25:1;;;6729:2;6714:18;;6707:34;;;;6757:18;;;6750:34;;;;6815:2;6800:18;;6793:34;6871:14;6864:22;6858:3;6843:19;;6836:51;6660:3;6645:19;46414:54:0;6420:473:1;2910:86:0;;;;;;;;;;-1:-1:-1;2957:4:0;2981:7;;;2910:86;;;7063:14:1;;7056:22;7038:41;;7026:2;7011:18;2910:86:0;6898:187:1;49292:123:0;;;;;;;;;;-1:-1:-1;49292:123:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;49975:112::-;;;;;;;;;;-1:-1:-1;50058:21:0;;49975:112;;50338:108;;;;;;;;;;-1:-1:-1;50338:108:0;;;;;:::i;:::-;;:::i;46348:59::-;;;;;;;;;;-1:-1:-1;46348:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7573:25:1;;;7629:2;7614:18;;7607:34;;;;7657:18;;;7650:34;7727:14;7720:22;7715:2;7700:18;;7693:50;7560:3;7545:19;46348:59:0;7348:401:1;50883:438:0;;;;;;;;;;-1:-1:-1;50883:438:0;;;;;:::i;:::-;;:::i;66804:392::-;;;;;;;;;;;;;:::i;:::-;;;;;;;;:::i;46182:52::-;;;;;;;;;;-1:-1:-1;46182:52:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;46182:52:0;;;6304:103;;;;;;;;;;;;;:::i;51329:845::-;;;;;;;;;;-1:-1:-1;51329:845:0;;;;;:::i;:::-;;:::i;62439:106::-;;;;;;;;;;-1:-1:-1;62439:106:0;;;;;:::i;:::-;;:::i;45990:52::-;;;;;;;;;;-1:-1:-1;45990:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50695:180;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;59783:61::-;;;;;;;;;;;;;:::i;49423:114::-;;;;;;;;;;-1:-1:-1;49508:21:0;;-1:-1:-1;;;;;49508:21:0;49423:114;;46051:28;;;;;;;;;;;;;;;;63785:349;;;;;;;;;;-1:-1:-1;63785:349:0;;;;;:::i;:::-;;:::i;5629:87::-;;;;;;;;;;-1:-1:-1;5675:7:0;5702:6;;;;-1:-1:-1;;;;;5702:6:0;5629:87;;48769:515;;;;;;;;;;-1:-1:-1;49084:16:0;;49131:18;;49176;;49227:14;;49265:11;;48769:515;;;9879:25:1;;;9935:2;9920:18;;9913:34;;;;9963:18;;;9956:34;;;;10021:2;10006:18;;9999:34;10064:3;10049:19;;10042:35;9866:3;9851:19;48769:515:0;9620:463:1;46309:30:0;;;;;;;;;;;;;;;;64270:216;;;;;;;;;;-1:-1:-1;64270:216:0;;;;;:::i;:::-;;:::i;53581:2804::-;;;;;;;;;;-1:-1:-1;53581:2804:0;;;;;:::i;:::-;;:::i;52563:127::-;;;;;;;;;;;;;:::i;50228:102::-;;;;;;;;;;-1:-1:-1;50311:11:0;;50228:102;;52698:292;;;;;;;;;;-1:-1:-1;52698:292:0;;;;;:::i;:::-;;:::i;52998:114::-;;;;;;;;;;-1:-1:-1;52998:114:0;;;;;:::i;:::-;-1:-1:-1;;;;;53085:19:0;;;;52998:114;46119:56;;;;;;;;;;-1:-1:-1;46119:56:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;46119:56:0;;;59655:120;;;;;;;;;;;;;:::i;64142:::-;;;;;;;;;;;;;:::i;6562:220::-;;;;;;;;;;-1:-1:-1;6562:220:0;;;;;:::i;:::-;;:::i;47612:24::-;;;;;;;;;;-1:-1:-1;47612:24:0;;;;;:::i;:::-;;:::i;49545:153::-;;;;;;;;;;-1:-1:-1;49545:153:0;;;;;:::i;:::-;;:::i;50564:123::-;5515:13;:11;:13::i;:::-;50646:15:::1;:33:::0;;-1:-1:-1;;;;;;50646:33:0::1;-1:-1:-1::0;;;;;50646:33:0;;;::::1;::::0;;;::::1;::::0;;50564:123::o;59439:208::-;48634:14;;;;48633:15;48625:51;;;;-1:-1:-1;;;48625:51:0;;;;;;;:::i;:::-;;;;;;;;;48687:14;:21;;-1:-1:-1;;48687:21:0;48704:4;48687:21;;;5515:13:::1;:11;:13::i;:::-;5675:7:::0;5702:6;59574:65:::2;::::0;5702:6;;;-1:-1:-1;;;;;5702:6:0;-1:-1:-1;;;;;59574:43:0;::::2;::::0;59627:11;59574:43:::2;:65::i;:::-;-1:-1:-1::0;;48731:14:0;:22;;-1:-1:-1;;48731:22:0;;;59439:208::o;64494:901::-;64590:10;64549:21;64573:28;;;:16;:28;;;;;64660:21;;64696:23;;;;64573:28;;64549:21;64639:91;;-1:-1:-1;;;;;64660:21:0;;64639:6;:91::i;:::-;64612:118;;64838:1;64819:16;:20;64811:55;;;;-1:-1:-1;;;64811:55:0;;11105:2:1;64811:55:0;;;11087:21:1;11144:2;11124:18;;;11117:30;-1:-1:-1;;;11163:18:1;;;11156:52;11225:18;;64811:55:0;10903:346:1;64811:55:0;64944:21;;64929:117;;-1:-1:-1;;;;;64944:21:0;64994:10;65019:16;64929:50;:117::i;:::-;65135:4;:23;;;65101:4;:30;;;:57;;;;;;;:::i;:::-;;;;-1:-1:-1;;65262:1:0;65236:23;;;:27;65346:30;;;;65281:106;;;65321:10;11690:51:1;;11772:2;11757:18;;11750:34;;;;65281:106:0;;11663:18:1;65281:106:0;;;;;;;;64538:857;;64494:901::o;56393:2285::-;48634:14;;;;48633:15;48625:51;;;;-1:-1:-1;;;48625:51:0;;;;;;;:::i;:::-;48687:14;:21;;-1:-1:-1;;48687:21:0;48704:4;48687:21;;;2515:19:::1;:17;:19::i;:::-;56656:25:::2;::::0;56553:10:::2;::::0;56593:9:::2;::::0;56533:17:::2;::::0;56710:7:::2;::::0;56593:9;;56636:46:::2;::::0;56656:25:::2;::::0;::::2;-1:-1:-1::0;;;;;56656:25:0::2;56636:19;:46::i;:::-;:70;;;;:::i;:::-;56635:82;;;;:::i;:::-;56613:104;;56730:22;56767:21:::0;56817:11:::2;;56792;56806:7;56792:21;;;;:::i;:::-;56791:37;;;;:::i;:::-;56767:61;;56841:23;56867:31;56886:11;56867:18;:31::i;:::-;56841:57:::0;-1:-1:-1;56909:19:0::2;56967:3;56932:31;56841:57:::0;56932:13;:31:::2;:::i;:::-;56931:39;;;;:::i;:::-;56909:61:::0;-1:-1:-1;56981:19:0::2;57003:27;57017:13:::0;56909:61;57003:27:::2;:::i;:::-;56981:49:::0;-1:-1:-1;;;;;;53085:19:0;;;57043:641:::2;;57154:3;57132:18;;57116:13;:34;;;;:::i;:::-;57115:42;;;;:::i;:::-;-1:-1:-1::0;;;;;57206:33:0;::::2;57174:29;57206:33:::0;;;:16:::2;:33;::::0;;;;57254:31:::2;::::0;::::2;:49:::0;;57098:59;;-1:-1:-1;57206:33:0;;57098:59;;57174:29;57254:49:::2;::::0;57098:59;;57254:49:::2;:::i;:::-;;;;;;;;57348:1;57318:12;:26;;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;57371:19:0::2;::::0;::::2;::::0;::::2;;57366:162;;57411:19;::::0;::::2;:26:::0;;-1:-1:-1;;57411:26:0::2;57433:4;57411:26;::::0;;57478:13:::2;:15:::0;;57497;;57456:21:::2;::::0;57411:19:::2;::::0;;57478:15:::2;::::0;::::2;:::i;:::-;;;;;57456:38;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;57456:56:0::2;;;;;-1:-1:-1::0;;;;;57456:56:0::2;;;;;;57366:162;57626:31;::::0;::::2;::::0;57549:123:::2;::::0;;-1:-1:-1;;;;;11708:32:1;;11690:51;;11772:2;11757:18;;11750:34;;;;57549:123:0::2;::::0;11663:18:1;57549:123:0::2;;;;;;;57083:601;57043:641;57733:21;;57718:11;:36;;57696:118;;;::::0;-1:-1:-1;;;57696:118:0;;12532:2:1;57696:118:0::2;::::0;::::2;12514:21:1::0;;;12551:18;;;12544:30;12610:34;12590:18;;;12583:62;12662:18;;57696:118:0::2;12330:356:1::0;57696:118:0::2;57835:15;::::0;57827:43:::2;::::0;-1:-1:-1;;;;;57835:15:0;;::::2;::::0;57827:43;::::2;;;::::0;57861:8;;57835:15:::2;57827:43:::0;57835:15;57827:43;57861:8;57835:15;57827:43;::::2;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;;;;;;57911:27:0;::::2;57883:25;57911:27:::0;;;:16:::2;:27;::::0;;;;57949:37;;57911:27;;57975:11;;57911:27;;57883:25;57949:37:::2;::::0;57975:11;;57949:37:::2;:::i;:::-;::::0;;;-1:-1:-1;;58004:15:0::2;::::0;::::2;::::0;::::2;;57999:128;;58036:15;::::0;::::2;:22:::0;;-1:-1:-1;;58036:22:0::2;58054:4;58036:22;::::0;;58091:9:::2;:11:::0;;58106:9;;58073:17:::2;::::0;58036:15:::2;::::0;;58091:11:::2;::::0;::::2;:::i;:::-;;;;;58073:30;;;;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;58073:42:0::2;;;;;-1:-1:-1::0;;;;;58073:42:0::2;;;;;;57999:128;58159:11;58139:16;;:31;;;;;;;:::i;:::-;;;;;;;;58203:11;58181:18;;:33;;;;;;;:::i;:::-;;;;;;;;58247:8;58225:18;;:30;;;;;;;:::i;:::-;;;;;;;;58284:14;58266;;:32;;;;;;;:::i;:::-;;;;;;;;58324:11;58309;;:26;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;58456:11:0::2;::::0;58353:151:::2;::::0;;-1:-1:-1;;;;;12968:32:1;;12950:51;;13032:2;13017:18;;13010:34;;;13060:18;;;13053:34;;;13118:2;13103:18;;13096:34;;;;13161:3;13146:19;;13139:35;;;58353:151:0;::::2;::::0;;;;12937:3:1;58353:151:0;;::::2;58521:7;58517:154;;;58545:29;58551:9;58562:11;58545:5;:29::i;:::-;58517:154;;;58607:52;58622:9;58633:11;58646:12;;58607:14;:52::i;:::-;-1:-1:-1::0;;48731:14:0;:22;;-1:-1:-1;;48731:22:0;;;-1:-1:-1;;;;;;;;;56393:2285:0:o;49829:138::-;5515:13;:11;:13::i;:::-;49915:25:::1;:44:::0;;-1:-1:-1;;;;;49915:44:0;;::::1;;;-1:-1:-1::0;;;;;;49915:44:0;;::::1;::::0;;;::::1;::::0;;49829:138::o;65403:804::-;5515:13;:11;:13::i;:::-;65661:15:::1;:22;65632:18;:25;:51;:128;;;;;65733:20;:27;65704:18;:25;:56;65632:128;65610:216;;;::::0;-1:-1:-1;;;65610:216:0;;13387:2:1;65610:216:0::1;::::0;::::1;13369:21:1::0;13426:2;13406:18;;;13399:30;13465:34;13445:18;;;13438:62;-1:-1:-1;;;13516:18:1;;;13509:36;13562:19;;65610:216:0::1;13185:402:1::0;65610:216:0::1;65844:9;65839:361;65863:18;:25;65859:1;:29;65839:361;;;65910:29;65942:16;:71;65977:18;65996:1;65977:21;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;65942:71:0::1;-1:-1:-1::0;;;;;65942:71:0::1;;;;;;;;;;;;65910:103;;66057:15;66073:1;66057:18;;;;;;;;:::i;:::-;;;;;;;66028:12;:26;;:47;;;;66124:20;66145:1;66124:23;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;66090:31:::1;::::0;::::1;:57:::0;66162:19:::1;;:26:::0;;-1:-1:-1;;66162:26:0::1;66184:4;66162:26:::0;;::::1;::::0;;;65890:3:::1;65839:361;;;;65403:804:::0;;;:::o;50095:125::-;5515:13;:11;:13::i;:::-;50177:21:::1;:35:::0;50095:125::o;60506:1632::-;60564:7;;60575:1;60564:12;60556:48;;;;-1:-1:-1;;;60556:48:0;;13926:2:1;60556:48:0;;;13908:21:1;13965:2;13945:18;;;13938:30;14004:25;13984:18;;;13977:53;14047:18;;60556:48:0;13724:347:1;60556:48:0;60670:10;60615:38;60656:25;;;:13;:25;;;;;60708:23;;60702:29;;60694:69;;;;-1:-1:-1;;;60694:69:0;;14278:2:1;60694:69:0;;;14260:21:1;14317:2;14297:18;;;14290:30;14356:29;14336:18;;;14329:57;14403:18;;60694:69:0;14076:351:1;60694:69:0;60774:31;60808:16;60825:3;60808:21;;;;;;;;:::i;:::-;;;;;;;;;;;60774:55;;60842:32;60877:16;:65;60908:11;:23;;;60877:65;;;;;;;;;;;60842:100;;60953:19;61006:40;61015:7;;61024:11;:21;;;61006:8;:40::i;:::-;60975:71;;:15;:71;:::i;:::-;61095:22;;;;60953:93;;-1:-1:-1;61059:18:0;;61095:22;;61094:23;:54;;;;-1:-1:-1;61121:22:0;;:27;;61094:54;61090:885;;;61233:22;;61212:18;;61259:3;;61212:43;;;:::i;:::-;61211:51;;;;:::i;:::-;61277:22;;;:29;;-1:-1:-1;;61277:29:0;61302:4;61277:29;;;61198:64;-1:-1:-1;61090:885:0;;;61420:8;:24;;;61405:11;:39;;61379:131;;;;-1:-1:-1;;;61379:131:0;;14767:2:1;61379:131:0;;;14749:21:1;14806:2;14786:18;;;14779:30;14845:32;14825:18;;;14818:60;14895:18;;61379:131:0;14565:354:1;61379:131:0;61527:14;61558:8;:24;;;61544:11;:38;;;;:::i;:::-;61527:55;;61597:30;61682:8;:26;;;61673:6;:35;;;;:::i;:::-;61630:22;;:79;;;;:::i;:::-;61597:112;;61751:37;61760:22;61784:3;61751:8;:37::i;:::-;61726:62;;61803:23;61894:3;61868:22;61830:11;:18;;;:60;;;;:::i;:::-;61829:68;;;;:::i;:::-;61803:94;;61943:11;:20;;;61925:15;:38;;;;:::i;:::-;61912:51;;61324:651;;;61090:885;62008:1;61995:10;:14;61987:47;;;;-1:-1:-1;;;61987:47:0;;15126:2:1;61987:47:0;;;15108:21:1;15165:2;15145:18;;;15138:30;-1:-1:-1;;;15184:18:1;;;15177:50;15244:18;;61987:47:0;14924:344:1;61987:47:0;62071:10;62047:11;:20;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;62092:38:0;;-1:-1:-1;62107:10:0;62119;62092:14;:38::i;:::-;60545:1593;;;;;60506:1632;:::o;66215:140::-;-1:-1:-1;;;;;66327:20:0;;;;;;:13;:20;;;;;;;;66320:27;;;;;;;;;;;;;;;;;66287:20;;66320:27;;66327:20;;66320:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66215:140;;;:::o;59852:65::-;5515:13;:11;:13::i;:::-;59899:10:::1;:8;:10::i;:::-;59852:65::o:0;62553:574::-;5515:13;:11;:13::i;:::-;62730:9:::1;62725:395;62749:14;:21;62745:1;:25;62725:395;;;62792:13;:32;62806:14;62821:1;62806:17;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;62792:32:0::1;-1:-1:-1::0;;;;;62792:32:0::1;;;;;;;;;;;;62848:245;;;;;;;;62891:8;62900:1;62891:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;62848:245;;62935:1:::1;62848:245:::0;;::::1;::::0;;;;;;;;;;63018:15:::1;62848:245:::0;;;;;;;;;;;;;;;62792:316;;62848:245;62792:316;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;;::::0;;;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;62792:316:0::1;::::0;::::1;;::::0;;;::::1;::::0;;62772:3:::1;62725:395;;46414:54:::0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46414:54:0;;-1:-1:-1;46414:54:0;;;;;:::o;49292:123::-;49350:15;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49350:15:0;-1:-1:-1;;;;;;49385:22:0;;;;;:16;:22;;;;;;;;;49378:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49292:123::o;50338:108::-;5515:13;:11;:13::i;:::-;50413:11:::1;:25:::0;50338:108::o;50883:438::-;5515:13;:11;:13::i;:::-;-1:-1:-1;;;;;50988:39:0;::::1;50964:21;50988:39:::0;;;:23:::1;:39;::::0;;;;;::::1;;51060:17:::0;::::1;51038:111;;;::::0;-1:-1:-1;;;51038:111:0;;15475:2:1;51038:111:0::1;::::0;::::1;15457:21:1::0;15514:2;15494:18;;;15487:30;15553:34;15533:18;;;15526:62;-1:-1:-1;;;15604:18:1;;;15597:42;15656:19;;51038:111:0::1;15273:408:1::0;51038:111:0::1;-1:-1:-1::0;;;;;51162:39:0;::::1;;::::0;;;:23:::1;:39;::::0;;;;;;;:46;;-1:-1:-1;;51162:46:0::1;51204:4;51162:46:::0;;::::1;::::0;;;51219:20:::1;:41:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;51219:41:0::1;::::0;::::1;::::0;;51278:35;;529:51:1;;;51278:35:0::1;::::0;502:18:1;51278:35:0::1;383:203:1::0;66804:392:0;66953:7;:14;66879:16;;;;66931:19;66953:14;67005:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67005:26:0;;66978:53;;67049:9;67044:107;67068:11;67064:1;:15;67044:107;;;67114:6;:18;67121:7;67129:1;67121:10;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;67121:10:0;67114:18;;;;;;;;;;;;:25;67101:10;;:7;;67109:1;;67101:10;;;;;;:::i;:::-;;;;;;;;;;:38;67081:3;;67044:107;;;;67171:7;67180;67163:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67163:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66804:392;;:::o;6304:103::-;5515:13;:11;:13::i;:::-;6369:30:::1;6396:1;6369:18;:30::i;51329:845::-:0;5515:13;:11;:13::i;:::-;-1:-1:-1;;;;;51437:39:0;::::1;51413:21;51437:39:::0;;;:23:::1;:39;::::0;;;;;::::1;;::::0;51487:125:::1;;;::::0;-1:-1:-1;;;51487:125:0;;15888:2:1;51487:125:0::1;::::0;::::1;15870:21:1::0;15927:2;15907:18;;;15900:30;15966:34;15946:18;;;15939:62;16037:29;16017:18;;;16010:57;16084:19;;51487:125:0::1;15686:423:1::0;51487:125:0::1;-1:-1:-1::0;;;;;51625:39:0;::::1;51667:5;51625:39:::0;;;:23:::1;:39;::::0;;;;;;;:47;;-1:-1:-1;;51625:47:0::1;::::0;;51724:20:::1;51685:59:::0;;;;;;::::1;::::0;;;;;;;;;;;;51724:20;;51685:59;;::::1;51724:20:::0;51685:59;;::::1;;;;;;;;;;;;;;;;::::0;;-1:-1:-1;;;;;51685:59:0::1;::::0;;;;;::::1;::::0;::::1;;::::0;;::::1;;;;;;;;;;;51762:9;51757:410;51777:19;:26;51773:1;:30;51757:410;;;51856:14;-1:-1:-1::0;;;;;51829:41:0::1;:20;51850:1;51829:23;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;-1:-1:-1;;;;;51829:23:0::1;:41:::0;51825:331:::1;;51917:20;51960:27:::0;;:31:::1;::::0;51990:1:::1;::::0;51960:31:::1;:::i;:::-;51917:93;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;::::1;::::0;51891:20:::1;:23:::0;;-1:-1:-1;;;;;51917:93:0;;::::1;::::0;51912:1;;51891:23;::::1;;;;;:::i;:::-;;;;;;;;;:119;;;;;-1:-1:-1::0;;;;;51891:119:0::1;;;;;-1:-1:-1::0;;;;;51891:119:0::1;;;;;;52029:20;:26;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;-1:-1:-1;;52029:26:0;;;;;;;-1:-1:-1;;;;;;52029:26:0::1;::::0;;;;;;;;52079:37:::1;::::0;-1:-1:-1;;;;;547:32:1;;529:51;;52079:37:0::1;::::0;502:18:1;52079:37:0::1;;;;;;;52135:5;;51825:331;51805:3;;51757:410;;62439:106:::0;5515:13;:11;:13::i;:::-;62511:12:::1;:26:::0;62439:106::o;50695:180::-;50779:32;50847:20;50829:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;50829:38:0;;;;;;;;;;;;;;;;;;;;;;;50695:180;:::o;59783:61::-;5515:13;:11;:13::i;:::-;59828:8:::1;:6;:8::i;63785:349::-:0;63950:7;5515:13;:11;:13::i;:::-;63990:136:::1;64028:13;64060:15;64094:17;63990:19;:136::i;:::-;63970:156;;5539:1;63785:349:::0;;;;;:::o;64270:216::-;5515:13;:11;:13::i;:::-;64376:18:::1;:40:::0;;;64432:46:::1;::::0;996:25:1;;;64432:46:0::1;::::0;984:2:1;969:18;64432:46:0::1;;;;;;;64270:216:::0;:::o;53581:2804::-;48634:14;;;;48633:15;48625:51;;;;-1:-1:-1;;;48625:51:0;;;;;;;:::i;:::-;48687:14;:21;;-1:-1:-1;;48687:21:0;48704:4;48687:21;;;2515:19:::1;:17;:19::i;:::-;-1:-1:-1::0;;;;;53797:39:0;::::2;;::::0;;;:23:::2;:39;::::0;;;;;::::2;;53775:111;;;::::0;-1:-1:-1;;;53775:111:0;;16448:2:1;53775:111:0::2;::::0;::::2;16430:21:1::0;16487:2;16467:18;;;16460:30;-1:-1:-1;;;16506:18:1;;;16499:52;16568:18;;53775:111:0::2;16246:346:1::0;53775:111:0::2;54084:11;::::0;53919:10:::2;::::0;54013:11;;53899:17:::2;::::0;54060:20:::2;54013:11:::0;54073:7:::2;54060:20;:::i;:::-;54059:36;;;;:::i;:::-;54035:60;;54108:23;54134:30;54153:10;54134:18;:30::i;:::-;54108:56:::0;-1:-1:-1;54175:19:0::2;54233:3;54198:31;54108:56:::0;54198:13;:31:::2;:::i;:::-;54197:39;;;;:::i;:::-;54175:61:::0;-1:-1:-1;54247:19:0::2;54269:27;54283:13:::0;54175:61;54269:27:::2;:::i;:::-;54247:49:::0;-1:-1:-1;54309:22:0::2;-1:-1:-1::0;;;;;53085:19:0;;;54396:692:::2;;54507:3;54485:18;;54469:13;:34;;;;:::i;:::-;54468:42;;;;:::i;:::-;-1:-1:-1::0;;;;;54559:33:0;::::2;54527:29;54559:33:::0;;;:16:::2;:33;::::0;;;;54607:31:::2;::::0;::::2;:49:::0;;54451:59;;-1:-1:-1;54559:33:0;;54451:59;;54527:29;54607:49:::2;::::0;54451:59;;54607:49:::2;:::i;:::-;;;;;;;;54701:1;54671:12;:26;;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;54775:19:0::2;::::0;::::2;::::0;::::2;;54770:162;;54815:19;::::0;::::2;:26:::0;;-1:-1:-1;;54815:26:0::2;54837:4;54815:26;::::0;;54882:13:::2;:15:::0;;54901;;54860:21:::2;::::0;54815:19:::2;::::0;;54882:15:::2;::::0;::::2;:::i;:::-;;;;;54860:38;;;;;;;;;;;;:56;;;;;-1:-1:-1::0;;;;;54860:56:0::2;;;;;-1:-1:-1::0;;;;;54860:56:0::2;;;;;;54770:162;55030:31;::::0;::::2;::::0;54953:123:::2;::::0;;-1:-1:-1;;;;;11708:32:1;;11690:51;;11772:2;11757:18;;11750:34;;;;54953:123:0::2;::::0;11663:18:1;54953:123:0::2;;;;;;;54436:652;54396:692;55136:21;;55122:10;:35;;55100:117;;;::::0;-1:-1:-1;;;55100:117:0;;16799:2:1;55100:117:0::2;::::0;::::2;16781:21:1::0;;;16818:18;;;16811:30;16877:34;16857:18;;;16850:62;16929:18;;55100:117:0::2;16597:356:1::0;55100:117:0::2;55281:24;55308:41;55321:14;55337:11;55308:12;:41::i;:::-;55446:15;::::0;55281:68;;-1:-1:-1;55360:143:0::2;::::0;-1:-1:-1;;;;;55360:47:0;;::::2;::::0;55422:9;;55446:15:::2;55281:68:::0;55360:47:::2;:143::i;:::-;-1:-1:-1::0;;;;;55544:27:0;::::2;55516:25;55544:27:::0;;;:16:::2;:27;::::0;;;;55584:37;;55544:27;;55610:11;;55544:27;;55516:25;55584:37:::2;::::0;55610:11;;55584:37:::2;:::i;:::-;::::0;;;-1:-1:-1;;55686:15:0::2;::::0;::::2;::::0;::::2;;55681:128;;55718:15;::::0;::::2;:22:::0;;-1:-1:-1;;55718:22:0::2;55736:4;55718:22;::::0;;55773:9:::2;:11:::0;;55788:9;;55755:17:::2;::::0;55718:15:::2;::::0;;55773:11:::2;::::0;::::2;:::i;:::-;;;;;55755:30;;;;;;;;;;;;:42;;;;;-1:-1:-1::0;;;;;55755:42:0::2;;;;;-1:-1:-1::0;;;;;55755:42:0::2;;;;;;55681:128;55876:11;55856:16;;:31;;;;;;;:::i;:::-;;;;;;;;55920:11;55898:18;;:33;;;;;;;:::i;:::-;;;;;;;;55960:14;55942;;:32;;;;;;;:::i;:::-;;;;;;;;56000:11;55985;;:26;;;;;;;:::i;:::-;;;;;;;;56029:182;56056:9;56080:14;56109:11;56135:13;56163:11;;56189;56029:182;;;;;;;;;;-1:-1:-1::0;;;;;17301:15:1;;;17283:34;;17353:15;;;;17348:2;17333:18;;17326:43;17400:2;17385:18;;17378:34;;;;17443:2;17428:18;;17421:34;17486:3;17471:19;;17464:35;17263:3;17515:19;;17508:35;;;;17232:3;17217:19;;16958:591;56029:182:0::2;;;;;;;;56228:7;56224:154;;;56252:29;56258:9;56269:11;56252:5;:29::i;:::-;56224:154;;;56314:52;56329:9;56340:11;56353:12;;56314:14;:52::i;:::-;-1:-1:-1::0;;48731:14:0;:22;;-1:-1:-1;;48731:22:0;;;-1:-1:-1;;;;;;;;;;;53581:2804:0:o;52563:127::-;52656:25;;52609:7;;52636:46;;52656:25;;;-1:-1:-1;;;;;52656:25:0;52636:19;:46::i;:::-;52629:53;;52563:127;:::o;52698:292::-;52779:21;52813:19;52911:7;52898:9;52836:46;52856:25;;;;;;;;;-1:-1:-1;;;;;52856:25:0;52836:19;:46::i;:::-;:71;;;;:::i;:::-;52835:83;;;;:::i;:::-;52813:105;;52960:11;;52946;:25;;;;:::i;:::-;52945:37;;52975:7;52945:37;:::i;59655:120::-;5515:13;:11;:13::i;:::-;48634:14:::1;::::0;::::1;;48633:15;48625:51;;;;-1:-1:-1::0;;;48625:51:0::1;;;;;;;:::i;:::-;48687:14;:21:::0;;-1:-1:-1;;48687:21:0::1;48704:4;48687:21;::::0;;59727:7:::2;5675::::0;5702:6;-1:-1:-1;;;;;5702:6:0;;;;;;5629:87;59727:7:::2;-1:-1:-1::0;;;;;59719:25:0::2;:48;59745:21;59719:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;-1:-1:-1::0;48731:14:0::1;:22:::0;;-1:-1:-1;;48731:22:0::1;::::0;;59655:120::o;64142:::-;5515:13;:11;:13::i;:::-;64204:15:::1;64194:7;:25:::0;;;64235:19:::1;::::0;996:25:1;;;64235:19:0::1;::::0;984:2:1;969:18;64235:19:0::1;;;;;;;;64142:120::o:0;6562:220::-;5515:13;:11;:13::i;:::-;-1:-1:-1;;;;;6647:22:0;::::1;6643:93;;6693:31;::::0;-1:-1:-1;;;6693:31:0;;6721:1:::1;6693:31;::::0;::::1;529:51:1::0;502:18;;6693:31:0::1;383:203:1::0;6643:93:0::1;6746:28;6765:8;6746:18;:28::i;:::-;6562:220:::0;:::o;47612:24::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47612:24:0;;-1:-1:-1;47612:24:0;:::o;49545:153::-;5515:13;:11;:13::i;:::-;49650:21:::1;:40:::0;;-1:-1:-1;;;;;;49650:40:0::1;-1:-1:-1::0;;;;;49650:40:0;;;::::1;::::0;;;::::1;::::0;;49545:153::o;5794:166::-;5675:7;5702:6;-1:-1:-1;;;;;5702:6:0;;;;;773:10;5854:23;5850:103;;5901:40;;-1:-1:-1;;;5901:40:0;;773:10;5901:40;;;529:51:1;502:18;;5901:40:0;383:203:1;23729:162:0;23839:43;;-1:-1:-1;;;;;11708:32:1;;;23839:43:0;;;11690:51:1;11757:18;;;11750:34;;;23812:71:0;;23832:5;;23854:14;;;;;11663:18:1;;23839:43:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;23839:43:0;;;;;;;;;;;23812:19;:71::i;:::-;23729:162;;;:::o;58900:254::-;59011:18;59119:14;-1:-1:-1;;;;;59104:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59098:47;;:2;:47;:::i;:::-;59057:24;:14;59074:7;59057:24;:::i;:::-;59056:89;;;;:::i;3069:132::-;2957:4;2981:7;;;3131:63;;;3167:15;;-1:-1:-1;;;3167:15:0;;;;;;;;;;;52182:373;52273:18;52307:13;52352:14;-1:-1:-1;;;;;52330:67:0;;:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52304:95;;;;;;52425:122;52466:6;52510:14;-1:-1:-1;;;;;52488:46:0;;:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52425:122;;:18;:122::i;53189:384::-;53276:7;53314:13;53300:10;:27;53296:42;;-1:-1:-1;53336:2:0;;53189:384;-1:-1:-1;53189:384:0:o;53296:42::-;53367:13;53353:10;:27;53349:42;;-1:-1:-1;53389:2:0;;53189:384;-1:-1:-1;53189:384:0:o;53349:42::-;53420:13;53406:10;:27;53402:42;;-1:-1:-1;53442:2:0;;53189:384;-1:-1:-1;53189:384:0:o;53402:42::-;53473:12;53459:10;:26;53455:40;;-1:-1:-1;53494:1:0;;53189:384;-1:-1:-1;53189:384:0:o;53455:40::-;53524:12;53510:10;:26;53506:40;;-1:-1:-1;53545:1:0;;53189:384;-1:-1:-1;53189:384:0:o;53506:40::-;-1:-1:-1;53564:1:0;;53189:384;-1:-1:-1;53189:384:0:o;66363:372::-;-1:-1:-1;;;;;66437:12:0;;;;;;:6;:12;;;;;:19;:24;;66433:132;;66478:7;:18;;;;;;;-1:-1:-1;66478:18:0;;;;;;;;-1:-1:-1;;;;;;66478:18:0;-1:-1:-1;;;;;66478:18:0;;;;;66433:132;-1:-1:-1;;;;;66577:12:0;;;;;;:6;:12;;;;;:34;;66600:11;;66577:12;:34;;66600:11;;66577:34;:::i;:::-;;;;-1:-1:-1;;;;;;;;66650:12:0;;;;;:6;:12;;;;;66675:15;66650:22;;;;:40;66363:372::o;59925:573::-;-1:-1:-1;;;;;60064:27:0;;;;;;:13;:27;;;;;;;;60111:217;;;;;;;;;;;;;;;;;;;;;;60261:15;60111:217;;;;;;;;;;;;;;60064:275;;60111:217;60064:275;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;60064:275:0;;;;;;;;;;;60357:133;;20102:51:1;;;20169:18;;;20162:34;;;20212:18;;;20205:34;;;20255:18;;;20248:34;60357:133:0;;20074:19:1;60357:133:0;;;;;;;59925:573;;;:::o;31305:106::-;31363:7;31394:1;31390;:5;:13;;31402:1;31390:13;;;-1:-1:-1;31398:1:0;31305:106;;;;;:::o;31487:::-;31545:7;31576:1;31572;:5;:13;;31584:1;31572:13;;62146:285;62328:21;;62229:141;;62294:12;;62321:38;;-1:-1:-1;;;;;62328:21:0;62351:7;62321:6;:38::i;:::-;62244:21;;-1:-1:-1;;;;;62244:21:0;;62229:141;:50;:141::i;:::-;62386:37;;;-1:-1:-1;;;;;11708:32:1;;11690:51;;11772:2;11757:18;;11750:34;;;62386:37:0;;11663:18:1;62386:37:0;11516:274:1;3811:120:0;2774:16;:14;:16::i;:::-;3880:5:::1;3870:15:::0;;-1:-1:-1;;3870:15:0::1;::::0;;3901:22:::1;773:10:::0;3910:12:::1;3901:22;::::0;-1:-1:-1;;;;;547:32:1;;;529:51;;517:2;502:18;3901:22:0::1;383:203:1::0;6942:191:0;7016:16;7035:6;;-1:-1:-1;;;;;7052:17:0;;;7035:6;7052:17;;;-1:-1:-1;;;;;;7052:17:0;;;;;7085:40;;7035:6;;;;;;;7052:17;;7035:6;;7085:40;;;7005:128;6942:191;:::o;3552:118::-;2515:19;:17;:19::i;:::-;3612:7:::1;:14:::0;;-1:-1:-1;;3612:14:0::1;3622:4;3612:14;::::0;;3642:20:::1;3649:12;773:10:::0;;693:98;63135:642;63354:201;;;;;;;;;;;;;;;;;;;;;;;63539:4;63354:201;;;;63328:20;:22;;63291:7;;63354:201;63311:16;;63291:7;;;63328:22;;;:::i;:::-;;;;-1:-1:-1;63311:40:0;;;;;;;;;;;;;;-1:-1:-1;63311:40:0;:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63311:244:0;;;;;;;;;;63608:20;;63573:156;;20524:25:1;;;20565:18;;;20558:34;;;20608:18;;20601:34;;;20651:18;;;20644:34;;;63573:156:0;;20511:3:1;20496:19;63573:156:0;;;;;;;-1:-1:-1;63749:20:0;;63135:642;;;;;:::o;59162:269::-;59276:20;59416:7;59373:14;-1:-1:-1;;;;;59358:39:0;;:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;59352:47;;:2;:47;:::i;:::-;59338:61;;:11;:61;:::i;24136:270::-;24334:53;;-1:-1:-1;;;;;20947:15:1;;;24334:53:0;;;20929:34:1;20999:15;;;20979:18;;;20972:43;21031:18;;;21024:34;;;24280:118:0;;24314:5;;24349:18;;;;;20864::1;;24334:53:0;20689:375:1;26890:638:0;27314:23;27340:33;-1:-1:-1;;;;;27340:27:0;;27368:4;27340:27;:33::i;:::-;27314:59;;27388:10;:17;27409:1;27388:22;;:57;;;;;27426:10;27415:30;;;;;;;;;;;;:::i;:::-;27414:31;27388:57;27384:137;;;27469:40;;-1:-1:-1;;;27469:40:0;;-1:-1:-1;;;;;547:32:1;;27469:40:0;;;529:51:1;502:18;;27469:40:0;383:203:1;58686:206:0;58800:18;58873:11;58879:5;58873:2;:11;:::i;:::-;58845:24;:14;58862:7;58845:24;:::i;3278:130::-;2957:4;2981:7;;;3337:64;;3374:15;;-1:-1:-1;;;3374:15:0;;;;;;;;;;;18671:178;18771:12;18803:38;18825:6;18833:4;18839:1;18771:12;19463;19477:23;19504:6;-1:-1:-1;;;;;19504:11:0;19523:5;19544:4;19504:55;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19462:97;;;;19577:55;19604:6;19612:7;19621:10;19577:26;:55::i;:::-;19570:62;19184:456;-1:-1:-1;;;;;;19184:456:0:o;20768:597::-;20916:12;20946:7;20941:417;;20970:19;20978:10;20970:7;:19::i;:::-;20941:417;;;21198:17;;:22;:49;;;;-1:-1:-1;;;;;;21224:18:0;;;:23;21198:49;21194:121;;;21275:24;;-1:-1:-1;;;21275:24:0;;-1:-1:-1;;;;;547:32:1;;21275:24:0;;;529:51:1;502:18;;21275:24:0;383:203:1;21194:121:0;-1:-1:-1;21336:10:0;21329:17;;21943:528;22076:17;;:21;22072:392;;22308:10;22302:17;22365:15;22352:10;22348:2;22344:19;22337:44;22072:392;22435:17;;-1:-1:-1;;;22435:17:0;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;591:254::-;659:6;667;720:2;708:9;699:7;695:23;691:32;688:52;;;736:1;733;726:12;688:52;759:29;778:9;759:29;:::i;:::-;749:39;835:2;820:18;;;;807:32;;-1:-1:-1;;;591:254:1:o;1032:118::-;1118:5;1111:13;1104:21;1097:5;1094:32;1084:60;;1140:1;1137;1130:12;1155:315;1220:6;1228;1281:2;1269:9;1260:7;1256:23;1252:32;1249:52;;;1297:1;1294;1287:12;1249:52;1320:29;1339:9;1320:29;:::i;:::-;1310:39;;1399:2;1388:9;1384:18;1371:32;1412:28;1434:5;1412:28;:::i;:::-;1459:5;1449:15;;;1155:315;;;;;:::o;1475:127::-;1536:10;1531:3;1527:20;1524:1;1517:31;1567:4;1564:1;1557:15;1591:4;1588:1;1581:15;1607:275;1678:2;1672:9;1743:2;1724:13;;-1:-1:-1;;1720:27:1;1708:40;;1778:18;1763:34;;1799:22;;;1760:62;1757:88;;;1825:18;;:::i;:::-;1861:2;1854:22;1607:275;;-1:-1:-1;1607:275:1:o;1887:183::-;1947:4;1980:18;1972:6;1969:30;1966:56;;;2002:18;;:::i;:::-;-1:-1:-1;2047:1:1;2043:14;2059:4;2039:25;;1887:183::o;2075:674::-;2129:5;2182:3;2175:4;2167:6;2163:17;2159:27;2149:55;;2200:1;2197;2190:12;2149:55;2236:6;2223:20;2262:4;2286:60;2302:43;2342:2;2302:43;:::i;:::-;2286:60;:::i;:::-;2368:3;2392:2;2387:3;2380:15;2420:4;2415:3;2411:14;2404:21;;2477:4;2471:2;2468:1;2464:10;2456:6;2452:23;2448:34;2434:48;;2505:3;2497:6;2494:15;2491:35;;;2522:1;2519;2512:12;2491:35;2558:4;2550:6;2546:17;2572:148;2588:6;2583:3;2580:15;2572:148;;;2654:23;2673:3;2654:23;:::i;:::-;2642:36;;2698:12;;;;2605;;2572:148;;;-1:-1:-1;2738:5:1;2075:674;-1:-1:-1;;;;;;2075:674:1:o;2754:668::-;2808:5;2861:3;2854:4;2846:6;2842:17;2838:27;2828:55;;2879:1;2876;2869:12;2828:55;2915:6;2902:20;2941:4;2965:60;2981:43;3021:2;2981:43;:::i;2965:60::-;3047:3;3071:2;3066:3;3059:15;3099:4;3094:3;3090:14;3083:21;;3156:4;3150:2;3147:1;3143:10;3135:6;3131:23;3127:34;3113:48;;3184:3;3176:6;3173:15;3170:35;;;3201:1;3198;3191:12;3170:35;3237:4;3229:6;3225:17;3251:142;3267:6;3262:3;3259:15;3251:142;;;3333:17;;3321:30;;3371:12;;;;3284;;3251:142;;3427:821;3579:6;3587;3595;3648:2;3636:9;3627:7;3623:23;3619:32;3616:52;;;3664:1;3661;3654:12;3616:52;3704:9;3691:23;3733:18;3774:2;3766:6;3763:14;3760:34;;;3790:1;3787;3780:12;3760:34;3813:61;3866:7;3857:6;3846:9;3842:22;3813:61;:::i;:::-;3803:71;;3927:2;3916:9;3912:18;3899:32;3883:48;;3956:2;3946:8;3943:16;3940:36;;;3972:1;3969;3962:12;3940:36;3995:63;4050:7;4039:8;4028:9;4024:24;3995:63;:::i;:::-;3985:73;;4111:2;4100:9;4096:18;4083:32;4067:48;;4140:2;4130:8;4127:16;4124:36;;;4156:1;4153;4146:12;4124:36;;4179:63;4234:7;4223:8;4212:9;4208:24;4179:63;:::i;:::-;4169:73;;;3427:821;;;;;:::o;4506:180::-;4565:6;4618:2;4606:9;4597:7;4593:23;4589:32;4586:52;;;4634:1;4631;4624:12;4586:52;-1:-1:-1;4657:23:1;;4506:180;-1:-1:-1;4506:180:1:o;5032:715::-;5261:2;5313:21;;;5383:13;;5286:18;;;5405:22;;;5232:4;;5261:2;5484:15;;;;5458:2;5443:18;;;5232:4;5527:194;5541:6;5538:1;5535:13;5527:194;;;5590:49;5635:3;5626:6;5620:13;4774:5;4768:12;4763:3;4756:25;4830:4;4823:5;4819:16;4813:23;4806:4;4801:3;4797:14;4790:47;4886:4;4879:5;4875:16;4869:23;4862:4;4857:3;4853:14;4846:47;4942:4;4935:5;4931:16;4925:23;4918:4;4913:3;4909:14;4902:47;5012:4;5005:5;5001:16;4995:23;4988:31;4981:39;4974:4;4969:3;4965:14;4958:63;;;4691:336;5590:49;5696:15;;;;5668:4;5659:14;;;;;5563:1;5556:9;5527:194;;;-1:-1:-1;5738:3:1;;5032:715;-1:-1:-1;;;;;;5032:715:1:o;5752:663::-;5879:6;5887;5895;5948:2;5936:9;5927:7;5923:23;5919:32;5916:52;;;5964:1;5961;5954:12;5916:52;6004:9;5991:23;6033:18;6074:2;6066:6;6063:14;6060:34;;;6090:1;6087;6080:12;6060:34;6113:61;6166:7;6157:6;6146:9;6142:22;6113:61;:::i;:::-;6103:71;;6227:2;6216:9;6212:18;6199:32;6183:48;;6256:2;6246:8;6243:16;6240:36;;;6272:1;6269;6262:12;6240:36;;6295:63;6350:7;6339:8;6328:9;6324:24;6295:63;:::i;:::-;6285:73;;;6405:2;6394:9;6390:18;6377:32;6367:42;;5752:663;;;;;:::o;7090:253::-;7276:3;7261:19;;7289:48;7265:9;7319:6;4774:5;4768:12;4763:3;4756:25;4830:4;4823:5;4819:16;4813:23;4806:4;4801:3;4797:14;4790:47;4886:4;4879:5;4875:16;4869:23;4862:4;4857:3;4853:14;4846:47;4942:4;4935:5;4931:16;4925:23;4918:4;4913:3;4909:14;4902:47;5012:4;5005:5;5001:16;4995:23;4988:31;4981:39;4974:4;4969:3;4965:14;4958:63;;;4691:336;7754:465;7807:3;7845:5;7839:12;7872:6;7867:3;7860:19;7898:4;7927;7922:3;7918:14;7911:21;;7966:4;7959:5;7955:16;7989:1;7999:195;8013:6;8010:1;8007:13;7999:195;;;8078:13;;-1:-1:-1;;;;;8074:39:1;8062:52;;8134:12;;;;8169:15;;;;8110:1;8028:9;7999:195;;;-1:-1:-1;8210:3:1;;7754:465;-1:-1:-1;;;;;7754:465:1:o;8224:804::-;8481:2;8470:9;8463:21;8444:4;8507:56;8559:2;8548:9;8544:18;8536:6;8507:56;:::i;:::-;8620:22;;;8582:2;8600:18;;;8593:50;;;;8692:13;;8714:22;;;8790:15;;;;8752;;;8823:1;8833:169;8847:6;8844:1;8841:13;8833:169;;;8908:13;;8896:26;;8977:15;;;;8942:12;;;;8869:1;8862:9;8833:169;;;-1:-1:-1;9019:3:1;;8224:804;-1:-1:-1;;;;;;;8224:804:1:o;9033:261::-;9212:2;9201:9;9194:21;9175:4;9232:56;9284:2;9273:9;9269:18;9261:6;9232:56;:::i;9299:316::-;9376:6;9384;9392;9445:2;9433:9;9424:7;9420:23;9416:32;9413:52;;;9461:1;9458;9451:12;9413:52;-1:-1:-1;;9484:23:1;;;9554:2;9539:18;;9526:32;;-1:-1:-1;9605:2:1;9590:18;;;9577:32;;9299:316;-1:-1:-1;9299:316:1:o;10088:458::-;10171:6;10179;10187;10195;10248:3;10236:9;10227:7;10223:23;10219:33;10216:53;;;10265:1;10262;10255:12;10216:53;10288:29;10307:9;10288:29;:::i;:::-;10278:39;;10364:2;10353:9;10349:18;10336:32;10326:42;;10387:38;10421:2;10410:9;10406:18;10387:38;:::i;:::-;10377:48;;10475:2;10464:9;10460:18;10447:32;10488:28;10510:5;10488:28;:::i;:::-;10088:458;;;;-1:-1:-1;10088:458:1;;-1:-1:-1;;10088:458:1:o;10551:347::-;10753:2;10735:21;;;10792:2;10772:18;;;10765:30;10831:25;10826:2;10811:18;;10804:53;10889:2;10874:18;;10551:347::o;11254:127::-;11315:10;11310:3;11306:20;11303:1;11296:31;11346:4;11343:1;11336:15;11370:4;11367:1;11360:15;11386:125;11451:9;;;11472:10;;;11469:36;;;11485:18;;:::i;11795:168::-;11868:9;;;11899;;11916:15;;;11910:22;;11896:37;11886:71;;11937:18;;:::i;11968:217::-;12008:1;12034;12024:132;;12078:10;12073:3;12069:20;12066:1;12059:31;12113:4;12110:1;12103:15;12141:4;12138:1;12131:15;12024:132;-1:-1:-1;12170:9:1;;11968:217::o;12190:135::-;12229:3;12250:17;;;12247:43;;12270:18;;:::i;:::-;-1:-1:-1;12317:1:1;12306:13;;12190:135::o;13592:127::-;13653:10;13648:3;13644:20;13641:1;13634:31;13684:4;13681:1;13674:15;13708:4;13705:1;13698:15;14432:128;14499:9;;;14520:11;;;14517:37;;;14534:18;;:::i;16114:127::-;16175:10;16170:3;16166:20;16163:1;16156:31;16206:4;16203:1;16196:15;16230:4;16227:1;16220:15;17554:273;17622:6;17675:2;17663:9;17654:7;17650:23;17646:32;17643:52;;;17691:1;17688;17681:12;17643:52;17723:9;17717:16;17773:4;17766:5;17762:16;17755:5;17752:27;17742:55;;17793:1;17790;17783:12;17832:416;17921:1;17958:5;17921:1;17972:270;17993:7;17983:8;17980:21;17972:270;;;18052:4;18048:1;18044:6;18040:17;18034:4;18031:27;18028:53;;;18061:18;;:::i;:::-;18111:7;18101:8;18097:22;18094:55;;;18131:16;;;;18094:55;18210:22;;;;18170:15;;;;17972:270;;;17976:3;17832:416;;;;;:::o;18253:806::-;18302:5;18332:8;18322:80;;-1:-1:-1;18373:1:1;18387:5;;18322:80;18421:4;18411:76;;-1:-1:-1;18458:1:1;18472:5;;18411:76;18503:4;18521:1;18516:59;;;;18589:1;18584:130;;;;18496:218;;18516:59;18546:1;18537:10;;18560:5;;;18584:130;18621:3;18611:8;18608:17;18605:43;;;18628:18;;:::i;:::-;-1:-1:-1;;18684:1:1;18670:16;;18699:5;;18496:218;;18798:2;18788:8;18785:16;18779:3;18773:4;18770:13;18766:36;18760:2;18750:8;18747:16;18742:2;18736:4;18733:12;18729:35;18726:77;18723:159;;;-1:-1:-1;18835:19:1;;;18867:5;;18723:159;18914:34;18939:8;18933:4;18914:34;:::i;:::-;18984:6;18980:1;18976:6;18972:19;18963:7;18960:32;18957:58;;;18995:18;;:::i;:::-;19033:20;;18253:806;-1:-1:-1;;;18253:806:1:o;19064:140::-;19122:5;19151:47;19192:4;19182:8;19178:19;19172:4;19151:47;:::i;19209:179::-;19287:13;;19340:22;19329:34;;19319:45;;19309:73;;19378:1;19375;19368:12;19393:473;19496:6;19504;19512;19520;19528;19581:3;19569:9;19560:7;19556:23;19552:33;19549:53;;;19598:1;19595;19588:12;19549:53;19621:39;19650:9;19621:39;:::i;:::-;19611:49;;19700:2;19689:9;19685:18;19679:25;19669:35;;19744:2;19733:9;19729:18;19723:25;19713:35;;19788:2;19777:9;19773:18;19767:25;19757:35;;19811:49;19855:3;19844:9;19840:19;19811:49;:::i;:::-;19801:59;;19393:473;;;;;;;;:::o;21069:245::-;21136:6;21189:2;21177:9;21168:7;21164:23;21160:32;21157:52;;;21205:1;21202;21195:12;21157:52;21237:9;21231:16;21256:28;21278:5;21256:28;:::i;21319:131::-;21379:5;21408:36;21435:8;21429:4;21408:36;:::i;21455:412::-;21584:3;21622:6;21616:13;21647:1;21657:129;21671:6;21668:1;21665:13;21657:129;;;21769:4;21753:14;;;21749:25;;21743:32;21730:11;;;21723:53;21686:12;21657:129;;;-1:-1:-1;21841:1:1;21805:16;;21830:13;;;-1:-1:-1;21805:16:1;21455:412;-1:-1:-1;21455:412:1:o
Swarm Source
ipfs://1821934dce0f6d662c9c468440110feea1aa6efb33f6a74c61743b74d4db90bb
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.