ETH Price: $2,729.40 (+1.42%)
Gas: 0.76 Gwei

Contract

0x0560e1392185bf554E1e0044cD752aeA83F37C6E
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Safe Execute Sig...218489112025-02-15 2:40:1111 mins ago1739587211IN
0x0560e139...A83F37C6E
0 ETH0.000211110.72443136
Safe Execute Sig...218449802025-02-14 13:24:4713 hrs ago1739539487IN
0x0560e139...A83F37C6E
0 ETH0.000355571.22023737
Safe Execute Sig...218409122025-02-13 23:44:1127 hrs ago1739490251IN
0x0560e139...A83F37C6E
0 ETH0.000246260.86060691
Safe Execute Sig...218375262025-02-13 12:21:2338 hrs ago1739449283IN
0x0560e139...A83F37C6E
0 ETH0.000268880.92267411
Safe Execute Sig...218296342025-02-12 9:52:232 days ago1739353943IN
0x0560e139...A83F37C6E
0 ETH0.000282470.97162258
Safe Execute Sig...218269672025-02-12 0:49:353 days ago1739321375IN
0x0560e139...A83F37C6E
0 ETH0.000240040.83892438
Safe Execute Sig...218241482025-02-11 15:22:353 days ago1739287355IN
0x0560e139...A83F37C6E
0 ETH0.000575781.97575634
Safe Execute Sig...218234342025-02-11 12:58:593 days ago1739278739IN
0x0560e139...A83F37C6E
0 ETH0.000250310.85892664
Safe Execute Sig...218232742025-02-11 12:26:353 days ago1739276795IN
0x0560e139...A83F37C6E
0 ETH0.000317891.09340394
Safe Execute Sig...218169062025-02-10 15:06:354 days ago1739199995IN
0x0560e139...A83F37C6E
0 ETH0.000457931.57135432
Safe Execute Sig...218113342025-02-09 20:26:355 days ago1739132795IN
0x0560e139...A83F37C6E
0 ETH0.000237670.81743307
Safe Execute Sig...218096932025-02-09 14:55:595 days ago1739112959IN
0x0560e139...A83F37C6E
0 ETH0.000258850.88827722
Safe Execute Sig...218096132025-02-09 14:39:595 days ago1739111999IN
0x0560e139...A83F37C6E
0 ETH0.000271910.93307359
Safe Execute Sig...218072512025-02-09 6:45:235 days ago1739083523IN
0x0560e139...A83F37C6E
0 ETH0.000242290.84672888
Safe Execute Sig...218071972025-02-09 6:34:235 days ago1739082863IN
0x0560e139...A83F37C6E
0 ETH0.00024910.87048974
Safe Execute Sig...218052332025-02-09 0:00:116 days ago1739059211IN
0x0560e139...A83F37C6E
0 ETH0.000256360.85508832
Safe Execute Sig...218024262025-02-08 14:34:596 days ago1739025299IN
0x0560e139...A83F37C6E
0 ETH0.000364591.25111157
Safe Execute Sig...217948632025-02-07 13:15:117 days ago1738934111IN
0x0560e139...A83F37C6E
0 ETH0.000288880.99129697
Safe Execute Sig...217876922025-02-06 13:14:478 days ago1738847687IN
0x0560e139...A83F37C6E
0 ETH0.000386411.32598777
Safe Execute Sig...217804712025-02-05 13:04:119 days ago1738760651IN
0x0560e139...A83F37C6E
0 ETH0.000446421.5320191
Safe Execute Sig...217790892025-02-05 8:26:239 days ago1738743983IN
0x0560e139...A83F37C6E
0 ETH0.000400761.28970593
Safe Execute Sig...217782452025-02-05 5:35:599 days ago1738733759IN
0x0560e139...A83F37C6E
0 ETH0.000356671.22669071
Safe Execute Sig...217739672025-02-04 15:15:2310 days ago1738682123IN
0x0560e139...A83F37C6E
0 ETH0.001344634.61414931
Safe Execute Sig...217732862025-02-04 12:58:4710 days ago1738673927IN
0x0560e139...A83F37C6E
0 ETH0.000538451.85188515
Safe Execute Sig...217692322025-02-03 23:22:1111 days ago1738624931IN
0x0560e139...A83F37C6E
0 ETH0.00188376.46398464
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
218489112025-02-15 2:40:1111 mins ago1739587211
0x0560e139...A83F37C6E
0.00028742 ETH
218489112025-02-15 2:40:1111 mins ago1739587211
0x0560e139...A83F37C6E
0.21415745 ETH
218489112025-02-15 2:40:1111 mins ago1739587211
0x0560e139...A83F37C6E
0.21444488 ETH
218449802025-02-14 13:24:4713 hrs ago1739539487
0x0560e139...A83F37C6E
0.00048487 ETH
218449802025-02-14 13:24:4713 hrs ago1739539487
0x0560e139...A83F37C6E
0.10760841 ETH
218449802025-02-14 13:24:4713 hrs ago1739539487
0x0560e139...A83F37C6E
0.10809328 ETH
218375262025-02-13 12:21:2338 hrs ago1739449283
0x0560e139...A83F37C6E
0.00036624 ETH
218375262025-02-13 12:21:2338 hrs ago1739449283
0x0560e139...A83F37C6E
0.10284154 ETH
218375262025-02-13 12:21:2338 hrs ago1739449283
0x0560e139...A83F37C6E
0.10320779 ETH
218309042025-02-12 14:08:592 days ago1739369339
0x0560e139...A83F37C6E
0.07929728 ETH
218309042025-02-12 14:08:592 days ago1739369339
0x0560e139...A83F37C6E
0.07929728 ETH
218296342025-02-12 9:52:232 days ago1739353943
0x0560e139...A83F37C6E
0.00089276 ETH
218296342025-02-12 9:52:232 days ago1739353943
0x0560e139...A83F37C6E
0.01977309 ETH
218296342025-02-12 9:52:232 days ago1739353943
0x0560e139...A83F37C6E
0.02066586 ETH
218241482025-02-11 15:22:353 days ago1739287355
0x0560e139...A83F37C6E
0.00078392 ETH
218241482025-02-11 15:22:353 days ago1739287355
0x0560e139...A83F37C6E
0.11656066 ETH
218241482025-02-11 15:22:353 days ago1739287355
0x0560e139...A83F37C6E
0.11734459 ETH
218234342025-02-11 12:58:593 days ago1739278739
0x0560e139...A83F37C6E
0.00034028 ETH
218234342025-02-11 12:58:593 days ago1739278739
0x0560e139...A83F37C6E
0.02003562 ETH
218234342025-02-11 12:58:593 days ago1739278739
0x0560e139...A83F37C6E
0.02037591 ETH
218232742025-02-11 12:26:353 days ago1739276795
0x0560e139...A83F37C6E
0.00109779 ETH
218232742025-02-11 12:26:353 days ago1739276795
0x0560e139...A83F37C6E
0.0756712 ETH
218232742025-02-11 12:26:353 days ago1739276795
0x0560e139...A83F37C6E
0.076769 ETH
218169062025-02-10 15:06:354 days ago1739199995
0x0560e139...A83F37C6E
0.00062468 ETH
218169062025-02-10 15:06:354 days ago1739199995
0x0560e139...A83F37C6E
0.11679458 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TokenOmnibridgeRouter

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
No with 200 runs

Other Settings:
paris EvmVersion
File 1 of 18 : TokenOmnibridgeRouter.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

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

import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { SafeERC20 } from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import { IBasicAMBMediator } from "../interfaces/IBasicAMBMediator.sol";
import { IBasicForeignAMB } from "../interfaces/IBasicForeignAMB.sol";
import { IBridgeValidators } from "../interfaces/IBridgeValidators.sol";
import { IOmnibridge } from "../interfaces/IOmnibridge.sol";
import { IWETH as IWNative } from "../interfaces/IWETH.sol";

import { AddressHelper } from "../libraries/AddressHelper.sol";
import { Bytes } from "../libraries/Bytes.sol";

import { OwnableModule } from "../upgradeable_contracts/modules/OwnableModule.sol";
import { Claimable } from "../upgradeable_contracts/Claimable.sol";
import { StorageSlot } from "@openzeppelin/contracts/utils/StorageSlot.sol";

