> ## Documentation Index
> Fetch the complete documentation index at: https://docs.flashnet.xyz/llms.txt
> Use this file to discover all available pages before exploring further.

# Get USDB

> Bridge USDC or swap BTC to acquire USDB on Spark

export const FeeStructure = () => {
  return <div className="not-prose my-6">
      <div className="p-5 rounded-xl border border-green-200 dark:border-green-800 bg-green-50 dark:bg-green-900/20">
        <div className="text-xs text-green-600 dark:text-green-400 uppercase tracking-wide mb-1">Network Fee</div>
        <div className="text-3xl font-bold text-green-600 dark:text-green-400">$0</div>
        <div className="text-sm text-green-600 dark:text-green-400 mt-1">Free on Spark</div>
      </div>
    </div>;
};

export const SupportedChainsTable = () => {
  const chains = [{
    chain: "Solana",
    token: "USDC",
    time: "Few seconds"
  }, {
    chain: "Ethereum",
    token: "USDC",
    time: "~1 minute"
  }, {
    chain: "Base",
    token: "USDC",
    time: "Few seconds"
  }, {
    chain: "Arbitrum",
    token: "USDC",
    time: "Few seconds"
  }, {
    chain: "Optimism",
    token: "USDC",
    time: "Few seconds"
  }, {
    chain: "Polygon",
    token: "USDC",
    time: "Few seconds"
  }];
  return <div className="not-prose my-6 overflow-hidden rounded-xl border border-zinc-200 dark:border-zinc-700">
      <div className="grid grid-cols-3 bg-zinc-100 dark:bg-zinc-800 text-sm font-semibold">
        <div className="p-3 text-zinc-600 dark:text-zinc-400">Chain</div>
        <div className="p-3 text-zinc-600 dark:text-zinc-400">Token</div>
        <div className="p-3 text-zinc-600 dark:text-zinc-400">Bridge Time</div>
      </div>
      {chains.map((row, idx) => <div key={idx} className={`grid grid-cols-3 text-sm ${idx % 2 === 0 ? 'bg-white dark:bg-zinc-900' : 'bg-zinc-50 dark:bg-zinc-800/50'}`}>
          <div className="p-3 font-medium text-zinc-900 dark:text-white">{row.chain}</div>
          <div className="p-3 text-zinc-600 dark:text-zinc-400">{row.token}</div>
          <div className="p-3 text-zinc-600 dark:text-zinc-400">{row.time}</div>
        </div>)}
    </div>;
};

export const BridgeEmbed = () => {
  const [targetHeight, setTargetHeight] = React.useState(null);
  const [iframeReady, setIframeReady] = React.useState(false);
  const [minTimeElapsed, setMinTimeElapsed] = React.useState(false);
  const [completing, setCompleting] = React.useState(false);
  const [revealed, setRevealed] = React.useState(false);
  const [loaderHidden, setLoaderHidden] = React.useState(false);
  const [isDesktop, setIsDesktop] = React.useState(true);
  React.useEffect(() => {
    const checkIsDesktop = () => setIsDesktop(window.innerWidth >= 768);
    checkIsDesktop();
    window.addEventListener('resize', checkIsDesktop);
    return () => window.removeEventListener('resize', checkIsDesktop);
  }, []);
  const circumference = 2 * Math.PI * 10;
  const arcLength = circumference * 0.25;
  const growAmount = circumference - arcLength;
  React.useEffect(() => {
    const timer = setTimeout(() => setMinTimeElapsed(true), 1500);
    return () => clearTimeout(timer);
  }, []);
  React.useEffect(() => {
    if (iframeReady && minTimeElapsed && !completing) {
      setCompleting(true);
      setRevealed(true);
      setTimeout(() => setLoaderHidden(true), 600);
    }
  }, [iframeReady, minTimeElapsed, completing]);
  React.useEffect(() => {
    const handleMessage = event => {
      if ((event.data.type === 'ready' || event.data.type === 'resize') && event.data.height) {
        console.log('[BridgeEmbed] Received:', event.data.type, 'height:', event.data.height);
        setTargetHeight(event.data.height);
        setIframeReady(true);
      }
    };
    window.addEventListener('message', handleMessage);
    return () => window.removeEventListener('message', handleMessage);
  }, []);
  const finalHeight = (targetHeight || 650) + 75;
  const displayHeight = revealed ? finalHeight : 75;
  if (!isDesktop) return null;
  return <div className="not-prose">
      <style>
        {`
          @keyframes spin {
            from { transform: rotate(0deg); }
            to { transform: rotate(360deg); }
          }
          @keyframes fillCircle {
            from {
              stroke-dasharray: ${arcLength} ${circumference - arcLength};
              stroke-dashoffset: 0;
            }
            to {
              stroke-dasharray: ${circumference} 0;
              stroke-dashoffset: ${growAmount / 2};
            }
          }
        `}
      </style>
      {}
      <div style={{
    position: 'relative'
  }}>
        {}
        {!loaderHidden && <div style={{
    position: 'absolute',
    top: displayHeight / 2,
    left: 0,
    right: 0,
    display: 'flex',
    justifyContent: 'center',
    transform: 'translateY(-50%)',
    transition: 'top 0.5s ease-out',
    zIndex: 20,
    pointerEvents: 'none'
  }}>
            <svg style={{
    width: 32,
    height: 32,
    color: '#1F8E5F'
  }} fill="none" viewBox="0 0 24 24">
              <circle style={{
    opacity: 0.25
  }} cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" />
              <g style={{
    transformOrigin: 'center',
    animation: 'spin 1s linear infinite',
    animationPlayState: completing ? 'paused' : 'running'
  }}>
                <circle cx="12" cy="12" r="10" stroke="currentColor" strokeWidth="4" strokeLinecap="round" style={{
    strokeDasharray: `${arcLength} ${circumference - arcLength}`,
    strokeDashoffset: 0,
    animation: completing ? 'fillCircle 0.2s ease-out forwards' : 'none'
  }} />
              </g>
            </svg>
          </div>}
        {}
        <div style={{
    position: 'relative',
    height: displayHeight,
    transition: 'height 0.5s ease-out',
    overflow: 'hidden',
    borderRadius: '12px'
  }}>
          <iframe src="https://bridge.flashnet.xyz/?hideHeader=true&amp;flat=true&amp;bgColor=ffff" width="100%" height={finalHeight} scrolling="no" style={{
    position: 'absolute',
    top: 0,
    left: 0,
    border: 'none',
    overflow: 'hidden',
    opacity: loaderHidden ? 1 : 0,
    transition: 'opacity 0.3s ease-out'
  }} allow="clipboard-write" />
        </div>
      </div>
    </div>;
};

