S Price: $0.067388 (+2.37%)
Gas: 55 Gwei

Contract

0x92DC9DB1751f6668A504e4650A275D547c586a38

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Initialize4499292024-12-15 17:46:15407 days ago1734284775IN
0x92DC9DB1...47c586a38
0 S0.001731261.1

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
109468972025-03-01 9:35:00331 days ago1740821700
0x92DC9DB1...47c586a38
 Contract Creation0 S
109419892025-03-01 8:59:55331 days ago1740819595
0x92DC9DB1...47c586a38
 Contract Creation0 S
109411972025-03-01 8:54:09331 days ago1740819249
0x92DC9DB1...47c586a38
 Contract Creation0 S
109404302025-03-01 8:48:15331 days ago1740818895
0x92DC9DB1...47c586a38
 Contract Creation0 S
109400052025-03-01 8:45:18331 days ago1740818718
0x92DC9DB1...47c586a38
 Contract Creation0 S
109363722025-03-01 8:18:33331 days ago1740817113
0x92DC9DB1...47c586a38
 Contract Creation0 S
109358912025-03-01 8:15:24331 days ago1740816924
0x92DC9DB1...47c586a38
 Contract Creation0 S
100799352025-02-25 15:20:34335 days ago1740496834
0x92DC9DB1...47c586a38
 Contract Creation0 S
89350152025-02-20 18:18:42340 days ago1740075522
0x92DC9DB1...47c586a38
 Contract Creation0 S
89330982025-02-20 18:08:17340 days ago1740074897
0x92DC9DB1...47c586a38
 Contract Creation0 S
89329062025-02-20 18:07:13340 days ago1740074833
0x92DC9DB1...47c586a38
 Contract Creation0 S
89030492025-02-20 15:20:50340 days ago1740064850
0x92DC9DB1...47c586a38
 Contract Creation0 S
88995072025-02-20 14:59:21340 days ago1740063561
0x92DC9DB1...47c586a38
 Contract Creation0 S
88830622025-02-20 13:15:22340 days ago1740057322
0x92DC9DB1...47c586a38
 Contract Creation0 S
88747172025-02-20 12:23:37340 days ago1740054217
0x92DC9DB1...47c586a38
 Contract Creation0 S
88499812025-02-20 9:54:26340 days ago1740045266
0x92DC9DB1...47c586a38
 Contract Creation0 S
88492172025-02-20 9:48:36340 days ago1740044916
0x92DC9DB1...47c586a38
 Contract Creation0 S
88451112025-02-20 9:21:13340 days ago1740043273
0x92DC9DB1...47c586a38
 Contract Creation0 S
88438372025-02-20 9:11:47340 days ago1740042707
0x92DC9DB1...47c586a38
 Contract Creation0 S
88419552025-02-20 8:58:30340 days ago1740041910
0x92DC9DB1...47c586a38
 Contract Creation0 S
88352402025-02-20 8:13:17340 days ago1740039197
0x92DC9DB1...47c586a38
 Contract Creation0 S
88348542025-02-20 8:10:32340 days ago1740039032
0x92DC9DB1...47c586a38
 Contract Creation0 S
88336632025-02-20 8:02:21340 days ago1740038541
0x92DC9DB1...47c586a38
 Contract Creation0 S
88216762025-02-20 6:46:29340 days ago1740033989
0x92DC9DB1...47c586a38
 Contract Creation0 S
88216742025-02-20 6:46:28340 days ago1740033988
0x92DC9DB1...47c586a38
 Contract Creation0 S
View All Internal Transactions
Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20hTokenBranchFactory

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Ownable} from "lib/solady/src/auth/Ownable.sol";

import {ERC20} from "../token/ERC20hToken.sol";

import {IERC20hTokenBranchFactory, ERC20hToken} from "../interfaces/IERC20hTokenBranchFactory.sol";

