- Wallet buy flow: users pay USDC and receive BTC to a Spark address, Bitcoin address, or Lightning invoice.
- Payout rails: convert USDC into BTC without running Bitcoin infrastructure.
Supported routes
Supported routes
USDC (solana|base|ethereum|arbitrum|optimism|polygon|tron) -> BTC (spark|bitcoin|lightning)USDC (solana|base|ethereum|arbitrum|optimism|polygon|tron) -> USDB (spark)USDT (ethereum|arbitrum|optimism|tron|plasma) -> BTC (spark|bitcoin|lightning)USDT (ethereum|arbitrum|optimism|tron|plasma) -> USDB (spark)ETH (ethereum) -> BTC (spark|bitcoin|lightning)ETH (ethereum) -> USDB (spark)SOL (solana) -> BTC (spark|bitcoin|lightning)SOL (solana) -> USDB (spark)
Token identifiers
Token identifiers
| Chain | Token | Address |
|---|---|---|
| Base | USDC | 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 |
| Solana | USDC | EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v |
| Ethereum | USDC | 0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48 |
| Ethereum | USDT | 0xdAC17F958D2ee523a2206206994597C13D831ec7 |
| Arbitrum | USDC | 0xaf88d065e77c8cC2239327C5EDb3A432268e5831 |
| Arbitrum | USDT | 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9 |
| Optimism | USDC | 0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85 |
| Optimism | USDT | 0x94b008aA00579c1307B0EF2c499aD98a8ce58e58 |
| Polygon | USDC | 0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359 |
| Tron | USDT | TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t |
| Plasma | USDT |
Flow
- Create a quote:
POST /v1/orchestration/quote. - Send the source asset to
depositAddressforamountIn. - Submit the deposit transaction:
POST /v1/orchestration/submit. - Track status via webhooks or
GET /v1/orchestration/status?id=....
Affiliate Fees
App fees are supported on these routes whenamountMode=exact_in. Fees are computed in USDC and settled on Solana. Flashnet retains a 20% platform cut of all app fees; the remaining 80% goes to the fee recipient. Affiliate fees use a holdback model where the recipient’s 80% share accumulates and is claimed by the affiliate. For SOL/ETH routes, the engine converts to USDC first, then applies fees. See Quotes and Orders for the full affiliate fee model.
Example: USDC (Base) to BTC (Spark)
Example: SOL (Solana) to BTC (Spark)
amount is lamports (1 SOL = 1_000_000_000 lamports).
Example: SOL (Solana) to BTC (Spark) with Affiliate Fee
Example: SOL (Solana) to BTC (Spark) with Affiliate Registry
Example: USDC to BTC (Bitcoin L1)
SetdestinationChain = bitcoin and provide a Bitcoin address in recipientAddress.
Example: USDC to BTC (Lightning)
Lightning-destination routes use a tiered platform fee: 0.20% (20 bps) when the counterpart asset is USDB, 0.40% (40 bps) for all other routes. For Lightning payouts,recipientAddress must be a BOLT11 invoice. Use an amountless (0-amount) invoice for exact-in mode, or an invoice with an amount matching the target sats for exact-out mode. Amountless invoices are accepted in both modes.
Example: USDC to BTC (Lightning, Exact Out)
Use exact-out when the recipient must receive a precise number of sats on Lightning. The system determines the required USDC input and includes a routing fee buffer.amount is the target BTC delivery in sats. The recipientAddress can be an amountless invoice or an invoice encoding the same amount (100,000 sats in this case).
The quote response includes the same exact-out fields as BTC-to-USDC exact-out:
targetAmountOut: the requested sats (matchesamount)requiredAmountIn: USDC to depositmaxAcceptedAmountIn: upper bound on accepted depositinputBufferBps: buffer applied to the required input
appFees / affiliateId / affiliateIds) are not supported with amountMode=exact_out.
Example: USDT (Ethereum) to BTC (Spark)
For chain sources other than Solana, the quote returns a deposit address on the source chain. The deposit is detected automatically.amount is in USDT smallest units (6 decimals). The depositAddress in the response is an Ethereum address. Send USDT there and the order is created automatically.
Deposit Verification
The engine verifies that the deposit transaction sent the correct asset to the quoteddepositAddress. When sourceAddress is provided on submit, the verifier also confirms the sender matches.
Deposits do not need to match the quoted amountIn exactly. See Deposit Amount Flexibility for details on how over/underpayments are handled.