@phala/pay 0.1.2 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +106 -1
- package/README.md +146 -44
- package/dist/checkout.d.ts +37 -7
- package/dist/checkout.d.ts.map +1 -1
- package/dist/checkout.js +55 -11
- package/dist/checkout.js.map +1 -1
- package/dist/client.d.ts +8 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +14 -8
- package/dist/client.js.map +1 -1
- package/dist/deposit-address.d.ts +47 -0
- package/dist/deposit-address.d.ts.map +1 -0
- package/dist/deposit-address.js +88 -0
- package/dist/deposit-address.js.map +1 -0
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/payment.d.ts +43 -1
- package/dist/payment.d.ts.map +1 -1
- package/dist/payment.js +32 -10
- package/dist/payment.js.map +1 -1
- package/dist/quote.d.ts +7 -3
- package/dist/quote.d.ts.map +1 -1
- package/dist/quote.js +5 -3
- package/dist/quote.js.map +1 -1
- package/dist/react/Checkout.d.ts +11 -1
- package/dist/react/Checkout.d.ts.map +1 -1
- package/dist/react/Checkout.js +28 -37
- package/dist/react/Checkout.js.map +1 -1
- package/dist/react/DepositAddress.d.ts +31 -0
- package/dist/react/DepositAddress.d.ts.map +1 -0
- package/dist/react/DepositAddress.js +108 -0
- package/dist/react/DepositAddress.js.map +1 -0
- package/dist/react/Field.d.ts +7 -0
- package/dist/react/Field.d.ts.map +1 -0
- package/dist/react/Field.js +21 -0
- package/dist/react/Field.js.map +1 -0
- package/dist/react/appearance.d.ts +1 -1
- package/dist/react/appearance.d.ts.map +1 -1
- package/dist/react/appearance.js +3 -0
- package/dist/react/appearance.js.map +1 -1
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.d.ts.map +1 -1
- package/dist/react/index.js +1 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/useCheckout.d.ts +3 -1
- package/dist/react/useCheckout.d.ts.map +1 -1
- package/dist/react/useCheckout.js +4 -3
- package/dist/react/useCheckout.js.map +1 -1
- package/dist/server/addresses.d.ts +78 -0
- package/dist/server/addresses.d.ts.map +1 -0
- package/dist/server/addresses.js +118 -0
- package/dist/server/addresses.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +12 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/sweeps.d.ts +78 -0
- package/dist/server/sweeps.d.ts.map +1 -0
- package/dist/server/sweeps.js +117 -0
- package/dist/server/sweeps.js.map +1 -0
- package/dist/server/webhook.d.ts +61 -0
- package/dist/server/webhook.d.ts.map +1 -0
- package/dist/server/webhook.js +150 -0
- package/dist/server/webhook.js.map +1 -0
- package/dist/wallet.d.ts +10 -8
- package/dist/wallet.d.ts.map +1 -1
- package/dist/wallet.js +61 -63
- package/dist/wallet.js.map +1 -1
- package/package.json +6 -1
- package/src/checkout.ts +89 -15
- package/src/client.ts +14 -8
- package/src/deposit-address.ts +138 -0
- package/src/index.ts +19 -1
- package/src/payment.ts +72 -10
- package/src/quote.ts +12 -6
- package/src/react/Checkout.tsx +72 -70
- package/src/react/DepositAddress.tsx +213 -0
- package/src/react/Field.tsx +46 -0
- package/src/react/appearance.ts +3 -0
- package/src/react/index.ts +1 -0
- package/src/react/useCheckout.ts +6 -2
- package/src/server/addresses.ts +223 -0
- package/src/server/index.ts +38 -0
- package/src/server/sweeps.ts +197 -0
- package/src/server/webhook.ts +204 -0
- package/src/wallet.ts +74 -68
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard Webhooks `v1a` verification of Phala Pay deliveries (design D11): an ed25519 signature
|
|
3
|
+
* over `{webhook-id}.{webhook-timestamp}.{body}` by your account's webhook key in the endpoint's
|
|
4
|
+
* mode, pinned from `GET /v1/attestation`. Uses WebCrypto, so it runs on Node 20+, Deno, Bun, and
|
|
5
|
+
* edge runtimes.
|
|
6
|
+
*/
|
|
7
|
+
/** A delivery that did not verify: answer `400` and do nothing. */
|
|
8
|
+
export class WebhookSignatureError extends Error {
|
|
9
|
+
name = "WebhookSignatureError";
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Verifies a delivery and returns its event, as Stripe's `constructEvent` does, failing closed
|
|
13
|
+
* unless a `v1a` signature verifies with one of `publicKeys` (ed25519 keys in Standard Webhooks'
|
|
14
|
+
* `whpk_` form, as `GET /v1/attestation` lists them; pass both while a rotation overlaps), the
|
|
15
|
+
* timestamp is within tolerance, the body's id is the `webhook-id`, and the event is
|
|
16
|
+
* `expectedAccount`'s in `expectedLivemode`.
|
|
17
|
+
*
|
|
18
|
+
* `payload` is the raw request body, before any JSON parsing.
|
|
19
|
+
*/
|
|
20
|
+
export async function constructEvent(payload, headers, publicKeys, options) {
|
|
21
|
+
if (options.expectedAccount === "") {
|
|
22
|
+
throw new TypeError("expectedAccount is required");
|
|
23
|
+
}
|
|
24
|
+
const body = typeof payload === "string" ? new TextEncoder().encode(payload) : payload;
|
|
25
|
+
const id = header(headers, "webhook-id");
|
|
26
|
+
const timestamp = header(headers, "webhook-timestamp");
|
|
27
|
+
const signatures = header(headers, "webhook-signature");
|
|
28
|
+
if (id === undefined || timestamp === undefined || signatures === undefined) {
|
|
29
|
+
throw new WebhookSignatureError("webhook headers missing");
|
|
30
|
+
}
|
|
31
|
+
if (!/^\d+$/.test(timestamp)) {
|
|
32
|
+
throw new WebhookSignatureError("webhook timestamp malformed");
|
|
33
|
+
}
|
|
34
|
+
const now = options.now ?? Math.floor(Date.now() / 1000);
|
|
35
|
+
if (Math.abs(now - Number(timestamp)) > (options.tolerance ?? 300)) {
|
|
36
|
+
throw new WebhookSignatureError("webhook timestamp outside tolerance");
|
|
37
|
+
}
|
|
38
|
+
const signed = concat(new TextEncoder().encode(`${id}.${timestamp}.`), body);
|
|
39
|
+
const keys = await Promise.all((typeof publicKeys === "string" ? [publicKeys] : publicKeys).map(importKey));
|
|
40
|
+
if (keys.length === 0) {
|
|
41
|
+
throw new TypeError("no webhook public key pinned");
|
|
42
|
+
}
|
|
43
|
+
let verified = false;
|
|
44
|
+
for (const entry of signatures.split(" ")) {
|
|
45
|
+
const [version, encoded] = entry.split(",", 2);
|
|
46
|
+
const signature = version === "v1a" && encoded !== undefined ? base64(encoded) : undefined;
|
|
47
|
+
if (signature === undefined) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
for (const key of keys) {
|
|
51
|
+
if (await crypto.subtle.verify("Ed25519", key, signature, signed)) {
|
|
52
|
+
verified = true;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (!verified) {
|
|
57
|
+
throw new WebhookSignatureError("no valid webhook signature");
|
|
58
|
+
}
|
|
59
|
+
let event;
|
|
60
|
+
try {
|
|
61
|
+
event = JSON.parse(new TextDecoder().decode(body));
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
throw new TypeError("webhook body is not an event");
|
|
65
|
+
}
|
|
66
|
+
if (typeof event !== "object" || event === null) {
|
|
67
|
+
throw new TypeError("webhook body is not an event");
|
|
68
|
+
}
|
|
69
|
+
const e = event;
|
|
70
|
+
const data = e["data"];
|
|
71
|
+
const object = typeof data === "object" && data !== null ? data["object"] : null;
|
|
72
|
+
const { id: eventId, type, account, livemode, created, actor, request } = e;
|
|
73
|
+
if (e["object"] !== "event" ||
|
|
74
|
+
typeof eventId !== "string" ||
|
|
75
|
+
typeof type !== "string" ||
|
|
76
|
+
typeof account !== "string" ||
|
|
77
|
+
typeof livemode !== "boolean" ||
|
|
78
|
+
typeof created !== "number" ||
|
|
79
|
+
!Number.isSafeInteger(created) ||
|
|
80
|
+
typeof object !== "object" ||
|
|
81
|
+
object === null ||
|
|
82
|
+
typeof actor !== "string" ||
|
|
83
|
+
!(request === null || isRequest(request))) {
|
|
84
|
+
throw new TypeError("webhook body is not an event");
|
|
85
|
+
}
|
|
86
|
+
if (eventId !== id) {
|
|
87
|
+
throw new WebhookSignatureError("webhook id does not match the event");
|
|
88
|
+
}
|
|
89
|
+
if (account !== options.expectedAccount) {
|
|
90
|
+
throw new WebhookSignatureError("webhook event is for another account");
|
|
91
|
+
}
|
|
92
|
+
if (livemode !== options.expectedLivemode) {
|
|
93
|
+
throw new WebhookSignatureError("webhook event is for the other mode");
|
|
94
|
+
}
|
|
95
|
+
const previous = data["previous_attributes"];
|
|
96
|
+
return {
|
|
97
|
+
id: eventId,
|
|
98
|
+
object: "event",
|
|
99
|
+
account,
|
|
100
|
+
livemode,
|
|
101
|
+
type,
|
|
102
|
+
created,
|
|
103
|
+
actor,
|
|
104
|
+
request,
|
|
105
|
+
data: {
|
|
106
|
+
object: object,
|
|
107
|
+
...(typeof previous === "object" && previous !== null
|
|
108
|
+
? { previous_attributes: previous }
|
|
109
|
+
: {}),
|
|
110
|
+
},
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function header(headers, name) {
|
|
114
|
+
if (headers instanceof Headers) {
|
|
115
|
+
return headers.get(name)?.trim() ?? undefined;
|
|
116
|
+
}
|
|
117
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
118
|
+
if (key.toLowerCase() === name) {
|
|
119
|
+
return (Array.isArray(value) ? value.join(" ") : value)?.trim();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return undefined;
|
|
123
|
+
}
|
|
124
|
+
function isRequest(value) {
|
|
125
|
+
if (typeof value !== "object" || value === null) {
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
const { id, idempotency_key: key } = value;
|
|
129
|
+
return typeof id === "string" && (key === null || typeof key === "string");
|
|
130
|
+
}
|
|
131
|
+
async function importKey(encoded) {
|
|
132
|
+
const raw = encoded.startsWith("whpk_") ? base64(encoded.slice("whpk_".length)) : undefined;
|
|
133
|
+
if (raw?.length !== 32) {
|
|
134
|
+
throw new TypeError("a webhook public key is whpk_ and the base64 of 32 bytes");
|
|
135
|
+
}
|
|
136
|
+
return crypto.subtle.importKey("raw", raw, "Ed25519", false, ["verify"]);
|
|
137
|
+
}
|
|
138
|
+
function base64(value) {
|
|
139
|
+
if (!/^[A-Za-z0-9+/]*={0,2}$/.test(value) || value.length % 4 !== 0) {
|
|
140
|
+
return undefined;
|
|
141
|
+
}
|
|
142
|
+
return Uint8Array.from(atob(value), (char) => char.charCodeAt(0));
|
|
143
|
+
}
|
|
144
|
+
function concat(left, right) {
|
|
145
|
+
const joined = new Uint8Array(left.length + right.length);
|
|
146
|
+
joined.set(left);
|
|
147
|
+
joined.set(right, left.length);
|
|
148
|
+
return joined;
|
|
149
|
+
}
|
|
150
|
+
//# sourceMappingURL=webhook.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.js","sourceRoot":"","sources":["../../src/server/webhook.ts"],"names":[],"mappings":"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"}
|
package/dist/wallet.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type Hash } from "viem";
|
|
1
|
+
import { type Hash, type WalletClient } from "viem";
|
|
2
2
|
import type { ClientQuote } from "./quote.js";
|
|
3
3
|
/** EIP-6963 provider info. */
|
|
4
4
|
export interface WalletInfo {
|
|
@@ -22,9 +22,9 @@ export interface Wallet {
|
|
|
22
22
|
/** The legacy `window.ethereum` provider, offered when no wallet announces itself (EIP-6963). */
|
|
23
23
|
export declare const INJECTED_WALLET_UUID = "injected";
|
|
24
24
|
/**
|
|
25
|
-
* Discovers browser wallets with EIP-6963, falling back to
|
|
26
|
-
* with the current list whenever a wallet announces
|
|
27
|
-
* listening.
|
|
25
|
+
* Discovers browser wallets with EIP-6963 (through mipd's store), falling back to
|
|
26
|
+
* `window.ethereum`, and calls `onChange` with the current list whenever a wallet announces
|
|
27
|
+
* itself. Returns the function that stops listening.
|
|
28
28
|
*/
|
|
29
29
|
export declare function watchWallets(onChange: (wallets: Wallet[]) => void): () => void;
|
|
30
30
|
export type WalletErrorCode = "rejected" | "no_account" | "wrong_chain" | "failed";
|
|
@@ -34,9 +34,11 @@ export declare class WalletError extends Error {
|
|
|
34
34
|
constructor(code: WalletErrorCode, message: string, options?: ErrorOptions);
|
|
35
35
|
}
|
|
36
36
|
/**
|
|
37
|
-
* Pays a quote from a
|
|
38
|
-
*
|
|
39
|
-
*
|
|
37
|
+
* Pays a quote from a wallet: a viem `WalletClient` (for example wagmi's `useWalletClient()`), or an
|
|
38
|
+
* EIP-1193 provider such as a discovered `Wallet`'s. Connects (unless the client already has an
|
|
39
|
+
* account), switches to (or adds) the quote's chain, and sends the ERC-20 `transfer` that the quote's
|
|
40
|
+
* `payment_uri` states. Resolves with the transaction hash once the wallet has broadcast it; the
|
|
41
|
+
* checkout's status follows the payment from there.
|
|
40
42
|
*/
|
|
41
|
-
export declare function payWithWallet(
|
|
43
|
+
export declare function payWithWallet(wallet: WalletClient | EthereumProvider, quote: ClientQuote): Promise<Hash>;
|
|
42
44
|
//# sourceMappingURL=wallet.d.ts.map
|
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":"AACA,OAAO,EAOL,KAAK,IAAI,EACT,KAAK,YAAY,EAClB,MAAM,MAAM,CAAC;AAGd,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,GAAG,UAAU,GAAG,YAAY,GAAG,aAAa,GAAG,QAAQ,CAAC;AAEnF,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;;;;;;GAMG;AACH,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,GAAG,gBAAgB,EACvC,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC,IAAI,CAAC,CA0Bf"}
|
package/dist/wallet.js
CHANGED
|
@@ -1,53 +1,51 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { createStore } from "mipd";
|
|
2
|
+
import { BaseError, createWalletClient, custom, erc20Abi, SwitchChainError, UserRejectedRequestError, } from "viem";
|
|
2
3
|
import { knownChain, networkName } from "./chains.js";
|
|
3
4
|
import { quoteTransfer } from "./payment.js";
|
|
4
5
|
/** The legacy `window.ethereum` provider, offered when no wallet announces itself (EIP-6963). */
|
|
5
6
|
export const INJECTED_WALLET_UUID = "injected";
|
|
6
7
|
/**
|
|
7
|
-
* Discovers browser wallets with EIP-6963, falling back to
|
|
8
|
-
* with the current list whenever a wallet announces
|
|
9
|
-
* listening.
|
|
8
|
+
* Discovers browser wallets with EIP-6963 (through mipd's store), falling back to
|
|
9
|
+
* `window.ethereum`, and calls `onChange` with the current list whenever a wallet announces
|
|
10
|
+
* itself. Returns the function that stops listening.
|
|
10
11
|
*/
|
|
11
12
|
export function watchWallets(onChange) {
|
|
12
13
|
if (typeof window === "undefined") {
|
|
13
14
|
onChange([]);
|
|
14
15
|
return () => undefined;
|
|
15
16
|
}
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
provider: injected,
|
|
24
|
-
});
|
|
25
|
-
}
|
|
26
|
-
onChange(wallets);
|
|
17
|
+
const store = createStore();
|
|
18
|
+
const unsubscribe = store.subscribe((details) => onChange(walletsFrom(details)), {
|
|
19
|
+
emitImmediately: true,
|
|
20
|
+
});
|
|
21
|
+
return () => {
|
|
22
|
+
unsubscribe();
|
|
23
|
+
store.destroy();
|
|
27
24
|
};
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
25
|
+
}
|
|
26
|
+
/** Announcements are untrusted page events: keep well-formed ones, and only data-URI icons. */
|
|
27
|
+
function walletsFrom(announcements) {
|
|
28
|
+
const wallets = [];
|
|
29
|
+
for (const { info, provider } of announcements) {
|
|
30
|
+
if (!isProvider(provider) || typeof info?.uuid !== "string" || typeof info.name !== "string") {
|
|
31
|
+
continue;
|
|
35
32
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
33
|
+
const icon = typeof info.icon === "string" && info.icon.startsWith("data:image/") ? info.icon : "";
|
|
34
|
+
const rdns = typeof info.rdns === "string" ? info.rdns : "";
|
|
35
|
+
wallets.push({ info: { uuid: info.uuid, name: info.name, icon, rdns }, provider });
|
|
36
|
+
}
|
|
37
|
+
// Wallets that predate EIP-6963, such as some in-app mobile browsers, only set `window.ethereum`.
|
|
38
|
+
const injected = window.ethereum;
|
|
39
|
+
if (wallets.length === 0 && injected !== undefined) {
|
|
40
|
+
wallets.push({
|
|
41
|
+
info: { uuid: INJECTED_WALLET_UUID, name: "Browser wallet", icon: "", rdns: "" },
|
|
42
|
+
provider: injected,
|
|
44
43
|
});
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
return () => window.removeEventListener("eip6963:announceProvider", onAnnounce);
|
|
44
|
+
}
|
|
45
|
+
return wallets;
|
|
46
|
+
}
|
|
47
|
+
function isProvider(value) {
|
|
48
|
+
return typeof value?.request === "function";
|
|
51
49
|
}
|
|
52
50
|
export class WalletError extends Error {
|
|
53
51
|
code;
|
|
@@ -58,20 +56,22 @@ export class WalletError extends Error {
|
|
|
58
56
|
}
|
|
59
57
|
}
|
|
60
58
|
/**
|
|
61
|
-
* Pays a quote from a
|
|
62
|
-
*
|
|
63
|
-
*
|
|
59
|
+
* Pays a quote from a wallet: a viem `WalletClient` (for example wagmi's `useWalletClient()`), or an
|
|
60
|
+
* EIP-1193 provider such as a discovered `Wallet`'s. Connects (unless the client already has an
|
|
61
|
+
* account), switches to (or adds) the quote's chain, and sends the ERC-20 `transfer` that the quote's
|
|
62
|
+
* `payment_uri` states. Resolves with the transaction hash once the wallet has broadcast it; the
|
|
63
|
+
* checkout's status follows the payment from there.
|
|
64
64
|
*/
|
|
65
|
-
export async function payWithWallet(
|
|
65
|
+
export async function payWithWallet(wallet, quote) {
|
|
66
66
|
const transfer = quoteTransfer(quote);
|
|
67
|
-
const
|
|
67
|
+
const client = isWalletClient(wallet) ? wallet : createWalletClient({ transport: custom(wallet) });
|
|
68
68
|
try {
|
|
69
|
-
const
|
|
69
|
+
const account = client.account ?? (await client.requestAddresses())[0];
|
|
70
70
|
if (account === undefined) {
|
|
71
71
|
throw new WalletError("no_account", "The wallet shared no account");
|
|
72
72
|
}
|
|
73
|
-
await ensureChain(
|
|
74
|
-
return await
|
|
73
|
+
await ensureChain(client, transfer.chainId);
|
|
74
|
+
return await client.writeContract({
|
|
75
75
|
account,
|
|
76
76
|
chain: knownChain(transfer.chainId) ?? null,
|
|
77
77
|
address: transfer.token,
|
|
@@ -84,12 +84,15 @@ export async function payWithWallet(provider, quote) {
|
|
|
84
84
|
if (error instanceof WalletError) {
|
|
85
85
|
throw error;
|
|
86
86
|
}
|
|
87
|
-
if (
|
|
87
|
+
if (isRejection(error)) {
|
|
88
88
|
throw new WalletError("rejected", "The request was rejected in the wallet", { cause: error });
|
|
89
89
|
}
|
|
90
90
|
throw new WalletError("failed", "The wallet could not send the payment", { cause: error });
|
|
91
91
|
}
|
|
92
92
|
}
|
|
93
|
+
function isWalletClient(wallet) {
|
|
94
|
+
return "writeContract" in wallet;
|
|
95
|
+
}
|
|
93
96
|
async function ensureChain(wallet, chainId) {
|
|
94
97
|
if ((await wallet.getChainId()) === chainId) {
|
|
95
98
|
return;
|
|
@@ -98,10 +101,9 @@ async function ensureChain(wallet, chainId) {
|
|
|
98
101
|
await wallet.switchChain({ id: chainId });
|
|
99
102
|
}
|
|
100
103
|
catch (error) {
|
|
101
|
-
// 4902: the wallet does not know the chain yet.
|
|
102
104
|
const chain = knownChain(chainId);
|
|
103
|
-
if (!
|
|
104
|
-
throw
|
|
105
|
+
if (!isUnknownChain(error) || chain === undefined) {
|
|
106
|
+
throw isRejection(error)
|
|
105
107
|
? error
|
|
106
108
|
: new WalletError("wrong_chain", `Switch your wallet to ${networkName(chainId)}`, {
|
|
107
109
|
cause: error,
|
|
@@ -116,20 +118,16 @@ async function ensureChain(wallet, chainId) {
|
|
|
116
118
|
throw new WalletError("wrong_chain", `Switch your wallet to ${networkName(chainId)}`);
|
|
117
119
|
}
|
|
118
120
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
-
current = value.cause;
|
|
132
|
-
}
|
|
133
|
-
return false;
|
|
121
|
+
function isRejection(error) {
|
|
122
|
+
return error instanceof BaseError && error.walk((e) => e instanceof UserRejectedRequestError) !== null;
|
|
123
|
+
}
|
|
124
|
+
/** Whether the wallet does not know the chain (4902). MetaMask Mobile nests that code in an internal
|
|
125
|
+
* error's `data.originalError`, which wagmi's injected connector also unwraps. */
|
|
126
|
+
function isUnknownChain(error) {
|
|
127
|
+
return (error instanceof BaseError &&
|
|
128
|
+
error.walk((e) => {
|
|
129
|
+
const nested = e?.data;
|
|
130
|
+
return e instanceof SwitchChainError || nested?.originalError?.code === SwitchChainError.code;
|
|
131
|
+
}) !== null);
|
|
134
132
|
}
|
|
135
133
|
//# sourceMappingURL=wallet.js.map
|
package/dist/wallet.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,MAAM,EACN,QAAQ,
|
|
1
|
+
{"version":3,"file":"wallet.js","sourceRoot":"","sources":["../src/wallet.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@phala/pay",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Phala Pay checkout: a framework-agnostic client and React bindings",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"crypto",
|
|
@@ -32,6 +32,10 @@
|
|
|
32
32
|
"./react": {
|
|
33
33
|
"types": "./dist/react/index.d.ts",
|
|
34
34
|
"default": "./dist/react/index.js"
|
|
35
|
+
},
|
|
36
|
+
"./server": {
|
|
37
|
+
"types": "./dist/server/index.d.ts",
|
|
38
|
+
"default": "./dist/server/index.js"
|
|
35
39
|
}
|
|
36
40
|
},
|
|
37
41
|
"files": [
|
|
@@ -57,6 +61,7 @@
|
|
|
57
61
|
"check": "pnpm run typecheck && pnpm run lint && pnpm run test && pnpm run build"
|
|
58
62
|
},
|
|
59
63
|
"dependencies": {
|
|
64
|
+
"mipd": "^0.0.7",
|
|
60
65
|
"uqr": "^0.1.3"
|
|
61
66
|
},
|
|
62
67
|
"peerDependencies": {
|