From Event Logs

Facet Transactions in Ethereum Events

L1 Smart Contracts create Facet transactions by emitting special events that are identified by the Facet event signature:

 0x00000000000000000000000000000000000000000000000000000000000face7

The data payload is the same RLP encoded transaction that would be used in the calldata of an EOA-originated Facet transaction. Here's how this is done in Solidity:

import { LibRLP } from "lib/solady/src/utils/LibRLP.sol";

contract FacetSender {
    using LibRLP for LibRLP.List;

    bytes32 constant facetEventSignature = 0x00000000000000000000000000000000000000000000000000000000000face7;
    uint8 constant facetTxType = 0x46;

    function sendFacetTransaction(
        uint256 chainId,
        bytes memory to,
        uint256 value,
        uint256 maxFeePerGas,
        uint256 gasLimit,
        bytes memory data
    ) internal {
        LibRLP.List memory list;

        list.p(chainId);
        list.p(to);
        list.p(value);
        list.p(maxFeePerGas);
        list.p(gasLimit);
        list.p(data);

        bytes memory payload = abi.encodePacked(facetTxType, list.encode());
        
        assembly {
            log1(add(payload, 32), mload(payload), facetEventSignature)
        }
    }
}

Last updated