/**
 * @title TokenOmnibridgeRouter
 * @dev Omnibridge extension for processing tokens that are not otherwise
 * delivered automatically because of foreign omnibridge settings
 */
contract TokenOmnibridgeRouter is OwnableModule, Claimable, ReentrancyV2 {
    using SafeERC20 for IERC20;
    bool public immutable EIP1559_ENABLED;
    IOmnibridge public immutable bridge;
    IWNative public immutable WNative;
    address public validatorsFilter;
    mapping(address => bool) public isValidator;

    error NotPayable();

    bytes32 public constant RUNNER_SLOT = keccak256(abi.encode("omnibridgerouter.runner"));

    /**
     * @dev Initializes this contract.
     * @param _bridge address of the HomeOmnibridge/ForeignOmnibridge contract.
     * @param _wNative address of the WNative token used for wrapping/unwrapping native coins (e.g. WETH/WBNB/WXDAI).
     * @param _owner address of the contract owner.
     */
    constructor(
        IOmnibridge _bridge,
        IWNative _wNative,
        address _owner,
        bool _EIP1559_ENABLED
    ) OwnableModule(_owner) {
        bridge = _bridge;
        WNative = _wNative;
        _wNative.approve(address(_bridge), type(uint256).max);
        validatorsFilter = address(this);
        EIP1559_ENABLED = _EIP1559_ENABLED;
    }

    /**
     * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain.
     * Call msg.sender will receive assets on the other side of the bridge.
     */
    function wrapAndRelayTokens() external payable {
        _relayTokensAndCall(msg.sender, "");
    }

    /**
     * @dev Wraps native assets and relays wrapped ERC20 tokens to the other chain.
     * @param _receiver bridged assets receiver on the other side of the bridge.
     */
    function wrapAndRelayTokens(address _receiver) external payable {
        _relayTokensAndCall(_receiver, "");
    }
    /**
     * a convenience method for relaying tokens to a corresponding network
     * @param _receiver the receiving contract on the other network
     * @param _data the encoded data that should be passed to `onTokenBridged` on the other network
     */
    function relayTokensAndCall(address _receiver, bytes calldata _data) external payable {
        _relayTokensAndCall(_receiver, _data);
    }
    function _relayTokensAndCall(address _receiver, bytes memory _data) internal {
        WNative.deposit{ value: msg.value }();
        bridge.relayTokensAndCall(address(WNative), _receiver, msg.value, _data);
    }

    struct FeeDirector {
        address recipient;
        // a list of up to 256 flags for modifying how the contract handles tokens
        // 0th index is to use the limit as the fee amount
        // 1st index is to unwrap the tokens
        // 2nd is to ask the system to not include the priority fee
        // 3rd is to use the multiplier as a factor of total tokens
        // if a base fee is available it will only use that
        uint256 settings;
        uint256 limit;
        uint256 multiplier;
    }

    /**
     * @dev Bridged callback function used for unwrapping received tokens.
     * Can only be called by the associated Omnibridge contract.
     * @param _token bridged token contract address, should be WNative.
     * @param _value amount of bridged/received tokens.
     * @param _data extra data passed alongside with relayTokensAndCall
     * on the other side of the bridge. Should contain coins receiver address.
     */
    function onTokenBridged(
        address _token,
        uint256 _value,
        bytes memory _data
    ) external payable virtual nonReentrant {
        require(msg.sender == address(bridge));

        if (_data.length == 20) {
            // handling legacy WNative -> Native
            require(_token == address(WNative));
            WNative.withdraw(_value);
            AddressHelper.safeSendValue(payable(Bytes.bytesToAddress(_data)), _value);
        } else {
            FeeDirector memory feeDirector = abi.decode(_data, (FeeDirector));
            // setting at the 0th slot from the right is a signal to unwrap the tokens
            bool toNative = feeDirector.settings << 254 >> 255 == 1 && address(WNative) == _token;
            // handling WNative -> Native
            if (toNative && _token == address(WNative)) {
                WNative.withdraw(_value);
            }
            uint256 runner = StorageSlot.getUint256Slot(RUNNER_SLOT).value;
            uint256 fees;
            uint256 toRecipient = _value;
            if (runner > 1) {
                // setting at the 1st slot from the right is a signal to use the limit as the fixed fee
                (fees, toRecipient) = _feeInfo(toNative, _value, runner, feeDirector);
            }
            if (toRecipient > 0) {
                _distribute(toNative, _token, feeDirector.recipient, toRecipient);
            }
            if (fees > 0) {
                _distribute(toNative, _token, address(uint160(runner >> 96)), fees);
            }
        }
    }

    function _distribute(bool native, address token, address recipient, uint256 amount) internal {
        if (native) {
            (bool success, ) = recipient.call{value: amount}("");
            if (!success) {
                revert NotPayable();
            }
        } else {
            IERC20(token).safeTransfer(recipient, amount);
        }
    }

    function _feeInfo(
        bool toNative, uint256 _value, uint256 runner,
        FeeDirector memory feeDirector
    ) internal view returns(uint256 fees, uint256 toRecipient) {
        // use the limit as the fee
        if (feeDirector.settings << 255 >> 255 == 1) {
            fees = feeDirector.limit;
        } else if (feeDirector.settings << 252 >> 255 == 1) {
            fees = (_value * feeDirector.multiplier) / 1 ether;
        } else {
            // a runner has been named (does not have to match sender)
            uint256 gasUsed = uint256(uint96(runner)) - gasleft();
            // extra 50k added for 2x transfer handling + 10%
            // to cover profit motive + risk compensation
            uint256 baselineFee = _baseFee((feeDirector.settings << 253 >> 255) == 1);
            fees = ((gasUsed + (
                // this is an unwrap, different costs for tokens vs native
                toNative ? 50_000 : 100_000
            )) * feeDirector.multiplier * baselineFee) / 1 ether;
            // fees must not be greater than limit
            fees = fees > feeDirector.limit ? feeDirector.limit : fees;
        }
        // fees must not be greater than value
        fees = fees > _value ? _value : fees;
        toRecipient = _value - fees;
    }

    function feeInfo(
        bool toNative, uint256 _value, uint256 runner,
        FeeDirector calldata feeDirector
    ) external view returns(uint256, uint256) {
        return _feeInfo(toNative, _value, runner, feeDirector);
    }

    function baseFee(bool excludePriority) external view returns(uint256) {
        return _baseFee(excludePriority);
    }

    function _baseFee(bool excludePriority) internal view returns(uint256) {
        return EIP1559_ENABLED && excludePriority ? block.basefee : tx.gasprice;
    }

    /**
     * @dev Claims stuck coins/tokens.
     * Only contract owner can call this method.
     * @param _token address of claimed token contract, address(0) for native coins.
     * @param _to address of tokens receiver
     */
    function claimTokens(address _token, address _to) external onlyOwner {
        claimValues(_token, _to);
    }

    /**
     * @dev Ether receive function.
     * Should be only called from the WNative contract when withdrawing native coins. Will revert otherwise.
     */
    receive() external payable {
        require(msg.sender == address(WNative));
    }
    /**
     * @dev Validates provided signatures and relays a given message. Passes all available gas for the execution.
     * The message is not allowed to fail. The whole tx will be revered if message fails.
     * @param runner the validator you would like to attribute this method call to
     * @param _data bytes to be relayed
     * @param _signatures bytes blob with signatures to be validated
     * @notice that the sender does not matter, so this method could be called via
     * multicall for more efficient gas savings and still attribute tokens to the validator appropriately
     */
    function safeExecuteSignaturesWithAutoGasLimit(
        address runner,
        bytes calldata _data,
        bytes calldata _signatures
    ) external payable nonReentrantUint256(RUNNER_SLOT, uint256(uint96(gasleft())) | (uint256(uint160(runner)) << 96)) {
        if (!IBridgeValidators(validatorsFilter).isValidator(runner)) {
            revert NotPayable();
        }
        IBasicForeignAMB(address(IBasicAMBMediator(address(bridge)).bridgeContract()))
            .safeExecuteSignaturesWithAutoGasLimit(_data, _signatures);
    }
    /**
     * updates the filter to any contract.
     * for future use case, this is the bridge's validator contract
     */
    function setValidatorsFilter(address _validatorsFilter) external payable onlyOwner {
        // if this doesn't fail we are at least guaranteed that it has the method
        IBridgeValidators(_validatorsFilter).isValidator(address(0));
        validatorsFilter = _validatorsFilter;
    }
    /** mev protection management */
    function setValidatorStatus(address _validator, bool _isValidator) external payable onlyOwner {
        isValidator[_validator] = _isValidator;
    }
}

