Multi-chain HD wallets without Tatum lock-in
One of the early decisions was: do we hard-couple to a single RPC provider (Tatum, in our case) or build an abstraction layer?
Hard-coupling is faster. Abstracting is slower up front but gives you the ability to:
- Swap providers per chain. Tatum's Solana support is decent; their Bitcoin support is fine; their Tron handling has rough edges. We can route Solana to Helius if we want.
- Run two providers in parallel for the same chain and shadow-compare results. We catch bugs in the provider that way.
- Cache cold queries (token metadata, contract decimals) ourselves and not pay a per-call fee for things that don't change.
The abstraction is a thin ChainAdapter interface in backend/src/services/chain/. Every chain has a handful of methods: generateMaster, deriveAddress, getBalance, broadcastTransaction, signMessage, parseInboundTransaction. The Tatum adapter implements them by delegating to Tatum's SDK. We have a partial Helius adapter for Solana that we'll roll out next month.
The cost of this abstraction is real — about three weeks of upfront engineering and an ongoing tax of "remember to add the new method to all adapters." But it's the difference between "we're a Tatum reseller with a UI" and "we're a platform that runs on infrastructure we control."