ETH Price: $2,076.89 (+6.44%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

> 10 Internal Transactions found.

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Ccip Send245820812026-03-04 5:43:473 hrs ago1772603027
0xD2ce3165...cd6D48c04
0.00025301 ETH
Prove245820812026-03-04 5:43:473 hrs ago1772603027
0xD2ce3165...cd6D48c04
0.00025301 ETH
Ccip Send245806882026-03-04 1:04:118 hrs ago1772586251
0xD2ce3165...cd6D48c04
0.00025301 ETH
Prove245806882026-03-04 1:04:118 hrs ago1772586251
0xD2ce3165...cd6D48c04
0.00025301 ETH
Ccip Send245797632026-03-03 21:57:4711 hrs ago1772575067
0xD2ce3165...cd6D48c04
0.00025304 ETH
Prove245797632026-03-03 21:57:4711 hrs ago1772575067
0xD2ce3165...cd6D48c04
0.00025304 ETH
Ccip Send245793172026-03-03 20:28:2312 hrs ago1772569703
0xD2ce3165...cd6D48c04
0.00025304 ETH
Prove245793172026-03-03 20:28:2312 hrs ago1772569703
0xD2ce3165...cd6D48c04
0.00025304 ETH
Ccip Send245770642026-03-03 12:54:5920 hrs ago1772542499
0xD2ce3165...cd6D48c04
0.00025271 ETH
Prove245770642026-03-03 12:54:5920 hrs ago1772542499
0xD2ce3165...cd6D48c04
0.00025271 ETH
Ccip Send245763832026-03-03 10:37:5922 hrs ago1772534279
0xD2ce3165...cd6D48c04
0.00025218 ETH
Prove245763832026-03-03 10:37:5922 hrs ago1772534279
0xD2ce3165...cd6D48c04
0.00025218 ETH
Ccip Send245757152026-03-03 8:23:5924 hrs ago1772526239
0xD2ce3165...cd6D48c04
0.00025219 ETH
Prove245757152026-03-03 8:23:5924 hrs ago1772526239
0xD2ce3165...cd6D48c04
0.00025219 ETH
Ccip Send245751182026-03-03 6:23:4726 hrs ago1772519027
0xD2ce3165...cd6D48c04
0.00025219 ETH
Prove245751182026-03-03 6:23:4726 hrs ago1772519027
0xD2ce3165...cd6D48c04
0.00025219 ETH
Ccip Send245749382026-03-03 5:47:4727 hrs ago1772516867
0xD2ce3165...cd6D48c04
0.00024634 ETH
Prove245749382026-03-03 5:47:4727 hrs ago1772516867
0xD2ce3165...cd6D48c04
0.00024634 ETH
Ccip Send245731722026-03-02 23:53:4733 hrs ago1772495627
0xD2ce3165...cd6D48c04
0.00024635 ETH
Prove245731722026-03-02 23:53:4733 hrs ago1772495627
0xD2ce3165...cd6D48c04
0.00024635 ETH
Ccip Send245730622026-03-02 23:31:3533 hrs ago1772494295
0xD2ce3165...cd6D48c04
0.00024635 ETH
Prove245730622026-03-02 23:31:3533 hrs ago1772494295
0xD2ce3165...cd6D48c04
0.00024635 ETH
Ccip Send245706622026-03-02 15:29:3541 hrs ago1772465375
0xD2ce3165...cd6D48c04
0.00025499 ETH
Prove245706622026-03-02 15:29:3541 hrs ago1772465375
0xD2ce3165...cd6D48c04
0.00025499 ETH
Ccip Send245695892026-03-02 11:53:4745 hrs ago1772452427
0xD2ce3165...cd6D48c04
0.00025499 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
CCIPProver

Compiler Version
v0.8.27+commit.40a35a09

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;

import {MessageBridgeProver} from "./MessageBridgeProver.sol";
import {Semver} from "../libs/Semver.sol";
import {AddressConverter} from "../libs/AddressConverter.sol";
import {
    IRouterClient
} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IRouterClient.sol";
import {
    IAny2EVMMessageReceiver
} from "@chainlink/contracts-ccip/src/v0.8/ccip/interfaces/IAny2EVMMessageReceiver.sol";
import {
    Client
} from "@chainlink/contracts-ccip/src/v0.8/ccip/libraries/Client.sol";

/**
 * @title CCIPProver
 * @notice Prover implementation using Chainlink CCIP (Cross-Chain Interoperability Protocol)
 * @dev Extends MessageBridgeProver to send and receive intent proofs across chains via CCIP
 */
contract CCIPProver is MessageBridgeProver, IAny2EVMMessageReceiver, Semver {
    using AddressConverter for bytes32;
    using AddressConverter for address;

    /// @notice The CCIP proof type identifier
    string public constant PROOF_TYPE = "CCIP";

    /// @notice The CCIP Router contract address
    address public immutable ROUTER;

    /// @notice Struct to reduce stack depth when unpacking calldata
    /// @param sourceChainProver The address of the prover on the source chain (as bytes32)
    /// @param gasLimit The gas limit for execution on the destination chain
    struct UnpackedData {
        address sourceChainProver;
        uint256 gasLimit;
    }

    /**
     * @notice Constructs a new CCIPProver
     * @param router The CCIP Router contract address
     * @param portal The portal contract address
     * @param provers Array of whitelisted prover addresses (as bytes32)
     * @param minGasLimit Minimum gas limit for cross-chain messages (0 for default 200k)
     */
    constructor(
        address router,
        address portal,
        bytes32[] memory provers,
        uint256 minGasLimit
    ) MessageBridgeProver(portal, provers, minGasLimit) {
        if (router == address(0)) revert MessengerContractCannotBeZeroAddress();
        ROUTER = router;
    }

    /**
     * @notice Checks if this contract supports a given interface
     * @dev Overrides to include IAny2EVMMessageReceiver for CCIP compatibility
     * @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(IAny2EVMMessageReceiver).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @notice Receives cross-chain messages from CCIP
     * @dev Only callable by the CCIP Router. Implements IAny2EVMMessageReceiver
     * @param message The CCIP message containing sender, data, and metadata
     */
    function ccipReceive(
        Client.Any2EVMMessage calldata message
    ) external only(ROUTER) {
        // Verify source chain selector is not zero
        if (message.sourceChainSelector == 0) {
            revert MessageOriginChainDomainIDCannotBeZero();
        }

        // Decode sender from bytes to address, then convert to bytes32
        address sender = abi.decode(message.sender, (address));

        // Verify sender address is not zero
        if (sender == address(0)) revert MessageSenderCannotBeZeroAddress();

        // Handle the cross-chain message using base contract functionality
        _handleCrossChainMessage(sender.toBytes32(), message.data);
    }

    /**
     * @notice Dispatches a cross-chain message via CCIP
     * @dev Internal function called by the base contract's prove() function
     * @dev CCIP has a maximum data payload size and a message execution gas limit.
     *      At time of writing, these are 30KB and 3,000,000 gas respectively.
     *      Please check CCIP's documentation for the most up-to-date values.
     * @param domainID The destination chain selector (CCIP uses this as destinationChainSelector)
     * @param encodedProofs The encoded proof data to send
     * @param data Additional data containing source chain prover and gas configuration
     * @param fee The fee amount (in native token) to pay for the cross-chain message
     */
    function _dispatchMessage(
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data,
        uint256 fee
    ) internal override {
        // Unpack the additional data
        UnpackedData memory unpacked = _unpackData(data);

        // Format the CCIP message
        Client.EVM2AnyMessage memory ccipMessage = _formatCCIPMessage(
            unpacked.sourceChainProver,
            encodedProofs,
            unpacked.gasLimit
        );

        // Send the message via CCIP Router
        IRouterClient(ROUTER).ccipSend{value: fee}(domainID, ccipMessage);
    }

    /**
     * @notice Calculates the fee required to send a cross-chain message
     * @dev Public function to query fees before sending
     * @param domainID The destination chain selector
     * @param encodedProofs The encoded proof data to send
     * @param data Additional data containing source chain prover and gas configuration
     * @return The fee amount (in native token) required
     */
    function fetchFee(
        uint64 domainID,
        bytes calldata encodedProofs,
        bytes calldata data
    ) public view override returns (uint256) {
        // Unpack the additional data
        UnpackedData memory unpacked = _unpackData(data);

        // Format the CCIP message
        Client.EVM2AnyMessage memory ccipMessage = _formatCCIPMessage(
            unpacked.sourceChainProver,
            encodedProofs,
            unpacked.gasLimit
        );

        // Query the fee from CCIP Router
        return IRouterClient(ROUTER).getFee(domainID, ccipMessage);
    }

    /**
     * @notice Unpacks the encoded data into structured format
     * @dev Internal helper to avoid stack too deep errors
     * @dev Enforces minimum gas limit to prevent underfunded transactions
     * @param data The encoded data containing source chain prover and gas configuration
     * @return unpacked The unpacked data struct with validated gas limit
     */
    function _unpackData(
        bytes calldata data
    ) internal view returns (UnpackedData memory unpacked) {
        // Decode: (sourceChainProver, gasLimit)
        (
            unpacked.sourceChainProver,
            unpacked.gasLimit
        ) = abi.decode(data, (address, uint256));

        // Enforce minimum gas limit to prevent underfunded transactions
        if (unpacked.gasLimit < MIN_GAS_LIMIT) {
            unpacked.gasLimit = MIN_GAS_LIMIT;
        }
    }

    /**
     * @notice Formats a CCIP message for sending
     * @dev Internal helper to construct the EVM2AnyMessage struct
     * @dev Out-of-order execution is always enabled for optimal performance
     * @param sourceChainProver The prover address on the source chain
     * @param encodedProofs The proof data payload
     * @param gasLimit The gas limit for execution
     * @return ccipMessage The formatted CCIP message
     */
    function _formatCCIPMessage(
        address sourceChainProver,
        bytes calldata encodedProofs,
        uint256 gasLimit
    ) internal pure returns (Client.EVM2AnyMessage memory ccipMessage) {
        // Construct the CCIP message
        ccipMessage = Client.EVM2AnyMessage({
            receiver: abi.encode(sourceChainProver),
            data: encodedProofs,
            tokenAmounts: new Client.EVMTokenAmount[](0), // No token transfers
            feeToken: address(0), // Pay fees in native token
            extraArgs: Client._argsToBytes(
                Client.EVMExtraArgsV2({
                    gasLimit: gasLimit,
                    allowOutOfOrderExecution: true // Always allow out-of-order execution
                })
            )
        });
    }

    /**
     * @notice Returns the proof type identifier
     * @return The proof type string
     */
    function getProofType() external pure override returns (string memory) {
        return PROOF_TYPE;
    }
}

/* -*- 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 3 of 14 : 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 "2.6";
    }
}

/* -*- 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
pragma solidity ^0.8.4;

import {Client} from "../libraries/Client.sol";

interface IRouterClient {
  error UnsupportedDestinationChain(uint64 destChainSelector);
  error InsufficientFeeTokenAmount();
  error InvalidMsgValue();

  /// @notice Checks if the given chain ID is supported for sending/receiving.
  /// @param destChainSelector The chain to check.
  /// @return supported is true if it is supported, false if not.
  function isChainSupported(uint64 destChainSelector) external view returns (bool supported);

  /// @param destinationChainSelector The destination chainSelector
  /// @param message The cross-chain CCIP message including data and/or tokens
  /// @return fee returns execution fee for the message
  /// delivery to destination chain, denominated in the feeToken specified in the message.
  /// @dev Reverts with appropriate reason upon invalid message.
  function getFee(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage memory message
  ) external view returns (uint256 fee);

  /// @notice Request a message to be sent to the destination chain
  /// @param destinationChainSelector The destination chain ID
  /// @param message The cross-chain CCIP message including data and/or tokens
  /// @return messageId The message ID
  /// @dev Note if msg.value is larger than the required fee (from getFee) we accept
  /// the overpayment with no refund.
  /// @dev Reverts with appropriate reason upon invalid message.
  function ccipSend(
    uint64 destinationChainSelector,
    Client.EVM2AnyMessage calldata message
  ) external payable returns (bytes32);
}

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

import {Client} from "../libraries/Client.sol";

/// @notice Application contracts that intend to receive messages from
/// the router should implement this interface.
interface IAny2EVMMessageReceiver {
  /// @notice Called by the Router to deliver a message.
  /// If this reverts, any token transfers also revert. The message
  /// will move to a FAILED state and become available for manual execution.
  /// @param message CCIP Message
  /// @dev Note ensure you check the msg.sender is the OffRampRouter
  function ccipReceive(Client.Any2EVMMessage calldata message) external;
}

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

// End consumer library.
library Client {
  /// @dev RMN depends on this struct, if changing, please notify the RMN maintainers.
  struct EVMTokenAmount {
    address token; // token address on the local chain.
    uint256 amount; // Amount of tokens.
  }

  struct Any2EVMMessage {
    bytes32 messageId; // MessageId corresponding to ccipSend on source.
    uint64 sourceChainSelector; // Source chain selector.
    bytes sender; // abi.decode(sender) if coming from an EVM chain.
    bytes data; // payload sent in original message.
    EVMTokenAmount[] destTokenAmounts; // Tokens and their amounts in their destination chain representation.
  }

  // If extraArgs is empty bytes, the default is 200k gas limit.
  struct EVM2AnyMessage {
    bytes receiver; // abi.encode(receiver address) for dest EVM chains
    bytes data; // Data payload
    EVMTokenAmount[] tokenAmounts; // Token transfers
    address feeToken; // Address of feeToken. address(0) means you will send msg.value.
    bytes extraArgs; // Populate this with _argsToBytes(EVMExtraArgsV2)
  }

  // bytes4(keccak256("CCIP EVMExtraArgsV1"));
  bytes4 public constant EVM_EXTRA_ARGS_V1_TAG = 0x97a657c9;

  struct EVMExtraArgsV1 {
    uint256 gasLimit;
  }

  function _argsToBytes(EVMExtraArgsV1 memory extraArgs) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(EVM_EXTRA_ARGS_V1_TAG, extraArgs);
  }

  // bytes4(keccak256("CCIP EVMExtraArgsV2"));
  bytes4 public constant EVM_EXTRA_ARGS_V2_TAG = 0x181dcf10;

  /// @param gasLimit: gas limit for the callback on the destination chain.
  /// @param allowOutOfOrderExecution: if true, it indicates that the message can be executed in any order relative to other messages from the same sender.
  /// This value's default varies by chain. On some chains, a particular value is enforced, meaning if the expected value
  /// is not set, the message request will revert.
  struct EVMExtraArgsV2 {
    uint256 gasLimit;
    bool allowOutOfOrderExecution;
  }

  function _argsToBytes(EVMExtraArgsV2 memory extraArgs) internal pure returns (bytes memory bts) {
    return abi.encodeWithSelector(EVM_EXTRA_ARGS_V2_TAG, extraArgs);
  }
}

// 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 virtual override returns (bool) {
        return
            interfaceId == type(IProver).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

File 9 of 14 : 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 Messenger contract address cannot be zero
     * @dev MessengerContract is a general term for the message-passing contract that handles
     *      cross-chain communication, used to consolidate errors. Specific implementations'
     *      terminology will reflect that of the protocol and as such may not match up with what is
     *      used in Eco's interface contract.
     */
    error MessengerContractCannotBeZeroAddress();

    /**
     * @notice Message origin chain domain ID cannot be zero
     * @dev DomainID is a general term for the chain identifier used by cross-chain messaging protocols,
     *      used to consolidate errors. Specific implementations' terminology will reflect that of the
     *      protocol and as such may not match up with what is used in Eco's interface contract.
     */
    error MessageOriginChainDomainIDCannotBeZero();

    /**
     * @notice Message sender address cannot be zero
     */
    error MessageSenderCannotBeZeroAddress();

    /**
     * @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 11 of 14 : 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
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
     *      - CCIP: Uses chain selectors that are totally separate from 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;
    }
}

// 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/",
    "@chainlink/contracts-ccip/=node_modules/@chainlink/contracts-ccip/",
    "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":"router","type":"address"},{"internalType":"address","name":"portal","type":"address"},{"internalType":"bytes32[]","name":"provers","type":"bytes32[]"},{"internalType":"uint256","name":"minGasLimit","type":"uint256"}],"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":"MessageOriginChainDomainIDCannotBeZero","type":"error"},{"inputs":[],"name":"MessageSenderCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"MessengerContractCannotBeZeroAddress","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":"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":"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":[],"name":"ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"bytes32","name":"messageId","type":"bytes32"},{"internalType":"uint64","name":"sourceChainSelector","type":"uint64"},{"internalType":"bytes","name":"sender","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"internalType":"struct Client.EVMTokenAmount[]","name":"destTokenAmounts","type":"tuple[]"}],"internalType":"struct Client.Any2EVMMessage","name":"message","type":"tuple"}],"name":"ccipReceive","outputs":[],"stateMutability":"nonpayable","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":"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"}]

6103806040523461061e576124ef8038038061001a81610639565b92833981019060808183031261061e576100338161065e565b916100406020830161065e565b60408301519092906001600160401b03811161061e5781019082601f8301121561061e578151926001600160401b038411610623578360051b926020610087818601610639565b8096815201906020829582010192831161061e57602001905b82821061060e5750505060600151926001600160a01b038116156105fd576080528151601481116105e45750815160a0528151156105dc5781511561054057515b60c05260018151116000146105d5578051600110156105405760408101515b60e05260028151116000146105ce578051600210156105405760608101515b6101005260038151116000146105c7578051600310156105405760808101515b6101205260048151116000146105c0578051600410156105405760a08101515b6101405260058151116000146105b9578051600510156105405760c08101515b6101605260068151116000146105b2578051600610156105405760e08101515b6101805260078151116000146105ab57805160071015610540576101008101515b6101a05260088151116000146105a457805160081015610540576101208101515b6101c052600981511160001461059d57805160091015610540576101408101515b6101e052600a815111600014610596578051600a1015610540576101608101515b61020052600b81511160001461058f578051600b1015610540576101808101515b61022052600c815111600014610588578051600c1015610540576101a08101515b61024052600d815111600014610581578051600d1015610540576101c08101515b61026052600e81511160001461057a578051600e1015610540576101e08101515b61028052600f815111600014610573578051600f1015610540576102008101515b6102a052601081511160001461056c57805160101015610540576102208101515b6102c052601181511160001461056557805160111015610540576102408101515b6102e052601281511160001461055e57805160121015610540576102608101515b610300526013815111600014610556578051601310156105405761028001515b610320528015610536575b610340526001600160a01b038116156105255761036052604051611e7c908161067382396080518181816108a10152611007015260a05181818161022d01528181610b1501526112e9015260c0518181816107c20152611317015260e051818181610790015261134701526101005181818161075b015261137701526101205181818161072601526113a70152610140518181816106f101526113d70152610160518181816106bc0152611407015261018051818181610687015261143701526101a051818181610651015261146701526101c05181818161061b015261149701526101e0518181816105e501526114c70152610200518181816105af01526114f70152610220518181816105790152611527015261024051818181610543015261155701526102605181818161050d01526115870152610280518181816104d701526115b701526102a0518181816104a101526115e701526102c05181818161046b015261161701526102e05181818161043501526116470152610300518181816103ff015261167701526103205181818161039a01526116a5015261034051818181610e1d0152611a0501526103605181818161097901528181610c5401528181610f9801526118a60152f35b63c5e6415560e01b60005260046000fd5b5062030d40610356565b634e487b7160e01b600052603260045260246000fd5b50600061034b565b600061032b565b600061030a565b60006102e9565b60006102c8565b60006102a7565b6000610286565b6000610265565b6000610244565b6000610223565b6000610202565b60006101e1565b60006101c0565b600061019f565b600061017f565b600061015f565b600061013f565b600061011f565b6000610100565b5060006100e1565b63059291f560e51b600052600452601460245260446000fd5b631b973f8d60e11b60005260046000fd5b81518152602091820191016100a0565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761062357604052565b51906001600160a01b038216820361061e5756fe608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe1461111d5750806301ffc9a71461102b5780630ff754ea14610fbc57806332fe7b2614610f4d57806354f10f0e14610ebd57806354fd4d5014610e405780637ce1ffeb14610de757806385572ffb14610bcb57806399d145b214610b3857806399db89b514610adf5780639bcd850f14610a8d578063bc8c7df214610a8d578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb611160565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a60688261126b565b51902090816000526000602052602060406000206040519061016b82611204565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000061025581611994565b90610263604051928361126b565b80825261026f81611994565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577f000000000000000000000000000000000000000000000000000000000000000060808401526102bb565b8251600210156103c4577f000000000000000000000000000000000000000000000000000000000000000060608401526102b2565b8251600110156103c4577f000000000000000000000000000000000000000000000000000000000000000060408401526102a9565b8251156103c4577f000000000000000000000000000000000000000000000000000000000000000082526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f757610866903690600401611177565b9060643567ffffffffffffffff81116101f757610887903690600401611177565b73ffffffffffffffffffffffffffffffffffffffff9491947f000000000000000000000000000000000000000000000000000000000000000016803303610a5c57506108d68186868686611820565b90813410610a2e57813411600014610a1857813403933485116109e9576109609561090761092a93602097996119ac565b918673ffffffffffffffffffffffffffffffffffffffff84511693015192611a32565b916040518095819482937f96f4e9f9000000000000000000000000000000000000000000000000000000008452600484016116dc565b039173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156109dd576109b2575b506109b091611bd3565b005b602090813d83116109d6575b6109c8818361126b565b810103126101f757826109a6565b503d6109be565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6020936109609561090761092a936000996119ac565b507f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610adb610ac76112ac565b6040519182916020835260208301906111a5565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610b6f61197b565b50600435600052600060205260408060002067ffffffffffffffff825191610b9683611204565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043567ffffffffffffffff81116101f757806004019060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101f75773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610a5c5750602481013567ffffffffffffffff81168091036101f75715610dbd576020610ca76044830184611909565b90809291810103126101f757610cd173ffffffffffffffffffffffffffffffffffffffff9161195a565b16918215610d93576064610ce6920190611909565b9091610cf1816112e7565b15610d66575060088110610d3c57806008116101f7576109b09160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611c5d565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f3005f93c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f7849b0540000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610adb6040805190610e81818361126b565b600382527f322e3600000000000000000000000000000000000000000000000000000000006020830152519182916020835260208301906111a5565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610ef4611160565b60243567ffffffffffffffff81116101f757610f14903690600401611177565b91906044359167ffffffffffffffff83116101f757602093610f3d610f45943690600401611177565b939092611820565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f85572ffb00000000000000000000000000000000000000000000000000000000602092149081156110c0575b506040519015158152f35b7f42c7e0fe000000000000000000000000000000000000000000000000000000008114915081156110f3575b50826110b5565b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014826110ec565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760209061115a6004356112e7565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111ef5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016111b0565b6040810190811067ffffffffffffffff82111761122057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761122057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761122057604052565b604051906112bb60408361126b565b600482527f43434950000000000000000000000000000000000000000000000000000000006020830152565b7f000000000000000000000000000000000000000000000000000000000000000080156116d55781156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760018111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760028111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760038111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760048111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760058111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760068111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760078111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760088111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760098111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600a8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600b8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600c8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600d8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600e8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600f8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760108111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760118111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760128111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57601310156116c8577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b9067ffffffffffffffff909392931681526040602082015261174161170d845160a0604085015260e08401906111a5565b60208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526111a5565b906040840151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08282030160808301526020808451928381520193019060005b8181106117e85750505060808473ffffffffffffffffffffffffffffffffffffffff60606117e5969701511660a084015201519060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828503019101526111a5565b90565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101518187015260409095019490920191600101611782565b91906118589161183561188d966020966119ac565b918573ffffffffffffffffffffffffffffffffffffffff84511693015192611a32565b9060405193849283927f20487ded000000000000000000000000000000000000000000000000000000008452600484016116dc565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109dd576000916118da575090565b90506020813d602011611901575b816118f56020938361126b565b810103126101f7575190565b3d91506118e8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101f7570180359067ffffffffffffffff82116101f7576020019181360383136101f757565b359073ffffffffffffffffffffffffffffffffffffffff821682036101f757565b6040519061198882611204565b60006020838281520152565b67ffffffffffffffff81116112205760051b60200190565b919091604051906119bc82611204565b60008252600060208301526040818395810103126101f75760206119df8261195a565b9101359173ffffffffffffffffffffffffffffffffffffffff60208201928484521690527f0000000000000000000000000000000000000000000000000000000000000000809210611a2f575050565b52565b929160019160606080604051611a478161124f565b828152826020820152826040820152600083820152015273ffffffffffffffffffffffffffffffffffffffff6040519516602086015260208552611a8c60408661126b565b602060405192611a9c828561126b565b60008452600094611bb6575b60405195611ab587611204565b865281860160018152604051967f181dcf100000000000000000000000000000000000000000000000000000000084890152516024880152511515604487015260448652611b0460648761126b565b60405196611b118861124f565b875267ffffffffffffffff8111611b895760405192611b57601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01684018561126b565b8184523682820111611b85578186928492838701378401015285015260408401526060830152608082015290565b8580fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b611aa8565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611c1a575b611c165760008080938193828215611c0d575bf1156109dd57565b506108fc611c05565b5050565b508115611bf2565b359060208110611c30575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611e7757603f8216611e4d578160061c9160005b838110611c82575050505050565b8060061b818104604014821517156109e95760208101908181116109e957611cb5611caf8383878b611bbb565b90611c22565b9060009260408201809211611e2057611caf600195949392611cd892888c611bbb565b8060a01c611e185773ffffffffffffffffffffffffffffffffffffffff16918215611e18578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611d5a57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611c74565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611d8a81611204565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611d54565b505050611d54565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b5050505600000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d2ce3165a67bdccbb535bc1dc8634eecd6d48c04

Deployed Bytecode

0x608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe1461111d5750806301ffc9a71461102b5780630ff754ea14610fbc57806332fe7b2614610f4d57806354f10f0e14610ebd57806354fd4d5014610e405780637ce1ffeb14610de757806385572ffb14610bcb57806399d145b214610b3857806399db89b514610adf5780639bcd850f14610a8d578063bc8c7df214610a8d578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb611160565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a60688261126b565b51902090816000526000602052602060406000206040519061016b82611204565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000161025581611994565b90610263604051928361126b565b80825261026f81611994565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577f000000000000000000000000000000000000000000000000000000000000000060808401526102bb565b8251600210156103c4577f000000000000000000000000000000000000000000000000000000000000000060608401526102b2565b8251600110156103c4577f000000000000000000000000000000000000000000000000000000000000000060408401526102a9565b8251156103c4577f000000000000000000000000d2ce3165a67bdccbb535bc1dc8634eecd6d48c0482526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f757610866903690600401611177565b9060643567ffffffffffffffff81116101f757610887903690600401611177565b73ffffffffffffffffffffffffffffffffffffffff9491947f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede9716803303610a5c57506108d68186868686611820565b90813410610a2e57813411600014610a1857813403933485116109e9576109609561090761092a93602097996119ac565b918673ffffffffffffffffffffffffffffffffffffffff84511693015192611a32565b916040518095819482937f96f4e9f9000000000000000000000000000000000000000000000000000000008452600484016116dc565b039173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d165af180156109dd576109b2575b506109b091611bd3565b005b602090813d83116109d6575b6109c8818361126b565b810103126101f757826109a6565b503d6109be565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6020936109609561090761092a936000996119ac565b507f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610adb610ac76112ac565b6040519182916020835260208301906111a5565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000018152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610b6f61197b565b50600435600052600060205260408060002067ffffffffffffffff825191610b9683611204565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043567ffffffffffffffff81116101f757806004019060a07ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc82360301126101f75773ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d16803303610a5c5750602481013567ffffffffffffffff81168091036101f75715610dbd576020610ca76044830184611909565b90809291810103126101f757610cd173ffffffffffffffffffffffffffffffffffffffff9161195a565b16918215610d93576064610ce6920190611909565b9091610cf1816112e7565b15610d66575060088110610d3c57806008116101f7576109b09160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611c5d565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f3005f93c0000000000000000000000000000000000000000000000000000000060005260046000fd5b7f7849b0540000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f0000000000000000000000000000000000000000000000000000000000030d408152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610adb6040805190610e81818361126b565b600382527f322e3600000000000000000000000000000000000000000000000000000000006020830152519182916020835260208301906111a5565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610ef4611160565b60243567ffffffffffffffff81116101f757610f14903690600401611177565b91906044359167ffffffffffffffff83116101f757602093610f3d610f45943690600401611177565b939092611820565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f85572ffb00000000000000000000000000000000000000000000000000000000602092149081156110c0575b506040519015158152f35b7f42c7e0fe000000000000000000000000000000000000000000000000000000008114915081156110f3575b50826110b5565b7f01ffc9a700000000000000000000000000000000000000000000000000000000915014826110ec565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760209061115a6004356112e7565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111ef5750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b806020809284010151828286010152016111b0565b6040810190811067ffffffffffffffff82111761122057604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60a0810190811067ffffffffffffffff82111761122057604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff82111761122057604052565b604051906112bb60408361126b565b600482527f43434950000000000000000000000000000000000000000000000000000000006020830152565b7f000000000000000000000000000000000000000000000000000000000000000180156116d55781156116d557817f000000000000000000000000d2ce3165a67bdccbb535bc1dc8634eecd6d48c04146116ce5760018111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760028111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760038111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760048111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760058111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760068111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760078111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760088111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760098111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600a8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600b8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600c8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600d8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600e8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57600f8111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760108111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760118111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce5760128111156116d557817f0000000000000000000000000000000000000000000000000000000000000000146116ce57601310156116c8577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b9067ffffffffffffffff909392931681526040602082015261174161170d845160a0604085015260e08401906111a5565b60208501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08483030160608501526111a5565b906040840151917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc08282030160808301526020808451928381520193019060005b8181106117e85750505060808473ffffffffffffffffffffffffffffffffffffffff60606117e5969701511660a084015201519060c07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0828503019101526111a5565b90565b8251805173ffffffffffffffffffffffffffffffffffffffff1686526020908101518187015260409095019490920191600101611782565b91906118589161183561188d966020966119ac565b918573ffffffffffffffffffffffffffffffffffffffff84511693015192611a32565b9060405193849283927f20487ded000000000000000000000000000000000000000000000000000000008452600484016116dc565b038173ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d165afa9081156109dd576000916118da575090565b90506020813d602011611901575b816118f56020938361126b565b810103126101f7575190565b3d91506118e8565b9035907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1813603018212156101f7570180359067ffffffffffffffff82116101f7576020019181360383136101f757565b359073ffffffffffffffffffffffffffffffffffffffff821682036101f757565b6040519061198882611204565b60006020838281520152565b67ffffffffffffffff81116112205760051b60200190565b919091604051906119bc82611204565b60008252600060208301526040818395810103126101f75760206119df8261195a565b9101359173ffffffffffffffffffffffffffffffffffffffff60208201928484521690527f0000000000000000000000000000000000000000000000000000000000030d40809210611a2f575050565b52565b929160019160606080604051611a478161124f565b828152826020820152826040820152600083820152015273ffffffffffffffffffffffffffffffffffffffff6040519516602086015260208552611a8c60408661126b565b602060405192611a9c828561126b565b60008452600094611bb6575b60405195611ab587611204565b865281860160018152604051967f181dcf100000000000000000000000000000000000000000000000000000000084890152516024880152511515604487015260448652611b0460648761126b565b60405196611b118861124f565b875267ffffffffffffffff8111611b895760405192611b57601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01684018561126b565b8184523682820111611b85578186928492838701378401015285015260408401526060830152608082015290565b8580fd5b6024857f4e487b710000000000000000000000000000000000000000000000000000000081526041600452fd5b611aa8565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611c1a575b611c165760008080938193828215611c0d575bf1156109dd57565b506108fc611c05565b5050565b508115611bf2565b359060208110611c30575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611e7757603f8216611e4d578160061c9160005b838110611c82575050505050565b8060061b818104604014821517156109e95760208101908181116109e957611cb5611caf8383878b611bbb565b90611c22565b9060009260408201809211611e2057611caf600195949392611cd892888c611bbb565b8060a01c611e185773ffffffffffffffffffffffffffffffffffffffff16918215611e18578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611d5a57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611c74565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611d8a81611204565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611d54565b505050611d54565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505056

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

00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede9700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000030d400000000000000000000000000000000000000000000000000000000000000001000000000000000000000000d2ce3165a67bdccbb535bc1dc8634eecd6d48c04

-----Decoded View---------------
Arg [0] : router (address): 0x80226fc0Ee2b096224EeAc085Bb9a8cba1146f7D
Arg [1] : portal (address): 0x399Dbd5DF04f83103F77A58cBa2B7c4d3cdede97
Arg [2] : provers (bytes32[]): System.Byte[]
Arg [3] : minGasLimit (uint256): 200000

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 00000000000000000000000080226fc0ee2b096224eeac085bb9a8cba1146f7d
Arg [1] : 000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [3] : 0000000000000000000000000000000000000000000000000000000000030d40
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [5] : 000000000000000000000000d2ce3165a67bdccbb535bc1dc8634eecd6d48c04


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