MATIC Price: $0.542232 (+1.49%)
Gas: 30.9 GWei
 

Overview

MATIC Balance

Polygon PoS Chain LogoPolygon PoS Chain LogoPolygon PoS Chain Logo0 MATIC

MATIC Value

$0.00

Token Holdings

Sponsored

Transaction Hash
Method
Block
From
To
Withdraw596152582024-07-21 3:20:4631 hrs ago1721532046IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0033497772.01639999
Withdraw596012872024-07-20 18:52:1340 hrs ago1721501533IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0018605840.01088
Withdraw595727452024-07-20 1:46:402 days ago1721440000IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0017209637.03705358
Withdraw595682692024-07-19 23:08:022 days ago1721430482IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0037211179.99990002
Withdraw595534402024-07-19 14:21:412 days ago1721398901IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0016740836.00027385
Withdraw595236962024-07-18 20:42:553 days ago1721335375IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0016727736.00000002
Withdraw594649092024-07-17 9:45:065 days ago1721209506IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0019781338.64000039
Withdraw594648042024-07-17 9:41:245 days ago1721209284IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0018434136.00000007
Withdraw594639162024-07-17 9:09:565 days ago1721207396IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0018434136.00000021
Withdraw594637502024-07-17 9:04:045 days ago1721207044IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0018434136.00000042
Withdraw594455102024-07-16 22:11:575 days ago1721167917IN
0xd531Cf21...6E7Cf879a
0 MATIC0.00494286106.29360005
Withdraw594056402024-07-15 22:15:276 days ago1721081727IN
0xd531Cf21...6E7Cf879a
0 MATIC0.00534773115.00000003
Withdraw593989982024-07-15 18:20:126 days ago1721067612IN
0xd531Cf21...6E7Cf879a
0 MATIC0.00184636.00003689
Withdraw593984952024-07-15 18:01:396 days ago1721066499IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0037199179.99472385
Withdraw593936812024-07-15 15:06:166 days ago1721055976IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0045654498.17739105
Withdraw593748962024-07-15 3:32:317 days ago1721014351IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0033564772.17923114
Withdraw593435712024-07-14 8:51:098 days ago1720947069IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0016740736.00000005
Withdraw593297722024-07-14 0:38:448 days ago1720917524IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0031622268.00200027
Withdraw593215832024-07-13 19:47:248 days ago1720900044IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0033429672.00000002
Withdraw593084672024-07-13 11:45:148 days ago1720871114IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0044176995.00000004
Withdraw592710732024-07-12 13:10:589 days ago1720789858IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0016732336.00056499
Withdraw592450082024-07-11 21:35:3410 days ago1720733734IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0018438436.00000002
Withdraw592026092024-07-10 20:27:2511 days ago1720643245IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0023925751.45108859
Withdraw591900532024-07-10 13:00:5311 days ago1720616453IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0017710838.11582106
Withdraw591429012024-07-09 8:56:1813 days ago1720515378IN
0xd531Cf21...6E7Cf879a
0 MATIC0.0014652531.52581929
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
Loading...
Loading

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

Contract Name:
FxERC20ChildTunnel

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 9999 runs

Other Settings:
default evmVersion
File 1 of 5 : FxERC20ChildTunnel.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {FxBaseChildTunnel} from "../../tunnel/FxBaseChildTunnel.sol";
import {Create2} from "../../lib/Create2.sol";
import {IFxERC20} from "../../tokens/IFxERC20.sol";

/**
 * @title FxERC20ChildTunnel
 */
