Cash App and USDC/USDT
The SDK can bridge between Cash App and USDC/USDT on external chains (Ethereum-family, Solana, or Tron), in either direction:
- Cash App to USDC/USDT: a Cash App user pays over Lightning, and the recipient gets the stablecoin on an external chain.
- USDC/USDT to Cash App: a payer deposits the stablecoin on an external chain, and a Cash App user gets Bitcoin.
In both, the SDK only sets the bridge up. No wallet funds move, and nothing is written to the payment history: the payer funds the order outside the wallet and the cross-chain provider delivers it autonomously. There is no PaymentPaymentPaymentPaymentPaymentPaymentPaymentPaymentPayment row and no event, but you can track the bridge by its bridge_idbridge_idbridgeIdbridgeIdbridgeIdbridgeIdbridgeIdBridgeIdBridgeId. Show the quote returned to the user so they know what to expect before they pay.
Both are bridges with a Cash App user on one side. To pay a Spark address, or a USDC/USDT address from another chain, see Bridging USDC/USDT.
Developer note
Cash App is available in the US and UK only (excluding New York State for Bitcoin/Lightning features). Cash App handles region restrictions on their end, so no client-side gating is needed.Selecting a route
Both bridges run on a bridging client. List the recipient's routes with get_routesget_routesgetRoutesgetRoutesgetRoutesgetRoutesgetRoutesGetRoutesGetRoutes:
- For a stablecoin address, Cash App can fund the routes whose
sourcesourcesourcesourcesourcesourcesourceSourceSourceis onlightning. TheirdestinationdestinationdestinationdestinationdestinationdestinationdestinationDestinationDestinationis the stablecoin the recipient receives. - For a Cash App user, the routes'
sourcesourcesourcesourcesourcesourcesourceSourceSourceis the stablecoin the payer pays in.
Pick the BridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePairBridgeRoutePair whose side matches the stablecoin you want. A route Cash App can't use fails fast, before any funds move.
Amounts and fees
The amountamountamountamountamountamountamountAmountAmount is in the stablecoin's base units, per its side's BridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.decimalsBridgeRoutePairSide.DecimalsBridgeRoutePairSide.Decimals. These routes carry USD-pegged stablecoins, so at parity it is the USD value: 1_000_000 is 1 USDC (6 decimals), about $1.
fee_policyfee_policyfeePolicyfeePolicyfeePolicyfeePolicyfeePolicyFeePolicyFeePolicy controls who absorbs the provider fee, reusing the same FeePolicyFeePolicyFeePolicyFeePolicyFeePolicyFeePolicyFeePolicyFeePolicyFeePolicy as the send flow:
FeePolicy::FeesExcludedFeePolicy.FEES_EXCLUDEDFeePolicy.feesExcludedFeePolicy.FeesExcludedFeePolicy.FeesExcludedFeePolicy.FeesExcludedFeePolicy.FeesExcludedFeePolicyFeesExcludedFeePolicy.FeesExcluded(default) delivers about the amount to the recipient and adds the fee on top of what the payer pays.FeePolicy::FeesIncludedFeePolicy.FEES_INCLUDEDFeePolicy.feesIncludedFeePolicy.FeesIncludedFeePolicy.FeesIncludedFeePolicy.FeesIncludedFeePolicy.FeesIncludedFeePolicyFeesIncludedFeePolicy.FeesIncludedtakes the fee out of the amount, so the payer pays exactly the amount and the recipient receives less.
The fee includes your partner fee if you set one. max_slippage_bpsmax_slippage_bpsmaxSlippageBpsmaxSlippageBpsmaxSlippageBpsmaxSlippageBpsmaxSlippageBpsMaxSlippageBpsMaxSlippageBps bounds the price movement tolerated between quote and delivery, in basis points (1 bps = 0.01%). Left unset, the SDK default applies.
Paying Cash App from the wallet
To pay a Cash App user from the wallet's own balance, no bridge is needed. A Cash App username prefixed with $ (e.g. $alice) parses to the user's Lightning address, alice@cash.app, which you pay with LNURL-Pay. A wallet holding a stable balance converts it to Bitcoin for the payment automatically.
Limitations
- Mainnet only. Cash App and the cross-chain providers operate against live networks. There is no testnet equivalent.
- Polling only. The bridge is funded outside the wallet, so it produces no
PaymentPaymentPaymentPaymentPaymentPaymentPaymentPaymentPaymentrow and no event. Look its status up withget_bridge_statusget_bridge_statusgetBridgeStatusgetBridgeStatusgetBridgeStatusgetBridgeStatusgetBridgeStatusGetBridgeStatusGetBridgeStatuswhen you need delivery confirmation.