ETH Price: $2,053.99 (-1.94%)
 

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To
Accept Ownership1464393112026-01-15 11:43:1925 days ago1768477399IN
0x9119A150...8337AfA18
0 ETH0.0000000051470.00010179
Transfer Ownersh...1464391542026-01-15 11:38:0525 days ago1768477085IN
0x9119A150...8337AfA18
0 ETH0.0000000074470.00010186

Advanced mode:
Parent Transaction Hash Block From To
View All Internal Transactions

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MockKeystoneForwarder

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;

import {IReceiver} from "./interfaces/IReceiver.sol";
import {IRouter} from "./interfaces/IRouter.sol";
import {ITypeAndVersion} from "../shared/interfaces/ITypeAndVersion.sol";

import {OwnerIsCreator} from "../shared/access/OwnerIsCreator.sol";

/// @notice Simplified mock version of KeystoneForwarder for testing purposes.
/// The report function is permissionless and skips all validations.
contract MockKeystoneForwarder is OwnerIsCreator, ITypeAndVersion, IRouter {
  /// @notice This error is returned when the report is shorter than REPORT_METADATA_LENGTH,
  /// which is the minimum length of a report.
  error InvalidReport();

  struct Transmission {
    address transmitter;
    // This is true if the receiver is not a contract or does not implement the `IReceiver` interface.
    bool invalidReceiver;
    // Whether the transmission attempt was successful. If `false`, the transmission can be retried
    // with an increased gas limit.
    bool success;
    // The amount of gas allocated for the `IReceiver.onReport` call. uint80 allows storing gas for known EVM block
    // gas limits. Ensures that the minimum gas requested by the user is available during the transmission attempt.
    // If the transmission fails (indicated by a `false` success state), it can be retried with an increased gas limit.
    uint80 gasLimit;
  }

  /// @notice Emitted when a report is processed
  /// @param result The result of the attempted delivery. True if successful.
  event ReportProcessed(
    address indexed receiver,
    bytes32 indexed workflowExecutionId,
    bytes2 indexed reportId,
    bool result
  );

  string public constant override typeAndVersion = "MockKeystoneForwarder 1.0.0";

  constructor() OwnerIsCreator() {
    s_forwarders[address(this)] = true;
  }

  uint256 internal constant METADATA_LENGTH = 109;
  uint256 internal constant FORWARDER_METADATA_LENGTH = 45;

  /// @dev This is the gas required to store `success` after the report is processed.
  /// It is a warm storage write because of the packed struct. In practice it will cost less.
  uint256 internal constant INTERNAL_GAS_REQUIREMENTS_AFTER_REPORT = 5_000;
  /// @dev This is the gas required to store the transmission struct and perform other checks.
  uint256 internal constant INTERNAL_GAS_REQUIREMENTS = 25_000 + INTERNAL_GAS_REQUIREMENTS_AFTER_REPORT;
  /// @dev This is the minimum gas required to route a report. This includes internal gas requirements
  /// as well as the minimum gas that the user contract will receive. 30k * 3 gas is to account for
  /// cases where consumers need close to the 30k limit provided in the supportsInterface check.
  uint256 internal constant MINIMUM_GAS_LIMIT = INTERNAL_GAS_REQUIREMENTS + 30_000 * 3 + 10_000;

  // ================================================================
  // │                          Router                              │
  // ================================================================

  mapping(address forwarder => bool isForwarder) internal s_forwarders;
  mapping(bytes32 transmissionId => Transmission transmission) internal s_transmissions;

  function addForwarder(address forwarder) external onlyOwner {
    s_forwarders[forwarder] = true;
    emit ForwarderAdded(forwarder);
  }

  function removeForwarder(address forwarder) external onlyOwner {
    s_forwarders[forwarder] = false;
    emit ForwarderRemoved(forwarder);
  }

  function route(
    bytes32 transmissionId,
    address transmitter,
    address receiver,
    bytes calldata metadata,
    bytes calldata validatedReport
  ) public returns (bool) {
    s_transmissions[transmissionId].transmitter = transmitter;
    s_transmissions[transmissionId].gasLimit = uint80(gasleft());

    // Always call onReport on the receiver
    bool success;
    bytes memory payload = abi.encodeCall(IReceiver.onReport, (metadata, validatedReport));

    assembly {
      // call and return whether we succeeded. ignore return data
      // call(gas,addr,value,argsOffset,argsLength,retOffset,retLength)
      success := call(gas(), receiver, 0, add(payload, 0x20), mload(payload), 0x0, 0x0)
    }

    s_transmissions[transmissionId].success = success;
    return success;
  }

  function getTransmissionId(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) public pure returns (bytes32) {
    // This is slightly cheaper compared to `keccak256(abi.encode(receiver, workflowExecutionId, reportId));`
    return keccak256(bytes.concat(bytes20(uint160(receiver)), workflowExecutionId, reportId));
  }

  function getTransmissionInfo(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) external view returns (TransmissionInfo memory) {
    bytes32 transmissionId = getTransmissionId(receiver, workflowExecutionId, reportId);

    Transmission memory transmission = s_transmissions[transmissionId];

    TransmissionState state;

    if (transmission.transmitter == address(0)) {
      state = IRouter.TransmissionState.NOT_ATTEMPTED;
    } else if (transmission.invalidReceiver) {
      state = IRouter.TransmissionState.INVALID_RECEIVER;
    } else {
      state = transmission.success ? IRouter.TransmissionState.SUCCEEDED : IRouter.TransmissionState.FAILED;
    }

    return
      TransmissionInfo({
        gasLimit: transmission.gasLimit,
        invalidReceiver: transmission.invalidReceiver,
        state: state,
        success: transmission.success,
        transmissionId: transmissionId,
        transmitter: transmission.transmitter
      });
  }

  /// @notice Get transmitter of a given report or 0x0 if it wasn't transmitted yet
  function getTransmitter(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) external view returns (address) {
    return s_transmissions[getTransmissionId(receiver, workflowExecutionId, reportId)].transmitter;
  }

  function isForwarder(address forwarder) external view returns (bool) {
    return s_forwarders[forwarder];
  }

  // ================================================================
  // │                          Forwarder                          │
  // ================================================================

  /// @notice Simplified permissionless report function that skips all validations
  /// and does not call onReport on consumer contracts
  function report(
    address receiver,
    bytes calldata rawReport,
    bytes calldata reportContext,
    bytes[] calldata signatures
  ) external {
    if (rawReport.length < METADATA_LENGTH) {
      revert InvalidReport();
    }

    bytes32 workflowExecutionId;
    bytes2 reportId;
    {
      uint64 configId;
      (workflowExecutionId, configId, reportId) = _getMetadata(rawReport);
    }

    // Skip all validations and signature checks
    // Skip onReport call to consumer contracts
    bool success = this.route(
      getTransmissionId(receiver, workflowExecutionId, reportId),
      msg.sender,
      receiver,
      rawReport[FORWARDER_METADATA_LENGTH:METADATA_LENGTH],
      rawReport[METADATA_LENGTH:]
    );

    emit ReportProcessed(receiver, workflowExecutionId, reportId, success);
  }

  // solhint-disable-next-line chainlink-solidity/explicit-returns
  function _getMetadata(
    bytes memory rawReport
  ) internal pure returns (bytes32 workflowExecutionId, uint64 configId, bytes2 reportId) {
    // (first 32 bytes of memory contain length of the report)
    // version                offset  32, size  1
    // workflow_execution_id  offset  33, size 32
    // timestamp              offset  65, size  4
    // don_id                 offset  69, size  4
    // don_config_version,    offset  73, size  4
    // workflow_cid           offset  77, size 32
    // workflow_name          offset 109, size 10
    // workflow_owner         offset 119, size 20
    // report_id              offset 139, size  2
    assembly {
      workflowExecutionId := mload(add(rawReport, 33))
      // shift right by 24 bytes to get the combined don_id and don_config_version
      configId := shr(mul(24, 8), mload(add(rawReport, 69)))
      reportId := mload(add(rawReport, 139))
    }
  }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IERC165} from "@openzeppelin/[email protected]/utils/introspection/IERC165.sol";

