@rhinestone/deposit-modal 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/README.md +109 -0
  2. package/dist/{DepositModalReown-6CXXGQ7X.cjs → DepositModalReown-UITYXJ6W.cjs} +17 -17
  3. package/dist/{DepositModalReown-ELDSTIME.mjs → DepositModalReown-XBNY6QCI.mjs} +4 -4
  4. package/dist/{WithdrawModal-QRMDR5T4.mjs → WithdrawModal-DY6A55OA.mjs} +3 -3
  5. package/dist/WithdrawModal-V42OK7L3.cjs +11 -0
  6. package/dist/bearer-transport-CVHNBgoV.d.cts +14 -0
  7. package/dist/bearer-transport-CVHNBgoV.d.ts +14 -0
  8. package/dist/{chunk-QMGEK623.mjs → chunk-5NWLS5BQ.mjs} +536 -225
  9. package/dist/chunk-ADEWTBSN.cjs +19 -0
  10. package/dist/{chunk-ZHX4QROC.mjs → chunk-BIL4ENC3.mjs} +1 -1
  11. package/dist/{chunk-2W4BJ5I3.cjs → chunk-EG4H7OMC.cjs} +71 -71
  12. package/dist/{chunk-QGNJFDEO.cjs → chunk-HMUGY66O.cjs} +690 -379
  13. package/dist/chunk-ISLVD5HQ.cjs +41 -0
  14. package/dist/{chunk-H66WM5AO.mjs → chunk-NITKDXHR.mjs} +388 -95
  15. package/dist/{chunk-XJMDCBHS.cjs → chunk-OCWSMLOP.cjs} +862 -569
  16. package/dist/chunk-PP4QE32S.mjs +19 -0
  17. package/dist/{chunk-JCWJ6HW7.cjs → chunk-PYOC6K24.cjs} +1 -1
  18. package/dist/{chunk-XCBDJPBD.mjs → chunk-X6N2XPTO.mjs} +1 -1
  19. package/dist/chunk-ZGHVJ2XM.mjs +41 -0
  20. package/dist/compliance.cjs +14 -0
  21. package/dist/compliance.d.cts +10 -0
  22. package/dist/compliance.d.ts +10 -0
  23. package/dist/compliance.mjs +14 -0
  24. package/dist/constants.cjs +3 -3
  25. package/dist/constants.d.cts +1 -1
  26. package/dist/constants.d.ts +1 -1
  27. package/dist/constants.mjs +3 -3
  28. package/dist/deposit.cjs +4 -4
  29. package/dist/deposit.d.cts +2 -2
  30. package/dist/deposit.d.ts +2 -2
  31. package/dist/deposit.mjs +3 -3
  32. package/dist/embed.cjs +16 -16
  33. package/dist/embed.d.cts +1 -1
  34. package/dist/embed.d.ts +1 -1
  35. package/dist/embed.mjs +8 -8
  36. package/dist/index.cjs +5 -5
  37. package/dist/index.d.cts +1 -1
  38. package/dist/index.d.ts +1 -1
  39. package/dist/index.mjs +4 -4
  40. package/dist/offramp.cjs +25 -0
  41. package/dist/offramp.d.cts +28 -0
  42. package/dist/offramp.d.ts +28 -0
  43. package/dist/offramp.mjs +25 -0
  44. package/dist/onramp.cjs +40 -0
  45. package/dist/onramp.d.cts +55 -0
  46. package/dist/onramp.d.ts +55 -0
  47. package/dist/onramp.mjs +40 -0
  48. package/dist/ramp-types-C6aUz4SZ.d.cts +43 -0
  49. package/dist/ramp-types-C6aUz4SZ.d.ts +43 -0
  50. package/dist/server.cjs +54 -2
  51. package/dist/server.d.cts +13 -1
  52. package/dist/server.d.ts +13 -1
  53. package/dist/server.mjs +52 -0
  54. package/dist/styles.css +25 -0
  55. package/dist/{types-B9SbZQIG.d.ts → types-BOxa1DE-.d.ts} +40 -4
  56. package/dist/{types-SwGGf0eH.d.cts → types-BShYNpvO.d.cts} +40 -4
  57. package/dist/withdraw.cjs +4 -4
  58. package/dist/withdraw.d.cts +2 -2
  59. package/dist/withdraw.d.ts +2 -2
  60. package/dist/withdraw.mjs +3 -3
  61. package/package.json +35 -5
  62. package/dist/WithdrawModal-QB2U756L.cjs +0 -11
