Source Code
Overview
APE Balance
APE Value
$0.00Multichain Info
N/A
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 24785138 | 108 days ago | Contract Creation | 0 APE |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
HyperProver
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 1000000 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {IMessageRecipient} from "@hyperlane-xyz/core/contracts/interfaces/IMessageRecipient.sol";
import {TypeCasts} from "@hyperlane-xyz/core/contracts/libs/TypeCasts.sol";
import {MessageBridgeProver} from "./MessageBridgeProver.sol";
import {Semver} from "../libs/Semver.sol";
import {IMailbox, IPostDispatchHook} from "@hyperlane-xyz/core/contracts/interfaces/IMailbox.sol";
/**
* @title HyperProver
* @notice Prover implementation using Hyperlane's cross-chain messaging system
* @dev Processes proof messages from Hyperlane mailbox and records proven intents
*/
contract HyperProver is IMessageRecipient, MessageBridgeProver, Semver {
using TypeCasts for bytes32;
/**
* @notice Struct for unpacked data from _data parameter
* @dev Only contains fields decoded from the _data parameter
*/
struct UnpackedData {
bytes32 sourceChainProver; // Address of prover on source chain
bytes metadata; // Metadata for Hyperlane message
address hookAddr; // Address of post-dispatch hook
}
/**
* @notice Struct for Hyperlane dispatch parameters
* @dev Consolidates message dispatch parameters to reduce stack usage
*/
struct DispatchParams {
uint32 destinationDomain; // Hyperlane domain ID
bytes32 recipientAddress; // Recipient address encoded as bytes32
bytes messageBody; // Encoded message body with intent hashes and claimants
bytes metadata; // Additional metadata for the message
IPostDispatchHook hook; // Post-dispatch hook contract
}
/**
* @notice Constant indicating this contract uses Hyperlane for proving
*/
string public constant PROOF_TYPE = "Hyperlane";
/**
* @notice Address of local Hyperlane mailbox
*/
address public immutable MAILBOX;
/**
* @param mailbox Address of local Hyperlane mailbox
* @param portal Address of Portal contract
* @param provers Array of trusted prover addresses (as bytes32 for cross-VM compatibility)
*/
constructor(
address mailbox,
address portal,
bytes32[] memory provers
) MessageBridgeProver(portal, provers, 0) {
if (mailbox == address(0)) revert MailboxCannotBeZeroAddress();
MAILBOX = mailbox;
}
/**
* @notice Handles incoming Hyperlane messages containing proof data
* @dev Processes batch updates to proven intents from valid sources
* @param origin Origin chain ID from the source chain
* @param sender Address that dispatched the message on source chain
* @param messageBody Encoded array of intent hashes and claimants
*/
function handle(
uint32 origin,
bytes32 sender,
bytes calldata messageBody
) public payable only(MAILBOX) {
// Verify origin and sender are valid
if (origin == 0) revert ZeroDomainID();
// Validate sender is not zero
if (sender == bytes32(0)) revert SenderCannotBeZeroAddress();
_handleCrossChainMessage(sender, messageBody);
}
/**
* @notice Implementation of message dispatch for Hyperlane
* @dev Called by base prove() function after common validations
* @param domainID Domain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting
* @param fee Fee amount for message dispatch
*/
function _dispatchMessage(
uint64 domainID,
bytes calldata encodedProofs,
bytes calldata data,
uint256 fee
) internal override {
// Parse incoming data into a structured format for processing
UnpackedData memory unpacked = _unpackData(data);
// Prepare parameters for cross-chain message dispatch using a struct
// to reduce stack usage and improve code maintainability
DispatchParams memory params = _formatHyperlaneMessage(
domainID,
encodedProofs,
unpacked
);
// Send the message through Hyperlane mailbox using params from the struct
// Note: Some Hyperlane versions have different dispatch signatures.
// This matches the expected signature for testing.
IMailbox(MAILBOX).dispatch{value: fee}(
params.destinationDomain,
params.recipientAddress,
params.messageBody,
params.metadata,
params.hook
);
}
/**
* @notice Calculates the fee required for Hyperlane message dispatch
* @dev Queries the Mailbox contract for accurate fee estimation
* @param domainID Domain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting
* @return Fee amount required for message dispatch
*/
function fetchFee(
uint64 domainID,
bytes calldata encodedProofs,
bytes calldata data
) public view override returns (uint256) {
// Decode structured data from the raw input
UnpackedData memory unpacked = _unpackData(data);
// Process fee calculation using the decoded struct
// This architecture separates decoding from core business logic
return _fetchFee(domainID, encodedProofs, unpacked);
}
/**
* @notice Decodes the raw cross-chain message data into a structured format
* @dev Parses ABI-encoded parameters into the UnpackedData struct
* @param data Raw message data containing source chain information
* @return unpacked Structured representation of the decoded parameters
*/
function _unpackData(
bytes calldata data
) internal pure returns (UnpackedData memory unpacked) {
unpacked = abi.decode(data, (UnpackedData));
}
/**
* @notice Internal function to calculate the fee with pre-decoded data
* @param domainID Domain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param unpacked Struct containing decoded data from data parameter
* @return Fee amount required for message dispatch
*/
function _fetchFee(
uint64 domainID,
bytes calldata encodedProofs,
UnpackedData memory unpacked
) internal view returns (uint256) {
// Format and prepare message parameters for dispatch
DispatchParams memory params = _formatHyperlaneMessage(
domainID,
encodedProofs,
unpacked
);
// Query Hyperlane mailbox for accurate fee estimate
return
IMailbox(MAILBOX).quoteDispatch(
params.destinationDomain,
params.recipientAddress,
params.messageBody,
params.metadata,
params.hook
);
}
/**
* @notice Returns the proof type used by this prover
* @return ProofType indicating Hyperlane proving mechanism
*/
function getProofType() external pure override returns (string memory) {
return PROOF_TYPE;
}
/**
* @notice Formats data for Hyperlane message dispatch with encoded proofs
* @dev Prepares all parameters needed for the Mailbox dispatch call
* @param domainID Domain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param unpacked Struct containing decoded data from data parameter
* @return params Structured dispatch parameters for Hyperlane message
*/
function _formatHyperlaneMessage(
uint64 domainID,
bytes calldata encodedProofs,
UnpackedData memory unpacked
) internal view returns (DispatchParams memory params) {
// Convert domain ID to Hyperlane domain ID format with overflow check
if (domainID > type(uint32).max) {
revert DomainIdTooLarge(domainID);
}
params.destinationDomain = uint32(domainID);
// Use the source chain prover address as the message recipient
params.recipientAddress = unpacked.sourceChainProver;
params.messageBody = encodedProofs;
// Pass through metadata as provided
params.metadata = unpacked.metadata;
// Default to mailbox's hook if none provided, following Hyperlane best practices
params.hook = (unpacked.hookAddr == address(0))
? IMailbox(MAILBOX).defaultHook()
: IPostDispatchHook(unpacked.hookAddr);
}
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
interface IMessageRecipient {
function handle(
uint32 _origin,
bytes32 _sender,
bytes calldata _message
) external payable;
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
library TypeCasts {
// alignment preserving cast
function addressToBytes32(address _addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(_addr)));
}
// alignment preserving cast
function bytes32ToAddress(bytes32 _buf) internal pure returns (address) {
return address(uint160(uint256(_buf)));
}
}/* -*- c-basic-offset: 4 -*- */
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {BaseProver} from "./BaseProver.sol";
import {IMessageBridgeProver} from "../interfaces/IMessageBridgeProver.sol";
import {Whitelist} from "../libs/Whitelist.sol";
/**
* @title MessageBridgeProver
* @notice Abstract contract for cross-chain message-based proving mechanisms
* @dev Extends BaseProver with functionality for message bridge provers like Hyperlane and Metalayer
*/
abstract contract MessageBridgeProver is
BaseProver,
IMessageBridgeProver,
Whitelist
{
/**
* @notice Minimum gas limit for cross-chain message dispatch
* @dev Set at deployment and cannot be changed afterward. Gas limits below this value will be increased to this minimum.
*/
uint256 public immutable MIN_GAS_LIMIT;
/**
* @notice Default minimum gas limit for cross-chain messages
* @dev Used if no specific value is provided during contract deployment
*/
uint256 private constant DEFAULT_MIN_GAS_LIMIT = 200_000;
/**
* @notice Initializes the MessageBridgeProver contract
* @param portal Address of the Portal contract
* @param provers Array of trusted prover addresses (as bytes32 for cross-VM compatibility)
* @param minGasLimit Minimum gas limit for cross-chain messages (200k if not specified or zero)
*/
constructor(
address portal,
bytes32[] memory provers,
uint256 minGasLimit
) BaseProver(portal) Whitelist(provers) {
MIN_GAS_LIMIT = minGasLimit > 0 ? minGasLimit : 200_000;
}
/**
* @notice Modifier to restrict function access to a specific sender
* @param expectedSender Address that is expected to be the sender
*/
modifier only(address expectedSender) {
if (msg.sender != expectedSender) {
revert UnauthorizedSender(expectedSender, msg.sender);
}
_;
}
/**
* @notice Send refund to the user if they've overpaid
* @param recipient Address to send the refund to
* @param amount Amount to refund
*/
function _sendRefund(address recipient, uint256 amount) internal {
if (recipient == address(0) || amount == 0) {
return;
}
payable(recipient).transfer(amount);
}
/**
* @notice Handles cross-chain messages containing proof data
* @dev Common implementation to validate and process cross-chain messages
* @param messageSender Address that dispatched the message on source chain (as bytes32 for cross-VM compatibility)
* @param message Encoded message with chain ID prepended, followed by (intentHash, claimant) pairs
*/
function _handleCrossChainMessage(
bytes32 messageSender,
bytes calldata message
) internal {
// Verify dispatch originated from a whitelisted prover address
if (!isWhitelisted(messageSender)) {
revert UnauthorizedIncomingProof(messageSender);
}
// Extract the chain ID from the beginning of the message
// Message format: [chainId (8 bytes as uint64)] + [encodedProofs]
if (message.length < 8) {
revert InvalidProofMessage();
}
// Convert raw 8 bytes to uint64 - the chain ID is stored as big-endian bytes
bytes8 chainIdBytes = bytes8(message[0:8]);
uint64 actualChainId = uint64(chainIdBytes);
bytes calldata encodedProofs = message[8:];
// Process the intent proofs using the chain ID extracted from the message
_processIntentProofs(encodedProofs, actualChainId);
}
/**
* @notice Common prove function implementation for message bridge provers
* @dev Handles fee calculation, validation, and message dispatch
* @param sender Address that initiated the proving request
* @param domainID Bridge-specific domain ID of the source chain (where the intent was created).
* IMPORTANT: This is NOT the chain ID. Each bridge provider uses their own
* domain ID mapping system. You MUST check with the specific bridge provider
* (Hyperlane, LayerZero, Metalayer) documentation to determine the correct
* domain ID for the source chain.
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting
*/
function prove(
address sender,
uint64 domainID,
bytes calldata encodedProofs,
bytes calldata data
) external payable virtual override only(PORTAL) {
// Calculate fee using implementation-specific logic
uint256 fee = fetchFee(domainID, encodedProofs, data);
// Check if enough fee was provided
if (msg.value < fee) {
revert InsufficientFee(fee);
}
// Calculate refund amount if overpaid
uint256 refundAmount = msg.value > fee ? msg.value - fee : 0;
// Dispatch message using implementation-specific logic
_dispatchMessage(domainID, encodedProofs, data, fee);
// Send refund if needed
_sendRefund(sender, refundAmount);
}
/**
* @notice Abstract function to dispatch message via specific bridge
* @dev Must be implemented by concrete provers (HyperProver, MetaProver)
* @param sourceChainId Chain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting
* @param fee Fee amount for message dispatch
*/
function _dispatchMessage(
uint64 sourceChainId,
bytes calldata encodedProofs,
bytes calldata data,
uint256 fee
) internal virtual;
/**
* @notice Fetches fee required for message dispatch
* @dev Must be implemented by concrete provers to calculate bridge-specific fees
* @param sourceChainId Chain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting
* @return Fee amount required for message dispatch
*/
function fetchFee(
uint64 sourceChainId,
bytes calldata encodedProofs,
bytes calldata data
) public view virtual returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ISemver} from "../interfaces/ISemver.sol";
/**
* @title Semver
* @notice Implements semantic versioning for contracts
* @dev Abstract contract that provides a standard way to access version information
*/
abstract contract Semver is ISemver {
/**
* @notice Returns the semantic version of the contract
* @dev Implementation of ISemver interface
* @return Current version string in semantic format
*/
function version() external pure returns (string memory) { return "3.2"; }
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;
import {IInterchainSecurityModule} from "./IInterchainSecurityModule.sol";
import {IPostDispatchHook} from "./hooks/IPostDispatchHook.sol";
interface IMailbox {
// ============ Events ============
/**
* @notice Emitted when a new message is dispatched via Hyperlane
* @param sender The address that dispatched the message
* @param destination The destination domain of the message
* @param recipient The message recipient address on `destination`
* @param message Raw bytes of message
*/
event Dispatch(
address indexed sender,
uint32 indexed destination,
bytes32 indexed recipient,
bytes message
);
/**
* @notice Emitted when a new message is dispatched via Hyperlane
* @param messageId The unique message identifier
*/
event DispatchId(bytes32 indexed messageId);
/**
* @notice Emitted when a Hyperlane message is processed
* @param messageId The unique message identifier
*/
event ProcessId(bytes32 indexed messageId);
/**
* @notice Emitted when a Hyperlane message is delivered
* @param origin The origin domain of the message
* @param sender The message sender address on `origin`
* @param recipient The address that handled the message
*/
event Process(
uint32 indexed origin,
bytes32 indexed sender,
address indexed recipient
);
function localDomain() external view returns (uint32);
function delivered(bytes32 messageId) external view returns (bool);
function defaultIsm() external view returns (IInterchainSecurityModule);
function defaultHook() external view returns (IPostDispatchHook);
function requiredHook() external view returns (IPostDispatchHook);
function latestDispatchedId() external view returns (bytes32);
function dispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata messageBody
) external payable returns (bytes32 messageId);
function quoteDispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata messageBody
) external view returns (uint256 fee);
function dispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata body,
bytes calldata defaultHookMetadata
) external payable returns (bytes32 messageId);
function quoteDispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata messageBody,
bytes calldata defaultHookMetadata
) external view returns (uint256 fee);
function dispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata body,
bytes calldata customHookMetadata,
IPostDispatchHook customHook
) external payable returns (bytes32 messageId);
function quoteDispatch(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes calldata messageBody,
bytes calldata customHookMetadata,
IPostDispatchHook customHook
) external view returns (uint256 fee);
function process(
bytes calldata metadata,
bytes calldata message
) external payable;
function recipientIsm(
address recipient
) external view returns (IInterchainSecurityModule module);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
import {IProver} from "../interfaces/IProver.sol";
import {ERC165} from "@openzeppelin/contracts/utils/introspection/ERC165.sol";
import {AddressConverter} from "../libs/AddressConverter.sol";
/**
* @title BaseProver
* @notice Base implementation for intent proving contracts
* @dev Provides core storage and functionality for tracking proven intents
* and their claimants
*/
abstract contract BaseProver is IProver, ERC165 {
using AddressConverter for bytes32;
/**
* @notice Address of the Portal contract
* @dev Immutable to prevent unauthorized changes
*/
address public immutable PORTAL;
/**
* @notice Mapping from intent hash to proof data
* @dev Empty struct (zero claimant) indicates intent hasn't been proven
*/
mapping(bytes32 => ProofData) internal _provenIntents;
/**
* @notice Get proof data for an intent
* @param intentHash The intent hash to query
* @return ProofData struct containing claimant and destination
*/
function provenIntents(
bytes32 intentHash
) external view returns (ProofData memory) {
return _provenIntents[intentHash];
}
/**
* @notice Initializes the BaseProver contract
* @param portal Address of the Portal contract
*/
constructor(address portal) {
if (portal == address(0)) {
revert ZeroPortal();
}
PORTAL = portal;
}
/**
* @notice Process intent proofs from a cross-chain message
* @param data Encoded (intentHash, claimant) pairs (without chain ID prefix)
* @param destination Chain ID where the intent is being proven
*/
function _processIntentProofs(
bytes calldata data,
uint64 destination
) internal {
// If data is empty, just return early
if (data.length == 0) return;
// Ensure data length is multiple of 64 bytes (32 for hash + 32 for claimant)
if (data.length % 64 != 0) {
revert ArrayLengthMismatch();
}
uint256 numPairs = data.length / 64;
for (uint256 i = 0; i < numPairs; i++) {
uint256 offset = i * 64;
// Extract intentHash and claimant using slice
bytes32 intentHash = bytes32(data[offset:offset + 32]);
bytes32 claimantBytes = bytes32(data[offset + 32:offset + 64]);
// Check if the claimant bytes32 represents a valid Ethereum address
if (!claimantBytes.isValidAddress()) {
// Skip non-EVM addresses that can't be converted
continue;
}
address claimant = claimantBytes.toAddress();
// Validate claimant is not zero address
if (claimant == address(0)) {
continue; // Skip invalid claimants
}
// Skip rather than revert for already proven intents
if (_provenIntents[intentHash].claimant != address(0)) {
emit IntentAlreadyProven(intentHash);
} else {
_provenIntents[intentHash] = ProofData({
claimant: claimant,
destination: destination
});
emit IntentProven(intentHash, claimant, destination);
}
}
}
/**
* @notice Challenge an intent proof if destination chain ID doesn't match
* @dev Can be called by anyone to remove invalid proofs. This is a safety mechanism to ensure
* intents are only claimable when executed on their intended destination chains.
* @param destination The intended destination chain ID
* @param routeHash The hash of the intent's route
* @param rewardHash The hash of the reward specification
*/
function challengeIntentProof(
uint64 destination,
bytes32 routeHash,
bytes32 rewardHash
) external {
bytes32 intentHash = keccak256(
abi.encodePacked(destination, routeHash, rewardHash)
);
ProofData memory proof = _provenIntents[intentHash];
// Only challenge if proof exists and destination chain ID doesn't match
if (proof.claimant != address(0) && proof.destination != destination) {
delete _provenIntents[intentHash];
emit IntentProofInvalidated(intentHash);
}
}
/**
* @notice Checks if this contract supports a given interface
* @dev Implements ERC165 interface detection
* @param interfaceId Interface identifier to check
* @return True if the interface is supported
*/
function supportsInterface(
bytes4 interfaceId
) public view override returns (bool) {
return
interfaceId == type(IProver).interfaceId ||
super.supportsInterface(interfaceId);
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {IProver} from "./IProver.sol";
/**
* @title IMessageBridgeProver
* @notice Interface for message-bridge based provers
* @dev Defines common functionality and events for cross-chain message bridge provers
*/
interface IMessageBridgeProver is IProver {
/**
* @notice Insufficient fee provided for cross-chain message dispatch
* @param requiredFee Amount of fee required
*/
error InsufficientFee(uint256 requiredFee);
/**
* @notice Unauthorized call detected
* @param expected Address that should have been the sender
* @param actual Address that actually sent the message
*/
error UnauthorizedSender(address expected, address actual);
/**
* @notice Unauthorized incoming proof from source chain
* @param sender Address that initiated the proof (as bytes32 for cross-VM compatibility)
*/
error UnauthorizedIncomingProof(bytes32 sender);
/**
* @notice Mailbox address cannot be zero
*/
error MailboxCannotBeZeroAddress();
/**
* @notice Router address cannot be zero
*/
error RouterCannotBeZeroAddress();
/**
* @notice Domain ID cannot be zero
*/
error ZeroDomainID();
/**
* @notice Sender address cannot be zero
*/
error SenderCannotBeZeroAddress();
/**
* @notice message is invalid
*/
error InvalidProofMessage();
/**
* @notice Calculates the fee required for message dispatch
* @param domainID Bridge-specific domain ID of the source chain (where the intent was created).
* IMPORTANT: This is NOT the chain ID. Each bridge provider uses their own
* domain ID mapping system. You MUST check with the specific bridge provider
* (Hyperlane, LayerZero, Metalayer) documentation to determine the correct
* domain ID for the source chain.
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data for message formatting.
* Specific format varies by implementation:
* - HyperProver: (bytes32 sourceChainProver, bytes metadata, address hookAddr, [uint256 gasLimitOverride])
* - MetaProver: (bytes32 sourceChainProver, [uint256 gasLimitOverride])
* - LayerZeroProver: (bytes32 sourceChainProver, bytes options, [uint256 gasLimitOverride])
* @return Fee amount required for message dispatch
*/
function fetchFee(
uint64 domainID,
bytes calldata encodedProofs,
bytes calldata data
) external view returns (uint256);
/**
* @notice Domain ID is too large to fit in uint32
* @param domainId The domain ID that is too large
*/
error DomainIdTooLarge(uint64 domainId);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/**
* @title Whitelist
* @notice Abstract contract providing immutable whitelist functionality
* @dev Uses immutable arrays to store up to 20 whitelisted addresses as bytes32 for cross-VM compatibility
*
* This contract provides a gas-efficient, immutable approach to whitelisting:
* - The whitelist is configured ONCE at construction time
* - After deployment, the whitelist CANNOT be modified (addresses cannot be added or removed)
* - Maximum of 20 addresses can be whitelisted
* - Uses immutable slots for each whitelisted address (lower gas cost than storage)
* - Optimized for early exit when checking whitelist membership
* - Uses bytes32 for cross-VM compatibility (Ethereum addresses and Solana public keys)
*/
abstract contract Whitelist {
/**
* @notice Error thrown when an address is not whitelisted
* @param addr The address that was not found in the whitelist
*/
error AddressNotWhitelisted(bytes32 addr);
/**
* @notice Whitelist size exceeds maximum allowed
* @param size Attempted whitelist size
* @param maxSize Maximum allowed size
*/
error WhitelistSizeExceeded(uint256 size, uint256 maxSize);
/// @dev Maximum number of addresses that can be whitelisted
uint256 private constant MAX_WHITELIST_SIZE = 20;
/// @dev Number of addresses actually in the whitelist
uint256 private immutable WHITELIST_SIZE;
/// @dev Immutable storage for whitelisted addresses (up to 20)
bytes32 private immutable ADDRESS_1;
bytes32 private immutable ADDRESS_2;
bytes32 private immutable ADDRESS_3;
bytes32 private immutable ADDRESS_4;
bytes32 private immutable ADDRESS_5;
bytes32 private immutable ADDRESS_6;
bytes32 private immutable ADDRESS_7;
bytes32 private immutable ADDRESS_8;
bytes32 private immutable ADDRESS_9;
bytes32 private immutable ADDRESS_10;
bytes32 private immutable ADDRESS_11;
bytes32 private immutable ADDRESS_12;
bytes32 private immutable ADDRESS_13;
bytes32 private immutable ADDRESS_14;
bytes32 private immutable ADDRESS_15;
bytes32 private immutable ADDRESS_16;
bytes32 private immutable ADDRESS_17;
bytes32 private immutable ADDRESS_18;
bytes32 private immutable ADDRESS_19;
bytes32 private immutable ADDRESS_20;
/**
* @notice Initializes the whitelist with a set of addresses
* @param addresses Array of addresses to whitelist (as bytes32 for cross-VM compatibility)
*/
// solhint-disable-next-line function-max-lines
constructor(bytes32[] memory addresses) {
if (addresses.length > MAX_WHITELIST_SIZE) {
revert WhitelistSizeExceeded(addresses.length, MAX_WHITELIST_SIZE);
}
// Store whitelist size
WHITELIST_SIZE = addresses.length;
// Initialize all addresses to zero
ADDRESS_1 = addresses.length > 0 ? addresses[0] : bytes32(0);
ADDRESS_2 = addresses.length > 1 ? addresses[1] : bytes32(0);
ADDRESS_3 = addresses.length > 2 ? addresses[2] : bytes32(0);
ADDRESS_4 = addresses.length > 3 ? addresses[3] : bytes32(0);
ADDRESS_5 = addresses.length > 4 ? addresses[4] : bytes32(0);
ADDRESS_6 = addresses.length > 5 ? addresses[5] : bytes32(0);
ADDRESS_7 = addresses.length > 6 ? addresses[6] : bytes32(0);
ADDRESS_8 = addresses.length > 7 ? addresses[7] : bytes32(0);
ADDRESS_9 = addresses.length > 8 ? addresses[8] : bytes32(0);
ADDRESS_10 = addresses.length > 9 ? addresses[9] : bytes32(0);
ADDRESS_11 = addresses.length > 10 ? addresses[10] : bytes32(0);
ADDRESS_12 = addresses.length > 11 ? addresses[11] : bytes32(0);
ADDRESS_13 = addresses.length > 12 ? addresses[12] : bytes32(0);
ADDRESS_14 = addresses.length > 13 ? addresses[13] : bytes32(0);
ADDRESS_15 = addresses.length > 14 ? addresses[14] : bytes32(0);
ADDRESS_16 = addresses.length > 15 ? addresses[15] : bytes32(0);
ADDRESS_17 = addresses.length > 16 ? addresses[16] : bytes32(0);
ADDRESS_18 = addresses.length > 17 ? addresses[17] : bytes32(0);
ADDRESS_19 = addresses.length > 18 ? addresses[18] : bytes32(0);
ADDRESS_20 = addresses.length > 19 ? addresses[19] : bytes32(0);
}
/**
* @notice Checks if an address is whitelisted
* @param addr Address to check (as bytes32 for cross-VM compatibility)
* @return True if the address is whitelisted, false otherwise
*/
// solhint-disable-next-line function-max-lines
function isWhitelisted(bytes32 addr) public view returns (bool) {
// Short circuit check for empty whitelist
if (WHITELIST_SIZE == 0) return false;
// Short circuit check for zero address
if (addr == bytes32(0)) return false;
if (ADDRESS_1 == addr) return true;
if (WHITELIST_SIZE <= 1) return false;
if (ADDRESS_2 == addr) return true;
if (WHITELIST_SIZE <= 2) return false;
if (ADDRESS_3 == addr) return true;
if (WHITELIST_SIZE <= 3) return false;
if (ADDRESS_4 == addr) return true;
if (WHITELIST_SIZE <= 4) return false;
if (ADDRESS_5 == addr) return true;
if (WHITELIST_SIZE <= 5) return false;
if (ADDRESS_6 == addr) return true;
if (WHITELIST_SIZE <= 6) return false;
if (ADDRESS_7 == addr) return true;
if (WHITELIST_SIZE <= 7) return false;
if (ADDRESS_8 == addr) return true;
if (WHITELIST_SIZE <= 8) return false;
if (ADDRESS_9 == addr) return true;
if (WHITELIST_SIZE <= 9) return false;
if (ADDRESS_10 == addr) return true;
if (WHITELIST_SIZE <= 10) return false;
if (ADDRESS_11 == addr) return true;
if (WHITELIST_SIZE <= 11) return false;
if (ADDRESS_12 == addr) return true;
if (WHITELIST_SIZE <= 12) return false;
if (ADDRESS_13 == addr) return true;
if (WHITELIST_SIZE <= 13) return false;
if (ADDRESS_14 == addr) return true;
if (WHITELIST_SIZE <= 14) return false;
if (ADDRESS_15 == addr) return true;
if (WHITELIST_SIZE <= 15) return false;
if (ADDRESS_16 == addr) return true;
if (WHITELIST_SIZE <= 16) return false;
if (ADDRESS_17 == addr) return true;
if (WHITELIST_SIZE <= 17) return false;
if (ADDRESS_18 == addr) return true;
if (WHITELIST_SIZE <= 18) return false;
if (ADDRESS_19 == addr) return true;
if (WHITELIST_SIZE <= 19) return false;
return ADDRESS_20 == addr;
}
/**
* @notice Validates that an address is whitelisted, reverting if not
* @param addr Address to validate (as bytes32 for cross-VM compatibility)
*/
function validateWhitelisted(bytes32 addr) internal view {
if (!isWhitelisted(addr)) {
revert AddressNotWhitelisted(addr);
}
}
/**
* @notice Returns the list of whitelisted addresses
* @return whitelist Array of whitelisted addresses (as bytes32 for cross-VM compatibility)
*/
function getWhitelist() public view returns (bytes32[] memory) {
bytes32[] memory whitelist = new bytes32[](WHITELIST_SIZE);
if (WHITELIST_SIZE > 0) whitelist[0] = ADDRESS_1;
if (WHITELIST_SIZE > 1) whitelist[1] = ADDRESS_2;
if (WHITELIST_SIZE > 2) whitelist[2] = ADDRESS_3;
if (WHITELIST_SIZE > 3) whitelist[3] = ADDRESS_4;
if (WHITELIST_SIZE > 4) whitelist[4] = ADDRESS_5;
if (WHITELIST_SIZE > 5) whitelist[5] = ADDRESS_6;
if (WHITELIST_SIZE > 6) whitelist[6] = ADDRESS_7;
if (WHITELIST_SIZE > 7) whitelist[7] = ADDRESS_8;
if (WHITELIST_SIZE > 8) whitelist[8] = ADDRESS_9;
if (WHITELIST_SIZE > 9) whitelist[9] = ADDRESS_10;
if (WHITELIST_SIZE > 10) whitelist[10] = ADDRESS_11;
if (WHITELIST_SIZE > 11) whitelist[11] = ADDRESS_12;
if (WHITELIST_SIZE > 12) whitelist[12] = ADDRESS_13;
if (WHITELIST_SIZE > 13) whitelist[13] = ADDRESS_14;
if (WHITELIST_SIZE > 14) whitelist[14] = ADDRESS_15;
if (WHITELIST_SIZE > 15) whitelist[15] = ADDRESS_16;
if (WHITELIST_SIZE > 16) whitelist[16] = ADDRESS_17;
if (WHITELIST_SIZE > 17) whitelist[17] = ADDRESS_18;
if (WHITELIST_SIZE > 18) whitelist[18] = ADDRESS_19;
if (WHITELIST_SIZE > 19) whitelist[19] = ADDRESS_20;
return whitelist;
}
/**
* @notice Returns the number of whitelisted addresses
* @return Number of addresses in the whitelist
*/
function getWhitelistSize() public view returns (uint256) {
return WHITELIST_SIZE;
}
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/**
* @title Semver Interface
* @dev An interface for a contract that has a version
*/
interface ISemver {
function version() external pure returns (string memory);
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.6.11;
interface IInterchainSecurityModule {
enum Types {
UNUSED,
ROUTING,
AGGREGATION,
LEGACY_MULTISIG,
MERKLE_ROOT_MULTISIG,
MESSAGE_ID_MULTISIG,
NULL, // used with relayer carrying no metadata
CCIP_READ,
ARB_L2_TO_L1,
WEIGHT_MERKLE_ROOT_MULTISIG,
WEIGHT_MESSAGE_ID_MULTISIG,
OP_L2_TO_L1
}
/**
* @notice Returns an enum that represents the type of security model
* encoded by this ISM.
* @dev Relayers infer how to fetch and format metadata.
*/
function moduleType() external view returns (uint8);
/**
* @notice Defines a security model responsible for verifying interchain
* messages based on the provided metadata.
* @param _metadata Off-chain metadata provided by a relayer, specific to
* the security model encoded by the module (e.g. validator signatures)
* @param _message Hyperlane encoded interchain message
* @return True if the message was verified
*/
function verify(
bytes calldata _metadata,
bytes calldata _message
) external returns (bool);
}
interface ISpecifiesInterchainSecurityModule {
function interchainSecurityModule()
external
view
returns (IInterchainSecurityModule);
}// SPDX-License-Identifier: MIT OR Apache-2.0
pragma solidity >=0.8.0;
/*@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@ HYPERLANE @@@@@@@
@@@@@@@@@@@@@@@@@@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@@
@@@@@@@@@ @@@@@@@@*/
interface IPostDispatchHook {
enum Types {
UNUSED,
ROUTING,
AGGREGATION,
MERKLE_TREE,
INTERCHAIN_GAS_PAYMASTER,
FALLBACK_ROUTING,
ID_AUTH_ISM,
PAUSABLE,
PROTOCOL_FEE,
LAYER_ZERO_V1,
RATE_LIMITED,
ARB_L2_TO_L1,
OP_L2_TO_L1
}
/**
* @notice Returns an enum that represents the type of hook
*/
function hookType() external view returns (uint8);
/**
* @notice Returns whether the hook supports metadata
* @param metadata metadata
* @return Whether the hook supports metadata
*/
function supportsMetadata(
bytes calldata metadata
) external view returns (bool);
/**
* @notice Post action after a message is dispatched via the Mailbox
* @param metadata The metadata required for the hook
* @param message The message passed from the Mailbox.dispatch() call
*/
function postDispatch(
bytes calldata metadata,
bytes calldata message
) external payable;
/**
* @notice Compute the payment required by the postDispatch call
* @param metadata The metadata required for the hook
* @param message The message passed from the Mailbox.dispatch() call
* @return Quoted payment for the postDispatch call
*/
function quoteDispatch(
bytes calldata metadata,
bytes calldata message
) external view returns (uint256);
}// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
import {ISemver} from "./ISemver.sol";
/**
* @title IProver
* @notice Interface for proving intent fulfillment
* @dev Defines required functionality for proving intent execution with different
* proof mechanisms (storage or Hyperlane)
*/
interface IProver is ISemver {
/**
* @notice Proof data stored for each proven intent
* @param claimant Address eligible to claim the intent rewards
* @param destination Chain ID where the intent was proven
*/
struct ProofData {
address claimant;
uint64 destination;
}
/**
* @notice Arrays of intent hashes and claimants must have the same length
*/
error ArrayLengthMismatch();
/**
* @notice Portal address cannot be zero
*/
error ZeroPortal();
/**
* @notice Chain ID is too large to fit in uint64
* @param chainId The chain ID that is too large
*/
error ChainIdTooLarge(uint256 chainId);
/**
* @notice Emitted when an intent is successfully proven
* @dev Emitted by the Prover on the source chain.
* @param intentHash Hash of the proven intent
* @param claimant Address eligible to claim the intent rewards
* @param destination Destination chain ID where the intent was proven
*/
event IntentProven(
bytes32 indexed intentHash,
address indexed claimant,
uint64 destination
);
/**
* @notice Emitted when an intent proof is invalidated
* @param intentHash Hash of the invalidated intent
*/
event IntentProofInvalidated(bytes32 indexed intentHash);
/**
* @notice Emitted when attempting to prove an already-proven intent
* @dev Event instead of error to allow batch processing to continue
* @param intentHash Hash of the already proven intent
*/
event IntentAlreadyProven(bytes32 intentHash);
/**
* @notice Gets the proof mechanism type used by this prover
* @return string indicating the prover's mechanism
*/
function getProofType() external pure returns (string memory);
/**
* @notice Initiates the proving process for intents from the destination chain
* @dev Implemented by specific prover mechanisms (storage, Hyperlane, Metalayer)
* @param sender Address of the original transaction sender
* @param sourceChainDomainID Domain ID of the source chain
* @param encodedProofs Encoded (intentHash, claimant) pairs as bytes
* @param data Additional data specific to the proving implementation
*
* @dev WARNING: sourceChainDomainID is NOT necessarily the same as chain ID.
* Each bridge provider uses their own domain ID mapping system:
* - Hyperlane: Uses custom domain IDs that may differ from chain IDs
* - LayerZero: Uses endpoint IDs that map to chains differently
* - Metalayer: Uses domain IDs specific to their routing system
* - Polymer: Uses chainIDs
* You MUST consult the specific bridge provider's documentation to determine
* the correct domain ID for the source chain.
*/
function prove(
address sender,
uint64 sourceChainDomainID,
bytes calldata encodedProofs,
bytes calldata data
) external payable;
/**
* @notice Returns the proof data for a given intent hash
* @param intentHash Hash of the intent to query
* @return ProofData containing claimant and destination chain ID
*/
function provenIntents(
bytes32 intentHash
) external view returns (ProofData memory);
/**
* @notice Challenge an intent proof if destination chain ID doesn't match
* @dev Can be called by anyone to remove invalid proofs. This is a safety mechanism to ensure
* intents are only claimable when executed on their intended destination chains.
* @param destination The intended destination chain ID
* @param routeHash The hash of the intent's route
* @param rewardHash The hash of the reward specification
*/
function challengeIntentProof(
uint64 destination,
bytes32 routeHash,
bytes32 rewardHash
) external;
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)
pragma solidity ^0.8.20;
import {IERC165} from "./IERC165.sol";
/**
* @dev Implementation of the {IERC165} interface.
*
* Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
* for the additional interface id that will be supported. For example:
*
* ```solidity
* function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
* return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
* }
* ```
*/
abstract contract ERC165 is IERC165 {
/**
* @dev See {IERC165-supportsInterface}.
*/
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return interfaceId == type(IERC165).interfaceId;
}
}/* -*- c-basic-offset: 4 -*- */
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
/**
* @title AddressConverter
* @notice Utility library for converting between address and bytes32 types
* @dev Provides simple functions to convert between address (20 bytes) and bytes32 (32 bytes)
*/
library AddressConverter {
error InvalidAddress(bytes32 value);
/**
* @notice Convert an Ethereum address to bytes32
* @dev Pads the 20-byte address to 32 bytes by converting to uint160, then uint256, then bytes32
* @param addr The address to convert
* @return The bytes32 representation of the address
*/
function toBytes32(address addr) internal pure returns (bytes32) {
return bytes32(uint256(uint160(addr)));
}
/**
* @notice Convert bytes32 to an Ethereum address
* @dev Truncates the 32-byte value to 20 bytes by converting to uint256, then uint160, then address
* @param b The bytes32 value to convert
* @return The address representation of the bytes32 value
*/
function toAddress(bytes32 b) internal pure returns (address) {
if (!isValidAddress(b)) {
revert InvalidAddress(b);
}
return address(uint160(uint256(b)));
}
/**
* @notice Check if a bytes32 value represents a valid Ethereum address
* @dev An Ethereum address must have the top 12 bytes as zero
* @param b The bytes32 value to check
* @return True if the bytes32 value can be safely converted to an Ethereum address
*/
function isValidAddress(bytes32 b) internal pure returns (bool) {
// The top 12 bytes must be zero for a valid Ethereum address
return uint256(b) >> 160 == 0;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)
pragma solidity ^0.8.20;
/**
* @dev Interface of the ERC165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[EIP].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}{
"remappings": [
"forge-std/=lib/forge-std/src/",
"@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
"@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/",
"@hyperlane-xyz/core/=node_modules/@hyperlane-xyz/core/",
"@eth-optimism/contracts-bedrock/=node_modules/@eth-optimism/contracts-bedrock/",
"@metalayer/contracts/=node_modules/@metalayer/contracts/",
"erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
"halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/",
"openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
"openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/"
],
"optimizer": {
"enabled": true,
"runs": 1000000
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "none",
"appendCBOR": false
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "paris",
"viaIR": true
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"mailbox","type":"address"},{"internalType":"address","name":"portal","type":"address"},{"internalType":"bytes32[]","name":"provers","type":"bytes32[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"bytes32","name":"addr","type":"bytes32"}],"name":"AddressNotWhitelisted","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"ChainIdTooLarge","type":"error"},{"inputs":[{"internalType":"uint64","name":"domainId","type":"uint64"}],"name":"DomainIdTooLarge","type":"error"},{"inputs":[{"internalType":"uint256","name":"requiredFee","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[{"internalType":"bytes32","name":"value","type":"bytes32"}],"name":"InvalidAddress","type":"error"},{"inputs":[],"name":"InvalidProofMessage","type":"error"},{"inputs":[],"name":"MailboxCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"RouterCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"SenderCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"bytes32","name":"sender","type":"bytes32"}],"name":"UnauthorizedIncomingProof","type":"error"},{"inputs":[{"internalType":"address","name":"expected","type":"address"},{"internalType":"address","name":"actual","type":"address"}],"name":"UnauthorizedSender","type":"error"},{"inputs":[{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"maxSize","type":"uint256"}],"name":"WhitelistSizeExceeded","type":"error"},{"inputs":[],"name":"ZeroDomainID","type":"error"},{"inputs":[],"name":"ZeroPortal","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"IntentAlreadyProven","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"IntentProofInvalidated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"intentHash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"claimant","type":"address"},{"indexed":false,"internalType":"uint64","name":"destination","type":"uint64"}],"name":"IntentProven","type":"event"},{"inputs":[],"name":"MAILBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MIN_GAS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PORTAL","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROOF_TYPE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint64","name":"destination","type":"uint64"},{"internalType":"bytes32","name":"routeHash","type":"bytes32"},{"internalType":"bytes32","name":"rewardHash","type":"bytes32"}],"name":"challengeIntentProof","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"domainID","type":"uint64"},{"internalType":"bytes","name":"encodedProofs","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"fetchFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProofType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"getWhitelist","outputs":[{"internalType":"bytes32[]","name":"","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint32","name":"origin","type":"uint32"},{"internalType":"bytes32","name":"sender","type":"bytes32"},{"internalType":"bytes","name":"messageBody","type":"bytes"}],"name":"handle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"addr","type":"bytes32"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"uint64","name":"domainID","type":"uint64"},{"internalType":"bytes","name":"encodedProofs","type":"bytes"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"prove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"provenIntents","outputs":[{"components":[{"internalType":"address","name":"claimant","type":"address"},{"internalType":"uint64","name":"destination","type":"uint64"}],"internalType":"struct IProver.ProofData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]Contract Creation Code
61038060405234610609576123eb8038038061001a81610624565b92833981016060828203126106095761003282610649565b9161003f60208201610649565b604082015190916001600160401b03821161060957019082601f83011215610609578151926001600160401b03841161060e578360051b926020610084818601610624565b8096815201906020829582010192831161060957602001905b8282106105f9575050506001600160a01b038116156105e8576080528151601481116105cf5750815160a0528151156105c75781511561052b57515b60c05260018151116000146105c05780516001101561052b5760408101515b60e05260028151116000146105b95780516002101561052b5760608101515b6101005260038151116000146105b25780516003101561052b5760808101515b6101205260048151116000146105ab5780516004101561052b5760a08101515b6101405260058151116000146105a45780516005101561052b5760c08101515b61016052600681511160001461059d5780516006101561052b5760e08101515b6101805260078151116000146105965780516007101561052b576101008101515b6101a052600881511160001461058f5780516008101561052b576101208101515b6101c05260098151116000146105885780516009101561052b576101408101515b6101e052600a815111600014610581578051600a101561052b576101608101515b61020052600b81511160001461057a578051600b101561052b576101808101515b61022052600c815111600014610573578051600c101561052b576101a08101515b61024052600d81511160001461056c578051600d101561052b576101c08101515b61026052600e815111600014610565578051600e101561052b576101e08101515b61028052600f81511160001461055e578051600f101561052b576102008101515b6102a05260108151116000146105575780516010101561052b576102208101515b6102c05260118151116000146105505780516011101561052b576102408101515b6102e05260128151116000146105495780516012101561052b576102608101515b6103005260138151116000146105415780516013101561052b5761028001515b6103205262030d40610340526001600160a01b0381161561051a5761036052604051611d8d908161065e82396080518181816108a00152610fc1015260a05181818161022d01528181610b2e0152611270015260c0518181816107c2015261129e015260e05181818161079001526112ce01526101005181818161075b01526112fe015261012051818181610726015261132e0152610140518181816106f1015261135e0152610160518181816106bc015261138e01526101805181818161068701526113be01526101a05181818161065101526113ee01526101c05181818161061b015261141e01526101e0518181816105e5015261144e0152610200518181816105af015261147e01526102205181818161057901526114ae01526102405181818161054301526114de01526102605181818161050d015261150e0152610280518181816104d7015261153e01526102a0518181816104a1015261156e01526102c05181818161046b015261159e01526102e05181818161043501526115ce0152610300518181816103ff01526115fe01526103205181818161039a015261162c01526103405181610c9501526103605181818161099601528181610c3b01528181610d30015281816118800152611a360152f35b6385405fbf60e01b60005260046000fd5b634e487b7160e01b600052603260045260246000fd5b506000610343565b6000610323565b6000610302565b60006102e1565b60006102c0565b600061029f565b600061027e565b600061025d565b600061023c565b600061021b565b60006101fa565b60006101d9565b60006101b8565b6000610197565b6000610177565b6000610157565b6000610137565b6000610117565b60006100f8565b5060006100d9565b63059291f560e51b600052600452601460245260446000fd5b631b973f8d60e11b60005260046000fd5b815181526020918201910161009d565b600080fd5b634e487b7160e01b600052604160045260246000fd5b6040519190601f01601f191682016001600160401b0381118382101761060e57604052565b51906001600160a01b03821682036106095756fe608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe146110a45750806301ffc9a714610fe55780630ff754ea14610f7657806354f10f0e14610edf57806354fd4d5014610e6257806356d5d47514610cb85780637ce1ffeb14610c5f5780637dc2b8fb14610bf057806399d145b214610b5157806399db89b514610af85780639bcd850f14610aa6578063bc8c7df214610aa6578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb6110e7565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a6068826111f2565b51902090816000526000602052602060406000206040519061016b8261118b565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000061025581611663565b9061026360405192836111f2565b80825261026f81611663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577f000000000000000000000000000000000000000000000000000000000000000060808401526102bb565b8251600210156103c4577f000000000000000000000000000000000000000000000000000000000000000060608401526102b2565b8251600110156103c4577f000000000000000000000000000000000000000000000000000000000000000060408401526102a9565b8251156103c4577f000000000000000000000000000000000000000000000000000000000000000082526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f7576108669036906004016110fe565b9060643567ffffffffffffffff81116101f7576108879036906004016110fe565b909373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610a7557506108dd6108d583876116e0565b8585846117ee565b93843410610a4757843411600014610a355784340393348511610a065761090a61091094602096986116e0565b9261194a565b9163ffffffff835116908284015160408501519261097d73ffffffffffffffffffffffffffffffffffffffff6080606089015198015116604051978896879586957f10b83dc000000000000000000000000000000000000000000000000000000000875260048701611797565b039173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af180156109fa576109cf575b506109cd916118fb565b005b602090813d83116109f3575b6109e581836111f2565b810103126101f757826109c3565b503d6109db565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60209361090a610910946000986116e0565b847f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af4610ae0611233565b60405191829160208352602083019061112c565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760006020604051610b908161118b565b8281520152600435600052600060205260408060002067ffffffffffffffff825191610bbb8361118b565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043563ffffffff81168091036101f75760243560443567ffffffffffffffff81116101f757610d169036906004016110fe565b91909273ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016803303610a75575015610e38578015610e0e57610d6c8161126e565b15610de1575060088110610db757806008116101f7576109cd9160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611b6e565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fba66dc3a0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fc15569280000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af46040805190610ea381836111f2565b600382527f332e32000000000000000000000000000000000000000000000000000000000060208301525191829160208352602083019061112c565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610f166110e7565b60243567ffffffffffffffff81116101f757610f369036906004016110fe565b90916044359167ffffffffffffffff83116101f757602093610f68610f62610f6e9536906004016110fe565b906116e0565b926117ee565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f42c7e0fe000000000000000000000000000000000000000000000000000000006020921490811561107a575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148261106f565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576020906110e160043561126e565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111765750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611137565b6040810190811067ffffffffffffffff8211176111a757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176111a757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176111a757604052565b604051906112426040836111f2565b600982527f48797065726c616e6500000000000000000000000000000000000000000000006020830152565b7f0000000000000000000000000000000000000000000000000000000000000000801561165c57811561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600281111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600381111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600481111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600581111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600681111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600781111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600881111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600981111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600a81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600b81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600c81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600d81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600e81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600f81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601081111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601281111561165c57817f000000000000000000000000000000000000000000000000000000000000000014611655576013101561164f577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b67ffffffffffffffff81116111a75760051b60200190565b92919267ffffffffffffffff82116111a757604051916116c3601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846111f2565b8294818452818301116101f7578281602093846000960137010152565b906000604080516116f0816111d6565b8281526060602082015201528101906020818303126101f75780359067ffffffffffffffff82116101f75701906060828203126101f75760405191611734836111d6565b80358352602081013567ffffffffffffffff81116101f757810182601f820112156101f75760409281602061176b9335910161167b565b6020840152013573ffffffffffffffffffffffffffffffffffffffff811681036101f757604082015290565b936117d960809473ffffffffffffffffffffffffffffffffffffffff9463ffffffff6117e7959a999a168852602088015260a0604088015260a087019061112c565b90858203606087015261112c565b9416910152565b906117fa93929161194a565b602063ffffffff825116818301519061186760408501519473ffffffffffffffffffffffffffffffffffffffff60806060830151920151169060405196879586957f81d2ea9500000000000000000000000000000000000000000000000000000000875260048701611797565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109fa576000916118b4575090565b90506020813d6020116118db575b816118cf602093836111f2565b810103126101f7575190565b3d91506118c2565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611942575b61193e5760008080938193828215611935575bf1156109fa57565b506108fc61192d565b5050565b50811561191a565b9392906040519260a0840184811067ffffffffffffffff8211176111a75760405260008452602084019160008352604085019160608352606086019360608552608087019660008852809967ffffffffffffffff811663ffffffff8111611b065750926119e192604097959263ffffffff73ffffffffffffffffffffffffffffffffffffffff9a989616905286519052369161167b565b90526020820151905201511680611aec57506040517f3d1250b700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa9081156109fa57600091611a82575b5073ffffffffffffffffffffffffffffffffffffffff169052565b6020813d602011611ae4575b81611a9b602093836111f2565b81010312611ae057519073ffffffffffffffffffffffffffffffffffffffff82168203611add575073ffffffffffffffffffffffffffffffffffffffff611a67565b80fd5b5080fd5b3d9150611a8e565b73ffffffffffffffffffffffffffffffffffffffff169052565b7ff17764200000000000000000000000000000000000000000000000000000000060005260045260246000fd5b359060208110611b41575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611d8857603f8216611d5e578160061c9160005b838110611b93575050505050565b8060061b81810460401482151715610a06576020810190818111610a0657611bc6611bc08383878b6118e3565b90611b33565b9060009260408201809211611d3157611bc0600195949392611be992888c6118e3565b8060a01c611d295773ffffffffffffffffffffffffffffffffffffffff16918215611d29578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611c6b57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611b85565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611c9b8161118b565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611c65565b505050611c65565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b505050560000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000032ae7ec3f54f676feff4f2dc0f7c27230e808466c000000000000000000000000000000000000000000000000371366e317c3802dff82ded1fda39ba130f4d4da12426b774332262f19812b563016f779d0f5397cc8976aecea06a6b68a2e7dc7
Deployed Bytecode
0x608080604052600436101561001357600080fd5b60003560e01c90816301a5e3fe146110a45750806301ffc9a714610fe55780630ff754ea14610f7657806354f10f0e14610edf57806354fd4d5014610e6257806356d5d47514610cb85780637ce1ffeb14610c5f5780637dc2b8fb14610bf057806399d145b214610b5157806399db89b514610af85780639bcd850f14610aa6578063bc8c7df214610aa6578063bcd58bd2146107e8578063d01f63f5146101fc5763fc0eab91146100c457600080fd5b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576100fb6110e7565b60405160208101907fffffffffffffffff0000000000000000000000000000000000000000000000008360c01b168252602435602882015260443560488201526048815261014a6068826111f2565b51902090816000526000602052602060406000206040519061016b8261118b565b549067ffffffffffffffff73ffffffffffffffffffffffffffffffffffffffff83169283835260a01c169283910152151591826101e2575b50506101ab57005b806000526000602052600060408120557fae165391a85a2219c7e5367bc7775dc0a2bc5cdf1f35e95204d716f6d96c2758600080a2005b67ffffffffffffffff161415905038806101a3565b600080fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7577f000000000000000000000000000000000000000000000000000000000000000361025581611663565b9061026360405192836111f2565b80825261026f81611663565b907fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0602084019201368337806107b9575b60018111610784575b6002811161074f575b6003811161071a575b600481116106e5575b600581116106b0575b6006811161067b575b60078111610645575b6008811161060f575b600981116105d9575b600a81116105a3575b600b811161056d575b600c8111610537575b600d8111610501575b600e81116104cb575b600f8111610495575b6010811161045f575b60118111610429575b601281116103f3575b60131061038e575b906040519182916020830190602084525180915260408301919060005b818110610375575050500390f35b8251845285945060209384019390920191600101610367565b8151601310156103c4577f000000000000000000000000000000000000000000000000000000000000000061028083015261034a565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b8251601210156103c4577f0000000000000000000000000000000000000000000000000000000000000000610260840152610342565b8251601110156103c4577f0000000000000000000000000000000000000000000000000000000000000000610240840152610339565b8251601010156103c4577f0000000000000000000000000000000000000000000000000000000000000000610220840152610330565b8251600f10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610200840152610327565b8251600e10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101e084015261031e565b8251600d10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101c0840152610315565b8251600c10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101a084015261030c565b8251600b10156103c4577f0000000000000000000000000000000000000000000000000000000000000000610180840152610303565b8251600a10156103c4577f00000000000000000000000000000000000000000000000000000000000000006101608401526102fa565b8251600910156103c4577f00000000000000000000000000000000000000000000000000000000000000006101408401526102f1565b8251600810156103c4577f00000000000000000000000000000000000000000000000000000000000000006101208401526102e8565b8251600710156103c4577f00000000000000000000000000000000000000000000000000000000000000006101008401526102df565b8251600610156103c4577f000000000000000000000000000000000000000000000000000000000000000060e08401526102d6565b8251600510156103c4577f000000000000000000000000000000000000000000000000000000000000000060c08401526102cd565b8251600410156103c4577f000000000000000000000000000000000000000000000000000000000000000060a08401526102c4565b8251600310156103c4577f000000000000000000000000000000000000000000000000000000000000000060808401526102bb565b8251600210156103c4577f12426b774332262f19812b563016f779d0f5397cc8976aecea06a6b68a2e7dc760608401526102b2565b8251600110156103c4577f000000000000000000000000371366e317c3802dff82ded1fda39ba130f4d4da60408401526102a9565b8251156103c4577f2ae7ec3f54f676feff4f2dc0f7c27230e808466c00000000000000000000000082526102a0565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043573ffffffffffffffffffffffffffffffffffffffff811681036101f75760243567ffffffffffffffff811681036101f75760443567ffffffffffffffff81116101f7576108669036906004016110fe565b9060643567ffffffffffffffff81116101f7576108879036906004016110fe565b909373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede9716803303610a7557506108dd6108d583876116e0565b8585846117ee565b93843410610a4757843411600014610a355784340393348511610a065761090a61091094602096986116e0565b9261194a565b9163ffffffff835116908284015160408501519261097d73ffffffffffffffffffffffffffffffffffffffff6080606089015198015116604051978896879586957f10b83dc000000000000000000000000000000000000000000000000000000000875260048701611797565b039173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165af180156109fa576109cf575b506109cd916118fb565b005b602090813d83116109f3575b6109e581836111f2565b810103126101f757826109c3565b503d6109db565b6040513d6000823e3d90fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60209361090a610910946000986116e0565b847f4c4e635c0000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7f85faaab5000000000000000000000000000000000000000000000000000000006000526004523360245260446000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af4610ae0611233565b60405191829160208352602083019061112c565b0390f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f00000000000000000000000000000000000000000000000000000000000000038152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760006020604051610b908161118b565b8281520152600435600052600060205260408060002067ffffffffffffffff825191610bbb8361118b565b5481602073ffffffffffffffffffffffffffffffffffffffff831694858152019160a01c168152835192835251166020820152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39168152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760206040517f0000000000000000000000000000000000000000000000000000000000030d408152f35b60607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f75760043563ffffffff81168091036101f75760243560443567ffffffffffffffff81116101f757610d169036906004016110fe565b91909273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b3916803303610a75575015610e38578015610e0e57610d6c8161126e565b15610de1575060088110610db757806008116101f7576109cd9160087ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8823560c01c93019101611b6e565b7fae192a000000000000000000000000000000000000000000000000000000000060005260046000fd5b7f06c61a900000000000000000000000000000000000000000000000000000000060005260045260246000fd5b7fba66dc3a0000000000000000000000000000000000000000000000000000000060005260046000fd5b7fc15569280000000000000000000000000000000000000000000000000000000060005260046000fd5b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610af46040805190610ea381836111f2565b600382527f332e32000000000000000000000000000000000000000000000000000000000060208301525191829160208352602083019061112c565b346101f75760607ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757610f166110e7565b60243567ffffffffffffffff81116101f757610f369036906004016110fe565b90916044359167ffffffffffffffff83116101f757602093610f68610f62610f6e9536906004016110fe565b906116e0565b926117ee565b604051908152f35b346101f75760007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f757602060405173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97168152f35b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576004357fffffffff0000000000000000000000000000000000000000000000000000000081168091036101f757807f42c7e0fe000000000000000000000000000000000000000000000000000000006020921490811561107a575b506040519015158152f35b7f01ffc9a7000000000000000000000000000000000000000000000000000000009150148261106f565b346101f75760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101f7576020906110e160043561126e565b15158152f35b6004359067ffffffffffffffff821682036101f757565b9181601f840112156101f75782359167ffffffffffffffff83116101f757602083818601950101116101f757565b919082519283825260005b8481106111765750507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8460006020809697860101520116010190565b80602080928401015182828601015201611137565b6040810190811067ffffffffffffffff8211176111a757604052565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6060810190811067ffffffffffffffff8211176111a757604052565b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff8211176111a757604052565b604051906112426040836111f2565b600982527f48797065726c616e6500000000000000000000000000000000000000000000006020830152565b7f0000000000000000000000000000000000000000000000000000000000000003801561165c57811561165c57817f2ae7ec3f54f676feff4f2dc0f7c27230e808466c0000000000000000000000001461165557600181111561165c57817f000000000000000000000000371366e317c3802dff82ded1fda39ba130f4d4da1461165557600281111561165c57817f12426b774332262f19812b563016f779d0f5397cc8976aecea06a6b68a2e7dc71461165557600381111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600481111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600581111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600681111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600781111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600881111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600981111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600a81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600b81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600c81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600d81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600e81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557600f81111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601081111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601181111561165c57817f00000000000000000000000000000000000000000000000000000000000000001461165557601281111561165c57817f000000000000000000000000000000000000000000000000000000000000000014611655576013101561164f577f00000000000000000000000000000000000000000000000000000000000000001490565b50600090565b5050600190565b5050600090565b67ffffffffffffffff81116111a75760051b60200190565b92919267ffffffffffffffff82116111a757604051916116c3601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016602001846111f2565b8294818452818301116101f7578281602093846000960137010152565b906000604080516116f0816111d6565b8281526060602082015201528101906020818303126101f75780359067ffffffffffffffff82116101f75701906060828203126101f75760405191611734836111d6565b80358352602081013567ffffffffffffffff81116101f757810182601f820112156101f75760409281602061176b9335910161167b565b6020840152013573ffffffffffffffffffffffffffffffffffffffff811681036101f757604082015290565b936117d960809473ffffffffffffffffffffffffffffffffffffffff9463ffffffff6117e7959a999a168852602088015260a0604088015260a087019061112c565b90858203606087015261112c565b9416910152565b906117fa93929161194a565b602063ffffffff825116818301519061186760408501519473ffffffffffffffffffffffffffffffffffffffff60806060830151920151169060405196879586957f81d2ea9500000000000000000000000000000000000000000000000000000000875260048701611797565b038173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165afa9081156109fa576000916118b4575090565b90506020813d6020116118db575b816118cf602093836111f2565b810103126101f7575190565b3d91506118c2565b909392938483116101f75784116101f7578101920390565b73ffffffffffffffffffffffffffffffffffffffff1680158015611942575b61193e5760008080938193828215611935575bf1156109fa57565b506108fc61192d565b5050565b50811561191a565b9392906040519260a0840184811067ffffffffffffffff8211176111a75760405260008452602084019160008352604085019160608352606086019360608552608087019660008852809967ffffffffffffffff811663ffffffff8111611b065750926119e192604097959263ffffffff73ffffffffffffffffffffffffffffffffffffffff9a989616905286519052369161167b565b90526020820151905201511680611aec57506040517f3d1250b700000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39165afa9081156109fa57600091611a82575b5073ffffffffffffffffffffffffffffffffffffffff169052565b6020813d602011611ae4575b81611a9b602093836111f2565b81010312611ae057519073ffffffffffffffffffffffffffffffffffffffff82168203611add575073ffffffffffffffffffffffffffffffffffffffff611a67565b80fd5b5080fd5b3d9150611a8e565b73ffffffffffffffffffffffffffffffffffffffff169052565b7ff17764200000000000000000000000000000000000000000000000000000000060005260045260246000fd5b359060208110611b41575090565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9060200360031b1b1690565b918115611d8857603f8216611d5e578160061c9160005b838110611b93575050505050565b8060061b81810460401482151715610a06576020810190818111610a0657611bc6611bc08383878b6118e3565b90611b33565b9060009260408201809211611d3157611bc0600195949392611be992888c6118e3565b8060a01c611d295773ffffffffffffffffffffffffffffffffffffffff16918215611d29578181526020819052604081205473ffffffffffffffffffffffffffffffffffffffff1615611c6b57507fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e56119150602090604051908152a15b01611b85565b60207fa79bcebf1cb6259b008ad946df35c764dd6b25206bb5c47ec11976cdce4f014591604051611c9b8161118b565b85815282810173ffffffffffffffffffffffffffffffffffffffff604067ffffffffffffffff8d1694858452888152808752209251167fffffffff000000000000000000000000000000000000000000000000000000007bffffffffffffffff00000000000000000000000000000000000000008454935160a01b16921617179055604051908152a3611c65565b505050611c65565b6024847f4e487b710000000000000000000000000000000000000000000000000000000081526011600452fd5b7fa24a13a60000000000000000000000000000000000000000000000000000000060005260046000fd5b50505056
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000032ae7ec3f54f676feff4f2dc0f7c27230e808466c000000000000000000000000000000000000000000000000371366e317c3802dff82ded1fda39ba130f4d4da12426b774332262f19812b563016f779d0f5397cc8976aecea06a6b68a2e7dc7
-----Decoded View---------------
Arg [0] : mailbox (address): 0x7f50C5776722630a0024fAE05fDe8b47571D7B39
Arg [1] : portal (address): 0x399Dbd5DF04f83103F77A58cBa2B7c4d3cdede97
Arg [2] : provers (bytes32[]): System.Byte[],System.Byte[],System.Byte[]
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000007f50c5776722630a0024fae05fde8b47571d7b39
Arg [1] : 000000000000000000000000399dbd5df04f83103f77a58cba2b7c4d3cdede97
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [4] : 2ae7ec3f54f676feff4f2dc0f7c27230e808466c000000000000000000000000
Arg [5] : 000000000000000000000000371366e317c3802dff82ded1fda39ba130f4d4da
Arg [6] : 12426b774332262f19812b563016f779d0f5397cc8976aecea06a6b68a2e7dc7
Loading...
Loading
Loading...
Loading
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.