contract FxERC20ChildTunnel is FxBaseChildTunnel, Create2 {
    bytes32 public constant DEPOSIT = keccak256("DEPOSIT");
    bytes32 public constant MAP_TOKEN = keccak256("MAP_TOKEN");
    string public constant SUFFIX_NAME = " (FXERC20)";
    string public constant PREFIX_SYMBOL = "fx";

    // event for token maping
    event TokenMapped(address indexed rootToken, address indexed childToken);
    // root to child token
    mapping(address => address) public rootToChildToken;
    // token template
    address public tokenTemplate;

    constructor(address _fxChild, address _tokenTemplate) FxBaseChildTunnel(_fxChild) {
        tokenTemplate = _tokenTemplate;
        require(_isContract(_tokenTemplate), "Token template is not contract");
    }

    function withdraw(address childToken, uint256 amount) public {
        _withdraw(childToken, msg.sender, amount);
    }

    function withdrawTo(
        address childToken,
        address receiver,
        uint256 amount
    ) public {
        _withdraw(childToken, receiver, amount);
    }

    //
    // Internal methods
    //

    function _processMessageFromRoot(
        uint256, /* stateId */
        address sender,
        bytes memory data
    ) internal override validateSender(sender) {
        // decode incoming data
        (bytes32 syncType, bytes memory syncData) = abi.decode(data, (bytes32, bytes));

        if (syncType == DEPOSIT) {
            _syncDeposit(syncData);
        } else if (syncType == MAP_TOKEN) {
            _mapToken(syncData);
        } else {
            revert("FxERC20ChildTunnel: INVALID_SYNC_TYPE");
        }
    }

    function _mapToken(bytes memory syncData) internal returns (address) {
        (address rootToken, string memory name, string memory symbol, uint8 decimals) = abi.decode(
            syncData,
            (address, string, string, uint8)
        );

        // get root to child token
        address childToken = rootToChildToken[rootToken];

        // check if it's already mapped
        require(childToken == address(0x0), "FxERC20ChildTunnel: ALREADY_MAPPED");

        // deploy new child token
        bytes32 salt = keccak256(abi.encodePacked(rootToken));
        childToken = createClone(salt, tokenTemplate);
        IFxERC20(childToken).initialize(
            address(this),
            rootToken,
            string(abi.encodePacked(name, SUFFIX_NAME)),
            string(abi.encodePacked(PREFIX_SYMBOL, symbol)),
            decimals
        );

        // map the token
        rootToChildToken[rootToken] = childToken;
        emit TokenMapped(rootToken, childToken);

        // return new child token
        return childToken;
    }

    function _syncDeposit(bytes memory syncData) internal {
        (address rootToken, address depositor, address to, uint256 amount, bytes memory depositData) = abi.decode(
            syncData,
            (address, address, address, uint256, bytes)
        );
        address childToken = rootToChildToken[rootToken];

        // deposit tokens
        IFxERC20 childTokenContract = IFxERC20(childToken);
        childTokenContract.mint(to, amount);

        // call `onTokenTranfer` on `to` with limit and ignore error
        if (_isContract(to)) {
            uint256 txGas = 2000000;
            bool success = false;
            bytes memory data = abi.encodeWithSignature(
                "onTokenTransfer(address,address,address,address,uint256,bytes)",
                rootToken,
                childToken,
                depositor,
                to,
                amount,
                depositData
            );
            // solium-disable-next-line security/no-inline-assembly
            assembly {
                success := call(txGas, to, 0, add(data, 0x20), mload(data), 0, 0)
            }
        }
    }

    function _withdraw(
        address childToken,
        address receiver,
        uint256 amount
    ) internal {
        IFxERC20 childTokenContract = IFxERC20(childToken);
        // child token contract will have root token
        address rootToken = childTokenContract.connectedToken();

        // validate root and child token mapping
        require(
            childToken != address(0x0) && rootToken != address(0x0) && childToken == rootToChildToken[rootToken],
            "FxERC20ChildTunnel: NO_MAPPED_TOKEN"
        );

        // withdraw tokens
        childTokenContract.burn(msg.sender, amount);

        // send message to root regarding token burn
        _sendMessageToRoot(abi.encode(rootToken, childToken, receiver, amount));
    }

    // check if address is contract
    function _isContract(address _addr) private view returns (bool) {
        uint32 size;
        assembly {
            size := extcodesize(_addr)
        }
        return (size > 0);
    }
}

File 2 of 5 : 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 virtual {
        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
    ) internal virtual;
}

