Avalanche X, P, and C-Chain
The Avalanche Primary Network is three chains, and only one of them is an EVM. Core is one of the few wallets that exposes all three to dapps:
| Chain | Alias | VM | What runs there |
|---|---|---|---|
| Contract Chain | C | EVM | Smart contracts, ERC-20s — everything Ethereum-shaped |
| Platform Chain | P | PlatformVM | Staking, delegation, validators, Avalanche L1s |
| Exchange Chain | X | AVM | UTXO-based asset transfers |
C-Chain: nothing special required
The C-Chain is an EVM. Every standard flow in these docs —
eth_sendTransaction, signing, Wagmi —
works unchanged. Chain id 43114 (0xa86a), Fuji testnet 43113 (0xa869).
X and P-Chain: build, then hand to Core
X and P-Chain transactions are not EVM transactions — dapps build them with AvalancheJS and pass the unsigned bytes to Core for signing and broadcast:
// Get the user's X/P public key to derive their addresses.
const { xp } = await provider.request({
method: 'avalanche_getAccountPubKey',
});
// Build the transaction with avalanchejs (here: a P-Chain delegation),
// then hand the unsigned bytes to Core.
const txHash = await provider.request({
method: 'avalanche_sendTransaction',
params: {
transactionHex: unsignedTxHex, // from avalanchejs
chainAlias: 'P',
},
});
Core shows the user a decoded approval screen — for a delegation, that includes the validator, amount, and end time — then signs, broadcasts, and returns the transaction id.
The parameters beyond transactionHex and chainAlias handle UTXO
selection (utxos, externalIndices, internalIndices); the
method reference
covers them.
Want the signature without the broadcast? avalanche_signTransaction
returns signed bytes for you to submit through your own node — same
transactionHex/chainAlias input, without the index arrays.
The X and P-Chain guide works through a complete delegation, from key derivation to confirmation.
Testing
Enable testnet mode (Core settings, or avalanche_setDeveloperMode) to
target Fuji's X, P, and C-Chains, and fund accounts from the
testnet faucet.