-1 and Solana is chain -2. The quote, execute and status calls are the same as
on any chain. This page covers what your wallet code does differently.
Bitcoin
Buying BTC. SetdestinationAddress to the user’s Bitcoin address. The execution is whatever
the source chain needs, usually a TRANSACTION or a DEPOSIT.
Selling BTC always returns a DEPOSIT: the user sends BTC to deposit.address.
- Set
userAddressto the Bitcoin address the BTC is sent from. If it isn’t a Bitcoin address, also setrefundAddressto one. Set both on the quote: some venues won’t take them later. - From a native SegWit (
bc1q…)userAddress, the answer includesdeposit.psbt: the deposit, your fee as a second output and change back to the sender, built from their confirmed coins. Sign and broadcast it as is. - Without
deposit.psbt(another address type, too little balance), pay exactlydeposit.amounttodeposit.address. When the execution has afee, add a second output offee.amountsats tofee.addressin the same transaction. One deposit per transaction. - Or show the address and a QR code and let the user send from any wallet.
/status every 10 to 15
seconds.
Not every token is reachable from native BTC. Use
/tokens/btc-coverage to list the ones that are.
Solana
Native SOL is the mintSo11111111111111111111111111111111111111112.
A TRANSACTION carries transaction.serialized, a base64 versioned transaction. Sign it and
send it with confirmed commitment: it’s built on a confirmed blockhash, so a finalized
preflight reports BlockhashNotFound for its first ~13 seconds. Any fee is already inside it.
Send it from the user’s own wallet: a smart account (Squads-style) that runs it inside its own
program pays the fee where RAVN can’t see it.
A DEPOSIT is a transfer of deposit.amount to deposit.address. When it carries your fee,
deposit.transaction is the deposit and the fee as one unsigned transaction: sign and send it
within a minute, before its blockhash expires. Missed the minute? Call /execute again with a new
Idempotency-Key (the same key returns the same expired transaction) and send only to the new
deposit. Building it yourself? Put the fee in the same transaction: a System transfer for SOL,
or createAssociatedTokenAccountIdempotent then transferChecked (under the mint’s own token
program, such as Token-2022) for a token. One deposit per transaction.
/status takes txHash only for EVM transactions. Don’t send a Solana signature there.
broadcastViaRavn
Set broadcastViaRavn: true on the quote if your app can post a signed Solana transaction back to
RAVN instead of broadcasting it. It adds routes that often price better:
- Layerswap memo payments: a Solana wallet’s USDC into native BTC, or USDG into Robinhood Chain stocks, with no account rent. Often the best price under about $200.
- Jupiter orders a market maker or gas sponsor also signs. Long-tail tokens can price 7 to 33 bp better, and a wallet short of SOL can still swap. This doesn’t apply when RAVN adds your fee to the order: fees under 50 bps, and some pairs above. Then the market maker or gas sponsor can’t sign it.
TRANSACTION that then carries submit must not be broadcast. Sign it and post it to
/submit-transaction, within seconds for a Jupiter order. One
without submit you broadcast as usual.
