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 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)
}
}
}