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.