Abstract Testnet

Contract

0xBE80EAE2a968C257a0Dc965C59d19606Df0Fb518
Source Code Source Code

Overview

ETH Balance

0.01 ETH

Token Holdings

More Info

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Amount
0xe95920e324136772024-12-23 4:57:32481 days ago1734929852IN
0xBE80EAE2...6Df0Fb518
0 ETH0.00000460.03984871
Transfer4133212024-09-27 2:12:23568 days ago1727403143IN
0xBE80EAE2...6Df0Fb518
0.01 ETH0.000027150.025

Latest 1 internal transaction

Parent Transaction Hash Block From To Amount
24136772024-12-23 4:57:32481 days ago1734929852
0xBE80EAE2...6Df0Fb518
0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
TestnetPaymaster

Compiler Version
v0.8.20+commit.a1b79de6

ZkSolc Version
v1.3.18

Optimization Enabled:
Yes with Mode 3

Other Settings:
default evmVersion

Contract Source Code (Solidity Standard Json-Input format)

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import {IPaymaster, ExecutionResult, PAYMASTER_VALIDATION_SUCCESS_MAGIC} from "./interfaces/IPaymaster.sol";
import {IPaymasterFlow} from "./interfaces/IPaymasterFlow.sol";
import {Transaction, BOOTLOADER_ADDRESS} from "./L2ContractHelper.sol";

// This is a dummy paymaster. It expects the paymasterInput to contain its "signature" as well as the needed exchange rate.
// It supports only approval-based paymaster flow.
contract TestnetPaymaster is IPaymaster {
    function validateAndPayForPaymasterTransaction(
        bytes32,
        bytes32,
        Transaction calldata _transaction
    ) external payable returns (bytes4 magic, bytes memory context) {
        // By default we consider the transaction as accepted.
        magic = PAYMASTER_VALIDATION_SUCCESS_MAGIC;

        require(msg.sender == BOOTLOADER_ADDRESS, "Only bootloader can call this contract");
        require(_transaction.paymasterInput.length >= 4, "The standard paymaster input must be at least 4 bytes long");

        bytes4 paymasterInputSelector = bytes4(_transaction.paymasterInput[0:4]);
        if (paymasterInputSelector == IPaymasterFlow.approvalBased.selector) {
            // While the actual data consists of address, uint256 and bytes data,
            // the data is not needed for the testnet paymaster
            (address token, uint256 amount, ) = abi.decode(_transaction.paymasterInput[4:], (address, uint256, bytes));

            // Firstly, we verify that the user has provided enough allowance
            address userAddress = address(uint160(_transaction.from));
            address thisAddress = address(this);

            uint256 providedAllowance = IERC20(token).allowance(userAddress, thisAddress);
            require(providedAllowance >= amount, "The user did not provide enough allowance");

            // The testnet paymaster exchanges X wei of the token to the X wei of ETH.
            uint256 requiredETH = _transaction.gasLimit * _transaction.maxFeePerGas;
            if (amount < requiredETH) {
                // Important note: while this clause definitely means that the user
                // has underpaid the paymaster and the transaction should not accepted,
                // we do not want the transaction to revert, because for fee estimation
                // we allow users to provide smaller amount of funds then necessary to preserve
                // the property that if using X gas the transaction success, then it will succeed with X+1 gas.
                magic = bytes4(0);
            }

            // Pulling all the tokens from the user
            try IERC20(token).transferFrom(userAddress, thisAddress, amount) {} catch (bytes memory revertReason) {
                // If the revert reason is empty or represented by just a function selector,
                // we replace the error with a more user-friendly message
                if (revertReason.length <= 4) {
                    revert("Failed to transferFrom from users' account");
                } else {
                    assembly {
                        revert(add(0x20, revertReason), mload(revertReason))
                    }
                }
            }

            // The bootloader never returns any data, so it can safely be ignored here.
            (bool success, ) = payable(BOOTLOADER_ADDRESS).call{value: requiredETH}("");
            require(success, "Failed to transfer funds to the bootloader");
        } else {
            revert("Unsupported paymaster flow");
        }
    }

    function postTransaction(
        bytes calldata _context,
        Transaction calldata _transaction,
        bytes32,
        bytes32,
        ExecutionResult _txResult,
        uint256 _maxRefundedGas
    ) external payable override {
        // Refunds are not supported yet.
    }

    receive() external payable {}
}

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

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