File 2 of 18 : IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 *
 * ==== Security Considerations
 *
 * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature
 * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be
 * considered as an intention to spend the allowance in any specific way. The second is that because permits have
 * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should
 * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be
 * generally recommended is:
 *
 * ```solidity
 * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public {
 *     try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {}
 *     doThing(..., value);
 * }
 *
 * function doThing(..., uint256 value) public {
 *     token.safeTransferFrom(msg.sender, address(this), value);
 *     ...
 * }
 * ```
 *
 * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of
 * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also
 * {SafeERC20-safeTransferFrom}).
 *
 * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so
 * contracts should have entry points that don't rely on permit.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     *
     * CAUTION: See Security Considerations above.
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 3 of 18 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 4 of 18 : SafeERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";
import {IERC20Permit} from "../extensions/IERC20Permit.sol";
import {Address} from "../../../utils/Address.sol";

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    /**
     * @dev An operation with an ERC20 token failed.
     */
    error SafeERC20FailedOperation(address token);

    /**
     * @dev Indicates a failed `decreaseAllowance` request.
     */
    error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease);

    /**
     * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value)));
    }

    /**
     * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the
     * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful.
     */
    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value)));
    }

    /**
     * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful.
     */
    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 oldAllowance = token.allowance(address(this), spender);
        forceApprove(token, spender, oldAllowance + value);
    }

    /**
     * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no
     * value, non-reverting calls are assumed to be successful.
     */
    function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal {
        unchecked {
            uint256 currentAllowance = token.allowance(address(this), spender);
            if (currentAllowance < requestedDecrease) {
                revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease);
            }
            forceApprove(token, spender, currentAllowance - requestedDecrease);
        }
    }

    /**
     * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value,
     * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval
     * to be set to zero before setting it to a non-zero value, such as USDT.
     */
    function forceApprove(IERC20 token, address spender, uint256 value) internal {
        bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value));

        if (!_callOptionalReturnBool(token, approvalCall)) {
            _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0)));
            _callOptionalReturn(token, approvalCall);
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data);
        if (returndata.length != 0 && !abi.decode(returndata, (bool))) {
            revert SafeERC20FailedOperation(address(token));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     *
     * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead.
     */
    function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false
        // and not revert is the subcall reverts.

        (bool success, bytes memory returndata) = address(token).call(data);
        return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0;
    }
}

File 5 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol)

pragma solidity ^0.8.20;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev The ETH balance of the account is not enough to perform the operation.
     */
    error AddressInsufficientBalance(address account);

    /**
     * @dev There's no code at `target` (it is not a contract).
     */
    error AddressEmptyCode(address target);

    /**
     * @dev A call to an address target failed. The target may have reverted.
     */
    error FailedInnerCall();

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        if (address(this).balance < amount) {
            revert AddressInsufficientBalance(address(this));
        }

        (bool success, ) = recipient.call{value: amount}("");
        if (!success) {
            revert FailedInnerCall();
        }
    }

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

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     */
    function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
        if (address(this).balance < value) {
            revert AddressInsufficientBalance(address(this));
        }
        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResultFromTarget(target, success, returndata);
    }

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target
     * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an
     * unsuccessful call.
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata
    ) internal view returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            // only check if target is a contract if the call was successful and the return data is empty
            // otherwise we already know that it was a contract
            if (returndata.length == 0 && target.code.length == 0) {
                revert AddressEmptyCode(target);
            }
            return returndata;
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the
     * revert reason or with a default {FailedInnerCall} error.
     */
    function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) {
        if (!success) {
            _revert(returndata);
        } else {
            return returndata;
        }
    }

    /**
     * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}.
     */
    function _revert(bytes memory returndata) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert FailedInnerCall();
        }
    }
}

File 6 of 18 : StorageSlot.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/StorageSlot.sol)
// This file was procedurally generated from scripts/generate/templates/StorageSlot.js.

pragma solidity ^0.8.20;

/**
 * @dev Library for reading and writing primitive types to specific storage slots.
 *
 * Storage slots are often used to avoid storage conflict when dealing with upgradeable contracts.
 * This library helps with reading and writing to such slots without the need for inline assembly.
 *
 * The functions in this library return Slot structs that contain a `value` member that can be used to read or write.
 *
 * Example usage to set ERC1967 implementation slot:
 * ```solidity
 * contract ERC1967 {
 *     bytes32 internal constant _IMPLEMENTATION_SLOT = 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;
 *
 *     function _getImplementation() internal view returns (address) {
 *         return StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value;
 *     }
 *
 *     function _setImplementation(address newImplementation) internal {
 *         require(newImplementation.code.length > 0);
 *         StorageSlot.getAddressSlot(_IMPLEMENTATION_SLOT).value = newImplementation;
 *     }
 * }
 * ```
 */
