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, tempo, 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|tempo|tron) -> USDB (spark)
  • USDC (solana|base|ethereum|arbitrum|optimism|polygon|tempo|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)
Tempo PathUSD is not currently supported as an accumulation source asset.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 Requirements

For non-Solana chains, deposits must be plain token transfers to the deposit address. The deposit transaction should contain no calldata beyond a standard ERC-20 transfer(). Deposits sent through smart contract interactions (multisig executions, payment routers, or other contract-mediated transfers) will not be detected automatically. The funds will arrive at the deposit address on-chain but order creation will not trigger.
If a contract-mediated deposit is sent by mistake, sending a small direct transfer to the same deposit address will cause the system to sweep the full balance, including the stuck funds. This is a recovery workaround, not a supported flow.
Solana-sourced deposits do not have this limitation.

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