package/README.md CHANGED
@@ -114,6 +114,31 @@ time, it does not emit the `submitted` lifecycle event with the processor's
114
114
  internal tracking key. Its `complete` event reports the settled source and
115
115
  destination transaction hashes once they exist.
116
116
 
117
+ ## Checkout payments
118
+
119
+ Pass `payment` when the modal funds one merchant order:
120
+
121
+ ```tsx
122
+ <DepositModal
123
+ {...depositProps}
124
+ payment={{ salt: order.accountSalt, amount: order.amountBaseUnits }}
125
+ />
126
+ ```
127
+
128
+ Register the order's managed account on your server first, then pass its 32-byte
129
+ salt to the modal. The same salt must resolve to the account address stored with
130
+ the order. `amount` is the required **destination token amount in base units**,
131
+ not a USD amount. The modal asks `/quotes/preview` for an `exactOut` quote and
132
+ shows the source amount the payer should send; the backend proxy must forward
133
+ that route to a processor with `exactOut` support.
134
+
135
+ Reconcile using the account on processor webhooks or `GET /deposits?account=`.
136
+ `destinationAmount` on the `complete` event is the amount actually delivered in
137
+ destination token base units. Quotes are estimates, and a payer using a QR,
138
+ exchange, or card can send a different amount, so compare the delivered amount
139
+ with the order amount before marking it paid. Checkout mode withholds the
140
+ recipient's deposit history from the payer.
141
+
117
142
  ## Withdraw
118
143
 
119
144
  `WithdrawModal` lives at `@rhinestone/deposit-modal/withdraw` and reports through the same `onLifecycle` + `onError` callbacks. It needs no wallet: you give it the account holding the funds and a function that performs one transfer.
@@ -347,3 +372,87 @@ Local setup, the release process and where the docs live are in
347
372
  ## License
348
373
 
349
374
  MIT