library StorageSlot {
    struct AddressSlot {
        address value;
    }

    struct BooleanSlot {
        bool value;
    }

    struct Bytes32Slot {
        bytes32 value;
    }

    struct Uint256Slot {
        uint256 value;
    }

    struct StringSlot {
        string value;
    }

    struct BytesSlot {
        bytes value;
    }

    /**
     * @dev Returns an `AddressSlot` with member `value` located at `slot`.
     */
    function getAddressSlot(bytes32 slot) internal pure returns (AddressSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BooleanSlot` with member `value` located at `slot`.
     */
    function getBooleanSlot(bytes32 slot) internal pure returns (BooleanSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Bytes32Slot` with member `value` located at `slot`.
     */
    function getBytes32Slot(bytes32 slot) internal pure returns (Bytes32Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `Uint256Slot` with member `value` located at `slot`.
     */
    function getUint256Slot(bytes32 slot) internal pure returns (Uint256Slot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` with member `value` located at `slot`.
     */
    function getStringSlot(bytes32 slot) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `StringSlot` representation of the string storage pointer `store`.
     */
    function getStringSlot(string storage store) internal pure returns (StringSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` with member `value` located at `slot`.
     */
    function getBytesSlot(bytes32 slot) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := slot
        }
    }

    /**
     * @dev Returns an `BytesSlot` representation of the bytes storage pointer `store`.
     */
    function getBytesSlot(bytes storage store) internal pure returns (BytesSlot storage r) {
        /// @solidity memory-safe-assembly
        assembly {
            r.slot := store.slot
        }
    }
}

File 7 of 18 : ReentrancyV2.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

import { StorageSlot } from "@openzeppelin/contracts/utils/StorageSlot.sol";

abstract contract ReentrancyV2 {
  error ReentrancyGuard();
  error InvalidValue();
  uint256 private constant _ENTERED = 2;
  uint256 private constant _NOT_ENTERED = 1;
  // global reentrant
  uint256 internal reentrant;

  modifier nonReentrant() {
    if (uint256(reentrant) > _NOT_ENTERED) {
      revert ReentrancyGuard();
    }
    reentrant = _ENTERED;
    _;
    reentrant = _NOT_ENTERED;
  }
  modifier nonReentrantUint256(bytes32 key, uint256 value) {
    if (value < _ENTERED) {
      revert InvalidValue();
    }
    StorageSlot.Uint256Slot storage slot = StorageSlot.getUint256Slot(key);
    if (slot.value > _NOT_ENTERED) {
      revert ReentrancyGuard();
    }
    slot.value = value;
    _;
    slot.value = _NOT_ENTERED;
  }
}

File 8 of 18 : IAMB.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

interface IAMB {
    event UserRequestForAffirmation(bytes32 indexed messageId, bytes encodedData);
    event UserRequestForSignature(bytes32 indexed messageId, bytes encodedData);
    event AffirmationCompleted(
        address indexed sender,
        address indexed executor,
        bytes32 indexed messageId,
        bool status
    );
    event RelayedMessage(address indexed sender, address indexed executor, bytes32 indexed messageId, bool status);

    function messageSender() external view returns (address);

    function maxGasPerTx() external view returns (uint256);

    function transactionHash() external view returns (bytes32);

    function messageId() external view returns (bytes32);

    function messageSourceChainId() external view returns (bytes32);

    function messageCallStatus(bytes32 _messageId) external view returns (bool);

    function failedMessageDataHash(bytes32 _messageId) external view returns (bytes32);

    function failedMessageReceiver(bytes32 _messageId) external view returns (address);

    function failedMessageSender(bytes32 _messageId) external view returns (address);

    function requireToPassMessage(
        address _contract,
        bytes calldata _data,
        uint256 _gas
    ) external returns (bytes32);

    function requireToConfirmMessage(
        address _contract,
        bytes calldata _data,
        uint256 _gas
    ) external returns (bytes32);

    function sourceChainId() external view returns (uint256);

    function destinationChainId() external view returns (uint256);
}

File 9 of 18 : IBasicAMBMediator.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

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

interface IBasicAMBMediator {
  function bridgeContract() external view returns (IAMB);
}

File 10 of 18 : IBasicForeignAMB.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

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

interface IBasicForeignAMB {
    function safeExecuteSignaturesWithAutoGasLimit(bytes calldata _data, bytes calldata _signatures) external;

    function validatorContract() external view returns (IBridgeValidators);

    function relayTokens(address _receiver, uint256 _amount) external;
}

File 11 of 18 : IBridgeValidators.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

interface IBridgeValidators {
    function isValidator(address _validator) external view returns (bool);

    function F_ADDR() external view returns (address);

    function getNextValidator(address _address) external view returns (address);

    function validatorCount() external view returns (uint256);

    function validatorList() external view returns(address[] memory);
}

File 12 of 18 : IOmnibridge.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

interface IOmnibridge {
    function relayTokens(
        address _token,
        address _receiver,
        uint256 _value
    ) external;
    function relayTokensAndCall(
        address _token,
        address _receiver,
        uint256 _value,
        bytes calldata _data
    ) external;
}

File 13 of 18 : IWETH.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

interface IWETH {
    function deposit() external payable;

    function withdraw(uint256 _value) external;

    function approve(address _to, uint256 _value) external;
}

File 14 of 18 : AddressHelper.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

import "../upgradeable_contracts/Sacrifice.sol";

/**
 * @title AddressHelper
 * @dev Helper methods for Address type.
 */
library AddressHelper {
    /**
     * @dev Try to send native tokens to the address. If it fails, it will force the transfer by creating a selfdestruct contract
     * @param _receiver address that will receive the native tokens
     * @param _value the amount of native tokens to send
     */
    function safeSendValue(address payable _receiver, uint256 _value) internal {
        if (!(_receiver).send(_value)) {
            new Sacrifice{ value: _value }(_receiver);
        }
    }
}

File 15 of 18 : Bytes.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

/**
 * @title Bytes
 * @dev Helper methods to transform bytes to other solidity types.
 */
library Bytes {
    /**
     * @dev Truncate bytes array if its size is more than 20 bytes.
     * NOTE: This function does not perform any checks on the received parameter.
     * Make sure that the _bytes argument has a correct length, not less than 20 bytes.
     * A case when _bytes has length less than 20 will lead to the undefined behaviour,
     * since assembly will read data from memory that is not related to the _bytes argument.
     * @param _bytes to be converted to address type
     * @return addr address included in the firsts 20 bytes of the bytes array in parameter.
     */
    function bytesToAddress(bytes memory _bytes) internal pure returns (address addr) {
        assembly {
            addr := mload(add(_bytes, 20))
        }
    }
}

File 16 of 18 : Claimable.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

import "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import "../libraries/AddressHelper.sol";

/**
 * @title Claimable
 * @dev Implementation of the claiming utils that can be useful for withdrawing accidentally sent tokens that are not used in bridge operations.
 */
contract Claimable {
    using SafeERC20 for IERC20;

    /**
     * Throws if a given address is equal to address(0)
     */
    modifier validAddress(address _to) {
        require(_to != address(0));
        _;
    }

    /**
     * @dev Withdraws the erc20 tokens or native coins from this contract.
     * Caller should additionally check that the claimed token is not a part of bridge operations (i.e. that token != erc20token()).
     * @param _token address of the claimed token or address(0) for native coins.
     * @param _to address of the tokens/coins receiver.
     */
    function claimValues(address _token, address _to) internal validAddress(_to) {
        if (_token == address(0)) {
            claimNativeCoins(_to);
        } else {
            claimErc20Tokens(_token, _to);
        }
    }

    /**
     * @dev Internal function for withdrawing all native coins from the contract.
     * @param _to address of the coins receiver.
     */
    function claimNativeCoins(address _to) internal virtual {
        uint256 value = address(this).balance;
        AddressHelper.safeSendValue(payable(_to), value);
    }

    /**
     * @dev Internal function for withdrawing all tokens of some particular ERC20 contract from this contract.
     * @param _token address of the claimed ERC20 token.
     * @param _to address of the tokens receiver.
     */
    function claimErc20Tokens(address _token, address _to) internal virtual {
        IERC20 token = IERC20(_token);
        uint256 balance = token.balanceOf(address(this));
        token.safeTransfer(_to, balance);
    }
}

File 17 of 18 : OwnableModule.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

import "@openzeppelin/contracts/utils/Address.sol";

/**
 * @title OwnableModule
 * @dev Common functionality for multi-token extension non-upgradeable module.
 */
contract OwnableModule {
    address public owner;

    /**
     * @dev Initializes this contract.
     * @param _owner address of the owner that is allowed to perform additional actions on the particular module.
     */
    constructor(address _owner) {
        owner = _owner;
    }

    /**
     * @dev Throws if sender is not the owner of this contract.
     */
    modifier onlyOwner {
        require(msg.sender == owner);
        _;
    }

    /**
     * @dev Changes the owner of this contract.
     * @param _newOwner address of the new owner.
     */
    function transferOwnership(address _newOwner) external onlyOwner {
        owner = _newOwner;
    }
}

File 18 of 18 : Sacrifice.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.24;

contract Sacrifice {
    constructor(address payable _recipient) payable {
        selfdestruct(_recipient);
    }
}

Settings
{
  "evmVersion": "paris",
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IOmnibridge","name":"_bridge","type":"address"},{"internalType":"contract IWETH","name":"_wNative","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"bool","name":"_EIP1559_ENABLED","type":"bool"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[],"name":"InvalidValue","type":"error"},{"inputs":[],"name":"NotPayable","type":"error"},{"inputs":[],"name":"ReentrancyGuard","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"EIP1559_ENABLED","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RUNNER_SLOT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WNative","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"excludePriority","type":"bool"}],"name":"baseFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bridge","outputs":[{"internalType":"contract IOmnibridge","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_to","type":"address"}],"name":"claimTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"toNative","type":"bool"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"runner","type":"uint256"},{"components":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"settings","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"internalType":"struct TokenOmnibridgeRouter.FeeDirector","name":"feeDirector","type":"tuple"}],"name":"feeInfo","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isValidator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"onTokenBridged","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"relayTokensAndCall","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"runner","type":"address"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"bytes","name":"_signatures","type":"bytes"}],"name":"safeExecuteSignaturesWithAutoGasLimit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_validator","type":"address"},{"internalType":"bool","name":"_isValidator","type":"bool"}],"name":"setValidatorStatus","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_validatorsFilter","type":"address"}],"name":"setValidatorsFilter","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validatorsFilter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"wrapAndRelayTokens","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60e06040523480156200001157600080fd5b5060405162002c2738038062002c278339818101604052810190620000379190620002fa565b81806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550508373ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff16815250508273ffffffffffffffffffffffffffffffffffffffff1663095ea7b3857fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff6040518363ffffffff1660e01b81526004016200013e92919062000398565b600060405180830381600087803b1580156200015957600080fd5b505af11580156200016e573d6000803e3d6000fd5b5050505030600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080151560808115158152505050505050620003c5565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620001fb82620001ce565b9050919050565b60006200020f82620001ee565b9050919050565b620002218162000202565b81146200022d57600080fd5b50565b600081519050620002418162000216565b92915050565b60006200025482620001ee565b9050919050565b620002668162000247565b81146200027257600080fd5b50565b60008151905062000286816200025b565b92915050565b6200029781620001ee565b8114620002a357600080fd5b50565b600081519050620002b7816200028c565b92915050565b60008115159050919050565b620002d481620002bd565b8114620002e057600080fd5b50565b600081519050620002f481620002c9565b92915050565b60008060008060808587031215620003175762000316620001c9565b5b6000620003278782880162000230565b94505060206200033a8782880162000275565b93505060406200034d87828801620002a6565b92505060606200036087828801620002e3565b91505092959194509250565b6200037781620001ee565b82525050565b6000819050919050565b62000392816200037d565b82525050565b6000604082019050620003af60008301856200036c565b620003be602083018462000387565b9392505050565b60805160a05160c0516127de620004496000396000818161012f01528181610b5901528181610bb201528181610ca801528181610cec01528181610d4201528181610f6201528181610ff401526110b30152600081816107b101528181610af601528181610e7e0152611077015260008181610ea2015261113201526127de6000f3fe608060405260043610620001275760003560e01c8063aca2490b11620000a3578063f2fde38b116200006d578063f2fde38b146200039b578063f3ec43c714620003c9578063f52cbf0e14620003f9578063facd743b1462000419578063fba9770a146200045d5762000188565b8063aca2490b14620002fb578063db7af854146200031b578063e78cea92146200033b578063ed5a97d3146200036b5762000188565b8063633a8fa911620000f1578063633a8fa9146200021d57806369ffa08a146200024d57806370502107146200027b5780638da5cb5b14620002ab5780639562de5914620002db5762000188565b806301a754ff146200018d578063351bb549146200019957806336768d3e14620001dd5780634309b71414620001fd5762000188565b3662000188577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200018657600080fd5b005b600080fd5b62000197620004a2565b005b348015620001a657600080fd5b50620001c56004803603810190620001bf9190620018e8565b620004bf565b604051620001d4919062001935565b60405180910390f35b620001fb6004803603810190620001f59190620019b7565b620004d3565b005b6200021b600480360381019062000215919062001a57565b620005f1565b005b3480156200022a57600080fd5b5062000235620008c9565b60405162000244919062001b16565b60405180910390f35b3480156200025a57600080fd5b5062000279600480360381019062000273919062001b33565b620008f3565b005b3480156200028857600080fd5b50620002936200095c565b604051620002a2919062001b8b565b60405180910390f35b348015620002b857600080fd5b50620002c362000982565b604051620002d2919062001b8b565b60405180910390f35b620002f96004803603810190620002f3919062001ba8565b620009a6565b005b62000319600480360381019062000313919062001c12565b620009fb565b005b62000339600480360381019062000333919062001de7565b62000aaf565b005b3480156200034857600080fd5b506200035362000e7c565b60405162000362919062001ecd565b60405180910390f35b3480156200037857600080fd5b506200038362000ea0565b60405162000392919062001efb565b60405180910390f35b348015620003a857600080fd5b50620003c76004803603810190620003c19190620019b7565b62000ec4565b005b348015620003d657600080fd5b50620003e162000f60565b604051620003f0919062001f3d565b60405180910390f35b620004176004803603810190620004119190620019b7565b62000f84565b005b3480156200042657600080fd5b506200044560048036038101906200043f9190620019b7565b62000fa2565b60405162000454919062001efb565b60405180910390f35b3480156200046a57600080fd5b5062000489600480360381019062000483919062001f81565b62000fc2565b6040516200049992919062001ff3565b60405180910390f35b620004bd336040518060200160405280600081525062000ff2565b565b6000620004cc826200112e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200052c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663facd743b60006040518263ffffffff1660e01b815260040162000568919062001b8b565b602060405180830381865afa15801562000586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ac919062002037565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516020016200060290620020ca565b6040516020818303038152906040528051906020012060608673ffffffffffffffffffffffffffffffffffffffff16901b5a6bffffffffffffffffffffffff161760028110156200067f576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200068c8362001170565b9050600181600001541115620006ce576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663facd743b896040518263ffffffff1660e01b815260040162000734919062001b8b565b602060405180830381865afa15801562000752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000778919062002037565b620007af576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663cd5965836040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000841919062002131565b73ffffffffffffffffffffffffffffffffffffffff166323caab49888888886040518563ffffffff1660e01b8152600401620008819493929190620021a7565b600060405180830381600087803b1580156200089c57600080fd5b505af1158015620008b1573d6000803e3d6000fd5b50505050600181600001819055505050505050505050565b604051602001620008da90620020ca565b6040516020818303038152906040528051906020012081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200094c57600080fd5b6200095882826200117a565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620009f68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505062000ff2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000a5457600080fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018054111562000aec576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000b4d57600080fd5b601481510362000c5b577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000bb057600080fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040162000c0b919062001935565b600060405180830381600087803b15801562000c2657600080fd5b505af115801562000c3b573d6000803e3d6000fd5b5050505062000c5562000c4e826200120d565b836200121b565b62000e70565b60008180602001905181019062000c7391906200229e565b90506000600160ff60fe8460200151901b901c14801562000cdf57508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16145b905080801562000d3a57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1562000dd0577f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d856040518263ffffffff1660e01b815260040162000d9b919062001935565b600060405180830381600087803b15801562000db657600080fd5b505af115801562000dcb573d6000803e3d6000fd5b505050505b600062000e0360405160200162000de790620020ca565b6040516020818303038152906040528051906020012062001170565b600001549050600080869050600183111562000e305762000e278488858862001296565b80925081935050505b600081111562000e4d5762000e4c8489876000015184620013e2565b5b600082111562000e6a5762000e698489606086901c85620013e2565b5b50505050505b60018081905550505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000f1d57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b62000f9f816040518060200160405280600081525062000ff2565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60008062000fe58686868680360381019062000fdf919062002355565b62001296565b9150915094509492505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663d74054817f00000000000000000000000000000000000000000000000000000000000000008434856040518563ffffffff1660e01b8152600401620010f69493929190620023ff565b600060405180830381600087803b1580156200111157600080fd5b505af115801562001126573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000080156200115b5750815b62001167573a62001169565b485b9050919050565b6000819050919050565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620011b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620011fb57620011f582620014cc565b62001208565b620012078383620014e1565b5b505050565b600060148201519050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506200129257808260405162001265906200188a565b62001271919062002478565b6040518091039082f09050801580156200128f573d6000803e3d6000fd5b50505b5050565b600080600160ff808560200151901b901c03620012ba5782604001519150620013b6565b600160ff60fc8560200151901b901c03620012fe57670de0b6b3a7640000836060015186620012ea9190620024c4565b620012f691906200253e565b9150620013b5565b60005a856bffffffffffffffffffffffff166200131c919062002576565b905060006200133a600160ff60fd8860200151901b901c146200112e565b9050670de0b6b3a76400008186606001518a6200135b57620186a06200135f565b61c3505b62ffffff1685620013719190620025b1565b6200137d9190620024c4565b620013899190620024c4565b6200139591906200253e565b935084604001518411620013aa5783620013b0565b84604001515b935050505b5b848211620013c55781620013c7565b845b91508185620013d7919062002576565b905094509492505050565b8315620014985760008273ffffffffffffffffffffffffffffffffffffffff1682604051620014119062002621565b60006040518083038185875af1925050503d806000811462001450576040519150601f19603f3d011682016040523d82523d6000602084013e62001455565b606091505b505090508062001491576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620014c6565b620014c582828573ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b5b50505050565b6000479050620014dd82826200121b565b5050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162001523919062001b8b565b602060405180830381865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002638565b90506200159683828473ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b50505050565b6200161a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401620015d29291906200266a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200161f565b505050565b60006200164c828473ffffffffffffffffffffffffffffffffffffffff16620016be90919063ffffffff16565b905060008151141580156200167457508080602001905181019062001672919062002037565b155b15620016b957826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401620016b0919062001b8b565b60405180910390fd5b505050565b6060620016ce83836000620016d6565b905092915050565b6060814710156200172057306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040162001717919062001b8b565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516200174b9190620026ce565b60006040518083038185875af1925050503d80600081146200178a576040519150601f19603f3d011682016040523d82523d6000602084013e6200178f565b606091505b5091509150620017a1868383620017ac565b925050509392505050565b606082620017c557620017bf8262001844565b6200183c565b60008251148015620017ee575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156200183357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016200182a919062001b8b565b60405180910390fd5b8190506200183d565b5b9392505050565b600081511115620018585780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c180620026e883390190565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b620018c281620018ab565b8114620018ce57600080fd5b50565b600081359050620018e281620018b7565b92915050565b600060208284031215620019015762001900620018a1565b5b60006200191184828501620018d1565b91505092915050565b6000819050919050565b6200192f816200191a565b82525050565b60006020820190506200194c600083018462001924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200197f8262001952565b9050919050565b620019918162001972565b81146200199d57600080fd5b50565b600081359050620019b18162001986565b92915050565b600060208284031215620019d057620019cf620018a1565b5b6000620019e084828501620019a0565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001a115762001a10620019e9565b5b8235905067ffffffffffffffff81111562001a315762001a30620019ee565b5b60208301915083600182028301111562001a505762001a4f620019f3565b5b9250929050565b60008060008060006060868803121562001a765762001a75620018a1565b5b600062001a8688828901620019a0565b955050602086013567ffffffffffffffff81111562001aaa5762001aa9620018a6565b5b62001ab888828901620019f8565b9450945050604086013567ffffffffffffffff81111562001ade5762001add620018a6565b5b62001aec88828901620019f8565b92509250509295509295909350565b6000819050919050565b62001b108162001afb565b82525050565b600060208201905062001b2d600083018462001b05565b92915050565b6000806040838503121562001b4d5762001b4c620018a1565b5b600062001b5d85828601620019a0565b925050602062001b7085828601620019a0565b9150509250929050565b62001b858162001972565b82525050565b600060208201905062001ba2600083018462001b7a565b92915050565b60008060006040848603121562001bc45762001bc3620018a1565b5b600062001bd486828701620019a0565b935050602084013567ffffffffffffffff81111562001bf85762001bf7620018a6565b5b62001c0686828701620019f8565b92509250509250925092565b6000806040838503121562001c2c5762001c2b620018a1565b5b600062001c3c85828601620019a0565b925050602062001c4f85828601620018d1565b9150509250929050565b62001c64816200191a565b811462001c7057600080fd5b50565b60008135905062001c848162001c59565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001cda8262001c8f565b810181811067ffffffffffffffff8211171562001cfc5762001cfb62001ca0565b5b80604052505050565b600062001d1162001897565b905062001d1f828262001ccf565b919050565b600067ffffffffffffffff82111562001d425762001d4162001ca0565b5b62001d4d8262001c8f565b9050602081019050919050565b82818337600083830152505050565b600062001d8062001d7a8462001d24565b62001d05565b90508281526020810184848401111562001d9f5762001d9e62001c8a565b5b62001dac84828562001d5a565b509392505050565b600082601f83011262001dcc5762001dcb620019e9565b5b813562001dde84826020860162001d69565b91505092915050565b60008060006060848603121562001e035762001e02620018a1565b5b600062001e1386828701620019a0565b935050602062001e268682870162001c73565b925050604084013567ffffffffffffffff81111562001e4a5762001e49620018a6565b5b62001e588682870162001db4565b9150509250925092565b6000819050919050565b600062001e8d62001e8762001e818462001952565b62001e62565b62001952565b9050919050565b600062001ea18262001e6c565b9050919050565b600062001eb58262001e94565b9050919050565b62001ec78162001ea8565b82525050565b600060208201905062001ee4600083018462001ebc565b92915050565b62001ef581620018ab565b82525050565b600060208201905062001f12600083018462001eea565b92915050565b600062001f258262001e94565b9050919050565b62001f378162001f18565b82525050565b600060208201905062001f54600083018462001f2c565b92915050565b600080fd5b60006080828403121562001f785762001f7762001f5a565b5b81905092915050565b60008060008060e0858703121562001f9e5762001f9d620018a1565b5b600062001fae87828801620018d1565b945050602062001fc18782880162001c73565b935050604062001fd48782880162001c73565b925050606062001fe78782880162001f5f565b91505092959194509250565b60006040820190506200200a600083018562001924565b62002019602083018462001924565b9392505050565b6000815190506200203181620018b7565b92915050565b60006020828403121562002050576200204f620018a1565b5b6000620020608482850162002020565b91505092915050565b600082825260208201905092915050565b7f6f6d6e69627269646765726f757465722e72756e6e6572000000000000000000600082015250565b6000620020b260178362002069565b9150620020bf826200207a565b602082019050919050565b60006020820190508181036000830152620020e581620020a3565b9050919050565b6000620020f98262001972565b9050919050565b6200210b81620020ec565b81146200211757600080fd5b50565b6000815190506200212b8162002100565b92915050565b6000602082840312156200214a5762002149620018a1565b5b60006200215a848285016200211a565b91505092915050565b600082825260208201905092915050565b600062002182838562002163565b93506200219183858462001d5a565b6200219c8362001c8f565b840190509392505050565b60006040820190508181036000830152620021c481868862002174565b90508181036020830152620021db81848662002174565b905095945050505050565b600080fd5b600081519050620021fc8162001986565b92915050565b600081519050620022138162001c59565b92915050565b600060808284031215620022325762002231620021e6565b5b6200223e608062001d05565b905060006200225084828501620021eb565b6000830152506020620022668482850162002202565b60208301525060406200227c8482850162002202565b6040830152506060620022928482850162002202565b60608301525092915050565b600060808284031215620022b757620022b6620018a1565b5b6000620022c78482850162002219565b91505092915050565b600060808284031215620022e957620022e8620021e6565b5b620022f5608062001d05565b905060006200230784828501620019a0565b60008301525060206200231d8482850162001c73565b6020830152506040620023338482850162001c73565b6040830152506060620023498482850162001c73565b60608301525092915050565b6000608082840312156200236e576200236d620018a1565b5b60006200237e84828501620022d0565b91505092915050565b600081519050919050565b60005b83811015620023b257808201518184015260208101905062002395565b60008484015250505050565b6000620023cb8262002387565b620023d7818562002163565b9350620023e981856020860162002392565b620023f48162001c8f565b840191505092915050565b600060808201905062002416600083018762001b7a565b62002425602083018662001b7a565b62002434604083018562001924565b8181036060830152620024488184620023be565b905095945050505050565b6000620024608262001952565b9050919050565b620024728162002453565b82525050565b60006020820190506200248f600083018462002467565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620024d1826200191a565b9150620024de836200191a565b9250828202620024ee816200191a565b9150828204841483151762002508576200250762002495565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200254b826200191a565b915062002558836200191a565b9250826200256b576200256a6200250f565b5b828204905092915050565b600062002583826200191a565b915062002590836200191a565b9250828203905081811115620025ab57620025aa62002495565b5b92915050565b6000620025be826200191a565b9150620025cb836200191a565b9250828201905080821115620025e657620025e562002495565b5b92915050565b600081905092915050565b50565b600062002609600083620025ec565b91506200261682620025f7565b600082019050919050565b60006200262e82620025fa565b9150819050919050565b600060208284031215620026515762002650620018a1565b5b6000620026618482850162002202565b91505092915050565b600060408201905062002681600083018562001b7a565b62002690602083018462001924565b9392505050565b6000620026a48262002387565b620026b08185620025ec565b9350620026c281856020860162002392565b80840191505092915050565b6000620026dc828462002697565b91508190509291505056fe60806040526040516100c13803806100c18339818101604052810190602391906098565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000606a826041565b9050919050565b6078816061565b8114608257600080fd5b50565b6000815190506092816071565b92915050565b60006020828403121560ab5760aa603c565b5b600060b7848285016085565b9150509291505056fea2646970667358221220c7ab15f0d93ff0906e1c5dba2b8d6faaf901111166a33fec2115aca511b62fd464736f6c634300081800330000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b00000000000000000000000000000000000000000000000000000000000000001

