APE Price: $0.18 (-4.09%)

Contract

0x09B17667BD8Fd11102551b5C21715A5D5ea1459b

Overview

APE Balance

Apechain LogoApechain LogoApechain Logo0 APE

APE Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Block
From
To

There are no matching entries

1 Internal Transaction found.

Latest 1 internal transaction

Advanced mode:
Parent Transaction Hash Block From To
282260132025-11-17 18:33:1669 days ago1763404396  Contract Creation0 APE

Cross-Chain Transactions
Loading...
Loading

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

Contract Name:
HyperProver

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

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

import {IMessageRecipient} from "@hyperlane-xyz/core/contracts/interfaces/IMessageRecipient.sol";
import {TypeCasts} from "@hyperlane-xyz/core/contracts/libs/TypeCasts.sol";
import {MessageBridgeProver} from "./MessageBridgeProver.sol";
import {Semver} from "../libs/Semver.sol";
import {IMailbox, IPostDispatchHook} from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol";

/**
 * @title HyperProver
 * @notice Prover implementation using Hyperlane's cross-chain messaging system
 * @dev Processes proof messages from Hyperlane mailbox and records proven intents
 */
contract HyperProver is IMessageRecipient, MessageBridgeProver, Semver {
    using TypeCasts for bytes32;

    /**
     * @notice Struct for unpacked data from _data parameter
     * @dev Only contains fields decoded from the _data parameter
     */
    struct UnpackedData {
        bytes32 sourceChainProver; // Address of prover on source chain
        bytes metadata; // Metadata for Hyperlane message
        address hookAddr; // Address of post-dispatch hook
    }

    /**
     * @notice Struct for Hyperlane dispatch parameters
     * @dev Consolidates message dispatch parameters to reduce stack usage
     */
    struct DispatchParams {
        uint32 destinationDomain; // Hyperlane domain ID
        bytes32 recipientAddress; // Recipient address encoded as bytes32
        bytes messageBody; // Encoded message body with intent hashes and claimants
        bytes metadata; // Additional metadata for the message
        IPostDispatchHook hook; // Post-dispatch hook contract
    }

    /**
     * @notice Constant indicating this contract uses Hyperlane for proving
     */
    string public constant PROOF_TYPE = "Hyperlane";

    /**
     * @notice Address of local Hyperlane mailbox
     */
    address public immutable MAILBOX;

    /**
     * @param mailbox Address of local Hyperlane mailbox
     * @param portal Address of Portal contract
     * @param provers Array of trusted prover addresses (as bytes32 for cross-VM compatibility)
     */
    constructor(
        address mailbox,
        address portal,
        bytes32[] memory provers
    ) MessageBridgeProver(portal, provers, 0) {
        if (mailbox == address(0)) revert MailboxCannotBeZeroAddress();
        MAILBOX = mailbox;
    }

    /**
     * @notice Handles incoming Hyperlane messages containing proof data
     * @dev Processes batch updates to proven intents from valid sources
     * @param origin Origin chain ID from the source chain
     * @param sender Address that dispatched the message on source chain
     * @param messageBody Encoded array of intent hashes and claimants
     */
    function handle(
        uint32 origin,
        bytes32 sender,
        bytes calldata messageBody
    ) public payable only(MAILBOX) {
        // Verify origin and sender are valid
        if (origin == 0) revert ZeroDomainID();

        // Validate sender is not zero
        if (sender == bytes32(0)) revert SenderCannotBeZeroAddress();

        _handleCrossChainMessage(sender, messageBody);
    }

    /**
     * @notice Implementation of message dispatch for Hyperlane
     * @dev Called by base prove() function after common validations
     * @param domainID Domain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting
     * @param fee Fee amount for message dispatch
     */
    function _dispatchMessage(
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data,
        uint256 fee
    ) internal override {
        // Parse incoming data into a structured format for processing
        UnpackedData memory unpacked = _unpackData(data);

        // Prepare parameters for cross-chain message dispatch using a struct
        // to reduce stack usage and improve code maintainability
        DispatchParams memory params = _formatHyperlaneMessage(
            domainID,
            encodedProofs,
            unpacked
        );

        // Send the message through Hyperlane mailbox using params from the struct
        // Note: Some Hyperlane versions have different dispatch signatures.
        // This matches the expected signature for testing.
        IMailbox(MAILBOX).dispatch{value: fee}(
            params.destinationDomain,
            params.recipientAddress,
            params.messageBody,
            params.metadata,
            params.hook
        );
    }

    /**
     * @notice Calculates the fee required for Hyperlane message dispatch
     * @dev Queries the Mailbox contract for accurate fee estimation
     * @param domainID Domain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting
     * @return Fee amount required for message dispatch
     */
    function fetchFee(
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data
    ) public view override returns (uint256) {
        // Decode structured data from the raw input
        UnpackedData memory unpacked = _unpackData(data);

        // Process fee calculation using the decoded struct
        // This architecture separates decoding from core business logic
        return _fetchFee(domainID, encodedProofs, unpacked);
    }

    /**
     * @notice Decodes the raw cross-chain message data into a structured format
     * @dev Parses ABI-encoded parameters into the UnpackedData struct
     * @param data Raw message data containing source chain information
     * @return unpacked Structured representation of the decoded parameters
     */
    function _unpackData(
        bytes calldata data
    ) internal pure returns (UnpackedData memory unpacked) {
        unpacked = abi.decode(data, (UnpackedData));
    }

    /**
     * @notice Internal function to calculate the fee with pre-decoded data
     * @param domainID Domain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param unpacked Struct containing decoded data from data parameter
     * @return Fee amount required for message dispatch
     */
    function _fetchFee(
        uint64 domainID,
        bytes calldata encodedProofs,
        UnpackedData memory unpacked
    ) internal view returns (uint256) {
        // Format and prepare message parameters for dispatch
        DispatchParams memory params = _formatHyperlaneMessage(
            domainID,
            encodedProofs,
            unpacked
        );

        // Query Hyperlane mailbox for accurate fee estimate
        return
            IMailbox(MAILBOX).quoteDispatch(
                params.destinationDomain,
                params.recipientAddress,
                params.messageBody,
                params.metadata,
                params.hook
            );
    }

    /**
     * @notice Returns the proof type used by this prover
     * @return ProofType indicating Hyperlane proving mechanism
     */
    function getProofType() external pure override returns (string memory) {
        return PROOF_TYPE;
    }

    /**
     * @notice Formats data for Hyperlane message dispatch with encoded proofs
     * @dev Prepares all parameters needed for the Mailbox dispatch call
     * @param domainID Domain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param unpacked Struct containing decoded data from data parameter
     * @return params Structured dispatch parameters for Hyperlane message
     */
    function _formatHyperlaneMessage(
        uint64 domainID,
        bytes calldata encodedProofs,
        UnpackedData memory unpacked
    ) internal view returns (DispatchParams memory params) {
        // Convert domain ID to Hyperlane domain ID format with overflow check
        if (domainID > type(uint32).max) {
            revert DomainIdTooLarge(domainID);
        }
        params.destinationDomain = uint32(domainID);

        // Use the source chain prover address as the message recipient
        params.recipientAddress = unpacked.sourceChainProver;

        params.messageBody = encodedProofs;

        // Pass through metadata as provided
        params.metadata = unpacked.metadata;

        // Default to mailbox's hook if none provided, following Hyperlane best practices
        params.hook = (unpacked.hookAddr == address(0))
            ? IMailbox(MAILBOX).defaultHook()
            : IPostDispatchHook(unpacked.hookAddr);
    }
}