375
+
376
+ ## Onramp and offramp services
377
+
378
+ Deploy an updated `deposit-widget-proxy` before enabling these opt-in clients.
379
+ Custom proxies must allow Authorization in CORS and forward customer routes
380
+ without injecting `x-api-key`. Never proxy `POST /compliance/sessions` publicly.
381
+
382
+ On your server, import `createCustomerSessionHandler` from
383
+ `@rhinestone/deposit-modal/server`. Supply your server-held `apiKey` and an
384
+ `authorize(request)` callback that authenticates the user, enforces CSRF policy,
385
+ and returns `{ externalCustomerId, smartAccount? }` from trusted server state.
386
+ Mount its returned handler on your authenticated POST endpoint. It returns only
387
+ the 15-minute `token` and `expiresAt`, with no-store response headers.
388
+
389
+ Use separate scoped clients for onramp and offramp. The transport is internal;
390
+ the package does not expose a generic customer service or arbitrary request method.
391
+
392
+ ```ts
393
+ import { createOnrampService } from '@rhinestone/deposit-modal/onramp';
394
+ import { createOfframpService } from '@rhinestone/deposit-modal/offramp';
395
+ import { getComplianceStatus } from '@rhinestone/deposit-modal/compliance';
396
+
397
+ const options = {
398
+ backendUrl: proxyUrl,
399
+ getSession: () => authenticatedSessionClient.getCustomerSession(),
400
+ };
401
+ const onramp = createOnrampService(options);
402
+ const offramp = createOfframpService(options);
403
+ const setup = await onramp.createSetup({
404
+ purpose: 'account_setup',
405
+ country: 'DE',
406
+ currency: 'EUR',
407
+ paymentMethod: 'bank_transfer',
408
+ });
409
+ // Setup completes in this call and returns the account it configured.
410
+ // Show the customer their bank details through a separate, repeatable call:
411
+ const { nextAction } = await onramp.getAccountDetails(setup.account.id);
412
+ const status = await getComplianceStatus(options);
413
+ ```
414
+
415
+ The onramp client has `createSetup`, `getSetup`, `getOptions`, `listAccounts`,
416
+ `getAccount`, `getAccountDetails`, `listPayments` and `getPayment`. The offramp
417
+ client has session/options/payment methods, without accounts.
418
+ `getComplianceStatus` retains the existing `/compliance/status` read separately;
419
+ it is not a preliminary step. Shared types include `RampSession` (offramp),
420
+ `OnrampSetup`, `RampOption` and `RampCurrency`.
421
+ `CustomerSession` remains the browser bearer/expiry pair. Catch `ScopedRequestError`
422
+ and inspect its `status` for HTTP failures; response bodies are not included.
423
+
424
+ The three lightweight subpaths replace the unpublished `/customer` entry point.
425
+ They do not import React, wallet connectors or the server-only token helper.
426
+
427
+ `getSession` is called per request. Keep tokens in memory, scoped to the logged-in
428
+ user, and refresh them through your authenticated server. The clients reject
429
+ expired sessions and never fall back to an application key. They make no calls
430
+ until explicitly invoked, so existing modals and Swapped flows remain unchanged.
431
+ There is no preliminary capability request. Support/recovery methods belong to
432
+ the future provider lifecycle implementation and are not exposed here.
433
+
434
+ **An onramp setup is not a session.** It completes in the call that creates it
435
+ and returns `{ id, account }` — no status to poll, no expiry, no `nextAction`.
436
+ Bank details are read separately through `getAccountDetails`, because a customer
437
+ reads them before every transfer while setup happens once; that call returns a
438
+ hosted address and never the coordinates themselves. An offramp session keeps
439
+ `RampSession` with its status, expiry and `nextAction`, because it really is one
440
+ interaction.
441
+
442
+ Routes are scoped to the provider that serves them — `/onramp/noah/*` and
443
+ `/offramp/noah/*` here, while the existing Swapped flows keep their own paths.
444
+ A proxy must allow each one explicitly; an unlisted path 404s before reaching
445
+ the processor.
446
+
447
+ The initial contracts support EUR/USD bank transfers only. Onramp setup
448
+ uses `purpose: 'account_setup'` without an amount; the actual transfer determines
449
+ fiat sent. Offramp hosted beneficiary collection uses
450
+ `purpose: 'beneficiary_collection'`, separately from quoting and funding.
451
+ Offramp options use `amount` as decimal fiat major units the recipient receives.
452
+ No crypto-input quoting is exposed. Accounts return safe references/config/status,
453
+ not bank instructions. Hosted interaction completion never means payment
454
+ settlement; funding, payout and late returns have independent status fields.
455
+
456
+ The provider adapter and journey execution are not connected by this release.
457
+ Expect 503 until those implementations are deployed. Render hosted URLs only
458
+ after the journey's iframe presentation has been verified; do not log/store URLs.
@@ -1,7 +1,8 @@
1
1
  "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }
2
2
 
3
3
 
4
- var _chunkXJMDCBHScjs = require('./chunk-XJMDCBHS.cjs');
4
+ var _chunkOCWSMLOPcjs = require('./chunk-OCWSMLOP.cjs');
5
+ require('./chunk-LVCD6RHF.cjs');
5
6
 
6
7
 
7
8
 
@@ -10,13 +11,12 @@ var _chunkXJMDCBHScjs = require('./chunk-XJMDCBHS.cjs');
10
11
 
