Skip to content

Core Abstractions

Directory reduces every routing decision to two fields: value type (what is transferred) and transfer type (how it moves). A pair of these is a complete delivery instruction.

Value Type — What You Transfer

A value type identifies the specific asset being transferred. It is the concrete asset, not a category.

Value TypeAsset
USDCCircle’s USD stablecoin
USDTTether’s USD stablecoin
USDUS dollars (fiat)
ETHEther
BTCBitcoin
MXNMexican pesos (fiat)
EUREuros (fiat)

The value type makes no assumption about how the asset moves. USDC is USDC whether it moves on Ethereum, Base, Solana, or any future network.

Transfer Type — How You Transfer It

A transfer type identifies the network on which value moves. It is the rail, not the cargo.

Transfer TypeNetwork
ethereumEthereum mainnet
baseBase L2
solanaSolana
bitcoinBitcoin network
achUS ACH network
wireUS wire transfer
speiMexico’s SPEI
sepaEU SEPA
fpsUK Faster Payments

The transfer type makes no assumption about what asset moves on it. Ethereum carries USDC, USDT, ETH, and thousands of other tokens.

Composition

A complete delivery instruction is a value type and transfer type pair. Nothing else is needed at the protocol layer.

[
{ "value_type": "USDC", "transfer_type": "ethereum" },
{ "value_type": "USD", "transfer_type": "ach" },
{ "value_type": "MXN", "transfer_type": "spei" },
{ "value_type": "EUR", "transfer_type": "sepa" }
]

An operator MAY publish accepted pairs in the optional capability manifest; they MAY also declare them out-of-band. A sender matches against what it can send. If there is a match, there is a route. If not, there isn’t. The protocol does not perform conversion.

Address normalization

An address is localpart@domain or a bare domain:

  • The domain is converted to ASCII punycode (IDN) and lowercased.
  • The local part is Unicode-normalized to NFC, whitespace-trimmed, and (for lookup) lowercased.
  • The local part MUST be at most 64 bytes after NFC.
  • The full domain MUST be at most 253 bytes.
  • A bare domain is equivalent to the reserved local part _root on that domain.

The signed contract returns the normalized form in its address field.

Extensibility

New value types and transfer types are added without protocol changes. An operator registers a new pair and it becomes routable. No governance decisions, no protocol upgrades. The pair exists or it doesn’t.

Implementations MUST preserve unknown JSON fields verbatim in both requests and responses. A future protocol revision can add fields that existing verifiers will still canonicalize and check against the signature.