Auth - Fund via a linked exchange account
Release dates
- Cert - July 4th, 2025
- Production - July 15th, 2025
Release type
- Action is required if you currently use the Account Funding: Deposits SDK
Summary
Overview
Introducing Auth - our account-to-account transfer product that can be embedded into any of our payments SDK's.
We're starting with the Account Funding product - Platforms will now be able to allow their customers to link an external centralized exchange (ie, Coinbase, Kraken, Binance, etc) or a non-custodial wallet (ie, Metamask, Phantom, Coinbase wallet, etc.) and use those balances to initiate the funding transaction. The first exchange that will be offered initially will be Coinbase and this will be offered for Deposits only. More exchanges, non-custodial wallets, flows (ie, withdrawals), and payments products (payouts, pay-ins, etc) will be added in the very near future.
Technical Details
If you currently use the Account Funding SDK, the only dev change on your end relates to your mobile experience.
During the SDK flow, we'll need to broker the UX between the Zero Hash SDK and Coinbase's (or any exchange/wallet we support) by authenticating to their system. This requires opening a web page, popup, or similar interface. On web browsers (including mobile browsers), no additional work is required from the platforms - the UX will be seamless with your current integration.
However, for mobile it's different. Currently, our product allows platforms to open any non-ZH URLs outside of the WebView. In the past, this wasn't an issue because the SDK UI didn’t rely on integrations with external providers.
Here is the current implementation (this page is a good frame of reference for Flutter):
..setNavigationDelegate(
NavigationDelegate(
onNavigationRequest: (NavigationRequest request) async {
if (request.url.startsWith(sdkMobileServer) || request.url.startsWith(zeroHashAppsURL)) {
return NavigationDecision.navigate;
}
_launchURL(request.url);
return NavigationDecision.prevent;
},
),
)
void _launchURL(String url) async {
if (await canLaunchUrl(Uri.parse(url))) {
await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication);
} else {
throw 'Could not launch $url';
}
}
This is the new implementation for seamless mobile UX:
..setNavigationDelegate(
NavigationDelegate(
onNavigationRequest: (NavigationRequest request) async {
if (request.url.contains('openInExternalBrowser=true')) {
_launchURL(request.url);
return NavigationDecision.prevent;
}
return NavigationDecision.navigate;
},
),
)
void _launchURL(String url) async {
if (!await canLaunchUrl(Uri.parse(url))) {
return;
}
await launchUrl(Uri.parse(url), mode: LaunchMode.externalApplication);
}
Action required
- If you'd like to enable Auth for the Account Funding product, you'll be required to sign and agree to the new Auth Addendum
- If you are a currently use the Account Funding - Deposit SDK (
permission
=fwc
on the JWT access token retrieval call)
Endpoints impacted
- n.a