All articles
Developer Platform

Multi-Chain Wallet API: One Integration for 30+ Blockchains

How a multi-chain wallet API replaces per-chain SDK glue — unifying EVM, Solana, Bitcoin, Tron, and more behind a single typed interface for production apps.

Blocsafe Engineering10 min read
Cover image for Multi-Chain Wallet API: One Integration for 30+ Blockchains

The first time you ship a wallet feature for a single chain, it feels manageable. You pull in ethers, wire up a signer, and call it done. The second chain is where the cracks show. Now you have ethers for Ethereum and L2s, web3.js for legacy paths your team hasn't migrated, @solana/web3.js for Solana with its own Keypair and Transaction classes, bitcoinjs-lib for UTXO assembly, and tronweb for TRC-20 because a partner asked for it. Each SDK has its own keypair format, its own signer interface, its own fee model, its own error semantics. Your wallet service turns into a folder of adapters held together by a switch statement, and every chain upgrade becomes a migration. A multi-chain wallet API exists to make that folder go away.

Why multi-chain became table stakes

Five years ago, "we support Ethereum" was a reasonable product position. Today, it reads as incomplete. A consumer wallet that ships without Solana support loses users to apps that have it. A payments product that can't accept USDC on Base, Polygon, and Arbitrum forces customers into bridge UX they shouldn't have to think about. A DeFi dashboard that ignores non-EVM chains misses half of the liquidity its users actually hold.

The shift is structural, not seasonal. L2s fragmented Ethereum into a dozen execution environments that share semantics but not endpoints. Solana became unavoidable for high-throughput consumer apps. Bitcoin came back into developer scope through Ordinals, Runes, and the slow professionalization of Lightning. Tron stayed entrenched in remittances. Cosmos chains and app-chains keep multiplying.

For a backend engineer, this means the minimum viable wallet surface is no longer one chain. It is Ethereum plus its major L2s plus Solana plus at least one non-EVM chain that your business actually needs. A multi-chain wallet API is the layer that lets you treat that reality as a single integration instead of five.

What a multi-chain wallet API actually unifies

A useful multi-chain wallet API does more than wrap a list of RPC endpoints. It normalizes the operations you actually perform in production, so your application code stops branching on chain identity.

The unified surface usually covers:

  • Wallet creation and key custody. One call returns a wallet object that holds addresses for every supported chain, instead of a different constructor for each SDK. Under the hood the API derives a Bitcoin address from a different curve than a Solana address, but you do not have to know that to call wallets.create().
  • Address derivation. Given a wallet, you can ask for its address on any supported chain — wallet.addresses.ethereum, wallet.addresses.solana, wallet.addresses.bitcoin — without juggling derivation paths, BIP-44 indexes, or curve selection.
  • Message signing. A single signMessage(walletId, { chain, message }) call handles EIP-191 prefixing on EVM chains, ed25519 signing on Solana, and BIP-322 on Bitcoin. The blockchain API hides the prefix bytes and the encoding gymnastics.
  • Transaction signing and submission. You hand the API a chain identifier and the transaction intent — recipient, amount, optional data — and it builds the right structure: a typed EIP-1559 transaction on Ethereum, a versioned transaction on Solana, a PSBT on Bitcoin. Submission goes through the same RPC API the platform manages.
  • Balance reads. Native balances and token balances for ERC-20, SPL, TRC-20, and BRC-20 standards through a single balances.list(walletId) call. No more rotating provider keys per chain.
  • Gas and fee estimation. The hard part. A normalized fee object exposes the chain-specific numbers — gwei, lamports per compute unit, sat/vB — alongside a USD estimate so your UI can render something the user understands without reimplementing five oracles.
  • On-chain history. Indexed transfers, contract interactions, and token movements per address, returned in a consistent shape. This is the EVM API and the Solana indexer and the Bitcoin block explorer compressed into one query interface.

The promise is not that chain differences disappear. They do not. The promise is that the differences live inside the API instead of inside your monorepo.

The hard parts no one talks about

Every chain has a quirk that bites you the first time you ship to production. A good multi-chain wallet API absorbs these so your team does not relearn them per integration.

Bitcoin's UTXO model. Bitcoin does not have an account balance. It has a set of unspent outputs that your wallet selects, combines, and spends. To send 0.01 BTC you might need to consume four UTXOs of varying sizes, return change to a fresh address for privacy, and price the transaction by virtual byte. None of this exists on EVM. A wallet API that pretends Bitcoin is just another account model will produce stuck transactions or burn fees.

Solana's compute units and priority fees. Solana transactions pay a base fee that is almost free, plus an optional priority fee denominated in micro-lamports per compute unit. During congestion, transactions without a priority fee are dropped silently. Estimating the right priority fee requires reading recent leader slots and the chain's prioritization fee history. Most teams discover this only after their first wave of failed swaps.

EIP-1559 versus legacy gas. Ethereum mainnet, Base, and Arbitrum each handle the 1559 fee market slightly differently. Arbitrum has an L1 data cost on top of L2 execution. Polygon PoS used to need legacy-style gasPrice on some paths and 1559 on others. BNB Chain has its own quirks. An EVM API that treats all chains as identical EIP-1559 will overpay or underpay depending on where you are submitting.

Tron's bandwidth and energy. Tron charges resources, not gas. Each account has a daily allowance of free bandwidth, and TRC-20 transfers consume "energy" that you either burn TRX for or rent from a staking market. A transaction that "should" be cheap can fail because your account ran out of bandwidth at 11:59pm UTC. Modeling this correctly requires understanding the resource market, not just the chain.