/// @title IReceiver - receives keystone reports
/// @notice Implementations must support the IReceiver interface through ERC165.
interface IReceiver is IERC165 {
  /// @notice Handles incoming keystone reports.
  /// @dev If this function call reverts, it can be retried with a higher gas
  /// limit. The receiver is responsible for discarding stale reports.
  /// @param metadata Report's metadata.
  /// @param report Workflow report.
  function onReport(bytes calldata metadata, bytes calldata report) external;
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

/// @title IRouter - delivers keystone reports to receiver
interface IRouter {
  error UnauthorizedForwarder();
  /// @dev Thrown when the gas limit is insufficient for handling state after
  /// calling the receiver function.
  error InsufficientGasForRouting(bytes32 transmissionId);
  error AlreadyAttempted(bytes32 transmissionId);

  event ForwarderAdded(address indexed forwarder);
  event ForwarderRemoved(address indexed forwarder);

  enum TransmissionState {
    NOT_ATTEMPTED,
    SUCCEEDED,
    INVALID_RECEIVER,
    FAILED
  }

  struct TransmissionInfo {
    bytes32 transmissionId;
    TransmissionState state;
    address transmitter;
    // This is true if the receiver is not a contract or does not implement the
    // `IReceiver` interface.
    bool invalidReceiver;
    // Whether the transmission attempt was successful. If `false`, the
    // transmission can be retried with an increased gas limit.
    bool success;
    // The amount of gas allocated for the `IReceiver.onReport` call. uint80
    // allows storing gas for known EVM block gas limits.
    // Ensures that the minimum gas requested by the user is available during
    // the transmission attempt. If the transmission fails (indicated by a
    // `false` success state), it can be retried with an increased gas limit.
    uint80 gasLimit;
  }