11
12
 
12
13
 
13
- var _chunkQGNJFDEOcjs = require('./chunk-QGNJFDEO.cjs');
14
- require('./chunk-JCWJ6HW7.cjs');
15
- require('./chunk-LVCD6RHF.cjs');
14
+ var _chunkHMUGY66Ocjs = require('./chunk-HMUGY66O.cjs');
16
15
 
17
16
 
18
17
 
19
18
  var _chunkOY5N3E6Lcjs = require('./chunk-OY5N3E6L.cjs');
19
+ require('./chunk-PYOC6K24.cjs');
20
20
 
21
21
  // src/DepositModalReown.tsx
22
22
  var _react = require('react');
@@ -44,7 +44,7 @@ var {
44
44
  unichain,
45
45
  katana,
46
46
  hyperEvm
47
- } = _chunkXJMDCBHScjs.getReownDependencies.call(void 0, )[1];
47
+ } = _chunkOCWSMLOPcjs.getReownDependencies.call(void 0, )[1];
48
48
  var APPKIT_NETWORK_BY_ID = {
49
49
  [mainnet.id]: mainnet,
50
50
  [optimism.id]: optimism,
@@ -76,7 +76,7 @@ function getAppKitNetwork(chainId) {
76
76
 
77
77
  // src/core/reown-theme.ts
78
78
  function mapTheme(theme) {
79
- const themeMode = _chunkQGNJFDEOcjs.resolveThemeMode.call(void 0, _optionalChain([theme, 'optionalAccess', _ => _.mode])) === "light" ? "light" : "dark";
79
+ const themeMode = _chunkHMUGY66Ocjs.resolveThemeMode.call(void 0, _optionalChain([theme, 'optionalAccess', _ => _.mode])) === "light" ? "light" : "dark";
80
80
  const themeVariables = {
81
81
  "--apkt-accent": _optionalChain([theme, 'optionalAccess', _2 => _2.ctaColor])
82
82
  };
@@ -93,7 +93,7 @@ function setAppKitTheme(appKit, theme) {
93
93
 
94
94
  // src/core/reown.tsx
95
95
  var _jsxruntime = require('react/jsx-runtime');
96
- var [appKitReact, appKitNetworks, wagmiAdapter, solanaAdapter] = _chunkXJMDCBHScjs.getReownDependencies.call(void 0, );
96
+ var [appKitReact, appKitNetworks, wagmiAdapter, solanaAdapter] = _chunkOCWSMLOPcjs.getReownDependencies.call(void 0, );
97
97
  var {
98
98
  createAppKit,
99
99
  useAppKit,
@@ -109,14 +109,14 @@ function buildTransports(rpcUrls, networks = EVM_NETWORKS) {
109
109
  const transports = {};
110
110
  for (const network of networks) {
111
111
  const id = Number(network.id);
112
- transports[id] = _viem.http.call(void 0, _chunkQGNJFDEOcjs.rpcUrlFor.call(void 0, rpcUrls, id));
112
+ transports[id] = _viem.http.call(void 0, _chunkHMUGY66Ocjs.rpcUrlFor.call(void 0, rpcUrls, id));
113
113
  }
114
114
  return transports;
115
115
  }
116
116
  function getEvmRpcFingerprint(rpcUrls, networks) {
117
117
  return networks.map((network) => {
118
118
  const id = Number(network.id);
119
- return `${id}=${_nullishCoalesce(_chunkQGNJFDEOcjs.rpcUrlFor.call(void 0, rpcUrls, id), () => ( ""))}`;
119
+ return `${id}=${_nullishCoalesce(_chunkHMUGY66Ocjs.rpcUrlFor.call(void 0, rpcUrls, id), () => ( ""))}`;
120
120
  }).join("|");
121
121
  }
122
122
  var cachedAdapter = null;
@@ -187,7 +187,7 @@ function ReownWalletProvider({
187
187
  backendUrl,
188
188
  children
189
189
  }) {
190
- const rpcUrls = _chunkQGNJFDEOcjs.useStableRpcUrls.call(void 0, rpcUrlsProp);
190
+ const rpcUrls = _chunkHMUGY66Ocjs.useStableRpcUrls.call(void 0, rpcUrlsProp);
191
191
  const [queryClient] = _react.useState.call(void 0, () => new (0, _reactquery.QueryClient)());
192
192
  const overrides = _react.useMemo.call(void 0, () => {
193
193
  if (!rpcUrls) return void 0;
@@ -199,14 +199,14 @@ function ReownWalletProvider({
199
199
  return out;
200
200
  }, [rpcUrls]);
201
201
  const [state, setState] = _react.useState.call(void 0, () => {
202
- const primed = _chunkQGNJFDEOcjs.peekRuntimeChains.call(void 0, backendUrl, overrides);
202
+ const primed = _chunkHMUGY66Ocjs.peekRuntimeChains.call(void 0, backendUrl, overrides);
203
203
  return { ready: primed !== null, chains: _nullishCoalesce(primed, () => ( [])) };
204
204
  });
205
205
  _react.useEffect.call(void 0, () => {
206
206
  let active = true;
207
- const primed = _chunkQGNJFDEOcjs.peekRuntimeChains.call(void 0, backendUrl, overrides);
207
+ const primed = _chunkHMUGY66Ocjs.peekRuntimeChains.call(void 0, backendUrl, overrides);
208
208
  setState({ ready: primed !== null, chains: _nullishCoalesce(primed, () => ( [])) });
209
- _chunkQGNJFDEOcjs.primeRuntimeChains.call(void 0, backendUrl, overrides).then((chains) => {
209
+ _chunkHMUGY66Ocjs.primeRuntimeChains.call(void 0, backendUrl, overrides).then((chains) => {
210
210
  if (active) setState({ ready: true, chains });
211
211
  });
212
212
  return () => {
@@ -215,7 +215,7 @@ function ReownWalletProvider({
215
215
  }, [backendUrl, overrides]);
216
216
  _react.useEffect.call(void 0, () => {
217
217
  setAppKitTheme(appKitReact.modal, theme);
218
- return _chunkQGNJFDEOcjs.followSystemAppearance.call(void 0,
218
+ return _chunkHMUGY66Ocjs.followSystemAppearance.call(void 0,
219
219
  _optionalChain([theme, 'optionalAccess', _7 => _7.mode]),
220
220
  () => setAppKitTheme(appKitReact.modal, theme)
221
221
  );
@@ -279,7 +279,7 @@ function useReownWalletSession() {
279
279
  await switchChainAsync({ chainId });
280
280
  }
281
281
  } catch (err) {
282
- if (_chunkQGNJFDEOcjs.isUnsupportedChainSwitchError.call(void 0, err)) {
282
+ if (_chunkHMUGY66Ocjs.isUnsupportedChainSwitchError.call(void 0, err)) {
283
283
  throw new Error(
284
284
  `Switch to ${chainDisplayName(chainId)} in your wallet to continue`
285
285
  );
@@ -292,7 +292,7 @@ function useReownWalletSession() {
292
292
 
293
293
  // src/DepositModalReown.tsx
294
294
 
295
- var [appKitReact2, , , , solanaAdapterReact] = _chunkXJMDCBHScjs.getReownDependencies.call(void 0, );
295
+ var [appKitReact2, , , , solanaAdapterReact] = _chunkOCWSMLOPcjs.getReownDependencies.call(void 0, );
296
296
  var { useAppKitProvider } = appKitReact2;
297
297
  var { useAppKitConnection } = solanaAdapterReact;
298
298
  function DepositModalWithReown(props) {
@@ -314,7 +314,7 @@ function DepositModalWithReown(props) {
314
314
  reown.disconnect();
315
315
  }, [reown.disconnect]);
316
316
  return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
317
- _chunkXJMDCBHScjs.DepositModalInner,
317
+ _chunkOCWSMLOPcjs.DepositModalInner,
318
318
  {
319
319
  ...props,
320
320
  walletSession: reownWithSolana,
@@ -1,7 +1,8 @@
1
1
  import {
2
2
  DepositModalInner,
3
3
  getReownDependencies
4
- } from "./chunk-H66WM5AO.mjs";
4
+ } from "./chunk-NITKDXHR.mjs";
5
+ import "./chunk-FTWKAJGN.mjs";
5
6
  import {
6
7
  followSystemAppearance,
7
8
  isUnsupportedChainSwitchError,
@@ -10,13 +11,12 @@ import {
10
11
  resolveThemeMode,
11
12
  rpcUrlFor,
12
13
  useStableRpcUrls
13
- } from "./chunk-QMGEK623.mjs";
14
- import "./chunk-XCBDJPBD.mjs";
15
- import "./chunk-FTWKAJGN.mjs";
14
+ } from "./chunk-5NWLS5BQ.mjs";
16
15
  import {
17
16
  SUPPORTED_CHAIN_IDS,
18
17
  getChainName
19
18
  } from "./chunk-EAGMY3QE.mjs";
19
+ import "./chunk-X6N2XPTO.mjs";
20
20
 
21
21
  // src/DepositModalReown.tsx
22
22
  import { useCallback, useMemo as useMemo2 } from "react";
@@ -1,10 +1,10 @@
1
1
  import {
2
2
  WithdrawModal,
3
3
  buildWithdrawAnalyticsSessionProperties
4
- } from "./chunk-ZHX4QROC.mjs";
5
- import "./chunk-QMGEK623.mjs";
6
- import "./chunk-XCBDJPBD.mjs";
4
+ } from "./chunk-BIL4ENC3.mjs";
5
+ import "./chunk-5NWLS5BQ.mjs";
7
6
  import "./chunk-EAGMY3QE.mjs";
7
+ import "./chunk-X6N2XPTO.mjs";
8
8
  export {
9
9
  WithdrawModal,
10
10
  buildWithdrawAnalyticsSessionProperties
@@ -0,0 +1,11 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true});
2
+
3
+
4
+ var _chunkEG4H7OMCcjs = require('./chunk-EG4H7OMC.cjs');
5
+ require('./chunk-HMUGY66O.cjs');
6
+ require('./chunk-OY5N3E6L.cjs');
7
+ require('./chunk-PYOC6K24.cjs');
8
+
9
+
10
+
11
+ exports.WithdrawModal = _chunkEG4H7OMCcjs.WithdrawModal; exports.buildWithdrawAnalyticsSessionProperties = _chunkEG4H7OMCcjs.buildWithdrawAnalyticsSessionProperties;
@@ -0,0 +1,14 @@
1
+ interface CustomerSession {
2
+ token: string;
3
+ expiresAt: string;
4
+ }
5
+ interface CustomerSessionOptions {
6
+ backendUrl: string;
7
+ getSession: () => CustomerSession | Promise<CustomerSession>;
8
+ }
9
+ declare class ScopedRequestError extends Error {
10
+ readonly status: number;
11
+ constructor(status: number);
12
+ }
13
+
14
+ export { type CustomerSessionOptions as C, ScopedRequestError as S, type CustomerSession as a };
@@ -0,0 +1,14 @@
1
+ interface CustomerSession {
2
+ token: string;
3
+ expiresAt: string;
4
+ }
5
+ interface CustomerSessionOptions {
6
+ backendUrl: string;
7
+ getSession: () => CustomerSession | Promise<CustomerSession>;
8
+ }
9
+ declare class ScopedRequestError extends Error {
10
+ readonly status: number;
11
+ constructor(status: number);
12
+ }
13
+
14
+ export { type CustomerSessionOptions as C, ScopedRequestError as S, type CustomerSession as a };