There are two ways to get USDB on Spark:

<CardGroup cols={2}>
  <Card title="Bridge from USDC" href="#bridge-from-usdc">
    Convert USDC from Solana, Ethereum, Base, Arbitrum, Optimism, or Polygon to USDB on Spark
  </Card>

  <Card title="Swap BTC for USDB" href="#swap-btc-for-usdb">
    Swap your BTC for USDB instantly on any supported venue
  </Card>
</CardGroup>

More integrations are planned, including native on- and off-ramps. [Contact us](mailto:partnerships@flashnet.xyz) if you want to integrate USDB.

***

## Bridge from USDC

Bridge USDC from another supported chain to get USDB.

<BridgeEmbed />

<Steps>
  <Step title="Go to the USDB Bridge">
    Navigate to [usdb.flashnet.xyz/bridge](https://usdb.flashnet.xyz/bridge).
  </Step>

  <Step title="Select source chain">
    Choose your preferred network as your source chain.
  </Step>

  <Step title="Connect your wallet">
    Connect the wallet holding your USDC (Phantom, Coinbase Wallet, etc.).
  </Step>

  <Step title="Enter amount">
    Enter the amount of USDC you want to bridge.
  </Step>

  <Step title="Enter your Spark address">
    Paste your Spark wallet address (starts with `spark1...`).
  </Step>

  <Step title="Confirm and bridge">
    Approve the transaction in your wallet. USDB arrives in \~1-2 minutes.
  </Step>
</Steps>

### Supported Source Chains

<SupportedChainsTable />

<Note>
  Bridge fees vary by route and network conditions. The bridge UI shows exact fees before confirmation.
</Note>

***

## Swap BTC for USDB

Swap BTC for USDB on any of these venues. Swaps settle instantly.

<CardGroup cols={2}>
  <Card href="https://luminex.io/spark">
    <div style={{display: "flex", alignItems: "center", justifyContent: "center", minHeight: "80px"}}>
      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-luminex-black.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=de4b18b8b9d78b2a15e13be6a96e8adb" alt="Luminex" className="block dark:hidden" noZoom style={{height: "24px"}} width="128" height="32" data-path="assets/logo-luminex-black.svg" />

      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-luminex-white.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=1c04da9f8f9fe7d6b50f9fbfb77bc817" alt="Luminex" className="hidden dark:block" noZoom style={{height: "24px"}} width="128" height="32" data-path="assets/logo-luminex-white.svg" />
    </div>
  </Card>

  <Card href="https://utxo.fun">
    <div style={{display: "flex", alignItems: "center", justifyContent: "center", minHeight: "80px"}}>
      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-utxo-black.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=b8d715e4b4d3afeeec3bc10d8c0318b5" alt="Utxo.Fun" className="block dark:hidden" noZoom style={{height: "18px"}} width="68" height="13" data-path="assets/logo-utxo-black.svg" />

      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-utxo-white.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=f539df84a65ef007d6c29bcaa84df428" alt="Utxo.Fun" className="hidden dark:block" noZoom style={{height: "18px"}} width="68" height="13" data-path="assets/logo-utxo-white.svg" />
    </div>
  </Card>

  <Card href="https://spark.satsterminal.com/">
    <div style={{display: "flex", alignItems: "center", justifyContent: "center", minHeight: "80px"}}>
      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-satsterminal-black.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=f18a8e342d5803ade006f461a243f68e" alt="SatsTerminal" className="block dark:hidden" noZoom style={{height: "24px"}} width="375" height="47" data-path="assets/logo-satsterminal-black.svg" />

      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-satsterminal-white.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=1ff03fb841cda2d8eb6ce15bf7f003fc" alt="SatsTerminal" className="hidden dark:block" noZoom style={{height: "24px"}} width="375" height="47" data-path="assets/logo-satsterminal-white.svg" />
    </div>
  </Card>

  <Card href="https://xverse.io">
    <div style={{display: "flex", alignItems: "center", justifyContent: "center", minHeight: "80px"}}>
      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-xverse-black.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=9108de2c38dedd21a18f645fe250dce3" alt="Xverse" className="block dark:hidden" noZoom style={{height: "24px"}} width="128" height="32" data-path="assets/logo-xverse-black.svg" />

      <img src="https://mintcdn.com/flashnet-9a0adcc4/SITNW9lBX0J8pU9z/assets/logo-xverse-white.svg?fit=max&auto=format&n=SITNW9lBX0J8pU9z&q=85&s=e238cde70ae3c31cf01436d7cfc825bd" alt="Xverse" className="hidden dark:block" noZoom style={{height: "24px"}} width="128" height="32" data-path="assets/logo-xverse-white.svg" />
    </div>
  </Card>
</CardGroup>

<Steps>
  <Step title="Choose a venue">
    Pick any of the trading venues above.
  </Step>

  <Step title="Connect your wallet">
    Connect or create a Spark wallet.
  </Step>

  <Step title="Sell BTC for USDB">
    Select the swap direction and enter your amount.
  </Step>

  <Step title="Review and execute">
    Check the price, fees, and slippage, then confirm.
  </Step>
</Steps>

<CardGroup cols={2}>
  <Card title="Instant Settlement">
    Sub-second finality
  </Card>

  <Card title="$1 Minimum">
    Low barrier to entry
  </Card>

  <Card title="AMM Pricing">
    Deep liquidity pools
  </Card>

  <Card title="Slippage Protection">
    Configurable limits
  </Card>
</CardGroup>

### Fees

<FeeStructure />

<Note>
  Trading volume counts toward your [reward tier](/usdb/rewards). Higher volume = higher rewards.
</Note>

***

## What You Need

Before getting USDB, make sure you have:

<AccordionGroup>
  <Accordion title="A Spark wallet">
    You need a Spark wallet to receive USDB. Use any Spark-compatible wallet like [Xverse](https://xverse.io), [Guap](https://useguap.com/), [Blitz Wallet](https://blitz-wallet.com/), [LayerZ](https://layerzwallet.com/), or [BitBit](https://bitbit.bot/).

    Developers can also receive USDB directly via the Spark CLI or the [native Spark SDK](https://docs.spark.money/wallets/overview), without using a consumer wallet.
  </Accordion>

  <Accordion title="USDC or BTC">
    Either USDC on a supported chain (for bridging) or BTC on Spark (for swapping).
  </Accordion>

  <Accordion title="Trading volume sets your tier">
    Your 24-hour trading volume determines your [reward tier](/usdb/rewards). A daily \$500 volume moves you to the 4% tier from the 3.5% base.
  </Accordion>
</AccordionGroup>

***

## After You Get USDB

Once you have USDB in your Spark wallet, you can:

* **Earn rewards**: Hold USDB to earn BTC rewards (3.5 - 6%)
* **Earn Flashpoints**: Accumulate points that boost your rewards
* **Trade**: Swap back to BTC anytime
* **Transfer**: Send USDB to any Spark address, free and instant
* **Redeem**: [Exit to BTC, USD, or USDC](/usdb/redeem) whenever you want