  function addForwarder(
    address forwarder
  ) external;
  function removeForwarder(
    address forwarder
  ) external;

  function route(
    bytes32 transmissionId,
    address transmitter,
    address receiver,
    bytes calldata metadata,
    bytes calldata report
  ) external returns (bool);

  function getTransmissionId(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) external pure returns (bytes32);
  function getTransmissionInfo(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) external view returns (TransmissionInfo memory);
  function getTransmitter(
    address receiver,
    bytes32 workflowExecutionId,
    bytes2 reportId
  ) external view returns (address);
}

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

interface ITypeAndVersion {
  function typeAndVersion() external pure returns (string memory);
}

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

import {ConfirmedOwner} from "./ConfirmedOwner.sol";

/// @title The OwnerIsCreator contract
/// @notice A contract with helpers for basic contract ownership.
contract OwnerIsCreator is ConfirmedOwner {
  constructor() ConfirmedOwner(msg.sender) {}
}

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

File 7 of 9 : ConfirmedOwner.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {ConfirmedOwnerWithProposal} from "./ConfirmedOwnerWithProposal.sol";

/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwner is ConfirmedOwnerWithProposal {
  constructor(
    address newOwner
  ) ConfirmedOwnerWithProposal(newOwner, address(0)) {}
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import {IOwnable} from "../interfaces/IOwnable.sol";

/// @title The ConfirmedOwner contract
/// @notice A contract with helpers for basic contract ownership.
contract ConfirmedOwnerWithProposal is IOwnable {
  address private s_owner;
  address private s_pendingOwner;

  event OwnershipTransferRequested(address indexed from, address indexed to);
  event OwnershipTransferred(address indexed from, address indexed to);

  constructor(address newOwner, address pendingOwner) {
    // solhint-disable-next-line gas-custom-errors
    require(newOwner != address(0), "Cannot set owner to zero");

    s_owner = newOwner;
    if (pendingOwner != address(0)) {
      _transferOwnership(pendingOwner);
    }
  }

  /// @notice Allows an owner to begin transferring ownership to a new address.
  function transferOwnership(
    address to
  ) public override onlyOwner {
    _transferOwnership(to);
  }

  /// @notice Allows an ownership transfer to be completed by the recipient.
  function acceptOwnership() external override {
    // solhint-disable-next-line gas-custom-errors
    require(msg.sender == s_pendingOwner, "Must be proposed owner");

    address oldOwner = s_owner;
    s_owner = msg.sender;
    s_pendingOwner = address(0);

    emit OwnershipTransferred(oldOwner, msg.sender);
  }

  /// @notice Get the current owner
  function owner() public view override returns (address) {
    return s_owner;
  }

  /// @notice validate, transfer ownership, and emit relevant events
  function _transferOwnership(
    address to
  ) private {
    // solhint-disable-next-line gas-custom-errors
    require(to != msg.sender, "Cannot transfer to self");

    s_pendingOwner = to;

    emit OwnershipTransferRequested(s_owner, to);
  }

  /// @notice validate access
  function _validateOwnership() internal view {
    // solhint-disable-next-line gas-custom-errors
    require(msg.sender == s_owner, "Only callable by owner");
  }

  /// @notice Reverts if called by anyone other than the contract owner.
  modifier onlyOwner() {
    _validateOwnership();
    _;
  }
}

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

interface IOwnable {
  function owner() external returns (address);

  function transferOwnership(
    address recipient
  ) external;

  function acceptOwnership() external;
}

Settings
{
  "remappings": [
    "forge-std/=src/v0.8/vendor/forge-std/src/",
    "@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.7.3/",
    "@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.8.3/",
    "@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-4.9.6/",
    "@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-5.0.2/",
    "@openzeppelin/[email protected]/=node_modules/@openzeppelin/contracts-5.1.0/",
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@arbitrum/=node_modules/@arbitrum/",
    "hardhat/=node_modules/hardhat/",
    "@eth-optimism/=node_modules/@eth-optimism/",
    "@scroll-tech/=node_modules/@scroll-tech/",
    "@zksync/=node_modules/@zksync/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"}],"name":"AlreadyAttempted","type":"error"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"}],"name":"InsufficientGasForRouting","type":"error"},{"inputs":[],"name":"InvalidReport","type":"error"},{"inputs":[],"name":"UnauthorizedForwarder","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"forwarder","type":"address"}],"name":"ForwarderAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"forwarder","type":"address"}],"name":"ForwarderRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferRequested","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"receiver","type":"address"},{"indexed":true,"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"indexed":true,"internalType":"bytes2","name":"reportId","type":"bytes2"},{"indexed":false,"internalType":"bool","name":"result","type":"bool"}],"name":"ReportProcessed","type":"event"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"addForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmissionId","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmissionInfo","outputs":[{"components":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"},{"internalType":"enum IRouter.TransmissionState","name":"state","type":"uint8"},{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"bool","name":"invalidReceiver","type":"bool"},{"internalType":"bool","name":"success","type":"bool"},{"internalType":"uint80","name":"gasLimit","type":"uint80"}],"internalType":"struct IRouter.TransmissionInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes32","name":"workflowExecutionId","type":"bytes32"},{"internalType":"bytes2","name":"reportId","type":"bytes2"}],"name":"getTransmitter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"removeForwarder","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"rawReport","type":"bytes"},{"internalType":"bytes","name":"reportContext","type":"bytes"},{"internalType":"bytes[]","name":"signatures","type":"bytes[]"}],"name":"report","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"transmissionId","type":"bytes32"},{"internalType":"address","name":"transmitter","type":"address"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"bytes","name":"metadata","type":"bytes"},{"internalType":"bytes","name":"validatedReport","type":"bytes"}],"name":"route","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"typeAndVersion","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

