thirdweb 5.121.0 → 5.121.1
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.
- package/dist/cjs/react/core/hooks/useStepExecutor.js +12 -0
- package/dist/cjs/react/core/hooks/useStepExecutor.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/BuyWidget.js +4 -0
- package/dist/cjs/react/web/ui/Bridge/BuyWidget.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js +4 -0
- package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
- package/dist/cjs/react/web/ui/Bridge/StepRunner.js +43 -2
- package/dist/cjs/react/web/ui/Bridge/StepRunner.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/react/core/hooks/useStepExecutor.js +12 -0
- package/dist/esm/react/core/hooks/useStepExecutor.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/BuyWidget.js +4 -0
- package/dist/esm/react/web/ui/Bridge/BuyWidget.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js +4 -0
- package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js.map +1 -1
- package/dist/esm/react/web/ui/Bridge/StepRunner.js +43 -2
- package/dist/esm/react/web/ui/Bridge/StepRunner.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/scripts/bridge-widget.js +90 -90
- package/dist/types/react/core/hooks/useStepExecutor.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/CheckoutWidget.d.ts.map +1 -1
- package/dist/types/react/web/ui/Bridge/StepRunner.d.ts +9 -2
- package/dist/types/react/web/ui/Bridge/StepRunner.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/react/core/hooks/useStepExecutor.test.tsx +134 -0
- package/src/react/core/hooks/useStepExecutor.ts +14 -0
- package/src/react/web/ui/Bridge/BuyWidget.tsx +7 -0
- package/src/react/web/ui/Bridge/CheckoutWidget.tsx +7 -0
- package/src/react/web/ui/Bridge/StepRunner.test.tsx +143 -0
- package/src/react/web/ui/Bridge/StepRunner.tsx +102 -7
- package/src/version.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useStepExecutor.d.ts","sourceRoot":"","sources":["../../../../../src/react/core/hooks/useStepExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,KAAK,EACV,SAAS,EAEV,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,CAAC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GAC5D,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GAC7D,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GACjE,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAC3B,YAAY,CAAC,MAAM,EACnB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CACxB,CAAC,CAAC;AAEP;;GAEG;AACH,UAAU,mBAAmB;IAC3B,aAAa,EAAE,mBAAmB,CAAC;IACnC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,EAAE,aAAa,CAAC;IAC7B,oCAAoC;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qGAAqG;IACrG,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,IAAI,CAAC;CACnE;AAYD;;GAEG;AACH,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAChE,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,eAAe,CAAC;IACvD,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,
|
|
1
|
+
{"version":3,"file":"useStepExecutor.d.ts","sourceRoot":"","sources":["../../../../../src/react/core/hooks/useStepExecutor.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC3D,OAAO,KAAK,EACV,SAAS,EAEV,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAE9D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAIhE,OAAO,KAAK,EAAW,MAAM,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAC7B,CAAC;IAAE,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GAC5D,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GAC7D,CAAC;IAAE,IAAI,EAAE,UAAU,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CAAC,CAAC,GACjE,CAAC;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,GAAG,OAAO,CAC3B,YAAY,CAAC,MAAM,EACnB;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE,CACxB,CAAC,CAAC;AAEP;;GAEG;AACH,UAAU,mBAAmB;IAC3B,aAAa,EAAE,mBAAmB,CAAC;IACnC,+DAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,aAAa,EAAE,aAAa,CAAC;IAC7B,oCAAoC;IACpC,MAAM,EAAE,cAAc,CAAC;IACvB,kDAAkD;IAClD,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,qGAAqG;IACrG,UAAU,CAAC,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,IAAI,CAAC;CACnE;AAYD;;GAEG;AACH,UAAU,kBAAkB;IAC1B,WAAW,CAAC,EAAE,SAAS,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,WAAW,GAAG,QAAQ,CAAC;IAChE,cAAc,EAAE,MAAM,GAAG,WAAW,GAAG,eAAe,CAAC;IACvD,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,QAAQ,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAmBD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,mBAAmB,GAC3B,kBAAkB,CAqrBpB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BuyWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/BuyWidget.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"BuyWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/BuyWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CheckoutWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/CheckoutWidget.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"CheckoutWidget.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/CheckoutWidget.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ThirdwebClient } from "../../../../client/client.js";
|
|
2
2
|
import type { Wallet } from "../../../../wallets/interfaces/wallet.js";
|
|
3
3
|
import type { WindowAdapter } from "../../../core/adapters/WindowAdapter.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type BridgePrepareRequest, type BridgePrepareResult } from "../../../core/hooks/useBridgePrepare.js";
|
|
5
5
|
import { type CompletedStatusResult } from "../../../core/hooks/useStepExecutor.js";
|
|
6
6
|
type StepRunnerProps = {
|
|
7
7
|
title: string | undefined;
|
|
@@ -38,7 +38,14 @@ type StepRunnerProps = {
|
|
|
38
38
|
* Prepared quote to use
|
|
39
39
|
*/
|
|
40
40
|
preparedQuote: BridgePrepareResult;
|
|
41
|
+
/**
|
|
42
|
+
* Called when the executing quote is replaced by a freshly prepared one
|
|
43
|
+
* (e.g. after retrying a failed onramp, which mints a new session). Lets the
|
|
44
|
+
* parent keep any state it derives from the quote — such as the success
|
|
45
|
+
* payload — in sync with the session that actually completed.
|
|
46
|
+
*/
|
|
47
|
+
onQuoteUpdate?: (preparedQuote: BridgePrepareResult) => void;
|
|
41
48
|
};
|
|
42
|
-
export declare function StepRunner({
|
|
49
|
+
export declare function StepRunner({ preparedQuote, request, onQuoteUpdate, ...rest }: StepRunnerProps): import("react/jsx-runtime").JSX.Element;
|
|
43
50
|
export {};
|
|
44
51
|
//# sourceMappingURL=StepRunner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StepRunner.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/StepRunner.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"StepRunner.d.ts","sourceRoot":"","sources":["../../../../../../src/react/web/ui/Bridge/StepRunner.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,0CAA0C,CAAC;AACvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,yCAAyC,CAAC;AAO7E,OAAO,EACL,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EAGzB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,KAAK,qBAAqB,EAE3B,MAAM,wCAAwC,CAAC;AAQhD,KAAK,eAAe,GAAG;IACrB,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IAC1B,OAAO,EAAE,oBAAoB,CAAC;IAE9B;;OAEG;IACH,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IAE3B;;OAEG;IACH,MAAM,EAAE,cAAc,CAAC;IAEvB;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,SAAS,EAAE,OAAO,CAAC;IAEnB;;OAEG;IACH,UAAU,EAAE,CAAC,iBAAiB,EAAE,qBAAqB,EAAE,KAAK,IAAI,CAAC;IAEjE;;OAEG;IACH,QAAQ,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,CAAC;IAEnC;;OAEG;IACH,MAAM,EAAE,MAAM,IAAI,CAAC;IAEnB;;OAEG;IACH,aAAa,EAAE,mBAAmB,CAAC;IAEnC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,CAAC,aAAa,EAAE,mBAAmB,KAAK,IAAI,CAAC;CAC9D,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,aAAa,EACb,OAAO,EACP,aAAa,EACb,GAAG,IAAI,EACR,EAAE,eAAe,2CA4DjB"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.121.
|
|
1
|
+
export declare const version = "5.121.1";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/package.json
CHANGED
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { act, renderHook, waitFor } from "@testing-library/react";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { TEST_CLIENT } from "~test/test-clients.js";
|
|
4
|
+
import type { WindowAdapter } from "../adapters/WindowAdapter.js";
|
|
5
|
+
import type { BridgePrepareResult } from "./useBridgePrepare.js";
|
|
6
|
+
import { useStepExecutor } from "./useStepExecutor.js";
|
|
7
|
+
|
|
8
|
+
// Avoid firing analytics network calls while executing.
|
|
9
|
+
vi.mock("../../../analytics/track/pay.js", () => ({
|
|
10
|
+
trackPayEvent: vi.fn(),
|
|
11
|
+
}));
|
|
12
|
+
|
|
13
|
+
const { onrampStatusMock } = vi.hoisted(() => ({
|
|
14
|
+
onrampStatusMock: vi.fn(),
|
|
15
|
+
}));
|
|
16
|
+
vi.mock("../../../bridge/index.js", () => ({
|
|
17
|
+
Onramp: {
|
|
18
|
+
status: (options: unknown) => onrampStatusMock(options),
|
|
19
|
+
},
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
// Minimal onramp quote with no follow-up transactions, so the executor's
|
|
23
|
+
// behaviour depends solely on the onramp outcome.
|
|
24
|
+
const ONRAMP_QUOTE: Extract<BridgePrepareResult, { type: "onramp" }> = {
|
|
25
|
+
currency: "USD",
|
|
26
|
+
currencyAmount: 30,
|
|
27
|
+
destinationAmount: 30000000n,
|
|
28
|
+
destinationToken: {
|
|
29
|
+
address: "0x0000000000000000000000000000000000000000",
|
|
30
|
+
chainId: 8453,
|
|
31
|
+
decimals: 6,
|
|
32
|
+
name: "USD Coin",
|
|
33
|
+
prices: {},
|
|
34
|
+
symbol: "USDC",
|
|
35
|
+
},
|
|
36
|
+
id: "onramp-session-id",
|
|
37
|
+
intent: {
|
|
38
|
+
chainId: 8453,
|
|
39
|
+
onramp: "transak",
|
|
40
|
+
receiver: "0x0000000000000000000000000000000000000001",
|
|
41
|
+
tokenAddress: "0x0000000000000000000000000000000000000000",
|
|
42
|
+
},
|
|
43
|
+
link: "https://onramp.example.com/session",
|
|
44
|
+
steps: [],
|
|
45
|
+
type: "onramp",
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
function createWindowAdapter(): WindowAdapter {
|
|
49
|
+
return { open: vi.fn(async () => {}) };
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
describe("useStepExecutor onramp guards", () => {
|
|
53
|
+
it("surfaces an error when the onramp reports FAILED", async () => {
|
|
54
|
+
onrampStatusMock.mockResolvedValue({ status: "FAILED", transactions: [] });
|
|
55
|
+
const windowAdapter = createWindowAdapter();
|
|
56
|
+
|
|
57
|
+
const { result } = renderHook(() =>
|
|
58
|
+
useStepExecutor({
|
|
59
|
+
client: TEST_CLIENT,
|
|
60
|
+
preparedQuote: ONRAMP_QUOTE,
|
|
61
|
+
windowAdapter,
|
|
62
|
+
}),
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
await act(async () => {
|
|
66
|
+
result.current.start();
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
await waitFor(() => expect(result.current.onrampStatus).toBe("failed"));
|
|
70
|
+
expect(result.current.error?.message).toBe("Payment failed");
|
|
71
|
+
expect(result.current.executionState).toBe("idle");
|
|
72
|
+
expect(windowAdapter.open).toHaveBeenCalledWith(ONRAMP_QUOTE.link);
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it("does not report success when a prior onramp attempt failed", async () => {
|
|
76
|
+
onrampStatusMock.mockResolvedValue({ status: "FAILED", transactions: [] });
|
|
77
|
+
const windowAdapter = createWindowAdapter();
|
|
78
|
+
const onComplete = vi.fn();
|
|
79
|
+
|
|
80
|
+
const { result } = renderHook(() =>
|
|
81
|
+
useStepExecutor({
|
|
82
|
+
client: TEST_CLIENT,
|
|
83
|
+
onComplete,
|
|
84
|
+
preparedQuote: ONRAMP_QUOTE,
|
|
85
|
+
windowAdapter,
|
|
86
|
+
}),
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// First attempt fails and leaves the onramp in the "failed" state.
|
|
90
|
+
await act(async () => {
|
|
91
|
+
result.current.start();
|
|
92
|
+
});
|
|
93
|
+
await waitFor(() => expect(result.current.onrampStatus).toBe("failed"));
|
|
94
|
+
|
|
95
|
+
// Retrying must fail fast on the incomplete onramp rather than proceeding.
|
|
96
|
+
await act(async () => {
|
|
97
|
+
result.current.retry();
|
|
98
|
+
});
|
|
99
|
+
await waitFor(() =>
|
|
100
|
+
expect(result.current.error?.message).toBe("Onramp did not complete"),
|
|
101
|
+
);
|
|
102
|
+
expect(result.current.error?.statusCode).toBe(500);
|
|
103
|
+
// Success must never be reported for an incomplete onramp.
|
|
104
|
+
expect(onComplete).not.toHaveBeenCalled();
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
it("marks the onramp complete before reporting success", async () => {
|
|
108
|
+
onrampStatusMock.mockResolvedValue({
|
|
109
|
+
status: "COMPLETED",
|
|
110
|
+
transactions: [],
|
|
111
|
+
});
|
|
112
|
+
const windowAdapter = createWindowAdapter();
|
|
113
|
+
const onComplete = vi.fn();
|
|
114
|
+
|
|
115
|
+
const { result } = renderHook(() =>
|
|
116
|
+
useStepExecutor({
|
|
117
|
+
client: TEST_CLIENT,
|
|
118
|
+
onComplete,
|
|
119
|
+
preparedQuote: ONRAMP_QUOTE,
|
|
120
|
+
windowAdapter,
|
|
121
|
+
}),
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
await act(async () => {
|
|
125
|
+
result.current.start();
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
await waitFor(() => expect(result.current.onrampStatus).toBe("completed"), {
|
|
129
|
+
timeout: 5000,
|
|
130
|
+
});
|
|
131
|
+
expect(result.current.error).toBeUndefined();
|
|
132
|
+
expect(onComplete).toHaveBeenCalledTimes(1);
|
|
133
|
+
});
|
|
134
|
+
});
|
|
@@ -466,6 +466,7 @@ export function useStepExecutor(
|
|
|
466
466
|
return { completed: true };
|
|
467
467
|
} else if (status === "FAILED") {
|
|
468
468
|
setOnrampStatus("failed");
|
|
469
|
+
throw new Error("Payment failed");
|
|
469
470
|
}
|
|
470
471
|
|
|
471
472
|
return { completed: false };
|
|
@@ -517,12 +518,25 @@ export function useStepExecutor(
|
|
|
517
518
|
}
|
|
518
519
|
|
|
519
520
|
// Execute onramp first if configured and not already completed
|
|
521
|
+
let onrampCompleted =
|
|
522
|
+
preparedQuote.type !== "onramp" || onrampStatus === "completed";
|
|
520
523
|
if (preparedQuote.type === "onramp" && onrampStatus === "pending") {
|
|
521
524
|
await executeOnramp(
|
|
522
525
|
preparedQuote,
|
|
523
526
|
completedStatusResults,
|
|
524
527
|
abortController.signal,
|
|
525
528
|
);
|
|
529
|
+
onrampCompleted = true;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
// An onramp must complete before any follow-up transactions run or
|
|
533
|
+
// success is reported.
|
|
534
|
+
if (!onrampCompleted) {
|
|
535
|
+
throw new ApiError({
|
|
536
|
+
code: "INTERNAL_SERVER_ERROR",
|
|
537
|
+
message: "Onramp did not complete",
|
|
538
|
+
statusCode: 500,
|
|
539
|
+
});
|
|
526
540
|
}
|
|
527
541
|
|
|
528
542
|
if (flatTxs.length > 0) {
|
|
@@ -731,6 +731,13 @@ function BridgeWidgetContent(
|
|
|
731
731
|
completedStatuses,
|
|
732
732
|
});
|
|
733
733
|
}}
|
|
734
|
+
onQuoteUpdate={(quote) => {
|
|
735
|
+
// A failed onramp is retried with a fresh session; keep the success
|
|
736
|
+
// payload pointed at the session that actually completes.
|
|
737
|
+
setScreen((prev) =>
|
|
738
|
+
prev.id === "5:execute" ? { ...prev, preparedQuote: quote } : prev,
|
|
739
|
+
);
|
|
740
|
+
}}
|
|
734
741
|
request={screen.request}
|
|
735
742
|
wallet={screen.paymentMethod.payerWallet}
|
|
736
743
|
windowAdapter={webWindowAdapter}
|
|
@@ -720,6 +720,13 @@ function CheckoutWidgetContent(
|
|
|
720
720
|
completedStatuses,
|
|
721
721
|
});
|
|
722
722
|
}}
|
|
723
|
+
onQuoteUpdate={(quote) => {
|
|
724
|
+
// A failed onramp is retried with a fresh session; keep the success
|
|
725
|
+
// payload pointed at the session that actually completes.
|
|
726
|
+
setScreen((prev) =>
|
|
727
|
+
prev.id === "5:execute" ? { ...prev, preparedQuote: quote } : prev,
|
|
728
|
+
);
|
|
729
|
+
}}
|
|
723
730
|
request={screen.request}
|
|
724
731
|
wallet={screen.paymentMethod.payerWallet}
|
|
725
732
|
windowAdapter={webWindowAdapter}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { fireEvent, render, screen, waitFor } from "@testing-library/react";
|
|
2
|
+
import { beforeEach, describe, expect, it, vi } from "vitest";
|
|
3
|
+
import { TEST_CLIENT } from "~test/test-clients.js";
|
|
4
|
+
import type { WindowAdapter } from "../../../core/adapters/WindowAdapter.js";
|
|
5
|
+
import { CustomThemeProvider } from "../../../core/design-system/CustomThemeProvider.js";
|
|
6
|
+
import type {
|
|
7
|
+
BridgePrepareRequest,
|
|
8
|
+
BridgePrepareResult,
|
|
9
|
+
} from "../../../core/hooks/useBridgePrepare.js";
|
|
10
|
+
import { StepRunner } from "./StepRunner.js";
|
|
11
|
+
|
|
12
|
+
// Controllable executor + prepare seams so the test drives the retry branch
|
|
13
|
+
// purely off `onrampStatus`.
|
|
14
|
+
const { executor, retrySpy, refetchSpy, FRESH_QUOTE } = vi.hoisted(() => ({
|
|
15
|
+
executor: {
|
|
16
|
+
error: undefined as Error | undefined,
|
|
17
|
+
onrampStatus: undefined as
|
|
18
|
+
| "pending"
|
|
19
|
+
| "executing"
|
|
20
|
+
| "completed"
|
|
21
|
+
| "failed"
|
|
22
|
+
| undefined,
|
|
23
|
+
},
|
|
24
|
+
FRESH_QUOTE: {
|
|
25
|
+
id: "fresh-session",
|
|
26
|
+
link: "https://onramp.example.com/fresh",
|
|
27
|
+
type: "onramp",
|
|
28
|
+
},
|
|
29
|
+
refetchSpy: vi.fn(),
|
|
30
|
+
retrySpy: vi.fn(),
|
|
31
|
+
}));
|
|
32
|
+
|
|
33
|
+
vi.mock("../../../core/hooks/useStepExecutor.js", () => ({
|
|
34
|
+
useStepExecutor: () => ({
|
|
35
|
+
cancel: vi.fn(),
|
|
36
|
+
currentStep: undefined,
|
|
37
|
+
error: executor.error,
|
|
38
|
+
executionState: "idle" as const,
|
|
39
|
+
onrampStatus: executor.onrampStatus,
|
|
40
|
+
progress: 0,
|
|
41
|
+
retry: retrySpy,
|
|
42
|
+
start: vi.fn(),
|
|
43
|
+
steps: [],
|
|
44
|
+
}),
|
|
45
|
+
}));
|
|
46
|
+
|
|
47
|
+
vi.mock("../../../core/hooks/useBridgePrepare.js", async (importOriginal) => {
|
|
48
|
+
const actual =
|
|
49
|
+
await importOriginal<
|
|
50
|
+
typeof import("../../../core/hooks/useBridgePrepare.js")
|
|
51
|
+
>();
|
|
52
|
+
return { ...actual, useBridgePrepare: () => ({ refetch: refetchSpy }) };
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const ONRAMP_REQUEST: BridgePrepareRequest = {
|
|
56
|
+
chainId: 8453,
|
|
57
|
+
client: TEST_CLIENT,
|
|
58
|
+
onramp: "transak",
|
|
59
|
+
receiver: "0x0000000000000000000000000000000000000001",
|
|
60
|
+
tokenAddress: "0x0000000000000000000000000000000000000000",
|
|
61
|
+
type: "onramp",
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
const ONRAMP_QUOTE: Extract<BridgePrepareResult, { type: "onramp" }> = {
|
|
65
|
+
currency: "USD",
|
|
66
|
+
currencyAmount: 30,
|
|
67
|
+
destinationAmount: 30000000n,
|
|
68
|
+
destinationToken: {
|
|
69
|
+
address: "0x0000000000000000000000000000000000000000",
|
|
70
|
+
chainId: 8453,
|
|
71
|
+
decimals: 6,
|
|
72
|
+
name: "USD Coin",
|
|
73
|
+
prices: {},
|
|
74
|
+
symbol: "USDC",
|
|
75
|
+
},
|
|
76
|
+
id: "onramp-session-id",
|
|
77
|
+
intent: {
|
|
78
|
+
chainId: 8453,
|
|
79
|
+
onramp: "transak",
|
|
80
|
+
receiver: "0x0000000000000000000000000000000000000001",
|
|
81
|
+
tokenAddress: "0x0000000000000000000000000000000000000000",
|
|
82
|
+
},
|
|
83
|
+
link: "https://onramp.example.com/session",
|
|
84
|
+
steps: [],
|
|
85
|
+
type: "onramp",
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
function renderStepRunner() {
|
|
89
|
+
const onQuoteUpdate = vi.fn();
|
|
90
|
+
render(
|
|
91
|
+
<CustomThemeProvider theme="dark">
|
|
92
|
+
<StepRunner
|
|
93
|
+
autoStart={false}
|
|
94
|
+
client={TEST_CLIENT}
|
|
95
|
+
onBack={vi.fn()}
|
|
96
|
+
onCancel={vi.fn()}
|
|
97
|
+
onComplete={vi.fn()}
|
|
98
|
+
onQuoteUpdate={onQuoteUpdate}
|
|
99
|
+
preparedQuote={ONRAMP_QUOTE}
|
|
100
|
+
request={ONRAMP_REQUEST}
|
|
101
|
+
title={undefined}
|
|
102
|
+
wallet={undefined}
|
|
103
|
+
windowAdapter={{ open: vi.fn(async () => {}) } as WindowAdapter}
|
|
104
|
+
/>
|
|
105
|
+
</CustomThemeProvider>,
|
|
106
|
+
);
|
|
107
|
+
return { onQuoteUpdate };
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
describe("StepRunner onramp retry recovery", () => {
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
retrySpy.mockReset();
|
|
113
|
+
refetchSpy.mockReset();
|
|
114
|
+
refetchSpy.mockResolvedValue({ data: FRESH_QUOTE });
|
|
115
|
+
executor.error = new Error("Payment failed");
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
it("re-prepares a fresh session when a failed onramp is retried", async () => {
|
|
119
|
+
executor.onrampStatus = "failed";
|
|
120
|
+
const { onQuoteUpdate } = renderStepRunner();
|
|
121
|
+
|
|
122
|
+
fireEvent.click(screen.getByText("Retry"));
|
|
123
|
+
|
|
124
|
+
await waitFor(() => expect(refetchSpy).toHaveBeenCalledTimes(1));
|
|
125
|
+
// Must NOT replay the dead session in place.
|
|
126
|
+
expect(retrySpy).not.toHaveBeenCalled();
|
|
127
|
+
await waitFor(() =>
|
|
128
|
+
expect(onQuoteUpdate).toHaveBeenCalledWith(FRESH_QUOTE),
|
|
129
|
+
);
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
it("retries in place (never re-onramps) once the onramp has completed", async () => {
|
|
133
|
+
// A post-onramp transaction failed: funds already arrived, so re-onramping
|
|
134
|
+
// would double-charge the buyer.
|
|
135
|
+
executor.onrampStatus = "completed";
|
|
136
|
+
renderStepRunner();
|
|
137
|
+
|
|
138
|
+
fireEvent.click(screen.getByText("Retry"));
|
|
139
|
+
|
|
140
|
+
expect(retrySpy).toHaveBeenCalledTimes(1);
|
|
141
|
+
expect(refetchSpy).not.toHaveBeenCalled();
|
|
142
|
+
});
|
|
143
|
+
});
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { CheckIcon, ClockIcon, Cross1Icon } from "@radix-ui/react-icons";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
3
4
|
import type { RouteStep } from "../../../../bridge/types/Route.js";
|
|
4
5
|
import type { Chain } from "../../../../chains/types.js";
|
|
5
6
|
import { defineChain } from "../../../../chains/utils.js";
|
|
@@ -12,9 +13,11 @@ import {
|
|
|
12
13
|
radius,
|
|
13
14
|
spacing,
|
|
14
15
|
} from "../../../core/design-system/index.js";
|
|
15
|
-
import
|
|
16
|
-
BridgePrepareRequest,
|
|
17
|
-
BridgePrepareResult,
|
|
16
|
+
import {
|
|
17
|
+
type BridgePrepareRequest,
|
|
18
|
+
type BridgePrepareResult,
|
|
19
|
+
type UseBridgePrepareParams,
|
|
20
|
+
useBridgePrepare,
|
|
18
21
|
} from "../../../core/hooks/useBridgePrepare.js";
|
|
19
22
|
import {
|
|
20
23
|
type CompletedStatusResult,
|
|
@@ -70,9 +73,93 @@ type StepRunnerProps = {
|
|
|
70
73
|
* Prepared quote to use
|
|
71
74
|
*/
|
|
72
75
|
preparedQuote: BridgePrepareResult;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Called when the executing quote is replaced by a freshly prepared one
|
|
79
|
+
* (e.g. after retrying a failed onramp, which mints a new session). Lets the
|
|
80
|
+
* parent keep any state it derives from the quote — such as the success
|
|
81
|
+
* payload — in sync with the session that actually completed.
|
|
82
|
+
*/
|
|
83
|
+
onQuoteUpdate?: (preparedQuote: BridgePrepareResult) => void;
|
|
73
84
|
};
|
|
74
85
|
|
|
75
86
|
export function StepRunner({
|
|
87
|
+
preparedQuote,
|
|
88
|
+
request,
|
|
89
|
+
onQuoteUpdate,
|
|
90
|
+
...rest
|
|
91
|
+
}: StepRunnerProps) {
|
|
92
|
+
const theme = useCustomTheme();
|
|
93
|
+
|
|
94
|
+
// The quote currently being executed. A failed onramp replaces this with a
|
|
95
|
+
// freshly prepared session (see requestFreshOnramp) rather than replaying the
|
|
96
|
+
// dead one.
|
|
97
|
+
const [activeQuote, setActiveQuote] =
|
|
98
|
+
useState<BridgePrepareResult>(preparedQuote);
|
|
99
|
+
// Bumped whenever the active quote is replaced, to remount the executor with
|
|
100
|
+
// a clean slate: a fresh onramp session and reset status.
|
|
101
|
+
const [runKey, setRunKey] = useState(0);
|
|
102
|
+
const [isRepreparing, setIsRepreparing] = useState(false);
|
|
103
|
+
|
|
104
|
+
// Disabled query used only to imperatively mint a fresh quote on retry.
|
|
105
|
+
// refetch() bypasses the cache, so it always returns a new onramp session.
|
|
106
|
+
const reprepare = useBridgePrepare({
|
|
107
|
+
...(request as UseBridgePrepareParams),
|
|
108
|
+
enabled: false,
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
const requestFreshOnramp = useCallback(async () => {
|
|
112
|
+
setIsRepreparing(true);
|
|
113
|
+
const { data } = await reprepare.refetch();
|
|
114
|
+
setIsRepreparing(false);
|
|
115
|
+
if (data) {
|
|
116
|
+
setActiveQuote(data);
|
|
117
|
+
setRunKey((key) => key + 1);
|
|
118
|
+
onQuoteUpdate?.(data);
|
|
119
|
+
}
|
|
120
|
+
}, [reprepare, onQuoteUpdate]);
|
|
121
|
+
|
|
122
|
+
if (isRepreparing) {
|
|
123
|
+
return (
|
|
124
|
+
<Container
|
|
125
|
+
center="both"
|
|
126
|
+
flex="column"
|
|
127
|
+
fullHeight
|
|
128
|
+
px="md"
|
|
129
|
+
pb="md"
|
|
130
|
+
pt="md+"
|
|
131
|
+
>
|
|
132
|
+
<Spinner color="secondaryText" size="lg" />
|
|
133
|
+
<Spacer y="lg" />
|
|
134
|
+
<Text center color="secondaryText" size="sm">
|
|
135
|
+
Preparing a new payment session
|
|
136
|
+
</Text>
|
|
137
|
+
</Container>
|
|
138
|
+
);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return (
|
|
142
|
+
<StepExecution
|
|
143
|
+
key={runKey}
|
|
144
|
+
{...rest}
|
|
145
|
+
onRequestFreshOnramp={requestFreshOnramp}
|
|
146
|
+
preparedQuote={activeQuote}
|
|
147
|
+
request={request}
|
|
148
|
+
theme={theme}
|
|
149
|
+
/>
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
type StepExecutionProps = Omit<
|
|
154
|
+
StepRunnerProps,
|
|
155
|
+
"preparedQuote" | "onQuoteUpdate"
|
|
156
|
+
> & {
|
|
157
|
+
preparedQuote: BridgePrepareResult;
|
|
158
|
+
onRequestFreshOnramp: () => void;
|
|
159
|
+
theme: ReturnType<typeof useCustomTheme>;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
function StepExecution({
|
|
76
163
|
title,
|
|
77
164
|
request,
|
|
78
165
|
wallet,
|
|
@@ -83,9 +170,9 @@ export function StepRunner({
|
|
|
83
170
|
onBack,
|
|
84
171
|
autoStart,
|
|
85
172
|
preparedQuote,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
173
|
+
onRequestFreshOnramp,
|
|
174
|
+
theme,
|
|
175
|
+
}: StepExecutionProps) {
|
|
89
176
|
// Use the real step executor hook
|
|
90
177
|
const {
|
|
91
178
|
currentStep,
|
|
@@ -116,7 +203,15 @@ export function StepRunner({
|
|
|
116
203
|
};
|
|
117
204
|
|
|
118
205
|
const handleRetry = () => {
|
|
119
|
-
|
|
206
|
+
// A failed onramp (funds never moved) needs a fresh session, not a replay
|
|
207
|
+
// of the dead/expired one. Any other failure — including one after the
|
|
208
|
+
// onramp already completed — must retry in place: re-onramping there would
|
|
209
|
+
// charge the buyer a second time.
|
|
210
|
+
if (request.type === "onramp" && onrampStatus === "failed") {
|
|
211
|
+
onRequestFreshOnramp();
|
|
212
|
+
} else {
|
|
213
|
+
retry();
|
|
214
|
+
}
|
|
120
215
|
};
|
|
121
216
|
|
|
122
217
|
const getStepStatus = (
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "5.121.
|
|
1
|
+
export const version = "5.121.1";
|