/**
 * @author Matter Labs
 * @custom:security-contact [email protected]
 * @notice Smart contract for sending arbitrary length messages to L1
 * @dev by default ZkSync can send fixed-length messages on L1.
 * A fixed length message has 4 parameters `senderAddress`, `isService`, `key`, `value`,
 * the first one is taken from the context, the other three are chosen by the sender.
 * @dev To send a variable-length message we use this trick:
 * - This system contract accepts an arbitrary length message and sends a fixed length message with
 * parameters `senderAddress == this`, `isService == true`, `key == msg.sender`, `value == keccak256(message)`.
 * - The contract on L1 accepts all sent messages and if the message came from this system contract
 * it requires that the preimage of `value` be provided.
 */
interface IL2Messenger {
    /// @notice Sends an arbitrary length message to L1.
    /// @param _message The variable length message to be sent to L1.
    /// @return Returns the keccak256 hashed value of the message.
    function sendToL1(bytes memory _message) external returns (bytes32);
}

/**
 * @author Matter Labs
 * @custom:security-contact [email protected]
 * @notice Interface for the contract that is used to deploy contracts on L2.
 */
interface IContractDeployer {
    /// @notice A struct that describes a forced deployment on an address.
    /// @param bytecodeHash The bytecode hash to put on an address.
    /// @param newAddress The address on which to deploy the bytecodehash to.
    /// @param callConstructor Whether to run the constructor on the force deployment.
    /// @param value The `msg.value` with which to initialize a contract.
    /// @param input The constructor calldata.
    struct ForceDeployment {
        bytes32 bytecodeHash;
        address newAddress;
        bool callConstructor;
        uint256 value;
        bytes input;
    }

    /// @notice This method is to be used only during an upgrade to set bytecodes on specific addresses.
    /// @param _deployParams A set of parameters describing force deployment.
    function forceDeployOnAddresses(ForceDeployment[] calldata _deployParams) external payable;

    /// @notice Creates a new contract at a determined address using the `CREATE2` salt on L2
    /// @param _salt a unique value to create the deterministic address of the new contract
    /// @param _bytecodeHash the bytecodehash of the new contract to be deployed
    /// @param _input the calldata to be sent to the constructor of the new contract
    function create2(bytes32 _salt, bytes32 _bytecodeHash, bytes calldata _input) external returns (address);
}

/**
 * @author Matter Labs
 * @custom:security-contact [email protected]
 * @notice Interface for the contract that is used to simulate ETH on L2.
 */
interface IBaseToken {
    /// @notice Allows the withdrawal of ETH to a given L1 receiver along with an additional message.
    /// @param _l1Receiver The address on L1 to receive the withdrawn ETH.
    /// @param _additionalData Additional message or data to be sent alongside the withdrawal.
    function withdrawWithMessage(address _l1Receiver, bytes memory _additionalData) external payable;
}

uint160 constant SYSTEM_CONTRACTS_OFFSET = 0x8000; // 2^15

address constant BOOTLOADER_ADDRESS = address(SYSTEM_CONTRACTS_OFFSET + 0x01);
address constant MSG_VALUE_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x09);
address constant DEPLOYER_SYSTEM_CONTRACT = address(SYSTEM_CONTRACTS_OFFSET + 0x06);

IL2Messenger constant L2_MESSENGER = IL2Messenger(address(SYSTEM_CONTRACTS_OFFSET + 0x08));

IBaseToken constant L2_BASE_TOKEN_ADDRESS = IBaseToken(address(SYSTEM_CONTRACTS_OFFSET + 0x0a));

/**
 * @author Matter Labs
 * @custom:security-contact [email protected]
 * @notice Helper library for working with L2 contracts on L1.
 */