608060405234801561000f575f80fd5b5033805f816100655760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420736574206f776e657220746f207a65726f000000000000000060448201526064015b60405180910390fd5b5f80546001600160a01b0319166001600160a01b038481169190911790915581161561009457610094816100b5565b5050305f908152600260205260409020805460ff191660011790555061015d565b336001600160a01b0382160361010d5760405162461bcd60e51b815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c66000000000000000000604482015260640161005c565b600180546001600160a01b0319166001600160a01b038381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b6111b18061016a5f395ff3fe608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80635c41d2fe1161007d5780638da5cb5b116100585780638da5cb5b14610321578063abcef5541461033e578063f2fde38b14610376575f80fd5b80635c41d2fe1461022e57806379ba5097146102415780638864b86414610249575f80fd5b8063272cbd93116100ad578063272cbd931461015d578063354bdd661461017d5780634d93172d1461021b575f80fd5b806311289565146100d3578063181f5a77146100e8578063233fd52d1461013a575b5f80fd5b6100e66100e1366004610d4b565b610389565b005b6101246040518060400160405280601b81526020017f4d6f636b4b657973746f6e65466f7277617264657220312e302e30000000000081525081565b6040516101319190610e2c565b60405180910390f35b61014d610148366004610e7f565b61059e565b6040519015158152602001610131565b61017061016b366004610f18565b61073c565b6040516101319190610fa6565b61020d61018b366004610f18565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603481018390527fffff000000000000000000000000000000000000000000000000000000000000821660548201525f906056016040516020818303038152906040528051906020012090509392505050565b604051908152602001610131565b6100e6610229366004611054565b61093f565b6100e661023c366004611054565b6109ba565b6100e6610a38565b6102fc610257366004610f18565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208086019190915260348501939093527fffff00000000000000000000000000000000000000000000000000000000000091909116605484015280516036818503018152605690930181528251928201929092205f9081526003909152205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b5f5473ffffffffffffffffffffffffffffffffffffffff166102fc565b61014d61034c366004611054565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b6100e6610384366004611054565b610b39565b606d8510156103c4576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f61040589898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b4d92505050565b6040805160608f901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018690527fffff00000000000000000000000000000000000000000000000000000000000084166054830152825160368184030181526056909201909252805191012092955093505f9250309163233fd52d9150338d8d8d602d90606d926104a693929190611074565b8f8f606d9080926104b993929190611074565b6040518863ffffffff1660e01b81526004016104db97969594939291906110e2565b6020604051808303815f875af11580156104f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051b9190611154565b9050817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838b73ffffffffffffffffffffffffffffffffffffffff167f3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b58460405161058a911515815260200190565b60405180910390a450505050505050505050565b5f87815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555a5f89815260036020526040808220805469ffffffffffffffffffff949094167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff909416939093179092559051819061065b908890889088908890602401611173565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f805f21320000000000000000000000000000000000000000000000000000000017815281519192505f918291828c5af15f9a8b5260036020526040909a2080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000008c151502179055509798975050505050505050565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905284519088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152603481018790527fffff000000000000000000000000000000000000000000000000000000000000861660548201528451603681830301815260568201808752815191840191909120808552600390935285842060d68301909652945473ffffffffffffffffffffffffffffffffffffffff811680875274010000000000000000000000000000000000000000820460ff9081161515607685015275010000000000000000000000000000000000000000008304161515609684015276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660b6909201919091529293909290919061089857505f6108c0565b8160200151156108aa575060026108c0565b81604001516108ba5760036108bd565b60015b90505b6040518060c001604052808481526020018260038111156108e3576108e3610f79565b8152602001835f015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015115158152602001836040015115158152602001836060015169ffffffffffffffffffff1681525093505050509392505050565b610947610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d389190a250565b6109c2610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e79190a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b41610b68565b610b4a81610bea565b50565b60218101516045820151608b90920151909260c09290921c91565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ab5565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610c69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ab5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d01575f80fd5b919050565b5f8083601f840112610d16575f80fd5b50813567ffffffffffffffff811115610d2d575f80fd5b602083019150836020828501011115610d44575f80fd5b9250929050565b5f805f805f805f6080888a031215610d61575f80fd5b610d6a88610cde565b9650602088013567ffffffffffffffff811115610d85575f80fd5b610d918a828b01610d06565b909750955050604088013567ffffffffffffffff811115610db0575f80fd5b610dbc8a828b01610d06565b909550935050606088013567ffffffffffffffff811115610ddb575f80fd5b8801601f81018a13610deb575f80fd5b803567ffffffffffffffff811115610e01575f80fd5b8a60208260051b8401011115610e15575f80fd5b602082019350809250505092959891949750929550565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f805f805f60a0888a031215610e95575f80fd5b87359650610ea560208901610cde565b9550610eb360408901610cde565b9450606088013567ffffffffffffffff811115610ece575f80fd5b610eda8a828b01610d06565b909550935050608088013567ffffffffffffffff811115610ef9575f80fd5b610f058a828b01610d06565b989b979a50959850939692959293505050565b5f805f60608486031215610f2a575f80fd5b610f3384610cde565b92506020840135915060408401357fffff00000000000000000000000000000000000000000000000000000000000081168114610f6e575f80fd5b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81518152602082015160c082019060048110610fe9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8060208401525073ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015115156060830152608083015161102f608084018215159052565b5060a083015161104d60a084018269ffffffffffffffffffff169052565b5092915050565b5f60208284031215611064575f80fd5b61106d82610cde565b9392505050565b5f8085851115611082575f80fd5b8386111561108e575f80fd5b5050820193919092039150565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015273ffffffffffffffffffffffffffffffffffffffff8616604082015260a060608201525f61113360a08301868861109b565b828103608084015261114681858761109b565b9a9950505050505050505050565b5f60208284031215611164575f80fd5b8151801515811461106d575f80fd5b604081525f61118660408301868861109b565b828103602084015261119981858761109b565b97965050505050505056fea164736f6c634300081a000a

