@phala/pay 0.9.2 → 0.10.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/README.md +95 -35
- package/dist/checkout.d.ts +12 -4
- package/dist/checkout.d.ts.map +1 -1
- package/dist/checkout.js +64 -15
- package/dist/checkout.js.map +1 -1
- package/dist/client.d.ts +4 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +5 -0
- package/dist/client.js.map +1 -1
- package/dist/deposit-address.d.ts.map +1 -1
- package/dist/deposit-address.js +1 -0
- package/dist/deposit-address.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/quote.d.ts +2 -0
- package/dist/quote.d.ts.map +1 -1
- package/dist/quote.js +3 -0
- package/dist/quote.js.map +1 -1
- package/dist/transactions.d.ts +21 -0
- package/dist/transactions.d.ts.map +1 -0
- package/dist/transactions.js +39 -0
- package/dist/transactions.js.map +1 -0
- package/dist/wallet.d.ts.map +1 -1
- package/dist/wallet.js +4 -1
- package/dist/wallet.js.map +1 -1
- package/package.json +1 -1
- package/src/checkout.ts +72 -14
- package/src/client.ts +11 -0
- package/src/deposit-address.ts +1 -0
- package/src/index.ts +2 -0
- package/src/quote.ts +5 -0
- package/src/transactions.ts +54 -0
- package/src/wallet.ts +4 -1
package/README.md
CHANGED
|
@@ -57,7 +57,7 @@ connects a wallet with wagmi, RainbowKit, ConnectKit, or AppKit, pass it in inst
|
|
|
57
57
|
3. Credit the account when your webhook endpoint receives `deposit.credited`. `onSuccess` is for the
|
|
58
58
|
UI only: the browser is not a trusted source of payment.
|
|
59
59
|
|
|
60
|
-
The component reads `GET /v1/quotes/{id}?client_secret=…` every three seconds. That endpoint is
|
|
60
|
+
The component reads `GET /v1/quotes/{id}?client_secret=…` about every three seconds. That endpoint is
|
|
61
61
|
public (`Access-Control-Allow-Origin: *`) and shows only what the payer needs: the amount, the
|
|
62
62
|
token, the chain, the deposit address, the EIP-681 payment request, the expiry, and the payment
|
|
63
63
|
status. Keep the client secret out of logs and URLs you share; anyone holding it can see that view.
|
|
@@ -66,6 +66,17 @@ address, the checkout shows "This payment address could not be verified" and not
|
|
|
66
66
|
compromised service cannot make the page show its own address). A test-mode quote says "Test
|
|
67
67
|
mode".
|
|
68
68
|
|
|
69
|
+
Checkout and React deposit-address polling apply uniform ±20% jitter to normal intervals and
|
|
70
|
+
failure backoff, while respecting `Retry-After`. Hidden tabs pause polling and read immediately
|
|
71
|
+
when visible again. Jittered delays are capped at 30 seconds; a longer `Retry-After` remains
|
|
72
|
+
a minimum. The checkout core also works without `document`. `pollInterval` sets the
|
|
73
|
+
normal polling interval. Explicit `checkout.refresh()` still reads immediately while hidden,
|
|
74
|
+
including the post-broadcast refresh used by `<Checkout>`.
|
|
75
|
+
`pollInterval` is in milliseconds (default 3000). Other than 408/429, non-terminal 4xx responses
|
|
76
|
+
stop checkout polling after three consecutive occurrences and surface the existing `error`
|
|
77
|
+
state. Success or another kind of failure resets that count. An unknown client secret (404)
|
|
78
|
+
still stops immediately.
|
|
79
|
+
|
|
69
80
|
### Statuses
|
|
70
81
|
|
|
71
82
|
| `status` | Shown |
|
|
@@ -78,12 +89,17 @@ mode".
|
|
|
78
89
|
| `rejected` | Will not be credited; the payer contacts support |
|
|
79
90
|
| `reversed` | A reorganization before finality replaced the credited payment |
|
|
80
91
|
| `expired`, `canceled` | The address is hidden; `onExpire` is called once |
|
|
81
|
-
| `error` | Invalid client secret or
|
|
92
|
+
| `error` | Invalid client secret, address mismatch, or three consecutive non-retryable 4xx; nothing to pay |
|
|
82
93
|
|
|
83
94
|
`onChange(state)` is called once per status change with `{ status, quote, error }`, like Stripe
|
|
84
95
|
Elements' `onChange`, for example to hide your own "new payment" control while a payment is
|
|
85
96
|
`seen` or `confirming`.
|
|
86
97
|
|
|
98
|
+
`CheckoutError` exposes `code`, `message`, and optional readonly fields `status` (the HTTP status
|
|
99
|
+
when the error came from a response), `requestId` (the response's `Request-Id`), and `retryAfter`
|
|
100
|
+
(seconds to wait before the next read). `status` is `undefined` for network errors and errors
|
|
101
|
+
created without a response.
|
|
102
|
+
|
|
87
103
|
Before the wallet tab sends a payment, it reads the wallet's token balance; when the wallet holds
|
|
88
104
|
less than the quote, it sends nothing (the transfer would revert and still cost gas) and says how
|
|
89
105
|
much the wallet holds. `onWalletError(error, wallet)` is called with the `WalletError` and the
|
|
@@ -107,6 +123,9 @@ amount, or after expiry, is still credited, at the market price instead of the q
|
|
|
107
123
|
checkout then says so ("Payment credited: $10.00 of $25.00"), and `onSuccess` receives the quote
|
|
108
124
|
with what was credited as `amount_credited`, beside the quoted `amount`.
|
|
109
125
|
|
|
126
|
+
Checkout opens the QR code tab when no browser wallet is discovered; the Wallet tab remains
|
|
127
|
+
available.
|
|
128
|
+
|
|
110
129
|
### Your own wallet connection
|
|
111
130
|
|
|
112
131
|
By default the wallet tab lists the browser's wallets. If your page already connects one, pass its
|
|
@@ -157,11 +176,24 @@ import { DepositAddress } from "@phala/pay-react";
|
|
|
157
176
|
/>;
|
|
158
177
|
```
|
|
159
178
|
|
|
160
|
-
With `clientSecret` and `apiBase` it reads the address's public view every three seconds and
|
|
161
|
-
its payments of the last 24 hours: "1.5 PHA received on Sepolia, 1 confirmation"
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
179
|
+
With `clientSecret` and `apiBase` it reads the address's public view about every three seconds and
|
|
180
|
+
lists its payments of the last 24 hours: "1.5 PHA received on Sepolia, 1 confirmation" once the
|
|
181
|
+
service sees the transfer (within about a block for a hinted payment, at the next discovery scan
|
|
182
|
+
otherwise), then "credited" (or rejected or reversed). Display only. It also states when each
|
|
183
|
+
network's payments are usually credited: `<DepositAddress>` submits no transaction-hash hint (the
|
|
184
|
+
payer's wallet or exchange gives it no hash), so the service's 5-minute discovery scan plus the
|
|
185
|
+
view's `typical_credit_seconds` ("usually within about 6 minutes on Sepolia and about 5 minutes on
|
|
186
|
+
Base Sepolia"); until the view is loaded it names no time.
|
|
187
|
+
|
|
188
|
+
After ten minutes without a change in the public view, `<DepositAddress>` uses a base interval
|
|
189
|
+
of `max(pollInterval, 15000)` milliseconds, with the same jitter and failure backoff, so a longer
|
|
190
|
+
configured interval stays unchanged. Any view change or visibility regain resets
|
|
191
|
+
the idle window and restores `pollInterval`. Optional `onChange(state)` receives the existing
|
|
192
|
+
`ClientDepositAddress` public view after the first successful read and then once per content change,
|
|
193
|
+
including payment confirmations and network credit times. Unlike `<Checkout onChange>`, it does
|
|
194
|
+
not report loading. Unchanged polls, callback replacements,
|
|
195
|
+
and reconnecting alone do not trigger it. Use it to update your page without additional polling;
|
|
196
|
+
fulfil from the `deposit.credited` webhook.
|
|
165
197
|
|
|
166
198
|
`depositAddressTransfer(network, asset)` reads and checks one token's amount-less EIP-681
|
|
167
199
|
`payment_uri` without React.
|
|
@@ -179,18 +211,29 @@ on Sepolia and about 7 seconds on Base Sepolia"); until the view is loaded it na
|
|
|
179
211
|
/>
|
|
180
212
|
```
|
|
181
213
|
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
|
188
|
-
|
|
|
189
|
-
| `--pp-color-
|
|
190
|
-
| `--pp-color-
|
|
191
|
-
| `--pp-color-
|
|
192
|
-
| `--pp-
|
|
193
|
-
| `--pp-
|
|
214
|
+
The default theme is neutral, like a form native to your page: a near-black (dark theme:
|
|
215
|
+
near-white) primary color, zinc greys, and your page's font. The components draw no frame or
|
|
216
|
+
background and fill their container's width: place them in your own card or dialog, and pick
|
|
217
|
+
the theme (or map the colors) that suits its background.
|
|
218
|
+
|
|
219
|
+
| CSS custom property | Light default | Dark default | Use |
|
|
220
|
+
| ------------------------------- | ----------------- | ------------ | --------------------------------------------------- |
|
|
221
|
+
| `--pp-color-surface` | `#f4f4f5` | `#18181b` | Status row, loading placeholder, copy button hover |
|
|
222
|
+
| `--pp-color-text` | `#18181b` | `#fafafa` | Text |
|
|
223
|
+
| `--pp-color-text-muted` | `#52525b` | `#a1a1aa` | Labels, hints, in-progress status icon |
|
|
224
|
+
| `--pp-color-border` | `#e4e4e7` | `#27272a` | Dividers and the QR code's frame |
|
|
225
|
+
| `--pp-color-input` | `#8a8a93` | `#71717a` | Edges of the network and token choices |
|
|
226
|
+
| `--pp-color-primary` | `#171717` | `#fafafa` | Pay button, selected tab and choice |
|
|
227
|
+
| `--pp-color-primary-foreground` | `#fafafa` | `#18181b` | Text on the primary color |
|
|
228
|
+
| `--pp-color-focus` | `#2563eb` | `#60a5fa` | Keyboard focus ring |
|
|
229
|
+
| `--pp-color-success` | `#15803d` | `#4ade80` | Credited icon |
|
|
230
|
+
| `--pp-color-warning` | `#b45309` | `#fbbf24` | "Test mode" |
|
|
231
|
+
| `--pp-color-danger` | `#dc2626` | `#f87171` | Failure icon, wallet errors |
|
|
232
|
+
| `--pp-font-family` | inherited | inherited | Font |
|
|
233
|
+
| `--pp-font-family-mono` | `ui-monospace, …` | same | Addresses, amounts to copy, hashes |
|
|
234
|
+
| `--pp-font-size` | `14px` | `14px` | Root text size; other text sizes are relative to it |
|
|
235
|
+
| `--pp-radius` | `8px` | `8px` | Corner radius of controls and the status row |
|
|
236
|
+
| `--pp-control-height` | `44px` | `44px` | Minimum height of the pay button, tabs, and choices |
|
|
194
237
|
|
|
195
238
|
Import the static stylesheet once in your application entry point:
|
|
196
239
|
|
|
@@ -198,28 +241,43 @@ Import the static stylesheet once in your application entry point:
|
|
|
198
241
|
import "@phala/pay-react/styles.css";
|
|
199
242
|
```
|
|
200
243
|
|
|
201
|
-
Set these CSS custom properties in your own stylesheet, after the SDK stylesheet,
|
|
202
|
-
|
|
203
|
-
`--pp-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
`--pp-
|
|
207
|
-
|
|
208
|
-
`var(--pp-color-background)`. Checkout opens QR code when no browser wallet is discovered;
|
|
209
|
-
the Wallet tab remains available.
|
|
244
|
+
Set these CSS custom properties in your own stylesheet, after the SDK stylesheet, on
|
|
245
|
+
`.pp-root[data-theme]`; they are the supported way to theme the components. Pair a light primary
|
|
246
|
+
color with a dark `--pp-color-primary-foreground`. Set `--pp-font-size: 1em` to follow your
|
|
247
|
+
page's text size. Keep `--pp-color-focus` distinct from `--pp-color-primary`, with at least 3:1
|
|
248
|
+
contrast to the background: it is how a keyboard user tells the focused choice from the selected
|
|
249
|
+
one. Keep `--pp-color-input` at 3:1 or more against the background too, as WCAG 1.4.11 asks of the
|
|
250
|
+
edge that shows where a control is; `--pp-color-border` draws only dividers and may be fainter.
|
|
210
251
|
|
|
211
252
|
```css
|
|
212
253
|
.pp-root[data-theme] {
|
|
213
254
|
--pp-color-primary: #cdfa50;
|
|
214
|
-
--pp-
|
|
215
|
-
--pp-
|
|
255
|
+
--pp-color-primary-foreground: #161616;
|
|
256
|
+
--pp-color-focus: #2563eb;
|
|
257
|
+
--pp-radius: 12px;
|
|
216
258
|
}
|
|
217
259
|
```
|
|
218
260
|
|
|
219
|
-
To map your own light/dark tokens
|
|
220
|
-
|
|
221
|
-
`.pp-root[data-theme="dark"]` overrides a plain `.pp-root` mapping
|
|
222
|
-
|
|
261
|
+
To map your own light/dark tokens, omit `appearance.theme` and load your mapping after the SDK
|
|
262
|
+
stylesheet. Passing `theme: "dark"` sets `data-theme="dark"`, whose SDK selector
|
|
263
|
+
`.pp-root[data-theme="dark"]` overrides a plain `.pp-root` mapping, so target
|
|
264
|
+
`.pp-root[data-theme]` in your mapping. Without `theme`, defaults suit light backgrounds only; on
|
|
265
|
+
dark hosts map every color variable: one left unmapped keeps its light default (a light status
|
|
266
|
+
row on a dark card, for example). Mappings written for earlier releases use renamed variables, which
|
|
267
|
+
are silently ignored: `--pp-color-text-secondary` is now `--pp-color-text-muted`; see the CHANGELOG
|
|
268
|
+
for the others.
|
|
269
|
+
|
|
270
|
+
The components draw no frame or background: give the card or dialog around them inner padding of
|
|
271
|
+
at least 4px, so that the 2px focus outline (offset by 2px) is not clipped by `overflow: hidden`.
|
|
272
|
+
|
|
273
|
+
The components show a payer's receive address and token contract in full, in groups of four
|
|
274
|
+
characters after `0x` (`0x5290 8400 0985 …`), never shortened, so that a payer can compare it
|
|
275
|
+
group by group with what their wallet shows; selecting and copying it gives the address without
|
|
276
|
+
spaces. The QR code keeps the standard quiet zone of four modules inside 8px of white, so it scans
|
|
277
|
+
on a dark page too. The status row's text stays the body color on a neutral surface; its icon
|
|
278
|
+
carries the tone. Transitions and the loading placeholder's pulse stop under
|
|
279
|
+
`prefers-reduced-motion: reduce`, and the selected choice and tab keep a system color in
|
|
280
|
+
forced-colors mode.
|
|
223
281
|
|
|
224
282
|
### Content Security Policy
|
|
225
283
|
|
|
@@ -277,7 +335,9 @@ Install `@phala/pay-react` for `Checkout`, `DepositAddress`, hooks, icons, and s
|
|
|
277
335
|
npm install @phala/pay-react react react-dom @phala/pay viem
|
|
278
336
|
```
|
|
279
337
|
|
|
280
|
-
Import components from `@phala/pay-react` and styles from `@phala/pay-react/styles.css`.
|
|
338
|
+
Import components from `@phala/pay-react` and styles from `@phala/pay-react/styles.css`. Import
|
|
339
|
+
the server client and API types from `@phala/pay-server`, and offline helpers from
|
|
340
|
+
`@phala/pay-server/helpers`; see its [README](../js-server/README.md).
|
|
281
341
|
|
|
282
342
|
The checkout session retains its last known status and quote during temporary network/5xx outages
|
|
283
343
|
and exposes `reconnecting: true` with no permanent error. Polling resumes with bounded backoff and
|
package/dist/checkout.d.ts
CHANGED
|
@@ -15,6 +15,8 @@ import { type ClientQuote } from "./quote.js";
|
|
|
15
15
|
export type CheckoutStatus = "loading" | "waiting" | "seen" | "confirming" | "credited" | "rejected" | "reversed" | "expired" | "canceled" | "error";
|
|
16
16
|
export type CheckoutErrorCode = "invalid_client_secret" | "address_mismatch" | "rate_limited" | "network_error" | "service_unavailable" | "invalid_response" | "api_error";
|
|
17
17
|
export interface CheckoutErrorOptions extends ErrorOptions {
|
|
18
|
+
/** The HTTP status, when the error came from a response. */
|
|
19
|
+
status?: number;
|
|
18
20
|
/** The failed response's `Request-Id`, `req_…`, to quote to support. */
|
|
19
21
|
requestId?: string;
|
|
20
22
|
/** For `rate_limited`: the seconds the service asked to wait (`Retry-After`). */
|
|
@@ -23,6 +25,8 @@ export interface CheckoutErrorOptions extends ErrorOptions {
|
|
|
23
25
|
export declare class CheckoutError extends Error {
|
|
24
26
|
readonly code: CheckoutErrorCode;
|
|
25
27
|
readonly name = "CheckoutError";
|
|
28
|
+
/** The HTTP status, when the error came from a response. */
|
|
29
|
+
readonly status?: number;
|
|
26
30
|
/** The failed response's `Request-Id`, when the service answered. */
|
|
27
31
|
readonly requestId: string | undefined;
|
|
28
32
|
/** For `rate_limited`: the seconds to wait before the next read. */
|
|
@@ -30,12 +34,16 @@ export declare class CheckoutError extends Error {
|
|
|
30
34
|
constructor(code: CheckoutErrorCode, message: string, options?: CheckoutErrorOptions);
|
|
31
35
|
}
|
|
32
36
|
/**
|
|
33
|
-
* The error of a failed read of a public view, with the response's `Request-Id`
|
|
34
|
-
* its `Retry-After`.
|
|
37
|
+
* The error of a failed read of a public view, with the response's HTTP status, `Request-Id`
|
|
38
|
+
* and, on `429`, its `Retry-After`.
|
|
35
39
|
*/
|
|
36
40
|
export declare function responseError(response: Response, notFound: string): CheckoutError;
|
|
37
|
-
/**
|
|
38
|
-
|
|
41
|
+
/**
|
|
42
|
+
* The next read's delay with uniform ±20% jitter capped at MAX_BACKOFF after jitter.
|
|
43
|
+
* Retry-After remains a minimum, even when it asks for longer than the backoff cap.
|
|
44
|
+
* `random` defaults to Math.random and can be injected for deterministic tests.
|
|
45
|
+
*/
|
|
46
|
+
export declare function pollDelay(interval: number, failures: number, error: CheckoutError | null, random?: () => number): number;
|
|
39
47
|
export interface CheckoutState {
|
|
40
48
|
status: CheckoutStatus;
|
|
41
49
|
/** The last known view is retained while polling reconnects after a temporary outage. */
|
package/dist/checkout.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkout.d.ts","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"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"}
|
package/dist/checkout.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { bindQuoteSubmission } from "./transactions.js";
|
|
1
2
|
import { requestSignal, trimTrailingSlashes } from "./request.js";
|
|
2
3
|
import { getAddress, isAddress, isAddressEqual } from "viem";
|
|
3
4
|
import { parseClientQuote, quoteIdFromClientSecret } from "./quote.js";
|
|
4
5
|
export class CheckoutError extends Error {
|
|
5
6
|
code;
|
|
6
7
|
name = "CheckoutError";
|
|
8
|
+
/** The HTTP status, when the error came from a response. */
|
|
9
|
+
status;
|
|
7
10
|
/** The failed response's `Request-Id`, when the service answered. */
|
|
8
11
|
requestId;
|
|
9
12
|
/** For `rate_limited`: the seconds to wait before the next read. */
|
|
@@ -11,40 +14,49 @@ export class CheckoutError extends Error {
|
|
|
11
14
|
constructor(code, message, options) {
|
|
12
15
|
super(message, options);
|
|
13
16
|
this.code = code;
|
|
17
|
+
if (options?.status !== undefined) {
|
|
18
|
+
this.status = options.status;
|
|
19
|
+
}
|
|
14
20
|
this.requestId = options?.requestId;
|
|
15
21
|
this.retryAfter = options?.retryAfter;
|
|
16
22
|
}
|
|
17
23
|
}
|
|
18
24
|
/**
|
|
19
|
-
* The error of a failed read of a public view, with the response's `Request-Id`
|
|
20
|
-
* its `Retry-After`.
|
|
25
|
+
* The error of a failed read of a public view, with the response's HTTP status, `Request-Id`
|
|
26
|
+
* and, on `429`, its `Retry-After`.
|
|
21
27
|
*/
|
|
22
28
|
export function responseError(response, notFound) {
|
|
23
29
|
const header = response.headers.get("request-id");
|
|
24
|
-
const
|
|
30
|
+
const options = { status: response.status, ...(header === null ? {} : { requestId: header }) };
|
|
25
31
|
if (response.status === 404) {
|
|
26
|
-
return new CheckoutError("invalid_client_secret", notFound,
|
|
32
|
+
return new CheckoutError("invalid_client_secret", notFound, options);
|
|
27
33
|
}
|
|
28
34
|
if (response.status >= 500) {
|
|
29
35
|
const seconds = Number(response.headers.get("retry-after"));
|
|
30
36
|
return new CheckoutError("service_unavailable", "the payment service is temporarily unavailable", {
|
|
31
|
-
...
|
|
37
|
+
...options,
|
|
32
38
|
...(Number.isFinite(seconds) && seconds > 0 ? { retryAfter: seconds } : {}),
|
|
33
39
|
});
|
|
34
40
|
}
|
|
35
41
|
if (response.status === 429) {
|
|
36
42
|
const seconds = Number(response.headers.get("retry-after"));
|
|
37
43
|
return new CheckoutError("rate_limited", "too many status requests", {
|
|
38
|
-
...
|
|
44
|
+
...options,
|
|
39
45
|
...(Number.isFinite(seconds) && seconds > 0 ? { retryAfter: seconds } : {}),
|
|
40
46
|
});
|
|
41
47
|
}
|
|
42
|
-
return new CheckoutError("api_error", `the payment service answered ${response.status}`,
|
|
48
|
+
return new CheckoutError("api_error", `the payment service answered ${response.status}`, options);
|
|
43
49
|
}
|
|
44
|
-
/**
|
|
45
|
-
|
|
50
|
+
/**
|
|
51
|
+
* The next read's delay with uniform ±20% jitter capped at MAX_BACKOFF after jitter.
|
|
52
|
+
* Retry-After remains a minimum, even when it asks for longer than the backoff cap.
|
|
53
|
+
* `random` defaults to Math.random and can be injected for deterministic tests.
|
|
54
|
+
*/
|
|
55
|
+
export function pollDelay(interval, failures, error, random = Math.random) {
|
|
46
56
|
const backoff = failures === 0 ? interval : Math.min(interval * 2 ** failures, MAX_BACKOFF);
|
|
47
|
-
|
|
57
|
+
const retryAfter = (error?.retryAfter ?? 0) * 1000;
|
|
58
|
+
const jittered = Math.max(backoff, retryAfter) * (0.8 + 0.4 * random());
|
|
59
|
+
return Math.max(Math.min(jittered, MAX_BACKOFF), retryAfter);
|
|
48
60
|
}
|
|
49
61
|
const DEFAULT_POLL_INTERVAL = 3000;
|
|
50
62
|
const MAX_BACKOFF = 30_000;
|
|
@@ -75,11 +87,17 @@ export async function retrieveQuote(options) {
|
|
|
75
87
|
catch (cause) {
|
|
76
88
|
throw new CheckoutError("invalid_response", "unexpected response from the payment service", {
|
|
77
89
|
cause,
|
|
90
|
+
status: response.status,
|
|
78
91
|
});
|
|
79
92
|
}
|
|
80
93
|
if (!isAddressEqual(getAddress(quote.address), expected)) {
|
|
81
|
-
throw new CheckoutError("address_mismatch", "the quote's address is not the one the merchant expects");
|
|
94
|
+
throw new CheckoutError("address_mismatch", "the quote's address is not the one the merchant expects", { status: response.status });
|
|
82
95
|
}
|
|
96
|
+
bindQuoteSubmission(quote, {
|
|
97
|
+
apiBase: options.apiBase, clientSecret: options.clientSecret,
|
|
98
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
99
|
+
...(options.requestTimeout === undefined ? {} : { requestTimeout: options.requestTimeout }),
|
|
100
|
+
});
|
|
83
101
|
return quote;
|
|
84
102
|
}
|
|
85
103
|
function expectedAddress(value) {
|
|
@@ -117,9 +135,11 @@ export function createCheckout(options) {
|
|
|
117
135
|
const now = options.now ?? Date.now;
|
|
118
136
|
const interval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;
|
|
119
137
|
const listeners = new Set();
|
|
138
|
+
const visibilityDocument = typeof document === "undefined" ? undefined : document;
|
|
120
139
|
let state = { status: "loading", quote: null, error: null };
|
|
121
140
|
let timer;
|
|
122
141
|
let failures = 0;
|
|
142
|
+
let clientFailures = 0;
|
|
123
143
|
let lastFailure = null;
|
|
124
144
|
let destroyed = false;
|
|
125
145
|
let inFlight;
|
|
@@ -153,6 +173,7 @@ export function createCheckout(options) {
|
|
|
153
173
|
return;
|
|
154
174
|
}
|
|
155
175
|
failures = 0;
|
|
176
|
+
clientFailures = 0;
|
|
156
177
|
lastFailure = null;
|
|
157
178
|
setState({ status: checkoutStatus(quote, now() / 1000), quote, error: null });
|
|
158
179
|
}
|
|
@@ -164,6 +185,14 @@ export function createCheckout(options) {
|
|
|
164
185
|
? cause
|
|
165
186
|
: new CheckoutError("network_error", "could not reach the payment service", { cause });
|
|
166
187
|
failures += 1;
|
|
188
|
+
clientFailures =
|
|
189
|
+
error.status !== undefined &&
|
|
190
|
+
error.status >= 400 &&
|
|
191
|
+
error.status < 500 &&
|
|
192
|
+
error.status !== 408 &&
|
|
193
|
+
error.status !== 429
|
|
194
|
+
? clientFailures + 1
|
|
195
|
+
: 0;
|
|
167
196
|
lastFailure = error;
|
|
168
197
|
const quote = state.quote;
|
|
169
198
|
if (error.code === "address_mismatch") {
|
|
@@ -173,6 +202,9 @@ export function createCheckout(options) {
|
|
|
173
202
|
else if (error.code === "invalid_client_secret") {
|
|
174
203
|
setState({ status: "error", quote, error });
|
|
175
204
|
}
|
|
205
|
+
else if (clientFailures >= 3) {
|
|
206
|
+
setState({ status: "error", quote, error });
|
|
207
|
+
}
|
|
176
208
|
else if (error.code === "network_error" || error.code === "service_unavailable") {
|
|
177
209
|
// Do not infer expiry or discard the payer's view while chain progress is unknown.
|
|
178
210
|
setState({ status: state.status, quote, error: null, reconnecting: true });
|
|
@@ -196,15 +228,32 @@ export function createCheckout(options) {
|
|
|
196
228
|
return inFlight;
|
|
197
229
|
}
|
|
198
230
|
function schedule() {
|
|
199
|
-
|
|
231
|
+
clearTimeout(timer);
|
|
232
|
+
if (finished() || visibilityDocument?.visibilityState === "hidden") {
|
|
200
233
|
return;
|
|
201
234
|
}
|
|
202
235
|
const delay = pollDelay(interval, failures, lastFailure);
|
|
203
236
|
timer = setTimeout(() => {
|
|
204
|
-
|
|
237
|
+
if (!finished() && visibilityDocument?.visibilityState !== "hidden") {
|
|
238
|
+
void refresh().then(schedule);
|
|
239
|
+
}
|
|
205
240
|
}, delay);
|
|
206
241
|
}
|
|
207
|
-
|
|
242
|
+
function visibilityChanged() {
|
|
243
|
+
clearTimeout(timer);
|
|
244
|
+
if (visibilityDocument?.visibilityState !== "hidden" && !finished()) {
|
|
245
|
+
void refresh().then(schedule);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
function stopPolling() {
|
|
249
|
+
clearTimeout(timer);
|
|
250
|
+
visibilityDocument?.removeEventListener("visibilitychange", visibilityChanged);
|
|
251
|
+
}
|
|
252
|
+
visibilityDocument?.addEventListener("visibilitychange", visibilityChanged);
|
|
253
|
+
signal.addEventListener("abort", stopPolling, { once: true });
|
|
254
|
+
if (visibilityDocument?.visibilityState !== "hidden") {
|
|
255
|
+
void refresh().then(schedule);
|
|
256
|
+
}
|
|
208
257
|
return {
|
|
209
258
|
getState: () => state,
|
|
210
259
|
subscribe(listener) {
|
|
@@ -217,7 +266,7 @@ export function createCheckout(options) {
|
|
|
217
266
|
destroy() {
|
|
218
267
|
destroyed = true;
|
|
219
268
|
controller.abort();
|
|
220
|
-
|
|
269
|
+
stopPolling();
|
|
221
270
|
listeners.clear();
|
|
222
271
|
},
|
|
223
272
|
};
|
package/dist/checkout.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkout.js","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAoB,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"checkout.js","sourceRoot":"","sources":["../src/checkout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAoB,MAAM,YAAY,CAAC;AA6CzF,MAAM,OAAO,aAAc,SAAQ,KAAK;IAU3B;IATO,IAAI,GAAG,eAAe,CAAC;IACzC,4DAA4D;IACnD,MAAM,CAAU;IACzB,qEAAqE;IAC5D,SAAS,CAAqB;IACvC,oEAAoE;IAC3D,UAAU,CAAqB;IAExC,YACW,IAAuB,EAChC,OAAe,EACf,OAA8B;QAE9B,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAJf,SAAI,GAAJ,IAAI,CAAmB;QAKhC,IAAI,OAAO,EAAE,MAAM,KAAK,SAAS,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC/B,CAAC;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,EAAE,SAAS,CAAC;QACpC,IAAI,CAAC,UAAU,GAAG,OAAO,EAAE,UAAU,CAAC;IACxC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAkB,EAAE,QAAgB;IAChE,MAAM,MAAM,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAC/F,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,OAAO,IAAI,aAAa,CAAC,uBAAuB,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,aAAa,CAAC,qBAAqB,EAAE,gDAAgD,EAAE;YAChG,GAAG,OAAO;YACV,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;QAC5B,MAAM,OAAO,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC;QAC5D,OAAO,IAAI,aAAa,CAAC,cAAc,EAAE,0BAA0B,EAAE;YACnE,GAAG,OAAO;YACV,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC5E,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,aAAa,CACtB,WAAW,EACX,gCAAgC,QAAQ,CAAC,MAAM,EAAE,EACjD,OAAO,CACR,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CACvB,QAAgB,EAChB,QAAgB,EAChB,KAA2B,EAC3B,SAAuB,IAAI,CAAC,MAAM;IAElC,MAAM,OAAO,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,GAAG,CAAC,IAAI,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC5F,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE,UAAU,IAAI,CAAC,CAAC,GAAG,IAAI,CAAC;IACnD,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,GAAG,MAAM,EAAE,CAAC,CAAC;IACxE,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE,WAAW,CAAC,EAAE,UAAU,CAAC,CAAC;AAC/D,CAAC;AA2CD,MAAM,qBAAqB,GAAG,IAAI,CAAC;AACnC,MAAM,WAAW,GAAG,MAAM,CAAC;AAc3B;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAA6B;IAC/D,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,IAAI,cAAc,OAAO,kBAAkB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IACrG,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QACpC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,aAAa,CAAC,QAAQ,EAAE,2CAA2C,CAAC,CAAC;IAC7E,CAAC;IACD,IAAI,KAAkB,CAAC;IACvB,IAAI,CAAC;QACH,KAAK,GAAG,gBAAgB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAClD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,8CAA8C,EAAE;YAC1F,KAAK;YACL,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,aAAa,CACrB,kBAAkB,EAClB,yDAAyD,EACzD,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,CAC5B,CAAC;IACJ,CAAC;IACD,mBAAmB,CAAC,KAAK,EAAE;QACzB,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY;QAC5D,GAAG,CAAC,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC;QAChE,GAAG,CAAC,OAAO,CAAC,cAAc,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC;KAC5F,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,eAAe,CAAC,KAAa;IACpC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QACzC,MAAM,IAAI,SAAS,CAAC,mCAAmC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC;AAED,0DAA0D;AAC1D,MAAM,UAAU,cAAc,CAAC,KAAkB,EAAE,UAAkB;IACnE,IAAI,KAAK,CAAC,cAAc,KAAK,MAAM,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,cAAc,CAAC;IAC9B,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAChC,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,UAAU,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC;AAC5D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,OAAwB;IACrD,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9C,eAAe,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IACzC,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,MAAM,GACV,OAAO,CAAC,MAAM,KAAK,SAAS;QAC1B,CAAC,CAAC,UAAU,CAAC,MAAM;QACnB,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,OAAO,CAAC,YAAY,IAAI,qBAAqB,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC5D,MAAM,kBAAkB,GAAG,OAAO,QAAQ,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC;IAElF,IAAI,KAAK,GAAkB,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAC3E,IAAI,KAAgD,CAAC;IACrD,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,WAAW,GAAyB,IAAI,CAAC;IAC7C,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,IAAI,QAAmC,CAAC;IAExC,SAAS,QAAQ,CAAC,IAAmB;QACnC,IACE,IAAI,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;YAC5B,IAAI,CAAC,YAAY,KAAK,KAAK,CAAC,YAAY;YACxC,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK;YAC1B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAC1D,CAAC;YACD,OAAO;QACT,CAAC;QACD,KAAK,GAAG,IAAI,CAAC;QACb,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAED,SAAS,QAAQ;QACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC;QAChC,OAAO,CACL,SAAS;YACT,MAAM,CAAC,OAAO;YACd,MAAM,KAAK,OAAO;YAClB,MAAM,KAAK,UAAU;YACrB,MAAM,KAAK,UAAU;YACrB,MAAM,KAAK,UAAU;YACrB,MAAM,KAAK,UAAU;YACrB,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC,CACtD,CAAC;IACJ,CAAC;IAED,KAAK,UAAU,IAAI;QACjB,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;YAC1D,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,QAAQ,GAAG,CAAC,CAAC;YACb,cAAc,GAAG,CAAC,CAAC;YACnB,WAAW,GAAG,IAAI,CAAC;YACnB,QAAQ,CAAC,EAAE,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAChC,OAAO;YACT,CAAC;YACD,MAAM,KAAK,GACT,KAAK,YAAY,aAAa;gBAC5B,CAAC,CAAC,KAAK;gBACP,CAAC,CAAC,IAAI,aAAa,CAAC,eAAe,EAAE,qCAAqC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC3F,QAAQ,IAAI,CAAC,CAAC;YACd,cAAc;gBACZ,KAAK,CAAC,MAAM,KAAK,SAAS;oBAC1B,KAAK,CAAC,MAAM,IAAI,GAAG;oBACnB,KAAK,CAAC,MAAM,GAAG,GAAG;oBAClB,KAAK,CAAC,MAAM,KAAK,GAAG;oBACpB,KAAK,CAAC,MAAM,KAAK,GAAG;oBAClB,CAAC,CAAC,cAAc,GAAG,CAAC;oBACpB,CAAC,CAAC,CAAC,CAAC;YACR,WAAW,GAAG,KAAK,CAAC;YACpB,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;gBACtC,wEAAwE;gBACxE,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACpD,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,uBAAuB,EAAE,CAAC;gBAClD,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,cAAc,IAAI,CAAC,EAAE,CAAC;gBAC/B,QAAQ,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;YAC9C,CAAC;iBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,IAAI,KAAK,CAAC,IAAI,KAAK,qBAAqB,EAAE,CAAC;gBAClF,mFAAmF;gBACnF,QAAQ,CAAC,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC;oBACP,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;oBAC3E,KAAK;oBACL,KAAK;iBACN,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS,OAAO;QACd,IAAI,SAAS,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3B,CAAC;QACD,QAAQ,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE;YAC/B,QAAQ,GAAG,SAAS,CAAC;QACvB,CAAC,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,SAAS,QAAQ;QACf,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,QAAQ,EAAE,IAAI,kBAAkB,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;YACnE,OAAO;QACT,CAAC;QACD,MAAM,KAAK,GAAG,SAAS,CAAC,QAAQ,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QACzD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,IAAI,CAAC,QAAQ,EAAE,IAAI,kBAAkB,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;gBACpE,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,CAAC;QACH,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAED,SAAS,iBAAiB;QACxB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,kBAAkB,EAAE,eAAe,KAAK,QAAQ,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;YACpE,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IAED,SAAS,WAAW;QAClB,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,kBAAkB,EAAE,mBAAmB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IACjF,CAAC;IAED,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,EAAE,iBAAiB,CAAC,CAAC;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9D,IAAI,kBAAkB,EAAE,eAAe,KAAK,QAAQ,EAAE,CAAC;QACrD,KAAK,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,GAAG,EAAE,CAAC,KAAK;QACrB,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YACxB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;QACD,OAAO;QACP,OAAO;YACL,SAAS,GAAG,IAAI,CAAC;YACjB,UAAU,CAAC,KAAK,EAAE,CAAC;YACnB,WAAW,EAAE,CAAC;YACd,SAAS,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Hash } from "viem";
|
|
2
|
+
import { type SubmitTransactionOptions } from "./transactions.js";
|
|
1
3
|
import { type CheckoutOptions, type CheckoutSession, type RetrieveQuoteOptions } from "./checkout.js";
|
|
2
4
|
import type { ClientQuote } from "./quote.js";
|
|
3
5
|
export interface PhalaPayOptions {
|
|
@@ -23,5 +25,7 @@ export declare class PhalaPay {
|
|
|
23
25
|
retrieveQuote(clientSecret: string, expectedAddress: string, options?: Pick<RetrieveQuoteOptions, "signal" | "requestTimeout">): Promise<ClientQuote>;
|
|
24
26
|
/** Follows the quote until it is credited, rejected, reversed, canceled, or expired. */
|
|
25
27
|
checkout(clientSecret: string, options: Pick<CheckoutOptions, "expectedAddress" | "pollInterval" | "signal" | "requestTimeout">): CheckoutSession;
|
|
28
|
+
/** Acknowledges a hint only; continue polling the object for payment status. */
|
|
29
|
+
submitTransaction(clientSecret: string, transactionHash: Hash, options?: Pick<SubmitTransactionOptions, "chainId" | "signal" | "requestTimeout">): Promise<void>;
|
|
26
30
|
}
|
|
27
31
|
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAGb,OAAO,EAAE,eAAe;IAKpC,+FAA+F;IAC/F,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,gBAAgB,CAAM,GACpE,OAAO,CAAC,WAAW,CAAC;IAUvB,wFAAwF;IACxF,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAC/F,eAAe;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAqB,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC;AACrF,OAAO,EAGL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,oBAAoB,EAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,MAAM,WAAW,eAAe;IAC9B,iEAAiE;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED;;;;;;;;;GASG;AACH,qBAAa,QAAQ;;IACnB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAGb,OAAO,EAAE,eAAe;IAKpC,+FAA+F;IAC/F,aAAa,CACX,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,MAAM,EACvB,OAAO,GAAE,IAAI,CAAC,oBAAoB,EAAE,QAAQ,GAAG,gBAAgB,CAAM,GACpE,OAAO,CAAC,WAAW,CAAC;IAUvB,wFAAwF;IACxF,QAAQ,CACN,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,IAAI,CAAC,eAAe,EAAE,iBAAiB,GAAG,cAAc,GAAG,QAAQ,GAAG,gBAAgB,CAAC,GAC/F,eAAe;IASlB,gFAAgF;IAChF,iBAAiB,CACf,YAAY,EAAE,MAAM,EACpB,eAAe,EAAE,IAAI,EACrB,OAAO,GAAE,IAAI,CAAC,wBAAwB,EAAE,SAAS,GAAG,QAAQ,GAAG,gBAAgB,CAAM,GACpF,OAAO,CAAC,IAAI,CAAC;CAOjB"}
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { submitTransaction } from "./transactions.js";
|
|
1
2
|
import { createCheckout, retrieveQuote, } from "./checkout.js";
|
|
2
3
|
/**
|
|
3
4
|
* The browser client, in the shape of Stripe.js: it holds no key, only the service origin, and
|
|
@@ -35,6 +36,10 @@ export class PhalaPay {
|
|
|
35
36
|
...this.#fetchOption(),
|
|
36
37
|
});
|
|
37
38
|
}
|
|
39
|
+
/** Acknowledges a hint only; continue polling the object for payment status. */
|
|
40
|
+
submitTransaction(clientSecret, transactionHash, options = {}) {
|
|
41
|
+
return submitTransaction({ ...options, clientSecret, transactionHash, apiBase: this.apiBase, ...this.#fetchOption() });
|
|
42
|
+
}
|
|
38
43
|
#fetchOption() {
|
|
39
44
|
return this.#fetch === undefined ? {} : { fetch: this.#fetch };
|
|
40
45
|
}
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAAiC,MAAM,mBAAmB,CAAC;AACrF,OAAO,EACL,cAAc,EACd,aAAa,GAId,MAAM,eAAe,CAAC;AASvB;;;;;;;;;GASG;AACH,MAAM,OAAO,QAAQ;IACV,OAAO,CAAS;IAChB,MAAM,CAAsC;IAErD,YAAY,OAAwB;QAClC,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAC/B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC;IAC9B,CAAC;IAED,+FAA+F;IAC/F,aAAa,CACX,YAAoB,EACpB,eAAuB,EACvB,UAAmE,EAAE;QAErE,OAAO,aAAa,CAAC;YACnB,YAAY;YACZ,eAAe;YACf,GAAG,OAAO;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,IAAI,CAAC,YAAY,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IAED,wFAAwF;IACxF,QAAQ,CACN,YAAoB,EACpB,OAAgG;QAEhG,OAAO,cAAc,CAAC;YACpB,YAAY;YACZ,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,OAAO;YACV,GAAG,IAAI,CAAC,YAAY,EAAE;SACvB,CAAC,CAAC;IACL,CAAC;IAED,gFAAgF;IAChF,iBAAiB,CACf,YAAoB,EACpB,eAAqB,EACrB,UAAmF,EAAE;QAErF,OAAO,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;IACzH,CAAC;IAED,YAAY;QACV,OAAO,IAAI,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IACjE,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-address.d.ts","sourceRoot":"","sources":["../src/deposit-address.ts"],"names":[],"mappings":"AAGA,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC5C,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAID,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,oBAAoB,CAAC,
|
|
1
|
+
{"version":3,"file":"deposit-address.d.ts","sourceRoot":"","sources":["../src/deposit-address.ts"],"names":[],"mappings":"AAGA,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,MAAM,EAAE,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACrE,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,8DAA8D;IAC9D,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wEAAwE;AACxE,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,OAAO,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAED;;;GAGG;AACH,MAAM,WAAW,oBAAoB;IACnC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,iBAAiB,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,MAAM,EAAE,QAAQ,GAAG,SAAS,CAAC;IAC7B,QAAQ,EAAE,2BAA2B,EAAE,CAAC;IACxC,QAAQ,EAAE,qBAAqB,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,6BAA6B;IAC5C,wFAAwF;IACxF,YAAY,EAAE,MAAM,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,uDAAuD;IACvD,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAID,2FAA2F;AAC3F,wBAAgB,gCAAgC,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAM7E;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,OAAO,EAAE,6BAA6B,GACrC,OAAO,CAAC,oBAAoB,CAAC,CAsB/B;AAED,kGAAkG;AAClG,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,oBAAoB,CAsB9E"}
|
package/dist/deposit-address.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deposit-address.js","sourceRoot":"","sources":["../src/deposit-address.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAClE,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AA2D7D,MAAM,gBAAgB,GAAG,CAAC,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAU,CAAC;AAE7F,2FAA2F;AAC3F,MAAM,UAAU,gCAAgC,CAAC,YAAoB;IACnE,MAAM,KAAK,GAAG,sCAAsC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACxE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,SAAS,CAAC,qDAAqD,CAAC,CAAC;IAC7E,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,OAAsC;IAEtC,MAAM,EAAE,GAAG,gCAAgC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,IAAI,yBAAyB,EAAE,kBAAkB,kBAAkB,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;IAC3G,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrE,+EAA+E;IAC/E,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE;QACpC,KAAK,EAAE,UAAU;QACjB,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,aAAa,CAAC,QAAQ,EAAE,6CAA6C,CAAC,CAAC;IAC/E,CAAC;IACD,IAAI,CAAC;QACH,OAAO,yBAAyB,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,aAAa,CAAC,kBAAkB,EAAE,8CAA8C,EAAE;YAC1F,KAAK;
|
|
1
|
+
{"version":3,"file":"deposit-address.js","sourceRoot":"","sources":["../src/deposit-address.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,4 +9,5 @@ export { assetIconName, iconMonogram, type IconName } from "./icon-names.js";
|
|
|
9
9
|
export { INJECTED_WALLET_UUID, WalletError, payWithWallet, watchWallets, type EthereumProvider, type Wallet, type WalletErrorCode, type WalletInfo, } from "./wallet.js";
|
|
10
10
|
export { networkIcon, assetIcon } from "./icons.js";
|
|
11
11
|
export type { CheckoutParams } from "./shared/checkout-params.js";
|
|
12
|
+
export { submitTransaction, type SubmitTransactionOptions } from "./transactions.js";
|
|
12
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,GACnC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,EACb,KAAK,iBAAiB,EACtB,KAAK,oBAAoB,EACzB,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,2BAA2B,EAChC,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,GACnC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,EACb,KAAK,mBAAmB,EACxB,KAAK,qBAAqB,EAC1B,KAAK,qBAAqB,EAC1B,KAAK,aAAa,EAClB,KAAK,eAAe,GACrB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,YAAY,EACZ,KAAK,gBAAgB,EACrB,KAAK,MAAM,EACX,KAAK,eAAe,EACpB,KAAK,UAAU,GAChB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACpD,YAAY,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAElE,OAAO,EAAE,iBAAiB,EAAE,KAAK,wBAAwB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -8,4 +8,5 @@ export { parseClientQuote, quoteIdFromClientSecret } from "./quote.js";
|
|
|
8
8
|
export { assetIconName, iconMonogram } from "./icon-names.js";
|
|
9
9
|
export { INJECTED_WALLET_UUID, WalletError, payWithWallet, watchWallets, } from "./wallet.js";
|
|
10
10
|
export { networkIcon, assetIcon } from "./icons.js";
|
|
11
|
+
export { submitTransaction } from "./transactions.js";
|
|
11
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,GAQd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,sBAAsB,GAKvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAMd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAoB,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,YAAY,GAKb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EACb,cAAc,EACd,SAAS,EACT,cAAc,EACd,aAAa,GAQd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,QAAQ,EAAwB,MAAM,aAAa,CAAC;AAC7D,OAAO,EACL,gCAAgC,EAChC,yBAAyB,EACzB,sBAAsB,GAKvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC3H,OAAO,EACL,sBAAsB,EACtB,gBAAgB,EAChB,aAAa,GAMd,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAoB,MAAM,YAAY,CAAC;AACzF,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,iBAAiB,CAAC;AAC7E,OAAO,EACL,oBAAoB,EACpB,WAAW,EACX,aAAa,EACb,YAAY,GAKb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGpD,OAAO,EAAE,iBAAiB,EAAiC,MAAM,mBAAmB,CAAC"}
|
package/dist/quote.d.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface ClientQuote {
|
|
|
23
23
|
payment_uri: string;
|
|
24
24
|
/** Unix seconds; after this the address must no longer be shown. */
|
|
25
25
|
expires_at: number;
|
|
26
|
+
/** Unix seconds of a cancellation request; the quote stays open until dual coverage closes it. */
|
|
27
|
+
cancel_requested_at?: number | null;
|
|
26
28
|
/**
|
|
27
29
|
* `seen` once in a block (a reorg can remove it), `confirming` while a payment at the route's
|
|
28
30
|
* confirmation is valued and screened, `credited` once it is credited (typically
|
package/dist/quote.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;IAClB,iGAAiG;IACjG,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACrD,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACtF,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAKD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,
|
|
1
|
+
{"version":3,"file":"quote.d.ts","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,OAAO,CAAC;IAChB,0EAA0E;IAC1E,QAAQ,EAAE,OAAO,CAAC;IAClB,iGAAiG;IACjG,MAAM,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,GAAG,UAAU,CAAC;IACrD,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,aAAa,EAAE,MAAM,CAAC;IACtB,8CAA8C;IAC9C,OAAO,EAAE,MAAM,CAAC;IAChB,mFAAmF;IACnF,WAAW,EAAE,MAAM,CAAC;IACpB,oEAAoE;IACpE,UAAU,EAAE,MAAM,CAAC;IACnB,kGAAkG;IAClG,mBAAmB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC;;;;;OAKG;IACH,cAAc,EAAE,MAAM,GAAG,MAAM,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,CAAC;IACtF,8EAA8E;IAC9E,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B;;;;OAIG;IACH,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;OAIG;IACH,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAKD,oFAAoF;AACpF,wBAAgB,uBAAuB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAMpE;AAED,wFAAwF;AACxF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,WAAW,CAoD5D"}
|
package/dist/quote.js
CHANGED
|
@@ -16,6 +16,7 @@ export function parseClientQuote(value) {
|
|
|
16
16
|
const v = value;
|
|
17
17
|
const confirmations = v["confirmations"];
|
|
18
18
|
const amountCredited = v["amount_credited"];
|
|
19
|
+
const cancelRequestedAt = v["cancel_requested_at"];
|
|
19
20
|
if (typeof v["id"] !== "string" ||
|
|
20
21
|
v["object"] !== "quote" ||
|
|
21
22
|
typeof v["livemode"] !== "boolean" ||
|
|
@@ -31,6 +32,7 @@ export function parseClientQuote(value) {
|
|
|
31
32
|
!/^0x[0-9a-fA-F]{40}$/.test(v["address"]) ||
|
|
32
33
|
typeof v["payment_uri"] !== "string" ||
|
|
33
34
|
!isSafeInteger(v["expires_at"]) ||
|
|
35
|
+
!(cancelRequestedAt === undefined || cancelRequestedAt === null || isSafeInteger(cancelRequestedAt)) ||
|
|
34
36
|
!oneOf(v["payment_status"], PAYMENT_STATUSES) ||
|
|
35
37
|
!(confirmations === null || isSafeInteger(confirmations)) ||
|
|
36
38
|
!(amountCredited === null || isSafeInteger(amountCredited)) ||
|
|
@@ -51,6 +53,7 @@ export function parseClientQuote(value) {
|
|
|
51
53
|
address: v["address"],
|
|
52
54
|
payment_uri: v["payment_uri"],
|
|
53
55
|
expires_at: v["expires_at"],
|
|
56
|
+
...(cancelRequestedAt === undefined ? {} : { cancel_requested_at: cancelRequestedAt }),
|
|
54
57
|
payment_status: v["payment_status"],
|
|
55
58
|
confirmations,
|
|
56
59
|
amount_credited: amountCredited,
|
package/dist/quote.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"quote.js","sourceRoot":"","sources":["../src/quote.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { Hash } from "viem";
|
|
2
|
+
import { type ClientQuote } from "./quote.js";
|
|
3
|
+
export interface SubmitTransactionOptions {
|
|
4
|
+
apiBase: string;
|
|
5
|
+
clientSecret: string;
|
|
6
|
+
transactionHash: Hash;
|
|
7
|
+
/** Required for a deposit-address secret; quotes select their stored chain. */
|
|
8
|
+
chainId?: number;
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
requestTimeout?: number;
|
|
11
|
+
fetch?: typeof globalThis.fetch;
|
|
12
|
+
}
|
|
13
|
+
/** Sends a best-effort detection hint. Receipt of a hint says nothing about payment status. */
|
|
14
|
+
export declare function submitTransaction(options: SubmitTransactionOptions): Promise<void>;
|
|
15
|
+
type QuoteSubmission = Omit<SubmitTransactionOptions, "transactionHash" | "chainId">;
|
|
16
|
+
/** Keep the checkout's origin and secret out of its public, serializable quote view. */
|
|
17
|
+
export declare function bindQuoteSubmission(quote: ClientQuote, options: QuoteSubmission): void;
|
|
18
|
+
/** Automatic wallet hints never delay or change the result of an already broadcast payment. */
|
|
19
|
+
export declare function submitWalletTransaction(quote: ClientQuote, transactionHash: Hash): void;
|
|
20
|
+
export {};
|
|
21
|
+
//# sourceMappingURL=transactions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.d.ts","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAA2B,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGvE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,IAAI,CAAC;IACtB,+EAA+E;IAC/E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;CACjC;AAED,+FAA+F;AAC/F,wBAAsB,iBAAiB,CAAC,OAAO,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAqBxF;AAED,KAAK,eAAe,GAAG,IAAI,CAAC,wBAAwB,EAAE,iBAAiB,GAAG,SAAS,CAAC,CAAC;AAGrF,wFAAwF;AACxF,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI,CAEtF;AAED,+FAA+F;AAC/F,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,IAAI,GAAG,IAAI,CAKvF"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { quoteIdFromClientSecret } from "./quote.js";
|
|
2
|
+
import { requestSignal, trimTrailingSlashes } from "./request.js";
|
|
3
|
+
/** Sends a best-effort detection hint. Receipt of a hint says nothing about payment status. */
|
|
4
|
+
export async function submitTransaction(options) {
|
|
5
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(options.transactionHash)) {
|
|
6
|
+
throw new TypeError("Invalid transaction hash");
|
|
7
|
+
}
|
|
8
|
+
const addressId = /^(da_[0-9a-f]{32})_secret_/.exec(options.clientSecret)?.[1];
|
|
9
|
+
const id = addressId ?? quoteIdFromClientSecret(options.clientSecret);
|
|
10
|
+
if (addressId !== undefined && (!Number.isSafeInteger(options.chainId) || (options.chainId ?? 0) <= 0)) {
|
|
11
|
+
throw new TypeError("A deposit-address hint requires chainId");
|
|
12
|
+
}
|
|
13
|
+
const resource = addressId === undefined ? "quotes" : "deposit_addresses";
|
|
14
|
+
const url = new URL(`${trimTrailingSlashes(options.apiBase)}/v1/${resource}/${encodeURIComponent(id)}/transactions`);
|
|
15
|
+
url.searchParams.set("client_secret", options.clientSecret);
|
|
16
|
+
const response = await (options.fetch ?? globalThis.fetch)(url, {
|
|
17
|
+
method: "POST",
|
|
18
|
+
headers: { "Content-Type": "application/json" },
|
|
19
|
+
body: JSON.stringify({ transaction_hash: options.transactionHash, ...(addressId === undefined ? {} : { chain_id: options.chainId }) }),
|
|
20
|
+
signal: requestSignal(options),
|
|
21
|
+
credentials: "omit",
|
|
22
|
+
redirect: "error",
|
|
23
|
+
});
|
|
24
|
+
if (response.status !== 202)
|
|
25
|
+
throw new Error("Transaction hint was not received");
|
|
26
|
+
}
|
|
27
|
+
const submissions = new WeakMap();
|
|
28
|
+
/** Keep the checkout's origin and secret out of its public, serializable quote view. */
|
|
29
|
+
export function bindQuoteSubmission(quote, options) {
|
|
30
|
+
submissions.set(quote, options);
|
|
31
|
+
}
|
|
32
|
+
/** Automatic wallet hints never delay or change the result of an already broadcast payment. */
|
|
33
|
+
export function submitWalletTransaction(quote, transactionHash) {
|
|
34
|
+
const options = submissions.get(quote);
|
|
35
|
+
if (options !== undefined) {
|
|
36
|
+
void submitTransaction({ ...options, transactionHash }).catch(() => undefined);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=transactions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactions.js","sourceRoot":"","sources":["../src/transactions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAoB,MAAM,YAAY,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAalE,+FAA+F;AAC/F,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,OAAiC;IACvE,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,CAAC;QACzD,MAAM,IAAI,SAAS,CAAC,0BAA0B,CAAC,CAAC;IAClD,CAAC;IACD,MAAM,SAAS,GAAG,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,MAAM,EAAE,GAAG,SAAS,IAAI,uBAAuB,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IACtE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACvG,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,QAAQ,GAAG,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC;IAC1E,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,mBAAmB,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,QAAQ,IAAI,kBAAkB,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;IACrH,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE;QAC9D,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,gBAAgB,EAAE,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACtI,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC;QAC9B,WAAW,EAAE,MAAM;QACnB,QAAQ,EAAE,OAAO;KAClB,CAAC,CAAC;IACH,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG;QAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;AACpF,CAAC;AAGD,MAAM,WAAW,GAAG,IAAI,OAAO,EAAgC,CAAC;AAEhE,wFAAwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,KAAkB,EAAE,OAAwB;IAC9E,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,uBAAuB,CAAC,KAAkB,EAAE,eAAqB;IAC/E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,KAAK,iBAAiB,CAAC,EAAE,GAAG,OAAO,EAAE,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACjF,CAAC;AACH,CAAC"}
|
package/dist/wallet.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AAEA,OAAO,EAQL,KAAK,IAAI,EACT,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AAKd,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAE9C,8BAA8B;AAC9B,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAED,2FAA2F;AAC3F,MAAM,WAAW,gBAAgB;IAC/B,OAAO,CAAC,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACvE;AAED,MAAM,WAAW,MAAM;IACrB,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,EAAE,gBAAgB,CAAC;CAC5B;AAED,iGAAiG;AACjG,eAAO,MAAM,oBAAoB,aAAa,CAAC;AAE/C;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,IAAI,GAAG,MAAM,IAAI,CAa9E;AA8BD,MAAM,MAAM,eAAe,GACvB,UAAU,GACV,YAAY,GACZ,aAAa,GACb,sBAAsB,GACtB,QAAQ,CAAC;AAEb,qBAAa,WAAY,SAAQ,KAAK;IAIlC,QAAQ,CAAC,IAAI,EAAE,eAAe;IAHhC,SAAkB,IAAI,iBAAiB;gBAG5B,IAAI,EAAE,eAAe,EAC9B,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,YAAY;CAIzB;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,GAAG,gBAAgB,EACvC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CAsCf"}
|
package/dist/wallet.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { submitWalletTransaction } from "./transactions.js";
|
|
1
2
|
import { createStore } from "mipd";
|
|
2
3
|
import { BaseError, createWalletClient, custom, erc20Abi, SwitchChainError, UserRejectedRequestError, } from "viem";
|
|
3
4
|
import { readContract } from "viem/actions";
|
|
@@ -82,7 +83,7 @@ export async function payWithWallet(wallet, quote) {
|
|
|
82
83
|
throw new WalletError("insufficient_balance", `Your wallet holds ${formatUnitsGrouped(balance, quote.decimals)} ${symbol}, less than the ` +
|
|
83
84
|
`${formatTokenAmount(quote)} ${symbol} to pay. Nothing was sent.`);
|
|
84
85
|
}
|
|
85
|
-
|
|
86
|
+
const hash = await client.writeContract({
|
|
86
87
|
account,
|
|
87
88
|
chain: knownChain(transfer.chainId) ?? null,
|
|
88
89
|
address: transfer.token,
|
|
@@ -90,6 +91,8 @@ export async function payWithWallet(wallet, quote) {
|
|
|
90
91
|
functionName: "transfer",
|
|
91
92
|
args: [transfer.to, transfer.amount],
|
|
92
93
|
});
|
|
94
|
+
submitWalletTransaction(quote, hash);
|
|
95
|
+
return hash;
|
|
93
96
|
}
|
|
94
97
|
catch (error) {
|
|
95
98
|
if (error instanceof WalletError) {
|
package/dist/wallet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/checkout.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { bindQuoteSubmission } from "./transactions.js";
|
|
1
2
|
import { requestSignal, trimTrailingSlashes } from "./request.js";
|
|
2
3
|
import { getAddress, isAddress, isAddressEqual } from "viem";
|
|
3
4
|
import { parseClientQuote, quoteIdFromClientSecret, type ClientQuote } from "./quote.js";
|
|
@@ -37,6 +38,8 @@ export type CheckoutErrorCode =
|
|
|
37
38
|
| "api_error";
|
|
38
39
|
|
|
39
40
|
export interface CheckoutErrorOptions extends ErrorOptions {
|
|
41
|
+
/** The HTTP status, when the error came from a response. */
|
|
42
|
+
status?: number;
|
|
40
43
|
/** The failed response's `Request-Id`, `req_…`, to quote to support. */
|
|
41
44
|
requestId?: string;
|
|
42
45
|
/** For `rate_limited`: the seconds the service asked to wait (`Retry-After`). */
|
|
@@ -45,6 +48,8 @@ export interface CheckoutErrorOptions extends ErrorOptions {
|
|
|
45
48
|
|
|
46
49
|
export class CheckoutError extends Error {
|
|
47
50
|
override readonly name = "CheckoutError";
|
|
51
|
+
/** The HTTP status, when the error came from a response. */
|
|
52
|
+
readonly status?: number;
|
|
48
53
|
/** The failed response's `Request-Id`, when the service answered. */
|
|
49
54
|
readonly requestId: string | undefined;
|
|
50
55
|
/** For `rate_limited`: the seconds to wait before the next read. */
|
|
@@ -56,46 +61,60 @@ export class CheckoutError extends Error {
|
|
|
56
61
|
options?: CheckoutErrorOptions,
|
|
57
62
|
) {
|
|
58
63
|
super(message, options);
|
|
64
|
+
if (options?.status !== undefined) {
|
|
65
|
+
this.status = options.status;
|
|
66
|
+
}
|
|
59
67
|
this.requestId = options?.requestId;
|
|
60
68
|
this.retryAfter = options?.retryAfter;
|
|
61
69
|
}
|
|
62
70
|
}
|
|
63
71
|
|
|
64
72
|
/**
|
|
65
|
-
* The error of a failed read of a public view, with the response's `Request-Id`
|
|
66
|
-
* its `Retry-After`.
|
|
73
|
+
* The error of a failed read of a public view, with the response's HTTP status, `Request-Id`
|
|
74
|
+
* and, on `429`, its `Retry-After`.
|
|
67
75
|
*/
|
|
68
76
|
export function responseError(response: Response, notFound: string): CheckoutError {
|
|
69
77
|
const header = response.headers.get("request-id");
|
|
70
|
-
const
|
|
78
|
+
const options = { status: response.status, ...(header === null ? {} : { requestId: header }) };
|
|
71
79
|
if (response.status === 404) {
|
|
72
|
-
return new CheckoutError("invalid_client_secret", notFound,
|
|
80
|
+
return new CheckoutError("invalid_client_secret", notFound, options);
|
|
73
81
|
}
|
|
74
82
|
if (response.status >= 500) {
|
|
75
83
|
const seconds = Number(response.headers.get("retry-after"));
|
|
76
84
|
return new CheckoutError("service_unavailable", "the payment service is temporarily unavailable", {
|
|
77
|
-
...
|
|
85
|
+
...options,
|
|
78
86
|
...(Number.isFinite(seconds) && seconds > 0 ? { retryAfter: seconds } : {}),
|
|
79
87
|
});
|
|
80
88
|
}
|
|
81
89
|
if (response.status === 429) {
|
|
82
90
|
const seconds = Number(response.headers.get("retry-after"));
|
|
83
91
|
return new CheckoutError("rate_limited", "too many status requests", {
|
|
84
|
-
...
|
|
92
|
+
...options,
|
|
85
93
|
...(Number.isFinite(seconds) && seconds > 0 ? { retryAfter: seconds } : {}),
|
|
86
94
|
});
|
|
87
95
|
}
|
|
88
96
|
return new CheckoutError(
|
|
89
97
|
"api_error",
|
|
90
98
|
`the payment service answered ${response.status}`,
|
|
91
|
-
|
|
99
|
+
options,
|
|
92
100
|
);
|
|
93
101
|
}
|
|
94
102
|
|
|
95
|
-
/**
|
|
96
|
-
|
|
103
|
+
/**
|
|
104
|
+
* The next read's delay with uniform ±20% jitter capped at MAX_BACKOFF after jitter.
|
|
105
|
+
* Retry-After remains a minimum, even when it asks for longer than the backoff cap.
|
|
106
|
+
* `random` defaults to Math.random and can be injected for deterministic tests.
|
|
107
|
+
*/
|
|
108
|
+
export function pollDelay(
|
|
109
|
+
interval: number,
|
|
110
|
+
failures: number,
|
|
111
|
+
error: CheckoutError | null,
|
|
112
|
+
random: () => number = Math.random,
|
|
113
|
+
): number {
|
|
97
114
|
const backoff = failures === 0 ? interval : Math.min(interval * 2 ** failures, MAX_BACKOFF);
|
|
98
|
-
|
|
115
|
+
const retryAfter = (error?.retryAfter ?? 0) * 1000;
|
|
116
|
+
const jittered = Math.max(backoff, retryAfter) * (0.8 + 0.4 * random());
|
|
117
|
+
return Math.max(Math.min(jittered, MAX_BACKOFF), retryAfter);
|
|
99
118
|
}
|
|
100
119
|
|
|
101
120
|
export interface CheckoutState {
|
|
@@ -180,14 +199,21 @@ export async function retrieveQuote(options: RetrieveQuoteOptions): Promise<Clie
|
|
|
180
199
|
} catch (cause) {
|
|
181
200
|
throw new CheckoutError("invalid_response", "unexpected response from the payment service", {
|
|
182
201
|
cause,
|
|
202
|
+
status: response.status,
|
|
183
203
|
});
|
|
184
204
|
}
|
|
185
205
|
if (!isAddressEqual(getAddress(quote.address), expected)) {
|
|
186
206
|
throw new CheckoutError(
|
|
187
207
|
"address_mismatch",
|
|
188
208
|
"the quote's address is not the one the merchant expects",
|
|
209
|
+
{ status: response.status },
|
|
189
210
|
);
|
|
190
211
|
}
|
|
212
|
+
bindQuoteSubmission(quote, {
|
|
213
|
+
apiBase: options.apiBase, clientSecret: options.clientSecret,
|
|
214
|
+
...(options.fetch === undefined ? {} : { fetch: options.fetch }),
|
|
215
|
+
...(options.requestTimeout === undefined ? {} : { requestTimeout: options.requestTimeout }),
|
|
216
|
+
});
|
|
191
217
|
return quote;
|
|
192
218
|
}
|
|
193
219
|
|
|
@@ -229,10 +255,12 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
229
255
|
const now = options.now ?? Date.now;
|
|
230
256
|
const interval = options.pollInterval ?? DEFAULT_POLL_INTERVAL;
|
|
231
257
|
const listeners = new Set<(state: CheckoutState) => void>();
|
|
258
|
+
const visibilityDocument = typeof document === "undefined" ? undefined : document;
|
|
232
259
|
|
|
233
260
|
let state: CheckoutState = { status: "loading", quote: null, error: null };
|
|
234
261
|
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
235
262
|
let failures = 0;
|
|
263
|
+
let clientFailures = 0;
|
|
236
264
|
let lastFailure: CheckoutError | null = null;
|
|
237
265
|
let destroyed = false;
|
|
238
266
|
let inFlight: Promise<void> | undefined;
|
|
@@ -273,6 +301,7 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
273
301
|
return;
|
|
274
302
|
}
|
|
275
303
|
failures = 0;
|
|
304
|
+
clientFailures = 0;
|
|
276
305
|
lastFailure = null;
|
|
277
306
|
setState({ status: checkoutStatus(quote, now() / 1000), quote, error: null });
|
|
278
307
|
} catch (cause) {
|
|
@@ -284,6 +313,14 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
284
313
|
? cause
|
|
285
314
|
: new CheckoutError("network_error", "could not reach the payment service", { cause });
|
|
286
315
|
failures += 1;
|
|
316
|
+
clientFailures =
|
|
317
|
+
error.status !== undefined &&
|
|
318
|
+
error.status >= 400 &&
|
|
319
|
+
error.status < 500 &&
|
|
320
|
+
error.status !== 408 &&
|
|
321
|
+
error.status !== 429
|
|
322
|
+
? clientFailures + 1
|
|
323
|
+
: 0;
|
|
287
324
|
lastFailure = error;
|
|
288
325
|
const quote = state.quote;
|
|
289
326
|
if (error.code === "address_mismatch") {
|
|
@@ -291,6 +328,8 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
291
328
|
setState({ status: "error", quote: null, error });
|
|
292
329
|
} else if (error.code === "invalid_client_secret") {
|
|
293
330
|
setState({ status: "error", quote, error });
|
|
331
|
+
} else if (clientFailures >= 3) {
|
|
332
|
+
setState({ status: "error", quote, error });
|
|
294
333
|
} else if (error.code === "network_error" || error.code === "service_unavailable") {
|
|
295
334
|
// Do not infer expiry or discard the payer's view while chain progress is unknown.
|
|
296
335
|
setState({ status: state.status, quote, error: null, reconnecting: true });
|
|
@@ -315,16 +354,35 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
315
354
|
}
|
|
316
355
|
|
|
317
356
|
function schedule(): void {
|
|
318
|
-
|
|
357
|
+
clearTimeout(timer);
|
|
358
|
+
if (finished() || visibilityDocument?.visibilityState === "hidden") {
|
|
319
359
|
return;
|
|
320
360
|
}
|
|
321
361
|
const delay = pollDelay(interval, failures, lastFailure);
|
|
322
362
|
timer = setTimeout(() => {
|
|
323
|
-
|
|
363
|
+
if (!finished() && visibilityDocument?.visibilityState !== "hidden") {
|
|
364
|
+
void refresh().then(schedule);
|
|
365
|
+
}
|
|
324
366
|
}, delay);
|
|
325
367
|
}
|
|
326
368
|
|
|
327
|
-
|
|
369
|
+
function visibilityChanged(): void {
|
|
370
|
+
clearTimeout(timer);
|
|
371
|
+
if (visibilityDocument?.visibilityState !== "hidden" && !finished()) {
|
|
372
|
+
void refresh().then(schedule);
|
|
373
|
+
}
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
function stopPolling(): void {
|
|
377
|
+
clearTimeout(timer);
|
|
378
|
+
visibilityDocument?.removeEventListener("visibilitychange", visibilityChanged);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
visibilityDocument?.addEventListener("visibilitychange", visibilityChanged);
|
|
382
|
+
signal.addEventListener("abort", stopPolling, { once: true });
|
|
383
|
+
if (visibilityDocument?.visibilityState !== "hidden") {
|
|
384
|
+
void refresh().then(schedule);
|
|
385
|
+
}
|
|
328
386
|
|
|
329
387
|
return {
|
|
330
388
|
getState: () => state,
|
|
@@ -338,7 +396,7 @@ export function createCheckout(options: CheckoutOptions): CheckoutSession {
|
|
|
338
396
|
destroy() {
|
|
339
397
|
destroyed = true;
|
|
340
398
|
controller.abort();
|
|
341
|
-
|
|
399
|
+
stopPolling();
|
|
342
400
|
listeners.clear();
|
|
343
401
|
},
|
|
344
402
|
};
|
package/src/client.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { Hash } from "viem";
|
|
2
|
+
import { submitTransaction, type SubmitTransactionOptions } from "./transactions.js";
|
|
1
3
|
import {
|
|
2
4
|
createCheckout,
|
|
3
5
|
retrieveQuote,
|
|
@@ -60,6 +62,15 @@ export class PhalaPay {
|
|
|
60
62
|
});
|
|
61
63
|
}
|
|
62
64
|
|
|
65
|
+
/** Acknowledges a hint only; continue polling the object for payment status. */
|
|
66
|
+
submitTransaction(
|
|
67
|
+
clientSecret: string,
|
|
68
|
+
transactionHash: Hash,
|
|
69
|
+
options: Pick<SubmitTransactionOptions, "chainId" | "signal" | "requestTimeout"> = {},
|
|
70
|
+
): Promise<void> {
|
|
71
|
+
return submitTransaction({ ...options, clientSecret, transactionHash, apiBase: this.apiBase, ...this.#fetchOption() });
|
|
72
|
+
}
|
|
73
|
+
|
|
63
74
|
#fetchOption(): { fetch?: typeof globalThis.fetch } {
|
|
64
75
|
return this.#fetch === undefined ? {} : { fetch: this.#fetch };
|
|
65
76
|
}
|
package/src/deposit-address.ts
CHANGED
package/src/index.ts
CHANGED
package/src/quote.ts
CHANGED
|
@@ -23,6 +23,8 @@ export interface ClientQuote {
|
|
|
23
23
|
payment_uri: string;
|
|
24
24
|
/** Unix seconds; after this the address must no longer be shown. */
|
|
25
25
|
expires_at: number;
|
|
26
|
+
/** Unix seconds of a cancellation request; the quote stays open until dual coverage closes it. */
|
|
27
|
+
cancel_requested_at?: number | null;
|
|
26
28
|
/**
|
|
27
29
|
* `seen` once in a block (a reorg can remove it), `confirming` while a payment at the route's
|
|
28
30
|
* confirmation is valued and screened, `credited` once it is credited (typically
|
|
@@ -66,6 +68,7 @@ export function parseClientQuote(value: unknown): ClientQuote {
|
|
|
66
68
|
const v = value as Record<string, unknown>;
|
|
67
69
|
const confirmations = v["confirmations"];
|
|
68
70
|
const amountCredited = v["amount_credited"];
|
|
71
|
+
const cancelRequestedAt = v["cancel_requested_at"];
|
|
69
72
|
if (
|
|
70
73
|
typeof v["id"] !== "string" ||
|
|
71
74
|
v["object"] !== "quote" ||
|
|
@@ -82,6 +85,7 @@ export function parseClientQuote(value: unknown): ClientQuote {
|
|
|
82
85
|
!/^0x[0-9a-fA-F]{40}$/.test(v["address"]) ||
|
|
83
86
|
typeof v["payment_uri"] !== "string" ||
|
|
84
87
|
!isSafeInteger(v["expires_at"]) ||
|
|
88
|
+
!(cancelRequestedAt === undefined || cancelRequestedAt === null || isSafeInteger(cancelRequestedAt)) ||
|
|
85
89
|
!oneOf(v["payment_status"], PAYMENT_STATUSES) ||
|
|
86
90
|
!(confirmations === null || isSafeInteger(confirmations)) ||
|
|
87
91
|
!(amountCredited === null || isSafeInteger(amountCredited)) ||
|
|
@@ -103,6 +107,7 @@ export function parseClientQuote(value: unknown): ClientQuote {
|
|
|
103
107
|
address: v["address"],
|
|
104
108
|
payment_uri: v["payment_uri"],
|
|
105
109
|
expires_at: v["expires_at"],
|
|
110
|
+
...(cancelRequestedAt === undefined ? {} : { cancel_requested_at: cancelRequestedAt }),
|
|
106
111
|
payment_status: v["payment_status"],
|
|
107
112
|
confirmations,
|
|
108
113
|
amount_credited: amountCredited,
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { Hash } from "viem";
|
|
2
|
+
import { quoteIdFromClientSecret, type ClientQuote } from "./quote.js";
|
|
3
|
+
import { requestSignal, trimTrailingSlashes } from "./request.js";
|
|
4
|
+
|
|
5
|
+
export interface SubmitTransactionOptions {
|
|
6
|
+
apiBase: string;
|
|
7
|
+
clientSecret: string;
|
|
8
|
+
transactionHash: Hash;
|
|
9
|
+
/** Required for a deposit-address secret; quotes select their stored chain. */
|
|
10
|
+
chainId?: number;
|
|
11
|
+
signal?: AbortSignal;
|
|
12
|
+
requestTimeout?: number;
|
|
13
|
+
fetch?: typeof globalThis.fetch;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** Sends a best-effort detection hint. Receipt of a hint says nothing about payment status. */
|
|
17
|
+
export async function submitTransaction(options: SubmitTransactionOptions): Promise<void> {
|
|
18
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(options.transactionHash)) {
|
|
19
|
+
throw new TypeError("Invalid transaction hash");
|
|
20
|
+
}
|
|
21
|
+
const addressId = /^(da_[0-9a-f]{32})_secret_/.exec(options.clientSecret)?.[1];
|
|
22
|
+
const id = addressId ?? quoteIdFromClientSecret(options.clientSecret);
|
|
23
|
+
if (addressId !== undefined && (!Number.isSafeInteger(options.chainId) || (options.chainId ?? 0) <= 0)) {
|
|
24
|
+
throw new TypeError("A deposit-address hint requires chainId");
|
|
25
|
+
}
|
|
26
|
+
const resource = addressId === undefined ? "quotes" : "deposit_addresses";
|
|
27
|
+
const url = new URL(`${trimTrailingSlashes(options.apiBase)}/v1/${resource}/${encodeURIComponent(id)}/transactions`);
|
|
28
|
+
url.searchParams.set("client_secret", options.clientSecret);
|
|
29
|
+
const response = await (options.fetch ?? globalThis.fetch)(url, {
|
|
30
|
+
method: "POST",
|
|
31
|
+
headers: { "Content-Type": "application/json" },
|
|
32
|
+
body: JSON.stringify({ transaction_hash: options.transactionHash, ...(addressId === undefined ? {} : { chain_id: options.chainId }) }),
|
|
33
|
+
signal: requestSignal(options),
|
|
34
|
+
credentials: "omit",
|
|
35
|
+
redirect: "error",
|
|
36
|
+
});
|
|
37
|
+
if (response.status !== 202) throw new Error("Transaction hint was not received");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
type QuoteSubmission = Omit<SubmitTransactionOptions, "transactionHash" | "chainId">;
|
|
41
|
+
const submissions = new WeakMap<ClientQuote, QuoteSubmission>();
|
|
42
|
+
|
|
43
|
+
/** Keep the checkout's origin and secret out of its public, serializable quote view. */
|
|
44
|
+
export function bindQuoteSubmission(quote: ClientQuote, options: QuoteSubmission): void {
|
|
45
|
+
submissions.set(quote, options);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Automatic wallet hints never delay or change the result of an already broadcast payment. */
|
|
49
|
+
export function submitWalletTransaction(quote: ClientQuote, transactionHash: Hash): void {
|
|
50
|
+
const options = submissions.get(quote);
|
|
51
|
+
if (options !== undefined) {
|
|
52
|
+
void submitTransaction({ ...options, transactionHash }).catch(() => undefined);
|
|
53
|
+
}
|
|
54
|
+
}
|
package/src/wallet.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { submitWalletTransaction } from "./transactions.js";
|
|
1
2
|
import { createStore } from "mipd";
|
|
2
3
|
import {
|
|
3
4
|
BaseError,
|
|
@@ -136,7 +137,7 @@ export async function payWithWallet(
|
|
|
136
137
|
`${formatTokenAmount(quote)} ${symbol} to pay. Nothing was sent.`,
|
|
137
138
|
);
|
|
138
139
|
}
|
|
139
|
-
|
|
140
|
+
const hash = await client.writeContract({
|
|
140
141
|
account,
|
|
141
142
|
chain: knownChain(transfer.chainId) ?? null,
|
|
142
143
|
address: transfer.token,
|
|
@@ -144,6 +145,8 @@ export async function payWithWallet(
|
|
|
144
145
|
functionName: "transfer",
|
|
145
146
|
args: [transfer.to, transfer.amount],
|
|
146
147
|
});
|
|
148
|
+
submitWalletTransaction(quote, hash);
|
|
149
|
+
return hash;
|
|
147
150
|
} catch (error) {
|
|
148
151
|
if (error instanceof WalletError) {
|
|
149
152
|
throw error;
|