Deployed Bytecode

0x608060405260043610620001275760003560e01c8063aca2490b11620000a3578063f2fde38b116200006d578063f2fde38b146200039b578063f3ec43c714620003c9578063f52cbf0e14620003f9578063facd743b1462000419578063fba9770a146200045d5762000188565b8063aca2490b14620002fb578063db7af854146200031b578063e78cea92146200033b578063ed5a97d3146200036b5762000188565b8063633a8fa911620000f1578063633a8fa9146200021d57806369ffa08a146200024d57806370502107146200027b5780638da5cb5b14620002ab5780639562de5914620002db5762000188565b806301a754ff146200018d578063351bb549146200019957806336768d3e14620001dd5780634309b71414620001fd5762000188565b3662000188577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200018657600080fd5b005b600080fd5b62000197620004a2565b005b348015620001a657600080fd5b50620001c56004803603810190620001bf9190620018e8565b620004bf565b604051620001d4919062001935565b60405180910390f35b620001fb6004803603810190620001f59190620019b7565b620004d3565b005b6200021b600480360381019062000215919062001a57565b620005f1565b005b3480156200022a57600080fd5b5062000235620008c9565b60405162000244919062001b16565b60405180910390f35b3480156200025a57600080fd5b5062000279600480360381019062000273919062001b33565b620008f3565b005b3480156200028857600080fd5b50620002936200095c565b604051620002a2919062001b8b565b60405180910390f35b348015620002b857600080fd5b50620002c362000982565b604051620002d2919062001b8b565b60405180910390f35b620002f96004803603810190620002f3919062001ba8565b620009a6565b005b62000319600480360381019062000313919062001c12565b620009fb565b005b62000339600480360381019062000333919062001de7565b62000aaf565b005b3480156200034857600080fd5b506200035362000e7c565b60405162000362919062001ecd565b60405180910390f35b3480156200037857600080fd5b506200038362000ea0565b60405162000392919062001efb565b60405180910390f35b348015620003a857600080fd5b50620003c76004803603810190620003c19190620019b7565b62000ec4565b005b348015620003d657600080fd5b50620003e162000f60565b604051620003f0919062001f3d565b60405180910390f35b620004176004803603810190620004119190620019b7565b62000f84565b005b3480156200042657600080fd5b506200044560048036038101906200043f9190620019b7565b62000fa2565b60405162000454919062001efb565b60405180910390f35b3480156200046a57600080fd5b5062000489600480360381019062000483919062001f81565b62000fc2565b6040516200049992919062001ff3565b60405180910390f35b620004bd336040518060200160405280600081525062000ff2565b565b6000620004cc826200112e565b9050919050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200052c57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff1663facd743b60006040518263ffffffff1660e01b815260040162000568919062001b8b565b602060405180830381865afa15801562000586573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620005ac919062002037565b5080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6040516020016200060290620020ca565b6040516020818303038152906040528051906020012060608673ffffffffffffffffffffffffffffffffffffffff16901b5a6bffffffffffffffffffffffff161760028110156200067f576040517faa7feadc00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006200068c8362001170565b9050600181600001541115620006ce576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818160000181905550600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663facd743b896040518263ffffffff1660e01b815260040162000734919062001b8b565b602060405180830381865afa15801562000752573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000778919062002037565b620007af576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff1663cd5965836040518163ffffffff1660e01b8152600401602060405180830381865afa1580156200081b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062000841919062002131565b73ffffffffffffffffffffffffffffffffffffffff166323caab49888888886040518563ffffffff1660e01b8152600401620008819493929190620021a7565b600060405180830381600087803b1580156200089c57600080fd5b505af1158015620008b1573d6000803e3d6000fd5b50505050600181600001819055505050505050505050565b604051602001620008da90620020ca565b6040516020818303038152906040528051906020012081565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200094c57600080fd5b6200095882826200117a565b5050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b620009f68383838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505062000ff2565b505050565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000a5457600080fd5b80600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60018054111562000aec576040517f8beb9d1600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60026001819055507f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000b4d57600080fd5b601481510362000c5b577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000bb057600080fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d836040518263ffffffff1660e01b815260040162000c0b919062001935565b600060405180830381600087803b15801562000c2657600080fd5b505af115801562000c3b573d6000803e3d6000fd5b5050505062000c5562000c4e826200120d565b836200121b565b62000e70565b60008180602001905181019062000c7391906200229e565b90506000600160ff60fe8460200151901b901c14801562000cdf57508473ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16145b905080801562000d3a57507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16145b1562000dd0577f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff16632e1a7d4d856040518263ffffffff1660e01b815260040162000d9b919062001935565b600060405180830381600087803b15801562000db657600080fd5b505af115801562000dcb573d6000803e3d6000fd5b505050505b600062000e0360405160200162000de790620020ca565b6040516020818303038152906040528051906020012062001170565b600001549050600080869050600183111562000e305762000e278488858862001296565b80925081935050505b600081111562000e4d5762000e4c8489876000015184620013e2565b5b600082111562000e6a5762000e698489606086901c85620013e2565b5b50505050505b60018081905550505050565b7f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d81565b7f000000000000000000000000000000000000000000000000000000000000000181565b60008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161462000f1d57600080fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b62000f9f816040518060200160405280600081525062000ff2565b50565b60036020528060005260406000206000915054906101000a900460ff1681565b60008062000fe58686868680360381019062000fdf919062002355565b62001296565b9150915094509492505050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc273ffffffffffffffffffffffffffffffffffffffff1663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b1580156200105b57600080fd5b505af115801562001070573d6000803e3d6000fd5b50505050507f0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d73ffffffffffffffffffffffffffffffffffffffff1663d74054817f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28434856040518563ffffffff1660e01b8152600401620010f69493929190620023ff565b600060405180830381600087803b1580156200111157600080fd5b505af115801562001126573d6000803e3d6000fd5b505050505050565b60007f000000000000000000000000000000000000000000000000000000000000000180156200115b5750815b62001167573a62001169565b485b9050919050565b6000819050919050565b80600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603620011b557600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603620011fb57620011f582620014cc565b62001208565b620012078383620014e1565b5b505050565b600060148201519050919050565b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050506200129257808260405162001265906200188a565b62001271919062002478565b6040518091039082f09050801580156200128f573d6000803e3d6000fd5b50505b5050565b600080600160ff808560200151901b901c03620012ba5782604001519150620013b6565b600160ff60fc8560200151901b901c03620012fe57670de0b6b3a7640000836060015186620012ea9190620024c4565b620012f691906200253e565b9150620013b5565b60005a856bffffffffffffffffffffffff166200131c919062002576565b905060006200133a600160ff60fd8860200151901b901c146200112e565b9050670de0b6b3a76400008186606001518a6200135b57620186a06200135f565b61c3505b62ffffff1685620013719190620025b1565b6200137d9190620024c4565b620013899190620024c4565b6200139591906200253e565b935084604001518411620013aa5783620013b0565b84604001515b935050505b5b848211620013c55781620013c7565b845b91508185620013d7919062002576565b905094509492505050565b8315620014985760008273ffffffffffffffffffffffffffffffffffffffff1682604051620014119062002621565b60006040518083038185875af1925050503d806000811462001450576040519150601f19603f3d011682016040523d82523d6000602084013e62001455565b606091505b505090508062001491576040517f1574f9f300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50620014c6565b620014c582828573ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b5b50505050565b6000479050620014dd82826200121b565b5050565b600082905060008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b815260040162001523919062001b8b565b602060405180830381865afa15801562001541573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019062001567919062002638565b90506200159683828473ffffffffffffffffffffffffffffffffffffffff166200159c9092919063ffffffff16565b50505050565b6200161a838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401620015d29291906200266a565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200161f565b505050565b60006200164c828473ffffffffffffffffffffffffffffffffffffffff16620016be90919063ffffffff16565b905060008151141580156200167457508080602001905181019062001672919062002037565b155b15620016b957826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401620016b0919062001b8b565b60405180910390fd5b505050565b6060620016ce83836000620016d6565b905092915050565b6060814710156200172057306040517fcd78605900000000000000000000000000000000000000000000000000000000815260040162001717919062001b8b565b60405180910390fd5b6000808573ffffffffffffffffffffffffffffffffffffffff1684866040516200174b9190620026ce565b60006040518083038185875af1925050503d80600081146200178a576040519150601f19603f3d011682016040523d82523d6000602084013e6200178f565b606091505b5091509150620017a1868383620017ac565b925050509392505050565b606082620017c557620017bf8262001844565b6200183c565b60008251148015620017ee575060008473ffffffffffffffffffffffffffffffffffffffff163b145b156200183357836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016200182a919062001b8b565b60405180910390fd5b8190506200183d565b5b9392505050565b600081511115620018585780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60c180620026e883390190565b6000604051905090565b600080fd5b600080fd5b60008115159050919050565b620018c281620018ab565b8114620018ce57600080fd5b50565b600081359050620018e281620018b7565b92915050565b600060208284031215620019015762001900620018a1565b5b60006200191184828501620018d1565b91505092915050565b6000819050919050565b6200192f816200191a565b82525050565b60006020820190506200194c600083018462001924565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200197f8262001952565b9050919050565b620019918162001972565b81146200199d57600080fd5b50565b600081359050620019b18162001986565b92915050565b600060208284031215620019d057620019cf620018a1565b5b6000620019e084828501620019a0565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011262001a115762001a10620019e9565b5b8235905067ffffffffffffffff81111562001a315762001a30620019ee565b5b60208301915083600182028301111562001a505762001a4f620019f3565b5b9250929050565b60008060008060006060868803121562001a765762001a75620018a1565b5b600062001a8688828901620019a0565b955050602086013567ffffffffffffffff81111562001aaa5762001aa9620018a6565b5b62001ab888828901620019f8565b9450945050604086013567ffffffffffffffff81111562001ade5762001add620018a6565b5b62001aec88828901620019f8565b92509250509295509295909350565b6000819050919050565b62001b108162001afb565b82525050565b600060208201905062001b2d600083018462001b05565b92915050565b6000806040838503121562001b4d5762001b4c620018a1565b5b600062001b5d85828601620019a0565b925050602062001b7085828601620019a0565b9150509250929050565b62001b858162001972565b82525050565b600060208201905062001ba2600083018462001b7a565b92915050565b60008060006040848603121562001bc45762001bc3620018a1565b5b600062001bd486828701620019a0565b935050602084013567ffffffffffffffff81111562001bf85762001bf7620018a6565b5b62001c0686828701620019f8565b92509250509250925092565b6000806040838503121562001c2c5762001c2b620018a1565b5b600062001c3c85828601620019a0565b925050602062001c4f85828601620018d1565b9150509250929050565b62001c64816200191a565b811462001c7057600080fd5b50565b60008135905062001c848162001c59565b92915050565b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62001cda8262001c8f565b810181811067ffffffffffffffff8211171562001cfc5762001cfb62001ca0565b5b80604052505050565b600062001d1162001897565b905062001d1f828262001ccf565b919050565b600067ffffffffffffffff82111562001d425762001d4162001ca0565b5b62001d4d8262001c8f565b9050602081019050919050565b82818337600083830152505050565b600062001d8062001d7a8462001d24565b62001d05565b90508281526020810184848401111562001d9f5762001d9e62001c8a565b5b62001dac84828562001d5a565b509392505050565b600082601f83011262001dcc5762001dcb620019e9565b5b813562001dde84826020860162001d69565b91505092915050565b60008060006060848603121562001e035762001e02620018a1565b5b600062001e1386828701620019a0565b935050602062001e268682870162001c73565b925050604084013567ffffffffffffffff81111562001e4a5762001e49620018a6565b5b62001e588682870162001db4565b9150509250925092565b6000819050919050565b600062001e8d62001e8762001e818462001952565b62001e62565b62001952565b9050919050565b600062001ea18262001e6c565b9050919050565b600062001eb58262001e94565b9050919050565b62001ec78162001ea8565b82525050565b600060208201905062001ee4600083018462001ebc565b92915050565b62001ef581620018ab565b82525050565b600060208201905062001f12600083018462001eea565b92915050565b600062001f258262001e94565b9050919050565b62001f378162001f18565b82525050565b600060208201905062001f54600083018462001f2c565b92915050565b600080fd5b60006080828403121562001f785762001f7762001f5a565b5b81905092915050565b60008060008060e0858703121562001f9e5762001f9d620018a1565b5b600062001fae87828801620018d1565b945050602062001fc18782880162001c73565b935050604062001fd48782880162001c73565b925050606062001fe78782880162001f5f565b91505092959194509250565b60006040820190506200200a600083018562001924565b62002019602083018462001924565b9392505050565b6000815190506200203181620018b7565b92915050565b60006020828403121562002050576200204f620018a1565b5b6000620020608482850162002020565b91505092915050565b600082825260208201905092915050565b7f6f6d6e69627269646765726f757465722e72756e6e6572000000000000000000600082015250565b6000620020b260178362002069565b9150620020bf826200207a565b602082019050919050565b60006020820190508181036000830152620020e581620020a3565b9050919050565b6000620020f98262001972565b9050919050565b6200210b81620020ec565b81146200211757600080fd5b50565b6000815190506200212b8162002100565b92915050565b6000602082840312156200214a5762002149620018a1565b5b60006200215a848285016200211a565b91505092915050565b600082825260208201905092915050565b600062002182838562002163565b93506200219183858462001d5a565b6200219c8362001c8f565b840190509392505050565b60006040820190508181036000830152620021c481868862002174565b90508181036020830152620021db81848662002174565b905095945050505050565b600080fd5b600081519050620021fc8162001986565b92915050565b600081519050620022138162001c59565b92915050565b600060808284031215620022325762002231620021e6565b5b6200223e608062001d05565b905060006200225084828501620021eb565b6000830152506020620022668482850162002202565b60208301525060406200227c8482850162002202565b6040830152506060620022928482850162002202565b60608301525092915050565b600060808284031215620022b757620022b6620018a1565b5b6000620022c78482850162002219565b91505092915050565b600060808284031215620022e957620022e8620021e6565b5b620022f5608062001d05565b905060006200230784828501620019a0565b60008301525060206200231d8482850162001c73565b6020830152506040620023338482850162001c73565b6040830152506060620023498482850162001c73565b60608301525092915050565b6000608082840312156200236e576200236d620018a1565b5b60006200237e84828501620022d0565b91505092915050565b600081519050919050565b60005b83811015620023b257808201518184015260208101905062002395565b60008484015250505050565b6000620023cb8262002387565b620023d7818562002163565b9350620023e981856020860162002392565b620023f48162001c8f565b840191505092915050565b600060808201905062002416600083018762001b7a565b62002425602083018662001b7a565b62002434604083018562001924565b8181036060830152620024488184620023be565b905095945050505050565b6000620024608262001952565b9050919050565b620024728162002453565b82525050565b60006020820190506200248f600083018462002467565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620024d1826200191a565b9150620024de836200191a565b9250828202620024ee816200191a565b9150828204841483151762002508576200250762002495565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006200254b826200191a565b915062002558836200191a565b9250826200256b576200256a6200250f565b5b828204905092915050565b600062002583826200191a565b915062002590836200191a565b9250828203905081811115620025ab57620025aa62002495565b5b92915050565b6000620025be826200191a565b9150620025cb836200191a565b9250828201905080821115620025e657620025e562002495565b5b92915050565b600081905092915050565b50565b600062002609600083620025ec565b91506200261682620025f7565b600082019050919050565b60006200262e82620025fa565b9150819050919050565b600060208284031215620026515762002650620018a1565b5b6000620026618482850162002202565b91505092915050565b600060408201905062002681600083018562001b7a565b62002690602083018462001924565b9392505050565b6000620026a48262002387565b620026b08185620025ec565b9350620026c281856020860162002392565b80840191505092915050565b6000620026dc828462002697565b91508190509291505056fe60806040526040516100c13803806100c18339818101604052810190602391906098565b8073ffffffffffffffffffffffffffffffffffffffff16ff5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000606a826041565b9050919050565b6078816061565b8114608257600080fd5b50565b6000815190506092816071565b92915050565b60006020828403121560ab5760aa603c565b5b600060b7848285016085565b9150509291505056fea2646970667358221220c7ab15f0d93ff0906e1c5dba2b8d6faaf901111166a33fec2115aca511b62fd464736f6c63430008180033

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

0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b00000000000000000000000000000000000000000000000000000000000000001

-----Decoded View---------------
Arg [0] : _bridge (address): 0x1715a3E4A142d8b698131108995174F37aEBA10D
Arg [1] : _wNative (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [2] : _owner (address): 0xAF2ce0189f46f5663715b0b9ED2a10eA924AB9B0
Arg [3] : _EIP1559_ENABLED (bool): True

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000001715a3e4a142d8b698131108995174f37aeba10d
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [2] : 000000000000000000000000af2ce0189f46f5663715b0b9ed2a10ea924ab9b0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001


Block Transaction Difficulty 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
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.