Deployed Bytecode

0x608060405234801561000f575f80fd5b50600436106100cf575f3560e01c80635c41d2fe1161007d5780638da5cb5b116100585780638da5cb5b14610321578063abcef5541461033e578063f2fde38b14610376575f80fd5b80635c41d2fe1461022e57806379ba5097146102415780638864b86414610249575f80fd5b8063272cbd93116100ad578063272cbd931461015d578063354bdd661461017d5780634d93172d1461021b575f80fd5b806311289565146100d3578063181f5a77146100e8578063233fd52d1461013a575b5f80fd5b6100e66100e1366004610d4b565b610389565b005b6101246040518060400160405280601b81526020017f4d6f636b4b657973746f6e65466f7277617264657220312e302e30000000000081525081565b6040516101319190610e2c565b60405180910390f35b61014d610148366004610e7f565b61059e565b6040519015158152602001610131565b61017061016b366004610f18565b61073c565b6040516101319190610fa6565b61020d61018b366004610f18565b6040517fffffffffffffffffffffffffffffffffffffffff000000000000000000000000606085901b166020820152603481018390527fffff000000000000000000000000000000000000000000000000000000000000821660548201525f906056016040516020818303038152906040528051906020012090509392505050565b604051908152602001610131565b6100e6610229366004611054565b61093f565b6100e661023c366004611054565b6109ba565b6100e6610a38565b6102fc610257366004610f18565b6040805160609490941b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660208086019190915260348501939093527fffff00000000000000000000000000000000000000000000000000000000000091909116605484015280516036818503018152605690930181528251928201929092205f9081526003909152205473ffffffffffffffffffffffffffffffffffffffff1690565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610131565b5f5473ffffffffffffffffffffffffffffffffffffffff166102fc565b61014d61034c366004611054565b73ffffffffffffffffffffffffffffffffffffffff165f9081526002602052604090205460ff1690565b6100e6610384366004611054565b610b39565b606d8510156103c4576040517fb55ac75400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f805f61040589898080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610b4d92505050565b6040805160608f901b7fffffffffffffffffffffffffffffffffffffffff00000000000000000000000016602080830191909152603482018690527fffff00000000000000000000000000000000000000000000000000000000000084166054830152825160368184030181526056909201909252805191012092955093505f9250309163233fd52d9150338d8d8d602d90606d926104a693929190611074565b8f8f606d9080926104b993929190611074565b6040518863ffffffff1660e01b81526004016104db97969594939291906110e2565b6020604051808303815f875af11580156104f7573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061051b9190611154565b9050817dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916838b73ffffffffffffffffffffffffffffffffffffffff167f3617b009e9785c42daebadb6d3fb553243a4bf586d07ea72d65d80013ce116b58460405161058a911515815260200190565b60405180910390a450505050505050505050565b5f87815260036020526040812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff89161790555a5f89815260036020526040808220805469ffffffffffffffffffff949094167601000000000000000000000000000000000000000000000275ffffffffffffffffffffffffffffffffffffffffffff909416939093179092559051819061065b908890889088908890602401611173565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f805f21320000000000000000000000000000000000000000000000000000000017815281519192505f918291828c5af15f9a8b5260036020526040909a2080547fffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffffff1675010000000000000000000000000000000000000000008c151502179055509798975050505050505050565b6040805160c0810182525f808252602080830182905282840182905260608084018390526080840183905260a0840183905284519088901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001681830152603481018790527fffff000000000000000000000000000000000000000000000000000000000000861660548201528451603681830301815260568201808752815191840191909120808552600390935285842060d68301909652945473ffffffffffffffffffffffffffffffffffffffff811680875274010000000000000000000000000000000000000000820460ff9081161515607685015275010000000000000000000000000000000000000000008304161515609684015276010000000000000000000000000000000000000000000090910469ffffffffffffffffffff1660b6909201919091529293909290919061089857505f6108c0565b8160200151156108aa575060026108c0565b81604001516108ba5760036108bd565b60015b90505b6040518060c001604052808481526020018260038111156108e3576108e3610f79565b8152602001835f015173ffffffffffffffffffffffffffffffffffffffff168152602001836020015115158152602001836040015115158152602001836060015169ffffffffffffffffffff1681525093505050509392505050565b610947610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055517fb96d15bf9258c7b8df062753a6a262864611fc7b060a5ee2e57e79b85f898d389190a250565b6109c2610b68565b73ffffffffffffffffffffffffffffffffffffffff81165f8181526002602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055517f0ea0ce2c048ff45a4a95f2947879de3fb94abec2f152190400cab2d1272a68e79190a250565b60015473ffffffffffffffffffffffffffffffffffffffff163314610abe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4d7573742062652070726f706f736564206f776e65720000000000000000000060448201526064015b60405180910390fd5b5f8054337fffffffffffffffffffffffff00000000000000000000000000000000000000008083168217845560018054909116905560405173ffffffffffffffffffffffffffffffffffffffff90921692909183917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a350565b610b41610b68565b610b4a81610bea565b50565b60218101516045820151608b90920151909260c09290921c91565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610be8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f4f6e6c792063616c6c61626c65206279206f776e6572000000000000000000006044820152606401610ab5565b565b3373ffffffffffffffffffffffffffffffffffffffff821603610c69576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f43616e6e6f74207472616e7366657220746f2073656c660000000000000000006044820152606401610ab5565b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169182179092555f8054604051929316917fed8889f560326eb138920d842192f0eb3dd22b4f139c87a2c57538e05bae12789190a350565b803573ffffffffffffffffffffffffffffffffffffffff81168114610d01575f80fd5b919050565b5f8083601f840112610d16575f80fd5b50813567ffffffffffffffff811115610d2d575f80fd5b602083019150836020828501011115610d44575f80fd5b9250929050565b5f805f805f805f6080888a031215610d61575f80fd5b610d6a88610cde565b9650602088013567ffffffffffffffff811115610d85575f80fd5b610d918a828b01610d06565b909750955050604088013567ffffffffffffffff811115610db0575f80fd5b610dbc8a828b01610d06565b909550935050606088013567ffffffffffffffff811115610ddb575f80fd5b8801601f81018a13610deb575f80fd5b803567ffffffffffffffff811115610e01575f80fd5b8a60208260051b8401011115610e15575f80fd5b602082019350809250505092959891949750929550565b602081525f82518060208401528060208501604085015e5f6040828501015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011684010191505092915050565b5f805f805f805f60a0888a031215610e95575f80fd5b87359650610ea560208901610cde565b9550610eb360408901610cde565b9450606088013567ffffffffffffffff811115610ece575f80fd5b610eda8a828b01610d06565b909550935050608088013567ffffffffffffffff811115610ef9575f80fd5b610f058a828b01610d06565b989b979a50959850939692959293505050565b5f805f60608486031215610f2a575f80fd5b610f3384610cde565b92506020840135915060408401357fffff00000000000000000000000000000000000000000000000000000000000081168114610f6e575f80fd5b809150509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b81518152602082015160c082019060048110610fe9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b8060208401525073ffffffffffffffffffffffffffffffffffffffff6040840151166040830152606083015115156060830152608083015161102f608084018215159052565b5060a083015161104d60a084018269ffffffffffffffffffff169052565b5092915050565b5f60208284031215611064575f80fd5b61106d82610cde565b9392505050565b5f8085851115611082575f80fd5b8386111561108e575f80fd5b5050820193919092039150565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b87815273ffffffffffffffffffffffffffffffffffffffff8716602082015273ffffffffffffffffffffffffffffffffffffffff8616604082015260a060608201525f61113360a08301868861109b565b828103608084015261114681858761109b565b9a9950505050505050505050565b5f60208284031215611164575f80fd5b8151801515811461106d575f80fd5b604081525f61118660408301868861109b565b828103602084015261119981858761109b565b97965050505050505056fea164736f6c634300081a000a

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.