0xC15d3f9e8b6e482eE12f5B550F9f0D2289B8867A
Sponsored
Sponsored
Sponsored
Sponsored
Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
- Token Approvals Beta
- Validate Account Balance Check Previous Balance
- Update Name Tag or Label
- Report/Flag Address
Overview
ETH Balance
0 ETH
Eth Value
$0.00
More Info
Private Name Tags
Add
ContractCreator
0x39C927c6...389076A31 at txn 0x32256e517da43251b35c5ca0f004dcf4cf503ffce58f24d46844eb9bc82b1bbd
Multichain Info
$0 (Multichain Portfolio)
No addresses found
- Transactions
- Internal Transactions
- Token Transfers (ERC-20)
- Contract
- Events
- Analytics
- Multichain Portfolio
Advanced Filter
- Filter by Tx Type:
- Tx
- Internal Tx
- ERC-20
Latest 1 from a total of 1 transactions
- View Completed Txns
- View Pending Txns
- View Failed Txns
- View Outgoing Txns
- View Incoming Txns
- View Contract Creation
Transaction Hash | Method | Block | From | To | |||||
---|---|---|---|---|---|---|---|---|---|
0x32256e517da43251b35c5ca0f004dcf4cf503ffce58f24d46844eb9bc82b1bbd | 0x60a06040 | 20457362 | 26 hrs ago | 0x39C927c6...389076A31 | IN | Create: HILO | 0 ETH | 0.01460972 |
View more zero value Internal Transactions inAdvanced View mode
Advanced mode:
Loading...
Loading
- Code
- Read Contract
- Write Contract
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Source Code Verified (Exact Match)
Contract Name:
HILO
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion, MIT license
Contract Source Code (Solidity)
- Blockscan IDE
- 🤖 Code ReaderBeta
- Remix IDE
- interface IERC20
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address to, uint256 ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(address from, a ...
- interface IERC20Metadata is IERC20
- - function name()
- - function symbol()
- - function decimals()
- - function _checkInitializing()
- - function _disableInitializers()
- - function _getInitializedVersion()
- - function _isInitializing()
- - function _getInitializableStorage()
- - function __Context_init()
- - function __Context_init_unchained()
- - function _msgSender()
- - function _msgData()
- - function _contextSuffixLength()
- interface IERC20Errors
- interface IERC721Errors
- interface IERC1155Errors
- - function _getERC20Storage()
- - function __ERC20_init(string memory n ...
- - function __ERC20_init_unchained(strin ...
- - function name()
- - function symbol()
- - function decimals()
- - function totalSupply()
- - function balanceOf(address account)
- - function transfer(address to, uint256 ...
- - function allowance(address owner, add ...
- - function approve(address spender, uin ...
- - function transferFrom(address from, a ...
- - function _transfer(address from, addr ...
- - function _update(address from, addres ...
- - function _mint(address account, uint2 ...
- - function _burn(address account, uint2 ...
- - function _approve(address owner, addr ...
- - function _approve(address owner, addr ...
- - function _spendAllowance(address owne ...
- - function __ERC20Burnable_init()
- - function __ERC20Burnable_init_unchain ...
- - function burn(uint256 value)
- - function burnFrom(address account, ui ...
- - function _getPausableStorage()
- - function __Pausable_init()
- - function __Pausable_init_unchained()
- - function paused()
- - function _requireNotPaused()
- - function _requirePaused()
- - function _pause()
- - function _unpause()
- - function __ERC20Pausable_init()
- - function __ERC20Pausable_init_unchain ...
- - function _update(address from, addres ...
- - function _getOwnableStorage()
- - function __Ownable_init(address initi ...
- - function __Ownable_init_unchained(add ...
- - function owner()
- - function _checkOwner()
- - function renounceOwnership()
- - function transferOwnership(address ne ...
- - function _transferOwnership(address n ...
- interface IERC1822Proxiable
- - function proxiableUUID()
- interface IBeacon
- - function implementation()
- library Address
- - function sendValue(address payable re ...
- - function functionCall(address target, ...
- - function functionCallWithValue(addres ...
- - function functionStaticCall(address t ...
- - function functionDelegateCall(address ...
- - function verifyCallResultFromTarget(
- - function verifyCallResult(bool succes ...
- - function _revert(bytes memory returnd ...
- library StorageSlot
- - function getAddressSlot(bytes32 slot)
- - function getBooleanSlot(bytes32 slot)
- - function getBytes32Slot(bytes32 slot)
- - function getUint256Slot(bytes32 slot)
- - function getStringSlot(bytes32 slot)
- - function getStringSlot(string storage ...
- - function getBytesSlot(bytes32 slot)
- - function getBytesSlot(bytes storage s ...
- library ERC1967Utils
- - function getImplementation()
- - function _setImplementation(address n ...
- - function upgradeToAndCall(address new ...
- - function getAdmin()
- - function _setAdmin(address newAdmin)
- - function changeAdmin(address newAdmin ...
- - function getBeacon()
- - function _setBeacon(address newBeacon ...
- - function upgradeBeaconToAndCall(addre ...
- - function _checkNonPayable()
- - function __UUPSUpgradeable_init()
- - function __UUPSUpgradeable_init_uncha ...
- - function proxiableUUID()
- - function upgradeToAndCall(address new ...
- - function _checkProxy()
- - function _checkNotDelegated()
- - function _authorizeUpgrade(address ne ...
- - function _upgradeToAndCallUUPS(addres ...
- contract HILO is Initializable, ER ... *
- - function blacklist(address account)
- - function unblacklist(address account)
- - function initialize(address initialOw ...
- - function pause()
- - function unpause()
- - function _authorizeUpgrade(address ne ...
- - function transfer(address to, uint256 ...
- - function transferFrom(address from, a ...
- - function _update(address from, addres ...
- Is this a proxy?
- Similar
- Sol2Uml
- Submit Audit
- Compare
/** *Submitted for verification at Etherscan.io on 2024-08-04*/// SPDX-License-Identifier: MIT// 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/[emailprotected]/proxy/utils/Initializable.sol// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/Initializable.sol)pragma solidity ^0.8.20;/** * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect. * * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be * reused. This mechanism prevents re-execution of each "step" but allows the creation of new initialization steps in * case an upgrade adds a module that needs to be initialized. * * For example: * * [.hljs-theme-light.nopadding] * ```solidity * contract MyToken is ERC20Upgradeable { * function initialize() initializer public { * __ERC20_init("MyToken", "MTK"); * } * } * * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable { * function initializeV2() reinitializer(2) public { * __ERC20Permit_init("MyToken"); * } * } * ``` * * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}. * * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity. * * [CAUTION] * ==== * Avoid leaving a contract uninitialized. * * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed: * * [.hljs-theme-light.nopadding] * ``` * /// @custom:oz-upgrades-unsafe-allow constructor * constructor() { * _disableInitializers(); * } * ``` * ==== */abstract contract Initializable { /** * @dev Storage of the initializable contract. * * It's implemented on a custom ERC-7201 namespace to reduce the risk of storage collisions * when using with upgradeable contracts. * * @custom:storage-location erc7201:openzeppelin.storage.Initializable */ struct InitializableStorage { /** * @dev Indicates that the contract has been initialized. */ uint64 _initialized; /** * @dev Indicates that the contract is in the process of being initialized. */ bool _initializing; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Initializable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant INITIALIZABLE_STORAGE = 0xf0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00; /** * @dev The contract is already initialized. */ error InvalidInitialization(); /** * @dev The contract is not initializing. */ error NotInitializing(); /** * @dev Triggered when the contract has been initialized or reinitialized. */ event Initialized(uint64 version); /** * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope, * `onlyInitializing` functions can be used to initialize parent contracts. * * Similar to `reinitializer(1)`, except that in the context of a constructor an `initializer` may be invoked any * number of times. This behavior in the constructor can be useful during testing and is not expected to be used in * production. * * Emits an {Initialized} event. */ modifier initializer() { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); // Cache values to avoid duplicated sloads bool isTopLevelCall = !$._initializing; uint64 initialized = $._initialized; // Allowed calls: // - initialSetup: the contract is not in the initializing state and no previous version was // initialized // - construction: the contract is initialized at version 1 (no reininitialization) and the // current contract is just being deployed bool initialSetup = initialized == 0 && isTopLevelCall; bool construction = initialized == 1 && address(this).code.length == 0; if (!initialSetup && !construction) { revert InvalidInitialization(); } $._initialized = 1; if (isTopLevelCall) { $._initializing = true; } _; if (isTopLevelCall) { $._initializing = false; emit Initialized(1); } } /** * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be * used to initialize parent contracts. * * A reinitializer may be used after the original initialization step. This is essential to configure modules that * are added through upgrades and that require initialization. * * When `version` is 1, this modifier is similar to `initializer`, except that functions marked with `reinitializer` * cannot be nested. If one is invoked in the context of another, execution will revert. * * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in * a contract, executing them in the right order is up to the developer or operator. * * WARNING: Setting the version to 2**64 - 1 will prevent any future reinitialization. * * Emits an {Initialized} event. */ modifier reinitializer(uint64 version) { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing || $._initialized >= version) { revert InvalidInitialization(); } $._initialized = version; $._initializing = true; _; $._initializing = false; emit Initialized(version); } /** * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the * {initializer} and {reinitializer} modifiers, directly or indirectly. */ modifier onlyInitializing() { _checkInitializing(); _; } /** * @dev Reverts if the contract is not in an initializing state. See {onlyInitializing}. */ function _checkInitializing() internal view virtual { if (!_isInitializing()) { revert NotInitializing(); } } /** * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call. * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized * to any version. It is recommended to use this to lock implementation contracts that are designed to be called * through proxies. * * Emits an {Initialized} event the first time it is successfully executed. */ function _disableInitializers() internal virtual { // solhint-disable-next-line var-name-mixedcase InitializableStorage storage $ = _getInitializableStorage(); if ($._initializing) { revert InvalidInitialization(); } if ($._initialized != type(uint64).max) { $._initialized = type(uint64).max; emit Initialized(type(uint64).max); } } /** * @dev Returns the highest version that has been initialized. See {reinitializer}. */ function _getInitializedVersion() internal view returns (uint64) { return _getInitializableStorage()._initialized; } /** * @dev Returns `true` if the contract is currently initializing. See {onlyInitializing}. */ function _isInitializing() internal view returns (bool) { return _getInitializableStorage()._initializing; } /** * @dev Returns a pointer to the storage namespace. */ // solhint-disable-next-line var-name-mixedcase function _getInitializableStorage() private pure returns (InitializableStorage storage $) { assembly { $.slot := INITIALIZABLE_STORAGE } }}// File: @openzeppelin/[emailprotected]/utils/ContextUpgradeable.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 ContextUpgradeable is Initializable { function __Context_init() internal onlyInitializing { } function __Context_init_unchained() internal onlyInitializing { } 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/interfaces/draft-IERC6093.sol// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC6093.sol)pragma solidity ^0.8.20;/** * @dev Standard ERC20 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC20 tokens. */interface IERC20Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC20InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC20InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers. * @param spender Address that may be allowed to operate on tokens without being their owner. * @param allowance Amount of tokens a `spender` is allowed to operate with. * @param needed Minimum amount required to perform a transfer. */ error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC20InvalidApprover(address approver); /** * @dev Indicates a failure with the `spender` to be approved. Used in approvals. * @param spender Address that may be allowed to operate on tokens without being their owner. */ error ERC20InvalidSpender(address spender);}/** * @dev Standard ERC721 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC721 tokens. */interface IERC721Errors { /** * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in EIP-20. * Used in balance queries. * @param owner Address of the current owner of a token. */ error ERC721InvalidOwner(address owner); /** * @dev Indicates a `tokenId` whose `owner` is the zero address. * @param tokenId Identifier number of a token. */ error ERC721NonexistentToken(uint256 tokenId); /** * @dev Indicates an error related to the ownership over a particular token. Used in transfers. * @param sender Address whose tokens are being transferred. * @param tokenId Identifier number of a token. * @param owner Address of the current owner of a token. */ error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC721InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC721InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param tokenId Identifier number of a token. */ error ERC721InsufficientApproval(address operator, uint256 tokenId); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC721InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC721InvalidOperator(address operator);}/** * @dev Standard ERC1155 Errors * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC1155 tokens. */interface IERC1155Errors { /** * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. * @param balance Current balance for the interacting account. * @param needed Minimum amount required to perform a transfer. * @param tokenId Identifier number of a token. */ error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId); /** * @dev Indicates a failure with the token `sender`. Used in transfers. * @param sender Address whose tokens are being transferred. */ error ERC1155InvalidSender(address sender); /** * @dev Indicates a failure with the token `receiver`. Used in transfers. * @param receiver Address to which tokens are being transferred. */ error ERC1155InvalidReceiver(address receiver); /** * @dev Indicates a failure with the `operator`’s approval. Used in transfers. * @param operator Address that may be allowed to operate on tokens without being their owner. * @param owner Address of the current owner of a token. */ error ERC1155MissingApprovalForAll(address operator, address owner); /** * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals. * @param approver Address initiating an approval operation. */ error ERC1155InvalidApprover(address approver); /** * @dev Indicates a failure with the `operator` to be approved. Used in approvals. * @param operator Address that may be allowed to operate on tokens without being their owner. */ error ERC1155InvalidOperator(address operator); /** * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation. * Used in batch transfers. * @param idsLength Length of the array of token identifiers * @param valuesLength Length of the array of token amounts */ error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);}// File: @openzeppelin/[emailprotected]/token/ERC20/ERC20Upgradeable.sol// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/ERC20.sol)pragma solidity ^0.8.20;/** * @dev Implementation of the {IERC20} interface. * * This implementation is agnostic to the way tokens are created. This means * that a supply mechanism has to be added in a derived contract using {_mint}. * * TIP: For a detailed writeup see our guide * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How * to implement supply mechanisms]. * * The default value of {decimals} is 18. To change this, you should override * this function so it returns a different value. * * We have followed general OpenZeppelin Contracts guidelines: functions revert * instead returning `false` on failure. This behavior is nonetheless * conventional and does not conflict with the expectations of ERC20 * applications. * * Additionally, an {Approval} event is emitted on calls to {transferFrom}. * This allows applications to reconstruct the allowance for all accounts just * by listening to said events. Other implementations of the EIP may not emit * these events, as it isn't required by the specification. */abstract contract ERC20Upgradeable is Initializable, ContextUpgradeable, IERC20, IERC20Metadata, IERC20Errors { /// @custom:storage-location erc7201:openzeppelin.storage.ERC20 struct ERC20Storage { mapping(address account => uint256) _balances; mapping(address account => mapping(address spender => uint256)) _allowances; uint256 _totalSupply; string _name; string _symbol; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.ERC20")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant ERC20StorageLocation = 0x52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00; function _getERC20Storage() private pure returns (ERC20Storage storage $) { assembly { $.slot := ERC20StorageLocation } } /** * @dev Sets the values for {name} and {symbol}. * * All two of these values are immutable: they can only be set once during * construction. */ function __ERC20_init(string memory name_, string memory symbol_) internal onlyInitializing { __ERC20_init_unchained(name_, symbol_); } function __ERC20_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing { ERC20Storage storage $ = _getERC20Storage(); $._name = name_; $._symbol = symbol_; } /** * @dev Returns the name of the token. */ function name() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._name; } /** * @dev Returns the symbol of the token, usually a shorter version of the * name. */ function symbol() public view virtual returns (string memory) { ERC20Storage storage $ = _getERC20Storage(); return $._symbol; } /** * @dev Returns the number of decimals used to get its user representation. * For example, if `decimals` equals `2`, a balance of `505` tokens should * be displayed to a user as `5.05` (`505 / 10 ** 2`). * * Tokens usually opt for a value of 18, imitating the relationship between * Ether and Wei. This is the default value returned by this function, unless * it's overridden. * * NOTE: This information is only used for _display_ purposes: it in * no way affects any of the arithmetic of the contract, including * {IERC20-balanceOf} and {IERC20-transfer}. */ function decimals() public view virtual returns (uint8) { return 18; } /** * @dev See {IERC20-totalSupply}. */ function totalSupply() public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._totalSupply; } /** * @dev See {IERC20-balanceOf}. */ function balanceOf(address account) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._balances[account]; } /** * @dev See {IERC20-transfer}. * * Requirements: * * - `to` cannot be the zero address. * - the caller must have a balance of at least `value`. */ function transfer(address to, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _transfer(owner, to, value); return true; } /** * @dev See {IERC20-allowance}. */ function allowance(address owner, address spender) public view virtual returns (uint256) { ERC20Storage storage $ = _getERC20Storage(); return $._allowances[owner][spender]; } /** * @dev See {IERC20-approve}. * * NOTE: If `value` is the maximum `uint256`, the allowance is not updated on * `transferFrom`. This is semantically equivalent to an infinite approval. * * Requirements: * * - `spender` cannot be the zero address. */ function approve(address spender, uint256 value) public virtual returns (bool) { address owner = _msgSender(); _approve(owner, spender, value); return true; } /** * @dev See {IERC20-transferFrom}. * * Emits an {Approval} event indicating the updated allowance. This is not * required by the EIP. See the note at the beginning of {ERC20}. * * NOTE: Does not update the allowance if the current allowance * is the maximum `uint256`. * * Requirements: * * - `from` and `to` cannot be the zero address. * - `from` must have a balance of at least `value`. * - the caller must have allowance for ``from``'s tokens of at least * `value`. */ function transferFrom(address from, address to, uint256 value) public virtual returns (bool) { address spender = _msgSender(); _spendAllowance(from, spender, value); _transfer(from, to, value); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to`. * * This internal function is equivalent to {transfer}, and can be used to * e.g. implement automatic token fees, slashing mechanisms, etc. * * Emits a {Transfer} event. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _transfer(address from, address to, uint256 value) internal { if (from == address(0)) { revert ERC20InvalidSender(address(0)); } if (to == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(from, to, value); } /** * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from` * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding * this function. * * Emits a {Transfer} event. */ function _update(address from, address to, uint256 value) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (from == address(0)) { // Overflow check required: The rest of the code assumes that totalSupply never overflows $._totalSupply += value; } else { uint256 fromBalance = $._balances[from]; if (fromBalance < value) { revert ERC20InsufficientBalance(from, fromBalance, value); } unchecked { // Overflow not possible: value <= fromBalance <= totalSupply. $._balances[from] = fromBalance - value; } } if (to == address(0)) { unchecked { // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply. $._totalSupply -= value; } } else { unchecked { // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256. $._balances[to] += value; } } emit Transfer(from, to, value); } /** * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0). * Relies on the `_update` mechanism * * Emits a {Transfer} event with `from` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead. */ function _mint(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidReceiver(address(0)); } _update(address(0), account, value); } /** * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply. * Relies on the `_update` mechanism. * * Emits a {Transfer} event with `to` set to the zero address. * * NOTE: This function is not virtual, {_update} should be overridden instead */ function _burn(address account, uint256 value) internal { if (account == address(0)) { revert ERC20InvalidSender(address(0)); } _update(account, address(0), value); } /** * @dev Sets `value` as the allowance of `spender` over the `owner` s tokens. * * This internal function is equivalent to `approve`, and can be used to * e.g. set automatic allowances for certain subsystems, etc. * * Emits an {Approval} event. * * Requirements: * * - `owner` cannot be the zero address. * - `spender` cannot be the zero address. * * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument. */ function _approve(address owner, address spender, uint256 value) internal { _approve(owner, spender, value, true); } /** * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event. * * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any * `Approval` event during `transferFrom` operations. * * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to * true using the following override: * ``` * function _approve(address owner, address spender, uint256 value, bool) internal virtual override { * super._approve(owner, spender, value, true); * } * ``` * * Requirements are the same as {_approve}. */ function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual { ERC20Storage storage $ = _getERC20Storage(); if (owner == address(0)) { revert ERC20InvalidApprover(address(0)); } if (spender == address(0)) { revert ERC20InvalidSpender(address(0)); } $._allowances[owner][spender] = value; if (emitEvent) { emit Approval(owner, spender, value); } } /** * @dev Updates `owner` s allowance for `spender` based on spent `value`. * * Does not update the allowance value in case of infinite allowance. * Revert if not enough allowance is available. * * Does not emit an {Approval} event. */ function _spendAllowance(address owner, address spender, uint256 value) internal virtual { uint256 currentAllowance = allowance(owner, spender); if (currentAllowance != type(uint256).max) { if (currentAllowance < value) { revert ERC20InsufficientAllowance(spender, currentAllowance, value); } unchecked { _approve(owner, spender, currentAllowance - value, false); } } }}// File: @openzeppelin/[emailprotected]/token/ERC20/extensions/ERC20BurnableUpgradeable.sol// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)pragma solidity ^0.8.20;/** * @dev Extension of {ERC20} that allows token holders to destroy both their own * tokens and those that they have an allowance for, in a way that can be * recognized off-chain (via event analysis). */abstract contract ERC20BurnableUpgradeable is Initializable, ContextUpgradeable, ERC20Upgradeable { function __ERC20Burnable_init() internal onlyInitializing { } function __ERC20Burnable_init_unchained() internal onlyInitializing { } /** * @dev Destroys a `value` amount of tokens from the caller. * * See {ERC20-_burn}. */ function burn(uint256 value) public virtual { _burn(_msgSender(), value); } /** * @dev Destroys a `value` amount of tokens from `account`, deducting from * the caller's allowance. * * See {ERC20-_burn} and {ERC20-allowance}. * * Requirements: * * - the caller must have allowance for ``accounts``'s tokens of at least * `value`. */ function burnFrom(address account, uint256 value) public virtual { _spendAllowance(account, _msgSender(), value); _burn(account, value); }}// File: @openzeppelin/[emailprotected]/utils/PausableUpgradeable.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 PausableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Pausable struct PausableStorage { bool _paused; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Pausable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant PausableStorageLocation = 0xcd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300; function _getPausableStorage() private pure returns (PausableStorage storage $) { assembly { $.slot := PausableStorageLocation } } /** * @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. */ function __Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __Pausable_init_unchained() internal onlyInitializing { PausableStorage storage $ = _getPausableStorage(); $._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) { PausableStorage storage $ = _getPausableStorage(); 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 { PausableStorage storage $ = _getPausableStorage(); $._paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { PausableStorage storage $ = _getPausableStorage(); $._paused = false; emit Unpaused(_msgSender()); }}// File: @openzeppelin/[emailprotected]/token/ERC20/extensions/ERC20PausableUpgradeable.sol// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Pausable.sol)pragma solidity ^0.8.20;/** * @dev ERC20 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. * * IMPORTANT: This contract does not include public pause and unpause functions. In * addition to inheriting this contract, you must define both functions, invoking the * {Pausable-_pause} and {Pausable-_unpause} internal functions, with appropriate * access control, e.g. using {AccessControl} or {Ownable}. Not doing so will * make the contract pause mechanism of the contract unreachable, and thus unusable. */abstract contract ERC20PausableUpgradeable is Initializable, ERC20Upgradeable, PausableUpgradeable { function __ERC20Pausable_init() internal onlyInitializing { __Pausable_init_unchained(); } function __ERC20Pausable_init_unchained() internal onlyInitializing { } /** * @dev See {ERC20-_update}. * * Requirements: * * - the contract must not be paused. */ function _update(address from, address to, uint256 value) internal virtual override whenNotPaused { super._update(from, to, value); }}// File: @openzeppelin/[emailprotected]/access/OwnableUpgradeable.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 OwnableUpgradeable is Initializable, ContextUpgradeable { /// @custom:storage-location erc7201:openzeppelin.storage.Ownable struct OwnableStorage { address _owner; } // keccak256(abi.encode(uint256(keccak256("openzeppelin.storage.Ownable")) - 1)) & ~bytes32(uint256(0xff)) bytes32 private constant OwnableStorageLocation = 0x9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300; function _getOwnableStorage() private pure returns (OwnableStorage storage $) { assembly { $.slot := OwnableStorageLocation } } /** * @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. */ function __Ownable_init(address initialOwner) internal onlyInitializing { __Ownable_init_unchained(initialOwner); } function __Ownable_init_unchained(address initialOwner) internal onlyInitializing { 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) { OwnableStorage storage $ = _getOwnableStorage(); 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 { OwnableStorage storage $ = _getOwnableStorage(); address oldOwner = $._owner; $._owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); }}// File: @openzeppelin/contracts/interfaces/draft-IERC1822.sol// OpenZeppelin Contracts (last updated v5.0.0) (interfaces/draft-IERC1822.sol)pragma solidity ^0.8.20;/** * @dev ERC1822: Universal Upgradeable Proxy Standard (UUPS) documents a method for upgradeability through a simplified * proxy whose upgrades are fully controlled by the current implementation. */interface IERC1822Proxiable { /** * @dev Returns the storage slot that the proxiable contract assumes is being used to store the implementation * address. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. */ function proxiableUUID() external view returns (bytes32);}// File: @openzeppelin/contracts/proxy/beacon/IBeacon.sol// OpenZeppelin Contracts (last updated v5.0.0) (proxy/beacon/IBeacon.sol)pragma solidity ^0.8.20;/** * @dev This is the interface that {BeaconProxy} expects of its beacon. */interface IBeacon { /** * @dev Must return an address that can be used as a delegate call target. * * {UpgradeableBeacon} will check that this address is a contract. */ function implementation() external view returns (address);}// 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/utils/StorageSlot.sol// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.pragma solidity ^0.8.20;/** * @dev Library for reading and writing primitive types to specific storage slots. * * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts. * This library helps with reading and writing to such slots without the need for inline assembly. * * The functions in this library return Slot structs that contain a `value` member that can be used to read or write. * * Example usage to set ERC1967 implementation slot: * ```solidity * contract ERC1967 { * bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; * * function _getImplementation() internal view returns (address) { * return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value; * } * * function _setImplementation(address newImplementation) internal { * require(newImplementation.code.length > 0); * StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation; * } * } * ``` */library StorageSlot { struct AddressSlot { address value; } struct BooleanSlot { bool value; } struct Bytes32Slot { bytes32 value; } struct Uint256Slot { uint256 value; } struct StringSlot { string value; } struct BytesSlot { bytes value; } /** * @dev Returns an `AddressSlot` with member `value` located at `slot`. */ function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BooleanSlot` with member `value` located at `slot`. */ function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Bytes32Slot` with member `value` located at `slot`. */ function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `Uint256Slot` with member `value` located at `slot`. */ function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` with member `value` located at `slot`. */ function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `StringSlot` representation of the string storage pointer `store`. */ function getStringSlot(string storage store) internal pure returns (StringSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } } /** * @dev Returns an `BytesSlot` with member `value` located at `slot`. */ function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := slot } } /** * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`. */ function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) { /// @solidity memory-safe-assembly assembly { r.slot := store.slot } }}// File: @openzeppelin/contracts/proxy/ERC1967/ERC1967Utils.sol// OpenZeppelin Contracts (last updated v5.0.0) (proxy/ERC1967/ERC1967Utils.sol)pragma solidity ^0.8.20;/** * @dev This abstract contract provides getters and event emitting update functions for * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots. */library ERC1967Utils { // We re-declare ERC-1967 events here because they can't be used directly from IERC1967. // This will be fixed in Solidity 0.8.21. At that point we should remove these events. /** * @dev Emitted when the implementation is upgraded. */ event Upgraded(address indexed implementation); /** * @dev Emitted when the admin account has changed. */ event AdminChanged(address previousAdmin, address newAdmin); /** * @dev Emitted when the beacon is changed. */ event BeaconUpgraded(address indexed beacon); /** * @dev Storage slot with the address of the current implementation. * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc; /** * @dev The `implementation` of the proxy is invalid. */ error ERC1967InvalidImplementation(address implementation); /** * @dev The `admin` of the proxy is invalid. */ error ERC1967InvalidAdmin(address admin); /** * @dev The `beacon` of the proxy is invalid. */ error ERC1967InvalidBeacon(address beacon); /** * @dev An upgrade function sees `msg.value > 0` that may be lost. */ error ERC1967NonPayable(); /** * @dev Returns the current implementation address. */ function getImplementation() internal view returns (address) { return StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value; } /** * @dev Stores a new address in the EIP1967 implementation slot. */ function _setImplementation(address newImplementation) private { if (newImplementation.code.length == 0) { revert ERC1967InvalidImplementation(newImplementation); } StorageSlot.getAddressSlot(IMPLEMENTATION_SLOT).value = newImplementation; } /** * @dev Performs implementation upgrade with additional setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-Upgraded} event. */ function upgradeToAndCall(address newImplementation, bytes memory data) internal { _setImplementation(newImplementation); emit Upgraded(newImplementation); if (data.length > 0) { Address.functionDelegateCall(newImplementation, data); } else { _checkNonPayable(); } } /** * @dev Storage slot with the admin of the contract. * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103; /** * @dev Returns the current admin. * * TIP: To get this value clients can read directly from the storage slot shown below (specified by EIP1967) using * the https://eth.wiki/json-rpc/API#eth_getstorageat[`eth_getStorageAt`] RPC call. * `0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103` */ function getAdmin() internal view returns (address) { return StorageSlot.getAddressSlot(ADMIN_SLOT).value; } /** * @dev Stores a new address in the EIP1967 admin slot. */ function _setAdmin(address newAdmin) private { if (newAdmin == address(0)) { revert ERC1967InvalidAdmin(address(0)); } StorageSlot.getAddressSlot(ADMIN_SLOT).value = newAdmin; } /** * @dev Changes the admin of the proxy. * * Emits an {IERC1967-AdminChanged} event. */ function changeAdmin(address newAdmin) internal { emit AdminChanged(getAdmin(), newAdmin); _setAdmin(newAdmin); } /** * @dev The storage slot of the UpgradeableBeacon contract which defines the implementation for this proxy. * This is the keccak-256 hash of "eip1967.proxy.beacon" subtracted by 1. */ // solhint-disable-next-line private-vars-leading-underscore bytes32 internal constant BEACON_SLOT = 0xa3f0ad74e5423aebfd80d3ef4346578335a9a72aeaee59ff6cb3582b35133d50; /** * @dev Returns the current beacon. */ function getBeacon() internal view returns (address) { return StorageSlot.getAddressSlot(BEACON_SLOT).value; } /** * @dev Stores a new beacon in the EIP1967 beacon slot. */ function _setBeacon(address newBeacon) private { if (newBeacon.code.length == 0) { revert ERC1967InvalidBeacon(newBeacon); } StorageSlot.getAddressSlot(BEACON_SLOT).value = newBeacon; address beaconImplementation = IBeacon(newBeacon).implementation(); if (beaconImplementation.code.length == 0) { revert ERC1967InvalidImplementation(beaconImplementation); } } /** * @dev Change the beacon and trigger a setup call if data is nonempty. * This function is payable only if the setup call is performed, otherwise `msg.value` is rejected * to avoid stuck value in the contract. * * Emits an {IERC1967-BeaconUpgraded} event. * * CAUTION: Invoking this function has no effect on an instance of {BeaconProxy} since v5, since * it uses an immutable beacon without looking at the value of the ERC-1967 beacon slot for * efficiency. */ function upgradeBeaconToAndCall(address newBeacon, bytes memory data) internal { _setBeacon(newBeacon); emit BeaconUpgraded(newBeacon); if (data.length > 0) { Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data); } else { _checkNonPayable(); } } /** * @dev Reverts if `msg.value` is not zero. It can be used to avoid `msg.value` stuck in the contract * if an upgrade doesn't perform an initialization call. */ function _checkNonPayable() private { if (msg.value > 0) { revert ERC1967NonPayable(); } }}// File: @openzeppelin/[emailprotected]/proxy/utils/UUPSUpgradeable.sol// OpenZeppelin Contracts (last updated v5.0.0) (proxy/utils/UUPSUpgradeable.sol)pragma solidity ^0.8.20;/** * @dev An upgradeability mechanism designed for UUPS proxies. The functions included here can perform an upgrade of an * {ERC1967Proxy}, when this contract is set as the implementation behind such a proxy. * * A security mechanism ensures that an upgrade does not turn off upgradeability accidentally, although this risk is * reinstated if the upgrade retains upgradeability but removes the security mechanism, e.g. by replacing * `UUPSUpgradeable` with a custom implementation of upgrades. * * The {_authorizeUpgrade} function must be overridden to include access restriction to the upgrade mechanism. */abstract contract UUPSUpgradeable is Initializable, IERC1822Proxiable { /// @custom:oz-upgrades-unsafe-allow state-variable-immutable address private immutable __self = address(this); /** * @dev The version of the upgrade interface of the contract. If this getter is missing, both `upgradeTo(address)` * and `upgradeToAndCall(address,bytes)` are present, and `upgradeTo` must be used if no function should be called, * while `upgradeToAndCall` will invoke the `receive` function if the second argument is the empty byte string. * If the getter returns `"5.0.0"`, only `upgradeToAndCall(address,bytes)` is present, and the second argument must * be the empty byte string if no function should be called, making it impossible to invoke the `receive` function * during an upgrade. */ string public constant UPGRADE_INTERFACE_VERSION = "5.0.0"; /** * @dev The call is from an unauthorized context. */ error UUPSUnauthorizedCallContext(); /** * @dev The storage `slot` is unsupported as a UUID. */ error UUPSUnsupportedProxiableUUID(bytes32 slot); /** * @dev Check that the execution is being performed through a delegatecall call and that the execution context is * a proxy contract with an implementation (as defined in ERC1967) pointing to self. This should only be the case * for UUPS and transparent proxies that are using the current contract as their implementation. Execution of a * function through ERC1167 minimal proxies (clones) would not normally pass this test, but is not guaranteed to * fail. */ modifier onlyProxy() { _checkProxy(); _; } /** * @dev Check that the execution is not being performed through a delegate call. This allows a function to be * callable on the implementing contract but not through proxies. */ modifier notDelegated() { _checkNotDelegated(); _; } function __UUPSUpgradeable_init() internal onlyInitializing { } function __UUPSUpgradeable_init_unchained() internal onlyInitializing { } /** * @dev Implementation of the ERC1822 {proxiableUUID} function. This returns the storage slot used by the * implementation. It is used to validate the implementation's compatibility when performing an upgrade. * * IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks * bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this * function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier. */ function proxiableUUID() external view virtual notDelegated returns (bytes32) { return ERC1967Utils.IMPLEMENTATION_SLOT; } /** * @dev Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call * encoded in `data`. * * Calls {_authorizeUpgrade}. * * Emits an {Upgraded} event. * * @custom:oz-upgrades-unsafe-allow-reachable delegatecall */ function upgradeToAndCall(address newImplementation, bytes memory data) public payable virtual onlyProxy { _authorizeUpgrade(newImplementation); _upgradeToAndCallUUPS(newImplementation, data); } /** * @dev Reverts if the execution is not performed via delegatecall or the execution * context is not of a proxy with an ERC1967-compliant implementation pointing to self. * See {_onlyProxy}. */ function _checkProxy() internal view virtual { if ( address(this) == __self || // Must be called through delegatecall ERC1967Utils.getImplementation() != __self // Must be called through an active proxy ) { revert UUPSUnauthorizedCallContext(); } } /** * @dev Reverts if the execution is performed via delegatecall. * See {notDelegated}. */ function _checkNotDelegated() internal view virtual { if (address(this) != __self) { // Must not be called through delegatecall revert UUPSUnauthorizedCallContext(); } } /** * @dev Function that should revert when `msg.sender` is not authorized to upgrade the contract. Called by * {upgradeToAndCall}. * * Normally, this function will use an xref:access.adoc[access control] modifier such as {Ownable-onlyOwner}. * * ```solidity * function _authorizeUpgrade(address) internal onlyOwner {} * ``` */ function _authorizeUpgrade(address newImplementation) internal virtual; /** * @dev Performs an implementation upgrade with a security check for UUPS proxies, and additional setup call. * * As a security check, {proxiableUUID} is invoked in the new implementation, and the return value * is expected to be the implementation slot in ERC1967. * * Emits an {IERC1967-Upgraded} event. */ function _upgradeToAndCallUUPS(address newImplementation, bytes memory data) private { try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) { if (slot != ERC1967Utils.IMPLEMENTATION_SLOT) { revert UUPSUnsupportedProxiableUUID(slot); } ERC1967Utils.upgradeToAndCall(newImplementation, data); } catch { // The implementation is not UUPS revert ERC1967Utils.ERC1967InvalidImplementation(newImplementation); } }}// File: Hilonew.sol// Compatible with OpenZeppelin Contracts ^5.0.0pragma solidity ^0.8.20;contract HILO is Initializable, ERC20Upgradeable, ERC20BurnableUpgradeable, ERC20PausableUpgradeable, OwnableUpgradeable, UUPSUpgradeable { /// @custom:oz-upgrades-unsafe-allow constructor constructor() { _disableInitializers(); } mapping(address => bool) private _blacklist; function blacklist(address account) external onlyOwner { require(!_blacklist[account], "HILO: Address is already blacklisted"); _blacklist[account] = true; } function unblacklist(address account) external onlyOwner { require(_blacklist[account], "HILO: Address is not blacklisted"); _blacklist[account] = false; } function initialize(address initialOwner) initializer public { __ERC20_init("HILO", "HILO"); __ERC20Burnable_init(); __ERC20Pausable_init(); __Ownable_init(initialOwner); __UUPSUpgradeable_init(); _mint(msg.sender, 150000000 * 10 ** decimals()); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function _authorizeUpgrade(address newImplementation) internal onlyOwner override {} // The following functions are overrides required by Solidity. function transfer(address to, uint256 amount) public override returns (bool) { require(!_blacklist[_msgSender()], "HILO: Sender is blacklisted"); require(!_blacklist[to], "HILO: Recipient is blacklisted"); return super.transfer(to, amount); } function transferFrom(address from, address to, uint256 amount) public override returns (bool) { require(!_blacklist[from], "HILO: Sender is blacklisted"); require(!_blacklist[to], "HILO: Recipient is blacklisted"); return super.transferFrom(from, to, amount); } function _update(address from, address to, uint256 value) internal override(ERC20Upgradeable, ERC20PausableUpgradeable) { super._update(from, to, value); }}
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
- JSON Format
- RAW/Text Format
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"implementation","type":"address"}],"name":"ERC1967InvalidImplementation","type":"error"},{"inputs":[],"name":"ERC1967NonPayable","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"allowance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientAllowance","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"needed","type":"uint256"}],"name":"ERC20InsufficientBalance","type":"error"},{"inputs":[{"internalType":"address","name":"approver","type":"address"}],"name":"ERC20InvalidApprover","type":"error"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"}],"name":"ERC20InvalidReceiver","type":"error"},{"inputs":[{"internalType":"address","name":"sender","type":"address"}],"name":"ERC20InvalidSender","type":"error"},{"inputs":[{"internalType":"address","name":"spender","type":"address"}],"name":"ERC20InvalidSpender","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"inputs":[],"name":"NotInitializing","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":[],"name":"UUPSUnauthorizedCallContext","type":"error"},{"inputs":[{"internalType":"bytes32","name":"slot","type":"bytes32"}],"name":"UUPSUnsupportedProxiableUUID","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint64","name":"version","type":"uint64"}],"name":"Initialized","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":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"inputs":[],"name":"UPGRADE_INTERFACE_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"blacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"initialOwner","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"proxiableUUID","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unblacklist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newImplementation","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"upgradeToAndCall","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
Decompile Bytecode Switch to Opcodes View
60a060405230608052348015610013575f80fd5b5061001c610021565b6100d3565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff16156100715760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b03908116146100d05780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b6080516119fc6100f95f395f8181610c2501528181610c4e0152610d8d01526119fc5ff3fe60806040526004361061013c575f3560e01c8063715018a6116100b3578063a9059cbb1161006d578063a9059cbb1461038f578063ad3cb1cc146103ae578063c4d66de8146103de578063dd62ed3e146103fd578063f2fde38b1461041c578063f9f92be41461043b575f80fd5b8063715018a6146102cf57806375e3661e146102e357806379cc6790146103025780638456cb59146103215780638da5cb5b1461033557806395d89b411461037b575f80fd5b80633f4ba83a116101045780633f4ba83a1461021057806342966c68146102265780634f1ef2861461024557806352d1902d146102585780635c975abb1461026c57806370a082311461028f575f80fd5b806306fdde0314610140578063095ea7b31461016a57806318160ddd1461019957806323b872dd146101d6578063313ce567146101f5575b5f80fd5b34801561014b575f80fd5b5061015461045a565b60405161016191906114e8565b60405180910390f35b348015610175575f80fd5b50610189610184366004611538565b61051a565b6040519015158152602001610161565b3480156101a4575f80fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610161565b3480156101e1575f80fd5b506101896101f0366004611560565b610533565b348015610200575f80fd5b5060405160128152602001610161565b34801561021b575f80fd5b5061022461061d565b005b348015610231575f80fd5b5061022461024036600461159a565b61062f565b6102246102533660046115c5565b61063c565b348015610263575f80fd5b506101c861065b565b348015610277575f80fd5b505f805160206119a78339815191525460ff16610189565b34801561029a575f80fd5b506101c86102a9366004611689565b6001600160a01b03165f9081525f80516020611967833981519152602052604090205490565b3480156102da575f80fd5b50610224610676565b3480156102ee575f80fd5b506102246102fd366004611689565b610687565b34801561030d575f80fd5b5061022461031c366004611538565b610716565b34801561032c575f80fd5b5061022461072b565b348015610340575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610161565b348015610386575f80fd5b5061015461073b565b34801561039a575f80fd5b506101896103a9366004611538565b610779565b3480156103b9575f80fd5b50610154604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156103e9575f80fd5b506102246103f8366004611689565b61084a565b348015610408575f80fd5b506101c86104173660046116a2565b6109d5565b348015610427575f80fd5b50610224610436366004611689565b610a1e565b348015610446575f80fd5b50610224610455366004611689565b610a58565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061196783398151915291610498906116d3565b80601f01602080910402602001604051908101604052809291908181526020018280546104c4906116d3565b801561050f5780601f106104e65761010080835404028352916020019161050f565b820191905f5260205f20905b8154815290600101906020018083116104f257829003601f168201915b505050505091505090565b5f33610527818585610af7565b60019150505b92915050565b6001600160a01b0383165f9081526020819052604081205460ff16156105a05760405162461bcd60e51b815260206004820152601b60248201527f48494c4f3a2053656e64657220697320626c61636b6c6973746564000000000060448201526064015b60405180910390fd5b6001600160a01b0383165f9081526020819052604090205460ff16156106085760405162461bcd60e51b815260206004820152601e60248201527f48494c4f3a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610597565b610613848484610b09565b90505b9392505050565b610625610b2c565b61062d610b87565b565b6106393382610be6565b50565b610644610c1a565b61064d82610cbe565b6106578282610cc6565b5050565b5f610664610d82565b505f8051602061198783398151915290565b61067e610b2c565b61062d5f610dcb565b61068f610b2c565b6001600160a01b0381165f9081526020819052604090205460ff166106f65760405162461bcd60e51b815260206004820181905260248201527f48494c4f3a2041646472657373206973206e6f7420626c61636b6c69737465646044820152606401610597565b6001600160a01b03165f908152602081905260409020805460ff19169055565b610721823383610e3b565b6106578282610be6565b610733610b2c565b61062d610e9e565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061196783398151915291610498906116d3565b335f9081526020819052604081205460ff16156107d85760405162461bcd60e51b815260206004820152601b60248201527f48494c4f3a2053656e64657220697320626c61636b6c697374656400000000006044820152606401610597565b6001600160a01b0383165f9081526020819052604090205460ff16156108405760405162461bcd60e51b815260206004820152601e60248201527f48494c4f3a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610597565b6106168383610ee6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561088f5750825b90505f8267ffffffffffffffff1660011480156108ab5750303b155b9050811580156108b9575080155b156108d75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561090157845460ff60401b1916600160401b1785555b6109436040518060400160405280600481526020016348494c4f60e01b8152506040518060400160405280600481526020016348494c4f60e01b815250610ef3565b61094b610f05565b610953610f0d565b61095c86610f1d565b610964610f05565b610987336109746012600a611802565b610982906308f0d180611810565b610f2e565b83156109cd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b610a26610b2c565b6001600160a01b038116610a4f57604051631e4fbdf760e01b81525f6004820152602401610597565b61063981610dcb565b610a60610b2c565b6001600160a01b0381165f9081526020819052604090205460ff1615610ad45760405162461bcd60e51b8152602060048201526024808201527f48494c4f3a204164647265737320697320616c726561647920626c61636b6c696044820152631cdd195960e21b6064820152608401610597565b6001600160a01b03165f908152602081905260409020805460ff19166001179055565b610b048383836001610f62565b505050565b5f33610b16858285610e3b565b610b21858585611046565b506001949350505050565b33610b5e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461062d5760405163118cdaa760e01b8152336004820152602401610597565b610b8f6110a3565b5f805160206119a7833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6001600160a01b038216610c0f57604051634b637e8f60e11b81525f6004820152602401610597565b610657825f836110d2565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480610ca057507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610c945f80516020611987833981519152546001600160a01b031690565b6001600160a01b031614155b1561062d5760405163703e46dd60e11b815260040160405180910390fd5b610639610b2c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d20575060408051601f3d908101601f19168201909252610d1d91810190611827565b60015b610d4857604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610597565b5f805160206119878339815191528114610d7857604051632a87526960e21b815260048101829052602401610597565b610b0483836110dd565b306001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461062d5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e4684846109d5565b90505f198114610e985781811015610e8a57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610597565b610e9884848484035f610f62565b50505050565b610ea6611132565b5f805160206119a7833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bc8565b5f33610527818585611046565b610efb611162565b61065782826111ab565b61062d611162565b610f15611162565b61062d6111fb565b610f25611162565b6106398161121b565b6001600160a01b038216610f575760405163ec442f0560e01b81525f6004820152602401610597565b6106575f83836110d2565b5f805160206119678339815191526001600160a01b038516610f995760405163e602df0560e01b81525f6004820152602401610597565b6001600160a01b038416610fc257604051634a1406b160e11b81525f6004820152602401610597565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561103f57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161103691815260200190565b60405180910390a35b5050505050565b6001600160a01b03831661106f57604051634b637e8f60e11b81525f6004820152602401610597565b6001600160a01b0382166110985760405163ec442f0560e01b81525f6004820152602401610597565b610b048383836110d2565b5f805160206119a78339815191525460ff1661062d57604051638dfc202b60e01b815260040160405180910390fd5b610b04838383611223565b6110e682611236565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561112a57610b048282611299565b61065761130b565b5f805160206119a78339815191525460ff161561062d5760405163d93c066560e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661062d57604051631afcd79f60e31b815260040160405180910390fd5b6111b3611162565b5f805160206119678339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036111ec8482611882565b5060048101610e988382611882565b611203611162565b5f805160206119a7833981519152805460ff19169055565b610a26611162565b61122b611132565b610b0483838361132a565b806001600160a01b03163b5f0361126b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610597565b5f8051602061198783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516112b5919061193d565b5f60405180830381855af49150503d805f81146112ed576040519150601f19603f3d011682016040523d82523d5f602084013e6112f2565b606091505b5091509150611302858383611463565b95945050505050565b341561062d5760405163b398979f60e01b815260040160405180910390fd5b5f805160206119678339815191526001600160a01b0384166113645781816002015f8282546113599190611953565b909155506113d49050565b6001600160a01b0384165f90815260208290526040902054828110156113b65760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610597565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166113f2576002810180548390039055611410565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145591815260200190565b60405180910390a350505050565b60608261147857611473826114bf565b610616565b815115801561148f57506001600160a01b0384163b155b156114b857604051639996b31560e01b81526001600160a01b0385166004820152602401610597565b5080610616565b8051156114cf5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611533575f80fd5b919050565b5f8060408385031215611549575f80fd5b6115528361151d565b946020939093013593505050565b5f805f60608486031215611572575f80fd5b61157b8461151d565b92506115896020850161151d565b929592945050506040919091013590565b5f602082840312156115aa575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156115d6575f80fd5b6115df8361151d565b9150602083013567ffffffffffffffff8111156115fa575f80fd5b8301601f8101851361160a575f80fd5b803567ffffffffffffffff811115611624576116246115b1565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611653576116536115b1565b60405281815282820160200187101561166a575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f60208284031215611699575f80fd5b6106168261151d565b5f80604083850312156116b3575f80fd5b6116bc8361151d565b91506116ca6020840161151d565b90509250929050565b600181811c908216806116e757607f821691505b60208210810361170557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561175a5780850481111561173e5761173e61170b565b600184161561174c57908102905b60019390931c928002611723565b935093915050565b5f826117705750600161052d565b8161177c57505f61052d565b8160018114611792576002811461179c576117b8565b600191505061052d565b60ff8411156117ad576117ad61170b565b50506001821b61052d565b5060208310610133831016604e8410600b84101617156117db575081810a61052d565b6117e75f19848461171f565b805f19048211156117fa576117fa61170b565b029392505050565b5f61061660ff841683611762565b808202811582820484141761052d5761052d61170b565b5f60208284031215611837575f80fd5b5051919050565b601f821115610b0457805f5260205f20601f840160051c810160208510156118635750805b601f840160051c820191505b8181101561103f575f815560010161186f565b815167ffffffffffffffff81111561189c5761189c6115b1565b6118b0816118aa84546116d3565b8461183e565b6020601f8211600181146118e2575f83156118cb5750848201515b5f19600385901b1c1916600184901b17845561103f565b5f84815260208120601f198516915b8281101561191157878501518255602094850194600190920191016118f1565b508482101561192e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f920191825250919050565b8082018082111561052d5761052d61170b56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220a197219684a0f5e204ea61b0609ca004adcdeba06eb65151c8b782d36d9fa53064736f6c634300081a0033
Deployed Bytecode
0x60806040526004361061013c575f3560e01c8063715018a6116100b3578063a9059cbb1161006d578063a9059cbb1461038f578063ad3cb1cc146103ae578063c4d66de8146103de578063dd62ed3e146103fd578063f2fde38b1461041c578063f9f92be41461043b575f80fd5b8063715018a6146102cf57806375e3661e146102e357806379cc6790146103025780638456cb59146103215780638da5cb5b1461033557806395d89b411461037b575f80fd5b80633f4ba83a116101045780633f4ba83a1461021057806342966c68146102265780634f1ef2861461024557806352d1902d146102585780635c975abb1461026c57806370a082311461028f575f80fd5b806306fdde0314610140578063095ea7b31461016a57806318160ddd1461019957806323b872dd146101d6578063313ce567146101f5575b5f80fd5b34801561014b575f80fd5b5061015461045a565b60405161016191906114e8565b60405180910390f35b348015610175575f80fd5b50610189610184366004611538565b61051a565b6040519015158152602001610161565b3480156101a4575f80fd5b507f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace02545b604051908152602001610161565b3480156101e1575f80fd5b506101896101f0366004611560565b610533565b348015610200575f80fd5b5060405160128152602001610161565b34801561021b575f80fd5b5061022461061d565b005b348015610231575f80fd5b5061022461024036600461159a565b61062f565b6102246102533660046115c5565b61063c565b348015610263575f80fd5b506101c861065b565b348015610277575f80fd5b505f805160206119a78339815191525460ff16610189565b34801561029a575f80fd5b506101c86102a9366004611689565b6001600160a01b03165f9081525f80516020611967833981519152602052604090205490565b3480156102da575f80fd5b50610224610676565b3480156102ee575f80fd5b506102246102fd366004611689565b610687565b34801561030d575f80fd5b5061022461031c366004611538565b610716565b34801561032c575f80fd5b5061022461072b565b348015610340575f80fd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b039091168152602001610161565b348015610386575f80fd5b5061015461073b565b34801561039a575f80fd5b506101896103a9366004611538565b610779565b3480156103b9575f80fd5b50610154604051806040016040528060058152602001640352e302e360dc1b81525081565b3480156103e9575f80fd5b506102246103f8366004611689565b61084a565b348015610408575f80fd5b506101c86104173660046116a2565b6109d5565b348015610427575f80fd5b50610224610436366004611689565b610a1e565b348015610446575f80fd5b50610224610455366004611689565b610a58565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0380546060915f8051602061196783398151915291610498906116d3565b80601f01602080910402602001604051908101604052809291908181526020018280546104c4906116d3565b801561050f5780601f106104e65761010080835404028352916020019161050f565b820191905f5260205f20905b8154815290600101906020018083116104f257829003601f168201915b505050505091505090565b5f33610527818585610af7565b60019150505b92915050565b6001600160a01b0383165f9081526020819052604081205460ff16156105a05760405162461bcd60e51b815260206004820152601b60248201527f48494c4f3a2053656e64657220697320626c61636b6c6973746564000000000060448201526064015b60405180910390fd5b6001600160a01b0383165f9081526020819052604090205460ff16156106085760405162461bcd60e51b815260206004820152601e60248201527f48494c4f3a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610597565b610613848484610b09565b90505b9392505050565b610625610b2c565b61062d610b87565b565b6106393382610be6565b50565b610644610c1a565b61064d82610cbe565b6106578282610cc6565b5050565b5f610664610d82565b505f8051602061198783398151915290565b61067e610b2c565b61062d5f610dcb565b61068f610b2c565b6001600160a01b0381165f9081526020819052604090205460ff166106f65760405162461bcd60e51b815260206004820181905260248201527f48494c4f3a2041646472657373206973206e6f7420626c61636b6c69737465646044820152606401610597565b6001600160a01b03165f908152602081905260409020805460ff19169055565b610721823383610e3b565b6106578282610be6565b610733610b2c565b61062d610e9e565b7f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace0480546060915f8051602061196783398151915291610498906116d3565b335f9081526020819052604081205460ff16156107d85760405162461bcd60e51b815260206004820152601b60248201527f48494c4f3a2053656e64657220697320626c61636b6c697374656400000000006044820152606401610597565b6001600160a01b0383165f9081526020819052604090205460ff16156108405760405162461bcd60e51b815260206004820152601e60248201527f48494c4f3a20526563697069656e7420697320626c61636b6c697374656400006044820152606401610597565b6106168383610ee6565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff16159067ffffffffffffffff165f8115801561088f5750825b90505f8267ffffffffffffffff1660011480156108ab5750303b155b9050811580156108b9575080155b156108d75760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561090157845460ff60401b1916600160401b1785555b6109436040518060400160405280600481526020016348494c4f60e01b8152506040518060400160405280600481526020016348494c4f60e01b815250610ef3565b61094b610f05565b610953610f0d565b61095c86610f1d565b610964610f05565b610987336109746012600a611802565b610982906308f0d180611810565b610f2e565b83156109cd57845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b6001600160a01b039182165f9081527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace016020908152604080832093909416825291909152205490565b610a26610b2c565b6001600160a01b038116610a4f57604051631e4fbdf760e01b81525f6004820152602401610597565b61063981610dcb565b610a60610b2c565b6001600160a01b0381165f9081526020819052604090205460ff1615610ad45760405162461bcd60e51b8152602060048201526024808201527f48494c4f3a204164647265737320697320616c726561647920626c61636b6c696044820152631cdd195960e21b6064820152608401610597565b6001600160a01b03165f908152602081905260409020805460ff19166001179055565b610b048383836001610f62565b505050565b5f33610b16858285610e3b565b610b21858585611046565b506001949350505050565b33610b5e7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b03161461062d5760405163118cdaa760e01b8152336004820152602401610597565b610b8f6110a3565b5f805160206119a7833981519152805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b6001600160a01b038216610c0f57604051634b637e8f60e11b81525f6004820152602401610597565b610657825f836110d2565b306001600160a01b037f000000000000000000000000c15d3f9e8b6e482ee12f5b550f9f0d2289b8867a161480610ca057507f000000000000000000000000c15d3f9e8b6e482ee12f5b550f9f0d2289b8867a6001600160a01b0316610c945f80516020611987833981519152546001600160a01b031690565b6001600160a01b031614155b1561062d5760405163703e46dd60e11b815260040160405180910390fd5b610639610b2c565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610d20575060408051601f3d908101601f19168201909252610d1d91810190611827565b60015b610d4857604051634c9c8ce360e01b81526001600160a01b0383166004820152602401610597565b5f805160206119878339815191528114610d7857604051632a87526960e21b815260048101829052602401610597565b610b0483836110dd565b306001600160a01b037f000000000000000000000000c15d3f9e8b6e482ee12f5b550f9f0d2289b8867a161461062d5760405163703e46dd60e11b815260040160405180910390fd5b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b5f610e4684846109d5565b90505f198114610e985781811015610e8a57604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610597565b610e9884848484035f610f62565b50505050565b610ea6611132565b5f805160206119a7833981519152805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833610bc8565b5f33610527818585611046565b610efb611162565b61065782826111ab565b61062d611162565b610f15611162565b61062d6111fb565b610f25611162565b6106398161121b565b6001600160a01b038216610f575760405163ec442f0560e01b81525f6004820152602401610597565b6106575f83836110d2565b5f805160206119678339815191526001600160a01b038516610f995760405163e602df0560e01b81525f6004820152602401610597565b6001600160a01b038416610fc257604051634a1406b160e11b81525f6004820152602401610597565b6001600160a01b038086165f9081526001830160209081526040808320938816835292905220839055811561103f57836001600160a01b0316856001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258560405161103691815260200190565b60405180910390a35b5050505050565b6001600160a01b03831661106f57604051634b637e8f60e11b81525f6004820152602401610597565b6001600160a01b0382166110985760405163ec442f0560e01b81525f6004820152602401610597565b610b048383836110d2565b5f805160206119a78339815191525460ff1661062d57604051638dfc202b60e01b815260040160405180910390fd5b610b04838383611223565b6110e682611236565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a280511561112a57610b048282611299565b61065761130b565b5f805160206119a78339815191525460ff161561062d5760405163d93c066560e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff1661062d57604051631afcd79f60e31b815260040160405180910390fd5b6111b3611162565b5f805160206119678339815191527f52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace036111ec8482611882565b5060048101610e988382611882565b611203611162565b5f805160206119a7833981519152805460ff19169055565b610a26611162565b61122b611132565b610b0483838361132a565b806001600160a01b03163b5f0361126b57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401610597565b5f8051602061198783398151915280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f80846001600160a01b0316846040516112b5919061193d565b5f60405180830381855af49150503d805f81146112ed576040519150601f19603f3d011682016040523d82523d5f602084013e6112f2565b606091505b5091509150611302858383611463565b95945050505050565b341561062d5760405163b398979f60e01b815260040160405180910390fd5b5f805160206119678339815191526001600160a01b0384166113645781816002015f8282546113599190611953565b909155506113d49050565b6001600160a01b0384165f90815260208290526040902054828110156113b65760405163391434e360e21b81526001600160a01b03861660048201526024810182905260448101849052606401610597565b6001600160a01b0385165f9081526020839052604090209083900390555b6001600160a01b0383166113f2576002810180548390039055611410565b6001600160a01b0383165f9081526020829052604090208054830190555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161145591815260200190565b60405180910390a350505050565b60608261147857611473826114bf565b610616565b815115801561148f57506001600160a01b0384163b155b156114b857604051639996b31560e01b81526001600160a01b0385166004820152602401610597565b5080610616565b8051156114cf5780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611533575f80fd5b919050565b5f8060408385031215611549575f80fd5b6115528361151d565b946020939093013593505050565b5f805f60608486031215611572575f80fd5b61157b8461151d565b92506115896020850161151d565b929592945050506040919091013590565b5f602082840312156115aa575f80fd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b5f80604083850312156115d6575f80fd5b6115df8361151d565b9150602083013567ffffffffffffffff8111156115fa575f80fd5b8301601f8101851361160a575f80fd5b803567ffffffffffffffff811115611624576116246115b1565b604051601f8201601f19908116603f0116810167ffffffffffffffff81118282101715611653576116536115b1565b60405281815282820160200187101561166a575f80fd5b816020840160208301375f602083830101528093505050509250929050565b5f60208284031215611699575f80fd5b6106168261151d565b5f80604083850312156116b3575f80fd5b6116bc8361151d565b91506116ca6020840161151d565b90509250929050565b600181811c908216806116e757607f821691505b60208210810361170557634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b6001815b600184111561175a5780850481111561173e5761173e61170b565b600184161561174c57908102905b60019390931c928002611723565b935093915050565b5f826117705750600161052d565b8161177c57505f61052d565b8160018114611792576002811461179c576117b8565b600191505061052d565b60ff8411156117ad576117ad61170b565b50506001821b61052d565b5060208310610133831016604e8410600b84101617156117db575081810a61052d565b6117e75f19848461171f565b805f19048211156117fa576117fa61170b565b029392505050565b5f61061660ff841683611762565b808202811582820484141761052d5761052d61170b565b5f60208284031215611837575f80fd5b5051919050565b601f821115610b0457805f5260205f20601f840160051c810160208510156118635750805b601f840160051c820191505b8181101561103f575f815560010161186f565b815167ffffffffffffffff81111561189c5761189c6115b1565b6118b0816118aa84546116d3565b8461183e565b6020601f8211600181146118e2575f83156118cb5750848201515b5f19600385901b1c1916600184901b17845561103f565b5f84815260208120601f198516915b8281101561191157878501518255602094850194600190920191016118f1565b508482101561192e57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b5f82518060208501845e5f920191825250919050565b8082018082111561052d5761052d61170b56fe52c63247e1f47db19d5ce0460030c497f067ca4cebf71ba98eeadabe20bace00360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbccd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f03300a2646970667358221220a197219684a0f5e204ea61b0609ca004adcdeba06eb65151c8b782d36d9fa53064736f6c634300081a0033
Deployed Bytecode Sourcemap
69688:2181:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23538:147;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26111:190;;;;;;;;;;-1:-1:-1;26111:190:0;;;;;:::i;:::-;;:::i;:::-;;;1085:14:1;;1078:22;1060:41;;1048:2;1033:18;26111:190:0;920:187:1;24752:155:0;;;;;;;;;;-1:-1:-1;24885:14:0;;24752:155;;;1258:25:1;;;1246:2;1231:18;24752:155:0;1112:177:1;71342:326:0;;;;;;;;;;-1:-1:-1;71342:326:0;;;;;:::i;:::-;;:::i;24603:84::-;;;;;;;;;;-1:-1:-1;24603:84:0;;24677:2;1815:36:1;;1803:2;1788:18;24603:84:0;1673:184:1;70757:65:0;;;;;;;;;;;;;:::i;:::-;;34098:89;;;;;;;;;;-1:-1:-1;34098:89:0;;;;;:::i;:::-;;:::i;67073:217::-;;;;;;:::i;:::-;;:::i;66606:136::-;;;;;;;;;;;;;:::i;37388:148::-;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;37519:9:0;;;37388:148;;24970:174;;;;;;;;;;-1:-1:-1;24970:174:0;;;;;:::i;:::-;-1:-1:-1;;;;;25116:20:0;25035:7;25116:20;;;-1:-1:-1;;;;;;;;;;;25116:20:0;;;;;;;24970:174;43295:103;;;;;;;;;;;;;:::i;70188:178::-;;;;;;;;;;-1:-1:-1;70188:178:0;;;;;:::i;:::-;;:::i;34516:161::-;;;;;;;;;;-1:-1:-1;34516:161:0;;;;;:::i;:::-;;:::i;70688:61::-;;;;;;;;;;;;;:::i;42560:147::-;;;;;;;;;;-1:-1:-1;41391:22:0;42691:8;42560:147;;-1:-1:-1;;;;;42691:8:0;;;3767:51:1;;3755:2;3740:18;42560:147:0;3621:203:1;23804:151:0;;;;;;;;;;;;;:::i;71028:306::-;;;;;;;;;;-1:-1:-1;71028:306:0;;;;;:::i;:::-;;:::i;64674:58::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;64674:58:0;;;;;70372:308;;;;;;;;;;-1:-1:-1;70372:308:0;;;;;:::i;:::-;;:::i;25594:198::-;;;;;;;;;;-1:-1:-1;25594:198:0;;;;;:::i;:::-;;:::i;43553:220::-;;;;;;;;;;-1:-1:-1;43553:220:0;;;;;:::i;:::-;;:::i;70000:180::-;;;;;;;;;;-1:-1:-1;70000:180:0;;;;;:::i;:::-;;:::i;23538:147::-;23670:7;23663:14;;23583:13;;-1:-1:-1;;;;;;;;;;;22863:20:0;23663:14;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23538:147;:::o;26111:190::-;26184:4;13813:10;26240:31;13813:10;26256:7;26265:5;26240:8;:31::i;:::-;26289:4;26282:11;;;26111:190;;;;;:::o;71342:326::-;-1:-1:-1;;;;;71489:16:0;;71458:4;71489:16;;;;;;;;;;;;;71488:17;71480:57;;;;-1:-1:-1;;;71480:57:0;;4681:2:1;71480:57:0;;;4663:21:1;4720:2;4700:18;;;4693:30;4759:29;4739:18;;;4732:57;4806:18;;71480:57:0;;;;;;;;;-1:-1:-1;;;;;71557:14:0;;:10;:14;;;;;;;;;;;;;71556:15;71548:58;;;;-1:-1:-1;;;71548:58:0;;5037:2:1;71548:58:0;;;5019:21:1;5076:2;5056:18;;;5049:30;5115:32;5095:18;;;5088:60;5165:18;;71548:58:0;4835:354:1;71548:58:0;71624:36;71643:4;71649:2;71653:6;71624:18;:36::i;:::-;71617:43;;71342:326;;;;;;:::o;70757:65::-;42446:13;:11;:13::i;:::-;70804:10:::1;:8;:10::i;:::-;70757:65::o:0;34098:89::-;34153:26;13813:10;34173:5;34153;:26::i;:::-;34098:89;:::o;67073:217::-;65528:13;:11;:13::i;:::-;67189:36:::1;67207:17;67189;:36::i;:::-;67236:46;67258:17;67277:4;67236:21;:46::i;:::-;67073:217:::0;;:::o;66606:136::-;66675:7;65808:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;66606:136:0;:::o;43295:103::-;42446:13;:11;:13::i;:::-;43360:30:::1;43387:1;43360:18;:30::i;70188:178::-:0;42446:13;:11;:13::i;:::-;-1:-1:-1;;;;;70264:19:0;::::1;:10;:19:::0;;;::::1;::::0;;;;;;;::::1;;70256:64;;;::::0;-1:-1:-1;;;70256:64:0;;5396:2:1;70256:64:0::1;::::0;::::1;5378:21:1::0;;;5415:18;;;5408:30;5474:34;5454:18;;;5447:62;5526:18;;70256:64:0::1;5194:356:1::0;70256:64:0::1;-1:-1:-1::0;;;;;70331:19:0::1;70353:5;70331:19:::0;;;::::1;::::0;;;;;;:27;;-1:-1:-1;;70331:27:0::1;::::0;;70188:178::o;34516:161::-;34592:45;34608:7;13813:10;34631:5;34592:15;:45::i;:::-;34648:21;34654:7;34663:5;34648;:21::i;70688:61::-;42446:13;:11;:13::i;:::-;70733:8:::1;:6;:8::i;23804:151::-:0;23938:9;23931:16;;23851:13;;-1:-1:-1;;;;;;;;;;;22863:20:0;23931:16;;;:::i;71028:306::-;13813:10;71126:4;71157:24;;;;;;;;;;;;;71156:25;71148:65;;;;-1:-1:-1;;;71148:65:0;;4681:2:1;71148:65:0;;;4663:21:1;4720:2;4700:18;;;4693:30;4759:29;4739:18;;;4732:57;4806:18;;71148:65:0;4479:351:1;71148:65:0;-1:-1:-1;;;;;71233:14:0;;:10;:14;;;;;;;;;;;;;71232:15;71224:58;;;;-1:-1:-1;;;71224:58:0;;5037:2:1;71224:58:0;;;5019:21:1;5076:2;5056:18;;;5049:30;5115:32;5095:18;;;5088:60;5165:18;;71224:58:0;4835:354:1;71224:58:0;71300:26;71315:2;71319:6;71300:14;:26::i;70372:308::-;12789:21;8105:15;;-1:-1:-1;;;8105:15:0;;;;8104:16;;8152:14;;7958:30;8537:16;;:34;;;;;8557:14;8537:34;8517:54;;8582:17;8602:11;:16;;8617:1;8602:16;:50;;;;-1:-1:-1;8630:4:0;8622:25;:30;8602:50;8582:70;;8670:12;8669:13;:30;;;;;8687:12;8686:13;8669:30;8665:93;;;8723:23;;-1:-1:-1;;;8723:23:0;;;;;;;;;;;8665:93;8768:18;;-1:-1:-1;;8768:18:0;8785:1;8768:18;;;8797:69;;;;8832:22;;-1:-1:-1;;;;8832:22:0;-1:-1:-1;;;8832:22:0;;;8797:69;70444:28:::1;;;;;;;;;;;;;;-1:-1:-1::0;;;70444:28:0::1;;::::0;::::1;;;;;;;;;;;;;-1:-1:-1::0;;;70444:28:0::1;;::::0;:12:::1;:28::i;:::-;70483:22;:20;:22::i;:::-;70516;:20;:22::i;:::-;70549:28;70564:12;70549:14;:28::i;:::-;70588:24;:22;:24::i;:::-;70625:47;70631:10;70655:16;24677:2:::0;70655::::1;:16;:::i;:::-;70643:28;::::0;:9:::1;:28;:::i;:::-;70625:5;:47::i;:::-;8892:14:::0;8888:104;;;8923:23;;-1:-1:-1;;;;8923:23:0;;;8966:14;;-1:-1:-1;7445:50:1;;8966:14:0;;7433:2:1;7418:18;8966:14:0;;;;;;;8888:104;7890:1109;;;;;70372:308;:::o;25594:198::-;-1:-1:-1;;;;;25755:20:0;;;25674:7;25755:20;;;:13;:20;;;;;;;;:29;;;;;;;;;;;;;25594:198::o;43553:220::-;42446:13;:11;:13::i;:::-;-1:-1:-1;;;;;43638:22:0;::::1;43634:93;;43684:31;::::0;-1:-1:-1;;;43684:31:0;;43712:1:::1;43684:31;::::0;::::1;3767:51:1::0;3740:18;;43684:31:0::1;3621:203:1::0;43634:93:0::1;43737:28;43756:8;43737:18;:28::i;70000:180::-:0;42446:13;:11;:13::i;:::-;-1:-1:-1;;;;;70075:19:0;::::1;:10;:19:::0;;;::::1;::::0;;;;;;;::::1;;70074:20;70066:69;;;::::0;-1:-1:-1;;;70066:69:0;;7708:2:1;70066:69:0::1;::::0;::::1;7690:21:1::0;7747:2;7727:18;;;7720:30;7786:34;7766:18;;;7759:62;-1:-1:-1;;;7837:18:1;;;7830:34;7881:19;;70066:69:0::1;7506:400:1::0;70066:69:0::1;-1:-1:-1::0;;;;;70146:19:0::1;:10;:19:::0;;;::::1;::::0;;;;;;:26;;-1:-1:-1;;70146:26:0::1;70168:4;70146:26;::::0;;70000:180::o;31002:130::-;31087:37;31096:5;31103:7;31112:5;31119:4;31087:8;:37::i;:::-;31002:130;;;:::o;26879:249::-;26966:4;13813:10;27024:37;27040:4;13813:10;27055:5;27024:15;:37::i;:::-;27072:26;27082:4;27088:2;27092:5;27072:9;:26::i;:::-;-1:-1:-1;27116:4:0;;26879:249;-1:-1:-1;;;;26879:249:0:o;42785:166::-;13813:10;42845:7;41391:22;42691:8;-1:-1:-1;;;;;42691:8:0;;42560:147;42845:7;-1:-1:-1;;;;;42845:23:0;;42841:103;;42892:40;;-1:-1:-1;;;42892:40:0;;13813:10;42892:40;;;3767:51:1;3740:18;;42892:40:0;3621:203:1;38413:182:0;37252:16;:14;:16::i;:::-;-1:-1:-1;;;;;;;;;;;38532:17:0;;-1:-1:-1;;38532:17:0::1;::::0;;38565:22:::1;13813:10:::0;38574:12:::1;38565:22;::::0;-1:-1:-1;;;;;3785:32:1;;;3767:51;;3755:2;3740:18;38565:22:0::1;;;;;;;38461:134;38413:182::o:0;30238:211::-;-1:-1:-1;;;;;30309:21:0;;30305:91;;30354:30;;-1:-1:-1;;;30354:30:0;;30381:1;30354:30;;;3767:51:1;3740:18;;30354:30:0;3621:203:1;30305:91:0;30406:35;30414:7;30431:1;30435:5;30406:7;:35::i;67524:319::-;67606:4;-1:-1:-1;;;;;67615:6:0;67598:23;;;:121;;;67713:6;-1:-1:-1;;;;;67677:42:0;:32;-1:-1:-1;;;;;;;;;;;58172:53:0;-1:-1:-1;;;;;58172:53:0;;58093:140;67677:32;-1:-1:-1;;;;;67677:42:0;;;67598:121;67580:256;;;67795:29;;-1:-1:-1;;;67795:29:0;;;;;;;;;;;70835:116;42446:13;:11;:13::i;69017:548::-;69135:17;-1:-1:-1;;;;;69117:50:0;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;69117:52:0;;;;;;;;-1:-1:-1;;69117:52:0;;;;;;;;;;;;:::i;:::-;;;69113:445;;69486:60;;-1:-1:-1;;;69486:60:0;;-1:-1:-1;;;;;3785:32:1;;69486:60:0;;;3767:51:1;3740:18;;69486:60:0;3621:203:1;69113:445:0;-1:-1:-1;;;;;;;;;;;69212:40:0;;69208:122;;69280:34;;-1:-1:-1;;;69280:34:0;;;;;1258:25:1;;;1231:18;;69280:34:0;1112:177:1;69208:122:0;69344:54;69374:17;69393:4;69344:29;:54::i;67966:218::-;68041:4;-1:-1:-1;;;;;68050:6:0;68033:23;;68029:148;;68136:29;;-1:-1:-1;;;68136:29:0;;;;;;;;;;;43933:253;41391:22;44084:8;;-1:-1:-1;;;;;;44103:19:0;;-1:-1:-1;;;;;44103:19:0;;;;;;;;44138:40;;44084:8;;;;;44138:40;;44007:24;;44138:40;43996:190;;43933:253;:::o;32774:487::-;32874:24;32901:25;32911:5;32918:7;32901:9;:25::i;:::-;32874:52;;-1:-1:-1;;32941:16:0;:37;32937:317;;33018:5;32999:16;:24;32995:132;;;33051:60;;-1:-1:-1;;;33051:60:0;;-1:-1:-1;;;;;8320:32:1;;33051:60:0;;;8302:51:1;8369:18;;;8362:34;;;8412:18;;;8405:34;;;8275:18;;33051:60:0;8100:345:1;32995:132:0;33170:57;33179:5;33186:7;33214:5;33195:16;:24;33221:5;33170:8;:57::i;:::-;32863:398;32774:487;;;:::o;38092:180::-;36993:19;:17;:19::i;:::-;-1:-1:-1;;;;;;;;;;;38212:16:0;;-1:-1:-1;;38212:16:0::1;38224:4;38212:16;::::0;;38244:20:::1;13813:10:::0;38251:12:::1;13733:98:::0;25349:182;25418:4;13813:10;25474:27;13813:10;25491:2;25495:5;25474:9;:27::i;23091:149::-;10796:20;:18;:20::i;:::-;23194:38:::1;23217:5;23224:7;23194:22;:38::i;33823:66::-:0;10796:20;:18;:20::i;39645:104::-;10796:20;:18;:20::i;:::-;39714:27:::1;:25;:27::i;41944:129::-:0;10796:20;:18;:20::i;:::-;42027:38:::1;42052:12;42027:24;:38::i;29697:213::-:0;-1:-1:-1;;;;;29768:21:0;;29764:93;;29813:32;;-1:-1:-1;;;29813:32:0;;29842:1;29813:32;;;3767:51:1;3740:18;;29813:32:0;3621:203:1;29764:93:0;29867:35;29883:1;29887:7;29896:5;29867:7;:35::i;31983:499::-;-1:-1:-1;;;;;;;;;;;;;;;;32150:19:0;;32146:91;;32193:32;;-1:-1:-1;;;32193:32:0;;32222:1;32193:32;;;3767:51:1;3740:18;;32193:32:0;3621:203:1;32146:91:0;-1:-1:-1;;;;;32251:21:0;;32247:92;;32296:31;;-1:-1:-1;;;32296:31:0;;32324:1;32296:31;;;3767:51:1;3740:18;;32296:31:0;3621:203:1;32247:92:0;-1:-1:-1;;;;;32349:20:0;;;;;;;:13;;;:20;;;;;;;;:29;;;;;;;;;:37;;;32397:78;;;;32448:7;-1:-1:-1;;;;;32432:31:0;32441:5;-1:-1:-1;;;;;32432:31:0;;32457:5;32432:31;;;;1258:25:1;;1246:2;1231:18;;1112:177;32432:31:0;;;;;;;;32397:78;32081:401;31983:499;;;;:::o;27513:308::-;-1:-1:-1;;;;;27597:18:0;;27593:88;;27639:30;;-1:-1:-1;;;27639:30:0;;27666:1;27639:30;;;3767:51:1;3740:18;;27639:30:0;3621:203:1;27593:88:0;-1:-1:-1;;;;;27695:16:0;;27691:88;;27735:32;;-1:-1:-1;;;27735:32:0;;27764:1;27735:32;;;3767:51:1;3740:18;;27735:32:0;3621:203:1;27691:88:0;27789:24;27797:4;27803:2;27807:5;27789:7;:24::i;37818:130::-;-1:-1:-1;;;;;;;;;;;37519:9:0;;;37877:64;;37914:15;;-1:-1:-1;;;37914:15:0;;;;;;;;;;;71674:192;71828:30;71842:4;71848:2;71852:5;71828:13;:30::i;58936:344::-;59028:37;59047:17;59028:18;:37::i;:::-;59081:27;;-1:-1:-1;;;;;59081:27:0;;;;;;;;59125:11;;:15;59121:152;;59157:53;59186:17;59205:4;59157:28;:53::i;59121:152::-;59243:18;:16;:18::i;37609:132::-;-1:-1:-1;;;;;;;;;;;37519:9:0;;;37671:63;;;37707:15;;-1:-1:-1;;;37707:15:0;;;;;;;;;;;10956:145;12789:21;12470:40;-1:-1:-1;;;12470:40:0;;;;11019:75;;11065:17;;-1:-1:-1;;;11065:17:0;;;;;;;;;;;23248:220;10796:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;23415:7:0;:15:::1;23425:5:::0;23415:7;:15:::1;:::i;:::-;-1:-1:-1::0;23441:9:0::1;::::0;::::1;:19;23453:7:::0;23441:9;:19:::1;:::i;36603:159::-:0;10796:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;36737:17:0;;-1:-1:-1;;36737:17:0::1;::::0;;36603:159::o;42081:240::-;10796:20;:18;:20::i;39972:147::-;36993:19;:17;:19::i;:::-;40081:30:::1;40095:4;40101:2;40105:5;40081:13;:30::i;58329:286::-:0;58407:17;-1:-1:-1;;;;;58407:29:0;;58440:1;58407:34;58403:121;;58465:47;;-1:-1:-1;;;58465:47:0;;-1:-1:-1;;;;;3785:32:1;;58465:47:0;;;3767:51:1;3740:18;;58465:47:0;3621:203:1;58403:121:0;-1:-1:-1;;;;;;;;;;;58534:73:0;;-1:-1:-1;;;;;;58534:73:0;-1:-1:-1;;;;;58534:73:0;;;;;;;;;;58329:286::o;49882:256::-;49965:12;49991;50005:23;50032:6;-1:-1:-1;;;;;50032:19:0;50052:4;50032:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49990:67;;;;50075:55;50102:6;50110:7;50119:10;50075:26;:55::i;:::-;50068:62;49882:256;-1:-1:-1;;;;;49882:256:0:o;62860:126::-;62911:9;:13;62907:72;;62948:19;;-1:-1:-1;;;62948:19:0;;;;;;;;;;;28145:1199;-1:-1:-1;;;;;;;;;;;;;;;;28289:18:0;;28285:558;;28445:5;28427:1;:14;;;:23;;;;;;;:::i;:::-;;;;-1:-1:-1;28285:558:0;;-1:-1:-1;28285:558:0;;-1:-1:-1;;;;;28505:17:0;;28483:19;28505:17;;;;;;;;;;;28541:19;;;28537:117;;;28588:50;;-1:-1:-1;;;28588:50:0;;-1:-1:-1;;;;;8320:32:1;;28588:50:0;;;8302:51:1;8369:18;;;8362:34;;;8412:18;;;8405:34;;;8275:18;;28588:50:0;8100:345:1;28537:117:0;-1:-1:-1;;;;;28777:17:0;;:11;:17;;;;;;;;;;28797:19;;;;28777:39;;28285:558;-1:-1:-1;;;;;28859:16:0;;28855:439;;29025:14;;;:23;;;;;;;28855:439;;;-1:-1:-1;;;;;29243:15:0;;:11;:15;;;;;;;;;;:24;;;;;;28855:439;29326:2;-1:-1:-1;;;;;29311:25:0;29320:4;-1:-1:-1;;;;;29311:25:0;;29330:5;29311:25;;;;1258::1;;1246:2;1231:18;;1112:177;29311:25:0;;;;;;;;28220:1124;28145:1199;;;:::o;50411:597::-;50559:12;50589:7;50584:417;;50613:19;50621:10;50613:7;:19::i;:::-;50584:417;;;50841:17;;:22;:49;;;;-1:-1:-1;;;;;;50867:18:0;;;:23;50841:49;50837:121;;;50918:24;;-1:-1:-1;;;50918:24:0;;-1:-1:-1;;;;;3785:32:1;;50918:24:0;;;3767:51:1;3740:18;;50918:24:0;3621:203:1;50837:121:0;-1:-1:-1;50979:10:0;50972:17;;51561:528;51694:17;;:21;51690:392;;51926:10;51920:17;51983:15;51970:10;51966:2;51962:19;51955:44;51690:392;52053:17;;-1:-1:-1;;;52053:17:0;;;;;;;;;;;14:418:1;163:2;152:9;145:21;126:4;195:6;189:13;238:6;233:2;222:9;218:18;211:34;297:6;292:2;284:6;280:15;275:2;264:9;260:18;254:50;353:1;348:2;339:6;328:9;324:22;320:31;313:42;423:2;416;412:7;407:2;399:6;395:15;391:29;380:9;376:45;372:54;364:62;;;14:418;;;;:::o;437:173::-;505:20;;-1:-1:-1;;;;;554:31:1;;544:42;;534:70;;600:1;597;590:12;534:70;437:173;;;:::o;615:300::-;683:6;691;744:2;732:9;723:7;719:23;715:32;712:52;;;760:1;757;750:12;712:52;783:29;802:9;783:29;:::i;:::-;773:39;881:2;866:18;;;;853:32;;-1:-1:-1;;;615:300:1:o;1294:374::-;1371:6;1379;1387;1440:2;1428:9;1419:7;1415:23;1411:32;1408:52;;;1456:1;1453;1446:12;1408:52;1479:29;1498:9;1479:29;:::i;:::-;1469:39;;1527:38;1561:2;1550:9;1546:18;1527:38;:::i;:::-;1294:374;;1517:48;;-1:-1:-1;;;1634:2:1;1619:18;;;;1606:32;;1294:374::o;1862:226::-;1921:6;1974:2;1962:9;1953:7;1949:23;1945:32;1942:52;;;1990:1;1987;1980:12;1942:52;-1:-1:-1;2035:23:1;;1862:226;-1:-1:-1;1862:226:1:o;2093:127::-;2154:10;2149:3;2145:20;2142:1;2135:31;2185:4;2182:1;2175:15;2209:4;2206:1;2199:15;2225:1018;2302:6;2310;2363:2;2351:9;2342:7;2338:23;2334:32;2331:52;;;2379:1;2376;2369:12;2331:52;2402:29;2421:9;2402:29;:::i;:::-;2392:39;;2482:2;2471:9;2467:18;2454:32;2509:18;2501:6;2498:30;2495:50;;;2541:1;2538;2531:12;2495:50;2564:22;;2617:4;2609:13;;2605:27;-1:-1:-1;2595:55:1;;2646:1;2643;2636:12;2595:55;2686:2;2673:16;2712:18;2704:6;2701:30;2698:56;;;2734:18;;:::i;:::-;2783:2;2777:9;2875:2;2837:17;;-1:-1:-1;;2833:31:1;;;2866:2;2829:40;2825:54;2813:67;;2910:18;2895:34;;2931:22;;;2892:62;2889:88;;;2957:18;;:::i;:::-;2993:2;2986:22;3017;;;3058:15;;;3075:2;3054:24;3051:37;-1:-1:-1;3048:57:1;;;3101:1;3098;3091:12;3048:57;3157:6;3152:2;3148;3144:11;3139:2;3131:6;3127:15;3114:50;3210:1;3205:2;3196:6;3188;3184:19;3180:28;3173:39;3231:6;3221:16;;;;;2225:1018;;;;;:::o;3430:186::-;3489:6;3542:2;3530:9;3521:7;3517:23;3513:32;3510:52;;;3558:1;3555;3548:12;3510:52;3581:29;3600:9;3581:29;:::i;3829:260::-;3897:6;3905;3958:2;3946:9;3937:7;3933:23;3929:32;3926:52;;;3974:1;3971;3964:12;3926:52;3997:29;4016:9;3997:29;:::i;:::-;3987:39;;4045:38;4079:2;4068:9;4064:18;4045:38;:::i;:::-;4035:48;;3829:260;;;;;:::o;4094:380::-;4173:1;4169:12;;;;4216;;;4237:61;;4291:4;4283:6;4279:17;4269:27;;4237:61;4344:2;4336:6;4333:14;4313:18;4310:38;4307:161;;4390:10;4385:3;4381:20;4378:1;4371:31;4425:4;4422:1;4415:15;4453:4;4450:1;4443:15;4307:161;;4094:380;;;:::o;5555:127::-;5616:10;5611:3;5607:20;5604:1;5597:31;5647:4;5644:1;5637:15;5671:4;5668:1;5661:15;5687:375;5775:1;5793:5;5807:249;5828:1;5818:8;5815:15;5807:249;;;5878:4;5873:3;5869:14;5863:4;5860:24;5857:50;;;5887:18;;:::i;:::-;5937:1;5927:8;5923:16;5920:49;;;5951:16;;;;5920:49;6034:1;6030:16;;;;;5990:15;;5807:249;;;5687:375;;;;;;:::o;6067:902::-;6116:5;6146:8;6136:80;;-1:-1:-1;6187:1:1;6201:5;;6136:80;6235:4;6225:76;;-1:-1:-1;6272:1:1;6286:5;;6225:76;6317:4;6335:1;6330:59;;;;6403:1;6398:174;;;;6310:262;;6330:59;6360:1;6351:10;;6374:5;;;6398:174;6435:3;6425:8;6422:17;6419:43;;;6442:18;;:::i;:::-;-1:-1:-1;;6498:1:1;6484:16;;6557:5;;6310:262;;6656:2;6646:8;6643:16;6637:3;6631:4;6628:13;6624:36;6618:2;6608:8;6605:16;6600:2;6594:4;6591:12;6587:35;6584:77;6581:203;;;-1:-1:-1;6693:19:1;;;6769:5;;6581:203;6816:42;-1:-1:-1;;6841:8:1;6835:4;6816:42;:::i;:::-;6894:6;6890:1;6886:6;6882:19;6873:7;6870:32;6867:58;;;6905:18;;:::i;:::-;6943:20;;6067:902;-1:-1:-1;;;6067:902:1:o;6974:140::-;7032:5;7061:47;7102:4;7092:8;7088:19;7082:4;7061:47;:::i;7119:168::-;7192:9;;;7223;;7240:15;;;7234:22;;7220:37;7210:71;;7261:18;;:::i;7911:184::-;7981:6;8034:2;8022:9;8013:7;8009:23;8005:32;8002:52;;;8050:1;8047;8040:12;8002:52;-1:-1:-1;8073:16:1;;7911:184;-1:-1:-1;7911:184:1:o;8576:518::-;8678:2;8673:3;8670:11;8667:421;;;8714:5;8711:1;8704:16;8758:4;8755:1;8745:18;8828:2;8816:10;8812:19;8809:1;8805:27;8799:4;8795:38;8864:4;8852:10;8849:20;8846:47;;;-1:-1:-1;8887:4:1;8846:47;8942:2;8937:3;8933:12;8930:1;8926:20;8920:4;8916:31;8906:41;;8997:81;9015:2;9008:5;9005:13;8997:81;;;9074:1;9060:16;;9041:1;9030:13;8997:81;;9270:1299;9396:3;9390:10;9423:18;9415:6;9412:30;9409:56;;;9445:18;;:::i;:::-;9474:97;9564:6;9524:38;9556:4;9550:11;9524:38;:::i;:::-;9518:4;9474:97;:::i;:::-;9620:4;9651:2;9640:14;;9668:1;9663:649;;;;10356:1;10373:6;10370:89;;;-1:-1:-1;10425:19:1;;;10419:26;10370:89;-1:-1:-1;;9227:1:1;9223:11;;;9219:24;9215:29;9205:40;9251:1;9247:11;;;9202:57;10472:81;;9633:930;;9663:649;8523:1;8516:14;;;8560:4;8547:18;;-1:-1:-1;;9699:20:1;;;9817:222;9831:7;9828:1;9825:14;9817:222;;;9913:19;;;9907:26;9892:42;;10020:4;10005:20;;;;9973:1;9961:14;;;;9847:12;9817:222;;;9821:3;10067:6;10058:7;10055:19;10052:201;;;10128:19;;;10122:26;-1:-1:-1;;10211:1:1;10207:14;;;10223:3;10203:24;10199:37;10195:42;10180:58;10165:74;;10052:201;-1:-1:-1;;;;10299:1:1;10283:14;;;10279:22;10266:36;;-1:-1:-1;9270:1299:1:o;10574:301::-;10703:3;10741:6;10735:13;10787:6;10780:4;10772:6;10768:17;10763:3;10757:37;10849:1;10813:16;;10838:13;;;-1:-1:-1;10813:16:1;10574:301;-1:-1:-1;10574:301:1:o;10880:125::-;10945:9;;;10966:10;;;10963:36;;;10979:18;;:::i
Swarm Source
ipfs://a197219684a0f5e204ea61b0609ca004adcdeba06eb65151c8b782d36d9fa530
Block | Transaction | Difficulty | Gas Used | Reward |
---|
Block | Uncle Number | Difficulty | Gas Used | Reward |
---|
Loading...
Loading
Loading...
Loading
Validator Index | Block | Amount |
---|
Transaction Hash | Block | Value | Eth2 PubKey | Valid |
---|
Multichain Portfolio | 26 Chains
Display all chains•
Last updated: less than 1 sec ago
Show 26 more chains Hide 26 chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.
Address QR Code
My Address - Private Name Tag or Note
My Name Tag:
Private Name Tags (up to 35 characters) can be used for easy identification of addresses
Private Note:
A private note (up to 500 characters) can be attached to this address.
Please DO NOT store any passwords or private keys here.
View all Private Name Tags