Docs
ChainAdapter Specification
One interface every chain implements; chain logic stays behind it.
Interface
interface ChainAdapter {
getAddress(): string
validateAddress(addr): boolean
getBalance(addr): Promise<Balance>
getTokenBalances(addr, tokens): Promise<TokenBalance[]>
getTransactionHistory(addr): Promise<NormalizedTx[]>
estimateNetworkFee(tx, from): Promise<GasEstimate>
getGasPrice(): Promise<bigint>
buildTransaction(input): Promise<UnsignedTx>
simulateTransaction(tx, from): Promise<Simulation>
signTransaction(tx, key): Promise<Signed> // device only
broadcastTransaction(signed): Promise<Hash> // verifies chain ID
getTransactionStatus(hash): Promise<TxStatus>
getTokenMetadata(contract): Promise<TokenRef>
getNFTs(addr): Promise<NFT[]>
}Rules
- Adapters never persist secrets
- signTransaction receives a key handle on native (NATIVE) and a short-lived key on web
- Every EVM signature embeds chain ID (EIP-155/1559)
Items marked NATIVE must be implemented as audited native code (Swift, Kotlin, Rust or C++), not in the web app.