library L2ContractHelper {
    /// @dev The prefix used to create CREATE2 addresses.
    bytes32 private constant CREATE2_PREFIX = keccak256("zksyncCreate2");

    /// @notice Sends L2 -> L1 arbitrary-long message through the system contract messenger.
    /// @param _message Data to be sent to L1.
    /// @return keccak256 hash of the sent message.
    function sendMessageToL1(bytes memory _message) internal returns (bytes32) {
        return L2_MESSENGER.sendToL1(_message);
    }

    /// @notice Computes the create2 address for a Layer 2 contract.
    /// @param _sender The address of the contract creator.
    /// @param _salt The salt value to use in the create2 address computation.
    /// @param _bytecodeHash The contract bytecode hash.
    /// @param _constructorInputHash The keccak256 hash of the constructor input data.
    /// @return The create2 address of the contract.
    /// NOTE: L2 create2 derivation is different from L1 derivation!
    function computeCreate2Address(
        address _sender,
        bytes32 _salt,
        bytes32 _bytecodeHash,
        bytes32 _constructorInputHash
    ) internal pure returns (address) {
        bytes32 senderBytes = bytes32(uint256(uint160(_sender)));
        bytes32 data = keccak256(
            // solhint-disable-next-line func-named-parameters
            bytes.concat(CREATE2_PREFIX, senderBytes, _salt, _bytecodeHash, _constructorInputHash)
        );

        return address(uint160(uint256(data)));
    }
}

/// @notice Structure used to represent a zkSync transaction.
struct Transaction {
    // The type of the transaction.
    uint256 txType;
    // The caller.
    uint256 from;
    // The callee.
    uint256 to;
    // The gasLimit to pass with the transaction.
    // It has the same meaning as Ethereum's gasLimit.
    uint256 gasLimit;
    // The maximum amount of gas the user is willing to pay for a byte of pubdata.
    uint256 gasPerPubdataByteLimit;
    // The maximum fee per gas that the user is willing to pay.
    // It is akin to EIP1559's maxFeePerGas.
    uint256 maxFeePerGas;
    // The maximum priority fee per gas that the user is willing to pay.
    // It is akin to EIP1559's maxPriorityFeePerGas.
    uint256 maxPriorityFeePerGas;
    // The transaction's paymaster. If there is no paymaster, it is equal to 0.
    uint256 paymaster;
    // The nonce of the transaction.
    uint256 nonce;
    // The value to pass with the transaction.
    uint256 value;
    // In the future, we might want to add some
    // new fields to the struct. The `txData` struct
    // is to be passed to account and any changes to its structure
    // would mean a breaking change to these accounts. In order to prevent this,
    // we should keep some fields as "reserved".
    // It is also recommended that their length is fixed, since
    // it would allow easier proof integration (in case we will need
    // some special circuit for preprocessing transactions).
    uint256[4] reserved;
    // The transaction's calldata.
    bytes data;
    // The signature of the transaction.
    bytes signature;
    // The properly formatted hashes of bytecodes that must be published on L1
    // with the inclusion of this transaction. Note, that a bytecode has been published
    // before, the user won't pay fees for its republishing.
    bytes32[] factoryDeps;
    // The input to the paymaster.
    bytes paymasterInput;
    // Reserved dynamic type for the future use-case. Using it should be avoided,
    // But it is still here, just in case we want to enable some additional functionality.
    bytes reservedDynamic;
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

import {Transaction} from "../L2ContractHelper.sol";

enum ExecutionResult {
    Revert,
    Success
}

bytes4 constant PAYMASTER_VALIDATION_SUCCESS_MAGIC = IPaymaster.validateAndPayForPaymasterTransaction.selector;

interface IPaymaster {
    /// @dev Called by the bootloader to verify that the paymaster agrees to pay for the
    /// fee for the transaction. This transaction should also send the necessary amount of funds onto the bootloader
    /// address.
    /// @param _txHash The hash of the transaction
    /// @param _suggestedSignedHash The hash of the transaction that is signed by an EOA
    /// @param _transaction The transaction itself.
    /// @return magic The value that should be equal to the signature of the validateAndPayForPaymasterTransaction
    /// if the paymaster agrees to pay for the transaction.
    /// @return context The "context" of the transaction: an array of bytes of length at most 1024 bytes, which will be
    /// passed to the `postTransaction` method of the account.
    /// @dev The developer should strive to preserve as many steps as possible both for valid
    /// and invalid transactions as this very method is also used during the gas fee estimation
    /// (without some of the necessary data, e.g. signature).
    function validateAndPayForPaymasterTransaction(
        bytes32 _txHash,
        bytes32 _suggestedSignedHash,
        Transaction calldata _transaction
    ) external payable returns (bytes4 magic, bytes memory context);

