ETH Price: $3,047.73 (-7.74%)
Gas: 17 Gwei

Contract

0xF380B7DD6c4E81C161762235E9e7bc14a205E5c9
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Value
0x60e06040181212282023-09-12 15:45:47296 days ago1694533547IN
 Create: GmpHelper
0 ETH0.0240919725.28557594

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
GmpHelper

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 5000000 runs

Other Settings:
default evmVersion
File 1 of 5 : gmp-helper.sol
// SPDX-FileCopyrightText: Hadron Labs
// SPDX-License-Identifier: GPL-3.0

pragma solidity 0.8.19;

import { IAxelarGateway } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGateway.sol";
import { IAxelarGasService } from "@axelar-network/axelar-gmp-sdk-solidity/contracts/interfaces/IAxelarGasService.sol";
import { IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import { IERC20Permit } from "@openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol";

interface IWSTETH is IERC20, IERC20Permit {}

/// @title GMP helper which makes it easier to call Lido Satellite on Neutron
/// @author Murad Karammaev
/// @notice Default flow (without a GMP Helper) is to:
///           1. tx approve() on wstETH contract
///           2. tx payNativeGasForContractCallWithToken() on Axelar Gas Service
///           3. tx callContractWithToken() on Axelar gateway
///         This contract simplifies it to:
///           1. tx approve() on wstETH contract
///           2. tx send() on GMP Helper
///         It is also possible to simplify it further if user wallet supports EIP-712 signing:
///           1. tx sendWithPermit() on GMP Helper
contract GmpHelper {
    IAxelarGasService public immutable GAS_SERVICE;
    IAxelarGateway public immutable GATEWAY;
    IWSTETH public immutable WST_ETH;
    // Address of Lido Satellite contract on Neutron, replace it with a real address before deploying
    string public constant LIDO_SATELLITE = "neutron1ug740qrkquxzrk2hh29qrlx3sktkfml3je7juusc2te7xmvsscns0n2wry";
    string public constant DESTINATION_CHAIN = "neutron";
    string public constant WSTETH_SYMBOL = "wstETH";

    /// @notice Construct GMP Helper
    /// @param axelarGateway Address of Axelar Gateway contract
    /// @param axelarGasReceiver Address of Axelar Gas Service contract
    /// @param wstEth Address of Wrapped Liquid Staked Ether contract
    constructor(
        address axelarGateway,
        address axelarGasReceiver,
        address wstEth
    ) {
        GAS_SERVICE = IAxelarGasService(axelarGasReceiver);
        GATEWAY = IAxelarGateway(axelarGateway);
        WST_ETH = IWSTETH(wstEth);
    }

    /// @notice Send `amount` of wstETH to `receiver` on Neutron.
    ///         Requires allowance on wstETH contract.
    ///         Requires gas fee in ETH.
    /// @param receiver Address on Neutron which shall receive canonical wstETH
    /// @param amount Amount of wstETH-wei to send to `receiver`
    /// @param gasRefundAddress Address which receives ETH refunds from Axelar,
    ///        use 0 to default to msg.sender
    function send(
        string calldata receiver,
        uint256 amount,
        address gasRefundAddress
    ) external payable {
        _send(receiver, amount, gasRefundAddress);
    }

    /// @notice Send `amount` of wstETH to `receiver` on Neutron, using EIP-2612 permit.
    ///         Requires gas fee in ETH.
    /// @param receiver Address on Neutron which shall receive canonical wstETH
    /// @param amount Amount of wstETH-wei to send to `receiver`
    /// @param deadline EIP-2612 permit signature deadline
    /// @param v Value `v` of EIP-2612 permit signature
    /// @param r Value `r` of EIP-2612 permit signature
    /// @param s Value `s` of EIP-2612 permit signature
    /// @param gasRefundAddress Address which receives ETH refunds from Axelar,
    ///        use 0 to default to msg.sender
    function sendWithPermit(
        string calldata receiver,
        uint256 amount,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s,
        address gasRefundAddress
    ) external payable {
        WST_ETH.permit(msg.sender, address(this), amount, deadline, v, r, s);
        _send(receiver, amount, gasRefundAddress);
    }

    function _send(
        string calldata receiver,
        uint256 amount,
        address gasRefundAddress
    ) internal {
        // 1. withdraw wstETH from caller and approve it for Axelar Gateway.
        // Gateway will attempt to transfer funds from address(this), hence we
        // are forced to withdraw them from caller account first.
        WST_ETH.transferFrom(msg.sender, address(this), amount);
        WST_ETH.approve(address(GATEWAY), amount);

        // 2. Generate GMP payload
        bytes memory payload = _encodeGmpPayload(receiver);

        // 3. Pay for gas
        GAS_SERVICE.payNativeGasForContractCallWithToken{value: msg.value}(
            address(this),
            DESTINATION_CHAIN,
            LIDO_SATELLITE,
            payload,
            WSTETH_SYMBOL,
            amount,
            gasRefundAddress == address(0) ? msg.sender : gasRefundAddress
        );

        // 4. Make GMP call
        GATEWAY.callContractWithToken(
            DESTINATION_CHAIN,
            LIDO_SATELLITE,
            payload,
            WSTETH_SYMBOL,
            amount
        );
    }

    function _encodeGmpPayload(
        string memory targetReceiver
    ) internal pure returns (bytes memory) {
        require(bytes(targetReceiver).length > 8, "receiver address is too short"); // len("neutron1") == 8
        require(bytes(targetReceiver).length <= 256, "receiver address is too long");

        bytes memory prefix = bytes("neutron1");
        for (uint8 i = 0; i < prefix.length; i++) {
            require(bytes(targetReceiver)[i] == prefix[i], "receiver: incorrect prefix");
        }

        bytes memory argValues = abi.encode(
            targetReceiver
        );

        string[] memory argumentNameArray = new string[](1);
        argumentNameArray[0] = "receiver";

        string[] memory abiTypeArray = new string[](1);
        abiTypeArray[0] = "string";

        bytes memory gmpPayload;
        gmpPayload = abi.encode(
            "mint",
            argumentNameArray,
            abiTypeArray,
            argValues
        );

        return abi.encodePacked(
            bytes4(0x00000001),
            gmpPayload
        );
    }
}

File 2 of 5 : IAxelarGasService.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// This should be owned by the microservice that is paying for gas.
interface IAxelarGasService {
    error NothingReceived();
    error InvalidAddress();
    error NotCollector();
    error InvalidAmounts();

    event GasPaidForContractCall(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event GasPaidForContractCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasPaidForContractCall(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasPaidForContractCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event GasPaidForExpressCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasPaidForExpressCallWithToken(
        address indexed sourceAddress,
        string destinationChain,
        string destinationAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event GasAdded(
        bytes32 indexed txHash,
        uint256 indexed logIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeGasAdded(bytes32 indexed txHash, uint256 indexed logIndex, uint256 gasFeeAmount, address refundAddress);

    event ExpressGasAdded(
        bytes32 indexed txHash,
        uint256 indexed logIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    );

    event NativeExpressGasAdded(
        bytes32 indexed txHash,
        uint256 indexed logIndex,
        uint256 gasFeeAmount,
        address refundAddress
    );

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payGasForContractCall(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payGasForContractCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payNativeGasForContractCall(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        address refundAddress
    ) external payable;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payNativeGasForContractCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address refundAddress
    ) external payable;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payGasForExpressCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    // This is called on the source chain before calling the gateway to execute a remote contract.
    function payNativeGasForExpressCallWithToken(
        address sender,
        string calldata destinationChain,
        string calldata destinationAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount,
        address refundAddress
    ) external payable;

    function addGas(
        bytes32 txHash,
        uint256 txIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    function addNativeGas(
        bytes32 txHash,
        uint256 logIndex,
        address refundAddress
    ) external payable;

    function addExpressGas(
        bytes32 txHash,
        uint256 txIndex,
        address gasToken,
        uint256 gasFeeAmount,
        address refundAddress
    ) external;

    function addNativeExpressGas(
        bytes32 txHash,
        uint256 logIndex,
        address refundAddress
    ) external payable;

    function collectFees(
        address payable receiver,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external;

    function refund(
        address payable receiver,
        address token,
        uint256 amount
    ) external;

    function gasCollector() external returns (address);
}

File 3 of 5 : IAxelarGateway.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

interface IAxelarGateway {
    /**********\
    |* Errors *|
    \**********/

    error NotSelf();
    error NotProxy();
    error InvalidCodeHash();
    error SetupFailed();
    error InvalidAuthModule();
    error InvalidTokenDeployer();
    error InvalidAmount();
    error InvalidChainId();
    error InvalidCommands();
    error TokenDoesNotExist(string symbol);
    error TokenAlreadyExists(string symbol);
    error TokenDeployFailed(string symbol);
    error TokenContractDoesNotExist(address token);
    error BurnFailed(string symbol);
    error MintFailed(string symbol);
    error InvalidSetMintLimitsParams();
    error ExceedMintLimit(string symbol);

    /**********\
    |* Events *|
    \**********/

    event TokenSent(
        address indexed sender,
        string destinationChain,
        string destinationAddress,
        string symbol,
        uint256 amount
    );

    event ContractCall(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload
    );

    event ContractCallWithToken(
        address indexed sender,
        string destinationChain,
        string destinationContractAddress,
        bytes32 indexed payloadHash,
        bytes payload,
        string symbol,
        uint256 amount
    );

    event Executed(bytes32 indexed commandId);

    event TokenDeployed(string symbol, address tokenAddresses);

    event ContractCallApproved(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event ContractCallApprovedWithMint(
        bytes32 indexed commandId,
        string sourceChain,
        string sourceAddress,
        address indexed contractAddress,
        bytes32 indexed payloadHash,
        string symbol,
        uint256 amount,
        bytes32 sourceTxHash,
        uint256 sourceEventIndex
    );

    event TokenMintLimitUpdated(string symbol, uint256 limit);

    event OperatorshipTransferred(bytes newOperatorsData);

    event Upgraded(address indexed implementation);

    /********************\
    |* Public Functions *|
    \********************/

    function sendToken(
        string calldata destinationChain,
        string calldata destinationAddress,
        string calldata symbol,
        uint256 amount
    ) external;

    function callContract(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload
    ) external;

    function callContractWithToken(
        string calldata destinationChain,
        string calldata contractAddress,
        bytes calldata payload,
        string calldata symbol,
        uint256 amount
    ) external;

    function isContractCallApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash
    ) external view returns (bool);

    function isContractCallAndMintApproved(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        address contractAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external view returns (bool);

    function validateContractCall(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash
    ) external returns (bool);

    function validateContractCallAndMint(
        bytes32 commandId,
        string calldata sourceChain,
        string calldata sourceAddress,
        bytes32 payloadHash,
        string calldata symbol,
        uint256 amount
    ) external returns (bool);

    /***********\
    |* Getters *|
    \***********/

    function authModule() external view returns (address);

    function tokenDeployer() external view returns (address);

    function tokenMintLimit(string memory symbol) external view returns (uint256);

    function tokenMintAmount(string memory symbol) external view returns (uint256);

    function allTokensFrozen() external view returns (bool);

    function implementation() external view returns (address);

    function tokenAddresses(string memory symbol) external view returns (address);

    function tokenFrozen(string memory symbol) external view returns (bool);

    function isCommandExecuted(bytes32 commandId) external view returns (bool);

    function adminEpoch() external view returns (uint256);

    function adminThreshold(uint256 epoch) external view returns (uint256);

    function admins(uint256 epoch) external view returns (address[] memory);

    /*******************\
    |* Admin Functions *|
    \*******************/

    function setTokenMintLimits(string[] calldata symbols, uint256[] calldata limits) external;

    function upgrade(
        address newImplementation,
        bytes32 newImplementationCodeHash,
        bytes calldata setupParams
    ) external;

    /**********************\
    |* External Functions *|
    \**********************/

    function setup(bytes calldata params) external;

    function execute(bytes calldata input) external;
}

File 4 of 5 : IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/extensions/IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @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.
 */
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].
     */
    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 5 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.9.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @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 amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Moves `amount` 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 amount) 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 `amount` 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 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` 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 amount) external returns (bool);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"axelarGateway","type":"address"},{"internalType":"address","name":"axelarGasReceiver","type":"address"},{"internalType":"address","name":"wstEth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DESTINATION_CHAIN","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GAS_SERVICE","outputs":[{"internalType":"contract IAxelarGasService","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GATEWAY","outputs":[{"internalType":"contract IAxelarGateway","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO_SATELLITE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WSTETH_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WST_ETH","outputs":[{"internalType":"contract IWSTETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"gasRefundAddress","type":"address"}],"name":"send","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"receiver","type":"string"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"},{"internalType":"address","name":"gasRefundAddress","type":"address"}],"name":"sendWithPermit","outputs":[],"stateMutability":"payable","type":"function"}]

60e060405234801561001057600080fd5b5060405161116038038061116083398101604081905261002f91610068565b6001600160a01b0391821660805291811660a0521660c0526100ab565b80516001600160a01b038116811461006357600080fd5b919050565b60008060006060848603121561007d57600080fd5b6100868461004c565b92506100946020850161004c565b91506100a26040850161004c565b90509250925092565b60805160a05160c05161105d6101036000396000818161015f015281816102ad0152818161036f015261045e01526000818160f10152818161042f015261064d0152600081816101a80152610511015261105d6000f3fe60806040526004361061007b5760003560e01c80638571fdcb1161004e5780638571fdcb14610181578063997f35eb14610196578063c1cab97c146101ca578063d04be5011461021357600080fd5b80630d114ef814610080578063338c5371146100df57806349e102e2146101385780635664cb481461014d575b600080fd5b34801561008c57600080fd5b506100c96040518060400160405280600781526020017f6e657574726f6e0000000000000000000000000000000000000000000000000081525081565b6040516100d69190610bd8565b60405180910390f35b3480156100eb57600080fd5b506101137f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61014b610146366004610c64565b610226565b005b34801561015957600080fd5b506101137f000000000000000000000000000000000000000000000000000000000000000081565b34801561018d57600080fd5b506100c9610238565b3480156101a257600080fd5b506101137f000000000000000000000000000000000000000000000000000000000000000081565b3480156101d657600080fd5b506100c96040518060400160405280600681526020017f777374455448000000000000000000000000000000000000000000000000000081525081565b61014b610221366004610cc1565b610254565b61023284848484610334565b50505050565b604051806080016040528060428152602001610fe66042913981565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561030657600080fd5b505af115801561031a573d6000803e3d6000fd5b5050505061032a88888884610334565b5050505050505050565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390527f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af11580156103cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f19190610d53565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af11580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb9190610d53565b50600061050d85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061077f92505050565b90507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663c62c200234306040518060400160405280600781526020017f6e657574726f6e00000000000000000000000000000000000000000000000000815250604051806080016040528060428152602001610fe66042913960408051808201909152600681527f7773744554480000000000000000000000000000000000000000000000000000602082015287908a73ffffffffffffffffffffffffffffffffffffffff8b16156105f5578a6105f7565b335b6040518963ffffffff1660e01b81526004016106199796959493929190610d75565b6000604051808303818588803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b50505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b54170846040518060400160405280600781526020017f6e657574726f6e00000000000000000000000000000000000000000000000000815250604051806080016040528060428152602001610fe660429139604080518082018252600681527f7773744554480000000000000000000000000000000000000000000000000000602082015290517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261074693929187918a90600401610dfc565b600060405180830381600087803b15801561076057600080fd5b505af1158015610774573d6000803e3d6000fd5b505050505050505050565b606060088251116107f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206164647265737320697320746f6f2073686f727400000060448201526064015b60405180910390fd5b6101008251111561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265636569766572206164647265737320697320746f6f206c6f6e670000000060448201526064016107e8565b60408051808201909152600881527f6e657574726f6e31000000000000000000000000000000000000000000000000602082015260005b81518160ff16101561099857818160ff16815181106108b6576108b6610e5c565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848260ff16815181106108f8576108f8610e5c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f72656365697665723a20696e636f72726563742070726566697800000000000060448201526064016107e8565b8061099081610e8b565b915050610895565b506000836040516020016109ac9190610bd8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526001808452838301909252925060009190816020015b60608152602001906001900390816109ed5790505090506040518060400160405280600881526020017f726563656976657200000000000000000000000000000000000000000000000081525081600081518110610a4d57610a4d610e5c565b6020908102919091010152604080516001808252818301909252600091816020015b6060815260200190600190039081610a6f5790505090506040518060400160405280600681526020017f737472696e67000000000000000000000000000000000000000000000000000081525081600081518110610acf57610acf610e5c565b60200260200101819052506060828285604051602001610af193929190610f26565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290529150610b4f907c0100000000000000000000000000000000000000000000000000000000908390602001610f9d565b60405160208183030381529060405295505050505050919050565b60005b83811015610b85578181015183820152602001610b6d565b50506000910152565b60008151808452610ba6816020860160208601610b6a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610beb6020830184610b8e565b9392505050565b60008083601f840112610c0457600080fd5b50813567ffffffffffffffff811115610c1c57600080fd5b602083019150836020828501011115610c3457600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c5f57600080fd5b919050565b60008060008060608587031215610c7a57600080fd5b843567ffffffffffffffff811115610c9157600080fd5b610c9d87828801610bf2565b90955093505060208501359150610cb660408601610c3b565b905092959194509250565b60008060008060008060008060e0898b031215610cdd57600080fd5b883567ffffffffffffffff811115610cf457600080fd5b610d008b828c01610bf2565b9099509750506020890135955060408901359450606089013560ff81168114610d2857600080fd5b93506080890135925060a08901359150610d4460c08a01610c3b565b90509295985092959890939650565b600060208284031215610d6557600080fd5b81518015158114610beb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808a16835260e06020840152610da560e084018a610b8e565b8381036040850152610db7818a610b8e565b90508381036060850152610dcb8189610b8e565b90508381036080850152610ddf8188610b8e565b60a0850196909652509290921660c0909101525095945050505050565b60a081526000610e0f60a0830188610b8e565b8281036020840152610e218188610b8e565b90508281036040840152610e358187610b8e565b90508281036060840152610e498186610b8e565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821660ff8103610ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60010192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610f19578284038952610f07848351610b8e565b98850198935090840190600101610eef565b5091979650505050505050565b60808152600460808201527f6d696e740000000000000000000000000000000000000000000000000000000060a082015260c060208201526000610f6d60c0830186610ed1565b8281036040840152610f7f8186610ed1565b90508281036060840152610f938185610b8e565b9695505050505050565b7fffffffff000000000000000000000000000000000000000000000000000000008316815260008251610fd7816004850160208701610b6a565b91909101600401939250505056fe6e657574726f6e31756737343071726b7175787a726b326868323971726c7833736b746b666d6c336a65376a7575736332746537786d767373636e73306e32777279a2646970667358221220f57bb0d3cbcd89ece1f04b408d521b161e694e7ed23bc3b894542e2cf712f5ae64736f6c634300081300330000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0

Deployed Bytecode

0x60806040526004361061007b5760003560e01c80638571fdcb1161004e5780638571fdcb14610181578063997f35eb14610196578063c1cab97c146101ca578063d04be5011461021357600080fd5b80630d114ef814610080578063338c5371146100df57806349e102e2146101385780635664cb481461014d575b600080fd5b34801561008c57600080fd5b506100c96040518060400160405280600781526020017f6e657574726f6e0000000000000000000000000000000000000000000000000081525081565b6040516100d69190610bd8565b60405180910390f35b3480156100eb57600080fd5b506101137f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a581565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100d6565b61014b610146366004610c64565b610226565b005b34801561015957600080fd5b506101137f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca081565b34801561018d57600080fd5b506100c9610238565b3480156101a257600080fd5b506101137f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a08271281565b3480156101d657600080fd5b506100c96040518060400160405280600681526020017f777374455448000000000000000000000000000000000000000000000000000081525081565b61014b610221366004610cc1565b610254565b61023284848484610334565b50505050565b604051806080016040528060428152602001610fe66042913981565b6040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018790526064810186905260ff8516608482015260a4810184905260c481018390527f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca073ffffffffffffffffffffffffffffffffffffffff169063d505accf9060e401600060405180830381600087803b15801561030657600080fd5b505af115801561031a573d6000803e3d6000fd5b5050505061032a88888884610334565b5050505050505050565b6040517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018390527f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca073ffffffffffffffffffffffffffffffffffffffff16906323b872dd906064016020604051808303816000875af11580156103cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103f19190610d53565b506040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a581166004830152602482018490527f0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0169063095ea7b3906044016020604051808303816000875af11580156104a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104cb9190610d53565b50600061050d85858080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061077f92505050565b90507f0000000000000000000000002d5d7d31f671f86c782533cc367f14109a08271273ffffffffffffffffffffffffffffffffffffffff1663c62c200234306040518060400160405280600781526020017f6e657574726f6e00000000000000000000000000000000000000000000000000815250604051806080016040528060428152602001610fe66042913960408051808201909152600681527f7773744554480000000000000000000000000000000000000000000000000000602082015287908a73ffffffffffffffffffffffffffffffffffffffff8b16156105f5578a6105f7565b335b6040518963ffffffff1660e01b81526004016106199796959493929190610d75565b6000604051808303818588803b15801561063257600080fd5b505af1158015610646573d6000803e3d6000fd5b50505050507f0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a573ffffffffffffffffffffffffffffffffffffffff1663b54170846040518060400160405280600781526020017f6e657574726f6e00000000000000000000000000000000000000000000000000815250604051806080016040528060428152602001610fe660429139604080518082018252600681527f7773744554480000000000000000000000000000000000000000000000000000602082015290517fffffffff0000000000000000000000000000000000000000000000000000000060e086901b16815261074693929187918a90600401610dfc565b600060405180830381600087803b15801561076057600080fd5b505af1158015610774573d6000803e3d6000fd5b505050505050505050565b606060088251116107f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f7265636569766572206164647265737320697320746f6f2073686f727400000060448201526064015b60405180910390fd5b6101008251111561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7265636569766572206164647265737320697320746f6f206c6f6e670000000060448201526064016107e8565b60408051808201909152600881527f6e657574726f6e31000000000000000000000000000000000000000000000000602082015260005b81518160ff16101561099857818160ff16815181106108b6576108b6610e5c565b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916848260ff16815181106108f8576108f8610e5c565b01602001517fff000000000000000000000000000000000000000000000000000000000000001614610986576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f72656365697665723a20696e636f72726563742070726566697800000000000060448201526064016107e8565b8061099081610e8b565b915050610895565b506000836040516020016109ac9190610bd8565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe00181526001808452838301909252925060009190816020015b60608152602001906001900390816109ed5790505090506040518060400160405280600881526020017f726563656976657200000000000000000000000000000000000000000000000081525081600081518110610a4d57610a4d610e5c565b6020908102919091010152604080516001808252818301909252600091816020015b6060815260200190600190039081610a6f5790505090506040518060400160405280600681526020017f737472696e67000000000000000000000000000000000000000000000000000081525081600081518110610acf57610acf610e5c565b60200260200101819052506060828285604051602001610af193929190610f26565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152908290529150610b4f907c0100000000000000000000000000000000000000000000000000000000908390602001610f9d565b60405160208183030381529060405295505050505050919050565b60005b83811015610b85578181015183820152602001610b6d565b50506000910152565b60008151808452610ba6816020860160208601610b6a565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000610beb6020830184610b8e565b9392505050565b60008083601f840112610c0457600080fd5b50813567ffffffffffffffff811115610c1c57600080fd5b602083019150836020828501011115610c3457600080fd5b9250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610c5f57600080fd5b919050565b60008060008060608587031215610c7a57600080fd5b843567ffffffffffffffff811115610c9157600080fd5b610c9d87828801610bf2565b90955093505060208501359150610cb660408601610c3b565b905092959194509250565b60008060008060008060008060e0898b031215610cdd57600080fd5b883567ffffffffffffffff811115610cf457600080fd5b610d008b828c01610bf2565b9099509750506020890135955060408901359450606089013560ff81168114610d2857600080fd5b93506080890135925060a08901359150610d4460c08a01610c3b565b90509295985092959890939650565b600060208284031215610d6557600080fd5b81518015158114610beb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808a16835260e06020840152610da560e084018a610b8e565b8381036040850152610db7818a610b8e565b90508381036060850152610dcb8189610b8e565b90508381036080850152610ddf8188610b8e565b60a0850196909652509290921660c0909101525095945050505050565b60a081526000610e0f60a0830188610b8e565b8281036020840152610e218188610b8e565b90508281036040840152610e358187610b8e565b90508281036060840152610e498186610b8e565b9150508260808301529695505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600060ff821660ff8103610ec8577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60010192915050565b600081518084526020808501808196508360051b8101915082860160005b85811015610f19578284038952610f07848351610b8e565b98850198935090840190600101610eef565b5091979650505050505050565b60808152600460808201527f6d696e740000000000000000000000000000000000000000000000000000000060a082015260c060208201526000610f6d60c0830186610ed1565b8281036040840152610f7f8186610ed1565b90508281036060840152610f938185610b8e565b9695505050505050565b7fffffffff000000000000000000000000000000000000000000000000000000008316815260008251610fd7816004850160208701610b6a565b91909101600401939250505056fe6e657574726f6e31756737343071726b7175787a726b326868323971726c7833736b746b666d6c336a65376a7575736332746537786d767373636e73306e32777279a2646970667358221220f57bb0d3cbcd89ece1f04b408d521b161e694e7ed23bc3b894542e2cf712f5ae64736f6c63430008130033

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

0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a50000000000000000000000002d5d7d31f671f86c782533cc367f14109a0827120000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0

-----Decoded View---------------
Arg [0] : axelarGateway (address): 0x4F4495243837681061C4743b74B3eEdf548D56A5
Arg [1] : axelarGasReceiver (address): 0x2d5d7d31F671F86C782533cc367F14109a082712
Arg [2] : wstEth (address): 0x7f39C581F595B53c5cb19bD0b3f8dA6c935E2Ca0

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000004f4495243837681061c4743b74b3eedf548d56a5
Arg [1] : 0000000000000000000000002d5d7d31f671f86c782533cc367f14109a082712
Arg [2] : 0000000000000000000000007f39c581f595b53c5cb19bd0b3f8da6c935e2ca0


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  ]

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.