File 3 of 5 : Create2.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// Create2 adds common methods for minimal proxy with create2
abstract contract Create2 {
    // creates clone using minimal proxy
    function createClone(bytes32 _salt, address _target) internal returns (address _result) {
        bytes20 _targetBytes = bytes20(_target);

        assembly {
            let clone := mload(0x40)
            mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)
            mstore(add(clone, 0x14), _targetBytes)
            mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)
            _result := create2(0, clone, 0x37, _salt)
        }

        require(_result != address(0), "Create2: Failed on minimal deploy");
    }

    // get minimal proxy creation code
    function minimalProxyCreationCode(address logic) internal pure returns (bytes memory) {
        bytes10 creation = 0x3d602d80600a3d3981f3;
        bytes10 prefix = 0x363d3d373d3d3d363d73;
        bytes20 targetBytes = bytes20(logic);
        bytes15 suffix = 0x5af43d82803e903d91602b57fd5bf3;
        return abi.encodePacked(creation, prefix, targetBytes, suffix);
    }

    // get computed create2 address
    function computedCreate2Address(
        bytes32 salt,
        bytes32 bytecodeHash,
        address deployer
    ) public pure returns (address) {
        bytes32 _data = keccak256(abi.encodePacked(bytes1(0xff), deployer, salt, bytecodeHash));
        return address(uint160(uint256(_data)));
    }
}

File 4 of 5 : IFxERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC20} from "../lib/IERC20.sol";

interface IFxERC20 is IERC20 {
    function fxManager() external returns (address);

    function connectedToken() external returns (address);

    function initialize(
        address _fxManager,
        address _connectedToken,
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) external;

    function mint(address user, uint256 amount) external;

