Contract 0x8a1b966ac46f42275860f905dbc75efbfdc12374 1

 
 
Txn Hash Method
Block
From
To
Value [Txn Fee]
0xd0add0d7750e687d001f77834ec9690475919fdf46f6017afe6766a3584432170x60c06040227570492021-12-20 17:22:40193 days 22 hrs ago0x289ed7b614aa9cb2feeace6ce2b4244ba4bd58a2 IN  Create: EthereumProxy0 MATIC0.0167374230
[ Download CSV Export 
Parent Txn Hash Block From To Value
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
EthereumProxy

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : EthereumProxy.sol
// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.9;

import {IFxMessageProcessor} from '@maticnetwork/fx-portal/contracts/tunnel/FxBaseChildTunnel.sol';

/// @title Ethereum proxy contract
/// @dev This contract represents another contract on L1
contract EthereumProxy is IFxMessageProcessor {
    /// @notice The tunnel contract on the child network, i.e. Polygon
    address public immutable fxChild;

    /// @notice The address of the L1 owner contract, i.e. Ethereum L1 owner address
    address public immutable l1Owner;

    constructor(address _fxChild, address _l1Owner) {
        fxChild = _fxChild;
        l1Owner = _l1Owner;
    }

    /// @dev Emitted when this contract simply receives some currency
    event Received(uint256 value);

    /// @dev If necessary, this contract can accept funds so that it may send funds
    receive() external payable {
        emit Received(msg.value);
    }

    /// @dev This function is how messages are delivered from the polygon message passing contract to polygon contracts.
    function processMessageFromRoot(
        uint256, /*stateId*/
        address sender,
        bytes memory message
    ) external override {
        require(msg.sender == fxChild, 'Can only be called by the state sync child contract');
        require(sender == l1Owner, 'L1 sender must be the owner');

        (address[] memory targets, bytes[] memory datas, uint256[] memory values) = abi.decode(
            message,
            (address[], bytes[], uint256[])
        );

        require(targets.length == datas.length && targets.length == values.length, 'Inconsistent argument lengths');
        for (uint256 i = 0; i < targets.length; i++) {
            (bool success, ) = targets[i].call{value: values[i]}(datas[i]);
            require(success, 'Sub-call failed');
        }
    }
}

File 2 of 2 : FxBaseChildTunnel.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// IFxMessageProcessor represents interface to process message
interface IFxMessageProcessor {
    function processMessageFromRoot(uint256 stateId, address rootMessageSender, bytes calldata data) external;
}

/**
* @notice Mock child tunnel contract to receive and send message from L2
*/
abstract contract FxBaseChildTunnel is IFxMessageProcessor{
    // MessageTunnel on L1 will get data from this event
    event MessageSent(bytes message);

    // fx child
    address public fxChild;

    // fx root tunnel
    address public fxRootTunnel;

    constructor(address _fxChild) {
        fxChild = _fxChild;
    }

    // Sender must be fxRootTunnel in case of ERC20 tunnel
    modifier validateSender(address sender) {
        require(sender == fxRootTunnel, "FxBaseChildTunnel: INVALID_SENDER_FROM_ROOT");
        _;
    }

    // set fxRootTunnel if not set already
    function setFxRootTunnel(address _fxRootTunnel) external {
        require(fxRootTunnel == address(0x0), "FxBaseChildTunnel: ROOT_TUNNEL_ALREADY_SET");
        fxRootTunnel = _fxRootTunnel;
    }

    function processMessageFromRoot(uint256 stateId, address rootMessageSender, bytes calldata data) external override {
        require(msg.sender == fxChild, "FxBaseChildTunnel: INVALID_SENDER");
        _processMessageFromRoot(stateId, rootMessageSender, data);
    }

    /**
     * @notice Emit message that can be received on Root Tunnel
     * @dev Call the internal function when need to emit message
     * @param message bytes message that will be sent to Root Tunnel
     * some message examples -
     *   abi.encode(tokenId);
     *   abi.encode(tokenId, tokenMetadata);
     *   abi.encode(messageType, messageData);
     */
    function _sendMessageToRoot(bytes memory message) internal {
        emit MessageSent(message);
    }

    /**
     * @notice Process message received from Root Tunnel
     * @dev function needs to be implemented to handle message as per requirement
     * This is called by onStateReceive function.
     * Since it is called via a system call, any event will not be emitted during its execution.
     * @param stateId unique state id
     * @param sender root message sender
     * @param message bytes message that was sent from Root Tunnel
     */
    function _processMessageFromRoot(uint256 stateId, address sender, bytes memory message) virtual internal;
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_fxChild","type":"address"},{"internalType":"address","name":"_l1Owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Received","type":"event"},{"inputs":[],"name":"fxChild","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"l1Owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"sender","type":"address"},{"internalType":"bytes","name":"message","type":"bytes"}],"name":"processMessageFromRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

60c060405234801561001057600080fd5b506040516109eb3803806109eb83398101604081905261002f91610062565b6001600160a01b039182166080521660a052610095565b80516001600160a01b038116811461005d57600080fd5b919050565b6000806040838503121561007557600080fd5b61007e83610046565b915061008c60208401610046565b90509250929050565b60805160a0516109246100c76000396000818161010801526101f60152600081816089015261014201526109246000f3fe6080604052600436106100385760003560e01c8063450d11f0146100775780639a7c4b71146100d4578063d2db6372146100f657600080fd5b36610072576040513481527fa8142743f8f70a4c26f3691cf4ed59718381fb2f18070ec52be1f1022d8555579060200160405180910390a1005b600080fd5b34801561008357600080fd5b506100ab7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390f35b3480156100e057600080fd5b506100f46100ef366004610571565b61012a565b005b34801561010257600080fd5b506100ab7f000000000000000000000000000000000000000000000000000000000000000081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016146101f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f43616e206f6e6c792062652063616c6c6564206279207468652073746174652060448201527f73796e63206368696c6420636f6e74726163740000000000000000000000000060648201526084015b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146102a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4c312073656e646572206d75737420626520746865206f776e6572000000000060448201526064016101eb565b6000806000838060200190518101906102c29190610783565b925092509250815183511480156102da575080518351145b610340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f496e636f6e73697374656e7420617267756d656e74206c656e6774687300000060448201526064016101eb565b60005b835181101561047f5760008482815181106103605761036061086c565b602002602001015173ffffffffffffffffffffffffffffffffffffffff168383815181106103905761039061086c565b60200260200101518584815181106103aa576103aa61086c565b60200260200101516040516103bf919061089b565b60006040518083038185875af1925050503d80600081146103fc576040519150601f19603f3d011682016040523d82523d6000602084013e610401565b606091505b505090508061046c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f5375622d63616c6c206661696c6564000000000000000000000000000000000060448201526064016101eb565b5080610477816108b7565b915050610343565b50505050505050565b73ffffffffffffffffffffffffffffffffffffffff811681146104aa57600080fd5b50565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715610523576105236104ad565b604052919050565b600067ffffffffffffffff821115610545576105456104ad565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60008060006060848603121561058657600080fd5b83359250602084013561059881610488565b9150604084013567ffffffffffffffff8111156105b457600080fd5b8401601f810186136105c557600080fd5b80356105d86105d38261052b565b6104dc565b8181528760208385010111156105ed57600080fd5b816020840160208301376000602083830101528093505050509250925092565b600067ffffffffffffffff821115610627576106276104ad565b5060051b60200190565b60005b8381101561064c578181015183820152602001610634565b8381111561065b576000848401525b50505050565b600082601f83011261067257600080fd5b815160206106826105d38361060d565b82815260059290921b840181019181810190868411156106a157600080fd5b8286015b8481101561071d57805167ffffffffffffffff8111156106c55760008081fd5b8701603f810189136106d75760008081fd5b8481015160406106e96105d38361052b565b8281528b828486010111156106fe5760008081fd5b61070d83898301848701610631565b86525050509183019183016106a5565b509695505050505050565b600082601f83011261073957600080fd5b815160206107496105d38361060d565b82815260059290921b8401810191818101908684111561076857600080fd5b8286015b8481101561071d578051835291830191830161076c565b60008060006060848603121561079857600080fd5b835167ffffffffffffffff808211156107b057600080fd5b818601915086601f8301126107c457600080fd5b815160206107d46105d38361060d565b82815260059290921b8401810191818101908a8411156107f357600080fd5b948201945b8386101561081a57855161080b81610488565b825294820194908201906107f8565b9189015191975090935050508082111561083357600080fd5b61083f87838801610661565b9350604086015191508082111561085557600080fd5b5061086286828701610728565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600082516108ad818460208701610631565b9190910192915050565b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415610910577f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b506001019056fea164736f6c6343000809000a0000000000000000000000008397259c983751daf40400790063935a11afa28a0000000000000000000000001a9c8182c09f50c8318d769245bea52c32be35bc

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

0000000000000000000000008397259c983751daf40400790063935a11afa28a0000000000000000000000001a9c8182c09f50c8318d769245bea52c32be35bc

-----Decoded View---------------
Arg [0] : _fxChild (address): 0x8397259c983751daf40400790063935a11afa28a
Arg [1] : _l1Owner (address): 0x1a9c8182c09f50c8318d769245bea52c32be35bc

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000008397259c983751daf40400790063935a11afa28a
Arg [1] : 0000000000000000000000001a9c8182c09f50c8318d769245bea52c32be35bc


Block Transaction Gas Used Reward
Age Block Fee Address BC Fee Address Voting Power Jailed Incoming
Block Uncle Number Difficulty Gas Used Reward
Loading
Loading
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.