SODA: Solana-Owned Derived Authority

Solana-Owned Derived Authority. A Solana program just spent a Bitcoin UTXO. No wrapped tokens. No bridge. No custodian.

SODA is an Anchor program plus an off-chain MPC committee that exposes cross-chain signing as a CPI primitive. Any Solana program calls one instruction and receives a valid secp256k1 signature on Bitcoin, Ethereum, or any other ECDSA chain. The foreign-chain address is deterministically derived from the caller’s (program_id, seeds), so a Solana PDA literally owns the UTXO.

soda::request_signature(
    derivation_path,   // arbitrary per-request path
    payload_hash,      // 32-byte message to sign
    target_chain,      // BTC, ETH, any ECDSA chain
)

v0 is live on Solana devnet and Sepolia. Run ./demo.sh from the repo to produce a real Sepolia transaction signed by a Solana program.

⚠️

Do not put real funds on a SODA-derived address. Even in v0.5, the signing committee is two nodes both controlled by the same operator and shares ship as plaintext JSON. Use Sepolia / devnet only with throwaway amounts. The full v1 trust model (t-of-n MPC + restaking-bonded operators) is deferred — see Concepts → Signing committee.

💡

Live on AWS (2026-05-11): real Lindell ‘17 2-of-2 MPC ECDSA running across three EC2 instances in us-east-1. Two mpc-node peers hold the additive shares; an mpc-coordinator at http://32.198.7.34:8000 drives the 4-message protocol. Neither node sees the joint secret. The on-chain Committee.group_pk is migrated to the AWS joint key, so the same ./demo.sh now signs through MPC end-to-end. See Architecture and the MPC protocol walkthrough.

🚀 Try the live demo

Connect Phantom on devnet and trigger a real Sepolia transaction signed by the AWS MPC committee — in your browser. No clone, no setup, no keys.

Install the SDK

The TypeScript SDK is published on npm as @soda-sdk/core. Pull it into any Node / Next / Vite project:

pnpm add @soda-sdk/core
# or
npm install @soda-sdk/core

A four-line example to derive your Solana PDA’s Sepolia address:

import { deriveEthAddress, ETH_SEPOLIA_CHAIN_TAG } from '@soda-sdk/core'
import { PublicKey } from '@solana/web3.js'
 
const { ethAddress } = deriveEthAddress(
  groupPkCompressed,                 // committee aggregate pubkey, 33 bytes
  new PublicKey(callerProgramId).toBytes(),
  seeds,
  ETH_SEPOLIA_CHAIN_TAG,
)

Read the full Sign an Ethereum tx guide for the end-to-end flow (build unsigned RLP, request the on-chain signature, broadcast).

What this unlocks

A Solana PDA is, cryptographically, the owner of the foreign UTXO or account. No wrapper, no bridge message, no custodian in the path. That single primitive lets you build:

  • Native BTC / ETH vaults controlled by Solana program logic.
  • Smart-contract wallets for autonomous agents that must sign external-chain transactions without a human in the loop.
  • Cross-chain DeFi where a Solana strategy directly spends Bitcoin or Ethereum balances under PDA authority.
  • Restaking-secured custody where committee misbehavior is slashable.

How it differs

TodayWith SODA
Wrapped tokens (wBTC, cbBTC) — custodial IOUsA Solana PDA holds its own private key on the foreign chain
Bridges — pass messages, get hackedNo bridge. Bitcoin never learns Solana exists.
Humans signing on every chainOne CPI call from program logic, no human in the loop

Where to next