/// @title ERC20hToken Branch Factory Contract
/// @author MaiaDAO
contract ERC20hTokenBranchFactory is Ownable, IERC20hTokenBranchFactory {
    /// @notice Local Port Address
    address public immutable localPortAddress;

    /// @notice Local Branch Core Router Address responsible for the addition of new tokens to the system.
    address public localCoreRouterAddress;

    /// @notice Local hTokens deployed in the current chain.
    ERC20hToken[] public hTokens;

    /// @notice Name of the chain for token name prefix.
    string public chainName;

    /// @notice Symbol of the chain for token symbol prefix.
    string public chainSymbol;

    /*///////////////////////////////////////////////////////////////
                            CONSTRUCTOR
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Constructor for ERC20 hToken Branch Factory Contract
     *  @param _localPortAddress Local Chain Port Address.
     *  @param _chainName Name of the chain for token name prefix.
     *  @param _chainSymbol Symbol of the chain for token symbol prefix.
     *  @param _owner Owner of the contract.
     */
    constructor(address _localPortAddress, string memory _chainName, string memory _chainSymbol, address _owner) {
        require(_localPortAddress != address(0), "Port address cannot be 0");
        chainName = _chainName;
        chainSymbol = _chainSymbol;
        localPortAddress = _localPortAddress;
        _initializeOwner(_owner);
    }

    /*///////////////////////////////////////////////////////////////
                            INITIALIZER
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function to initialize the contract.
     * @param _wrappedNativeTokenAddress Address of the Local Chain's wrapped native token.
     * @param _coreRouter Address of the Local Chain's Core Router.
     */
    function initialize(address _wrappedNativeTokenAddress, address _coreRouter) external onlyOwner {
        require(_coreRouter != address(0), "CoreRouter address cannot be 0");
        renounceOwnership();

        ERC20hToken newToken = new ERC20hToken(
            localPortAddress,
            ERC20(_wrappedNativeTokenAddress).name(),
            ERC20(_wrappedNativeTokenAddress).symbol(),
            ERC20(_wrappedNativeTokenAddress).decimals()
        );

        hTokens.push(newToken);

        localCoreRouterAddress = _coreRouter;
    }

    /*///////////////////////////////////////////////////////////////
                            VIEW FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function to get the array of hTokens.
     * @return Array of hTokens.
     */
    function getHTokens() external view returns (ERC20hToken[] memory) {
        return hTokens;
    }

    /*///////////////////////////////////////////////////////////////
                    hTOKEN FACTORY EXTERNAL FUNCTIONS
    ///////////////////////////////////////////////////////////////*/

    /// @inheritdoc IERC20hTokenBranchFactory
    function createToken(string memory _name, string memory _symbol, uint8 _decimals)
        external
        requiresCoreRouter
        returns (ERC20hToken newToken)
    {
        newToken = new ERC20hToken(localPortAddress, _name, _symbol, _decimals);

        hTokens.push(newToken);
    }

    /*///////////////////////////////////////////////////////////////
                                MODIFIERS
    ///////////////////////////////////////////////////////////////*/

    /// @notice Modifier that verifies msg sender is the RootInterface Contract from Root Chain.
    modifier requiresCoreRouter() {
        if (msg.sender != localCoreRouterAddress) revert UnrecognizedCoreRouter();
        _;
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @notice Simple single owner authorization mixin.
/// @author Solady (https://github.com/vectorized/solady/blob/main/src/auth/Ownable.sol)
///
/// @dev Note:
/// This implementation does NOT auto-initialize the owner to `msg.sender`.
/// You MUST call the `_initializeOwner` in the constructor / initializer.
///
/// While the ownable portion follows
/// [EIP-173](https://eips.ethereum.org/EIPS/eip-173) for compatibility,
/// the nomenclature for the 2-step ownership handover may be unique to this codebase.
abstract contract Ownable {
    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                       CUSTOM ERRORS                        */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The caller is not authorized to call the function.
    error Unauthorized();

    /// @dev The `newOwner` cannot be the zero address.
    error NewOwnerIsZeroAddress();

    /// @dev The `pendingOwner` does not have a valid handover request.
    error NoHandoverRequest();

    /// @dev Cannot double-initialize.
    error AlreadyInitialized();

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                           EVENTS                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The ownership is transferred from `oldOwner` to `newOwner`.
    /// This event is intentionally kept the same as OpenZeppelin's Ownable to be
    /// compatible with indexers and [EIP-173](https://eips.ethereum.org/EIPS/eip-173),
    /// despite it not being as lightweight as a single argument event.
    event OwnershipTransferred(address indexed oldOwner, address indexed newOwner);

    /// @dev An ownership handover to `pendingOwner` has been requested.
    event OwnershipHandoverRequested(address indexed pendingOwner);

    /// @dev The ownership handover to `pendingOwner` has been canceled.
    event OwnershipHandoverCanceled(address indexed pendingOwner);

    /// @dev `keccak256(bytes("OwnershipTransferred(address,address)"))`.
    uint256 private constant _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE =
        0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0;

    /// @dev `keccak256(bytes("OwnershipHandoverRequested(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE =
        0xdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d;

    /// @dev `keccak256(bytes("OwnershipHandoverCanceled(address)"))`.
    uint256 private constant _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE =
        0xfa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c92;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                          STORAGE                           */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev The owner slot is given by:
    /// `bytes32(~uint256(uint32(bytes4(keccak256("_OWNER_SLOT_NOT")))))`.
    /// It is intentionally chosen to be a high value
    /// to avoid collision with lower slots.
    /// The choice of manual storage layout is to enable compatibility
    /// with both regular and upgradeable contracts.
    bytes32 internal constant _OWNER_SLOT =
        0xffffffffffffffffffffffffffffffffffffffffffffffffffffffff74873927;

    /// The ownership handover slot of `newOwner` is given by:
    /// ```
    ///     mstore(0x00, or(shl(96, user), _HANDOVER_SLOT_SEED))
    ///     let handoverSlot := keccak256(0x00, 0x20)
    /// ```
    /// It stores the expiry timestamp of the two-step ownership handover.
    uint256 private constant _HANDOVER_SLOT_SEED = 0x389a75e1;

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                     INTERNAL FUNCTIONS                     */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Override to return true to make `_initializeOwner` prevent double-initialization.
    function _guardInitializeOwner() internal pure virtual returns (bool guard) {}

    /// @dev Initializes the owner directly without authorization guard.
    /// This function must be called upon initialization,
    /// regardless of whether the contract is upgradeable or not.
    /// This is to enable generalization to both regular and upgradeable contracts,
    /// and to save gas in case the initial owner is not the caller.
    /// For performance reasons, this function will not check if there
    /// is an existing owner.
    function _initializeOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                if sload(ownerSlot) {
                    mstore(0x00, 0x0dc149f0) // `AlreadyInitialized()`.
                    revert(0x1c, 0x04)
                }
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Store the new value.
                sstore(_OWNER_SLOT, newOwner)
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, 0, newOwner)
            }
        }
    }

    /// @dev Sets the owner directly without authorization guard.
    function _setOwner(address newOwner) internal virtual {
        if (_guardInitializeOwner()) {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, or(newOwner, shl(255, iszero(newOwner))))
            }
        } else {
            /// @solidity memory-safe-assembly
            assembly {
                let ownerSlot := _OWNER_SLOT
                // Clean the upper 96 bits.
                newOwner := shr(96, shl(96, newOwner))
                // Emit the {OwnershipTransferred} event.
                log3(0, 0, _OWNERSHIP_TRANSFERRED_EVENT_SIGNATURE, sload(ownerSlot), newOwner)
                // Store the new value.
                sstore(ownerSlot, newOwner)
            }
        }
    }

    /// @dev Throws if the sender is not the owner.
    function _checkOwner() internal view virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // If the caller is not the stored owner, revert.
            if iszero(eq(caller(), sload(_OWNER_SLOT))) {
                mstore(0x00, 0x82b42900) // `Unauthorized()`.
                revert(0x1c, 0x04)
            }
        }
    }

    /// @dev Returns how long a two-step ownership handover is valid for in seconds.
    /// Override to return a different value if needed.
    /// Made internal to conserve bytecode. Wrap it in a public function if needed.
    function _ownershipHandoverValidFor() internal view virtual returns (uint64) {
        return 48 * 3600;
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                  PUBLIC UPDATE FUNCTIONS                   */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Allows the owner to transfer the ownership to `newOwner`.
    function transferOwnership(address newOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            if iszero(shl(96, newOwner)) {
                mstore(0x00, 0x7448fbae) // `NewOwnerIsZeroAddress()`.
                revert(0x1c, 0x04)
            }
        }
        _setOwner(newOwner);
    }

    /// @dev Allows the owner to renounce their ownership.
    function renounceOwnership() public payable virtual onlyOwner {
        _setOwner(address(0));
    }

    /// @dev Request a two-step ownership handover to the caller.
    /// The request will automatically expire in 48 hours (172800 seconds) by default.
    function requestOwnershipHandover() public payable virtual {
        unchecked {
            uint256 expires = block.timestamp + _ownershipHandoverValidFor();
            /// @solidity memory-safe-assembly
            assembly {
                // Compute and set the handover slot to `expires`.
                mstore(0x0c, _HANDOVER_SLOT_SEED)
                mstore(0x00, caller())
                sstore(keccak256(0x0c, 0x20), expires)
                // Emit the {OwnershipHandoverRequested} event.
                log2(0, 0, _OWNERSHIP_HANDOVER_REQUESTED_EVENT_SIGNATURE, caller())
            }
        }
    }

    /// @dev Cancels the two-step ownership handover to the caller, if any.
    function cancelOwnershipHandover() public payable virtual {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, caller())
            sstore(keccak256(0x0c, 0x20), 0)
            // Emit the {OwnershipHandoverCanceled} event.
            log2(0, 0, _OWNERSHIP_HANDOVER_CANCELED_EVENT_SIGNATURE, caller())
        }
    }

    /// @dev Allows the owner to complete the two-step ownership handover to `pendingOwner`.
    /// Reverts if there is no existing ownership handover requested by `pendingOwner`.
    function completeOwnershipHandover(address pendingOwner) public payable virtual onlyOwner {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute and set the handover slot to 0.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            let handoverSlot := keccak256(0x0c, 0x20)
            // If the handover does not exist, or has expired.
            if gt(timestamp(), sload(handoverSlot)) {
                mstore(0x00, 0x6f5e8818) // `NoHandoverRequest()`.
                revert(0x1c, 0x04)
            }
            // Set the handover slot to 0.
            sstore(handoverSlot, 0)
        }
        _setOwner(pendingOwner);
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                   PUBLIC READ FUNCTIONS                    */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Returns the owner of the contract.
    function owner() public view virtual returns (address result) {
        /// @solidity memory-safe-assembly
        assembly {
            result := sload(_OWNER_SLOT)
        }
    }

    /// @dev Returns the expiry timestamp for the two-step ownership handover to `pendingOwner`.
    function ownershipHandoverExpiresAt(address pendingOwner)
        public
        view
        virtual
        returns (uint256 result)
    {
        /// @solidity memory-safe-assembly
        assembly {
            // Compute the handover slot.
            mstore(0x0c, _HANDOVER_SLOT_SEED)
            mstore(0x00, pendingOwner)
            // Load the handover slot.
            result := sload(keccak256(0x0c, 0x20))
        }
    }

    /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/
    /*                         MODIFIERS                          */
    /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/

    /// @dev Marks a function as only callable by the owner.
    modifier onlyOwner() virtual {
        _checkOwner();
        _;
    }
}

// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/**
 * @title  ERC20 hToken Branch Contract
 * @author MaiaDAO.
 * @notice ERC20 hToken contract deployed with the Ulysses Omnichain Liquidity System.
 *         ERC20 representation of a token deposited in a  Branch Chain's Port.
 * @dev    If this is a root hToken, this asset is minted / burned in reflection of it's origin Branch Port balance.
 *         Should not be burned being stored in Root Port instead if Branch hToken mint is requested.
 */
interface IERC20hToken {
    /*///////////////////////////////////////////////////////////////
                                ERC20 LOGIC
    ///////////////////////////////////////////////////////////////*/

    /**
     * @notice Function to mint tokens.
     * @param account Address of the account to receive the tokens.
     * @param amount Amount of tokens to be minted.
     */
    function mint(address account, uint256 amount) external;

    /**
     * @notice Function to burn tokens.
     * @param account Address of the account to burn the tokens from.
     * @param amount Amount of tokens to be burned.
     */
    function burn(address account, uint256 amount) external;

    /*///////////////////////////////////////////////////////////////
                                  ERRORS
    ///////////////////////////////////////////////////////////////*/

    /// @notice Error thrown when the Port Address is the zero address.
    error InvalidPortAddress();
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ERC20hToken} from "../token/ERC20hToken.sol";