Reorgs, finality, and confirmations. A "confirmed" transaction on Polygon is not the same as a confirmed transaction on Bitcoin. Solana has its own commitment levels — processed, confirmed, finalized — that map poorly onto block-count confirmation logic. A cross-chain wallet API has to expose a finality model your application can reason about without reading five whitepapers.

These are the issues that turn a hackathon prototype into a six-month engineering project. They are the reason buying the infrastructure makes sense the moment your roadmap touches two non-EVM chains.

Code walkthrough: signing on EVM and Solana with one client

The point of a unified blockchain API is that the call site looks the same across chains, even though the protocol layer below is doing very different things. Here is what a signing flow looks like against a normalized client. The fields that differ between chains live inside the request body, not in the SDK surface.

import { Blocsafe } from "@blocsafe/sdk";

const blocsafe = new Blocsafe({ apiKey: process.env.BLOCSAFE_KEY! });

const wallet = await blocsafe.wallets.create({
  reference: "user_8421",
  chains: ["ethereum", "base", "solana", "bitcoin"],
});

const ethTx = await blocsafe.wallets.sign(wallet.id, {
  chain: "ethereum",
  to: "0xA0Cf...c44e",
  value: "1000000000000000", // 0.001 ETH in wei
  data: "0x",
  fee: { mode: "auto" },
});

const solTx = await blocsafe.wallets.sign(wallet.id, {
  chain: "solana",
  instructions: [
    {
      programId: "11111111111111111111111111111111",
      accounts: [
        { pubkey: wallet.addresses.solana, isSigner: true, isWritable: true },
        { pubkey: "9xQe...4tNk", isSigner: false, isWritable: true },
      ],
      data: "AgAAAEBCDwAAAAAA",
    },
  ],
  fee: { mode: "priority", percentile: 75 },
});

await blocsafe.wallets.submit({ chain: "ethereum", signed: ethTx.raw });
await blocsafe.wallets.submit({ chain: "solana", signed: solTx.raw });

The shape is identical. The fee object is normalized — auto means the platform picks a reasonable default per chain, priority lets you target a percentile of recent fees. The submit call is idempotent and returns a tracking ID you can subscribe to via webhook. Adding Bitcoin support to this code is a matter of passing chain: "bitcoin" with a UTXO-shaped body. You do not import a new SDK.

Build-vs-buy: what you take on if you DIY multi-chain

Building this yourself is not impossible. It is a question of what you want your engineering team to spend the next year on.

The DIY surface includes:

  • Node infrastructure. You need archive-grade RPC nodes for every chain you support, in at least two regions, with failover and rate-limit handling. A serious Ethereum archive node alone is multiple terabytes and ongoing ops. Multiply by Solana, Bitcoin, Tron, and a few L2s.
  • Mempool monitoring. Tracking pending transactions for replacement-by-fee, stuck-transaction recovery, and submission retries is non-trivial. Solana does not even have a public mempool the way EVM chains do; you handle dropped transactions through different signals.
  • Fee oracles. Five chains, five fee markets, five sets of historical data to query and smooth into a recommendation your product can trust.
  • Reorg handling. Your indexer has to detect and unwind reorgs without corrupting downstream state. Bitcoin's reorg behavior is different from an L2 sequencer reorg, which is different from a Solana skipped slot.
  • Chain-version churn. Every chain ships breaking changes. Hard forks, new transaction types, new precompiles, new address formats. Keeping up is a continuous engineering line item, not a one-time cost.
  • Key custody and compliance. If you hold keys, you take on HSM provisioning, MPC tooling, audit posture, and whatever regulatory regime applies in your jurisdictions.

A multi-chain wallet API absorbs all of this so your team can spend its time on product surface — the parts your users actually see.

A buyer's checklist for a multi-chain wallet API

When you evaluate vendors, push past the homepage and ask for specifics:

  • Chain coverage. How many EVM chains, and how quickly do new ones get added? What non-EVM chains are first-class — meaning supported with the same primitives as EVM, not a stub?
  • Signing model. MPC, HSM-backed, TSS, or hosted keys? Where do shares live, and what happens during a regional outage? Non-custodial in the marketing copy needs to match non-custodial in the architecture.
  • Idempotent transaction submission. Network blips happen. A blockchain API that lets you safely retry a submit with the same client reference saves you from double-spends and ghost transactions.
  • Webhooks vs polling. Webhook delivery with retries, signed payloads, and ordering guarantees is the difference between a system that scales and a cron job that doesn't.
  • Indexing and history. Is on-chain history a separate product with its own price tag, or part of the same RPC API surface? How far back does it go?
  • Regional infrastructure. Where are the RPC nodes? Where can your wallet service be deployed? Latency from a US-East node to a Solana validator in Frankfurt matters when you are submitting time-sensitive transactions.
  • Pricing model. Per-wallet, per-call, per-chain, or some combination. Make sure the model rewards the way you actually use it.

Blocsafe's approach

Blocsafe is built around a single typed client that spans 30+ blockchains — EVM, Solana, Bitcoin, Tron, Cosmos, and the long tail of EVM L2s. Wallets are non-custodial by design, with MPC signing so no single party holds a complete key. The fee model is normalized across chains so your application code stays clean while the platform handles EIP-1559, priority fees, UTXO selection, and Tron's resource market underneath. Webhooks deliver on-chain events with signed payloads and retries, and the indexing layer returns transfer history in a consistent shape regardless of which chain produced it.

If you are evaluating whether to keep stitching SDKs or move to a single multi-chain wallet API, you can start without a sales call. Create an account and ship your first cross-chain wallet flow against the free tier.

BE

Blocsafe Engineering

Blocsafe is non-custodial Wallet-as-a-Service infrastructure for multi-chain apps. We write about the wallet, node, and on-chain primitives that production teams need.

Ready to ship a non-custodial wallet?

Get access to Blocsafe →