Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x61038060 | 22471224 | 299 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x08ACBb91...C500e53D0 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
HyperProver
Compiler Version
v0.8.27+commit.40a35a09
Optimization Enabled:
Yes with 200 runs
Other Settings:
cancun 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 {IMessageBridgeProver} from "../interfaces/IMessageBridgeProver.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 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 _inbox Address of Inbox contract
* @param _provers Array of trusted prover addresses
* @param _defaultGasLimit Default gas limit for cross-chain messages (200k if not specified)
*/
constructor(
address _mailbox,
address _inbox,
address[] memory _provers,
uint256 _defaultGasLimit
) MessageBridgeProver(_inbox, _provers, _defaultGasLimit) {
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 {
// Verify message is from authorized mailbox
_validateMessageSender(msg.sender, MAILBOX);
// Verify _origin and _sender are valid
if (_origin == 0) revert InvalidOriginChainId();
// Convert bytes32 sender to address and delegate to shared handler
address sender = _sender.bytes32ToAddress();
if (sender == address(0)) revert SenderCannotBeZeroAddress();
_handleCrossChainMessage(_origin, sender, _messageBody);
}
/**
* @notice Initiates proving of intents via Hyperlane
* @dev Sends message to source chain prover with intent data
* @param _sender Address that initiated the proving request
* @param _sourceChainId Chain ID of the source chain
* @param _intentHashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @param _data Additional data for message formatting
*/
function prove(
address _sender,
uint256 _sourceChainId,
bytes32[] calldata _intentHashes,
address[] calldata _claimants,
bytes calldata _data
) external payable override {
// Validate the request is from Inbox
_validateProvingRequest(msg.sender);
// Parse incoming data into a structured format for processing
UnpackedData memory unpacked = _unpackData(_data);
// Calculate fee
uint256 fee = _fetchFee(
_sourceChainId,
_intentHashes,
_claimants,
unpacked
);
// Check if enough fee was provided
if (msg.value < fee) {
revert InsufficientFee(fee);
}
// Calculate refund amount if overpaid
uint256 _refundAmount = 0;
if (msg.value > fee) {
_refundAmount = msg.value - fee;
}
emit BatchSent(_intentHashes, _sourceChainId);
// Decode any additional gas limit data from the _data parameter
uint256 gasLimit = DEFAULT_GAS_LIMIT;
// For Hyperlane, we expect data to include sourceChainProver(32) + metadata(var) + hookAddr(20)
// If data is long enough, the gas limit is packed at position 32-64
if (_data.length >= 96) {
// At least enough bytes for all required fields plus gas limit
uint256 customGasLimit = uint256(bytes32(_data[64:96]));
if (customGasLimit > 0) {
gasLimit = customGasLimit;
}
}
// Declare dispatch parameters for cross-chain message delivery
uint32 destinationDomain;
bytes32 recipientAddress;
bytes memory messageBody;
bytes memory metadata;
IPostDispatchHook hook;
// Prepare parameters for cross-chain message dispatch
(
destinationDomain,
recipientAddress,
messageBody,
metadata,
hook
) = _formatHyperlaneMessage(
_sourceChainId,
_intentHashes,
_claimants,
unpacked
);
// Send the message through Hyperlane mailbox using local variables
// Note: Some Hyperlane versions have different dispatch signatures.
// This matches the expected signature for testing.
IMailbox(MAILBOX).dispatch{value: fee}(
destinationDomain,
recipientAddress,
messageBody,
metadata,
hook
);
// Send refund if needed
_sendRefund(_sender, _refundAmount);
}
/**
* @notice Calculates the fee required for Hyperlane message dispatch
* @dev Queries the Mailbox contract for accurate fee estimation
* @param _sourceChainId Chain ID of the source chain
* @param _intentHashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @param _data Additional data for message formatting
* @return Fee amount required for message dispatch
*/
function fetchFee(
uint256 _sourceChainId,
bytes32[] calldata _intentHashes,
address[] calldata _claimants,
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(_sourceChainId, _intentHashes, _claimants, 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.sourceChainProver, unpacked.metadata, unpacked.hookAddr) = abi
.decode(_data, (bytes32, bytes, address));
return unpacked;
}
/**
* @notice Internal function to calculate the fee with pre-decoded data
* @param _sourceChainId Chain ID of the source chain
* @param _intentHashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @param unpacked Struct containing decoded data from _data parameter
* @return Fee amount required for message dispatch
*/
function _fetchFee(
uint256 _sourceChainId,
bytes32[] calldata _intentHashes,
address[] calldata _claimants,
UnpackedData memory unpacked
) internal view returns (uint256) {
// Format and prepare message parameters for dispatch
(
uint32 destinationDomain,
bytes32 recipientAddress,
bytes memory messageBody,
bytes memory metadata,
IPostDispatchHook hook
) = _formatHyperlaneMessage(
_sourceChainId,
_intentHashes,
_claimants,
unpacked
);
// Query Hyperlane mailbox for accurate fee estimate
return
IMailbox(MAILBOX).quoteDispatch(
destinationDomain,
recipientAddress,
messageBody,
metadata,
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 pre-decoded values
* @dev Prepares all parameters needed for the Mailbox dispatch call
* @param _sourceChainId Chain ID of the source chain
* @param _hashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @param _unpacked Struct containing decoded data from _data parameter
* @return domain Hyperlane domain ID
* @return recipient Recipient address encoded as bytes32
* @return message Encoded message body with intent hashes and claimants
* @return metadata Additional metadata for the message
* @return hook Post-dispatch hook contract
*/
function _formatHyperlaneMessage(
uint256 _sourceChainId,
bytes32[] calldata _hashes,
address[] calldata _claimants,
UnpackedData memory _unpacked
)
internal
view
returns (
uint32 domain,
bytes32 recipient,
bytes memory message,
bytes memory metadata,
IPostDispatchHook hook
)
{
// Centralized validation ensures arrays match exactly once in the call flow
// This prevents security issues where hashes and claimants could be mismatched
if (_hashes.length != _claimants.length) {
revert ArrayLengthMismatch();
}
// Convert chain ID to Hyperlane domain ID format
// Validate the chain ID can fit in uint32 to prevent truncation issues
if (_sourceChainId > type(uint32).max) {
revert ChainIdTooLarge(_sourceChainId);
}
domain = uint32(_sourceChainId);
// Use the source chain prover address as the message recipient
recipient = _unpacked.sourceChainProver;
// Pack intent hashes and claimant addresses together as the message payload
message = abi.encode(_hashes, _claimants);
// Pass through metadata as provided
metadata = _unpacked.metadata;
// Default to mailbox's hook if none provided, following Hyperlane best practices
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 "../tools/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 Default gas limit for cross-chain message dispatch
* @dev Set at deployment and cannot be changed afterward
*/
uint256 public immutable DEFAULT_GAS_LIMIT;
/**
* @notice Initializes the MessageBridgeProver contract
* @param _inbox Address of the Inbox contract
* @param _provers Array of trusted prover addresses
* @param _defaultGasLimit Default gas limit for cross-chain messages (200k if not specified)
*/
constructor(
address _inbox,
address[] memory _provers,
uint256 _defaultGasLimit
) BaseProver(_inbox) Whitelist(_provers) {
if (_inbox == address(0)) revert InboxCannotBeZeroAddress();
DEFAULT_GAS_LIMIT = _defaultGasLimit > 0 ? _defaultGasLimit : 200_000;
}
/**
* @notice Validates that the message sender is authorized
* @dev Template method for authorization check
* @param _messageSender Address attempting to call handle()
* @param _expectedSender Address that should be authorized
*/
function _validateMessageSender(
address _messageSender,
address _expectedSender
) internal pure {
if (_expectedSender != _messageSender) {
revert UnauthorizedHandle(_messageSender);
}
}
/**
* @notice Validates that the proving request is authorized
* @param _sender Address that sent the proving request
*/
function _validateProvingRequest(address _sender) internal view {
if (_sender != INBOX) {
revert UnauthorizedProve(_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 (_amount > 0 && _recipient != address(0)) {
(bool success, ) = payable(_recipient).call{
value: _amount,
gas: 3000
}("");
if (!success) {
revert NativeTransferFailed();
}
}
}
/**
* @notice Handles cross-chain messages containing proof data
* @dev Common implementation to validate and process cross-chain messages
* param _sourceChainId Chain ID of the source chain (not used for whitelist validation)
* @param _messageSender Address that dispatched the message on source chain
* @param _message Encoded array of intent hashes and claimants
*/
function _handleCrossChainMessage(
uint256 /* _sourceChainId */,
address _messageSender,
bytes calldata _message
) internal {
// Verify dispatch originated from a whitelisted prover address
if (!isWhitelisted(_messageSender)) {
revert UnauthorizedIncomingProof(_messageSender);
}
// Decode message containing intent hashes and claimants
(bytes32[] memory hashes, address[] memory claimants) = abi.decode(
_message,
(bytes32[], address[])
);
// Process the intent proofs using shared implementation - array validation happens there
_processIntentProofs(hashes, claimants);
}
}// 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 Native token transfer failed
*/
error NativeTransferFailed();
/**
* @notice Chain ID is too large for destination chain format
* @param _chainId The chain ID that couldn't be converted
*/
error ChainIdTooLarge(uint256 _chainId);
/**
* @notice Unauthorized call to handle() detected
* @param _sender Address that attempted the call
*/
error UnauthorizedHandle(address _sender);
/**
* @notice Unauthorized call to initiate proving
* @param _sender Address that initiated
*/
error UnauthorizedProve(address _sender);
/**
* @notice Unauthorized incoming proof from source chain
* @param _sender Address that initiated the proof
*/
error UnauthorizedIncomingProof(address _sender);
/**
* @notice Mailbox address cannot be zero
*/
error MailboxCannotBeZeroAddress();
/**
* @notice Router address cannot be zero
*/
error RouterCannotBeZeroAddress();
/**
* @notice Inbox address cannot be zero
*/
error InboxCannotBeZeroAddress();
/**
* @notice Prover address cannot be zero
*/
error ProverCannotBeZeroAddress();
/**
* @notice Invalid chain ID for the origin
*/
error InvalidOriginChainId();
/**
* @notice Sender address cannot be zero
*/
error SenderCannotBeZeroAddress();
/**
* @notice Emitted when a batch of fulfilled intents is sent to be relayed to the source chain
* @param _hashes Intent hashes sent in the batch
* @param _sourceChainID ID of the source chain
*/
event BatchSent(bytes32[] indexed _hashes, uint256 indexed _sourceChainID);
/**
* @notice Calculates the fee required for message dispatch
* @param _sourceChainId Chain ID of source chain
* @param _intentHashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @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])
* @return Fee amount required for message dispatch
*/
function fetchFee(
uint256 _sourceChainId,
bytes32[] calldata _intentHashes,
address[] calldata _claimants,
bytes calldata _data
) external view returns (uint256);
}// SPDX-License-Identifier: UNLICENSED
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 "1.8.14-e2c12e7";
}
}// 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";
/**
* @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 {
/**
* @notice Address of the Inbox contract
* @dev Immutable to prevent unauthorized changes
*/
address public immutable INBOX;
/**
* @notice Mapping from intent hash to address eligible to claim rewards
* @dev Zero address indicates intent hasn't been proven
*/
mapping(bytes32 => address) public provenIntents;
/**
* @notice Initializes the BaseProver contract
* @param _inbox Address of the Inbox contract
*/
constructor(address _inbox) {
INBOX = _inbox;
}
/**
* @notice Process intent proofs from a cross-chain message
* @param _hashes Array of intent hashes
* @param _claimants Array of claimant addresses
*/
function _processIntentProofs(
bytes32[] memory _hashes,
address[] memory _claimants
) internal {
// If arrays are empty, just return early
if (_hashes.length == 0) return;
// Require matching array lengths for security
if (_hashes.length != _claimants.length) {
revert ArrayLengthMismatch();
}
for (uint256 i = 0; i < _hashes.length; i++) {
bytes32 intentHash = _hashes[i];
address claimant = _claimants[i];
// 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] != address(0)) {
emit IntentAlreadyProven(intentHash);
} else {
provenIntents[intentHash] = claimant;
emit IntentProven(intentHash, claimant);
}
}
}
/**
* @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;
/**
* @title Whitelist
* @notice Abstract contract providing immutable whitelist functionality
* @dev Uses immutable arrays to store up to 20 whitelisted addresses
*
* 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
*/
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(address addr);
/// @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)
address private immutable ADDRESS_1;
address private immutable ADDRESS_2;
address private immutable ADDRESS_3;
address private immutable ADDRESS_4;
address private immutable ADDRESS_5;
address private immutable ADDRESS_6;
address private immutable ADDRESS_7;
address private immutable ADDRESS_8;
address private immutable ADDRESS_9;
address private immutable ADDRESS_10;
address private immutable ADDRESS_11;
address private immutable ADDRESS_12;
address private immutable ADDRESS_13;
address private immutable ADDRESS_14;
address private immutable ADDRESS_15;
address private immutable ADDRESS_16;
address private immutable ADDRESS_17;
address private immutable ADDRESS_18;
address private immutable ADDRESS_19;
address private immutable ADDRESS_20;
/**
* @notice Initializes the whitelist with a set of addresses
* @param addresses Array of addresses to whitelist
*/
constructor(address[] memory addresses) {
require(addresses.length <= MAX_WHITELIST_SIZE);
// Store whitelist size
WHITELIST_SIZE = addresses.length;
// Initialize all addresses to zero address
ADDRESS_1 = addresses.length > 0 ? addresses[0] : address(0);
ADDRESS_2 = addresses.length > 1 ? addresses[1] : address(0);
ADDRESS_3 = addresses.length > 2 ? addresses[2] : address(0);
ADDRESS_4 = addresses.length > 3 ? addresses[3] : address(0);
ADDRESS_5 = addresses.length > 4 ? addresses[4] : address(0);
ADDRESS_6 = addresses.length > 5 ? addresses[5] : address(0);
ADDRESS_7 = addresses.length > 6 ? addresses[6] : address(0);
ADDRESS_8 = addresses.length > 7 ? addresses[7] : address(0);
ADDRESS_9 = addresses.length > 8 ? addresses[8] : address(0);
ADDRESS_10 = addresses.length > 9 ? addresses[9] : address(0);
ADDRESS_11 = addresses.length > 10 ? addresses[10] : address(0);
ADDRESS_12 = addresses.length > 11 ? addresses[11] : address(0);
ADDRESS_13 = addresses.length > 12 ? addresses[12] : address(0);
ADDRESS_14 = addresses.length > 13 ? addresses[13] : address(0);
ADDRESS_15 = addresses.length > 14 ? addresses[14] : address(0);
ADDRESS_16 = addresses.length > 15 ? addresses[15] : address(0);
ADDRESS_17 = addresses.length > 16 ? addresses[16] : address(0);
ADDRESS_18 = addresses.length > 17 ? addresses[17] : address(0);
ADDRESS_19 = addresses.length > 18 ? addresses[18] : address(0);
ADDRESS_20 = addresses.length > 19 ? addresses[19] : address(0);
}
/**
* @notice Checks if an address is whitelisted
* @param addr Address to check
* @return True if the address is whitelisted, false otherwise
*/
function isWhitelisted(address 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 == address(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
*/
function validateWhitelisted(address addr) internal view {
if (!isWhitelisted(addr)) {
revert AddressNotWhitelisted(addr);
}
}
/**
* @notice Returns the list of whitelisted addresses
* @return whitelist Array of whitelisted addresses
*/
function getWhitelist() public view returns (address[] memory) {
address[] memory whitelist = new address[](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;
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 Arrays of intent hashes and claimants must have the same length
*/
error ArrayLengthMismatch();
/**
* @notice Emitted when an intent is successfully proven
* @param _hash Hash of the proven intent
* @param _claimant Address eligible to claim the intent's rewards
*/
event IntentProven(bytes32 indexed _hash, address indexed _claimant);
/**
* @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 _sourceChainId Chain ID of the source chain
* @param _intentHashes Array of intent hashes to prove
* @param _claimants Array of claimant addresses
* @param _data Additional data specific to the proving implementation
*/
function prove(
address _sender,
uint256 _sourceChainId,
bytes32[] calldata _intentHashes,
address[] calldata _claimants,
bytes calldata _data
) external payable;
}// 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
// 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/",
"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": 200
},
"metadata": {
"useLiteralContent": false,
"bytecodeHash": "ipfs",
"appendCBOR": true
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"evmVersion": "cancun",
"viaIR": true,
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_mailbox","type":"address"},{"internalType":"address","name":"_inbox","type":"address"},{"internalType":"address[]","name":"_provers","type":"address[]"},{"internalType":"uint256","name":"_defaultGasLimit","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"AddressNotWhitelisted","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[{"internalType":"uint256","name":"_chainId","type":"uint256"}],"name":"ChainIdTooLarge","type":"error"},{"inputs":[],"name":"InboxCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"_requiredFee","type":"uint256"}],"name":"InsufficientFee","type":"error"},{"inputs":[],"name":"InvalidOriginChainId","type":"error"},{"inputs":[],"name":"MailboxCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"NativeTransferFailed","type":"error"},{"inputs":[],"name":"ProverCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"RouterCannotBeZeroAddress","type":"error"},{"inputs":[],"name":"SenderCannotBeZeroAddress","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"UnauthorizedHandle","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"UnauthorizedIncomingProof","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"UnauthorizedProve","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32[]","name":"_hashes","type":"bytes32[]"},{"indexed":true,"internalType":"uint256","name":"_sourceChainID","type":"uint256"}],"name":"BatchSent","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes32","name":"_intentHash","type":"bytes32"}],"name":"IntentAlreadyProven","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"_hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_claimant","type":"address"}],"name":"IntentProven","type":"event"},{"inputs":[],"name":"DEFAULT_GAS_LIMIT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAILBOX","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":"uint256","name":"_sourceChainId","type":"uint256"},{"internalType":"bytes32[]","name":"_intentHashes","type":"bytes32[]"},{"internalType":"address[]","name":"_claimants","type":"address[]"},{"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":"address[]","name":"","type":"address[]"}],"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":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"},{"internalType":"uint256","name":"_sourceChainId","type":"uint256"},{"internalType":"bytes32[]","name":"_intentHashes","type":"bytes32[]"},{"internalType":"address[]","name":"_claimants","type":"address[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"prove","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"provenIntents","outputs":[{"internalType":"address","name":"","type":"address"}],"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
0x6103806040523461067857611f7a8038038061001a816106a8565b92833981019060808183031261067857610033816106cd565b91610040602083016106cd565b60408301519091906001600160401b0381116106785783019281601f85011215610678578351916001600160401b038311610694578260051b9460206100878188016106a8565b8095815201906020829782010192831161067857602001905b82821061067c575050506060015192826080528151601481116106785760a052815115610671578151156105ea57516001600160a01b03165b60c05260018151115f1461066b578051600110156105ea5760408101516001600160a01b03165b60e05260028151115f14610665578051600210156105ea5760608101516001600160a01b03165b6101005260038151115f1461065f578051600310156105ea5760808101516001600160a01b03165b6101205260048151115f14610659578051600410156105ea5760a08101516001600160a01b03165b6101405260058151115f14610653578051600510156105ea5760c08101516001600160a01b03165b6101605260068151115f1461064d578051600610156105ea5760e08101516001600160a01b03165b6101805260078151115f14610647578051600710156105ea576101008101516001600160a01b03165b6101a05260088151115f14610641578051600810156105ea576101208101516001600160a01b03165b6101c05260098151115f1461063b578051600910156105ea576101408101516001600160a01b03165b6101e052600a8151115f14610635578051600a10156105ea576101608101516001600160a01b03165b61020052600b8151115f1461062f578051600b10156105ea576101808101516001600160a01b03165b61022052600c8151115f14610629578051600c10156105ea576101a08101516001600160a01b03165b61024052600d8151115f14610623578051600d10156105ea576101c08101516001600160a01b03165b61026052600e8151115f1461061d578051600e10156105ea576101e08101516001600160a01b03165b61028052600f8151115f14610617578051600f10156105ea576102008101516001600160a01b03165b6102a05260108151115f14610611578051601010156105ea576102208101516001600160a01b03165b6102c05260118151115f1461060b578051601110156105ea576102408101516001600160a01b03165b6102e05260128151115f14610605578051601210156105ea576102608101516001600160a01b03165b6103005260138151115f146105fe578051601310156105ea5761028001516001600160a01b03165b610320526001600160a01b0316156105db5780156105d1575b610340526001600160a01b038116156105c2576103605260405161189890816106e282396080518181816107c30152610a39015260a05181818161010601528181610a7f0152610f6f015260c0518181816107150152610fa7015260e0518181816106da0152610fe001526101005181818161069c015261101901526101205181818161065e0152611052015261014051818181610620015261108b0152610160518181816105e201526110c40152610180518181816105a401526110fd01526101a051818181610565015261113601526101c051818181610526015261116f01526101e0518181816104e701526111a80152610200518181816104a801526111e1015261022051818181610469015261121a01526102405181818161042a01526112530152610260518181816103eb015261128c0152610280518181816103ac01526112c501526102a05181818161036d01526112fe01526102c05181818161032e015261133701526102e0518181816102ef01526113700152610300518181816102b001526113a901526103205181818161025d01526113e10152610340518160cd0152610360518181816108a501528181610ae801528181610b580152818161158401526116ab0152f35b6385405fbf60e01b5f5260045ffd5b5062030d406103f4565b63384c34c960e21b5f5260045ffd5b634e487b7160e01b5f52603260045260245ffd5b505f6103db565b5f6103b3565b5f61038a565b5f610361565b5f610338565b5f61030f565b5f6102e6565b5f6102bd565b5f610294565b5f61026b565b5f610242565b5f610219565b5f6101f0565b5f6101c7565b5f61019f565b5f610177565b5f61014f565b5f610127565b5f610100565b505f6100d9565b5f80fd5b60208091610689846106cd565b8152019101906100a0565b634e487b7160e01b5f52604160045260245ffd5b6040519190601f01601f191682016001600160401b0381118382101761069457604052565b51906001600160a01b03821682036106785756fe6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610df85750806321ec34a014610d675780633af32abf14610d3a57806354fd4d5014610cea57806356d5d47514610b175780637dc2b8fb14610ad357806399d145b214610aa257806399db89b514610a685780639bcd850f146109f1578063b701069714610a24578063bc8c7df2146109f1578063c87adc8c14610744578063d01f63f5146100f45763d6be695a146100b6575f80fd5b346100f0575f3660031901126100f05760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b5f80fd5b346100f0575f3660031901126100f0577f000000000000000000000000000000000000000000000000000000000000000061012e8161146b565b9061013c6040519283610ef6565b8082526101488161146b565b602083019190601f19013683378061070c575b600181116106ce575b60028111610690575b60038111610652575b60048111610614575b600581116105d6575b60068111610598575b60078111610559575b6008811161051a575b600981116104db575b600a811161049c575b600b811161045d575b600c811161041e575b600d81116103df575b600e81116103a0575b600f8111610361575b60108111610322575b601181116102e3575b601281116102a4575b601310610251575b90604051918291602083019060208452518091526040830191905f5b81811061022f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610221565b815160131015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610280830152610205565b634e487b7160e01b5f52603260045260245ffd5b825160121015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102608401526101fd565b825160111015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102408401526101f4565b825160101015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102208401526101eb565b8251600f1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102008401526101e2565b8251600e1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101e08401526101d9565b8251600d1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101c08401526101d0565b8251600c1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101a08401526101c7565b8251600b1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101808401526101be565b8251600a1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101608401526101b5565b825160091015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101408401526101ac565b825160081015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101208401526101a3565b825160071015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661010084015261019a565b825160061015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660e0840152610191565b825160051015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660c0840152610188565b825160041015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660a084015261017f565b825160031015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166080840152610176565b825160021015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316606084015261016d565b825160011015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166040840152610164565b825115610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316825261015b565b60a03660031901126100f057610758610ea8565b602435906044356001600160401b0381116100f05761077b903690600401610e4b565b6064939193356001600160401b0381116100f05761079d903690600401610e4b565b6084959195356001600160401b0381116100f0576107bf903690600401610e7b565b96907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031633036109de57876107fb91611496565b9261080a84848488858b61154b565b958634106109cb575f988734116109a5575b6040516001600160fb1b0388116100f0578083918960051b8087833781010390207fd6383b4658ff90fe5c7fb8d1fe7a0b6cc87b7ecaf49d2305c1fed682f39548325f80a3606081101561098e575b509160209561087f94926108a196946115ee565b6040516242e0f760e61b8152978896909587958695929492916004870161141f565b03917f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165af1801561098357610954575b5081151580610942575b6108ea57005b5f918291829182916001600160a01b0316610bb8f13d1561093d573d61090f81610f2b565b9061091d6040519283610ef6565b81525f60203d92013e5b1561092e57005b633d2cec6f60e21b5f5260045ffd5b610927565b506001600160a01b03811615156108e4565b6020813d60201161097b575b8161096d60209383610ef6565b810103126100f057516108da565b3d9150610960565b6040513d5f823e3d90fd5b6060959391949295116100f057919390928961086b565b98508634033481116109b7579861081c565b634e487b7160e01b5f52601160045260245ffd5b8663131398d760e21b5f5260045260245ffd5b63cc44a19b60e01b5f523360045260245ffd5b346100f0575f3660031901126100f057610a20610a0c610f46565b604051918291602083526020830190610ed2565b0390f35b346100f0575f3660031901126100f0576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b346100f0575f3660031901126100f05760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f05760203660031901126100f0576004355f525f602052602060018060a01b0360405f205416604051908152f35b346100f0575f3660031901126100f0576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b60603660031901126100f05760043563ffffffff81168091036100f0576044356001600160401b0381116100f057610b53903690600401610e7b565b9091337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031603610cd75715610cc8576024356001600160a01b03168015610cb957610ba581610f6d565b15610ca757508101906040818303126100f05780356001600160401b0381116100f05781019082601f830112156100f057813591610be28361146b565b92610bf06040519485610ef6565b80845260208085019160051b830101918583116100f057602001905b828210610c97575050506020810135906001600160401b0382116100f057019082601f830112156100f057813592610c438461146b565b92610c516040519485610ef6565b84845260208085019560051b8201019182116100f057602001935b818510610c7f57610c7d8484611779565b005b60208091610c8c87610ebe565b815201940193610c6c565b8135815260209182019101610c0c565b6301195a3f60e11b5f5260045260245ffd5b635d336e1d60e11b5f5260045ffd5b63c5ac559960e01b5f5260045ffd5b63188c4f9b60e01b5f523360045260245ffd5b346100f0575f3660031901126100f057610a20604051610d0b604082610ef6565b600e81526d312e382e31342d6532633132653760901b6020820152604051918291602083526020830190610ed2565b346100f05760203660031901126100f0576020610d5d610d58610ea8565b610f6d565b6040519015158152f35b346100f05760803660031901126100f0576024356001600160401b0381116100f057610d97903690600401610e4b565b906044356001600160401b0381116100f057610db7903690600401610e4b565b60643592916001600160401b0384116100f057602094610de7610de1610df0963690600401610e7b565b90611496565b9360043561154b565b604051908152f35b346100f05760203660031901126100f0576004359063ffffffff60e01b82168092036100f0576020916353b7598360e01b8114908115610e3a575b5015158152f35b6301ffc9a760e01b14905083610e33565b9181601f840112156100f0578235916001600160401b0383116100f0576020808501948460051b0101116100f057565b9181601f840112156100f0578235916001600160401b0383116100f057602083818601950101116100f057565b600435906001600160a01b03821682036100f057565b35906001600160a01b03821682036100f057565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90601f801991011681019081106001600160401b03821117610f1757604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610f1757601f01601f191660200190565b60405190610f55604083610ef6565b600982526848797065726c616e6560b81b6020830152565b7f0000000000000000000000000000000000000000000000000000000000000000908115611419576001600160a01b0316908115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576001811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576002811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576003811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576004811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576005811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576006811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576007811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576008811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576009811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600a811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600b811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600c811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600d811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600e811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600f811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576010811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576011811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576012811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576013101561140d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490565b505f90565b5050600190565b50505f90565b939060809361145b9363ffffffff61144d93999899168752602087015260a0604087015260a0860190610ed2565b908482036060860152610ed2565b6001600160a01b03909416910152565b6001600160401b038111610f175760051b60200190565b80518210156102905760209160051b010190565b60405191606083018381106001600160401b03821117610f17576040525f8352602083016060815260408401915f83528301916060848403126100f05760208401356001600160401b0381116100f057840183601f820112156100f0578035906114ff82610f2b565b9461150d6040519687610ef6565b828652602083830101116100f057815f926020809301838801378501015260408401356001600160a01b03811691908290036100f057525235815290565b9261158095926020959261155e956115ee565b6040516381d2ea9560e01b81529687958695919492939291906004870161141f565b03817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610983575f916115bf575090565b90506020813d6020116115e6575b816115da60209383610ef6565b810103126100f0575190565b3d91506115cd565b959395949290919486860361176a5763ffffffff81116117585763ffffffff1695835195604051936040602086015281606086015260018060fb1b0382116100f05760a0908593949260051b8091608086013783018460808201601f19608087850301016040870152520190925f5b818110611728575050611679925003601f198101835282610ef6565b60208201516040909201519092906001600160a01b0316806117255750604051633d1250b760e01b81526020816004817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03165afa908115610983575f916116e6575090565b90506020813d60201161171d575b8161170160209383610ef6565b810103126100f057516001600160a01b03811681036100f05790565b3d91506116f4565b90565b9092509060019060209081906001600160a01b0361174588610ebe565b168152019401910191849293919361165d565b631063f20160e11b5f5260045260245ffd5b63512509d360e11b5f5260045ffd5b91908251801561185c5781510361176a575f5b835181101561185c57806117a260019286611482565b51828060a01b036117b38386611482565b5116801561185557815f525f602052838060a01b0360405f20541615155f14611809575060207fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e561191604051908152a15b0161178c565b90805f525f60205260405f20826bffffffffffffffffffffffff60a01b8254161790557f2b45193f790d995b36e39c4104dd1b49df6fc851b6f6ae60f2072724735b5b435f80a3611803565b5050611803565b5050905056fea26469706673582212201e8c7b265ef783123b8efed7ba3dcd4d836bd78e3e8bed531f67ba88e7bafb5164736f6c634300081b0033000000000000000000000000c005dc82818d67af737725bd4bf75435d065d239000000000000000000000000530ceea09ad2d90693c82ee9274f1ba9d7428a070000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000035d977b7e7a7cd69a314b16ee2cabafd13dd5fa9
Deployed Bytecode
0x6080806040526004361015610012575f80fd5b5f3560e01c90816301ffc9a714610df85750806321ec34a014610d675780633af32abf14610d3a57806354fd4d5014610cea57806356d5d47514610b175780637dc2b8fb14610ad357806399d145b214610aa257806399db89b514610a685780639bcd850f146109f1578063b701069714610a24578063bc8c7df2146109f1578063c87adc8c14610744578063d01f63f5146100f45763d6be695a146100b6575f80fd5b346100f0575f3660031901126100f05760206040517f00000000000000000000000000000000000000000000000000000000000000018152f35b5f80fd5b346100f0575f3660031901126100f0577f000000000000000000000000000000000000000000000000000000000000000161012e8161146b565b9061013c6040519283610ef6565b8082526101488161146b565b602083019190601f19013683378061070c575b600181116106ce575b60028111610690575b60038111610652575b60048111610614575b600581116105d6575b60068111610598575b60078111610559575b6008811161051a575b600981116104db575b600a811161049c575b600b811161045d575b600c811161041e575b600d81116103df575b600e81116103a0575b600f8111610361575b60108111610322575b601181116102e3575b601281116102a4575b601310610251575b90604051918291602083019060208452518091526040830191905f5b81811061022f575050500390f35b82516001600160a01b0316845285945060209384019390920191600101610221565b815160131015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316610280830152610205565b634e487b7160e01b5f52603260045260245ffd5b825160121015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102608401526101fd565b825160111015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102408401526101f4565b825160101015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102208401526101eb565b8251600f1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166102008401526101e2565b8251600e1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101e08401526101d9565b8251600d1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101c08401526101d0565b8251600c1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101a08401526101c7565b8251600b1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101808401526101be565b8251600a1015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101608401526101b5565b825160091015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101408401526101ac565b825160081015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166101208401526101a3565b825160071015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031661010084015261019a565b825160061015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660e0840152610191565b825160051015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660c0840152610188565b825160041015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031660a084015261017f565b825160031015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166080840152610176565b825160021015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316606084015261016d565b825160011015610290577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166040840152610164565b825115610290577f00000000000000000000000035d977b7e7a7cd69a314b16ee2cabafd13dd5fa96001600160a01b0316825261015b565b60a03660031901126100f057610758610ea8565b602435906044356001600160401b0381116100f05761077b903690600401610e4b565b6064939193356001600160401b0381116100f05761079d903690600401610e4b565b6084959195356001600160401b0381116100f0576107bf903690600401610e7b565b96907f000000000000000000000000530ceea09ad2d90693c82ee9274f1ba9d7428a076001600160a01b031633036109de57876107fb91611496565b9261080a84848488858b61154b565b958634106109cb575f988734116109a5575b6040516001600160fb1b0388116100f0578083918960051b8087833781010390207fd6383b4658ff90fe5c7fb8d1fe7a0b6cc87b7ecaf49d2305c1fed682f39548325f80a3606081101561098e575b509160209561087f94926108a196946115ee565b6040516242e0f760e61b8152978896909587958695929492916004870161141f565b03917f000000000000000000000000c005dc82818d67af737725bd4bf75435d065d2396001600160a01b03165af1801561098357610954575b5081151580610942575b6108ea57005b5f918291829182916001600160a01b0316610bb8f13d1561093d573d61090f81610f2b565b9061091d6040519283610ef6565b81525f60203d92013e5b1561092e57005b633d2cec6f60e21b5f5260045ffd5b610927565b506001600160a01b03811615156108e4565b6020813d60201161097b575b8161096d60209383610ef6565b810103126100f057516108da565b3d9150610960565b6040513d5f823e3d90fd5b6060959391949295116100f057919390928961086b565b98508634033481116109b7579861081c565b634e487b7160e01b5f52601160045260245ffd5b8663131398d760e21b5f5260045260245ffd5b63cc44a19b60e01b5f523360045260245ffd5b346100f0575f3660031901126100f057610a20610a0c610f46565b604051918291602083526020830190610ed2565b0390f35b346100f0575f3660031901126100f0576040517f000000000000000000000000530ceea09ad2d90693c82ee9274f1ba9d7428a076001600160a01b03168152602090f35b346100f0575f3660031901126100f05760206040517f00000000000000000000000000000000000000000000000000000000000000018152f35b346100f05760203660031901126100f0576004355f525f602052602060018060a01b0360405f205416604051908152f35b346100f0575f3660031901126100f0576040517f000000000000000000000000c005dc82818d67af737725bd4bf75435d065d2396001600160a01b03168152602090f35b60603660031901126100f05760043563ffffffff81168091036100f0576044356001600160401b0381116100f057610b53903690600401610e7b565b9091337f000000000000000000000000c005dc82818d67af737725bd4bf75435d065d2396001600160a01b031603610cd75715610cc8576024356001600160a01b03168015610cb957610ba581610f6d565b15610ca757508101906040818303126100f05780356001600160401b0381116100f05781019082601f830112156100f057813591610be28361146b565b92610bf06040519485610ef6565b80845260208085019160051b830101918583116100f057602001905b828210610c97575050506020810135906001600160401b0382116100f057019082601f830112156100f057813592610c438461146b565b92610c516040519485610ef6565b84845260208085019560051b8201019182116100f057602001935b818510610c7f57610c7d8484611779565b005b60208091610c8c87610ebe565b815201940193610c6c565b8135815260209182019101610c0c565b6301195a3f60e11b5f5260045260245ffd5b635d336e1d60e11b5f5260045ffd5b63c5ac559960e01b5f5260045ffd5b63188c4f9b60e01b5f523360045260245ffd5b346100f0575f3660031901126100f057610a20604051610d0b604082610ef6565b600e81526d312e382e31342d6532633132653760901b6020820152604051918291602083526020830190610ed2565b346100f05760203660031901126100f0576020610d5d610d58610ea8565b610f6d565b6040519015158152f35b346100f05760803660031901126100f0576024356001600160401b0381116100f057610d97903690600401610e4b565b906044356001600160401b0381116100f057610db7903690600401610e4b565b60643592916001600160401b0384116100f057602094610de7610de1610df0963690600401610e7b565b90611496565b9360043561154b565b604051908152f35b346100f05760203660031901126100f0576004359063ffffffff60e01b82168092036100f0576020916353b7598360e01b8114908115610e3a575b5015158152f35b6301ffc9a760e01b14905083610e33565b9181601f840112156100f0578235916001600160401b0383116100f0576020808501948460051b0101116100f057565b9181601f840112156100f0578235916001600160401b0383116100f057602083818601950101116100f057565b600435906001600160a01b03821682036100f057565b35906001600160a01b03821682036100f057565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b90601f801991011681019081106001600160401b03821117610f1757604052565b634e487b7160e01b5f52604160045260245ffd5b6001600160401b038111610f1757601f01601f191660200190565b60405190610f55604083610ef6565b600982526848797065726c616e6560b81b6020830152565b7f0000000000000000000000000000000000000000000000000000000000000001908115611419576001600160a01b0316908115611419577f00000000000000000000000035d977b7e7a7cd69a314b16ee2cabafd13dd5fa96001600160a01b03168214611412576001811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576002811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576003811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576004811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576005811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576006811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576007811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576008811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576009811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600a811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600b811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600c811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600d811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600e811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316821461141257600f811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576010811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576011811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576012811115611419577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168214611412576013101561140d577f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161490565b505f90565b5050600190565b50505f90565b939060809361145b9363ffffffff61144d93999899168752602087015260a0604087015260a0860190610ed2565b908482036060860152610ed2565b6001600160a01b03909416910152565b6001600160401b038111610f175760051b60200190565b80518210156102905760209160051b010190565b60405191606083018381106001600160401b03821117610f17576040525f8352602083016060815260408401915f83528301916060848403126100f05760208401356001600160401b0381116100f057840183601f820112156100f0578035906114ff82610f2b565b9461150d6040519687610ef6565b828652602083830101116100f057815f926020809301838801378501015260408401356001600160a01b03811691908290036100f057525235815290565b9261158095926020959261155e956115ee565b6040516381d2ea9560e01b81529687958695919492939291906004870161141f565b03817f000000000000000000000000c005dc82818d67af737725bd4bf75435d065d2396001600160a01b03165afa908115610983575f916115bf575090565b90506020813d6020116115e6575b816115da60209383610ef6565b810103126100f0575190565b3d91506115cd565b959395949290919486860361176a5763ffffffff81116117585763ffffffff1695835195604051936040602086015281606086015260018060fb1b0382116100f05760a0908593949260051b8091608086013783018460808201601f19608087850301016040870152520190925f5b818110611728575050611679925003601f198101835282610ef6565b60208201516040909201519092906001600160a01b0316806117255750604051633d1250b760e01b81526020816004817f000000000000000000000000c005dc82818d67af737725bd4bf75435d065d2396001600160a01b03165afa908115610983575f916116e6575090565b90506020813d60201161171d575b8161170160209383610ef6565b810103126100f057516001600160a01b03811681036100f05790565b3d91506116f4565b90565b9092509060019060209081906001600160a01b0361174588610ebe565b168152019401910191849293919361165d565b631063f20160e11b5f5260045260245ffd5b63512509d360e11b5f5260045ffd5b91908251801561185c5781510361176a575f5b835181101561185c57806117a260019286611482565b51828060a01b036117b38386611482565b5116801561185557815f525f602052838060a01b0360405f20541615155f14611809575060207fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e561191604051908152a15b0161178c565b90805f525f60205260405f20826bffffffffffffffffffffffff60a01b8254161790557f2b45193f790d995b36e39c4104dd1b49df6fc851b6f6ae60f2072724735b5b435f80a3611803565b5050611803565b5050905056fea26469706673582212201e8c7b265ef783123b8efed7ba3dcd4d836bd78e3e8bed531f67ba88e7bafb5164736f6c634300081b0033
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.