    function burn(address user, uint256 amount) external;
}

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

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, 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 `sender` to `recipient` 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 sender,
        address recipient,
        uint256 amount
    ) external returns (bool);

    /**
     * @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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 9999
  },
  "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":"_tokenTemplate","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"message","type":"bytes"}],"name":"MessageSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"rootToken","type":"address"},{"indexed":true,"internalType":"address","name":"childToken","type":"address"}],"name":"TokenMapped","type":"event"},{"inputs":[],"name":"DEPOSIT","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAP_TOKEN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PREFIX_SYMBOL","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUFFIX_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"salt","type":"bytes32"},{"internalType":"bytes32","name":"bytecodeHash","type":"bytes32"},{"internalType":"address","name":"deployer","type":"address"}],"name":"computedCreate2Address","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"fxChild","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fxRootTunnel","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"stateId","type":"uint256"},{"internalType":"address","name":"rootMessageSender","type":"address"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"processMessageFromRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"rootToChildToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_fxRootTunnel","type":"address"}],"name":"setFxRootTunnel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"tokenTemplate","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"childToken","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawTo","outputs":[],"stateMutability":"nonpayable","type":"function"}]

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100df5760003560e01c8063886a69ba1161008c578063c3b35a7e11610066578063c3b35a7e1461017f578063d81c8e5214610192578063ea60c7c41461019a578063f3fef3a3146101ad576100df565b8063886a69ba1461014257806388837094146101575780639a7c4b711461016c576100df565b8063450d11f0116100bd578063450d11f01461011f5780637337957f146101275780637f1e9cb01461013a576100df565b80630814d3dd146100e45780633740d5a01461010257806339c6c9e014610117575b600080fd5b6100ec6101c0565b6040516100f9919061109e565b60405180910390f35b61010a6101dc565b6040516100f991906111e1565b61010a610215565b6100ec61024e565b6100ec610135366004610eae565b61026a565b6100ec6102a9565b61014a6102c5565b6040516100f991906111d8565b61016a610165366004610cf8565b6102e9565b005b61016a61017a366004610f2b565b610389565b61016a61018d366004610e43565b610421565b61014a610431565b6100ec6101a8366004610cf8565b610455565b61016a6101bb366004610e83565b61047d565b60035473ffffffffffffffffffffffffffffffffffffffff1681565b6040518060400160405280600281526020017f667800000000000000000000000000000000000000000000000000000000000081525081565b6040518060400160405280600a81526020017f202846584552433230290000000000000000000000000000000000000000000081525081565b60005473ffffffffffffffffffffffffffffffffffffffff1681565b60008060ff60f81b838686604051602001610288949392919061100b565b60408051808303601f19018152919052805160209091012095945050505050565b60015473ffffffffffffffffffffffffffffffffffffffff1681565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad81565b60015473ffffffffffffffffffffffffffffffffffffffff1615610342576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611422565b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103da576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906111f4565b61041b848484848080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525061048c92505050565b50505050565b61042c8383836105a4565b505050565b7f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f82181565b60026020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b6104888233836105a4565b5050565b600154829073ffffffffffffffffffffffffffffffffffffffff8083169116146104e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611251565b600080838060200190518101906104f99190610ee6565b915091507f87a7811f4bfedea3d341ad165680ae306b01aaeacc205d227629cf157dd9f8218214156105335761052e8161078d565b61059c565b7f2cef46a936bdc5b7e6e8c71aa04560c41cf7d88bb26901a7e7f4936ff02accad82141561056a57610564816108fc565b5061059c565b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906112ae565b505050505050565b600083905060008173ffffffffffffffffffffffffffffffffffffffff16630a8a49146040518163ffffffff1660e01b8152600401602060405180830381600087803b1580156105f357600080fd5b505af1158015610607573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062b9190610d1b565b905073ffffffffffffffffffffffffffffffffffffffff851615801590610667575073ffffffffffffffffffffffffffffffffffffffff811615155b801561069c575073ffffffffffffffffffffffffffffffffffffffff8082166000908152600260205260409020548682169116145b6106d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103399061130b565b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff831690639dc29fac9061072690339087906004016111b2565b600060405180830381600087803b15801561074057600080fd5b505af1158015610754573d6000803e3d6000fd5b5050505061078681868686604051602001610772949392919061111a565b604051602081830303815290604052610b79565b5050505050565b6000806000806000858060200190518101906107a99190610d37565b73ffffffffffffffffffffffffffffffffffffffff808616600090815260026020526040908190205490517f40c10f19000000000000000000000000000000000000000000000000000000008152969b5094995092975090955093501690819081906340c10f199061082190889088906004016111b2565b600060405180830381600087803b15801561083b57600080fd5b505af115801561084f573d6000803e3d6000fd5b5050505061085c85610bb3565b156108f2576000621e8480905060008089858a8a8a8a604051602401610887969594939291906110bf565b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f166480c20000000000000000000000000000000000000000000000000000000017815281519192506000918291828c88f1505050505b5050505050505050565b6000806000806000858060200190518101906109189190610db7565b73ffffffffffffffffffffffffffffffffffffffff8085166000908152600260205260409020549498509296509094509250168015610983576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161033990611368565b6000856040516020016109969190610fdb565b60408051601f1981840301815291905280516020909101206003549091506109d590829073ffffffffffffffffffffffffffffffffffffffff16610bbf565b91508173ffffffffffffffffffffffffffffffffffffffff16638420ce993088886040518060400160405280600a81526020017f2028465845524332302900000000000000000000000000000000000000000000815250604051602001610a3d92919061106f565b6040516020818303038152906040526040518060400160405280600281526020017f667800000000000000000000000000000000000000000000000000000000000081525089604051602001610a9492919061106f565b604051602081830303815290604052886040518663ffffffff1660e01b8152600401610ac4959493929190611151565b600060405180830381600087803b158015610ade57600080fd5b505af1158015610af2573d6000803e3d6000fd5b5050505073ffffffffffffffffffffffffffffffffffffffff86811660008181526002602052604080822080547fffffffffffffffffffffffff0000000000000000000000000000000000000000169487169485179055517f85920d35e6c72f6b2affffa04298b0cecfeba86e4a9f407df661f1cb8ab5e6179190a3509695505050505050565b7f8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b03681604051610ba891906111e1565b60405180910390a150565b3b63ffffffff16151590565b6000808260601b90506040517f3d602d80600a3d3981f3363d3d373d3d3d363d7300000000000000000000000081528160148201527f5af43d82803e903d91602b57fd5bf300000000000000000000000000000000006028820152846037826000f592505073ffffffffffffffffffffffffffffffffffffffff8216610c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610339906113c5565b5092915050565b600082601f830112610c88578081fd5b815167ffffffffffffffff80821115610ca357610ca36114ab565b6040516020601f19601f8501168201018181108382111715610cc757610cc76114ab565b604052828152848301602001861015610cde578384fd5b610cef83602083016020880161147f565b95945050505050565b600060208284031215610d09578081fd5b8135610d14816114da565b9392505050565b600060208284031215610d2c578081fd5b8151610d14816114da565b600080600080600060a08688031215610d4e578081fd5b8551610d59816114da565b6020870151909550610d6a816114da565b6040870151909450610d7b816114da565b60608701516080880151919450925067ffffffffffffffff811115610d9e578182fd5b610daa88828901610c78565b9150509295509295909350565b60008060008060808587031215610dcc578384fd5b8451610dd7816114da565b602086015190945067ffffffffffffffff80821115610df4578485fd5b610e0088838901610c78565b94506040870151915080821115610e15578384fd5b50610e2287828801610c78565b925050606085015160ff81168114610e38578182fd5b939692955090935050565b600080600060608486031215610e57578283fd5b8335610e62816114da565b92506020840135610e72816114da565b929592945050506040919091013590565b60008060408385031215610e95578182fd5b8235610ea0816114da565b946020939093013593505050565b600080600060608486031215610ec2578283fd5b83359250602084013591506040840135610edb816114da565b809150509250925092565b60008060408385031215610ef8578182fd5b82519150602083015167ffffffffffffffff811115610f15578182fd5b610f2185828601610c78565b9150509250929050565b60008060008060608587031215610f40578384fd5b843593506020850135610f52816114da565b9250604085013567ffffffffffffffff80821115610f6e578384fd5b818701915087601f830112610f81578384fd5b813581811115610f8f578485fd5b886020828501011115610fa0578485fd5b95989497505060200194505050565b60008151808452610fc781602086016020860161147f565b601f01601f19169290920160200192915050565b60609190911b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016815260140190565b7fff0000000000000000000000000000000000000000000000000000000000000094909416845260609290921b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660018401526015830152603582015260550190565b6000835161108181846020880161147f565b83519083019061109581836020880161147f565b01949350505050565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600073ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261110e60c0830184610faf565b98975050505050505050565b73ffffffffffffffffffffffffffffffffffffffff9485168152928416602084015292166040820152606081019190915260800190565b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525060a0604083015261118a60a0830186610faf565b828103606084015261119c8186610faf565b91505060ff831660808301529695505050505050565b73ffffffffffffffffffffffffffffffffffffffff929092168252602082015260400190565b90815260200190565b600060208252610d146020830184610faf565b60208082526021908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201527f5200000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602b908201527f4678426173654368696c6454756e6e656c3a20494e56414c49445f53454e444560408201527f525f46524f4d5f524f4f54000000000000000000000000000000000000000000606082015260800190565b60208082526025908201527f467845524332304368696c6454756e6e656c3a20494e56414c49445f53594e4360408201527f5f54595045000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526023908201527f467845524332304368696c6454756e6e656c3a204e4f5f4d41505045445f544f60408201527f4b454e0000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526022908201527f467845524332304368696c6454756e6e656c3a20414c52454144595f4d41505060408201527f4544000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f437265617465323a204661696c6564206f6e206d696e696d616c206465706c6f60408201527f7900000000000000000000000000000000000000000000000000000000000000606082015260800190565b6020808252602a908201527f4678426173654368696c6454756e6e656c3a20524f4f545f54554e4e454c5f4160408201527f4c52454144595f53455400000000000000000000000000000000000000000000606082015260800190565b60005b8381101561149a578181015183820152602001611482565b8381111561041b5750506000910152565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b73ffffffffffffffffffffffffffffffffffffffff811681146114fc57600080fd5b5056fea2646970667358221220682181037579965719f72c8d98b604266792c7182aa44a4ecc28fd94b8a16a2f64736f6c63430008000033

Block Transaction Gas Used Reward
view all blocks produced

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

Validator Index Block Amount
View All Withdrawals

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