
Verify LayerX evidence inside an EVM call
Cross-domain precompile connector
Seven native precompiles at fixed addresses replace a bridge contract, a relayer and a message queue.
Your Paxeer contract calls LayerXVerify at 0x1012 and gets back a verified receipt, inclusion proof, state proof or discovery proof, or the call reverts. Four precompiles decode LayerX evidence with pure Go verification packages that touch no clock, network or database. Three more move value or run a local market under signed evidence. Every trust anchor arrives as calldata, so your contract decides which sequencer key, batch range or state root it accepts.
What it does
Paxeer X is one network with two execution domains: the Paxeer EVM base layer and the LayerX agent domain. The connector between them is a set of seven native precompiles at fixed EVM addresses, not a message queue or a bridge contract. Four of them decode and verify the evidence LayerX produces: signed receipts, batch headers, state witnesses and checkpoint certificates. They use pure Go verification packages with no clock, network or database access. The other three move value or run a local market on Paxeer under signed evidence.
Key capabilities
LayerXVerifyat 0x1012 verifies receipts, inclusion proofs, state proofs and discovery proofs statelessly.Addrat 0x1004 binds an EVM address to adid:layerxkey, both keys consenting.LayerXCustodyat 0x1013 releases custodied funds only against verified withdrawal or exit evidence.LayerXAnchorat 0x1014 registers checkpoints, guarantor bonds, attestations and challenges.LayerXExchange0x1015,LayerXBridge0x1016 andLaunchpad0x1017 cover intents, attested bridging and a local AMM.- Each precompile is declared as a Solidity interface and implemented as a native Go function in the EVM module.
Who it's for
Solidity developers writing Paxeer contracts that must act on facts produced in the LayerX domain.
Why it matters
A contract can treat a LayerX receipt or balance as a verified fact inside a single EVM call, with no relayer, no wrapped-message queue and no trust in an off-chain operator. Every trust anchor is calldata, so the calling contract decides which sequencer key, batch range or state root it accepts.
Differentiators
Verification runs inside the EVM over LayerX's own canonical encodings rather than in a bridge contract, and the Go verifier is tested against fixtures whose verdicts come from the Rust verifier, not from the Go code under test.
Outcomes
- Treat a LayerX receipt as a verified fact in one call
- No relayer, no wrapped-message queue, no off-chain operator to trust
- Your contract chooses the sequencer key and batch range it accepts
Technical notes
- Addresses: 0x1004
Addr, 0x1012LayerXVerify, 0x1013LayerXCustody, 0x1014LayerXAnchor, 0x1015LayerXExchange, 0x1016LayerXBridge, 0x1017Launchpad. LayerXVerifygas is3000 + 16 per calldata byte + 4000 per signature + 100 per proof node. Signatures counted: 1 forverifyEd25519,verifyReceiptandverifyDiscoveryProof, 2 forverifyReceiptInclusion, 0 forverifyStateProof. Proof nodes are the proof or witness length divided by 32.verifyEd25519returns a boolean; every other method reverts unless the evidence verifies, so any returned value is a verified fact. Domains 0..19 are the LayerX hash-domain tags, domain 255 signs the message bytes as given, and a message may not exceed 1 MiB (codec.MaxMessageBytes = 1_048_576).verifyReceiptInclusionchecks the header's sequencer identity and authorised batch range, the header signature, the Merkle path to the header's receipt root, the receipt's own sequencer signature, and that the receipt's protocol version and global sequence fall inside the header's committed range.LayerXVerifycannot be reached bydelegatecalland is non-payable.- Solidity consumer interfaces exist for
Addr,LayerXVerify,LayerXCustodyandLayerXAnchorundercontracts/src/precompiles/; the exchange, bridge and launchpad precompiles have no interface file there yet. LayerXExchangerecords trading intents only. It never matches an order on Paxeer, and no running service yet consumes those intents on the LayerX side.- The custody, anchor, exchange, bridge and launchpad stores and precompiles come live at the
v6.6upgrade height; each precompile's versioned entry is registered under the latest upgrade name only.
import {LAYERX_VERIFY_CONTRACT, ILayerXVerify} from "./precompiles/ILayerXVerify.sol";
function settle(bytes calldata receipt, bytes32 sequencerKey) external {
ILayerXVerify.ReceiptFacts memory facts =
LAYERX_VERIFY_CONTRACT.verifyReceipt(receipt, sequencerKey);
require(facts.resultCode == 0, "layerx activity failed");
_credit(facts.to, facts.asset, facts.amount);
}More in Network
Bonded guarantors with slashing
Bonded operators re-execute every batch
ExploreData availability commitments and challenges
Prove the data behind a state root
ExploreDeterministic replay and divergence halts
Replicas halt instead of serving wrong state
ExploreDisposable beta cluster bring-up
Bring up the whole stack locally
ExploreBuild on Paxeer.
Give your agent a wallet, set its policy, and settle your first call on LayerX.