    /// @dev Called by the bootloader after the execution of the transaction. Please note that
    /// there is no guarantee that this method will be called at all. Unlike the original EIP4337,
    /// this method won't be called if the transaction execution results in out-of-gas.
    /// @param _context, the context of the execution, returned by the "validateAndPayForPaymasterTransaction" method.
    /// @param  _transaction, the users' transaction.
    /// @param _txResult, the result of the transaction execution (success or failure).
    /// @param _maxRefundedGas, the upper bound on the amount of gas that could be refunded to the paymaster.
    /// @dev The exact amount refunded depends on the gas spent by the "postOp" itself and so the developers should
    /// take that into account.
    function postTransaction(
        bytes calldata _context,
        Transaction calldata _transaction,
        bytes32 _txHash,
        bytes32 _suggestedSignedHash,
        ExecutionResult _txResult,
        uint256 _maxRefundedGas
    ) external payable;
}

// SPDX-License-Identifier: MIT

pragma solidity 0.8.20;

/**
 * @author Matter Labs
 * @custom:security-contact [email protected]
 * @dev The interface that is used for encoding/decoding of
 * different types of paymaster flows.
 * @notice This is NOT an interface to be implemented
 * by contracts. It is just used for encoding.
 */
interface IPaymasterFlow {
    function general(bytes calldata input) external;

