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 Type | Asset |
|---|---|
USDC | Circle’s USD stablecoin |
USDT | Tether’s USD stablecoin |
USD | US dollars (fiat) |
ETH | Ether |
BTC | Bitcoin |
MXN | Mexican pesos (fiat) |
EUR | Euros (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 Type | Network |
|---|---|
ethereum | Ethereum mainnet |
base | Base L2 |
solana | Solana |
bitcoin | Bitcoin network |
ach | US ACH network |
wire | US wire transfer |
spei | Mexico’s SPEI |
sepa | EU SEPA |
fps | UK 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
_rooton 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.