File 2 of 16 : IMessageRecipient.sol
// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;

interface IMessageRecipient {
    function handle(
        uint32 _origin,
        bytes32 _sender,
        bytes calldata _message
    ) external payable;
}

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;

library TypeCasts {
    // alignment preserving cast
    function addressToBytes32(address _addr) internal pure returns (bytes32) {
        return bytes32(uint256(uint160(_addr)));
    }

    // alignment preserving cast
    function bytes32ToAddress(bytes32 _buf) internal pure returns (address) {
        return address(uint160(uint256(_buf)));
    }
}

/* -*- c-basic-offset: 4 -*- */
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import {BaseProver} from "./BaseProver.sol";
import {IMessageBridgeProver} from "../interfaces/IMessageBridgeProver.sol";
import {Whitelist} from "../libs/Whitelist.sol";

/**
 * @title MessageBridgeProver
 * @notice Abstract contract for cross-chain message-based proving mechanisms
 * @dev Extends BaseProver with functionality for message bridge provers like Hyperlane and Metalayer
 */
abstract contract MessageBridgeProver is
    BaseProver,
    IMessageBridgeProver,
    Whitelist
{
    /**
     * @notice Minimum gas limit for cross-chain message dispatch
     * @dev Set at deployment and cannot be changed afterward. Gas limits below this value will be increased to this minimum.
     */
    uint256 public immutable MIN_GAS_LIMIT;

    /**
     * @notice Default minimum gas limit for cross-chain messages
     * @dev Used if no specific value is provided during contract deployment
     */
    uint256 private constant DEFAULT_MIN_GAS_LIMIT = 200_000;

    /**
     * @notice Initializes the MessageBridgeProver contract
     * @param portal Address of the Portal contract
     * @param provers Array of trusted prover addresses (as bytes32 for cross-VM compatibility)
     * @param minGasLimit Minimum gas limit for cross-chain messages (200k if not specified or zero)
     */
    constructor(
        address portal,
        bytes32[] memory provers,
        uint256 minGasLimit
    ) BaseProver(portal) Whitelist(provers) {
        MIN_GAS_LIMIT = minGasLimit > 0 ? minGasLimit : 200_000;
    }

    /**
     * @notice Modifier to restrict function access to a specific sender
     * @param expectedSender Address that is expected to be the sender
     */
    modifier only(address expectedSender) {
        if (msg.sender != expectedSender) {
            revert UnauthorizedSender(expectedSender, msg.sender);
        }

        _;
    }

    /**
     * @notice Send refund to the user if they've overpaid
     * @param recipient Address to send the refund to
     * @param amount Amount to refund
     */
    function _sendRefund(address recipient, uint256 amount) internal {
        if (recipient == address(0) || amount == 0) {
            return;
        }

        payable(recipient).transfer(amount);
    }

    /**
     * @notice Handles cross-chain messages containing proof data
     * @dev Common implementation to validate and process cross-chain messages
     * @param messageSender Address that dispatched the message on source chain (as bytes32 for cross-VM compatibility)
     * @param message Encoded message with chain ID prepended, followed by (intentHash, claimant) pairs
     */
    function _handleCrossChainMessage(
        bytes32 messageSender,
        bytes calldata message
    ) internal {
        // Verify dispatch originated from a whitelisted prover address
        if (!isWhitelisted(messageSender)) {
            revert UnauthorizedIncomingProof(messageSender);
        }

        // Extract the chain ID from the beginning of the message
        // Message format: [chainId (8 bytes as uint64)] + [encodedProofs]
        if (message.length < 8) {
            revert InvalidProofMessage();
        }

        // Convert raw 8 bytes to uint64 - the chain ID is stored as big-endian bytes
        bytes8 chainIdBytes = bytes8(message[0:8]);
        uint64 actualChainId = uint64(chainIdBytes);
        bytes calldata encodedProofs = message[8:];

        // Process the intent proofs using the chain ID extracted from the message
        _processIntentProofs(encodedProofs, actualChainId);
    }

    /**
     * @notice Common prove function implementation for message bridge provers
     * @dev Handles fee calculation, validation, and message dispatch
     * @param sender Address that initiated the proving request
     * @param domainID Bridge-specific domain ID of the source chain (where the intent was created).
     *        IMPORTANT: This is NOT the chain ID. Each bridge provider uses their own
     *        domain ID mapping system. You MUST check with the specific bridge provider
     *        (Hyperlane, LayerZero, Metalayer) documentation to determine the correct
     *        domain ID for the source chain.
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting
     */
    function prove(
        address sender,
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data
    ) external payable virtual override only(PORTAL) {
        // Calculate fee using implementation-specific logic
        uint256 fee = fetchFee(domainID, encodedProofs, data);

        // Check if enough fee was provided
        if (msg.value < fee) {
            revert InsufficientFee(fee);
        }

        // Calculate refund amount if overpaid
        uint256 refundAmount = msg.value > fee ? msg.value - fee : 0;

        // Dispatch message using implementation-specific logic
        _dispatchMessage(domainID, encodedProofs, data, fee);

        // Send refund if needed
        _sendRefund(sender, refundAmount);
    }

    /**
     * @notice Abstract function to dispatch message via specific bridge
     * @dev Must be implemented by concrete provers (HyperProver, MetaProver)
     * @param sourceChainId Chain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting
     * @param fee Fee amount for message dispatch
     */
    function _dispatchMessage(
        uint64 sourceChainId,
        bytes calldata encodedProofs,
        bytes calldata data,
        uint256 fee
    ) internal virtual;

    /**
     * @notice Fetches fee required for message dispatch
     * @dev Must be implemented by concrete provers to calculate bridge-specific fees
     * @param sourceChainId Chain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting
     * @return Fee amount required for message dispatch
     */
    function fetchFee(
        uint64 sourceChainId,
        bytes calldata encodedProofs,
        bytes calldata data
    ) public view virtual returns (uint256);
}

File 5 of 16 : Semver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

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

/**
 * @title Semver
 * @notice Implements semantic versioning for contracts
 * @dev Abstract contract that provides a standard way to access version information
 */
abstract contract Semver is ISemver {
    /**
     * @notice Returns the semantic version of the contract
     * @dev Implementation of ISemver interface
     * @return Current version string in semantic format
     */
    function version() external pure returns (string memory) { return "3.2"; }
}

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;

import {IInterchainSecurityModule} from "./IInterchainSecurityModule.sol";
import {IPostDispatchHook} from "./hooks/IPostDispatchHook.sol";

interface IMailbox {
    // ============ Events ============
    /**
     * @notice Emitted when a new message is dispatched via Hyperlane
     * @param sender The address that dispatched the message
     * @param destination The destination domain of the message
     * @param recipient The message recipient address on `destination`
     * @param message Raw bytes of message
     */
    event Dispatch(
        address indexed sender,
        uint32 indexed destination,
        bytes32 indexed recipient,
        bytes message
    );

    /**
     * @notice Emitted when a new message is dispatched via Hyperlane
     * @param messageId The unique message identifier
     */
    event DispatchId(bytes32 indexed messageId);

    /**
     * @notice Emitted when a Hyperlane message is processed
     * @param messageId The unique message identifier
     */
    event ProcessId(bytes32 indexed messageId);