    function approvalBased(address _token, uint256 _minAllowance, bytes calldata _innerInput) external;
}

Settings
{
  "compilerPath": "",
  "experimental": {},
  "isSystem": true,
  "optimizer": {
    "enabled": true,
    "mode": "3"
  },
  "outputSelection": {
    "*": {
      "*": [
        "abi"
      ]
    }
  }
}

Contract ABI

API
[{"inputs":[{"internalType":"bytes","name":"_context","type":"bytes"},{"components":[{"internalType":"uint256","name":"txType","type":"uint256"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"gasPerPubdataByteLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"uint256","name":"paymaster","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256[4]","name":"reserved","type":"uint256[4]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32[]","name":"factoryDeps","type":"bytes32[]"},{"internalType":"bytes","name":"paymasterInput","type":"bytes"},{"internalType":"bytes","name":"reservedDynamic","type":"bytes"}],"internalType":"struct Transaction","name":"_transaction","type":"tuple"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"enum ExecutionResult","name":"_txResult","type":"uint8"},{"internalType":"uint256","name":"_maxRefundedGas","type":"uint256"}],"name":"postTransaction","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"bytes32","name":"","type":"bytes32"},{"components":[{"internalType":"uint256","name":"txType","type":"uint256"},{"internalType":"uint256","name":"from","type":"uint256"},{"internalType":"uint256","name":"to","type":"uint256"},{"internalType":"uint256","name":"gasLimit","type":"uint256"},{"internalType":"uint256","name":"gasPerPubdataByteLimit","type":"uint256"},{"internalType":"uint256","name":"maxFeePerGas","type":"uint256"},{"internalType":"uint256","name":"maxPriorityFeePerGas","type":"uint256"},{"internalType":"uint256","name":"paymaster","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"uint256[4]","name":"reserved","type":"uint256[4]"},{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32[]","name":"factoryDeps","type":"bytes32[]"},{"internalType":"bytes","name":"paymasterInput","type":"bytes"},{"internalType":"bytes","name":"reservedDynamic","type":"bytes"}],"internalType":"struct Transaction","name":"_transaction","type":"tuple"}],"name":"validateAndPayForPaymasterTransaction","outputs":[{"internalType":"bytes4","name":"magic","type":"bytes4"},{"internalType":"bytes","name":"context","type":"bytes"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]

3cda33510000000000000000000000000000000000000000000000000000000000000000010000d56de48b30ab16cb298b67423444bf3f6ef1d70feb75c2dd2fb67c6fc600000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x000200000000000200090000000000020001000000010355000000800b0000390000004000b0043f00000000030100190000006003300270000000b2033001970000000102200190000000430000c13d000000040230008c0000004b0000413d000000000201043b000000e002200270000000b40420009c0000004f0000613d000000b50220009c000000630000c13d000000040230008a000000c00420008c000000630000413d0000000404100370000000000404043b000000b60540009c000000630000213d0000002305400039000000b706000041000000000735004b00000000070000190000000007068019000000b705500197000000000805004b0000000006008019000000b70550009c000000000607c019000000000506004b000000630000c13d0000000405400039000000000551034f000000000505043b000000b60650009c000000630000213d00000000045400190000002404400039000000000334004b000000630000213d0000002403100370000000000303043b000000b60430009c000000630000213d0000000002320049000000b703000041000002600420008c00000000040000190000000004034019000000b702200197000000000502004b000000000300a019000000b70220009c000000000304c019000000000203004b000000630000c13d0000008401100370000000000101043b000000010110008c000000630000213d0000004d0000013d0000000001000416000000000101004b000000630000c13d000000200100003900000100001004430000012000000443000000b301000041000002c50001042e000000000103004b000000630000c13d0000000001000019000002c50001042e000000040230008a000000600220008c000000630000413d0000004402100370000000000202043b000000b60420009c000000630000213d00000004042000390000000005430049000000b706000041000002600750008c00000000070000190000000007064019000000b708500197000000000908004b000000000600a019000000b70880009c000000000607c019000000000606004b000000650000613d0000000001000019000002c6000104300000000006000411000080010660008c000000990000c13d0000022406200039000000000661034f000000000606043b0000001f0550008a000000b707000041000000000856004b00000000080000190000000008078019000000b705500197000000b709600197000000000a59004b0000000007008019000000000559013f000000b70550009c000000000708c019000000000507004b000000630000c13d0000000004460019000000000541034f000000000505043b000000b60650009c000000630000213d00000000065300490000002003400039000000b707000041000000000863004b00000000080000190000000008072019000000b706600197000000b709300197000000000a69004b0000000007008019000000000669013f000000b70660009c000000000708c019000000000607004b000000630000c13d000000030650008c000000a50000213d000000b801000041000000800010043f0000002001000039000000840010043f0000003a01000039000000a40010043f000000d201000041000000c40010043f000000d301000041000000a20000013d000000b801000041000000800010043f0000002001000039000000840010043f0000002601000039000000a40010043f000000b901000041000000c40010043f000000ba01000041000000e40010043f000000bb01000041000002c600010430000000000631034f000000000606043b000000bc06600197000000bd0660009c000000dd0000c13d000000040550008a000000600650008c000000630000413d0000000403300039000000000631034f000000000606043b000900000006001d000000c00660009c000000630000213d0000004006300039000000000661034f0000002003300039000000000331034f000000000303043b000800000003001d000000000306043b000000b60630009c000000630000213d0000002406400039000000000465001900000000056300190000001f03500039000000b706000041000000000743004b00000000070000190000000007068019000000b703300197000000b708400197000000000983004b0000000006008019000000000383013f000000b70330009c000000000607c019000000000306004b000000630000c13d00070000000b001d000000000351034f000000000303043b000000c10630009c000000d70000813d000000bf063000390006002000000092000000060660017f000000b60760009c000000e70000a13d000000c40100004100000000001004350000004101000039000000040010043f000000c501000041000002c600010430000000b801000041000000800010043f0000002001000039000000840010043f0000001a01000039000000a40010043f000000be01000041000000c40010043f000000bf01000041000002c600010430000000400060043f000000800030043f00000020055000390000000006530019000000000446004b000000630000213d000000000451034f0000001f0530018f0000000506300272000000fa0000613d00000000070000190000000508700210000000000984034f000000000909043b000000a00880003900000000009804350000000107700039000000000867004b000000f20000413d000000000705004b000001090000613d0000000506600210000000000464034f0000000305500210000000a006600039000000000706043300000000075701cf000000000757022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000474019f0000000000460435000000a0033000390000000000030435000300240020003d0000000301100360000000000101043b000000400400043d000000c20200004100000000002404350000000002000410000000c0032001970000002402400039000100000003001d0000000000320435000000c002100197000500000004001d0000000401400039000200000002001d000000000021043500000000010004140000000902000029000000040220008c000001240000c13d0000000003000031000000200130008c00000000040300190000002004008039000001550000013d000000b202000041000000b20310009c00000000010280190000000504000029000000b20340009c00000000020440190000004002200210000000c001100210000000000121019f000000c3011001c7000000090200002902c402bf0000040f000000050a00002900000000030100190000006003300270000000b203300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000001430000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b0000013b0000413d000000000705004b000001520000613d0000000506600210000000000761034f00000005066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00000001022001900000017d0000613d0000001f01400039000000600110018f0000000504100029000000000214004b00000000020000190000000102004039000400000004001d000000b60440009c000000d70000213d0000000102200190000000d70000c13d0000000402000029000000400020043f000000200230008c000000630000413d00000005020000290000000002020433000000080220006c000001a00000813d00000004030000290000006401300039000000d00200004100000000002104350000004401300039000000d1020000410000000000210435000000240130003900000029020000390000000000210435000000b8010000410000000000130435000000040130003900000020020000390000000000210435000000b201000041000000b20230009c00000000030180190000004001300210000000cc011001c7000002c600010430000000400200043d0000001f0430018f00000005053002720000018a0000613d000000000600001900000005076002100000000008720019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b000001820000413d000000000604004b000001990000613d0000000505500210000000000151034f00000000055200190000000304400210000000000605043300000000064601cf000000000646022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000161019f0000000000150435000000b201000041000000b20420009c000000000201801900000040012002100000006002300210000000000121019f000002c60001043000000003060000290000004002600039000000010520036700000080026000390000000102200367000000000202043b000000000405043b00050000502400ad000000000504004b000001ad0000613d00000005544000f9000000000224004b0000020b0000c13d0000000404000029000000240240003900000001050000290000000000520435000000c6020000410000000000240435000000040240003900000002050000290000000000520435000000440240003900000008040000290000000000420435000000c705000041000000050240006c0000000005004019000800000005001d00000000020004140000000904000029000000040440008c000001f40000613d000000b201000041000000b20320009c00000000020180190000000404000029000000b20340009c00000000010440190000004001100210000000c002200210000000000112019f000000c8011001c7000000090200002902c402ba0000040f000000040a00002900000000030100190000006003300270000000b203300197000000200430008c000000000403001900000020040080390000001f0540018f0000000506400272000001e00000613d0000000007000019000000050870021000000000098a0019000000000881034f000000000808043b00000000008904350000000107700039000000000867004b000001d80000413d000000000705004b000001ef0000613d0000000506600210000000000761034f00000004066000290000000305500210000000000806043300000000085801cf000000000858022f000000000707043b0000010005500089000000000757022f00000000055701cf000000000585019f0000000000560435000000000003001f00000001022001900000020f0000613d0000001f01400039000000600110018f0000000401100029000000b60210009c000000d70000213d000000400010043f000000200130008c000000630000413d00000004010000290000000001010433000000000201004b0000000002000019000000010200c039000000000121004b000000630000c13d000000b2010000410000000002000414000000b20320009c0000000002018019000000c001200210000000050200006b000002500000c13d000080010200003902c402ba0000040f000002560000013d000000c40100004100000000001004350000001101000039000000da0000013d0000006002000039000000000403004b0000021f0000c13d0000000001020433000000050210008c000002490000413d000000b202000041000000b20310009c00000000010280190000000704000029000000b20340009c000000000402801900000040024002100000006001100210000000000121019f000002c6000104300000003f02300039000000c904200197000000400200043d0000000004420019000000000524004b00000000050000190000000105004039000000b60640009c000000d70000213d0000000105500190000000d70000c13d000000400040043f0000001f0430018f00000000083204360000000503300272000002380000613d000000000500001900000005065002100000000007680019000000000661034f000000000606043b00000000006704350000000105500039000000000635004b000002300000413d000700000008001d000000000504004b000002120000613d0000000503300210000000000131034f00000007033000290000000304400210000000000503043300000000054501cf000000000545022f000000000101043b0000010004400089000000000141022f00000000014101cf000000000151019f0000000000130435000002120000013d000000400100043d0000006402100039000000ca0300004100000000003204350000004402100039000000cb03000041000002ab0000013d000000cd011001c7000080090200003900008001040000390000000503000029000000000500001902c402ba0000040f00000000030100190000006003300270000000b20030019d000000b205300198000002830000613d0000003f03500039000000c903300197000000400400043d0000000003340019000000000643004b00000000060000190000000106004039000000b60730009c000000d70000213d0000000106600190000000d70000c13d000000400030043f0000001f0350018f00000000045404360000000505500272000002740000613d000000000600001900000005076002100000000008740019000000000771034f000000000707043b00000000007804350000000106600039000000000756004b0000026c0000413d000000000603004b000002830000613d0000000505500210000000000151034f00000000045400190000000303300210000000000504043300000000053501cf000000000535022f000000000101043b0000010003300089000000000131022f00000000013101cf000000000151019f0000000000140435000000400100043d0000000102200190000002a60000613d000000200210003900000040030000390000000000320435000000080200002900000000002104350000004003100039000000600200043d00000000002304350000006003100039000000000402004b000002990000613d000000000400001900000000053400190000008006400039000000000606043300000000006504350000002004400039000000000524004b000002920000413d000000000332001900000000000304350000007f02200039000000060220017f000000b203000041000000b20420009c0000000002038019000000b20410009c000000000103801900000040011002100000006002200210000000000112019f000002c50001042e0000006402100039000000ce0300004100000000003204350000004402100039000000cf03000041000000000032043500000024021000390000002a030000390000000000320435000000b8020000410000000000210435000000040210003900000020030000390000000000320435000000b202000041000000b20310009c00000000010280190000004001100210000000cc011001c7000002c600010430000002bd002104210000000102000039000000000001042d0000000002000019000000000001042d000002c2002104230000000102000039000000000001042d0000000002000019000000000001042d000002c400000432000002c50001042e000002c600010430000000000000000000000000000000000000000000000000000000000000000000000000ffffffff000000020000000000000000000000000000004000000100000000000000000000000000000000000000000000000000000000000000000000000000038a24bc00000000000000000000000000000000000000000000000000000000817b17f0000000000000000000000000000000000000000000000000ffffffffffffffff800000000000000000000000000000000000000000000000000000000000000008c379a0000000000000000000000000000000000000000000000000000000004f6e6c7920626f6f746c6f616465722063616e2063616c6c207468697320636f6e747261637400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000084000000800000000000000000ffffffff00000000000000000000000000000000000000000000000000000000949431dc00000000000000000000000000000000000000000000000000000000556e737570706f72746564207061796d617374657220666c6f770000000000000000000000000000000000000000000000000064000000800000000000000000000000000000000000000000ffffffffffffffffffffffffffffffffffffffff0000000000000000000000000000000000000000000000010000000000000000dd62ed3e0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000440000000000000000000000004e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000023b872dd00000000000000000000000000000000000000000000000000000000038a24bc00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006400000000000000000000000000000000000000000000000000000000000000000000000000000001ffffffe07327206163636f756e74000000000000000000000000000000000000000000004661696c656420746f207472616e7366657246726f6d2066726f6d207573657200000000000000000000000000000000000000840000000000000000000000000200000000000000000000000000000000000000000000000000000000000000626f6f746c6f61646572000000000000000000000000000000000000000000004661696c656420746f207472616e736665722066756e647320746f2074686520616c6c6f77616e63650000000000000000000000000000000000000000000000546865207573657220646964206e6f742070726f7669646520656e6f75676820546865207374616e64617264207061796d617374657220696e707574206d757374206265206174206c656173742034206279746573206c6f6e67000000000000b0960a96ba306890fc3c3af6461cb5342452d854f6c8b2df60162b632f9fdd65

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
0xBE80EAE2a968C257a0Dc965C59d19606Df0Fb518
Loading...
Loading
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.