Skip to content

Commit 6107ca0

Browse files
committed
Initial on-ramp implementation
1 parent 76db72d commit 6107ca0

File tree

4 files changed

+97
-0
lines changed

4 files changed

+97
-0
lines changed

examples/with-sdk-js/src/app/page.tsx

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1674,6 +1674,34 @@ export default function AuthPage() {
16741674
</div>
16751675
</div>
16761676
)}
1677+
{authState === AuthState.Authenticated && (
1678+
<div>
1679+
<h2>On Ramp</h2>
1680+
<div className="flex flex-wrap gap-2 mb-2">
1681+
<button
1682+
data-testid="sign-sol-transaction"
1683+
onClick={() =>
1684+
turnkey.handleCoinbaseOnRamp({
1685+
onrampProvider: "FIAT_ON_RAMP_PROVIDER_COINBASE",
1686+
walletAddress: activeWalletAccount?.address!,
1687+
cryptoCurrencyCode: "FIAT_ON_RAMP_CRYPTO_CURRENCY_ETH",
1688+
network: "FIAT_ON_RAMP_BLOCKCHAIN_NETWORK_ETHEREUM",
1689+
paymentMethod: "FIAT_ON_RAMP_PAYMENT_METHOD_PAYPAL",
1690+
sandboxMode: true,
1691+
})
1692+
}
1693+
style={{
1694+
backgroundColor: "pink",
1695+
borderRadius: "8px",
1696+
padding: "8px 16px",
1697+
color: "black",
1698+
}}
1699+
>
1700+
Coinbase On Ramp
1701+
</button>
1702+
</div>
1703+
</div>
1704+
)}
16771705
<div>
16781706
<h2>Otp Methods</h2>
16791707
<div>

packages/react-wallet-kit/src/providers/client/Provider.tsx

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ import type {
149149
HandleAddPasskeyParams,
150150
HandleAddPhoneNumberParams,
151151
HandleAppleOauthParams,
152+
HandleCoinbaseOnRampParams,
152153
HandleConnectExternalWalletParams,
153154
HandleDiscordOauthParams,
154155
HandleExportPrivateKeyParams,
@@ -5026,6 +5027,47 @@ export const ClientProvider: React.FC<ClientProviderProps> = ({
50265027
[pushPage, masterConfig, client, session, user],
50275028
);
50285029

5030+
const handleCoinbaseOnRamp = useCallback(
5031+
async (params: HandleCoinbaseOnRampParams): Promise<void> => {
5032+
const { successPageDuration = 2000 } = params || {};
5033+
const organizationId = params?.organizationId || session?.organizationId;
5034+
if (!organizationId) {
5035+
throw new TurnkeyError(
5036+
"A session or passed in organization ID is required.",
5037+
TurnkeyErrorCodes.INVALID_REQUEST,
5038+
);
5039+
}
5040+
5041+
if (!client)
5042+
throw new TurnkeyError(
5043+
"Client is not initialized.",
5044+
TurnkeyErrorCodes.CLIENT_NOT_INITIALIZED,
5045+
);
5046+
5047+
const res = await client.httpClient.initFiatOnRamp(params);
5048+
const { onRampUrl } = res;
5049+
5050+
// Popup flow (can abstract this into a utility)
5051+
const width = popupWidth;
5052+
const height = popupHeight;
5053+
const left = window.screenX + (window.innerWidth - width) / 2;
5054+
const top = window.screenY + (window.innerHeight - height) / 2;
5055+
5056+
const popupWindow = window.open(
5057+
"about:blank",
5058+
"_blank",
5059+
`width=${width},height=${height},top=${top},left=${left},scrollbars=yes,resizable=yes`,
5060+
);
5061+
5062+
if (!popupWindow) {
5063+
throw new Error("Failed to open Coinbase payment window.");
5064+
}
5065+
5066+
popupWindow.location.href = onRampUrl.toString();
5067+
},
5068+
[masterConfig, client, session, user],
5069+
);
5070+
50295071
useEffect(() => {
50305072
if (proxyAuthConfigRef.current) return;
50315073

@@ -5243,6 +5285,7 @@ export const ClientProvider: React.FC<ClientProviderProps> = ({
52435285
handleConnectExternalWallet,
52445286
handleRemoveUserEmail,
52455287
handleRemoveUserPhoneNumber,
5288+
handleCoinbaseOnRamp,
52465289
}}
52475290
>
52485291
{children}

packages/react-wallet-kit/src/providers/client/Types.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import type {
2323
HandleAddPasskeyParams,
2424
HandleAddPhoneNumberParams,
2525
HandleAppleOauthParams,
26+
HandleCoinbaseOnRampParams,
2627
HandleConnectExternalWalletParams,
2728
HandleDiscordOauthParams,
2829
HandleExportPrivateKeyParams,
@@ -685,6 +686,9 @@ export interface ClientContextType extends TurnkeyClientMethods {
685686
handleRemoveUserPhoneNumber: (
686687
params?: HandleRemoveUserPhoneNumberParams,
687688
) => Promise<string>;
689+
690+
// TODO (Amir): Complete JSDoc
691+
handleCoinbaseOnRamp: (params: HandleCoinbaseOnRampParams) => Promise<void>;
688692
}
689693

690694
/** @internal */

packages/react-wallet-kit/src/types/method-types.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,11 @@ import type {
33
StamperType,
44
v1AddressFormat,
55
v1Curve,
6+
v1FiatOnRampBlockchainNetwork,
7+
v1FiatOnRampCryptoCurrency,
8+
v1FiatOnRampCurrency,
9+
v1FiatOnRampPaymentMethod,
10+
v1FiatOnRampProvider,
611
v1HashFunction,
712
v1PayloadEncoding,
813
v1WalletAccountParams,
@@ -227,3 +232,20 @@ export type HandleRemoveUserPhoneNumberParams = {
227232
stampWith?: StamperType | undefined;
228233
organizationId?: string;
229234
};
235+
236+
export type HandleCoinbaseOnRampParams = {
237+
onrampProvider: v1FiatOnRampProvider;
238+
walletAddress: string;
239+
network: v1FiatOnRampBlockchainNetwork;
240+
cryptoCurrencyCode: v1FiatOnRampCryptoCurrency;
241+
fiatCurrencyCode?: v1FiatOnRampCurrency;
242+
fiatCurrencyAmount?: string;
243+
paymentMethod?: v1FiatOnRampPaymentMethod;
244+
countryCode?: string;
245+
countrySubdivisionCode?: string;
246+
sandboxMode?: boolean;
247+
urlForSignature?: string;
248+
successPageDuration?: number | undefined;
249+
stampWith?: StamperType | undefined;
250+
organizationId?: string;
251+
};

0 commit comments

Comments
 (0)