ETH Price: $3,399.73 (+2.60%)

Token

TokenRun (TATA)
 

Overview

Max Total Supply

10,000 TATA

Holders

8,735

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
angle1012.eth
Balance
1 TATA
0x7cd71b5171983009c7b366da9a0a851816ee2efa
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
TransparentUpgradeableProxy

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-06-16
*/

// File: .deps/npm/@openzeppelin/contracts/utils/StorageSlot.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

pragma solidity ^0.8.0;

/**
 * @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(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 *
 * _Available since v4.1 for `address`, `bool`, `bytes32`, `uint256`._
 * _Available since v4.9 for `string`, `bytes`._
 */
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: .deps/npm/@openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     *
     * Furthermore, `isContract` will also return true if the target contract within
     * the same transaction is already scheduled for destruction by `SELFDESTRUCT`,
     * which only has an effect at the end of a transaction.
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://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.0/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResultFromTarget(target, success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) 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(errorMessage);
        }
    }
}

// File: .deps/npm/@openzeppelin/contracts/interfaces/draft-IERC1822.sol


// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/draft-IERC1822.sol)

pragma solidity ^0.8.0;

/**
 * @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: .deps/npm/@openzeppelin/contracts/interfaces/IERC1967.sol


// OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC1967.sol)

pragma solidity ^0.8.0;

/**
 * @dev ERC-1967: Proxy Storage Slots. This interface contains the events defined in the ERC.
 *
 * _Available since v4.8.3._
 */
interface IERC1967 {
    /**
     * @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);
}

// File: .deps/npm/@openzeppelin/contracts/proxy/beacon/IBeacon.sol


// OpenZeppelin Contracts v4.4.1 (proxy/beacon/IBeacon.sol)

pragma solidity ^0.8.0;

/**
 * @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.
     *
     * {BeaconProxy} will check that this address is a contract.
     */
    function implementation() external view returns (address);
}

// File: .deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Upgrade.sol


// OpenZeppelin Contracts (last updated v4.9.0) (proxy/ERC1967/ERC1967Upgrade.sol)

pragma solidity ^0.8.2;






/**
 * @dev This abstract contract provides getters and event emitting update functions for
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967] slots.
 *
 * _Available since v4.1._
 */