/**
 * @title  ERC20hTokenBranchFactory Contract
 * @author MaiaDAO
 * @notice Factory contract allowing for permissionless deployment of new Branch hTokens in Branch
 *  	   Chains of Ulysses Omnichain Liquidity Protocol.
 * @dev    This contract is called by the chain's Core Branch Router.
 */
interface IERC20hTokenBranchFactory {
    /*///////////////////////////////////////////////////////////////
                            hTOKEN FUNCTIONS
    ///////////////////////////////////////////////////////////////*/
    /**
     * @notice Function to create a new Branch hToken.
     * @param _name Name of the Token.
     * @param _symbol Symbol of the Token.
     * @param _decimals Decimals of the Token.
     */
    function createToken(string memory _name, string memory _symbol, uint8 _decimals)
        external
        returns (ERC20hToken newToken);

    /*///////////////////////////////////////////////////////////////
                                ERRORS
    ///////////////////////////////////////////////////////////////*/

    /// @notice Error emitted when caller is not the Core Branch Router.
    error UnrecognizedCoreRouter();

    /// @notice Error emitted when the Port Address is the zero address.
    error UnrecognizedPort();
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {Ownable} from "lib/solady/src/auth/Ownable.sol";

import {ERC20} from "lib/solmate/src/tokens/ERC20.sol";

import {IERC20hToken} from "../interfaces/IERC20hToken.sol";

/// @title ERC20 hToken Contract
/// @author MaiaDAO
contract ERC20hToken is ERC20, Ownable, IERC20hToken {
    /**
     * @notice Constructor for the ERC20hToken branch or root Contract.
     *   @param _localPortAddress Address of the local Branch or Root Port Contract.
     *   @param _name Name of the Token.
     *   @param _symbol Symbol of the Token.
     *   @param _decimals Decimals of the Token.
     */
    constructor(address _localPortAddress, string memory _name, string memory _symbol, uint8 _decimals)
        ERC20(_name, _symbol, _decimals)
    {
        if (_localPortAddress == address(0)) revert InvalidPortAddress();
        _initializeOwner(_localPortAddress);
    }

    /*///////////////////////////////////////////////////////////////
                        ERC20 LOGIC
    ///////////////////////////////////////////////////////////////*/

    /// @inheritdoc IERC20hToken
    function mint(address account, uint256 amount) external override onlyOwner {
        _mint(account, amount);
    }

    /// @inheritdoc IERC20hToken
    function burn(address account, uint256 amount) public override onlyOwner {
        _burn(account, amount);
    }
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "bytecodeHash": "none"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_localPortAddress","type":"address"},{"internalType":"string","name":"_chainName","type":"string"},{"internalType":"string","name":"_chainSymbol","type":"string"},{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"inputs":[],"name":"NewOwnerIsZeroAddress","type":"error"},{"inputs":[],"name":"NoHandoverRequest","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnrecognizedCoreRouter","type":"error"},{"inputs":[],"name":"UnrecognizedPort","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverCanceled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingOwner","type":"address"}],"name":"OwnershipHandoverRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"cancelOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"chainName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"chainSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"completeOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint8","name":"_decimals","type":"uint8"}],"name":"createToken","outputs":[{"internalType":"contract ERC20hToken","name":"newToken","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getHTokens","outputs":[{"internalType":"contract ERC20hToken[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"hTokens","outputs":[{"internalType":"contract ERC20hToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wrappedNativeTokenAddress","type":"address"},{"internalType":"address","name":"_coreRouter","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"localCoreRouterAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"localPortAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"result","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner","type":"address"}],"name":"ownershipHandoverExpiresAt","outputs":[{"internalType":"uint256","name":"result","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"requestOwnershipHandover","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"payable","type":"function"}]

60a060405234620003cc5762002e6e803803806200001d81620003d1565b9283398101608082820312620003cc576200003882620003f7565b6020838101516001600160401b039390848111620003cc57816200005e9187016200040c565b90604086015190858211620003cc5762000081606091620000899389016200040c565b9601620003f7565b6001600160a01b03959094908487161562000387578251908282116200029957600254916001948584811c941680156200037c575b8785101462000278578190601f9485811162000325575b508790858311600114620002bb57600092620002af575b5050600019600383901b1c191690851b176002555b8051928311620002995760039485548581811c911680156200028e575b8282101462000278578381116200022d575b5080928411600114620001c35750928293918392600094620001b7575b50501b9160001990841b1c19161790555b6080521680638b78c6d8195560007f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a36040516129ef90816200047f82396080518181816103850152818161084e0152610a910152f35b0151925038806200014d565b919083601f1981168760005284600020946000905b88838310620002125750505010620001f9575b505050811b0190556200015e565b015160001983861b60f8161c19169055388080620001eb565b858701518855909601959485019487935090810190620001d8565b86600052816000208480870160051c8201928488106200026e575b0160051c019086905b8281106200026157505062000130565b6000815501869062000251565b9250819262000248565b634e487b7160e01b600052602260045260246000fd5b90607f16906200011e565b634e487b7160e01b600052604160045260246000fd5b015190503880620000ec565b90879350601f198316916002600052896000209260005b8b8282106200030e5750508411620002f4575b505050811b0160025562000101565b015160001960f88460031b161c19169055388080620002e5565b8385015186558b97909501949384019301620002d2565b9091506002600052876000208580850160051c8201928a861062000372575b918991869594930160051c01915b82811062000362575050620000d5565b6000815585945089910162000352565b9250819262000344565b93607f1693620000be565b60405162461bcd60e51b815260048101859052601860248201527f506f727420616464726573732063616e6e6f74206265203000000000000000006044820152606490fd5b600080fd5b6040519190601f01601f191682016001600160401b038111838210176200029957604052565b51906001600160a01b0382168203620003cc57565b919080601f84011215620003cc5782516001600160401b038111620002995760209062000442601f8201601f19168301620003d1565b92818452828287010111620003cc5760005b8181106200046a57508260009394955001015290565b85810183015184820184015282016200045456fe60806040818152600491823610156200001757600080fd5b600092833560e01c9182631c93b03a1462000cf457508163256929621462000c8a578163450994c01462000c04578163485cc95514620008d757816354d1f13d14620008725781635abfaf6c14620008015781635ca2f696146200067e578163715018a614620005fc5781638da5cb5b1462000588578163c75b6a34146200048d578163d0ec47d5146200043a578163e8a0aed314620002bb578163f04e283e14620001ec578163f2fde38b1462000132575063fee81cf414620000da57600080fd5b346200012e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020916200011862000ec6565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576200016962000ec6565b906200017462000f77565b8160601b15620001e1575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200022262000ec6565b6200022c62000f77565b63389a75e1600c528082526020600c209283544211620002ad57508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b905034620004365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365767ffffffffffffffff908035828111620004325762000311903690830162000f2a565b6024358381116200042e576200032b903690840162000f2a565b6044359160ff831683036200042a5773ffffffffffffffffffffffffffffffffffffffff9485885416330362000402578651946118b7908187019287841090841117620003d6575091620003ab93918695936200112c87397f0000000000000000000000000000000000000000000000000000000000000000906200101c565b039084f0918215620003cd5760209350620003c6836200106f565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200055e57505050826200051391038362000deb565b8451948186019282875251809352850195925b828110620005345785870386f35b835173ffffffffffffffffffffffffffffffffffffffff1687529581019592810192840162000526565b825473ffffffffffffffffffffffffffffffffffffffff16845292840192918701918701620004fa565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200063162000f77565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8578151918160035492600184811c91818616958615620007f6575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000721575b5050506200071d92916200070d91038562000deb565b5192828493845283019062000e81565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106200076957505050820101816200070d6200071d620006f7565b8054848a0186015288955087949093019281016200074c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200070d91506200071d9050620006f7565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006ca565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b919050346200043657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000436576200091462000ec6565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200042e576200094462000f77565b831562000ba7576200095562000f77565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000b9d57869562000b7d575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000b735783949596889362000b47575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000b3d57879362000af9575b508451936118b78086019186831067ffffffffffffffff841117620003d657509162000ab793918695936200112c87397f0000000000000000000000000000000000000000000000000000000000000000906200101c565b039084f0908115620003cd575062000acf906200106f565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b34575b8162000b176020938362000deb565b810103126200042a575160ff811681036200042a57913862000a5f565b3d915062000b08565b85513d89823e3d90fd5b602091935062000b6b903d808b833e62000b62818362000deb565b81019062000fb0565b929062000a20565b84513d89823e3d90fd5b62000b959195503d8088833e62000b62818362000deb565b9338620009de565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b905034620004365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365735600154811015620004365773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8484346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e578160025492600184811c9181861695861562000de0575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000d7f575050506200071d92916200070d91038562000deb565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000dc757505050820101816200070d6200071d620006f7565b8054848a01860152889550879490930192810162000daa565b92607f169262000d3d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000e2d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000e705750506000910152565b818101518382015260200162000e5f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000ebf8151809281875287808801910162000e5c565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000eea57565b600080fd5b67ffffffffffffffff811162000e2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000eea5780359062000f448262000eef565b9262000f54604051948562000deb565b8284526020838301011162000eea57816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330362000fa257565b6382b429006000526004601cfd5b60208183031262000eea5780519067ffffffffffffffff821162000eea570181601f8201121562000eea57805162000fe88162000eef565b9262000ff8604051948562000deb565b8184526020828401011162000eea5762001019916020808501910162000e5c565b90565b9262001068906200105960609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000e81565b90858203604087015262000e81565b9416910152565b6001546801000000000000000081101562000e2d576001810180600155811015620010fc5773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a0000000000000000000000000000000000000000000000000000000000000005536f6e696300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015300000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040818152600491823610156200001757600080fd5b600092833560e01c9182631c93b03a1462000cf457508163256929621462000c8a578163450994c01462000c04578163485cc95514620008d757816354d1f13d14620008725781635abfaf6c14620008015781635ca2f696146200067e578163715018a614620005fc5781638da5cb5b1462000588578163c75b6a34146200048d578163d0ec47d5146200043a578163e8a0aed314620002bb578163f04e283e14620001ec578163f2fde38b1462000132575063fee81cf414620000da57600080fd5b346200012e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020916200011862000ec6565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576200016962000ec6565b906200017462000f77565b8160601b15620001e1575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200022262000ec6565b6200022c62000f77565b63389a75e1600c528082526020600c209283544211620002ad57508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b905034620004365760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365767ffffffffffffffff908035828111620004325762000311903690830162000f2a565b6024358381116200042e576200032b903690840162000f2a565b6044359160ff831683036200042a5773ffffffffffffffffffffffffffffffffffffffff9485885416330362000402578651946118b7908187019287841090841117620003d6575091620003ab93918695936200112c87397f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400906200101c565b039084f0918215620003cd5760209350620003c6836200106f565b5191168152f35b513d84823e3d90fd5b8960416024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b8487517f4aa0152c000000000000000000000000000000000000000000000000000000008152fd5b8680fd5b8580fd5b8480fd5b8280fd5b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5773ffffffffffffffffffffffffffffffffffffffff60209254169051908152f35b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5780516001805480835281855260208084019592939186907fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf690855b8181106200055e57505050826200051391038362000deb565b8451948186019282875251809352850195925b828110620005345785870386f35b835173ffffffffffffffffffffffffffffffffffffffff1687529581019592810192840162000526565b825473ffffffffffffffffffffffffffffffffffffffff16845292840192918701918701620004fa565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8576200063162000f77565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b828434620002b857807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b8578151918160035492600184811c91818616958615620007f6575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000721575b5050506200071d92916200070d91038562000deb565b5192828493845283019062000e81565b0390f35b9190869350600383527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b5b8284106200076957505050820101816200070d6200071d620006f7565b8054848a0186015288955087949093019281016200074c565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168782015293151560051b860190930193508492506200070d91506200071d9050620006f7565b60248360228c7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b92607f1692620006ca565b5050346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e576020905173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b919050346200043657807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011262000436576200091462000ec6565b906024359173ffffffffffffffffffffffffffffffffffffffff908184168094036200042e576200094462000f77565b831562000ba7576200095562000f77565b857fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35516928151937f06fdde0300000000000000000000000000000000000000000000000000000000855285858381845afa94851562000b9d57869562000b7d575b508251947f95d89b4100000000000000000000000000000000000000000000000000000000865286868481855afa91821562000b735783949596889362000b47575b506020908651948580927f313ce5670000000000000000000000000000000000000000000000000000000082525afa92831562000b3d57879362000af9575b508451936118b78086019186831067ffffffffffffffff841117620003d657509162000ab793918695936200112c87397f0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400906200101c565b039084f0908115620003cd575062000acf906200106f565b7fffffffffffffffffffffffff000000000000000000000000000000000000000082541617815580f35b9092506020813d821162000b34575b8162000b176020938362000deb565b810103126200042a575160ff811681036200042a57913862000a5f565b3d915062000b08565b85513d89823e3d90fd5b602091935062000b6b903d808b833e62000b62818362000deb565b81019062000fb0565b929062000a20565b84513d89823e3d90fd5b62000b959195503d8088833e62000b62818362000deb565b9338620009de565b83513d88823e3d90fd5b60648560208551917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601e60248201527f436f7265526f7574657220616464726573732063616e6e6f74206265203000006044820152fd5b905034620004365760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620004365735600154811015620004365773ffffffffffffffffffffffffffffffffffffffff906001602094527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60154169051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc360112620002b85763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8484346200012e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126200012e578160025492600184811c9181861695861562000de0575b6020968785108114620007ca578899509688969785829a5291826000146200078257505060011462000d7f575050506200071d92916200070d91038562000deb565b9190869350600283527f405787fa12a823e0f2b7631cc41b3ba8828b3321ca811111fa75cd3aa3bb5ace5b82841062000dc757505050820101816200070d6200071d620006f7565b8054848a01860152889550879490930192810162000daa565b92607f169262000d3d565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111762000e2d57604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60005b83811062000e705750506000910152565b818101518382015260200162000e5f565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f60209362000ebf8151809281875287808801910162000e5c565b0116010190565b6004359073ffffffffffffffffffffffffffffffffffffffff8216820362000eea57565b600080fd5b67ffffffffffffffff811162000e2d57601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b81601f8201121562000eea5780359062000f448262000eef565b9262000f54604051948562000deb565b8284526020838301011162000eea57816000926020809301838601378301015290565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330362000fa257565b6382b429006000526004601cfd5b60208183031262000eea5780519067ffffffffffffffff821162000eea570181601f8201121562000eea57805162000fe88162000eef565b9262000ff8604051948562000deb565b8184526020828401011162000eea5762001019916020808501910162000e5c565b90565b9262001068906200105960609473ffffffffffffffffffffffffffffffffffffffff60ff9599989916875260806020880152608087019062000e81565b90858203604087015262000e81565b9416910152565b6001546801000000000000000081101562000e2d576001810180600155811015620010fc5773ffffffffffffffffffffffffffffffffffffffff9060016000527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf60191167fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfe60e0604090808252346200049757620018b780380380916200002282856200049c565b83398101608082820312620004975781516001600160a01b038116929083900362000497576020818101516001600160401b0392908381116200049757846200006d918301620004c0565b938682015184811162000497576060916200008a918401620004c0565b91015160ff811681036200049757845194848611620004815760009580620000b3885462000537565b92601f9384811162000430575b508690848311600114620003c8578992620003bc575b50508160011b916000199060031b1c19161786555b825190858211620003a857819060019462000107865462000537565b82811162000353575b5086918311600114620002ef578892620002e3575b5050600019600383901b1c191690831b1782555b6080524660a05285518454918186620001528562000537565b9283835286830195878282169182600014620002c357505060011462000283575b5062000182925003826200049c565b519020908551908101917f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f8352868201527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260a0815260c0810192818410908411176200026f5782865251902060c052821562000260575081638b78c6d819557f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08180a351611342908162000575823960805181610c2d015260a0518161115d015260c051816111840152f35b63f0e68b9d60e01b8152600490fd5b634e487b7160e01b84526041600452602484fd5b8691508880528189209089915b858310620002aa5750506200018293508201013862000173565b8054838801850152869450889390920191810162000290565b60ff191688526200018295151560051b8501019250389150620001739050565b01519050388062000125565b8589528689208694509190601f1984168a5b898282106200033c575050841162000322575b505050811b01825562000139565b015160001960f88460031b161c1916905538808062000314565b838501518655899790950194938401930162000301565b909192508589528689208380860160051c8201928987106200039e575b91869589929594930160051c01915b8281106200038f57505062000110565b8b81558695508891016200037f565b9250819262000370565b634e487b7160e01b87526041600452602487fd5b015190503880620000d6565b898052878a209250601f1984168a5b8982821062000419575050908460019594939210620003ff575b505050811b018655620000eb565b015160001960f88460031b161c19169055388080620003f1565b6001859682939686015181550195019301620003d7565b9091508880528689208480850160051c82019289861062000477575b9085949392910160051c01905b818110620004685750620000c0565b8a815584935060010162000459565b925081926200044c565b634e487b7160e01b600052604160045260246000fd5b600080fd5b601f909101601f19168101906001600160401b038211908210176200048157604052565b919080601f8401121562000497578251906001600160401b038211620004815760405191602091620004fc601f8301601f19168401856200049c565b818452828287010111620004975760005b8181106200052357508260009394955001015290565b85810183015184820184015282016200050d565b90600182811c9216801562000569575b60208310146200055357565b634e487b7160e01b600052602260045260246000fd5b91607f16916200054756fe608060408181526004918236101561001657600080fd5b600092833560e01c91826306fdde0314610eac57508163095ea7b314610e1157816318160ddd14610dd457816323b872dd14610cba5781632569296214610c51578163313ce56714610bf55781633644e51514610bb357816340c10f1914610adb57816354d1f13d14610a7757816370a0823114610a15578163715018a6146109965781637ecebe00146109345781638da5cb5b146108c257816395d89b41146107a7578382639dc29fac146106ff57508163a9059cbb14610652578163d505accf14610357578163dd62ed3e146102df578163f04e283e14610216578163f2fde38b14610162575063fee81cf41461010e57600080fd5b3461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602091610148611099565b9063389a75e1600c525281600c20549051908152f35b5080fd5b839060207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610196611099565b9061019f6110e4565b8160601b1561020b575073ffffffffffffffffffffffffffffffffffffffff167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b637448fbae8352601cfd5b8360207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610249611099565b6102516110e4565b63389a75e1600c528082526020600c2092835442116102d157508173ffffffffffffffffffffffffffffffffffffffff929355167fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08580a35580f35b636f5e88188352601cfd5b80fd5b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092829161031c611099565b6103246110c1565b9173ffffffffffffffffffffffffffffffffffffffff8092168452865283832091168252845220549051908152f35b8280fd5b83833461015e5760e07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57610390611099565b906103996110c1565b91604435606435926084359260ff841680940361064e574285106105f1576103bf611158565b9573ffffffffffffffffffffffffffffffffffffffff8092169586895260209560058752848a209889549960018b01905585519285898501957f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c987528b89870152169a8b606086015288608086015260a085015260c084015260c0835260e0830167ffffffffffffffff94848210868311176105c457818852845190206101008501927f19010000000000000000000000000000000000000000000000000000000000008452610102860152610122850152604281526101608401948186109086111761059857848752519020835261018082015260a4356101a082015260c4356101c0909101528780528490889060809060015afa1561058e578651169687151580610585575b1561052a5786977f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259596975283528087208688528352818188205551908152a380f35b8360649251917f08c379a0000000000000000000000000000000000000000000000000000000008352820152600e60248201527f494e56414c49445f5349474e45520000000000000000000000000000000000006044820152fd5b508488146104e7565b81513d88823e3d90fd5b60248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b5060248c60418f7f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b60648860208451917f08c379a0000000000000000000000000000000000000000000000000000000008352820152601760248201527f5045524d49545f444541444c494e455f455850495245440000000000000000006044820152fd5b8680fd5b50503461015e57807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209161068d611099565b8273ffffffffffffffffffffffffffffffffffffffff60243592338552600387528285206106bc85825461111c565b90551692838152600386522081815401905582519081527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef843392a35160018152f35b8084346107a457807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126107a4577fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef602061075a611099565b73ffffffffffffffffffffffffffffffffffffffff6024359161077b6110e4565b16938486526003835280862061079283825461111c565b9055816002540360025551908152a380f35b50fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578051908260018054916107e983610f70565b8086529282811690811561087c5750600114610820575b5050506108128261081c940383610fc3565b5191829182611033565b0390f35b94508085527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf65b8286106108645750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610847565b61081c9750869350602092506108129491507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001682840152151560051b82010194610800565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e5760209073ffffffffffffffffffffffffffffffffffffffff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754915191168152f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610986611099565b1681526005845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc576109c86110e4565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffff748739278181547f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e08280a35580f35b50503461015e5760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e578060209273ffffffffffffffffffffffffffffffffffffffff610a67611099565b1681526003845220549051908152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c52338152806020600c2055337ffa7b8eab7da67f412cc9575ed43464468f9bfbae89d1675917346ca6d8fe3c928280a280f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357610b13611099565b60243591610b1f6110e4565b60025490838201809211610b875750849273ffffffffffffffffffffffffffffffffffffffff7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9360209360025516948585526003835280852082815401905551908152a380f35b8560116024927f4e487b7100000000000000000000000000000000000000000000000000000000835252fd5b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e57602090610bee611158565b9051908152f35b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020905160ff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b83807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc5763389a75e1600c523381526202a30042016020600c2055337fdbf36a107da19e49527a7176a1babf963b4b0ff8cde35ee35d6cd8f1f9ac7e1d8280a280f35b8284346102dc5760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126102dc57610cf3611099565b7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef610d1c6110c1565b946044358573ffffffffffffffffffffffffffffffffffffffff80951694858752602098848a958652838920338a52865283892054857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db1575b50505086885260038552828820610d9285825461111c565b9055169586815260038452208181540190558551908152a35160018152f35b610dba9161111c565b90888a528652838920338a528652838920558a8085610d7a565b50503461015e57817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261015e576020906002549051908152f35b90503461035357817ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357602092610e4c611099565b9183602435928392338252875273ffffffffffffffffffffffffffffffffffffffff8282209516948582528752205582519081527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925843392a35160018152f35b8490843461035357827ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc36011261035357828054610ee981610f70565b8085529160019180831690811561087c5750600114610f14575050506108128261081c940383610fc3565b80809650527f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b828610610f585750505061081282602061081c9582010194610800565b80546020878701810191909152909501948101610f3b565b90600182811c92168015610fb9575b6020831014610f8a57565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b91607f1691610f7f565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761100457604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60208082528251818301819052939260005b858110611085575050507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006040809697860101520116010190565b818101830151848201604001528201611045565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b600080fd5b6024359073ffffffffffffffffffffffffffffffffffffffff821682036110bc57565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffff7487392754330361110e57565b6382b429006000526004601cfd5b9190820391821161112957565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000467f0000000000000000000000000000000000000000000000000000000000000000036111a657507f000000000000000000000000000000000000000000000000000000000000000090565b604051815482916111b682610f70565b80825281602094858201946001908782821691826000146112f95750506001146112a0575b506111e892500382610fc3565b51902091604051918201927f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f845260408301527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608301524660808301523060a083015260a0825260c082019082821067ffffffffffffffff831117611273575060405251902090565b807f4e487b7100000000000000000000000000000000000000000000000000000000602492526041600452fd5b87805286915087907f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e5635b8583106112e15750506111e89350820101386111db565b805483880185015286945088939092019181016112ca565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001688526111e895151560051b85010192503891506111db905056fea164736f6c6343000813000aa164736f6c6343000813000a

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

0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a0000000000000000000000000000000000000000000000000000000000000005536f6e696300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000015300000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _localPortAddress (address): 0x0000151d008235A6cC00004F00FA2bDF9dF95400
Arg [1] : _chainName (string): Sonic
Arg [2] : _chainSymbol (string): S
Arg [3] : _owner (address): 0x9f1A52dB8b0465cf189206B3A36303cd415A199a

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000151d008235a6cc00004f00fa2bdf9df95400
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [3] : 0000000000000000000000009f1a52db8b0465cf189206b3a36303cd415a199a
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 536f6e6963000000000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [7] : 5300000000000000000000000000000000000000000000000000000000000000


Block Transaction Gas Used Reward
view all blocks ##produced##

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.