Facet Transactions in Ethereum Events
L1 Smart Contracts create Facet transactions by emitting special events that are identified by the Facet event signature:
Copy 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:
Copy 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 gasLimit,
bytes memory data,
bytes memory mineBoost
) internal {
LibRLP.List memory list;
list.p(chainId);
list.p(to);
list.p(value);
list.p(gasLimit);
list.p(data);
list.p(mineBoost);
bytes memory payload = abi.encodePacked(facetTxType, list.encode());
assembly {
log1(add(payload, 32), mload(payload), facetEventSignature)
}
}
}