Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Ccip Send | 24582081 | 3 hrs ago | 0.00025301 ETH | ||||
| Prove | 24582081 | 3 hrs ago | 0.00025301 ETH | ||||
| Ccip Send | 24580688 | 8 hrs ago | 0.00025301 ETH | ||||
| Prove | 24580688 | 8 hrs ago | 0.00025301 ETH | ||||
| Ccip Send | 24579763 | 11 hrs ago | 0.00025304 ETH | ||||
| Prove | 24579763 | 11 hrs ago | 0.00025304 ETH | ||||
| Ccip Send | 24579317 | 12 hrs ago | 0.00025304 ETH | ||||
| Prove | 24579317 | 12 hrs ago | 0.00025304 ETH | ||||
| Ccip Send | 24577064 | 20 hrs ago | 0.00025271 ETH | ||||
| Prove | 24577064 | 20 hrs ago | 0.00025271 ETH | ||||
| Ccip Send | 24576383 | 22 hrs ago | 0.00025218 ETH | ||||
| Prove | 24576383 | 22 hrs ago | 0.00025218 ETH | ||||
| Ccip Send | 24575715 | 24 hrs ago | 0.00025219 ETH | ||||
| Prove | 24575715 | 24 hrs ago | 0.00025219 ETH | ||||
| Ccip Send | 24575118 | 26 hrs ago | 0.00025219 ETH | ||||
| Prove | 24575118 | 26 hrs ago | 0.00025219 ETH | ||||
| Ccip Send | 24574938 | 27 hrs ago | 0.00024634 ETH | ||||
| Prove | 24574938 | 27 hrs ago | 0.00024634 ETH | ||||
| Ccip Send | 24573172 | 33 hrs ago | 0.00024635 ETH | ||||
| Prove | 24573172 | 33 hrs ago | 0.00024635 ETH | ||||
| Ccip Send | 24573062 | 33 hrs ago | 0.00024635 ETH | ||||
| Prove | 24573062 | 33 hrs ago | 0.00024635 ETH | ||||
| Ccip Send | 24570662 | 41 hrs ago | 0.00025499 ETH | ||||
| Prove | 24570662 | 41 hrs ago | 0.00025499 ETH | ||||
| Ccip Send | 24569589 | 45 hrs ago | 0.00025499 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
CCIPProver
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.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);
}// 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);
}
}// 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;
}
}// 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);
}{
"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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.