ETH Price: $2,551.05 (+0.29%)

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...207971752024-09-21 6:30:353 hrs ago1726900235IN
0x0560e139...A83F37C6E
0 ETH0.002085677.17315003
Safe Execute Sig...207960312024-09-21 2:39:477 hrs ago1726886387IN
0x0560e139...A83F37C6E
0 ETH0.0034627512.1009749
Safe Execute Sig...207925072024-09-20 14:50:2318 hrs ago1726843823IN
0x0560e139...A83F37C6E
0 ETH0.006514322.40793688
Safe Execute Sig...207904642024-09-20 7:59:4725 hrs ago1726819187IN
0x0560e139...A83F37C6E
0 ETH0.0046201715.85369658
Safe Execute Sig...207808892024-09-18 23:54:352 days ago1726703675IN
0x0560e139...A83F37C6E
0 ETH0.001272024.37494693
Safe Execute Sig...207804652024-09-18 22:29:112 days ago1726698551IN
0x0560e139...A83F37C6E
0 ETH0.002690329.25267523
Safe Execute Sig...207801222024-09-18 21:19:472 days ago1726694387IN
0x0560e139...A83F37C6E
0 ETH0.0033794611.62354859
Safe Execute Sig...207787702024-09-18 16:47:592 days ago1726678079IN
0x0560e139...A83F37C6E
0 ETH0.0055895419.18122165
Safe Execute Sig...207787442024-09-18 16:42:472 days ago1726677767IN
0x0560e139...A83F37C6E
0 ETH0.0046512915.96149152
Safe Execute Sig...207787442024-09-18 16:42:472 days ago1726677767IN
0x0560e139...A83F37C6E
0 ETH0.0046512915.96149152
Safe Execute Sig...207784992024-09-18 15:53:352 days ago1726674815IN
0x0560e139...A83F37C6E
0 ETH0.0045944514.75247813
Safe Execute Sig...207784772024-09-18 15:49:112 days ago1726674551IN
0x0560e139...A83F37C6E
0 ETH0.0051662717.72758496
Safe Execute Sig...207783172024-09-18 15:17:112 days ago1726672631IN
0x0560e139...A83F37C6E
0 ETH0.0038749313.29647084
Safe Execute Sig...207782912024-09-18 15:11:472 days ago1726672307IN
0x0560e139...A83F37C6E
0 ETH0.0037346212.81754549
Safe Execute Sig...207782382024-09-18 15:01:112 days ago1726671671IN
0x0560e139...A83F37C6E
0 ETH0.0041612214.28025622
Safe Execute Sig...207780272024-09-18 14:18:472 days ago1726669127IN
0x0560e139...A83F37C6E
0 ETH0.002604988.93932061
Safe Execute Sig...207779192024-09-18 13:57:112 days ago1726667831IN
0x0560e139...A83F37C6E
0 ETH0.00250138.58299623
Safe Execute Sig...207775742024-09-18 12:48:112 days ago1726663691IN
0x0560e139...A83F37C6E
0 ETH0.00140614.82476335
Safe Execute Sig...207775742024-09-18 12:48:112 days ago1726663691IN
0x0560e139...A83F37C6E
0 ETH0.001405964.82476335
Safe Execute Sig...207775732024-09-18 12:47:592 days ago1726663679IN
0x0560e139...A83F37C6E
0 ETH0.001258124.31713766
Safe Execute Sig...207774922024-09-18 12:31:472 days ago1726662707IN
0x0560e139...A83F37C6E
0 ETH0.001776495.716773
Safe Execute Sig...207753762024-09-18 5:25:113 days ago1726637111IN
0x0560e139...A83F37C6E
0 ETH0.001193663.84123002
Safe Execute Sig...207671442024-09-17 1:46:234 days ago1726537583IN
0x0560e139...A83F37C6E
0 ETH0.000596132.05024175
Safe Execute Sig...207660842024-09-16 22:13:114 days ago1726524791IN
0x0560e139...A83F37C6E
0 ETH0.001041983.58398977
Safe Execute Sig...207639082024-09-16 14:55:474 days ago1726498547IN
0x0560e139...A83F37C6E
0 ETH0.0038174813.10102727
View all transactions

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block From To
207971752024-09-21 6:30:353 hrs ago1726900235
0x0560e139...A83F37C6E
0.0027153 ETH
207971752024-09-21 6:30:353 hrs ago1726900235
0x0560e139...A83F37C6E
0.02443777 ETH
207971752024-09-21 6:30:353 hrs ago1726900235
0x0560e139...A83F37C6E
0.02715308 ETH
207925072024-09-20 14:50:2318 hrs ago1726843823
0x0560e139...A83F37C6E
0.0267188 ETH
207925072024-09-20 14:50:2318 hrs ago1726843823
0x0560e139...A83F37C6E
0.25044719 ETH
207925072024-09-20 14:50:2318 hrs ago1726843823
0x0560e139...A83F37C6E
0.277166 ETH
207904642024-09-20 7:59:4725 hrs ago1726819187
0x0560e139...A83F37C6E
0.00629886 ETH
207904642024-09-20 7:59:4725 hrs ago1726819187
0x0560e139...A83F37C6E
0.13895268 ETH
207904642024-09-20 7:59:4725 hrs ago1726819187
0x0560e139...A83F37C6E
0.14525155 ETH
207808892024-09-18 23:54:352 days ago1726703675
0x0560e139...A83F37C6E
0.00498156 ETH
207808892024-09-18 23:54:352 days ago1726703675
0x0560e139...A83F37C6E
0.09606439 ETH
207808892024-09-18 23:54:352 days ago1726703675
0x0560e139...A83F37C6E
0.10104596 ETH
207804652024-09-18 22:29:112 days ago1726698551
0x0560e139...A83F37C6E
0.01206481 ETH
207804652024-09-18 22:29:112 days ago1726698551
0x0560e139...A83F37C6E
0.28077039 ETH
207804652024-09-18 22:29:112 days ago1726698551
0x0560e139...A83F37C6E
0.2928352 ETH
207801222024-09-18 21:19:472 days ago1726694387
0x0560e139...A83F37C6E
0.01835447 ETH
207801222024-09-18 21:19:472 days ago1726694387
0x0560e139...A83F37C6E
0.20796452 ETH
207801222024-09-18 21:19:472 days ago1726694387
0x0560e139...A83F37C6E
0.226319 ETH
207787742024-09-18 16:48:472 days ago1726678127
0x0560e139...A83F37C6E
1.95229923 ETH
207787742024-09-18 16:48:472 days ago1726678127
0x0560e139...A83F37C6E
1.95229923 ETH
207787702024-09-18 16:47:592 days ago1726678079
0x0560e139...A83F37C6E
0.00761827 ETH
207787702024-09-18 16:47:592 days ago1726678079
0x0560e139...A83F37C6E
0.03504948 ETH
207787702024-09-18 16:47:592 days ago1726678079
0x0560e139...A83F37C6E
0.04266776 ETH
207787442024-09-18 16:42:472 days ago1726677767
0x0560e139...A83F37C6E
0.00637106 ETH
207787442024-09-18 16:42:472 days ago1726677767
0x0560e139...A83F37C6E
0.10707242 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.