    /**
     * @notice Emitted when a Hyperlane message is delivered
     * @param origin The origin domain of the message
     * @param sender The message sender address on `origin`
     * @param recipient The address that handled the message
     */
    event Process(
        uint32 indexed origin,
        bytes32 indexed sender,
        address indexed recipient
    );

    function localDomain() external view returns (uint32);

    function delivered(bytes32 messageId) external view returns (bool);

    function defaultIsm() external view returns (IInterchainSecurityModule);

    function defaultHook() external view returns (IPostDispatchHook);

    function requiredHook() external view returns (IPostDispatchHook);

    function latestDispatchedId() external view returns (bytes32);

    function dispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata messageBody
    ) external payable returns (bytes32 messageId);

    function quoteDispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata messageBody
    ) external view returns (uint256 fee);

    function dispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata body,
        bytes calldata defaultHookMetadata
    ) external payable returns (bytes32 messageId);

    function quoteDispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata messageBody,
        bytes calldata defaultHookMetadata
    ) external view returns (uint256 fee);

    function dispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata body,
        bytes calldata customHookMetadata,
        IPostDispatchHook customHook
    ) external payable returns (bytes32 messageId);

    function quoteDispatch(
        uint32 destinationDomain,
        bytes32 recipientAddress,
        bytes calldata messageBody,
        bytes calldata customHookMetadata,
        IPostDispatchHook customHook
    ) external view returns (uint256 fee);

    function process(
        bytes calldata metadata,
        bytes calldata message
    ) external payable;

    function recipientIsm(
        address recipient
    ) external view returns (IInterchainSecurityModule module);
}

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

import {IProver} from "../interfaces/IProver.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {AddressConverter} from "../libs/AddressConverter.sol";

/**
 * @title BaseProver
 * @notice Base implementation for intent proving contracts
 * @dev Provides core storage and functionality for tracking proven intents
 * and their claimants
 */
