Sonic Testnet

Contract

0x9CDde85d32420C429fCe14cEFD07182c61712e88
Source Code Source Code

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
Deposit77882672025-12-19 11:28:2638 days ago1766143706IN
0x9CDde85d...c61712e88
15 S0.00009761.1
Activate76972412025-12-18 7:31:0439 days ago1766043064IN
0x9CDde85d...c61712e88
1 S0.000207441
Grant Tunnel Act...76972292025-12-18 7:30:5139 days ago1766043051IN
0x9CDde85d...c61712e88
0 S0.000024321

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To Amount
103626312026-01-26 22:05:452 mins ago1769465145
0x9CDde85d...c61712e88
0 S
103615432026-01-26 21:05:441 hr ago1769461544
0x9CDde85d...c61712e88
0 S
103604662026-01-26 20:05:442 hrs ago1769457944
0x9CDde85d...c61712e88
0 S
103594052026-01-26 19:05:433 hrs ago1769454343
0x9CDde85d...c61712e88
0 S
103583322026-01-26 18:05:454 hrs ago1769450745
0x9CDde85d...c61712e88
0 S
103572532026-01-26 17:05:455 hrs ago1769447145
0x9CDde85d...c61712e88
0 S
103561752026-01-26 16:05:446 hrs ago1769443544
0x9CDde85d...c61712e88
0 S
103551122026-01-26 15:05:467 hrs ago1769439946
0x9CDde85d...c61712e88
0 S
103540312026-01-26 14:05:448 hrs ago1769436344
0x9CDde85d...c61712e88
0 S
103529722026-01-26 13:05:449 hrs ago1769432744
0x9CDde85d...c61712e88
0 S
103518962026-01-26 12:05:4310 hrs ago1769429143
0x9CDde85d...c61712e88
0 S
103508152026-01-26 11:05:4411 hrs ago1769425544
0x9CDde85d...c61712e88
0 S
103497392026-01-26 10:05:4512 hrs ago1769421945
0x9CDde85d...c61712e88
0 S
103486732026-01-26 9:05:4413 hrs ago1769418344
0x9CDde85d...c61712e88
0 S
103475922026-01-26 8:05:4514 hrs ago1769414745
0x9CDde85d...c61712e88
0 S
103465032026-01-26 7:05:4415 hrs ago1769411144
0x9CDde85d...c61712e88
0 S
103454372026-01-26 6:05:4616 hrs ago1769407546
0x9CDde85d...c61712e88
0 S
103443592026-01-26 5:05:4917 hrs ago1769403949
0x9CDde85d...c61712e88
0 S
103432742026-01-26 4:05:4618 hrs ago1769400346
0x9CDde85d...c61712e88
0 S
103421972026-01-26 3:05:4719 hrs ago1769396747
0x9CDde85d...c61712e88
0 S
103411222026-01-26 2:05:4320 hrs ago1769393143
0x9CDde85d...c61712e88
0 S
103400482026-01-26 1:05:4621 hrs ago1769389546
0x9CDde85d...c61712e88
0 S
103389772026-01-26 0:05:4422 hrs ago1769385944
0x9CDde85d...c61712e88
0 S
103379242026-01-25 23:05:4423 hrs ago1769382344
0x9CDde85d...c61712e88
0 S
103368472026-01-25 22:05:4424 hrs ago1769378744
0x9CDde85d...c61712e88
0 S
View All Internal Transactions
Loading...
Loading

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x19f11B28...8E3ccb99F
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
PacketConsumer

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
shanghai EvmVersion, MIT license

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

import "@openzeppelin/contracts/access/AccessControl.sol";

import "./interfaces/IPacketConsumer.sol";
import "./interfaces/ITunnelRouter.sol";
import "./interfaces/IVault.sol";

import "./libraries/PacketDecoder.sol";

