Skip to main content
This guide is for teams that operate their own mobile wallet app and want a dedicated Fireblocks Flow integration with the Dynamic JavaScript SDK, without using WalletConnect. Instead of connecting the wallet inside the SDK and signing through submitFlowTransaction, you create a Flow with sourceType: 'deposit_address' and pass the payment details to your wallet app through a deep link or QR code. The wallet app controls the send UX, and Flow monitors the deposit. A custom deep link lets the wallet app own the payment experience:
  • No SDK wallet connection — the app running the SDK never has to connect to the user’s wallet.
  • Fewer hops — the connected-wallet path requires the user to connect the wallet and then sign a transaction, which means switching to the wallet twice. A deep link lets the user confirm and send in the wallet app once.
  • Pre-filled, correct details — the deep link can carry the exact deposit address, amount, asset, and chain, so the wallet app can build a dedicated confirmation screen instead of asking the user to copy and paste values.
  • Less room for error — with a raw deposit address, the user must send the exact correct amount. Any mismatch typically triggers a refund. A deep link removes most manual entry and reduces that risk.
  • One code path for QR and deep links — the same URL can be rendered as a QR code on desktop, opened as a deep link on mobile web, or invoked directly from a mobile native app.
Use sourceType: 'deposit_address' and a custom deep link when:
  • You control the wallet app and want to keep the send UX inside it.
  • The app running the SDK should not connect to the user’s wallet.
  • You want one implementation that covers desktop QR codes, mobile web deep links, and mobile native deep links.
  • You want to reduce the chance of the user sending the wrong amount, asset, or address.
For the connected-wallet alternative — where the SDK attaches sourceType: 'wallet' and signs inside submitFlowTransaction through executeSwapTransaction — see Add swap capabilities.

How this fits into Flow

attachFlowSource supports three source types: wallet, exchange, and deposit_address.
  • sourceType: 'wallet' — the SDK connects a wallet and signs. This is the connected-wallet path covered in Add swap capabilities.
  • sourceType: 'deposit_address' — Flow generates a unique deposit address and amount. Your extension turns that address and amount into a deep link or QR code. The wallet app sends the funds, and Flow detects the deposit and advances executionState to source_confirmed.
The deposit-address path does not require a WalletProvider and does not call submitFlowTransaction.

Connected wallet

sourceType: 'wallet'SDK role
  • Attaches a wallet source.
  • Calls submitFlowTransaction.
  • Signs through executeSwapTransaction.
Wallet app role
  • Provides a WalletProvider with signing.
UX
  • Two hops: connect the wallet, then sign the transaction.
Best for
  • Tightly integrated wallets that can expose a WalletProvider.

Deposit deep link

sourceType: 'deposit_address'SDK role
  • Attaches a deposit source.
  • Calls getFlowQuote.
  • Builds the deep link or QR code.
Wallet app role
  • Receives the deep link, pre-fills the send screen, and sends the exact amount.
UX
  • One confirmation inside the wallet app.
Best for
  • Wallet apps that want to own the send UX or cannot expose a WalletProvider.
Create a single extension function that takes a Flow and builds a custom-app deep link. The example uses mywallet://deposit, but replace the scheme with your own wallet’s URL scheme.
Important details:
  • flow.depositAddress is the address the wallet must send funds to.
  • flow.quote.fromAmount is the exact source amount in base units; do not fall back to flow.amount, which is the destination amount.
  • fromToken, fromChainId, and fromChainName describe the asset and chain the user is paying from.
  • The query parameter names and the custom scheme are up to you — this is just an example contract.
A consumer app creates a Flow, attaches a deposit-address source, gets a quote, then opens the deep link or shows a QR code:
  • Desktop: show a QR code with the deposit deep-link URL. The user scans it with their phone camera or wallet app.
  • Mobile web: call openDeeplink or render a button that links to the deep-link URL. A phone cannot scan a QR code that it is already displaying, so a QR code is not the primary UX on mobile web.
  • Mobile native: call openDeeplink directly. If the wallet app is not installed, fall back to the QR code or an app-store prompt.
See Open deep links for the platform behavior and React Native configuration.

Development cost

Building the deep link is only half of the integration. The wallet app must also:
  • Register and handle the custom URL scheme (for example, mywallet://deposit).
  • Parse the query parameters.
  • Pre-fill the send screen with depositAddress, rawAmount, and the correct asset and chain.
  • Validate that the amount, asset, and chain match the flow before signing.
  • Optionally handle returnUrl to send the user back to the app that started the flow.
The Dynamic SDK creates the deep link and opens it; the wallet app must implement everything that happens after the user taps or scans it.

After the payment

The user sends the exact asset and amount to depositAddress from the wallet app. Fireblocks Flow monitors the address and advances executionState from quoted to source_confirmed. Poll getFlow to track progress; there is no submitFlowTransaction call for this path.
Last modified on August 5, 2026