abstract contract BaseProver is IProver, ERC165 {
    using AddressConverter for bytes32;
    /**
     * @notice Address of the Portal contract
     * @dev Immutable to prevent unauthorized changes
     */

    address public immutable PORTAL;

    /**
     * @notice Mapping from intent hash to proof data
     * @dev Empty struct (zero claimant) indicates intent hasn't been proven
     */
    mapping(bytes32 => ProofData) internal _provenIntents;

    /**
     * @notice Get proof data for an intent
     * @param intentHash The intent hash to query
     * @return ProofData struct containing claimant and destination
     */
    function provenIntents(
        bytes32 intentHash
    ) external view returns (ProofData memory) {
        return _provenIntents[intentHash];
    }

    /**
     * @notice Initializes the BaseProver contract
     * @param portal Address of the Portal contract
     */
    constructor(address portal) {
        if (portal == address(0)) {
            revert ZeroPortal();
        }

        PORTAL = portal;
    }

    /**
     * @notice Process intent proofs from a cross-chain message
     * @param data Encoded (intentHash, claimant) pairs (without chain ID prefix)
     * @param destination Chain ID where the intent is being proven
     */
    function _processIntentProofs(
        bytes calldata data,
        uint64 destination
    ) internal {
        // If data is empty, just return early
        if (data.length == 0) return;

        // Ensure data length is multiple of 64 bytes (32 for hash + 32 for claimant)
        if (data.length % 64 != 0) {
            revert ArrayLengthMismatch();
        }

        uint256 numPairs = data.length / 64;

        for (uint256 i = 0; i < numPairs; i++) {
            uint256 offset = i * 64;

            // Extract intentHash and claimant using slice
            bytes32 intentHash = bytes32(data[offset:offset + 32]);
            bytes32 claimantBytes = bytes32(data[offset + 32:offset + 64]);

            // Check if the claimant bytes32 represents a valid Ethereum address
            if (!claimantBytes.isValidAddress()) {
                // Skip non-EVM addresses that can't be converted
                continue;
            }

            address claimant = claimantBytes.toAddress();

            // Validate claimant is not zero address
            if (claimant == address(0)) {
                continue; // Skip invalid claimants
            }

            // Skip rather than revert for already proven intents
            if (_provenIntents[intentHash].claimant != address(0)) {
                emit IntentAlreadyProven(intentHash);
            } else {
                _provenIntents[intentHash] = ProofData({
                    claimant: claimant,
                    destination: destination
                });
                emit IntentProven(intentHash, claimant, destination);
            }
        }
    }

    /**
     * @notice Challenge an intent proof if destination chain ID doesn't match
     * @dev Can be called by anyone to remove invalid proofs. This is a safety mechanism to ensure
     *      intents are only claimable when executed on their intended destination chains.
     * @param destination The intended destination chain ID
     * @param routeHash The hash of the intent's route
     * @param rewardHash The hash of the reward specification
     */
    function challengeIntentProof(
        uint64 destination,
        bytes32 routeHash,
        bytes32 rewardHash
    ) external {
        bytes32 intentHash = keccak256(
            abi.encodePacked(destination, routeHash, rewardHash)
        );

        ProofData memory proof = _provenIntents[intentHash];

        // Only challenge if proof exists and destination chain ID doesn't match
        if (proof.claimant != address(0) && proof.destination != destination) {
            delete _provenIntents[intentHash];

            emit IntentProofInvalidated(intentHash);
        }
    }

    /**
     * @notice Checks if this contract supports a given interface
     * @dev Implements ERC165 interface detection
     * @param interfaceId Interface identifier to check
     * @return True if the interface is supported
     */
    function supportsInterface(
        bytes4 interfaceId
    ) public view override returns (bool) {
        return
            interfaceId == type(IProver).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

File 8 of 16 : IMessageBridgeProver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

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

/**
 * @title IMessageBridgeProver
 * @notice Interface for message-bridge based provers
 * @dev Defines common functionality and events for cross-chain message bridge provers
 */
interface IMessageBridgeProver is IProver {
    /**
     * @notice Insufficient fee provided for cross-chain message dispatch
     * @param requiredFee Amount of fee required
     */
    error InsufficientFee(uint256 requiredFee);

    /**
     * @notice Unauthorized call detected
     *  @param expected Address that should have been the sender
     *  @param actual Address that actually sent the message
     */
    error UnauthorizedSender(address expected, address actual);

    /**
     * @notice Unauthorized incoming proof from source chain
     * @param sender Address that initiated the proof (as bytes32 for cross-VM compatibility)
     */
    error UnauthorizedIncomingProof(bytes32 sender);

    /**
     * @notice Mailbox address cannot be zero
     */
    error MailboxCannotBeZeroAddress();

    /**
     * @notice Router address cannot be zero
     */
    error RouterCannotBeZeroAddress();

    /**
     * @notice Domain ID cannot be zero
     */
    error ZeroDomainID();

    /**
     * @notice Sender address cannot be zero
     */
    error SenderCannotBeZeroAddress();

    /**
     * @notice message is invalid
     */
    error InvalidProofMessage();

    /**
     * @notice Calculates the fee required for message dispatch
     * @param domainID Bridge-specific domain ID of the source chain (where the intent was created).
     *        IMPORTANT: This is NOT the chain ID. Each bridge provider uses their own
     *        domain ID mapping system. You MUST check with the specific bridge provider
     *        (Hyperlane, LayerZero, Metalayer) documentation to determine the correct
     *        domain ID for the source chain.
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data for message formatting.
     *        Specific format varies by implementation:
     *        - HyperProver: (bytes32 sourceChainProver, bytes metadata, address hookAddr, [uint256 gasLimitOverride])
     *        - MetaProver: (bytes32 sourceChainProver, [uint256 gasLimitOverride])
     *        - LayerZeroProver: (bytes32 sourceChainProver, bytes options, [uint256 gasLimitOverride])
     * @return Fee amount required for message dispatch
     */
    function fetchFee(
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data
    ) external view returns (uint256);

    /**
     * @notice Domain ID is too large to fit in uint32
     * @param domainId The domain ID that is too large
     */
    error DomainIdTooLarge(uint64 domainId);
}

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

/**
 * @title Whitelist
 * @notice Abstract contract providing immutable whitelist functionality
 * @dev Uses immutable arrays to store up to 20 whitelisted addresses as bytes32 for cross-VM compatibility
 *
 * This contract provides a gas-efficient, immutable approach to whitelisting:
 * - The whitelist is configured ONCE at construction time
 * - After deployment, the whitelist CANNOT be modified (addresses cannot be added or removed)
 * - Maximum of 20 addresses can be whitelisted
 * - Uses immutable slots for each whitelisted address (lower gas cost than storage)
 * - Optimized for early exit when checking whitelist membership
 * - Uses bytes32 for cross-VM compatibility (Ethereum addresses and Solana public keys)
 */
abstract contract Whitelist {
    /**
     * @notice Error thrown when an address is not whitelisted
     * @param addr The address that was not found in the whitelist
     */
    error AddressNotWhitelisted(bytes32 addr);

    /**
     * @notice Whitelist size exceeds maximum allowed
     * @param size Attempted whitelist size
     * @param maxSize Maximum allowed size
     */
    error WhitelistSizeExceeded(uint256 size, uint256 maxSize);

    /// @dev Maximum number of addresses that can be whitelisted
    uint256 private constant MAX_WHITELIST_SIZE = 20;

    /// @dev Number of addresses actually in the whitelist
    uint256 private immutable WHITELIST_SIZE;

    /// @dev Immutable storage for whitelisted addresses (up to 20)
    bytes32 private immutable ADDRESS_1;
    bytes32 private immutable ADDRESS_2;
    bytes32 private immutable ADDRESS_3;
    bytes32 private immutable ADDRESS_4;
    bytes32 private immutable ADDRESS_5;
    bytes32 private immutable ADDRESS_6;
    bytes32 private immutable ADDRESS_7;
    bytes32 private immutable ADDRESS_8;
    bytes32 private immutable ADDRESS_9;
    bytes32 private immutable ADDRESS_10;
    bytes32 private immutable ADDRESS_11;
    bytes32 private immutable ADDRESS_12;
    bytes32 private immutable ADDRESS_13;
    bytes32 private immutable ADDRESS_14;
    bytes32 private immutable ADDRESS_15;
    bytes32 private immutable ADDRESS_16;
    bytes32 private immutable ADDRESS_17;
    bytes32 private immutable ADDRESS_18;
    bytes32 private immutable ADDRESS_19;
    bytes32 private immutable ADDRESS_20;

    /**
     * @notice Initializes the whitelist with a set of addresses
     * @param addresses Array of addresses to whitelist (as bytes32 for cross-VM compatibility)
     */
    // solhint-disable-next-line function-max-lines
    constructor(bytes32[] memory addresses) {
        if (addresses.length > MAX_WHITELIST_SIZE) {
            revert WhitelistSizeExceeded(addresses.length, MAX_WHITELIST_SIZE);
        }

        // Store whitelist size
        WHITELIST_SIZE = addresses.length;

        // Initialize all addresses to zero
        ADDRESS_1 = addresses.length > 0 ? addresses[0] : bytes32(0);
        ADDRESS_2 = addresses.length > 1 ? addresses[1] : bytes32(0);
        ADDRESS_3 = addresses.length > 2 ? addresses[2] : bytes32(0);
        ADDRESS_4 = addresses.length > 3 ? addresses[3] : bytes32(0);
        ADDRESS_5 = addresses.length > 4 ? addresses[4] : bytes32(0);
        ADDRESS_6 = addresses.length > 5 ? addresses[5] : bytes32(0);
        ADDRESS_7 = addresses.length > 6 ? addresses[6] : bytes32(0);
        ADDRESS_8 = addresses.length > 7 ? addresses[7] : bytes32(0);
        ADDRESS_9 = addresses.length > 8 ? addresses[8] : bytes32(0);
        ADDRESS_10 = addresses.length > 9 ? addresses[9] : bytes32(0);
        ADDRESS_11 = addresses.length > 10 ? addresses[10] : bytes32(0);
        ADDRESS_12 = addresses.length > 11 ? addresses[11] : bytes32(0);
        ADDRESS_13 = addresses.length > 12 ? addresses[12] : bytes32(0);
        ADDRESS_14 = addresses.length > 13 ? addresses[13] : bytes32(0);
        ADDRESS_15 = addresses.length > 14 ? addresses[14] : bytes32(0);
        ADDRESS_16 = addresses.length > 15 ? addresses[15] : bytes32(0);
        ADDRESS_17 = addresses.length > 16 ? addresses[16] : bytes32(0);
        ADDRESS_18 = addresses.length > 17 ? addresses[17] : bytes32(0);
        ADDRESS_19 = addresses.length > 18 ? addresses[18] : bytes32(0);
        ADDRESS_20 = addresses.length > 19 ? addresses[19] : bytes32(0);
    }

    /**
     * @notice Checks if an address is whitelisted
     * @param addr Address to check (as bytes32 for cross-VM compatibility)
     * @return True if the address is whitelisted, false otherwise
     */
    // solhint-disable-next-line function-max-lines
    function isWhitelisted(bytes32 addr) public view returns (bool) {
        // Short circuit check for empty whitelist
        if (WHITELIST_SIZE == 0) return false;

        // Short circuit check for zero address
        if (addr == bytes32(0)) return false;

        if (ADDRESS_1 == addr) return true;
        if (WHITELIST_SIZE <= 1) return false;

        if (ADDRESS_2 == addr) return true;
        if (WHITELIST_SIZE <= 2) return false;

        if (ADDRESS_3 == addr) return true;
        if (WHITELIST_SIZE <= 3) return false;

        if (ADDRESS_4 == addr) return true;
        if (WHITELIST_SIZE <= 4) return false;

        if (ADDRESS_5 == addr) return true;
        if (WHITELIST_SIZE <= 5) return false;

        if (ADDRESS_6 == addr) return true;
        if (WHITELIST_SIZE <= 6) return false;

        if (ADDRESS_7 == addr) return true;
        if (WHITELIST_SIZE <= 7) return false;

        if (ADDRESS_8 == addr) return true;
        if (WHITELIST_SIZE <= 8) return false;

        if (ADDRESS_9 == addr) return true;
        if (WHITELIST_SIZE <= 9) return false;

        if (ADDRESS_10 == addr) return true;
        if (WHITELIST_SIZE <= 10) return false;

        if (ADDRESS_11 == addr) return true;
        if (WHITELIST_SIZE <= 11) return false;

        if (ADDRESS_12 == addr) return true;
        if (WHITELIST_SIZE <= 12) return false;

        if (ADDRESS_13 == addr) return true;
        if (WHITELIST_SIZE <= 13) return false;

        if (ADDRESS_14 == addr) return true;
        if (WHITELIST_SIZE <= 14) return false;

        if (ADDRESS_15 == addr) return true;
        if (WHITELIST_SIZE <= 15) return false;

        if (ADDRESS_16 == addr) return true;
        if (WHITELIST_SIZE <= 16) return false;

        if (ADDRESS_17 == addr) return true;
        if (WHITELIST_SIZE <= 17) return false;

        if (ADDRESS_18 == addr) return true;
        if (WHITELIST_SIZE <= 18) return false;

        if (ADDRESS_19 == addr) return true;
        if (WHITELIST_SIZE <= 19) return false;

        return ADDRESS_20 == addr;
    }

    /**
     * @notice Validates that an address is whitelisted, reverting if not
     * @param addr Address to validate (as bytes32 for cross-VM compatibility)
     */
    function validateWhitelisted(bytes32 addr) internal view {
        if (!isWhitelisted(addr)) {
            revert AddressNotWhitelisted(addr);
        }
    }

    /**
     * @notice Returns the list of whitelisted addresses
     * @return whitelist Array of whitelisted addresses (as bytes32 for cross-VM compatibility)
     */
    function getWhitelist() public view returns (bytes32[] memory) {
        bytes32[] memory whitelist = new bytes32[](WHITELIST_SIZE);

        if (WHITELIST_SIZE > 0) whitelist[0] = ADDRESS_1;
        if (WHITELIST_SIZE > 1) whitelist[1] = ADDRESS_2;
        if (WHITELIST_SIZE > 2) whitelist[2] = ADDRESS_3;
        if (WHITELIST_SIZE > 3) whitelist[3] = ADDRESS_4;
        if (WHITELIST_SIZE > 4) whitelist[4] = ADDRESS_5;
        if (WHITELIST_SIZE > 5) whitelist[5] = ADDRESS_6;
        if (WHITELIST_SIZE > 6) whitelist[6] = ADDRESS_7;
        if (WHITELIST_SIZE > 7) whitelist[7] = ADDRESS_8;
        if (WHITELIST_SIZE > 8) whitelist[8] = ADDRESS_9;
        if (WHITELIST_SIZE > 9) whitelist[9] = ADDRESS_10;
        if (WHITELIST_SIZE > 10) whitelist[10] = ADDRESS_11;
        if (WHITELIST_SIZE > 11) whitelist[11] = ADDRESS_12;
        if (WHITELIST_SIZE > 12) whitelist[12] = ADDRESS_13;
        if (WHITELIST_SIZE > 13) whitelist[13] = ADDRESS_14;
        if (WHITELIST_SIZE > 14) whitelist[14] = ADDRESS_15;
        if (WHITELIST_SIZE > 15) whitelist[15] = ADDRESS_16;
        if (WHITELIST_SIZE > 16) whitelist[16] = ADDRESS_17;
        if (WHITELIST_SIZE > 17) whitelist[17] = ADDRESS_18;
        if (WHITELIST_SIZE > 18) whitelist[18] = ADDRESS_19;
        if (WHITELIST_SIZE > 19) whitelist[19] = ADDRESS_20;

        return whitelist;
    }

    /**
     * @notice Returns the number of whitelisted addresses
     * @return Number of addresses in the whitelist
     */
    function getWhitelistSize() public view returns (uint256) {
        return WHITELIST_SIZE;
    }
}

File 10 of 16 : ISemver.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

/**
 * @title Semver Interface
 * @dev An interface for a contract that has a version
 */
interface ISemver {
    function version() external pure returns (string memory);
}

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;

interface IInterchainSecurityModule {
    enum Types {
        UNUSED,
        ROUTING,
        AGGREGATION,
        LEGACY_MULTISIG,
        MERKLE_ROOT_MULTISIG,
        MESSAGE_ID_MULTISIG,
        NULL, // used with relayer carrying no metadata
        CCIP_READ,
        ARB_L2_TO_L1,
        WEIGHT_MERKLE_ROOT_MULTISIG,
        WEIGHT_MESSAGE_ID_MULTISIG,
        OP_L2_TO_L1
    }

    /**
     * @notice Returns an enum that represents the type of security model
     * encoded by this ISM.
     * @dev Relayers infer how to fetch and format metadata.
     */
    function moduleType() external view returns (uint8);

    /**
     * @notice Defines a security model responsible for verifying interchain
     * messages based on the provided metadata.
     * @param _metadata Off-chain metadata provided by a relayer, specific to
     * the security model encoded by the module (e.g. validator signatures)
     * @param _message Hyperlane encoded interchain message
     * @return True if the message was verified
     */
    function verify(
        bytes calldata _metadata,
        bytes calldata _message
    ) external returns (bool);
}

interface ISpecifiesInterchainSecurityModule {
    function interchainSecurityModule()
        external
        view
        returns (IInterchainSecurityModule);
}

// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;

/*@@@@@@@       @@@@@@@@@
 @@@@@@@@@       @@@@@@@@@
  @@@@@@@@@       @@@@@@@@@
   @@@@@@@@@       @@@@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@
     @@@@@  HYPERLANE  @@@@@@@
    @@@@@@@@@@@@@@@@@@@@@@@@@
   @@@@@@@@@       @@@@@@@@@
  @@@@@@@@@       @@@@@@@@@
 @@@@@@@@@       @@@@@@@@@
@@@@@@@@@       @@@@@@@@*/

interface IPostDispatchHook {
    enum Types {
        UNUSED,
        ROUTING,
        AGGREGATION,
        MERKLE_TREE,
        INTERCHAIN_GAS_PAYMASTER,
        FALLBACK_ROUTING,
        ID_AUTH_ISM,
        PAUSABLE,
        PROTOCOL_FEE,
        LAYER_ZERO_V1,
        RATE_LIMITED,
        ARB_L2_TO_L1,
        OP_L2_TO_L1
    }

    /**
     * @notice Returns an enum that represents the type of hook
     */
    function hookType() external view returns (uint8);

    /**
     * @notice Returns whether the hook supports metadata
     * @param metadata metadata
     * @return Whether the hook supports metadata
     */
    function supportsMetadata(
        bytes calldata metadata
    ) external view returns (bool);

    /**
     * @notice Post action after a message is dispatched via the Mailbox
     * @param metadata The metadata required for the hook
     * @param message The message passed from the Mailbox.dispatch() call
     */
    function postDispatch(
        bytes calldata metadata,
        bytes calldata message
    ) external payable;

    /**
     * @notice Compute the payment required by the postDispatch call
     * @param metadata The metadata required for the hook
     * @param message The message passed from the Mailbox.dispatch() call
     * @return Quoted payment for the postDispatch call
     */
    function quoteDispatch(
        bytes calldata metadata,
        bytes calldata message
    ) external view returns (uint256);
}

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

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

/**
 * @title IProver
 * @notice Interface for proving intent fulfillment
 * @dev Defines required functionality for proving intent execution with different
 * proof mechanisms (storage or Hyperlane)
 */
interface IProver is ISemver {
    /**
     * @notice Proof data stored for each proven intent
     * @param claimant Address eligible to claim the intent rewards
     * @param destination Chain ID where the intent was proven
     */
    struct ProofData {
        address claimant;
        uint64 destination;
    }

    /**
     * @notice Arrays of intent hashes and claimants must have the same length
     */
    error ArrayLengthMismatch();

    /**
     * @notice Portal address cannot be zero
     */
    error ZeroPortal();

    /**
     * @notice Chain ID is too large to fit in uint64
     * @param chainId The chain ID that is too large
     */
    error ChainIdTooLarge(uint256 chainId);

    /**
     * @notice Emitted when an intent is successfully proven
     * @dev Emitted by the Prover on the source chain.
     * @param intentHash Hash of the proven intent
     * @param claimant Address eligible to claim the intent rewards
     * @param destination Destination chain ID where the intent was proven
     */
    event IntentProven(
        bytes32 indexed intentHash,
        address indexed claimant,
        uint64 destination
    );

    /**
     * @notice Emitted when an intent proof is invalidated
     * @param intentHash Hash of the invalidated intent
     */
    event IntentProofInvalidated(bytes32 indexed intentHash);

    /**
     * @notice Emitted when attempting to prove an already-proven intent
     * @dev Event instead of error to allow batch processing to continue
     * @param intentHash Hash of the already proven intent
     */
    event IntentAlreadyProven(bytes32 intentHash);

    /**
     * @notice Gets the proof mechanism type used by this prover
     * @return string indicating the prover's mechanism
     */
    function getProofType() external pure returns (string memory);

    /**
     * @notice Initiates the proving process for intents from the destination chain
     * @dev Implemented by specific prover mechanisms (storage, Hyperlane, Metalayer)
     * @param sender Address of the original transaction sender
     * @param sourceChainDomainID Domain ID of the source chain
     * @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
     * @param data Additional data specific to the proving implementation
     *
     * @dev WARNING: sourceChainDomainID is NOT necessarily the same as chain ID.
     *      Each bridge provider uses their own domain ID mapping system:
     *      - Hyperlane: Uses custom domain IDs that may differ from chain IDs
     *      - LayerZero: Uses endpoint IDs that map to chains differently
     *      - Metalayer: Uses domain IDs specific to their routing system
     *      - Polymer: Uses chainIDs
     *      You MUST consult the specific bridge provider's documentation to determine
     *      the correct domain ID for the source chain.
     */
    function prove(
        address sender,
        uint64 sourceChainDomainID,
        bytes calldata encodedProofs,
        bytes calldata data
    ) external payable;

    /**
     * @notice Returns the proof data for a given intent hash
     * @param intentHash Hash of the intent to query
     * @return ProofData containing claimant and destination chain ID
     */
    function provenIntents(
        bytes32 intentHash
    ) external view returns (ProofData memory);

    /**
     * @notice Challenge an intent proof if destination chain ID doesn't match
     * @dev Can be called by anyone to remove invalid proofs. This is a safety mechanism to ensure
     *      intents are only claimable when executed on their intended destination chains.
     * @param destination The intended destination chain ID
     * @param routeHash The hash of the intent's route
     * @param rewardHash The hash of the reward specification
     */
    function challengeIntentProof(
        uint64 destination,
        bytes32 routeHash,
        bytes32 rewardHash
    ) external;
}

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

pragma solidity ^0.8.20;

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

/* -*- c-basic-offset: 4 -*- */
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

/**
 * @title AddressConverter
 * @notice Utility library for converting between address and bytes32 types
 * @dev Provides simple functions to convert between address (20 bytes) and bytes32 (32 bytes)
 */
library AddressConverter {
    error InvalidAddress(bytes32 value);

    /**
     * @notice Convert an Ethereum address to bytes32
     * @dev Pads the 20-byte address to 32 bytes by converting to uint160, then uint256, then bytes32
     * @param addr The address to convert
     * @return The bytes32 representation of the address
     */
    function toBytes32(address addr) internal pure returns (bytes32) {
        return bytes32(uint256(uint160(addr)));
    }

    /**
     * @notice Convert bytes32 to an Ethereum address
     * @dev Truncates the 32-byte value to 20 bytes by converting to uint256, then uint160, then address
     * @param b The bytes32 value to convert
     * @return The address representation of the bytes32 value
     */
    function toAddress(bytes32 b) internal pure returns (address) {
        if (!isValidAddress(b)) {
            revert InvalidAddress(b);
        }

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

    /**
     * @notice Check if a bytes32 value represents a valid Ethereum address
     * @dev An Ethereum address must have the top 12 bytes as zero
     * @param b The bytes32 value to check
     * @return True if the bytes32 value can be safely converted to an Ethereum address
     */
    function isValidAddress(bytes32 b) internal pure returns (bool) {
        // The top 12 bytes must be zero for a valid Ethereum address
        return uint256(b) >> 160 == 0;
    }
}

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

Settings
{
  "remappings": [
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
    "@hyperlane-xyz/core/=node_modules/@hyperlane-xyz/core/",
    "@eth-optimism/contracts-bedrock/=node_modules/@eth-optimism/contracts-bedrock/",
    "@metalayer/contracts/=node_modules/@metalayer/contracts/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"mailbox","type":"address"},{"internalType":"address","name":"portal","type":"address"},{"internalType":"bytes32[]","name":"provers","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"addr","type":"bytes32"}],"name":"AddressNotWhitelisted","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"ChainIdTooLarge","type":"error"},{"inputs":[{"internalType":"uint64","name":"domainId","type":"uint64"}],"name":"DomainIdTooLarge","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidProofMessage","type":"error"},{"inputs":[],"name":"MailboxCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"RouterCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"SenderCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"UnauthorizedIncomingProof","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"actual","type":"address"}],"name":"UnauthorizedSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"maxSize","type":"uint256"}],"name":"WhitelistSizeExceeded","type":"error"},{"inputs":[],"name":"ZeroDomainID","type":"error"},{"inputs":[],"name":"ZeroPortal","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"IntentAlreadyProven","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"IntentProofInvalidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"intentHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint64","name":"destination","type":"uint64"}],"name":"IntentProven","type":"event"},{"inputs":[],"name":"MAILBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_GAS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PORTAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROOF_TYPE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destination","type":"uint64"},{"internalType":"bytes32","name":"routeHash","type":"bytes32"},{"internalType":"bytes32","name":"rewardHash","type":"bytes32"}],"name":"challengeIntentProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"domainID","type":"uint64"},{"internalType":"bytes","name":"encodedProofs","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"fetchFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProofType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getWhitelist","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"origin","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"bytes","name":"messageBody","type":"bytes"}],"name":"handle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addr","type":"bytes32"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint64","name":"domainID","type":"uint64"},{"internalType":"bytes","name":"encodedProofs","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"prove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"provenIntents","outputs":[{"components":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint64","name":"destination","type":"uint64"}],"internalType":"struct IProver.ProofData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]

0x61038060405234610609576123eb8038038061001a81610624565b92833981016060828203126106095761003282610649565b9161003f60208201610649565b604082015190916001600160401b03821161060957019082601f83011215610609578151926001600160401b03841161060e578360051b926020610084818601610624565b8096815201906020829582010192831161060957602001905b8282106105f9575050506001600160a01b038116156105e8576080528151601481116105cf5750815160a0528151156105c75781511561052b57515b60c05260018151116000146105c05780516001101561052b5760408101515b60e05260028151116000146105b95780516002101561052b5760608101515b6101005260038151116000146105b25780516003101561052b5760808101515b6101205260048151116000146105ab5780516004101561052b5760a08101515b6101405260058151116000146105a45780516005101561052b5760c08101515b61016052600681511160001461059d5780516006101561052b5760e08101515b6101805260078151116000146105965780516007101561052b576101008101515b6101a052600881511160001461058f5780516008101561052b576101208101515b6101c05260098151116000146105885780516009101561052b576101408101515b6101e052600a815111600014610581578051600a101561052b576101608101515b61020052600b81511160001461057a578051600b101561052b576101808101515b61022052600c815111600014610573578051600c101561052b576101a08101515b61024052600d81511160001461056c578051600d101561052b576101c08101515b61026052600e815111600014610565578051600e101561052b576101e08101515b61028052600f81511160001461055e578051600f101561052b576102008101515b6102a05260108151116000146105575780516010101561052b576102208101515b6102c05260118151116000146105505780516011101561052b576102408101515b6102e05260128151116000146105495780516012101561052b576102608101515b6103005260138151116000146105415780516013101561052b5761028001515b6103205262030d40610340526001600160a01b0381161561051a5761036052604051611d8d908161065e82396080518181816108a00152610fc1015260a05181818161022d01528181610b2e0152611270015260c0518181816107c2015261129e015260e05181818161079001526112ce01526101005181818161075b01526112fe015261012051818181610726015261132e0152610140518181816106f1015261135e0152610160518181816106bc015261138e01526101805181818161068701526113be01526101a05181818161065101526113ee01526101c05181818161061b015261141e01526101e0518181816105e5015261144e0152610200518181816105af015261147e01526102205181818161057901526114ae01526102405181818161054301526114de01526102605181818161050d015261150e0152610280518181816104d7015261153e01526102a0518181816104a1015261156e01526102c05181818161046b015261159e01526102e05181818161043501526115ce0152610300518181816103ff01526115fe01526103205181818161039a015261162c01526103405181610c9501526103605181818161099601528181610c3b01528181610d30015281816118800152611a360152f35b6385405fbf60e01b60005260046000fd5b634e487b7160e01b600052603260045260246000fd5b506000610343565b6000610323565b6000610302565b60006102e1565b60006102c0565b600061029f565b600061027e565b600061025d565b600061023c565b600061021b565b60006101fa565b60006101d9565b60006101b8565b6000610197565b6000610177565b6000610157565b6000610137565b6000610117565b60006100f8565b5060006100d9565b63059291f560e51b600052600452601460245260446000fd5b631b973f8d60e11b60005260046000fd5b815181526020918201910161009d565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761060e57604052565b51906001600160a01b03821682036106095756fe608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe146110a45750806301ffc9a714610fe55780630ff754ea14610f7657806354f10f0e14610edf57806354fd4d5014610e6257806356d5d47514610cb85780637ce1ffeb14610c5f5780637dc2b8fb14610bf057806399d145b214610b5157806399db89b514610af85780639bcd850f14610aa6578063bc8c7df214610aa6578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb6110e7565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a6068826111f2565b51902090816000526000602052602060406000206040519061016b8261118b565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000061025581611663565b9061026360405192836111f2565b80825261026f81611663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577f000000000000000000000000000000000000000000000000000000000000000060808401526102bb565b8251600210156103c4577f000000000000000000000000000000000000000000000000000000000000000060608401526102b2565b8251600110156103c4577f000000000000000000000000000000000000000000000000000000000000000060408401526102a9565b8251156103c4577f000000000000000000000000000000000000000000000000000000000000000082526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f7576108669036906004016110fe565b9060643567ffffffffffffffff81116101f7576108879036906004016110fe565b909373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610a7557506108dd6108d583876116e0565b8585846117ee565b93843410610a4757843411600014610a355784340393348511610a065761090a61091094602096986116e0565b9261194a565b9163ffffffff835116908284015160408501519261097d73ffffffffffffffffffffffffffffffffffffffff6080606089015198015116604051978896879586957f10b83dc000000000000000000000000000000000000000000000000000000000875260048701611797565b039173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156109fa576109cf575b506109cd916118fb565b005b602090813d83116109f3575b6109e581836111f2565b810103126101f757826109c3565b503d6109db565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60209361090a610910946000986116e0565b847f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af4610ae0611233565b60405191829160208352602083019061112c565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760006020604051610b908161118b565b8281520152600435600052600060205260408060002067ffffffffffffffff825191610bbb8361118b565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043563ffffffff81168091036101f75760243560443567ffffffffffffffff81116101f757610d169036906004016110fe565b91909273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610a75575015610e38578015610e0e57610d6c8161126e565b15610de1575060088110610db757806008116101f7576109cd9160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611b6e565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fba66dc3a0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fc15569280000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af46040805190610ea381836111f2565b600382527f332e32000000000000000000000000000000000000000000000000000000000060208301525191829160208352602083019061112c565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610f166110e7565b60243567ffffffffffffffff81116101f757610f369036906004016110fe565b90916044359167ffffffffffffffff83116101f757602093610f68610f62610f6e9536906004016110fe565b906116e0565b926117ee565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f42c7e0fe000000000000000000000000000000000000000000000000000000006020921490811561107a575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148261106f565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576020906110e160043561126e565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111765750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611137565b6040810190811067ffffffffffffffff8211176111a757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176111a757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176111a757604052565b604051906112426040836111f2565b600982527f48797065726c616e6500000000000000000000000000000000000000000000006020830152565b7f0000000000000000000000000000000000000000000000000000000000000000801561165c57811561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600281111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600381111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600481111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600581111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600681111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600781111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600881111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600981111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600a81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600b81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600c81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600d81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600e81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600f81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601081111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601281111561165c57817f000000000000000000000000000000000000000000000000000000000000000014611655576013101561164f577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b67ffffffffffffffff81116111a75760051b60200190565b92919267ffffffffffffffff82116111a757604051916116c3601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846111f2565b8294818452818301116101f7578281602093846000960137010152565b906000604080516116f0816111d6565b8281526060602082015201528101906020818303126101f75780359067ffffffffffffffff82116101f75701906060828203126101f75760405191611734836111d6565b80358352602081013567ffffffffffffffff81116101f757810182601f820112156101f75760409281602061176b9335910161167b565b6020840152013573ffffffffffffffffffffffffffffffffffffffff811681036101f757604082015290565b936117d960809473ffffffffffffffffffffffffffffffffffffffff9463ffffffff6117e7959a999a168852602088015260a0604088015260a087019061112c565b90858203606087015261112c565b9416910152565b906117fa93929161194a565b602063ffffffff825116818301519061186760408501519473ffffffffffffffffffffffffffffffffffffffff60806060830151920151169060405196879586957f81d2ea9500000000000000000000000000000000000000000000000000000000875260048701611797565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109fa576000916118b4575090565b90506020813d6020116118db575b816118cf602093836111f2565b810103126101f7575190565b3d91506118c2565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611942575b61193e5760008080938193828215611935575bf1156109fa57565b506108fc61192d565b5050565b50811561191a565b9392906040519260a0840184811067ffffffffffffffff8211176111a75760405260008452602084019160008352604085019160608352606086019360608552608087019660008852809967ffffffffffffffff811663ffffffff8111611b065750926119e192604097959263ffffffff73ffffffffffffffffffffffffffffffffffffffff9a989616905286519052369161167b565b90526020820151905201511680611aec57506040517f3d1250b700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109fa57600091611a82575b5073ffffffffffffffffffffffffffffffffffffffff169052565b6020813d602011611ae4575b81611a9b602093836111f2565b81010312611ae057519073ffffffffffffffffffffffffffffffffffffffff82168203611add575073ffffffffffffffffffffffffffffffffffffffff611a67565b80fd5b5080fd5b3d9150611a8e565b73ffffffffffffffffffffffffffffffffffffffff169052565b7ff17764200000000000000000000000000000000000000000000000000000000060005260045260246000fd5b359060208110611b41575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611d8857603f8216611d5e578160061c9160005b838110611b93575050505050565b8060061b81810460401482151715610a06576020810190818111610a0657611bc6611bc08383878b6118e3565b90611b33565b9060009260408201809211611d3157611bc0600195949392611be992888c6118e3565b8060a01c611d295773ffffffffffffffffffffffffffffffffffffffff16918215611d29578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611c6b57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611b85565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611c9b8161118b565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611c65565b505050611c65565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b505050560000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede970000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000400000000000000000000000009b17667bd8fd11102551b5c21715a5d5ea1459b0000000000000000000000005b177206f2b475872e3201dd71728c2e9259adaf2164abebad65868b7321e8233cc0cbc5fdd74cd1fb7c35a99d98e54ccb5c0df0a412dbc15610ba57a3e42b4c0bde6e24336c98298f1364735983908650331193

Deployed Bytecode

0x608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe146110a45750806301ffc9a714610fe55780630ff754ea14610f7657806354f10f0e14610edf57806354fd4d5014610e6257806356d5d47514610cb85780637ce1ffeb14610c5f5780637dc2b8fb14610bf057806399d145b214610b5157806399db89b514610af85780639bcd850f14610aa6578063bc8c7df214610aa6578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb6110e7565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a6068826111f2565b51902090816000526000602052602060406000206040519061016b8261118b565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000461025581611663565b9061026360405192836111f2565b80825261026f81611663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577fa412dbc15610ba57a3e42b4c0bde6e24336c98298f136473598390865033119360808401526102bb565b8251600210156103c4577f2164abebad65868b7321e8233cc0cbc5fdd74cd1fb7c35a99d98e54ccb5c0df060608401526102b2565b8251600110156103c4577f0000000000000000000000005b177206f2b475872e3201dd71728c2e9259adaf60408401526102a9565b8251156103c4577f00000000000000000000000009b17667bd8fd11102551b5c21715a5d5ea1459b82526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f7576108669036906004016110fe565b9060643567ffffffffffffffff81116101f7576108879036906004016110fe565b909373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede9716803303610a7557506108dd6108d583876116e0565b8585846117ee565b93843410610a4757843411600014610a355784340393348511610a065761090a61091094602096986116e0565b9261194a565b9163ffffffff835116908284015160408501519261097d73ffffffffffffffffffffffffffffffffffffffff6080606089015198015116604051978896879586957f10b83dc000000000000000000000000000000000000000000000000000000000875260048701611797565b039173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165af180156109fa576109cf575b506109cd916118fb565b005b602090813d83116109f3575b6109e581836111f2565b810103126101f757826109c3565b503d6109db565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60209361090a610910946000986116e0565b847f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af4610ae0611233565b60405191829160208352602083019061112c565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000048152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760006020604051610b908161118b565b8281520152600435600052600060205260408060002067ffffffffffffffff825191610bbb8361118b565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f0000000000000000000000000000000000000000000000000000000000030d408152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043563ffffffff81168091036101f75760243560443567ffffffffffffffff81116101f757610d169036906004016110fe565b91909273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3916803303610a75575015610e38578015610e0e57610d6c8161126e565b15610de1575060088110610db757806008116101f7576109cd9160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611b6e565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fba66dc3a0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fc15569280000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af46040805190610ea381836111f2565b600382527f332e32000000000000000000000000000000000000000000000000000000000060208301525191829160208352602083019061112c565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610f166110e7565b60243567ffffffffffffffff81116101f757610f369036906004016110fe565b90916044359167ffffffffffffffff83116101f757602093610f68610f62610f6e9536906004016110fe565b906116e0565b926117ee565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f42c7e0fe000000000000000000000000000000000000000000000000000000006020921490811561107a575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148261106f565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576020906110e160043561126e565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111765750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611137565b6040810190811067ffffffffffffffff8211176111a757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176111a757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176111a757604052565b604051906112426040836111f2565b600982527f48797065726c616e6500000000000000000000000000000000000000000000006020830152565b7f0000000000000000000000000000000000000000000000000000000000000004801561165c57811561165c57817f00000000000000000000000009b17667bd8fd11102551b5c21715a5d5ea1459b1461165557600181111561165c57817f0000000000000000000000005b177206f2b475872e3201dd71728c2e9259adaf1461165557600281111561165c57817f2164abebad65868b7321e8233cc0cbc5fdd74cd1fb7c35a99d98e54ccb5c0df01461165557600381111561165c57817fa412dbc15610ba57a3e42b4c0bde6e24336c98298f13647359839086503311931461165557600481111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600581111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600681111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600781111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600881111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600981111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600a81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600b81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600c81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600d81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600e81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600f81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601081111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601281111561165c57817f000000000000000000000000000000000000000000000000000000000000000014611655576013101561164f577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b67ffffffffffffffff81116111a75760051b60200190565b92919267ffffffffffffffff82116111a757604051916116c3601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846111f2565b8294818452818301116101f7578281602093846000960137010152565b906000604080516116f0816111d6565b8281526060602082015201528101906020818303126101f75780359067ffffffffffffffff82116101f75701906060828203126101f75760405191611734836111d6565b80358352602081013567ffffffffffffffff81116101f757810182601f820112156101f75760409281602061176b9335910161167b565b6020840152013573ffffffffffffffffffffffffffffffffffffffff811681036101f757604082015290565b936117d960809473ffffffffffffffffffffffffffffffffffffffff9463ffffffff6117e7959a999a168852602088015260a0604088015260a087019061112c565b90858203606087015261112c565b9416910152565b906117fa93929161194a565b602063ffffffff825116818301519061186760408501519473ffffffffffffffffffffffffffffffffffffffff60806060830151920151169060405196879586957f81d2ea9500000000000000000000000000000000000000000000000000000000875260048701611797565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165afa9081156109fa576000916118b4575090565b90506020813d6020116118db575b816118cf602093836111f2565b810103126101f7575190565b3d91506118c2565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611942575b61193e5760008080938193828215611935575bf1156109fa57565b506108fc61192d565b5050565b50811561191a565b9392906040519260a0840184811067ffffffffffffffff8211176111a75760405260008452602084019160008352604085019160608352606086019360608552608087019660008852809967ffffffffffffffff811663ffffffff8111611b065750926119e192604097959263ffffffff73ffffffffffffffffffffffffffffffffffffffff9a989616905286519052369161167b565b90526020820151905201511680611aec57506040517f3d1250b700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165afa9081156109fa57600091611a82575b5073ffffffffffffffffffffffffffffffffffffffff169052565b6020813d602011611ae4575b81611a9b602093836111f2565b81010312611ae057519073ffffffffffffffffffffffffffffffffffffffff82168203611add575073ffffffffffffffffffffffffffffffffffffffff611a67565b80fd5b5080fd5b3d9150611a8e565b73ffffffffffffffffffffffffffffffffffffffff169052565b7ff17764200000000000000000000000000000000000000000000000000000000060005260045260246000fd5b359060208110611b41575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611d8857603f8216611d5e578160061c9160005b838110611b93575050505050565b8060061b81810460401482151715610a06576020810190818111610a0657611bc6611bc08383878b6118e3565b90611b33565b9060009260408201809211611d3157611bc0600195949392611be992888c6118e3565b8060a01c611d295773ffffffffffffffffffffffffffffffffffffffff16918215611d29578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611c6b57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611b85565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611c9b8161118b565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611c65565b505050611c65565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505056

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

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