contract PacketConsumer is IPacketConsumer, AccessControl {
    // The tunnel router contract.
    address public immutable tunnelRouter;

    // Mapping between a signal ID and its corresponding latest price object.
    mapping(bytes32 => Price) internal _prices;

    // Role identifier for accounts allowed to activate/deactivate tunnel.
    bytes32 public constant TUNNEL_ACTIVATOR_ROLE = keccak256("TUNNEL_ACTIVATOR_ROLE");

    modifier onlyTunnelRouter() {
        if (msg.sender != tunnelRouter) {
            revert UnauthorizedTunnelRouter();
        }
        _;
    }

    constructor(
        address tunnelRouter_
    ) {
        tunnelRouter = tunnelRouter_;

        _grantRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _grantRole(TUNNEL_ACTIVATOR_ROLE, msg.sender);
    }

    /**
     * @dev Converts a string to a right-aligned bytes32 value
     */
    function stringToRightAlignedBytes32(
        string memory _s
    ) public pure returns (bytes32 s) {
        if (bytes(_s).length > 32) {
            revert StringInputExceedsBytes32(_s);
        }
        assembly {
            s := mload(add(_s, 32))
        }
        s >>= (32 - bytes(_s).length) * 8;
    }

    /**
     * @dev See {IPacketConsumer-getPrice}.
     */
    function getPrice(string calldata _signalId) external view returns (Price memory) {
        Price memory price = _prices[stringToRightAlignedBytes32(_signalId)];
        if (price.price == 0) {
            revert SignalIdNotAvailable(_signalId);
        }
        return price;
    }

    /**
     * @dev See {IPacketConsumer-getPriceBatch}.
     */
    function getPriceBatch(string[] calldata _signalIds) external view returns (Price[] memory) {
        Price[] memory priceList = new Price[](_signalIds.length);
        for (uint i = 0; i < _signalIds.length; i++) {
            Price memory price = _prices[stringToRightAlignedBytes32(_signalIds[i])];
            if (price.price == 0) {
                revert SignalIdNotAvailable(_signalIds[i]);
            }
            priceList[i] = price;
        }
        return priceList;
    }

    /**
     * @dev See {IPacketConsumer-process}.
     */
    function process(
        PacketDecoder.TssMessage memory data
    ) external onlyTunnelRouter {
        PacketDecoder.Packet memory packet = data.packet;
        for (uint256 i = 0; i < packet.signals.length; i++) {
            _prices[packet.signals[i].signal] = Price({
                price: packet.signals[i].price,
                timestamp: packet.timestamp
            });
        }
    }

    /**
     * @dev See {IPacketConsumer-activate}.
     */
    function activate(
        uint64 tunnelId,
        uint64 latestSeq
    ) external payable onlyRole(TUNNEL_ACTIVATOR_ROLE) {
        ITunnelRouter(tunnelRouter).activate{value: msg.value}(
            tunnelId,
            latestSeq
        );
    }

    /**
     * @dev See {IPacketConsumer-deactivate}.
     */
    function deactivate(uint64 tunnelId) external onlyRole(TUNNEL_ACTIVATOR_ROLE) {
        ITunnelRouter(tunnelRouter).deactivate(tunnelId);
    }

    /**
     * @dev See {IPacketConsumer-deposit}.
     */
    function deposit(uint64 tunnelId) external payable {
        IVault vault = ITunnelRouter(tunnelRouter).vault();

        vault.deposit{value: msg.value}(tunnelId, address(this));
    }

    /**
     * @dev See {IPacketConsumer-withdraw}.
     */
    function withdraw(uint64 tunnelId, uint256 amount) external onlyRole(DEFAULT_ADMIN_ROLE) {
        IVault vault = ITunnelRouter(tunnelRouter).vault();

        vault.withdraw(tunnelId, msg.sender, amount);
    }

    /**
     * @dev See {IPacketConsumer-withdrawAll}.
     */
    function withdrawAll(uint64 tunnelId) external onlyRole(DEFAULT_ADMIN_ROLE) {
        IVault vault = ITunnelRouter(tunnelRouter).vault();

        vault.withdrawAll(tunnelId, msg.sender);
    }

    /// @dev Grants `TUNNEL_ACTIVATOR_ROLE` to `accounts`
    function grantTunnelActivatorRole(address[] calldata accounts) external onlyRole(DEFAULT_ADMIN_ROLE) {
        for (uint256 i = 0; i < accounts.length; i++) {
            _grantRole(TUNNEL_ACTIVATOR_ROLE, accounts[i]);
        }
    }

    /// @dev Revokes `TUNNEL_ACTIVATOR_ROLE` from `accounts`
    function revokeTunnelActivatorRole(address[] calldata accounts) external onlyRole(DEFAULT_ADMIN_ROLE) {
        for (uint256 i = 0; i < accounts.length; i++) {
            _revokeRole(TUNNEL_ACTIVATOR_ROLE, accounts[i]);
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/AccessControl.sol)

pragma solidity ^0.8.20;

import {IAccessControl} from "./IAccessControl.sol";
import {Context} from "../utils/Context.sol";
import {ERC165} from "../utils/introspection/ERC165.sol";

/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```solidity
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```solidity
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it. We recommend using {AccessControlDefaultAdminRules}
 * to enforce additional security measures for this role.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address account => bool) hasRole;
        bytes32 adminRole;
    }

    mapping(bytes32 role => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with an {AccessControlUnauthorizedAccount} error including the required role.
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual returns (bool) {
        return _roles[role].hasRole[account];
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `_msgSender()`
     * is missing `role`. Overriding this function changes the behavior of the {onlyRole} modifier.
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Reverts with an {AccessControlUnauthorizedAccount} error if `account`
     * is missing `role`.
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert AccessControlUnauthorizedAccount(account, role);
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address callerConfirmation) public virtual {
        if (callerConfirmation != _msgSender()) {
            revert AccessControlBadConfirmation();
        }

        _revokeRole(role, callerConfirmation);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Attempts to grant `role` to `account` and returns a boolean indicating if `role` was granted.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual returns (bool) {
        if (!hasRole(role, account)) {
            _roles[role].hasRole[account] = true;
            emit RoleGranted(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Attempts to revoke `role` to `account` and returns a boolean indicating if `role` was revoked.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual returns (bool) {
        if (hasRole(role, account)) {
            _roles[role].hasRole[account] = false;
            emit RoleRevoked(role, account, _msgSender());
            return true;
        } else {
            return false;
        }
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

import "../libraries/PacketDecoder.sol";

interface IPacketConsumer {
    // ========================================
    // Structs
    // ========================================

    // An object that contains the price of a signal ID.
    struct Price {
        uint64 price;
        int64 timestamp;
    }

    // ========================================
    // Custom Errors
    // ========================================

    /**
     * @notice Reverts if the caller is not the tunnelRouter contract.
     */
    error UnauthorizedTunnelRouter();

    // Custom error for string length exceeding 32 bytes
    error StringInputExceedsBytes32(string input);

    // Custom error for signal Id input that is not available.
    error SignalIdNotAvailable(string signalId);

    // ========================================
    // Functions
    // ========================================

    /**
     * @dev Processes the relayed message.
     *
     * The relayed message must be evaluated from the tunnelRouter contract and
     * verified by the tssVerifier contract before forwarding to the target contract.
     *
     * @param data The decoded tss message that is relayed from the tunnelRouter contract.
     */
    function process(PacketDecoder.TssMessage memory data) external;

    /**
     * @dev Activates the tunnel and set the sequence on tunnelRouter contract.
     *
     * This function deposits tokens into the vault and sets the latest sequence on the
     * tunnelRouter contract if the current deposit in the vault contract exceeds a threshold.
     * The transaction is reverted if the threshold is not met.
     *
     * This function should be called by the contract activator.
     *
     * @param tunnelId The tunnel ID that the sender contract is activating.
     * @param latestSeq The new sequence of the tunnel.
     */
    function activate(uint64 tunnelId, uint64 latestSeq) external payable;

    /**
     * @dev Deactivates the tunnel on tunnelRouter contract.
     *
     * This function should be called by the contract activator.
     *
     * @param tunnelId The tunnel ID that the sender contract is deactivating.
     */
    function deactivate(uint64 tunnelId) external;

    /**
     * @dev Deposits the native tokens into the vault on behalf of the contract address and tunnelId.
     * The amount of tokens to be deposited is provided as msg.value in the transaction.
     *
     * The contract calls the vault to deposit the tokens.
     *
     * @param tunnelId The tunnel ID that the sender contract is depositing.
     */
    function deposit(uint64 tunnelId) external payable;

    /**
     * @dev Withdraws the native tokens from the vault contract with specific amount.
     *
     * This function should be called by the contract admin.
     *
     * @param tunnelId The tunnel ID that the sender contract is withdrawing.
     * @param amount The amount of tokens to be withdrawn.
     */
    function withdraw(uint64 tunnelId, uint256 amount) external;

    /**
     * @dev Withdraws all native tokens from the vault contract.
     *
     * This function should be called by the contract admin.
     *
     * @param tunnelId The tunnel ID that the sender contract is withdrawing.
     */
    function withdrawAll(uint64 tunnelId) external;

    /**
     * @dev Returns The tunnelRouter contract address.
     */
    function tunnelRouter() external view returns (address);

    /**
     * @dev Returns the price for the given string of signal, reverting if it does not exist.
     *
     * @param _signalId The signal ID to retrieve the price for.
     */
    function getPrice(string calldata _signalId) external view returns (Price memory);

    /**
     * @dev Returns the prices for the given array of string of signal, reverting if any do not exist.
     *
     * @param _signalIds The list of signal IDs to retrieve prices for.
     */
    function getPriceBatch(string[] calldata _signalIds) external view returns (Price[] memory);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

import "./IVault.sol";
import "../interfaces/ITssVerifier.sol";

interface ITunnelRouter {
    // ========================================
    // Structs
    // ========================================

    /**
     * @dev Stores the core details of a tunnel, mapped by its originator hash.
     * @param isActive A flag indicating if the tunnel is currently active
     * @param sequence The current message sequence number for the tunnel
     * @param tunnelId The unique identifier for the tunnel
     * @param targetAddr The address of the target consumer contract for this tunnel.
     */
    struct TunnelDetail {
        bool isActive;
        uint64 sequence;
        uint64 tunnelId;
        address targetAddr;
    }

    // ========================================
    // Events
    // ========================================

    /**
     * @notice Emitted when the callback gas limit is set.
     *
     * @param callbackGasLimit The maximum gas limit can be used when calling the target contract.
     */
    event CallbackGasLimitSet(uint256 callbackGasLimit);

    /**
     * @notice Emitted when the tssVerifier is set.
     *
     * @param tssVerifier The address of TssVerifier contract.
     */
    event TssVerifierSet(ITssVerifier tssVerifier);

    /**
     * @notice Emitted after the message is relayed to the target contract
     * to indicate the result of the process.
     *
     * @param originatorHash The originatorHash of the target that the sender is deactivating.
     * @param sequence The sequence of the message.
     * @param isSuccess The flag indicating whether the message is successful execute.
     */
    event MessageProcessed(
        bytes32 indexed originatorHash,
        uint64 indexed sequence,
        bool isSuccess
    );

    /**
     * @notice Emitted when the target is activated.
     *
     * @param originatorHash The originatorHash of the target that the sender is activating.
     * @param latestSequence The latest sequence of the tunnel.
     */
    event Activated(bytes32 indexed originatorHash, uint64 latestSequence);

    /**
     * @notice Emitted when the target is deactivated.
     *
     * @param originatorHash The originatorHash of the target that the sender is deactivating.
     * @param latestSequence The latest sequence of the tunnel.
     */
    event Deactivated(bytes32 indexed originatorHash, uint64 latestSequence);

    // ========================================
    // Custom Errors
    // ========================================

    /**
     * @notice Reverts if the target contract is inactive.
     *
     * @param originatorHash The originatorHash of the target contract and tunnelID.
     */
    error TunnelNotActive(bytes32 originatorHash);

    /**
     * @notice Reverts if the target contract is already active.
     *
     * @param originatorHash The originatorHash of the target contract and tunnelID.
     */
    error TunnelAlreadyActive(bytes32 originatorHash);

    /**
     * @notice Reverts if the encoder type is undefined.
     */
    error UndefinedEncoderType();

    /**
     * @notice Reverts if the sequence is incorrect.
     *
     * @param expected The expected sequence of the tunnel.
     * @param input The input sequence of the tunnel.
     */
    error InvalidSequence(uint64 expected, uint64 input);

    /**
     * @notice Reverts if the message and its signature doesn't match.
     */
    error InvalidSignature();

    /**
     * @notice Reverts if the remaining balance is insufficient to withdraw.
     *
     * @param tunnelId The tunnel ID that the sender is withdrawing tokens.
     * @param addr The account from which the sender is withdrawing tokens.
     */
    error InsufficientRemainingBalance(uint64 tunnelId, address addr);

    /**
     * @notice Reverts if the sender is not whitelisted.
     */
    error SenderNotWhitelisted(address addr);

    // ========================================
    // Functions
    // ========================================

    ///@dev Tunnel information
    struct TunnelInfo {
        bool isActive; // whether the tunnel is active or not
        uint64 latestSequence; // the latest sequence of the tunnel
        uint256 balance; // the remaining balance of the tunnel
        bytes32 originatorHash; // the originator hash of the tunnel
    }

    /**
     * @dev Relays the message to the target contract.
     *
     * Verifies the message's sequence and signature before forwarding it to
     * the packet consumer contract. The sender is entitled to a reward from the
     * vault contract, even if the packet consumer contract fails to process the
     * message. The reward is based on the gas consumed during processing plus
     * a predefined additional gas estimate.
     *
     * @param message The message to be relayed.
     * @param randomAddr The random address used in signature.
     * @param signature The signature of the message.
     */
    function relay(
        bytes calldata message,
        address randomAddr,
        uint256 signature
    ) external;

    /**
     * @dev Activates the sender and associated tunnel ID.
     *
     * This function should be called by the consumer contract as we use msg.sender in constructing
     * the originatorHash.
     *
     * @param tunnelId The tunnel ID that the sender contract is activating.
     * @param latestSeq The new sequence of the tunnelID.
     */
    function activate(uint64 tunnelId, uint64 latestSeq) external payable;

    /**
     * @dev Deactivates the sender and associated tunnel ID.
     *
     * @param tunnelId The tunnel ID being deactivated.
     */
    function deactivate(uint64 tunnelId) external;

    /**
     * @dev Returns the minimum balance required to keep the tunnel active.
     *
     * @return uint256 The minimum balance threshold.
     */
    function minimumBalanceThreshold() external view returns (uint256);

    /**
     * @dev Returns the tunnel information.
     *
     * @param tunnelId The ID of the tunnel.
     * @param addr The target contract address.
     *
     * @return TunnelInfo The tunnel information.
     */
    function tunnelInfo(
        uint64 tunnelId,
        address addr
    ) external view returns (TunnelInfo memory);

    /**
     * @dev Returns the originator hash of the given tunnel ID and address.
     *
     * @param tunnelId The ID of the tunnel.
     * @param addr The target contract address.
     *
     * @return bytes32 The originator hash of the tunnel.
     */
    function originatorHash(
        uint64 tunnelId,
        address addr
    ) external view returns (bytes32);

    /**
     * @dev Returns the active status of the target contract.
     *
     * @param originatorHash The originatorHash of the target contract.
     *
     * @return bool True if the target contract is active, false otherwise.
     */
    function isActive(bytes32 originatorHash) external view returns (bool);

    /**
     * @dev Returns the sequence of the target contract.
     *
     * @param originatorHash The originatorHash of the target contract.
     *
     * @return uint64 The sequence of the target contract.
     */
    function sequence(bytes32 originatorHash) external view returns (uint64);

    /**
     * @dev Returns the vault contract address.
     */
    function vault() external view returns (IVault);

    /**
     * @dev Returns the source chain ID hash.
     */
    function sourceChainIdHash() external view returns (bytes32);

    /**
     * @dev Returns the target chain ID hash.
     */
    function targetChainIdHash() external view returns (bytes32);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

interface IVault {
    // ========================================
    // Events
    // ========================================

    /**
     * @notice Emitted when the tunnel router contract address is set.
     *
     * @param tunnelRouter The new tunnel router contract address.
     */
    event TunnelRouterSet(address tunnelRouter);

    /**
     * @notice Emitted when the caller deposit native token into the contract.
     *
     * @param originatorHash The originator hash of the account to which the token is deposited.
     * @param from The account from which the token is deposited.
     * @param amount The amount of tokens deposited.
     */
    event Deposited(bytes32 indexed originatorHash, address indexed from, uint256 amount);

    /**
     * @notice Emitted when the caller withdraw native token from the contract.
     *
     * @param originatorHash The originator hash of the account to which the token is deposited.
     * @param to The account to which the token is withdrawn.
     * @param amount The amount of tokens withdrawn.
     */
    event Withdrawn(bytes32 indexed originatorHash, address indexed to, uint256 amount);

    // ========================================
    // Custom Errors
    // ========================================

    /**
     * @notice The caller is not the tunnelRouter contract.
     */
    error UnauthorizedTunnelRouter();

    /**
     * @notice Reverts if the balance is insufficient to allow the withdrawal without exceeding the threshold.
     */
    error WithdrawnAmountExceedsThreshold();

    /**
     * @notice Reverts if the tunnel is active.
     */
    error TunnelIsActive();

    /**
     * @notice Reverts if contract cannot send fee to the specific address.
     *
     * @param addr The address to which the token transfer failed.
     */
    error TokenTransferFailed(address addr);

    // ========================================
    // Functions
    // ========================================

    /**
     * @dev Deposits the native tokens into the vault on behalf of the given account and tunnelID.
     * The deposit amount is provided via `msg.value`.
     *
     * @param tunnelId The ID of the tunnel into which the sender is depositing tokens.
     * @param to The account into which the sender is depositing tokens
     */
    function deposit(uint64 tunnelId, address to) external payable;

    /**
     * @dev Withdraws native tokens from the sender's account associated with the given tunnelID.
     *
     * @param tunnelId the ID of the tunnel from which the sender is withdrawing tokens.
     * @param to The account to which the sender is withdrawing tokens to.
     * @param amount the amount of tokens to withdraw.
     */
    function withdraw(uint64 tunnelId, address to, uint256 amount) external;

    /**
     * @dev Withdraws the entire deposit from the sender's account for the specified tunnel ID.
     * @param to The account to which the sender is withdrawing tokens to.
     * @param tunnelId the ID of the tunnel from which the sender is withdrawing tokens.
     */
    function withdrawAll(uint64 tunnelId, address to) external;

    /**
     * @dev Collects the fee from the given originator hash.
     *
     * This function should be called by the tunnelRouter contract only.
     *
     * @param originatorHash The originator hash of the account to which the token is withdrawn.
     * @param to The account to which the sender is withdrawing tokens to.
     * @param amount the amount of tokens to withdraw.
     */
    function collectFee(bytes32 originatorHash, address to, uint256 amount) external;

    /**
     * @dev Returns the balance of the account.
     *
     * @param tunnelId The ID of the tunnel to check the balance.
     * @param account The account to check the balance.
     */
    function balance(uint64 tunnelId, address account) external view returns (uint256);

    /**
     * @dev Returns the balance of the account by the given originator hash.
     *
     * @param originatorHash The originator hash of the account to which the token is deposited.
     */
    function getBalanceByOriginatorHash(bytes32 originatorHash) external view returns (uint256);

    /**
     * @dev Returns the tunnel router contract address.
     */
    function tunnelRouter() external view returns (address);
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

library PacketDecoder {
    bytes8 private constant _FIXED_POINT_ENCODER_SELECTOR = 0xd3813e0ccba0ad5a; // keccak256("tunnel")[:4] + keccak256("FixedPointABI")[:4];
    bytes8 private constant _TICK_ENCODER_SELECTOR = 0xd3813e0cdb99b2b3; // keccak256("tunnel")[:4] + keccak256("TickABI")[:4];

    enum EncoderType {
        Undefined,
        FixedPoint,
        Tick
    }

    // info of signals being published in the packet.
    struct SignalPrice {
        bytes32 signal;
        uint64 price;
    }

    // the packet information generated from the tunnel.
    struct Packet {
        uint64 sequence;
        SignalPrice[] signals;
        int64 timestamp;
    }

    // the TSS message structure that is generated by the tunnel and is signed by the tss module.
    struct TssMessage {
        bytes32 originatorHash;
        uint64 sourceTimestamp;
        uint64 signingId;
        EncoderType encoderType;
        Packet packet;
    }

    /**
     * @dev Decode the TSS message from the encoded message.
     * @param message The encoded message.
     * @return TssMessage The decoded TSS message object.
     */
    function decodeTssMessage(bytes calldata message) internal pure returns (TssMessage memory) {
        EncoderType encoder = _toEncoderType(bytes8(message[48:56]));

        Packet memory packet = _decodePacket(message[56:]);

        TssMessage memory tssMessage = TssMessage(
            bytes32(message[0:32]), uint64(bytes8(message[32:40])), uint64(bytes8(message[40:48])), encoder, packet
        );

        return tssMessage;
    }

    /**
     * @dev Decode the packet information from the encoded message.
     * @param message The encoded message.
     * @return TssMessage The decoded packet object.
     */
    function _decodePacket(bytes calldata message) internal pure returns (Packet memory) {
        Packet memory packet = abi.decode(message, (Packet));
        return packet;
    }

    /**
     * @dev Convert the selector to the encoder type.
     * @param selector The selector to be converted.
     * @return EncoderType The encoder type.
     */
    function _toEncoderType(bytes8 selector) internal pure returns (EncoderType) {
        if (selector == _FIXED_POINT_ENCODER_SELECTOR) {
            return EncoderType.FixedPoint;
        } else if (selector == _TICK_ENCODER_SELECTOR) {
            return EncoderType.Tick;
        } else {
            return EncoderType.Undefined;
        }
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/IAccessControl.sol)

pragma solidity ^0.8.20;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev The `account` is missing a role.
     */
    error AccessControlUnauthorizedAccount(address account, bytes32 neededRole);

    /**
     * @dev The caller of a function is not the expected one.
     *
     * NOTE: Don't confuse with {AccessControlUnauthorizedAccount}.
     */
    error AccessControlBadConfirmation();

    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `callerConfirmation`.
     */
    function renounceRole(bytes32 role, address callerConfirmation) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;

import {IERC165} from "./IERC165.sol";

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.23;

interface ITssVerifier {
    // ========================================
    // Structs
    // ========================================

    /**
     * @notice Represents a group public key used for signature verification.
     * @param activeTime The Unix timestamp from which this public key is considered active.
     * @param parity The parity of the y-coordinate, used for public key recovery.
     * @param px The x-coordinate of the public key.
     */
    struct PublicKey {
        uint64 activeTime;
        uint8 parity;
        uint256 px;
    }

    // ========================================
    // Events
    // ========================================

    /**
     * @dev Emitted when the group public key is updated.
     * @param index The index of the public key in the group.
     * @param timestamp The timestamp of the update.
     * @param parity The parity value of the public key.
     * @param px The x-coordinate value of the public key.
     * @param isByAdmin True if the public key is updated by the admin, false otherwise.
     */
    event GroupPubKeyUpdated(uint256 index, uint256 timestamp, uint8 parity, uint256 px, bool isByAdmin);

    /**
     * @dev Emitted when the transition period is updated.
     * @param transitionPeriod The new duration of the transition period.
     */
    event TransitionPeriodUpdated(uint64 transitionPeriod);

    /**
     * @dev Emitted when the transition originator hash is updated.
     * @param transitionOriginatorHash The new transition originator hash.
     */
    event TransitionOriginatorHashUpdated(bytes32 transitionOriginatorHash);

    // ========================================
    // Custom Errors
    // ========================================

    /**
     * @notice Reverts if the message and its signature doesn't match.
     */
    error InvalidSignature();

    /**
     * @notice Reverts if the transition originator hash doesn't match with the one in the message.
     */
    error InvalidTransitionOriginatorHash();

    /**
     * @notice Reverts if the contract fails to processes the signature.
     */
    error ProcessingSignatureFailed();

    /**
     * @notice Reverts if there is no valid public key.
     *
     * @param timestamp The given timestamp of the message.
     */
    error PublicKeyNotFound(uint256 timestamp);

    // ========================================
    // Functions
    // ========================================

    /**
     * @dev Verifies the signature of the message against the given signature.
     *
     * The contract is not allowed to verify the message with obsolete public key.
     *
     * @param hashedMessage The hashed message to be verified.
     * @param randomAddr The random address that is generated during the processing tss signature.
     * @param signature The tss signature.
     * @return true If the signature is valid, false otherwise.
     */
    function verify(bytes32 hashedMessage, address randomAddr, uint256 signature) external view returns (bool);

    /**
     * @dev Adds a new public key with proof from the current group.
     *
     * @param message The message being used for updating public key.
     * @param randomAddr The address form of the commitment R.
     * @param signature  The tss signature.
     */
    function addPubKeyWithProof(bytes calldata message, address randomAddr, uint256 signature) external;

    /**
     * @dev Adds the new public key by the owner.
     *
     * @param timestamp The timestamp of the new public key.
     * @param parity The parity value of the new public key.
     * @param px The x-coordinate value of the new public key.
     */
    function addPubKeyByOwner(uint64 timestamp, uint8 parity, uint256 px) external;

    /**
     * @dev Sets the transition period of the tss signature.
     * The transition period is the period in which the previous public key is still valid even
     * though the new public key is already added.
     *
     * @param transitionPeriod_ The new duration of the transition period.
     */
    function setTransitionPeriod(uint64 transitionPeriod_) external;

    /**
     * @dev Sets the transition originator hash.
     * The transition originator hash is the hash of the originator of the transition message.
     *
     * @param transitionOriginatorHash_ The new transition originator hash.
     */
    function setTransitionOriginatorHash(bytes32 transitionOriginatorHash_) external;
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "shanghai",
  "viaIR": false
}

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"tunnelRouter_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AccessControlBadConfirmation","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32","name":"neededRole","type":"bytes32"}],"name":"AccessControlUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"string","name":"signalId","type":"string"}],"name":"SignalIdNotAvailable","type":"error"},{"inputs":[{"internalType":"string","name":"input","type":"string"}],"name":"StringInputExceedsBytes32","type":"error"},{"inputs":[],"name":"UnauthorizedTunnelRouter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TUNNEL_ACTIVATOR_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"},{"internalType":"uint64","name":"latestSeq","type":"uint64"}],"name":"activate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"deactivate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_signalId","type":"string"}],"name":"getPrice","outputs":[{"components":[{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct IPacketConsumer.Price","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string[]","name":"_signalIds","type":"string[]"}],"name":"getPriceBatch","outputs":[{"components":[{"internalType":"uint64","name":"price","type":"uint64"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct IPacketConsumer.Price[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"grantTunnelActivatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"originatorHash","type":"bytes32"},{"internalType":"uint64","name":"sourceTimestamp","type":"uint64"},{"internalType":"uint64","name":"signingId","type":"uint64"},{"internalType":"enum PacketDecoder.EncoderType","name":"encoderType","type":"uint8"},{"components":[{"internalType":"uint64","name":"sequence","type":"uint64"},{"components":[{"internalType":"bytes32","name":"signal","type":"bytes32"},{"internalType":"uint64","name":"price","type":"uint64"}],"internalType":"struct PacketDecoder.SignalPrice[]","name":"signals","type":"tuple[]"},{"internalType":"int64","name":"timestamp","type":"int64"}],"internalType":"struct PacketDecoder.Packet","name":"packet","type":"tuple"}],"internalType":"struct PacketDecoder.TssMessage","name":"data","type":"tuple"}],"name":"process","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"callerConfirmation","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"revokeTunnelActivatorRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_s","type":"string"}],"name":"stringToRightAlignedBytes32","outputs":[{"internalType":"bytes32","name":"s","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tunnelRouter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"tunnelId","type":"uint64"}],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

0x60a060405234801561000f575f5ffd5b506040516116f13803806116f183398101604081905261002e91610120565b6001600160a01b0381166080526100455f33610077565b506100707f01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee4133610077565b505061014d565b5f828152602081815260408083206001600160a01b038516845290915281205460ff16610117575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556100cf3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a450600161011a565b505f5b92915050565b5f60208284031215610130575f5ffd5b81516001600160a01b0381168114610146575f5ffd5b9392505050565b60805161156261018f5f395f81816102a80152818161041b015281816106240152818161098901528181610a5101528181610aa70152610be701526115625ff3fe60806040526004361061011b575f3560e01c80636a5d9b591161009d578063bb5114f911610062578063bb5114f914610346578063d547741f14610365578063e390735814610384578063f4465fd5146103a4578063f79f6de4146103c3575f5ffd5b80636a5d9b59146102975780638774462e146102e257806391d1485414610301578063a217fddf14610320578063ba1b5f2314610333575f5ffd5b80632f2ff15d116100e35780632f2ff15d146101e257806336568abe146102015780634338798314610220578063524f38891461023f578063633f85741461026b575f5ffd5b806301ffc9a71461011f5780631376583814610153578063171ec9fd14610168578063248a9ca314610187578063270ba9ea146101c3575b5f5ffd5b34801561012a575f5ffd5b5061013e610139366004610e51565b6103e2565b60405190151581526020015b60405180910390f35b610166610161366004610e93565b610418565b005b348015610173575f5ffd5b50610166610182366004610ef3565b610506565b348015610192575f5ffd5b506101b56101a1366004610f31565b5f9081526020819052604090206001015490565b60405190815260200161014a565b3480156101ce575f5ffd5b506101b56101dd366004610ff8565b610566565b3480156101ed575f5ffd5b506101666101fc36600461109e565b6105bb565b34801561020c575f5ffd5b5061016661021b36600461109e565b6105df565b34801561022b575f5ffd5b5061016661023a3660046110cc565b610617565b34801561024a575f5ffd5b5061025e6102593660046110f4565b610715565b60405161014a9190611160565b348015610276575f5ffd5b5061028a610285366004610ef3565b6107d2565b60405161014a9190611183565b3480156102a2575f5ffd5b506102ca7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161014a565b3480156102ed575f5ffd5b506101666102fc366004610e93565b610954565b34801561030c575f5ffd5b5061013e61031b36600461109e565b6109ec565b34801561032b575f5ffd5b506101b55f81565b6101666103413660046111e6565b610a14565b348015610351575f5ffd5b50610166610360366004611228565b610a9c565b348015610370575f5ffd5b5061016661037f36600461109e565b610bb6565b34801561038f575f5ffd5b506101b55f51602061150d5f395f51905f5281565b3480156103af575f5ffd5b506101666103be366004610e93565b610bda565b3480156103ce575f5ffd5b506101666103dd366004610ef3565b610cb5565b5f6001600160e01b03198216637965db0b60e01b148061041257506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610475573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049991906113c9565b60405163576bcd2f60e01b81526001600160401b03841660048201523060248201529091506001600160a01b0382169063576bcd2f9034906044015f604051808303818588803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b50505050505050565b5f61051081610d0f565b5f5b82811015610560576105575f51602061150d5f395f51905f5285858481811061053d5761053d6113e4565b905060200201602081019061055291906113f8565b610d1c565b50600101610512565b50505050565b5f602082511115610595578160405163ea46556360e01b815260040161058c9190611413565b60405180910390fd5b60208201519050815160206105aa9190611472565b6105b5906008611485565b1c919050565b5f828152602081905260409020600101546105d581610d0f565b6105608383610d8c565b6001600160a01b03811633146106085760405163334bd91960e11b815260040160405180910390fd5b6106128282610d1c565b505050565b5f61062181610d0f565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a291906113c9565b60405163349b2b8f60e21b81526001600160401b0386166004820152336024820152604481018590529091506001600160a01b0382169063d26cae3c906064015f604051808303815f87803b1580156106f9575f5ffd5b505af115801561070b573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f80825260208201525f60015f61076a86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061056692505050565b815260208082019290925260409081015f9081208251808401909352546001600160401b038116808452600160401b90910460070b93830193909352909250036107cb5783836040516308e197c160e41b815260040161058c92919061149c565b9392505050565b60605f826001600160401b038111156107ed576107ed610f48565b60405190808252806020026020018201604052801561083157816020015b604080518082019091525f808252602082015281526020019060019003908161080b5790505b5090505f5b8381101561094c575f60015f6108a2888886818110610857576108576113e4565b905060200281019061086991906114ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061056692505050565b815260208082019290925260409081015f9081208251808401909352546001600160401b038116808452600160401b90910460070b9383019390935290925003610925578585838181106108f8576108f86113e4565b905060200281019061090a91906114ca565b6040516308e197c160e41b815260040161058c92919061149c565b80838381518110610938576109386113e4565b602090810291909101015250600101610836565b509392505050565b5f51602061150d5f395f51905f5261096b81610d0f565b6040516343ba231760e11b81526001600160401b03831660048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690638774462e906024015f604051808303815f87803b1580156109d2575f5ffd5b505af11580156109e4573d5f5f3e3d5ffd5b505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f51602061150d5f395f51905f52610a2b81610d0f565b60405163ba1b5f2360e01b81526001600160401b038085166004830152831660248201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063ba1b5f239034906044015f604051808303818588803b1580156106f9575f5ffd5b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610ae557604051636e96d7e160e11b815260040160405180910390fd5b60808101515f5b81602001515181101561061257604051806040016040528083602001518381518110610b1a57610b1a6113e4565b6020026020010151602001516001600160401b03168152602001836040015160070b81525060015f84602001518481518110610b5857610b586113e4565b602090810291909101810151518252818101929092526040015f208251815493909201516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909416921691909117919091179055600101610aec565b5f82815260208190526040902060010154610bd081610d0f565b6105608383610d1c565b5f610be481610d0f565b5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6591906113c9565b60405163fc7a1c2960e01b81526001600160401b03851660048201523360248201529091506001600160a01b0382169063fc7a1c29906044015f604051808303815f87803b1580156104eb575f5ffd5b5f610cbf81610d0f565b5f5b8281101561056057610d065f51602061150d5f395f51905f52858584818110610cec57610cec6113e4565b9050602002016020810190610d0191906113f8565b610d8c565b50600101610cc1565b610d198133610e14565b50565b5f610d2783836109ec565b15610d85575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610412565b505f610412565b5f610d9783836109ec565b610d85575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610dcc3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610412565b610e1e82826109ec565b610e4d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161058c565b5050565b5f60208284031215610e61575f5ffd5b81356001600160e01b0319811681146107cb575f5ffd5b80356001600160401b0381168114610e8e575f5ffd5b919050565b5f60208284031215610ea3575f5ffd5b6107cb82610e78565b5f5f83601f840112610ebc575f5ffd5b5081356001600160401b03811115610ed2575f5ffd5b6020830191508360208260051b8501011115610eec575f5ffd5b9250929050565b5f5f60208385031215610f04575f5ffd5b82356001600160401b03811115610f19575f5ffd5b610f2585828601610eac565b90969095509350505050565b5f60208284031215610f41575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715610f7e57610f7e610f48565b60405290565b604051606081016001600160401b0381118282101715610f7e57610f7e610f48565b604080519081016001600160401b0381118282101715610f7e57610f7e610f48565b604051601f8201601f191681016001600160401b0381118282101715610ff057610ff0610f48565b604052919050565b5f60208284031215611008575f5ffd5b81356001600160401b0381111561101d575f5ffd5b8201601f8101841361102d575f5ffd5b80356001600160401b0381111561104657611046610f48565b611059601f8201601f1916602001610fc8565b81815285602083850101111561106d575f5ffd5b816020840160208301375f91810160200191909152949350505050565b6001600160a01b0381168114610d19575f5ffd5b5f5f604083850312156110af575f5ffd5b8235915060208301356110c18161108a565b809150509250929050565b5f5f604083850312156110dd575f5ffd5b6110e683610e78565b946020939093013593505050565b5f5f60208385031215611105575f5ffd5b82356001600160401b0381111561111a575f5ffd5b8301601f8101851361112a575f5ffd5b80356001600160401b0381111561113f575f5ffd5b856020828401011115611150575f5ffd5b6020919091019590945092505050565b81516001600160401b0316815260208083015160070b9082015260408101610412565b602080825282518282018190525f918401906040840190835b818110156111db576111c583855180516001600160401b0316825260209081015160070b910152565b602093909301926040929092019160010161119c565b509095945050505050565b5f5f604083850312156111f7575f5ffd5b61120083610e78565b915061120e60208401610e78565b90509250929050565b8035600781900b8114610e8e575f5ffd5b5f60208284031215611238575f5ffd5b81356001600160401b0381111561124d575f5ffd5b820160a0818503121561125e575f5ffd5b611266610f5c565b8135815261127660208301610e78565b602082015261128760408301610e78565b604082015260608201356003811061129d575f5ffd5b606082015260808201356001600160401b038111156112ba575f5ffd5b9190910190606082860312156112ce575f5ffd5b6112d6610f84565b6112df83610e78565b815260208301356001600160401b038111156112f9575f5ffd5b8301601f81018713611309575f5ffd5b80356001600160401b0381111561132257611322610f48565b61133160208260051b01610fc8565b8082825260208201915060208360061b850101925089831115611352575f5ffd5b6020840193505b828410156113a2576040848b031215611370575f5ffd5b611378610fa6565b8435815261138860208601610e78565b602082015280835250602082019150604084019350611359565b6020850152506113b791505060408401611217565b60408201526080820152949350505050565b5f602082840312156113d9575f5ffd5b81516107cb8161108a565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611408575f5ffd5b81356107cb8161108a565b602081525f82518060208401525f5b8181101561143f5760208186018101516040868401015201611422565b505f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156104125761041261145e565b80820281158282048414176104125761041261145e565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f5f8335601e198436030181126114df575f5ffd5b8301803591506001600160401b038211156114f8575f5ffd5b602001915036819003821315610eec575f5ffdfe01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee41a26469706673582212207889033c2a3ea1bd638dbe4369197cfbc599696d4a222567c2e4c479c7e7032e64736f6c634300081c003300000000000000000000000075537f9e646359dbf2552db266df3b039f8bed91

Deployed Bytecode

0x60806040526004361061011b575f3560e01c80636a5d9b591161009d578063bb5114f911610062578063bb5114f914610346578063d547741f14610365578063e390735814610384578063f4465fd5146103a4578063f79f6de4146103c3575f5ffd5b80636a5d9b59146102975780638774462e146102e257806391d1485414610301578063a217fddf14610320578063ba1b5f2314610333575f5ffd5b80632f2ff15d116100e35780632f2ff15d146101e257806336568abe146102015780634338798314610220578063524f38891461023f578063633f85741461026b575f5ffd5b806301ffc9a71461011f5780631376583814610153578063171ec9fd14610168578063248a9ca314610187578063270ba9ea146101c3575b5f5ffd5b34801561012a575f5ffd5b5061013e610139366004610e51565b6103e2565b60405190151581526020015b60405180910390f35b610166610161366004610e93565b610418565b005b348015610173575f5ffd5b50610166610182366004610ef3565b610506565b348015610192575f5ffd5b506101b56101a1366004610f31565b5f9081526020819052604090206001015490565b60405190815260200161014a565b3480156101ce575f5ffd5b506101b56101dd366004610ff8565b610566565b3480156101ed575f5ffd5b506101666101fc36600461109e565b6105bb565b34801561020c575f5ffd5b5061016661021b36600461109e565b6105df565b34801561022b575f5ffd5b5061016661023a3660046110cc565b610617565b34801561024a575f5ffd5b5061025e6102593660046110f4565b610715565b60405161014a9190611160565b348015610276575f5ffd5b5061028a610285366004610ef3565b6107d2565b60405161014a9190611183565b3480156102a2575f5ffd5b506102ca7f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed9181565b6040516001600160a01b03909116815260200161014a565b3480156102ed575f5ffd5b506101666102fc366004610e93565b610954565b34801561030c575f5ffd5b5061013e61031b36600461109e565b6109ec565b34801561032b575f5ffd5b506101b55f81565b6101666103413660046111e6565b610a14565b348015610351575f5ffd5b50610166610360366004611228565b610a9c565b348015610370575f5ffd5b5061016661037f36600461109e565b610bb6565b34801561038f575f5ffd5b506101b55f51602061150d5f395f51905f5281565b3480156103af575f5ffd5b506101666103be366004610e93565b610bda565b3480156103ce575f5ffd5b506101666103dd366004610ef3565b610cb5565b5f6001600160e01b03198216637965db0b60e01b148061041257506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f7f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed916001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610475573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061049991906113c9565b60405163576bcd2f60e01b81526001600160401b03841660048201523060248201529091506001600160a01b0382169063576bcd2f9034906044015f604051808303818588803b1580156104eb575f5ffd5b505af11580156104fd573d5f5f3e3d5ffd5b50505050505050565b5f61051081610d0f565b5f5b82811015610560576105575f51602061150d5f395f51905f5285858481811061053d5761053d6113e4565b905060200201602081019061055291906113f8565b610d1c565b50600101610512565b50505050565b5f602082511115610595578160405163ea46556360e01b815260040161058c9190611413565b60405180910390fd5b60208201519050815160206105aa9190611472565b6105b5906008611485565b1c919050565b5f828152602081905260409020600101546105d581610d0f565b6105608383610d8c565b6001600160a01b03811633146106085760405163334bd91960e11b815260040160405180910390fd5b6106128282610d1c565b505050565b5f61062181610d0f565b5f7f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed916001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561067e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106a291906113c9565b60405163349b2b8f60e21b81526001600160401b0386166004820152336024820152604481018590529091506001600160a01b0382169063d26cae3c906064015f604051808303815f87803b1580156106f9575f5ffd5b505af115801561070b573d5f5f3e3d5ffd5b5050505050505050565b604080518082019091525f80825260208201525f60015f61076a86868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061056692505050565b815260208082019290925260409081015f9081208251808401909352546001600160401b038116808452600160401b90910460070b93830193909352909250036107cb5783836040516308e197c160e41b815260040161058c92919061149c565b9392505050565b60605f826001600160401b038111156107ed576107ed610f48565b60405190808252806020026020018201604052801561083157816020015b604080518082019091525f808252602082015281526020019060019003908161080b5790505b5090505f5b8381101561094c575f60015f6108a2888886818110610857576108576113e4565b905060200281019061086991906114ca565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061056692505050565b815260208082019290925260409081015f9081208251808401909352546001600160401b038116808452600160401b90910460070b9383019390935290925003610925578585838181106108f8576108f86113e4565b905060200281019061090a91906114ca565b6040516308e197c160e41b815260040161058c92919061149c565b80838381518110610938576109386113e4565b602090810291909101015250600101610836565b509392505050565b5f51602061150d5f395f51905f5261096b81610d0f565b6040516343ba231760e11b81526001600160401b03831660048201527f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed916001600160a01b031690638774462e906024015f604051808303815f87803b1580156109d2575f5ffd5b505af11580156109e4573d5f5f3e3d5ffd5b505050505050565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b5f51602061150d5f395f51905f52610a2b81610d0f565b60405163ba1b5f2360e01b81526001600160401b038085166004830152831660248201527f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed916001600160a01b03169063ba1b5f239034906044015f604051808303818588803b1580156106f9575f5ffd5b336001600160a01b037f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed911614610ae557604051636e96d7e160e11b815260040160405180910390fd5b60808101515f5b81602001515181101561061257604051806040016040528083602001518381518110610b1a57610b1a6113e4565b6020026020010151602001516001600160401b03168152602001836040015160070b81525060015f84602001518481518110610b5857610b586113e4565b602090810291909101810151518252818101929092526040015f208251815493909201516001600160401b03908116600160401b026fffffffffffffffffffffffffffffffff19909416921691909117919091179055600101610aec565b5f82815260208190526040902060010154610bd081610d0f565b6105608383610d1c565b5f610be481610d0f565b5f7f00000000000000000000000075537f9e646359dbf2552db266df3b039f8bed916001600160a01b031663fbfa77cf6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610c41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c6591906113c9565b60405163fc7a1c2960e01b81526001600160401b03851660048201523360248201529091506001600160a01b0382169063fc7a1c29906044015f604051808303815f87803b1580156104eb575f5ffd5b5f610cbf81610d0f565b5f5b8281101561056057610d065f51602061150d5f395f51905f52858584818110610cec57610cec6113e4565b9050602002016020810190610d0191906113f8565b610d8c565b50600101610cc1565b610d198133610e14565b50565b5f610d2783836109ec565b15610d85575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a4506001610412565b505f610412565b5f610d9783836109ec565b610d85575f838152602081815260408083206001600160a01b03861684529091529020805460ff19166001179055610dcc3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610412565b610e1e82826109ec565b610e4d5760405163e2517d3f60e01b81526001600160a01b03821660048201526024810183905260440161058c565b5050565b5f60208284031215610e61575f5ffd5b81356001600160e01b0319811681146107cb575f5ffd5b80356001600160401b0381168114610e8e575f5ffd5b919050565b5f60208284031215610ea3575f5ffd5b6107cb82610e78565b5f5f83601f840112610ebc575f5ffd5b5081356001600160401b03811115610ed2575f5ffd5b6020830191508360208260051b8501011115610eec575f5ffd5b9250929050565b5f5f60208385031215610f04575f5ffd5b82356001600160401b03811115610f19575f5ffd5b610f2585828601610eac565b90969095509350505050565b5f60208284031215610f41575f5ffd5b5035919050565b634e487b7160e01b5f52604160045260245ffd5b60405160a081016001600160401b0381118282101715610f7e57610f7e610f48565b60405290565b604051606081016001600160401b0381118282101715610f7e57610f7e610f48565b604080519081016001600160401b0381118282101715610f7e57610f7e610f48565b604051601f8201601f191681016001600160401b0381118282101715610ff057610ff0610f48565b604052919050565b5f60208284031215611008575f5ffd5b81356001600160401b0381111561101d575f5ffd5b8201601f8101841361102d575f5ffd5b80356001600160401b0381111561104657611046610f48565b611059601f8201601f1916602001610fc8565b81815285602083850101111561106d575f5ffd5b816020840160208301375f91810160200191909152949350505050565b6001600160a01b0381168114610d19575f5ffd5b5f5f604083850312156110af575f5ffd5b8235915060208301356110c18161108a565b809150509250929050565b5f5f604083850312156110dd575f5ffd5b6110e683610e78565b946020939093013593505050565b5f5f60208385031215611105575f5ffd5b82356001600160401b0381111561111a575f5ffd5b8301601f8101851361112a575f5ffd5b80356001600160401b0381111561113f575f5ffd5b856020828401011115611150575f5ffd5b6020919091019590945092505050565b81516001600160401b0316815260208083015160070b9082015260408101610412565b602080825282518282018190525f918401906040840190835b818110156111db576111c583855180516001600160401b0316825260209081015160070b910152565b602093909301926040929092019160010161119c565b509095945050505050565b5f5f604083850312156111f7575f5ffd5b61120083610e78565b915061120e60208401610e78565b90509250929050565b8035600781900b8114610e8e575f5ffd5b5f60208284031215611238575f5ffd5b81356001600160401b0381111561124d575f5ffd5b820160a0818503121561125e575f5ffd5b611266610f5c565b8135815261127660208301610e78565b602082015261128760408301610e78565b604082015260608201356003811061129d575f5ffd5b606082015260808201356001600160401b038111156112ba575f5ffd5b9190910190606082860312156112ce575f5ffd5b6112d6610f84565b6112df83610e78565b815260208301356001600160401b038111156112f9575f5ffd5b8301601f81018713611309575f5ffd5b80356001600160401b0381111561132257611322610f48565b61133160208260051b01610fc8565b8082825260208201915060208360061b850101925089831115611352575f5ffd5b6020840193505b828410156113a2576040848b031215611370575f5ffd5b611378610fa6565b8435815261138860208601610e78565b602082015280835250602082019150604084019350611359565b6020850152506113b791505060408401611217565b60408201526080820152949350505050565b5f602082840312156113d9575f5ffd5b81516107cb8161108a565b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215611408575f5ffd5b81356107cb8161108a565b602081525f82518060208401525f5b8181101561143f5760208186018101516040868401015201611422565b505f604082850101526040601f19601f83011684010191505092915050565b634e487b7160e01b5f52601160045260245ffd5b818103818111156104125761041261145e565b80820281158282048414176104125761041261145e565b60208152816020820152818360408301375f818301604090810191909152601f909201601f19160101919050565b5f5f8335601e198436030181126114df575f5ffd5b8301803591506001600160401b038211156114f8575f5ffd5b602001915036819003821315610eec575f5ffdfe01c3c1de9f7cdb4e7413e76308080208f69bf42c6a1c55c44b2a600e267dee41a26469706673582212207889033c2a3ea1bd638dbe4369197cfbc599696d4a222567c2e4c479c7e7032e64736f6c634300081c0033

Deployed Bytecode Sourcemap

279:4472:5:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2565:202:0;;;;;;;;;;-1:-1:-1;2565:202:0;;;;;:::i;:::-;;:::i;:::-;;;470:14:11;;463:22;445:41;;433:2;418:18;2565:202:0;;;;;;;;3424:185:5;;;;;;:::i;:::-;;:::i;:::-;;4513:236;;;;;;;;;;-1:-1:-1;4513:236:5;;;;;:::i;:::-;;:::i;3810:120:0:-;;;;;;;;;;-1:-1:-1;3810:120:0;;;;;:::i;:::-;3875:7;3901:12;;;;;;;;;;:22;;;;3810:120;;;;2053:25:11;;;2041:2;2026:18;3810:120:0;1907:177:11;1151:313:5;;;;;;;;;;-1:-1:-1;1151:313:5;;;;;:::i;:::-;;:::i;4226:136:0:-;;;;;;;;;;-1:-1:-1;4226:136:0;;;;;:::i;:::-;;:::i;5328:245::-;;;;;;;;;;-1:-1:-1;5328:245:0;;;;;:::i;:::-;;:::i;3675:211:5:-;;;;;;;;;;-1:-1:-1;3675:211:5;;;;;:::i;:::-;;:::i;1530:283::-;;;;;;;;;;-1:-1:-1;1530:283:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1884:487::-;;;;;;;;;;-1:-1:-1;1884:487:5;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;378:37::-;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;7128:32:11;;;7110:51;;7098:2;7083:18;378:37:5;6964:203:11;3216:143:5;;;;;;;;;;-1:-1:-1;3216:143:5;;;;;:::i;:::-;;:::i;2854:136:0:-;;;;;;;;;;-1:-1:-1;2854:136:0;;;;;:::i;:::-;;:::i;2187:49::-;;;;;;;;;;-1:-1:-1;2187:49:0;2232:4;2187:49;;2898:250:5;;;;;;:::i;:::-;;:::i;2436:396::-;;;;;;;;;;-1:-1:-1;2436:396:5;;;;;:::i;:::-;;:::i;4642:138:0:-;;;;;;;;;;-1:-1:-1;4642:138:0;;;;;:::i;:::-;;:::i;624:82:5:-;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;624:82:5;;3955:193;;;;;;;;;;-1:-1:-1;3955:193:5;;;;;:::i;:::-;;:::i;4212:234::-;;;;;;;;;;-1:-1:-1;4212:234:5;;;;;:::i;:::-;;:::i;2565:202:0:-;2650:4;-1:-1:-1;;;;;;2673:47:0;;-1:-1:-1;;;2673:47:0;;:87;;-1:-1:-1;;;;;;;;;;861:40:3;;;2724:36:0;2666:94;2565:202;-1:-1:-1;;2565:202:0:o;3424:185:5:-;3485:12;3514;-1:-1:-1;;;;;3500:33:5;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3546:56;;-1:-1:-1;;;3546:56:5;;-1:-1:-1;;;;;10315:31:11;;3546:56:5;;;10297:50:11;3596:4:5;10363:18:11;;;10356:60;3485:50:5;;-1:-1:-1;;;;;;3546:13:5;;;;;3567:9;;10270:18:11;;3546:56:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3475:134;3424:185;:::o;4513:236::-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;4630:9:5::1;4625:118;4645:19:::0;;::::1;4625:118;;;4685:47;-1:-1:-1::0;;;;;;;;;;;4720:8:5::1;;4729:1;4720:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4685;:47::i;:::-;-1:-1:-1::0;4666:3:5::1;;4625:118;;;;4513:236:::0;;;:::o;1151:313::-;1241:9;1285:2;1272;1266:16;:21;1262:88;;;1336:2;1310:29;;-1:-1:-1;;;1310:29:5;;;;;;;;:::i;:::-;;;;;;;;1262:88;1401:2;1397;1393:11;1387:18;1382:23;;1442:2;1436:16;1431:2;:21;;;;:::i;:::-;1430:27;;1456:1;1430:27;:::i;:::-;1424:33;;1151:313;-1:-1:-1;1151:313:5:o;4226:136:0:-;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4330:25:::1;4341:4;4347:7;4330:10;:25::i;5328:245::-:0;-1:-1:-1;;;;;5421:34:0;;735:10:2;5421:34:0;5417:102;;5478:30;;-1:-1:-1;;;5478:30:0;;;;;;;;;;;5417:102;5529:37;5541:4;5547:18;5529:11;:37::i;:::-;;5328:245;;:::o;3675:211:5:-;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;3774:12:5::1;3803;-1:-1:-1::0;;;;;3789:33:5::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3835:44;::::0;-1:-1:-1;;;3835:44:5;;-1:-1:-1;;;;;11999:31:11;;3835:44:5::1;::::0;::::1;11981:50:11::0;3860:10:5::1;12047:18:11::0;;;12040:60;12116:18;;;12109:34;;;3774:50:5;;-1:-1:-1;;;;;;3835:14:5;::::1;::::0;::::1;::::0;11954:18:11;;3835:44:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3764:122;3675:211:::0;;;:::o;1530:283::-;-1:-1:-1;;;;;;;;;;;;;;;;;1622:18:5;1643:7;:47;1651:38;1679:9;;1651:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1651:27:5;;-1:-1:-1;;;1651:38:5:i;:::-;1643:47;;;;;;;;;;;;;;-1:-1:-1;1643:47:5;;;1622:68;;;;;;;;;-1:-1:-1;;;;;1622:68:5;;;;;-1:-1:-1;;;1622:68:5;;;;;;;;;;;;;;-1:-1:-1;1704:16:5;1700:85;;1764:9;;1743:31;;-1:-1:-1;;;1743:31:5;;;;;;;;;:::i;1700:85::-;1801:5;1530:283;-1:-1:-1;;;1530:283:5:o;1884:487::-;1960:14;1986:24;2025:10;-1:-1:-1;;;;;2013:30:5;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;2013:30:5;;;;;;;;;;;;;;;-1:-1:-1;1986:57:5;-1:-1:-1;2058:6:5;2053:286;2070:21;;;2053:286;;;2112:18;2133:7;:51;2141:42;2169:10;;2180:1;2169:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2141:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2141:27:5;;-1:-1:-1;;;2141:42:5:i;:::-;2133:51;;;;;;;;;;;;;;-1:-1:-1;2133:51:5;;;2112:72;;;;;;;;;-1:-1:-1;;;;;2112:72:5;;;;;-1:-1:-1;;;2112:72:5;;;;;;;;;;;;;;-1:-1:-1;2202:16:5;2198:97;;2266:10;;2277:1;2266:13;;;;;;;:::i;:::-;;;;;;;;;;;;:::i;:::-;2245:35;;-1:-1:-1;;;2245:35:5;;;;;;;;;:::i;2198:97::-;2323:5;2308:9;2318:1;2308:12;;;;;;;;:::i;:::-;;;;;;;;;;:20;-1:-1:-1;2093:3:5;;2053:286;;;-1:-1:-1;2355:9:5;1884:487;-1:-1:-1;;;1884:487:5:o;3216:143::-;-1:-1:-1;;;;;;;;;;;2464:16:0;2475:4;2464:10;:16::i;:::-;3304:48:5::1;::::0;-1:-1:-1;;;3304:48:5;;-1:-1:-1;;;;;13238:31:11;;3304:48:5::1;::::0;::::1;13220:50:11::0;3318:12:5::1;-1:-1:-1::0;;;;;3304:38:5::1;::::0;::::1;::::0;13193:18:11;;3304:48:5::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3216:143:::0;;:::o;2854:136:0:-;2931:4;2954:12;;;;;;;;;;;-1:-1:-1;;;;;2954:29:0;;;;;;;;;;;;;;;2854:136::o;2898:250:5:-;-1:-1:-1;;;;;;;;;;;2464:16:0;2475:4;2464:10;:16::i;:::-;3032:109:5::1;::::0;-1:-1:-1;;;3032:109:5;;-1:-1:-1;;;;;13469:31:11;;;3032:109:5::1;::::0;::::1;13451:50:11::0;13537:31;;13517:18;;;13510:59;3046:12:5::1;-1:-1:-1::0;;;;;3032:36:5::1;::::0;::::1;::::0;3076:9:::1;::::0;13424:18:11;;3032:109:5::1;;;;;;;;;;;;;;;;;;;2436:396:::0;755:10;-1:-1:-1;;;;;769:12:5;755:26;;751:90;;804:26;;-1:-1:-1;;;804:26:5;;;;;;;;;;;751:90;2578:11:::1;::::0;::::1;::::0;2541:34:::1;2599:227;2623:6;:14;;;:21;2619:1;:25;2599:227;;;2701:114;;;;;;;;2732:6;:14;;;2747:1;2732:17;;;;;;;;:::i;:::-;;;;;;;:23;;;-1:-1:-1::0;;;;;2701:114:5::1;;;;;2784:6;:16;;;2701:114;;;;::::0;2665:7:::1;:33;2673:6;:14;;;2688:1;2673:17;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;:24;2665:33;;;;::::1;::::0;;;;;;2673:24:::1;2665:33:::0;:150;;;;;;;::::1;::::0;-1:-1:-1;;;;;2665:150:5;;;-1:-1:-1;;;2665:150:5::1;-1:-1:-1::0;;2665:150:5;;;;::::1;::::0;;;;;;;::::1;::::0;;;2646:3:::1;2599:227;;4642:138:0::0;3875:7;3901:12;;;;;;;;;;:22;;;2464:16;2475:4;2464:10;:16::i;:::-;4747:26:::1;4759:4;4765:7;4747:11;:26::i;3955:193:5:-:0;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;4041:12:5::1;4070;-1:-1:-1::0;;;;;4056:33:5::1;;:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4102:39;::::0;-1:-1:-1;;;4102:39:5;;-1:-1:-1;;;;;10315:31:11;;4102:39:5::1;::::0;::::1;10297:50:11::0;4130:10:5::1;10363:18:11::0;;;10356:60;4041:50:5;;-1:-1:-1;;;;;;4102:17:5;::::1;::::0;::::1;::::0;10270:18:11;;4102:39:5::1;;;;;;;;;;;;;;;;;;;4212:234:::0;2232:4:0;2464:16;2232:4;2464:10;:16::i;:::-;4328:9:5::1;4323:117;4343:19:::0;;::::1;4323:117;;;4383:46;-1:-1:-1::0;;;;;;;;;;;4417:8:5::1;;4426:1;4417:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;4383:10;:46::i;:::-;-1:-1:-1::0;4364:3:5::1;;4323:117;;3199:103:0::0;3265:30;3276:4;735:10:2;3265::0;:30::i;:::-;3199:103;:::o;6730:317::-;6808:4;6828:22;6836:4;6842:7;6828;:22::i;:::-;6824:217;;;6898:5;6866:12;;;;;;;;;;;-1:-1:-1;;;;;6866:29:0;;;;;;;;;;:37;;-1:-1:-1;;6866:37:0;;;6922:40;735:10:2;;6866:12:0;;6922:40;;6898:5;6922:40;-1:-1:-1;6983:4:0;6976:11;;6824:217;-1:-1:-1;7025:5:0;7018:12;;6179:316;6256:4;6277:22;6285:4;6291:7;6277;:22::i;:::-;6272:217;;6315:6;:12;;;;;;;;;;;-1:-1:-1;;;;;6315:29:0;;;;;;;;;:36;;-1:-1:-1;;6315:36:0;6347:4;6315:36;;;6397:12;735:10:2;;656:96;6397:12:0;-1:-1:-1;;;;;6370:40:0;6388:7;-1:-1:-1;;;;;6370:40:0;6382:4;6370:40;;;;;;;;;;-1:-1:-1;6431:4:0;6424:11;;3432:197;3520:22;3528:4;3534:7;3520;:22::i;:::-;3515:108;;3565:47;;-1:-1:-1;;;3565:47:0;;-1:-1:-1;;;;;13772:32:11;;3565:47:0;;;13754:51:11;13821:18;;;13814:34;;;13727:18;;3565:47:0;13580:274:11;3515:108:0;3432:197;;:::o;14:286:11:-;72:6;125:2;113:9;104:7;100:23;96:32;93:52;;;141:1;138;131:12;93:52;167:23;;-1:-1:-1;;;;;;219:32:11;;209:43;;199:71;;266:1;263;256:12;497:171;564:20;;-1:-1:-1;;;;;613:30:11;;603:41;;593:69;;658:1;655;648:12;593:69;497:171;;;:::o;673:184::-;731:6;784:2;772:9;763:7;759:23;755:32;752:52;;;800:1;797;790:12;752:52;823:28;841:9;823:28;:::i;862:367::-;925:8;935:6;989:3;982:4;974:6;970:17;966:27;956:55;;1007:1;1004;997:12;956:55;-1:-1:-1;1030:20:11;;-1:-1:-1;;;;;1062:30:11;;1059:50;;;1105:1;1102;1095:12;1059:50;1142:4;1134:6;1130:17;1118:29;;1202:3;1195:4;1185:6;1182:1;1178:14;1170:6;1166:27;1162:38;1159:47;1156:67;;;1219:1;1216;1209:12;1156:67;862:367;;;;;:::o;1234:437::-;1320:6;1328;1381:2;1369:9;1360:7;1356:23;1352:32;1349:52;;;1397:1;1394;1387:12;1349:52;1437:9;1424:23;-1:-1:-1;;;;;1462:6:11;1459:30;1456:50;;;1502:1;1499;1492:12;1456:50;1541:70;1603:7;1594:6;1583:9;1579:22;1541:70;:::i;:::-;1630:8;;1515:96;;-1:-1:-1;1234:437:11;-1:-1:-1;;;;1234:437:11:o;1676:226::-;1735:6;1788:2;1776:9;1767:7;1763:23;1759:32;1756:52;;;1804:1;1801;1794:12;1756:52;-1:-1:-1;1849:23:11;;1676:226;-1:-1:-1;1676:226:11:o;2089:127::-;2150:10;2145:3;2141:20;2138:1;2131:31;2181:4;2178:1;2171:15;2205:4;2202:1;2195:15;2221:253;2293:2;2287:9;2335:4;2323:17;;-1:-1:-1;;;;;2355:34:11;;2391:22;;;2352:62;2349:88;;;2417:18;;:::i;:::-;2453:2;2446:22;2221:253;:::o;2479:251::-;2551:2;2545:9;2593:2;2581:15;;-1:-1:-1;;;;;2611:34:11;;2647:22;;;2608:62;2605:88;;;2673:18;;:::i;2735:251::-;2807:2;2801:9;;;2837:15;;-1:-1:-1;;;;;2867:34:11;;2903:22;;;2864:62;2861:88;;;2929:18;;:::i;2991:275::-;3062:2;3056:9;3127:2;3108:13;;-1:-1:-1;;3104:27:11;3092:40;;-1:-1:-1;;;;;3147:34:11;;3183:22;;;3144:62;3141:88;;;3209:18;;:::i;:::-;3245:2;3238:22;2991:275;;-1:-1:-1;2991:275:11:o;3271:766::-;3340:6;3393:2;3381:9;3372:7;3368:23;3364:32;3361:52;;;3409:1;3406;3399:12;3361:52;3449:9;3436:23;-1:-1:-1;;;;;3474:6:11;3471:30;3468:50;;;3514:1;3511;3504:12;3468:50;3537:22;;3590:4;3582:13;;3578:27;-1:-1:-1;3568:55:11;;3619:1;3616;3609:12;3568:55;3659:2;3646:16;-1:-1:-1;;;;;3677:6:11;3674:30;3671:56;;;3707:18;;:::i;:::-;3749:57;3796:2;3773:17;;-1:-1:-1;;3769:31:11;3802:2;3765:40;3749:57;:::i;:::-;3829:6;3822:5;3815:21;3877:7;3872:2;3863:6;3859:2;3855:15;3851:24;3848:37;3845:57;;;3898:1;3895;3888:12;3845:57;3953:6;3948:2;3944;3940:11;3935:2;3928:5;3924:14;3911:49;4005:1;3980:18;;;4000:2;3976:27;3969:38;;;;3984:5;3271:766;-1:-1:-1;;;;3271:766:11:o;4042:131::-;-1:-1:-1;;;;;4117:31:11;;4107:42;;4097:70;;4163:1;4160;4153:12;4178:367;4246:6;4254;4307:2;4295:9;4286:7;4282:23;4278:32;4275:52;;;4323:1;4320;4313:12;4275:52;4368:23;;;-1:-1:-1;4467:2:11;4452:18;;4439:32;4480:33;4439:32;4480:33;:::i;:::-;4532:7;4522:17;;;4178:367;;;;;:::o;4550:252::-;4617:6;4625;4678:2;4666:9;4657:7;4653:23;4649:32;4646:52;;;4694:1;4691;4684:12;4646:52;4717:28;4735:9;4717:28;:::i;:::-;4707:38;4792:2;4777:18;;;;4764:32;;-1:-1:-1;;;4550:252:11:o;4807:587::-;4878:6;4886;4939:2;4927:9;4918:7;4914:23;4910:32;4907:52;;;4955:1;4952;4945:12;4907:52;4995:9;4982:23;-1:-1:-1;;;;;5020:6:11;5017:30;5014:50;;;5060:1;5057;5050:12;5014:50;5083:22;;5136:4;5128:13;;5124:27;-1:-1:-1;5114:55:11;;5165:1;5162;5155:12;5114:55;5205:2;5192:16;-1:-1:-1;;;;;5223:6:11;5220:30;5217:50;;;5263:1;5260;5253:12;5217:50;5308:7;5303:2;5294:6;5290:2;5286:15;5282:24;5279:37;5276:57;;;5329:1;5326;5319:12;5276:57;5360:2;5352:11;;;;;5382:6;;-1:-1:-1;4807:587:11;-1:-1:-1;;;4807:587:11:o;5590:238::-;5474:12;;-1:-1:-1;;;;;5470:37:11;5458:50;;5571:4;5560:16;;;5554:23;5551:1;5540:38;5524:14;;;5517:62;5768:2;5753:18;;5780:42;5399:186;6287:672;6521:2;6533:21;;;6603:13;;6506:18;;;6625:22;;;6473:4;;6704:15;;;6678:2;6663:18;;;6473:4;6747:186;6761:6;6758:1;6755:13;6747:186;;;6810:43;6849:3;6840:6;6834:13;5474:12;;-1:-1:-1;;;;;5470:37:11;5458:50;;5571:4;5560:16;;;5554:23;5551:1;5540:38;5524:14;;5517:62;5399:186;6810:43;6920:2;6908:15;;;;;6882:2;6873:12;;;;;6783:1;6776:9;6747:186;;;-1:-1:-1;6950:3:11;;6287:672;-1:-1:-1;;;;;6287:672:11:o;7172:256::-;7238:6;7246;7299:2;7287:9;7278:7;7274:23;7270:32;7267:52;;;7315:1;7312;7305:12;7267:52;7338:28;7356:9;7338:28;:::i;:::-;7328:38;;7385:37;7418:2;7407:9;7403:18;7385:37;:::i;:::-;7375:47;;7172:256;;;;;:::o;7433:160::-;7499:20;;7559:1;7548:20;;;7538:31;;7528:59;;7583:1;7580;7573:12;7598:2251;7685:6;7738:2;7726:9;7717:7;7713:23;7709:32;7706:52;;;7754:1;7751;7744:12;7706:52;7794:9;7781:23;-1:-1:-1;;;;;7819:6:11;7816:30;7813:50;;;7859:1;7856;7849:12;7813:50;7882:22;;7938:4;7920:16;;;7916:27;7913:47;;;7956:1;7953;7946:12;7913:47;7982:22;;:::i;:::-;8049:16;;8074:22;;8128:30;8154:2;8146:11;;8128:30;:::i;:::-;8123:2;8116:5;8112:14;8105:54;8191:30;8217:2;8213;8209:11;8191:30;:::i;:::-;8186:2;8179:5;8175:14;8168:54;8267:2;8263;8259:11;8246:25;8302:1;8293:7;8290:14;8280:42;;8318:1;8315;8308:12;8280:42;8349:2;8338:14;;8331:31;8408:3;8400:12;;8387:26;-1:-1:-1;;;;;8425:32:11;;8422:52;;;8470:1;8467;8460:12;8422:52;8493:17;;;;;8544:2;8526:16;;;8522:25;8519:45;;;8560:1;8557;8550:12;8519:45;8588:22;;:::i;:::-;8635:21;8653:2;8635:21;:::i;:::-;8626:7;8619:38;8703:2;8699;8695:11;8682:25;-1:-1:-1;;;;;8722:8:11;8719:32;8716:52;;;8764:1;8761;8754:12;8716:52;8787:17;;8835:4;8827:13;;8823:27;-1:-1:-1;8813:55:11;;8864:1;8861;8854:12;8813:55;8904:2;8891:16;-1:-1:-1;;;;;8922:6:11;8919:30;8916:56;;;8952:18;;:::i;:::-;8992:40;9028:2;9019:6;9016:1;9012:14;9008:23;8992:40;:::i;:::-;9054:3;9078:6;9073:3;9066:19;9110:2;9105:3;9101:12;9094:19;;9165:2;9155:6;9152:1;9148:14;9144:2;9140:23;9136:32;9122:46;;9191:7;9183:6;9180:19;9177:39;;;9212:1;9209;9202:12;9177:39;9244:2;9240;9236:11;9225:22;;9256:418;9272:6;9267:3;9264:15;9256:418;;;9352:2;9346:3;9337:7;9333:17;9329:26;9326:46;;;9368:1;9365;9358:12;9326:46;9400:22;;:::i;:::-;9475:17;;9505:24;;9567:31;9594:2;9585:12;;9567:31;:::i;:::-;9562:2;9553:7;9549:16;9542:57;9624:7;9619:3;9612:20;;9661:2;9656:3;9652:12;9645:19;;9298:2;9293:3;9289:12;9282:19;;9256:418;;;9703:2;9690:16;;9683:31;-1:-1:-1;9748:29:11;;-1:-1:-1;;9773:2:11;9765:11;;9748:29;:::i;:::-;9743:2;9730:16;;9723:55;9805:3;9794:15;;9787:32;9798:5;7598:2251;-1:-1:-1;;;;7598:2251:11:o;9854:266::-;9939:6;9992:2;9980:9;9971:7;9967:23;9963:32;9960:52;;;10008:1;10005;9998:12;9960:52;10040:9;10034:16;10059:31;10084:5;10059:31;:::i;10427:127::-;10488:10;10483:3;10479:20;10476:1;10469:31;10519:4;10516:1;10509:15;10543:4;10540:1;10533:15;10559:247;10618:6;10671:2;10659:9;10650:7;10646:23;10642:32;10639:52;;;10687:1;10684;10677:12;10639:52;10726:9;10713:23;10745:31;10770:5;10745:31;:::i;10811:527::-;10960:2;10949:9;10942:21;10923:4;10992:6;10986:13;11035:6;11030:2;11019:9;11015:18;11008:34;11060:1;11070:140;11084:6;11081:1;11078:13;11070:140;;;11195:2;11179:14;;;11175:23;;11169:30;11164:2;11145:17;;;11141:26;11134:66;11099:10;11070:140;;;11074:3;11259:1;11254:2;11245:6;11234:9;11230:22;11226:31;11219:42;11329:2;11322;11318:7;11313:2;11305:6;11301:15;11297:29;11286:9;11282:45;11278:54;11270:62;;;10811:527;;;;:::o;11343:127::-;11404:10;11399:3;11395:20;11392:1;11385:31;11435:4;11432:1;11425:15;11459:4;11456:1;11449:15;11475:128;11542:9;;;11563:11;;;11560:37;;;11577:18;;:::i;11608:168::-;11681:9;;;11712;;11729:15;;;11723:22;;11709:37;11699:71;;11750:18;;:::i;12154:390::-;12313:2;12302:9;12295:21;12352:6;12347:2;12336:9;12332:18;12325:34;12409:6;12401;12396:2;12385:9;12381:18;12368:48;12465:1;12436:22;;;12460:2;12432:31;;;12425:42;;;;12528:2;12507:15;;;-1:-1:-1;;12503:29:11;12488:45;12484:54;;12154:390;-1:-1:-1;12154:390:11:o;12549:522::-;12627:4;12633:6;12693:11;12680:25;12787:2;12783:7;12772:8;12756:14;12752:29;12748:43;12728:18;12724:68;12714:96;;12806:1;12803;12796:12;12714:96;12833:33;;12885:20;;;-1:-1:-1;;;;;;12917:30:11;;12914:50;;;12960:1;12957;12950:12;12914:50;12993:4;12981:17;;-1:-1:-1;13024:14:11;13020:27;;;13010:38;;13007:58;;;13061:1;13058;13051:12

Swarm Source

ipfs://7889033c2a3ea1bd638dbe4369197cfbc599696d4a222567c2e4c479c7e7032e

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

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
0x9CDde85d32420C429fCe14cEFD07182c61712e88
Loading...
Loading
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.