SDK signer through a WASM blob; the user’s wallet is not prompted. The same normalized flow applies to lighter and lighter-rh, while each instance owns its asset catalogue, collateral, endpoints, and signing configuration.
Discover valid selections
CallgetWithdrawableBalances() and render exactly the rows it returns:
/assets, filters zero and sub-minimum rows, and attaches each asset’s decimals, L1 address, and minWithdrawalAmount. Do not sum the same asset across perps and spot; the selected route is part of the signed transaction.
Submit the selected row
Pass the selected row’s
asset.id and route together. amount stays in human-readable asset units; the backend loads the authoritative asset precision and minimum, validates the amount, and the provider signer scales it exactly.
assetId and route are backend-validated wire fields specific to Lighter’s withdrawal endpoint. The SDK’s exported WithdrawalParams type carries only destination and amount — see Withdrawal.route defaults to perps and the asset defaults to that deployment’s quote collateral (USDC for lighter, USDG for lighter-rh). New UIs should use discovery rather than rely on those defaults.
Destination constraint
The backend rejects a destination that differs from the L1 account owner. The destination chain follows the deployment: mainnet Lighter exits through its Ethereum path, whilelighter-rh uses the Robinhood deployment configuration.
Standard and fast paths
The backend chooses settlement after it has resolved the selected asset and route:
The optional fast-path probe never blocks withdrawal. An unavailable probe or build failure falls back to the standard step.
TRANSFER remains internal and is not advertised as a directly callable public action.
The returned successful ActionResult can include txHash and explorerLink when that deployment has a configured explorer.