abstract contract ERC1967Upgrade is IERC1967 {
    // This is the keccak-256 hash of "eip1967.proxy.rollback" subtracted by 1
    bytes32 private constant _ROLLBACK_SLOT = 0x4910fdfa16fed3260ed0e7147f7cc6da11a60208b5b9406d12a635614ffd9143;

    /**
     * @dev Storage slot with the address of the current implementation.
     * This is the keccak-256 hash of "eip1967.proxy.implementation" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;

    /**
     * @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 {
        require(Address.isContract(newImplementation), "ERC1967: new implementation is not a contract");
        StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
    }

    /**
     * @dev Perform implementation upgrade
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeTo(address newImplementation) internal {
        _setImplementation(newImplementation);
        emit Upgraded(newImplementation);
    }

    /**
     * @dev Perform implementation upgrade with additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCall(address newImplementation, bytes memory data, bool forceCall) internal {
        _upgradeTo(newImplementation);
        if (data.length > 0 || forceCall) {
            Address.functionDelegateCall(newImplementation, data);
        }
    }

    /**
     * @dev Perform implementation upgrade with security checks for UUPS proxies, and additional setup call.
     *
     * Emits an {Upgraded} event.
     */
    function _upgradeToAndCallUUPS(address newImplementation, bytes memory data, bool forceCall) internal {
        // Upgrades from old implementations will perform a rollback test. This test requires the new
        // implementation to upgrade back to the old, non-ERC1822 compliant, implementation. Removing
        // this special case will break upgrade paths from old UUPS implementation to new ones.
        if (StorageSlot.getBooleanSlot(_ROLLBACK_SLOT).value) {
            _setImplementation(newImplementation);
        } else {
            try IERC1822Proxiable(newImplementation).proxiableUUID() returns (bytes32 slot) {
                require(slot == _IMPLEMENTATION_SLOT, "ERC1967Upgrade: unsupported proxiableUUID");
            } catch {
                revert("ERC1967Upgrade: new implementation is not UUPS");
            }
            _upgradeToAndCall(newImplementation, data, forceCall);
        }
    }

    /**
     * @dev Storage slot with the admin of the contract.
     * This is the keccak-256 hash of "eip1967.proxy.admin" subtracted by 1, and is
     * validated in the constructor.
     */
    bytes32 internal constant _ADMIN_SLOT = 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;

    /**
     * @dev Returns the current admin.
     */
    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 {
        require(newAdmin != address(0), "ERC1967: new admin is the zero address");
        StorageSlot.getAddressSlot(_ADMIN_SLOT).value = newAdmin;
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {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 bytes32(uint256(keccak256('eip1967.proxy.beacon')) - 1)) and is validated in the constructor.
     */
    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 {
        require(Address.isContract(newBeacon), "ERC1967: new beacon is not a contract");
        require(
            Address.isContract(IBeacon(newBeacon).implementation()),
            "ERC1967: beacon implementation is not a contract"
        );
        StorageSlot.getAddressSlot(_BEACON_SLOT).value = newBeacon;
    }

    /**
     * @dev Perform beacon upgrade with additional setup call. Note: This upgrades the address of the beacon, it does
     * not upgrade the implementation contained in the beacon (see {UpgradeableBeacon-_setImplementation} for that).
     *
     * Emits a {BeaconUpgraded} event.
     */
    function _upgradeBeaconToAndCall(address newBeacon, bytes memory data, bool forceCall) internal {
        _setBeacon(newBeacon);
        emit BeaconUpgraded(newBeacon);
        if (data.length > 0 || forceCall) {
            Address.functionDelegateCall(IBeacon(newBeacon).implementation(), data);
        }
    }
}

// File: .deps/npm/@openzeppelin/contracts/proxy/Proxy.sol


// OpenZeppelin Contracts (last updated v4.6.0) (proxy/Proxy.sol)

pragma solidity ^0.8.0;

/**
 * @dev This abstract contract provides a fallback function that delegates all calls to another contract using the EVM
 * instruction `delegatecall`. We refer to the second contract as the _implementation_ behind the proxy, and it has to
 * be specified by overriding the virtual {_implementation} function.
 *
 * Additionally, delegation to the implementation can be triggered manually through the {_fallback} function, or to a
 * different contract through the {_delegate} function.
 *
 * The success and return data of the delegated call will be returned back to the caller of the proxy.
 */
abstract contract Proxy {
    /**
     * @dev Delegates the current call to `implementation`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _delegate(address implementation) internal virtual {
        assembly {
            // Copy msg.data. We take full control of memory in this inline assembly
            // block because it will not return to Solidity code. We overwrite the
            // Solidity scratch pad at memory position 0.
            calldatacopy(0, 0, calldatasize())

            // Call the implementation.
            // out and outsize are 0 because we don't know the size yet.
            let result := delegatecall(gas(), implementation, 0, calldatasize(), 0, 0)

            // Copy the returned data.
            returndatacopy(0, 0, returndatasize())

            switch result
            // delegatecall returns 0 on error.
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /**
     * @dev This is a virtual function that should be overridden so it returns the address to which the fallback function
     * and {_fallback} should delegate.
     */
    function _implementation() internal view virtual returns (address);

    /**
     * @dev Delegates the current call to the address returned by `_implementation()`.
     *
     * This function does not return to its internal call site, it will return directly to the external caller.
     */
    function _fallback() internal virtual {
        _beforeFallback();
        _delegate(_implementation());
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if no other
     * function in the contract matches the call data.
     */
    fallback() external payable virtual {
        _fallback();
    }

    /**
     * @dev Fallback function that delegates calls to the address returned by `_implementation()`. Will run if call data
     * is empty.
     */
    receive() external payable virtual {
        _fallback();
    }

    /**
     * @dev Hook that is called before falling back to the implementation. Can happen as part of a manual `_fallback`
     * call, or as part of the Solidity `fallback` or `receive` functions.
     *
     * If overridden should call `super._beforeFallback()`.
     */
    function _beforeFallback() internal virtual {}
}

// File: .deps/npm/@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol


// OpenZeppelin Contracts (last updated v4.7.0) (proxy/ERC1967/ERC1967Proxy.sol)

pragma solidity ^0.8.0;



/**
 * @dev This contract implements an upgradeable proxy. It is upgradeable because calls are delegated to an
 * implementation address that can be changed. This address is stored in storage in the location specified by
 * https://eips.ethereum.org/EIPS/eip-1967[EIP1967], so that it doesn't conflict with the storage layout of the
 * implementation behind the proxy.
 */
contract ERC1967Proxy is Proxy, ERC1967Upgrade {
    /**
     * @dev Initializes the upgradeable proxy with an initial implementation specified by `_logic`.
     *
     * If `_data` is nonempty, it's used as data in a delegate call to `_logic`. This will typically be an encoded
     * function call, and allows initializing the storage of the proxy like a Solidity constructor.
     */
    constructor(address _logic, bytes memory _data) payable {
        _upgradeToAndCall(_logic, _data, false);
    }

    /**
     * @dev Returns the current implementation address.
     */
    function _implementation() internal view virtual override returns (address impl) {
        return ERC1967Upgrade._getImplementation();
    }
}

// File: .deps/npm/@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol


// OpenZeppelin Contracts (last updated v4.9.0) (proxy/transparent/TransparentUpgradeableProxy.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for {TransparentUpgradeableProxy}. In order to implement transparency, {TransparentUpgradeableProxy}
 * does not implement this interface directly, and some of its functions are implemented by an internal dispatch
 * mechanism. The compiler is unaware that these functions are implemented by {TransparentUpgradeableProxy} and will not
 * include them in the ABI so this interface must be used to interact with it.
 */
interface ITransparentUpgradeableProxy is IERC1967 {
    function admin() external view returns (address);

    function implementation() external view returns (address);

    function changeAdmin(address) external;

    function upgradeTo(address) external;

    function upgradeToAndCall(address, bytes memory) external payable;
}

/**
 * @dev This contract implements a proxy that is upgradeable by an admin.
 *
 * To avoid https://medium.com/nomic-labs-blog/malicious-backdoors-in-ethereum-proxies-62629adf3357[proxy selector
 * clashing], which can potentially be used in an attack, this contract uses the
 * https://blog.openzeppelin.com/the-transparent-proxy-pattern/[transparent proxy pattern]. This pattern implies two
 * things that go hand in hand:
 *
 * 1. If any account other than the admin calls the proxy, the call will be forwarded to the implementation, even if
 * that call matches one of the admin functions exposed by the proxy itself.
 * 2. If the admin calls the proxy, it can access the admin functions, but its calls will never be forwarded to the
 * implementation. If the admin tries to call a function on the implementation it will fail with an error that says
 * "admin cannot fallback to proxy target".
 *
 * These properties mean that the admin account can only be used for admin actions like upgrading the proxy or changing
 * the admin, so it's best if it's a dedicated account that is not used for anything else. This will avoid headaches due
 * to sudden errors when trying to call a function from the proxy implementation.
 *
 * Our recommendation is for the dedicated account to be an instance of the {ProxyAdmin} contract. If set up this way,
 * you should think of the `ProxyAdmin` instance as the real administrative interface of your proxy.
 *
 * NOTE: The real interface of this proxy is that defined in `ITransparentUpgradeableProxy`. This contract does not
 * inherit from that interface, and instead the admin functions are implicitly implemented using a custom dispatch
 * mechanism in `_fallback`. Consequently, the compiler will not produce an ABI for this contract. This is necessary to
 * fully implement transparency without decoding reverts caused by selector clashes between the proxy and the
 * implementation.
 *
 * WARNING: It is not recommended to extend this contract to add additional external functions. If you do so, the compiler
 * will not check that there are no selector conflicts, due to the note above. A selector clash between any new function
 * and the functions declared in {ITransparentUpgradeableProxy} will be resolved in favor of the new one. This could
 * render the admin operations inaccessible, which could prevent upgradeability. Transparency may also be compromised.
 */
contract TransparentUpgradeableProxy is ERC1967Proxy {
    /**
     * @dev Initializes an upgradeable proxy managed by `_admin`, backed by the implementation at `_logic`, and
     * optionally initialized with `_data` as explained in {ERC1967Proxy-constructor}.
     */
    constructor(address _logic, address admin_, bytes memory _data) payable ERC1967Proxy(_logic, _data) {
        _changeAdmin(admin_);
    }

    /**
     * @dev Modifier used internally that will delegate the call to the implementation unless the sender is the admin.
     *
     * CAUTION: This modifier is deprecated, as it could cause issues if the modified function has arguments, and the
     * implementation provides a function with the same selector.
     */
    modifier ifAdmin() {
        if (msg.sender == _getAdmin()) {
            _;
        } else {
            _fallback();
        }
    }

    /**
     * @dev If caller is the admin process the call internally, otherwise transparently fallback to the proxy behavior
     */
    function _fallback() internal virtual override {
        if (msg.sender == _getAdmin()) {
            bytes memory ret;
            bytes4 selector = msg.sig;
            if (selector == ITransparentUpgradeableProxy.upgradeTo.selector) {
                ret = _dispatchUpgradeTo();
            } else if (selector == ITransparentUpgradeableProxy.upgradeToAndCall.selector) {
                ret = _dispatchUpgradeToAndCall();
            } else if (selector == ITransparentUpgradeableProxy.changeAdmin.selector) {
                ret = _dispatchChangeAdmin();
            } else if (selector == ITransparentUpgradeableProxy.admin.selector) {
                ret = _dispatchAdmin();
            } else if (selector == ITransparentUpgradeableProxy.implementation.selector) {
                ret = _dispatchImplementation();
            } else {
                revert("TransparentUpgradeableProxy: admin cannot fallback to proxy target");
            }
            assembly {
                return(add(ret, 0x20), mload(ret))
            }
        } else {
            super._fallback();
        }
    }

    /**
     * @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 _dispatchAdmin() private returns (bytes memory) {
        _requireZeroValue();

        address admin = _getAdmin();
        return abi.encode(admin);
    }

    /**
     * @dev Returns the current implementation.
     *
     * 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.
     * `0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc`
     */
    function _dispatchImplementation() private returns (bytes memory) {
        _requireZeroValue();

        address implementation = _implementation();
        return abi.encode(implementation);
    }

    /**
     * @dev Changes the admin of the proxy.
     *
     * Emits an {AdminChanged} event.
     */
    function _dispatchChangeAdmin() private returns (bytes memory) {
        _requireZeroValue();

        address newAdmin = abi.decode(msg.data[4:], (address));
        _changeAdmin(newAdmin);

        return "";
    }

    /**
     * @dev Upgrade the implementation of the proxy.
     */
    function _dispatchUpgradeTo() private returns (bytes memory) {
        _requireZeroValue();

        address newImplementation = abi.decode(msg.data[4:], (address));
        _upgradeToAndCall(newImplementation, bytes(""), false);

        return "";
    }

    /**
     * @dev Upgrade the implementation of the proxy, and then call a function from the new implementation as specified
     * by `data`, which should be an encoded function call. This is useful to initialize new storage variables in the
     * proxied contract.
     */
    function _dispatchUpgradeToAndCall() private returns (bytes memory) {
        (address newImplementation, bytes memory data) = abi.decode(msg.data[4:], (address, bytes));
        _upgradeToAndCall(newImplementation, data, true);

        return "";
    }

    /**
     * @dev Returns the current admin.
     *
     * CAUTION: This function is deprecated. Use {ERC1967Upgrade-_getAdmin} instead.
     */
    function _admin() internal view virtual returns (address) {
        return _getAdmin();
    }

    /**
     * @dev To keep this contract fully transparent, all `ifAdmin` functions must be payable. This helper is here to
     * emulate some proxy functions being non-payable while still allowing value to pass through.
     */
    function _requireZeroValue() private {
        require(msg.value == 0);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_logic","type":"address"},{"internalType":"address","name":"admin_","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"previousAdmin","type":"address"},{"indexed":false,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beacon","type":"address"}],"name":"BeaconUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"implementation","type":"address"}],"name":"Upgraded","type":"event"},{"stateMutability":"payable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]

608060405260405162001a6d38038062001a6d833981810160405281019062000029919062000748565b82816200003f828260006200005b60201b60201c565b505062000052826200009e60201b60201c565b50505062000a8a565b6200006c83620000fc60201b60201c565b6000825111806200007a5750805b1562000099576200009783836200015360201b620002991760201c565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f620000cf6200018960201b60201c565b82604051620000e0929190620007d4565b60405180910390a1620000f981620001ed60201b60201c565b50565b6200010d81620002dd60201b60201c565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b606062000181838360405180606001604052806027815260200162001a4660279139620003b360201b60201c565b905092915050565b6000620001c47fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6200044560201b620002c61760201c565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036200025f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002569062000888565b60405180910390fd5b80620002997fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6200044560201b620002c61760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b620002f3816200044f60201b620002d01760201c565b62000335576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200032c9062000920565b60405180910390fd5b806200036f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6200044560201b620002c61760201c565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60606000808573ffffffffffffffffffffffffffffffffffffffff1685604051620003df91906200098f565b600060405180830381855af49150503d80600081146200041c576040519150601f19603f3d011682016040523d82523d6000602084013e62000421565b606091505b50915091506200043a868383876200047260201b60201c565b925050509392505050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60608315620004e2576000835103620004d95762000496856200044f60201b60201c565b620004d8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004cf90620009f8565b60405180910390fd5b5b829050620004f5565b620004f48383620004fd60201b60201c565b5b949350505050565b600082511115620005115781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000547919062000a66565b60405180910390fd5b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620005918262000564565b9050919050565b620005a38162000584565b8114620005af57600080fd5b50565b600081519050620005c38162000598565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200061e82620005d3565b810181811067ffffffffffffffff8211171562000640576200063f620005e4565b5b80604052505050565b60006200065562000550565b905062000663828262000613565b919050565b600067ffffffffffffffff821115620006865762000685620005e4565b5b6200069182620005d3565b9050602081019050919050565b60005b83811015620006be578082015181840152602081019050620006a1565b60008484015250505050565b6000620006e1620006db8462000668565b62000649565b9050828152602081018484840111156200070057620006ff620005ce565b5b6200070d8482856200069e565b509392505050565b600082601f8301126200072d576200072c620005c9565b5b81516200073f848260208601620006ca565b91505092915050565b6000806000606084860312156200076457620007636200055a565b5b60006200077486828701620005b2565b93505060206200078786828701620005b2565b925050604084015167ffffffffffffffff811115620007ab57620007aa6200055f565b5b620007b98682870162000715565b9150509250925092565b620007ce8162000584565b82525050565b6000604082019050620007eb6000830185620007c3565b620007fa6020830184620007c3565b9392505050565b600082825260208201905092915050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006200087060268362000801565b91506200087d8262000812565b604082019050919050565b60006020820190508181036000830152620008a38162000861565b9050919050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b600062000908602d8362000801565b91506200091582620008aa565b604082019050919050565b600060208201905081810360008301526200093b81620008f9565b9050919050565b600081519050919050565b600081905092915050565b6000620009658262000942565b6200097181856200094d565b9350620009838185602086016200069e565b80840191505092915050565b60006200099d828462000958565b915081905092915050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000620009e0601d8362000801565b9150620009ed82620009a8565b602082019050919050565b6000602082019050818103600083015262000a1381620009d1565b9050919050565b600081519050919050565b600062000a328262000a1a565b62000a3e818562000801565b935062000a508185602086016200069e565b62000a5b81620005d3565b840191505092915050565b6000602082019050818103600083015262000a82818462000a25565b905092915050565b610fac8062000a9a6000396000f3fe6080604052366100135761001161001d565b005b61001b61001d565b005b6100256102f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361028f576060600080357fffffffff00000000000000000000000000000000000000000000000000000000169050633659cfe660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036100dc576100d561034a565b9150610287565b634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610137576101306103a9565b9150610286565b638f28397060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101925761018b6103f6565b9150610285565b63f851a44060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101ed576101e6610443565b9150610284565b635c60da1b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036102485761024161047f565b9150610283565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a906109c6565b60405180910390fd5b5b5b5b5b815160208301f35b6102976104bb565b565b60606102be8383604051806060016040528060278152602001610f50602791396104d5565b905092915050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006103217fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061035461055b565b600080366004908092610369939291906109fa565b8101906103769190610a9d565b90506103938160405180602001604052806000815250600061056a565b6040518060200160405280600081525091505090565b606060008060003660049080926103c2939291906109fa565b8101906103cf9190610c10565b915091506103df8282600161056a565b604051806020016040528060008152509250505090565b606061040061055b565b600080366004908092610415939291906109fa565b8101906104229190610a9d565b905061042d81610596565b6040518060200160405280600081525091505090565b606061044d61055b565b60006104576102f3565b90508060405160200161046a9190610c8d565b60405160208183030381529060405291505090565b606061048961055b565b60006104936105e2565b9050806040516020016104a69190610c8d565b60405160208183030381529060405291505090565b6104c36105f1565b6104d36104ce6105e2565b6105f3565b565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104ff9190610d19565b600060405180830381855af49150503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b509150915061055086838387610619565b925050509392505050565b6000341461056857600080fd5b565b6105738361068e565b6000825111806105805750805b156105915761058f8383610299565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6105bf6102f3565b826040516105ce929190610d30565b60405180910390a16105df816106dd565b50565b60006105ec6107bd565b905090565b565b3660008037600080366000845af43d6000803e8060008114610614573d6000f35b3d6000fd5b6060831561067b57600083510361067357610633856102d0565b610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066990610da5565b60405180910390fd5b5b829050610686565b6106858383610814565b5b949350505050565b61069781610864565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390610e37565b60405180910390fd5b806107797fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006107eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000825111156108275781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b9190610e9b565b60405180910390fd5b61086d816102d0565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390610f2f565b60405180910390fd5b806108d97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082825260208201905092915050565b7f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60008201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760208201527f6574000000000000000000000000000000000000000000000000000000000000604082015250565b60006109b060428361091d565b91506109bb8261092e565b606082019050919050565b600060208201905081810360008301526109df816109a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60008085851115610a0e57610a0d6109f0565b5b83861115610a1f57610a1e6109f5565b5b6001850283019150848603905094509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a6a82610a3f565b9050919050565b610a7a81610a5f565b8114610a8557600080fd5b50565b600081359050610a9781610a71565b92915050565b600060208284031215610ab357610ab2610a35565b5b6000610ac184828501610a88565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b1d82610ad4565b810181811067ffffffffffffffff82111715610b3c57610b3b610ae5565b5b80604052505050565b6000610b4f6109e6565b9050610b5b8282610b14565b919050565b600067ffffffffffffffff821115610b7b57610b7a610ae5565b5b610b8482610ad4565b9050602081019050919050565b82818337600083830152505050565b6000610bb3610bae84610b60565b610b45565b905082815260208101848484011115610bcf57610bce610acf565b5b610bda848285610b91565b509392505050565b600082601f830112610bf757610bf6610aca565b5b8135610c07848260208601610ba0565b91505092915050565b60008060408385031215610c2757610c26610a35565b5b6000610c3585828601610a88565b925050602083013567ffffffffffffffff811115610c5657610c55610a3a565b5b610c6285828601610be2565b9150509250929050565b6000610c7782610a3f565b9050919050565b610c8781610c6c565b82525050565b6000602082019050610ca26000830184610c7e565b92915050565b600081519050919050565b600081905092915050565b60005b83811015610cdc578082015181840152602081019050610cc1565b60008484015250505050565b6000610cf382610ca8565b610cfd8185610cb3565b9350610d0d818560208601610cbe565b80840191505092915050565b6000610d258284610ce8565b915081905092915050565b6000604082019050610d456000830185610c7e565b610d526020830184610c7e565b9392505050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610d8f601d8361091d565b9150610d9a82610d59565b602082019050919050565b60006020820190508181036000830152610dbe81610d82565b9050919050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610e2160268361091d565b9150610e2c82610dc5565b604082019050919050565b60006020820190508181036000830152610e5081610e14565b9050919050565b600081519050919050565b6000610e6d82610e57565b610e77818561091d565b9350610e87818560208601610cbe565b610e9081610ad4565b840191505092915050565b60006020820190508181036000830152610eb58184610e62565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000610f19602d8361091d565b9150610f2482610ebd565b604082019050919050565b60006020820190508181036000830152610f4881610f0c565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d64736f6c63430008120033416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c65640000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052366100135761001161001d565b005b61001b61001d565b005b6100256102f3565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff160361028f576060600080357fffffffff00000000000000000000000000000000000000000000000000000000169050633659cfe660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036100dc576100d561034a565b9150610287565b634f1ef28660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191603610137576101306103a9565b9150610286565b638f28397060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101925761018b6103f6565b9150610285565b63f851a44060e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036101ed576101e6610443565b9150610284565b635c60da1b60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916036102485761024161047f565b9150610283565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161027a906109c6565b60405180910390fd5b5b5b5b5b815160208301f35b6102976104bb565b565b60606102be8383604051806060016040528060278152602001610f50602791396104d5565b905092915050565b6000819050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006103217fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606061035461055b565b600080366004908092610369939291906109fa565b8101906103769190610a9d565b90506103938160405180602001604052806000815250600061056a565b6040518060200160405280600081525091505090565b606060008060003660049080926103c2939291906109fa565b8101906103cf9190610c10565b915091506103df8282600161056a565b604051806020016040528060008152509250505090565b606061040061055b565b600080366004908092610415939291906109fa565b8101906104229190610a9d565b905061042d81610596565b6040518060200160405280600081525091505090565b606061044d61055b565b60006104576102f3565b90508060405160200161046a9190610c8d565b60405160208183030381529060405291505090565b606061048961055b565b60006104936105e2565b9050806040516020016104a69190610c8d565b60405160208183030381529060405291505090565b6104c36105f1565b6104d36104ce6105e2565b6105f3565b565b60606000808573ffffffffffffffffffffffffffffffffffffffff16856040516104ff9190610d19565b600060405180830381855af49150503d806000811461053a576040519150601f19603f3d011682016040523d82523d6000602084013e61053f565b606091505b509150915061055086838387610619565b925050509392505050565b6000341461056857600080fd5b565b6105738361068e565b6000825111806105805750805b156105915761058f8383610299565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6105bf6102f3565b826040516105ce929190610d30565b60405180910390a16105df816106dd565b50565b60006105ec6107bd565b905090565b565b3660008037600080366000845af43d6000803e8060008114610614573d6000f35b3d6000fd5b6060831561067b57600083510361067357610633856102d0565b610672576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161066990610da5565b60405180910390fd5b5b829050610686565b6106858383610814565b5b949350505050565b61069781610864565b8073ffffffffffffffffffffffffffffffffffffffff167fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b60405160405180910390a250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361074c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161074390610e37565b60405180910390fd5b806107797fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610360001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006107eb7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000825111156108275781518083602001fd5b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085b9190610e9b565b60405180910390fd5b61086d816102d0565b6108ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108a390610f2f565b60405180910390fd5b806108d97f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc60001b6102c6565b60000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600082825260208201905092915050565b7f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60008201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760208201527f6574000000000000000000000000000000000000000000000000000000000000604082015250565b60006109b060428361091d565b91506109bb8261092e565b606082019050919050565b600060208201905081810360008301526109df816109a3565b9050919050565b6000604051905090565b600080fd5b600080fd5b60008085851115610a0e57610a0d6109f0565b5b83861115610a1f57610a1e6109f5565b5b6001850283019150848603905094509492505050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610a6a82610a3f565b9050919050565b610a7a81610a5f565b8114610a8557600080fd5b50565b600081359050610a9781610a71565b92915050565b600060208284031215610ab357610ab2610a35565b5b6000610ac184828501610a88565b91505092915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b610b1d82610ad4565b810181811067ffffffffffffffff82111715610b3c57610b3b610ae5565b5b80604052505050565b6000610b4f6109e6565b9050610b5b8282610b14565b919050565b600067ffffffffffffffff821115610b7b57610b7a610ae5565b5b610b8482610ad4565b9050602081019050919050565b82818337600083830152505050565b6000610bb3610bae84610b60565b610b45565b905082815260208101848484011115610bcf57610bce610acf565b5b610bda848285610b91565b509392505050565b600082601f830112610bf757610bf6610aca565b5b8135610c07848260208601610ba0565b91505092915050565b60008060408385031215610c2757610c26610a35565b5b6000610c3585828601610a88565b925050602083013567ffffffffffffffff811115610c5657610c55610a3a565b5b610c6285828601610be2565b9150509250929050565b6000610c7782610a3f565b9050919050565b610c8781610c6c565b82525050565b6000602082019050610ca26000830184610c7e565b92915050565b600081519050919050565b600081905092915050565b60005b83811015610cdc578082015181840152602081019050610cc1565b60008484015250505050565b6000610cf382610ca8565b610cfd8185610cb3565b9350610d0d818560208601610cbe565b80840191505092915050565b6000610d258284610ce8565b915081905092915050565b6000604082019050610d456000830185610c7e565b610d526020830184610c7e565b9392505050565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b6000610d8f601d8361091d565b9150610d9a82610d59565b602082019050919050565b60006020820190508181036000830152610dbe81610d82565b9050919050565b7f455243313936373a206e65772061646d696e20697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000610e2160268361091d565b9150610e2c82610dc5565b604082019050919050565b60006020820190508181036000830152610e5081610e14565b9050919050565b600081519050919050565b6000610e6d82610e57565b610e77818561091d565b9350610e87818560208601610cbe565b610e9081610ad4565b840191505092915050565b60006020820190508181036000830152610eb58184610e62565b905092915050565b7f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60008201527f6f74206120636f6e747261637400000000000000000000000000000000000000602082015250565b6000610f19602d8361091d565b9150610f2482610ebd565b604082019050919050565b60006020820190508181036000830152610f4881610f0c565b905091905056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a26469706673582212201dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d64736f6c63430008120033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d00000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _logic (address): 0x5a2abf65647Dd952cd5d5C42F1513C5dBd7A4eb3
Arg [1] : admin_ (address): 0xc99F5C87EBCf56f28aBCDA90DdCfcae8ca4dB89D
Arg [2] : _data (bytes): 0x

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000005a2abf65647dd952cd5d5c42f1513c5dbd7a4eb3
Arg [1] : 000000000000000000000000c99f5c87ebcf56f28abcda90ddcfcae8ca4db89d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

30333:5084:0:-:0;;;;;;25182:11;:9;:11::i;:::-;30333:5084;;24951:11;:9;:11::i;:::-;30333:5084;31377:1125;31453:11;:9;:11::i;:::-;31439:25;;:10;:25;;;31435:1060;;31481:16;31512:15;31530:7;;;;31512:25;;31568:47;;;31556:59;;;:8;:59;;;;31552:791;;31642:20;:18;:20::i;:::-;31636:26;;31552:791;;;31700:54;;;31688:66;;;:8;:66;;;;31684:659;;31781:27;:25;:27::i;:::-;31775:33;;31684:659;;;31846:49;;;31834:61;;;:8;:61;;;;31830:513;;31922:22;:20;:22::i;:::-;31916:28;;31830:513;;;31982:43;;;31970:55;;;:8;:55;;;;31966:377;;32052:16;:14;:16::i;:::-;32046:22;;31966:377;;;32106:52;;;32094:64;;;:8;:64;;;;32090:253;;32185:25;:23;:25::i;:::-;32179:31;;32090:253;;;32251:76;;;;;;;;;;:::i;:::-;;;;;;;;32090:253;31966:377;31830:513;31684:659;31552:791;32414:3;32408:10;32401:4;32396:3;32392:14;32385:34;31435:1060;32466:17;:15;:17::i;:::-;31377:1125::o;11159:200::-;11242:12;11274:77;11295:6;11303:4;11274:77;;;;;;;;;;;;;;;;;:20;:77::i;:::-;11267:84;;11159:200;;;;:::o;1957:195::-;2018:21;2130:4;2120:14;;1957:195;;;:::o;5767:326::-;5827:4;6084:1;6062:7;:19;;;:23;6055:30;;5767:326;;;:::o;19855:124::-;19899:7;19926:39;19722:66;19953:11;;19926:26;:39::i;:::-;:45;;;;;;;;;;;;19919:52;;19855:124;:::o;34025:262::-;34072:12;34097:19;:17;:19::i;:::-;34129:25;34168:8;;34177:1;34168:12;;;;;;;;;:::i;:::-;34157:35;;;;;;;:::i;:::-;34129:63;;34203:54;34221:17;34240:9;;;;;;;;;;;;34251:5;34203:17;:54::i;:::-;34270:9;;;;;;;;;;;;;;;34025:262;:::o;34578:259::-;34632:12;34658:25;34685:17;34717:8;;34726:1;34717:12;;;;;;;;;:::i;:::-;34706:42;;;;;;;:::i;:::-;34657:91;;;;34759:48;34777:17;34796:4;34802;34759:17;:48::i;:::-;34820:9;;;;;;;;;;;;;;;;34578:259;:::o;33722:223::-;33771:12;33796:19;:17;:19::i;:::-;33828:16;33858:8;;33867:1;33858:12;;;;;;;;;:::i;:::-;33847:35;;;;;;;:::i;:::-;33828:54;;33893:22;33906:8;33893:12;:22::i;:::-;33928:9;;;;;;;;;;;;;;;33722:223;:::o;32862:170::-;32905:12;32930:19;:17;:19::i;:::-;32962:13;32978:11;:9;:11::i;:::-;32962:27;;33018:5;33007:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;33000:24;;;32862:170;:::o;33401:203::-;33453:12;33478:19;:17;:19::i;:::-;33510:22;33535:17;:15;:17::i;:::-;33510:42;;33581:14;33570:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;33563:33;;;33401:203;:::o;24588:113::-;24637:17;:15;:17::i;:::-;24665:28;24675:17;:15;:17::i;:::-;24665:9;:28::i;:::-;24588:113::o;11553:332::-;11698:12;11724;11738:23;11765:6;:19;;11785:4;11765:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11723:67;;;;11808:69;11835:6;11843:7;11852:10;11864:12;11808:26;:69::i;:::-;11801:76;;;;11553:332;;;;;:::o;35335:79::-;35404:1;35391:9;:14;35383:23;;;;;;35335:79::o;18090:270::-;18199:29;18210:17;18199:10;:29::i;:::-;18257:1;18243:4;:11;:15;:28;;;;18262:9;18243:28;18239:114;;;18288:53;18317:17;18336:4;18288:28;:53::i;:::-;;18239:114;18090:270;;;:::o;20388:138::-;20453:35;20466:11;:9;:11::i;:::-;20479:8;20453:35;;;;;;;:::i;:::-;;;;;;;;20499:19;20509:8;20499:9;:19::i;:::-;20388:138;:::o;26712:142::-;26779:12;26811:35;:33;:35::i;:::-;26804:42;;26712:142;:::o;25491:46::-;:::o;23178:918::-;23521:14;23518:1;23515;23502:34;23739:1;23736;23720:14;23717:1;23701:14;23694:5;23681:60;23818:16;23815:1;23812;23797:38;23858:6;23932:1;23927:68;;;;24046:16;24043:1;24036:27;23927:68;23963:16;23960:1;23953:27;12181:644;12366:12;12395:7;12391:427;;;12444:1;12423:10;:17;:22;12419:290;;12641:18;12652:6;12641:10;:18::i;:::-;12633:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;12419:290;12730:10;12723:17;;;;12391:427;12773:33;12781:10;12793:12;12773:7;:33::i;:::-;12181:644;;;;;;;:::o;17794:155::-;17861:37;17880:17;17861:18;:37::i;:::-;17923:17;17914:27;;;;;;;;;;;;17794:155;:::o;20066:204::-;20150:1;20130:22;;:8;:22;;;20122:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;20254:8;20206:39;19722:66;20233:11;;20206:26;:39::i;:::-;:45;;;:56;;;;;;;;;;;;;;;;;;20066:204;:::o;17181:142::-;17234:7;17261:48;17031:66;17288:20;;17261:26;:48::i;:::-;:54;;;;;;;;;;;;17254:61;;17181:142;:::o;13367:552::-;13548:1;13528:10;:17;:21;13524:388;;;13760:10;13754:17;13817:15;13804:10;13800:2;13796:19;13789:44;13524:388;13887:12;13880:20;;;;;;;;;;;:::i;:::-;;;;;;;;17419:262;17501:37;17520:17;17501:18;:37::i;:::-;17493:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;17656:17;17599:48;17031:66;17626:20;;17599:26;:48::i;:::-;:54;;;:74;;;;;;;;;;;;;;;;;;17419:262;:::o;7:169:1:-;91:11;125:6;120:3;113:19;165:4;160:3;156:14;141:29;;7:169;;;;:::o;182:290::-;322:34;318:1;310:6;306:14;299:58;391:34;386:2;378:6;374:15;367:59;460:4;455:2;447:6;443:15;436:29;182:290;:::o;478:366::-;620:3;641:67;705:2;700:3;641:67;:::i;:::-;634:74;;717:93;806:3;717:93;:::i;:::-;835:2;830:3;826:12;819:19;;478:366;;;:::o;850:419::-;1016:4;1054:2;1043:9;1039:18;1031:26;;1103:9;1097:4;1093:20;1089:1;1078:9;1074:17;1067:47;1131:131;1257:4;1131:131;:::i;:::-;1123:139;;850:419;;;:::o;1275:75::-;1308:6;1341:2;1335:9;1325:19;;1275:75;:::o;1356:117::-;1465:1;1462;1455:12;1479:117;1588:1;1585;1578:12;1602:469;1707:9;1718;1756:8;1744:10;1741:24;1738:111;;;1768:79;;:::i;:::-;1738:111;1874:6;1864:8;1861:20;1858:107;;;1884:79;;:::i;:::-;1858:107;2015:1;2003:10;1999:18;1991:6;1987:31;1974:44;;2054:10;2044:8;2040:25;2027:38;;1602:469;;;;;;;:::o;2077:117::-;2186:1;2183;2176:12;2200:117;2309:1;2306;2299:12;2323:126;2360:7;2400:42;2393:5;2389:54;2378:65;;2323:126;;;:::o;2455:104::-;2500:7;2529:24;2547:5;2529:24;:::i;:::-;2518:35;;2455:104;;;:::o;2565:138::-;2646:32;2672:5;2646:32;:::i;:::-;2639:5;2636:43;2626:71;;2693:1;2690;2683:12;2626:71;2565:138;:::o;2709:155::-;2763:5;2801:6;2788:20;2779:29;;2817:41;2852:5;2817:41;:::i;:::-;2709:155;;;;:::o;2870:345::-;2937:6;2986:2;2974:9;2965:7;2961:23;2957:32;2954:119;;;2992:79;;:::i;:::-;2954:119;3112:1;3137:61;3190:7;3181:6;3170:9;3166:22;3137:61;:::i;:::-;3127:71;;3083:125;2870:345;;;;:::o;3221:117::-;3330:1;3327;3320:12;3344:117;3453:1;3450;3443:12;3467:102;3508:6;3559:2;3555:7;3550:2;3543:5;3539:14;3535:28;3525:38;;3467:102;;;:::o;3575:180::-;3623:77;3620:1;3613:88;3720:4;3717:1;3710:15;3744:4;3741:1;3734:15;3761:281;3844:27;3866:4;3844:27;:::i;:::-;3836:6;3832:40;3974:6;3962:10;3959:22;3938:18;3926:10;3923:34;3920:62;3917:88;;;3985:18;;:::i;:::-;3917:88;4025:10;4021:2;4014:22;3804:238;3761:281;;:::o;4048:129::-;4082:6;4109:20;;:::i;:::-;4099:30;;4138:33;4166:4;4158:6;4138:33;:::i;:::-;4048:129;;;:::o;4183:307::-;4244:4;4334:18;4326:6;4323:30;4320:56;;;4356:18;;:::i;:::-;4320:56;4394:29;4416:6;4394:29;:::i;:::-;4386:37;;4478:4;4472;4468:15;4460:23;;4183:307;;;:::o;4496:146::-;4593:6;4588:3;4583;4570:30;4634:1;4625:6;4620:3;4616:16;4609:27;4496:146;;;:::o;4648:423::-;4725:5;4750:65;4766:48;4807:6;4766:48;:::i;:::-;4750:65;:::i;:::-;4741:74;;4838:6;4831:5;4824:21;4876:4;4869:5;4865:16;4914:3;4905:6;4900:3;4896:16;4893:25;4890:112;;;4921:79;;:::i;:::-;4890:112;5011:54;5058:6;5053:3;5048;5011:54;:::i;:::-;4731:340;4648:423;;;;;:::o;5090:338::-;5145:5;5194:3;5187:4;5179:6;5175:17;5171:27;5161:122;;5202:79;;:::i;:::-;5161:122;5319:6;5306:20;5344:78;5418:3;5410:6;5403:4;5395:6;5391:17;5344:78;:::i;:::-;5335:87;;5151:277;5090:338;;;;:::o;5434:668::-;5519:6;5527;5576:2;5564:9;5555:7;5551:23;5547:32;5544:119;;;5582:79;;:::i;:::-;5544:119;5702:1;5727:61;5780:7;5771:6;5760:9;5756:22;5727:61;:::i;:::-;5717:71;;5673:125;5865:2;5854:9;5850:18;5837:32;5896:18;5888:6;5885:30;5882:117;;;5918:79;;:::i;:::-;5882:117;6023:62;6077:7;6068:6;6057:9;6053:22;6023:62;:::i;:::-;6013:72;;5808:287;5434:668;;;;;:::o;6108:96::-;6145:7;6174:24;6192:5;6174:24;:::i;:::-;6163:35;;6108:96;;;:::o;6210:118::-;6297:24;6315:5;6297:24;:::i;:::-;6292:3;6285:37;6210:118;;:::o;6334:222::-;6427:4;6465:2;6454:9;6450:18;6442:26;;6478:71;6546:1;6535:9;6531:17;6522:6;6478:71;:::i;:::-;6334:222;;;;:::o;6562:98::-;6613:6;6647:5;6641:12;6631:22;;6562:98;;;:::o;6666:147::-;6767:11;6804:3;6789:18;;6666:147;;;;:::o;6819:246::-;6900:1;6910:113;6924:6;6921:1;6918:13;6910:113;;;7009:1;7004:3;7000:11;6994:18;6990:1;6985:3;6981:11;6974:39;6946:2;6943:1;6939:10;6934:15;;6910:113;;;7057:1;7048:6;7043:3;7039:16;7032:27;6881:184;6819:246;;;:::o;7071:386::-;7175:3;7203:38;7235:5;7203:38;:::i;:::-;7257:88;7338:6;7333:3;7257:88;:::i;:::-;7250:95;;7354:65;7412:6;7407:3;7400:4;7393:5;7389:16;7354:65;:::i;:::-;7444:6;7439:3;7435:16;7428:23;;7179:278;7071:386;;;;:::o;7463:271::-;7593:3;7615:93;7704:3;7695:6;7615:93;:::i;:::-;7608:100;;7725:3;7718:10;;7463:271;;;;:::o;7740:332::-;7861:4;7899:2;7888:9;7884:18;7876:26;;7912:71;7980:1;7969:9;7965:17;7956:6;7912:71;:::i;:::-;7993:72;8061:2;8050:9;8046:18;8037:6;7993:72;:::i;:::-;7740:332;;;;;:::o;8078:179::-;8218:31;8214:1;8206:6;8202:14;8195:55;8078:179;:::o;8263:366::-;8405:3;8426:67;8490:2;8485:3;8426:67;:::i;:::-;8419:74;;8502:93;8591:3;8502:93;:::i;:::-;8620:2;8615:3;8611:12;8604:19;;8263:366;;;:::o;8635:419::-;8801:4;8839:2;8828:9;8824:18;8816:26;;8888:9;8882:4;8878:20;8874:1;8863:9;8859:17;8852:47;8916:131;9042:4;8916:131;:::i;:::-;8908:139;;8635:419;;;:::o;9060:225::-;9200:34;9196:1;9188:6;9184:14;9177:58;9269:8;9264:2;9256:6;9252:15;9245:33;9060:225;:::o;9291:366::-;9433:3;9454:67;9518:2;9513:3;9454:67;:::i;:::-;9447:74;;9530:93;9619:3;9530:93;:::i;:::-;9648:2;9643:3;9639:12;9632:19;;9291:366;;;:::o;9663:419::-;9829:4;9867:2;9856:9;9852:18;9844:26;;9916:9;9910:4;9906:20;9902:1;9891:9;9887:17;9880:47;9944:131;10070:4;9944:131;:::i;:::-;9936:139;;9663:419;;;:::o;10088:99::-;10140:6;10174:5;10168:12;10158:22;;10088:99;;;:::o;10193:377::-;10281:3;10309:39;10342:5;10309:39;:::i;:::-;10364:71;10428:6;10423:3;10364:71;:::i;:::-;10357:78;;10444:65;10502:6;10497:3;10490:4;10483:5;10479:16;10444:65;:::i;:::-;10534:29;10556:6;10534:29;:::i;:::-;10529:3;10525:39;10518:46;;10285:285;10193:377;;;;:::o;10576:313::-;10689:4;10727:2;10716:9;10712:18;10704:26;;10776:9;10770:4;10766:20;10762:1;10751:9;10747:17;10740:47;10804:78;10877:4;10868:6;10804:78;:::i;:::-;10796:86;;10576:313;;;;:::o;10895:232::-;11035:34;11031:1;11023:6;11019:14;11012:58;11104:15;11099:2;11091:6;11087:15;11080:40;10895:232;:::o;11133:366::-;11275:3;11296:67;11360:2;11355:3;11296:67;:::i;:::-;11289:74;;11372:93;11461:3;11372:93;:::i;:::-;11490:2;11485:3;11481:12;11474:19;;11133:366;;;:::o;11505:419::-;11671:4;11709:2;11698:9;11694:18;11686:26;;11758:9;11752:4;11748:20;11744:1;11733:9;11729:17;11722:47;11786:131;11912:4;11786:131;:::i;:::-;11778:139;;11505:419;;;:::o

Swarm Source

ipfs://1dfdf1b6881f67ea42bcc0a7957649b028a5e891bed1ccb5bbbdff541e24833d
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.