Skip to main content
Not sure if accumulation addresses are right for you? See Choose Your Integration for a comparison of all three integration patterns.
Accumulation addresses are persistent deposit addresses on Solana and any supported chain (base, ethereum, arbitrum, optimism, polygon, tron, plasma). Each incoming deposit automatically creates an order that converts into USDC (if needed), bridges to Spark, and then:
  • delivers USDB to a fixed Spark address, or
  • swaps into BTC and delivers BTC to a fixed Spark address.
This is the right integration when you want to hand out a reusable deposit address per user and you do not want to call /quote and /submit per deposit.
  • USDC (solana|base|ethereum|arbitrum|optimism|polygon|tron) -> USDB (spark)
  • USDC (solana|base|ethereum|arbitrum|optimism|polygon|tron) -> BTC (spark)
  • USDT (ethereum|arbitrum|optimism|tron|plasma) -> USDB (spark)
  • USDT (ethereum|arbitrum|optimism|tron|plasma) -> BTC (spark)
  • ETH (ethereum) -> USDB (spark)
  • ETH (ethereum) -> BTC (spark)
  • SOL (solana) -> USDB (spark)
  • SOL (solana) -> BTC (spark)
For chain sources other than Solana, deposits are detected automatically. Solana-sourced addresses use direct webhook detection.

Create an Accumulation Address

const BASE_URL = 'https://orchestration.flashnet.xyz';

const res = await fetch(`${BASE_URL}/v1/accumulation-addresses`, {
  method: 'POST',
  headers: {
    'Content-Type': 'application/json',
    Authorization: `Bearer ${process.env.FLASHNET_API_KEY}`,
    'X-Idempotency-Key': `acu:create:${Date.now()}`,
  },
  body: JSON.stringify({
    label: 'User 123',
    sourceChain: 'solana',
    sourceAsset: 'USDC',
    destinationAsset: 'BTC',
    recipientSparkAddress: 'spark1UserRecipient...',
    feeBps: 5,
    slippageBps: 50,
  }),
}).then((r) => r.json());

console.log(res.depositAddress);
Response fields:
  • depositAddress: the address to receive deposits (Solana address for Solana source, deposit address for chains sources other than Solana)
  • subscriptions: status of server-side deposit detection subscriptions (Solana-sourced only)
Response example:
{
  "accumulationAddressId": "acu_...",
  "sourceChain": "solana",
  "sourceAsset": "USDC",
  "destinationAsset": "BTC",
  "recipientSparkAddress": "spark1...",
  "feeBps": 5,
  "slippageBps": 50,
  "enabled": true,
  "depositAddress": "So1...",
  "createdAt": "2026-02-04T01:00:00.000Z",
  "subscriptions": []
}

Deposit Lifecycle

  1. Your user sends a supported deposit asset to one of the returned deposit addresses.
  2. Flashnet detects the deposit and creates an order.
  3. The engine processes the order asynchronously.
  4. You observe progress via partner webhooks.

Webhooks

Accumulation deposits create normal order.* webhook events. To receive them:
  1. Register an endpoint with POST /v1/webhooks.
  2. Verify X-Flashnet-Signature on inbound requests.
  3. Treat webhook delivery as at least once.
See Webhooks.

Manage Addresses

List accumulation addresses:
  • GET /v1/accumulation-addresses
Get an address by id:
  • GET /v1/accumulation-addresses/:id
Disable an address:
  • DELETE /v1/accumulation-addresses/:id (requires X-Idempotency-Key)

Sync

POST /v1/accumulation-addresses/sync re-registers all enabled deposit addresses with the configured deposit detection webhooks. The sync endpoint only re-registers Solana-sourced addresses. Chain-sourced addresses do not use webhook subscriptions. This is intended for operational recovery and self-hosted deployments.

Next Steps