Source Code
Overview
ETH Balance
0 ETH
More Info
ContractCreator
Multichain Info
N/A
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Latest 1 internal transaction
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
23680481 | 26 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0xC4d6985b...009595A6C The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
MetalayerProver
Compiler Version
v0.8.26+commit.8a97fa7a
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.26; import "@hyperlane-xyz/core/contracts/libs/TypeCasts.sol"; import "../interfaces/IMetalayerRecipient.sol"; import {BaseProver} from "./BaseProver.sol"; import {Semver} from "../libs/Semver.sol"; /** * @title MetalayerProver * @author Constellation Labs * @notice A simple prover implementation for Eco's routing of Metalayer-settled intents. * @dev This implementation is designed to be used as a prover for Eco Protocol intents that are routed through Metalayer, * and is not designed to be used as a general-purpose prover for Metalayer intents out of the context of Eco Protocol. */ contract MetalayerProver is IMetalayerRecipient, BaseProver, Semver { using TypeCasts for bytes32; ProofType public constant PROOF_TYPE = ProofType.Metalayer; /** * @notice emitted on an attempt to register a claimant on an intent that has already been proven and has a claimant * @dev this is an event rather than an error because the expected behavior is to ignore one intent but continue with the rest * @param _intentHash the hash of the intent */ event IntentAlreadyProven(bytes32 _intentHash); /** * @notice emitted on an unauthorized call to the handle() method * @param _sender the address that called the handle() method */ error UnauthorizedHandle(address _sender); /** * @notice emitted when the handle() call is a result of an unauthorized dispatch() call on another chain's Router * @param _sender the address that called the dispatch() method */ error UnauthorizedDispatch(address _sender); /// @notice the address of the local MetalayerRouter address public immutable ROUTER; /// @notice the address of the Inbox contract address public immutable INBOX; /** * @notice Initializes the addresses of the local MetalayerRouter and Eco's Inbox contract * @param _router the address of the local MetalayerRouter * @param _inbox the address of the Inbox contract */ constructor(address _router, address _inbox) { ROUTER = _router; INBOX = _inbox; } /** * @notice Handles intents from the MetalayerRouter * @param -_chainId the chain ID of the intent's origin chain (not used) * @param _sender the address that called the dispatch() method * @param _message the write call data (message body) * @param -_reads array of read operations performed (not used) * @param -_readResults results of the read operations (not used) * @dev This function is designed to be called by the MetalayerRouter on the local chain. */ function handle( uint32, address _sender, bytes calldata _message, ReadOperation[] calldata, bytes[] calldata ) external payable { if (ROUTER != msg.sender) { revert UnauthorizedHandle(msg.sender); } if (INBOX != _sender) { revert UnauthorizedDispatch(_sender); } (bytes32[] memory hashes, address[] memory claimants) = abi.decode( _message, (bytes32[], address[]) ); for (uint256 i = 0; i < hashes.length; i++) { (bytes32 intentHash, address claimant) = (hashes[i], claimants[i]); if (provenIntents[intentHash] != address(0)) { emit IntentAlreadyProven(intentHash); } else { provenIntents[intentHash] = claimant; emit IntentProven(intentHash, claimant); } } } /** * @notice Returns the proof type used by this prover * @return the proof type */ function getProofType() external pure override returns (ProofType) { return PROOF_TYPE; } }
// 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))); } }
// SPDX-License-Identifier: MIT OR Apache-2.0 pragma solidity >=0.6.11; /** * @notice Struct defining a cross-chain read operation * @param sourceChainId Domain of the chain to read from * @param sourceContract Contract address to read from as address * @param callDataLength Length of the call data * @param callData The encoded function call data */ struct ReadOperation { uint32 sourceChainId; address sourceContract; bytes callData; } interface IMetalayerRecipient { // Here, _readResults will be the results of every read in the message, in order. This will be input by the relayer. function handle( uint32 _chainId, address _sender, bytes calldata _message, // The body of the Metalayer message, or writeCallData. ReadOperation[] calldata _reads, bytes[] calldata _readResults ) external payable; }
// 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 Types of proofs that can validate intent fulfillment * @param Storage Traditional storage-based proof mechanism * @param Hyperlane Proof using Hyperlane's cross-chain messaging */ enum ProofType { Storage, Hyperlane, Metalayer } /** * @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 Gets the proof mechanism type used by this prover * @return ProofType enum indicating the prover's mechanism */ function getProofType() external pure returns (ProofType); /** * @notice Gets the address eligible to claim rewards for a proven intent * @param intentHash Hash of the intent to query * @return Address of the claimant, or zero address if unproven */ function getIntentClaimant( bytes32 intentHash ) external view returns (address); }
// 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: UNLICENSED pragma solidity ^0.8.26; import {ISemver} from "../interfaces/ISemver.sol"; abstract contract Semver is ISemver { function version() external pure returns (string memory) { return "1.8.14-e2c12e7"; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import {IProver} from "../interfaces/IProver.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 { /** * @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 Gets the address eligible to claim rewards for a given intent * @param intentHash Hash of the intent to query * @return Address of the claimant, or zero address if unproven */ function getIntentClaimant( bytes32 intentHash ) external view override returns (address) { return provenIntents[intentHash]; } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_router","type":"address"},{"internalType":"address","name":"_inbox","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"UnauthorizedDispatch","type":"error"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"UnauthorizedHandle","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":"_hash","type":"bytes32"},{"indexed":true,"internalType":"address","name":"_claimant","type":"address"}],"name":"IntentProven","type":"event"},{"inputs":[],"name":"INBOX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROOF_TYPE","outputs":[{"internalType":"enum IProver.ProofType","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROUTER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"intentHash","type":"bytes32"}],"name":"getIntentClaimant","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getProofType","outputs":[{"internalType":"enum IProver.ProofType","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint32","name":"","type":"uint32"},{"internalType":"address","name":"_sender","type":"address"},{"internalType":"bytes","name":"_message","type":"bytes"},{"components":[{"internalType":"uint32","name":"sourceChainId","type":"uint32"},{"internalType":"address","name":"sourceContract","type":"address"},{"internalType":"bytes","name":"callData","type":"bytes"}],"internalType":"struct ReadOperation[]","name":"","type":"tuple[]"},{"internalType":"bytes[]","name":"","type":"bytes[]"}],"name":"handle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"provenIntents","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"}]
Deployed Bytecode
0x608080604052600436101561001357600080fd5b60003560e01c90816332fe7b26146104c957508063432c7640146103e757806354fd4d501461041b57806399d145b2146103e75780639bcd850f14610077578063a7d9027f146100dd578063b7010697146100985763bc8c7df21461007757600080fd5b3461009357600036600319011261009357602060405160028152f35b600080fd5b34610093576000366003190112610093576040517f0000000000000000000000001aa1ea77994266f735e8ccbb69c307682d3f8e836001600160a01b03168152602090f35b60a03660031901126100935760043563ffffffff811603610093576024356001600160a01b03811690819003610093576044359067ffffffffffffffff8211610093573660238301121561009357816004013567ffffffffffffffff811161009357820160248101913683116100935760643567ffffffffffffffff81116100935761016d90369060040161050b565b505060843567ffffffffffffffff81116100935761018f90369060040161050b565b5050337f000000000000000000000000c41de2a4243e4304813c36cd8952366dcb36106a6001600160a01b0316036103d2577f0000000000000000000000001aa1ea77994266f735e8ccbb69c307682d3f8e836001600160a01b03168190036103be57506040908390031261009357602482013567ffffffffffffffff811161009357820191816043840112156100935760248301359261023761023285610562565b61053c565b93602060248187848152019260051b840101019184831161009357604401905b8282106103ae5750505060448101359067ffffffffffffffff8211610093570190806043830112156100935760248201359061029561023283610562565b92602060248186868152019460051b8301010191821161009357604401915b81831061038e5750505060005b825181101561038c57806102d76001928561057a565b51828060a01b036102e8838661057a565b5116816000526000602052838060a01b0360406000205416151560001461033c575060207fc86ca07015d7e87a46a98098d36c9fc68bc3120761e5c7a2023fc6c6869e561191604051908152a15b016102c1565b908060005260006020526040600020826bffffffffffffffffffffffff60a01b8254161790557f2b45193f790d995b36e39c4104dd1b49df6fc851b6f6ae60f2072724735b5b43600080a3610336565b005b82356001600160a01b0381168103610093578152602092830192016102b4565b8135815260209182019101610257565b63c078012160e01b60005260045260246000fd5b63188c4f9b60e01b6000523360045260246000fd5b34610093576020366003190112610093576004356000526000602052602060018060a01b0360406000205416604051908152f35b34610093576000366003190112610093576040516040810181811067ffffffffffffffff8211176104b357604052600e81526d312e382e31342d6532633132653760901b602082015260405190602082528181519182602083015260005b83811061049b5750508160006040809484010152601f80199101168101030190f35b60208282018101516040878401015285935001610479565b634e487b7160e01b600052604160045260246000fd5b34610093576000366003190112610093577f000000000000000000000000c41de2a4243e4304813c36cd8952366dcb36106a6001600160a01b03168152602090f35b9181601f840112156100935782359167ffffffffffffffff8311610093576020808501948460051b01011161009357565b6040519190601f01601f1916820167ffffffffffffffff8111838210176104b357604052565b67ffffffffffffffff81116104b35760051b60200190565b805182101561058e5760209160051b010190565b634e487b7160e01b600052603260045260246000fdfea2646970667358221220225088ee0ecc8f77c13034403bb755fc1ac82e6797c9de3d0c009c4b2b23a92a64736f6c634300081a0033
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.