thirdweb 5.106.1 → 5.107.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/dist/cjs/exports/x402.js +8 -0
- package/dist/cjs/exports/x402.js.map +1 -0
- package/dist/cjs/react/web/ui/Bridge/BuyWidget.js +1 -1
- package/dist/cjs/react/web/ui/Bridge/CheckoutWidget.js +1 -1
- package/dist/cjs/react/web/ui/Bridge/TransactionWidget.js +1 -1
- package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js +1 -0
- package/dist/cjs/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/x402/facilitator.js +76 -0
- package/dist/cjs/x402/facilitator.js.map +1 -0
- package/dist/cjs/x402/fetchWithPayment.js +121 -0
- package/dist/cjs/x402/fetchWithPayment.js.map +1 -0
- package/dist/esm/exports/x402.js +3 -0
- package/dist/esm/exports/x402.js.map +1 -0
- package/dist/esm/react/web/ui/Bridge/BuyWidget.js +1 -1
- package/dist/esm/react/web/ui/Bridge/CheckoutWidget.js +1 -1
- package/dist/esm/react/web/ui/Bridge/TransactionWidget.js +1 -1
- package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js +1 -0
- package/dist/esm/react/web/ui/Bridge/swap-widget/SwapWidget.js.map +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/esm/x402/facilitator.js +73 -0
- package/dist/esm/x402/facilitator.js.map +1 -0
- package/dist/esm/x402/fetchWithPayment.js +118 -0
- package/dist/esm/x402/fetchWithPayment.js.map +1 -0
- package/dist/types/exports/x402.d.ts +3 -0
- package/dist/types/exports/x402.d.ts.map +1 -0
- package/dist/types/react/web/ui/Bridge/BuyWidget.d.ts +1 -1
- package/dist/types/react/web/ui/Bridge/CheckoutWidget.d.ts +1 -1
- package/dist/types/react/web/ui/Bridge/TransactionWidget.d.ts +1 -1
- package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts +1 -0
- package/dist/types/react/web/ui/Bridge/swap-widget/SwapWidget.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/dist/types/x402/facilitator.d.ts +48 -0
- package/dist/types/x402/facilitator.d.ts.map +1 -0
- package/dist/types/x402/fetchWithPayment.d.ts +43 -0
- package/dist/types/x402/fetchWithPayment.d.ts.map +1 -0
- package/package.json +12 -3
- package/src/exports/x402.ts +5 -0
- package/src/react/web/ui/Bridge/BuyWidget.tsx +1 -1
- package/src/react/web/ui/Bridge/CheckoutWidget.tsx +1 -1
- package/src/react/web/ui/Bridge/TransactionWidget.tsx +1 -1
- package/src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx +1 -0
- package/src/version.ts +1 -1
- package/src/x402/facilitator.ts +87 -0
- package/src/x402/fetchWithPayment.ts +173 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapFetchWithPayment = exports.facilitator = void 0;
|
|
4
|
+
var facilitator_js_1 = require("../x402/facilitator.js");
|
|
5
|
+
Object.defineProperty(exports, "facilitator", { enumerable: true, get: function () { return facilitator_js_1.facilitator; } });
|
|
6
|
+
var fetchWithPayment_js_1 = require("../x402/fetchWithPayment.js");
|
|
7
|
+
Object.defineProperty(exports, "wrapFetchWithPayment", { enumerable: true, get: function () { return fetchWithPayment_js_1.wrapFetchWithPayment; } });
|
|
8
|
+
//# sourceMappingURL=x402.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../../src/exports/x402.ts"],"names":[],"mappings":";;;AAAA,yDAGgC;AAF9B,6GAAA,WAAW,OAAA;AAGb,mEAAmE;AAA1D,2HAAA,oBAAoB,OAAA"}
|
|
@@ -124,7 +124,7 @@ const UnsupportedTokenScreen_js_1 = require("./UnsupportedTokenScreen.js");
|
|
|
124
124
|
*
|
|
125
125
|
* Refer to the [`BuyWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/BuyWidgetConnectOptions) type for more details.
|
|
126
126
|
*
|
|
127
|
-
* @bridge
|
|
127
|
+
* @bridge
|
|
128
128
|
*/
|
|
129
129
|
function BuyWidget(props) {
|
|
130
130
|
const localeQuery = (0, getConnectLocale_js_1.useConnectLocale)(props.locale || "en_US");
|
|
@@ -119,7 +119,7 @@ const UnsupportedTokenScreen_js_1 = require("./UnsupportedTokenScreen.js");
|
|
|
119
119
|
*
|
|
120
120
|
* Refer to the [`CheckoutWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/CheckoutWidgetConnectOptions) type for more details.
|
|
121
121
|
*
|
|
122
|
-
* @bridge
|
|
122
|
+
* @bridge
|
|
123
123
|
*/
|
|
124
124
|
function CheckoutWidget(props) {
|
|
125
125
|
const localeQuery = (0, getConnectLocale_js_1.useConnectLocale)(props.locale || "en_US");
|
|
@@ -132,7 +132,7 @@ const UnsupportedTokenScreen_js_1 = require("./UnsupportedTokenScreen.js");
|
|
|
132
132
|
*
|
|
133
133
|
* Refer to the [`TransactionWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/TransactionWidgetConnectOptions) type for more details.
|
|
134
134
|
*
|
|
135
|
-
* @bridge
|
|
135
|
+
* @bridge
|
|
136
136
|
*/
|
|
137
137
|
function TransactionWidget(props) {
|
|
138
138
|
const localeQuery = (0, getConnectLocale_js_1.useConnectLocale)(props.locale || "en_US");
|
|
@@ -89,6 +89,7 @@ const use_bridge_chains_js_1 = require("./use-bridge-chains.js");
|
|
|
89
89
|
* }} />
|
|
90
90
|
* ```
|
|
91
91
|
*
|
|
92
|
+
* @bridge
|
|
92
93
|
*/
|
|
93
94
|
function SwapWidget(props) {
|
|
94
95
|
return ((0, jsx_runtime_1.jsx)(SwapWidgetContainer, { theme: props.theme, style: props.style, className: props.className, children: (0, jsx_runtime_1.jsx)(SwapWidgetContent, { ...props }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwapWidget.js","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;
|
|
1
|
+
{"version":3,"file":"SwapWidget.js","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"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"}
|
package/dist/cjs/version.js
CHANGED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.facilitator = facilitator;
|
|
4
|
+
const DEFAULT_BASE_URL = "https://api.thirdweb.com/v1/payments/x402";
|
|
5
|
+
/**
|
|
6
|
+
* Creates a facilitator for the x402 payment protocol.
|
|
7
|
+
* Use this with any x402 middleware to enable settling transactions with your thirdweb server wallet.
|
|
8
|
+
*
|
|
9
|
+
* @param config - The configuration for the facilitator
|
|
10
|
+
* @returns a x402 compatible FacilitatorConfig
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```ts
|
|
14
|
+
* import { facilitator } from "thirdweb/x402";
|
|
15
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
16
|
+
*
|
|
17
|
+
* const client = createThirdwebClient({
|
|
18
|
+
* secretKey: "your-secret-key",
|
|
19
|
+
* });
|
|
20
|
+
* const thirdwebX402Facilitator = facilitator({
|
|
21
|
+
* client: client,
|
|
22
|
+
* serverWalletAddress: "0x1234567890123456789012345678901234567890",
|
|
23
|
+
* });
|
|
24
|
+
*
|
|
25
|
+
* // add the facilitator to any x402 payment middleware
|
|
26
|
+
* const middleware = paymentMiddleware(
|
|
27
|
+
* "0x1234567890123456789012345678901234567890",
|
|
28
|
+
* {
|
|
29
|
+
* "/api/paywall": {
|
|
30
|
+
* price: "$0.01",
|
|
31
|
+
* network: "base-sepolia",
|
|
32
|
+
* config: {
|
|
33
|
+
* description: "Access to paid content",
|
|
34
|
+
* },
|
|
35
|
+
* },
|
|
36
|
+
* },
|
|
37
|
+
* thirdwebX402Facilitator,
|
|
38
|
+
* );
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @bridge x402
|
|
42
|
+
*/
|
|
43
|
+
function facilitator(config) {
|
|
44
|
+
const secretKey = config.client.secretKey;
|
|
45
|
+
if (!secretKey) {
|
|
46
|
+
throw new Error("Client secret key is required for the x402 facilitator");
|
|
47
|
+
}
|
|
48
|
+
const serverWalletAddress = config.serverWalletAddress;
|
|
49
|
+
if (!serverWalletAddress) {
|
|
50
|
+
throw new Error("Server wallet address is required for the x402 facilitator");
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
url: (config.baseUrl ?? DEFAULT_BASE_URL),
|
|
54
|
+
createAuthHeaders: async () => {
|
|
55
|
+
return {
|
|
56
|
+
verify: {
|
|
57
|
+
"x-secret-key": secretKey,
|
|
58
|
+
},
|
|
59
|
+
settle: {
|
|
60
|
+
"x-secret-key": secretKey,
|
|
61
|
+
"x-settlement-wallet-address": serverWalletAddress,
|
|
62
|
+
...(config.vaultAccessToken
|
|
63
|
+
? { "x-vault-access-token": config.vaultAccessToken }
|
|
64
|
+
: {}),
|
|
65
|
+
},
|
|
66
|
+
supported: {
|
|
67
|
+
"x-secret-key": secretKey,
|
|
68
|
+
},
|
|
69
|
+
list: {
|
|
70
|
+
"x-secret-key": secretKey,
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
//# sourceMappingURL=facilitator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../../src/x402/facilitator.ts"],"names":[],"mappings":";;AAkDA,kCAoCC;AA5ED,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,SAAgB,WAAW,CACzB,MAAqC;IAErC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAA4B;QACpE,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC5B,OAAO;gBACL,MAAM,EAAE;oBACN,cAAc,EAAE,SAAS;iBAC1B;gBACD,MAAM,EAAE;oBACN,cAAc,EAAE,SAAS;oBACzB,6BAA6B,EAAE,mBAAmB;oBAClD,GAAG,CAAC,MAAM,CAAC,gBAAgB;wBACzB,CAAC,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE;wBACrD,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,SAAS,EAAE;oBACT,cAAc,EAAE,SAAS;iBAC1B;gBACD,IAAI,EAAE;oBACJ,cAAc,EAAE,SAAS;iBAC1B;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapFetchWithPayment = wrapFetchWithPayment;
|
|
4
|
+
const client_1 = require("x402/client");
|
|
5
|
+
const types_1 = require("x402/types");
|
|
6
|
+
const viem_js_1 = require("../adapters/viem.js");
|
|
7
|
+
const utils_js_1 = require("../chains/utils.js");
|
|
8
|
+
/**
|
|
9
|
+
* Enables the payment of APIs using the x402 payment protocol.
|
|
10
|
+
*
|
|
11
|
+
* This function wraps the native fetch API to automatically handle 402 Payment Required responses
|
|
12
|
+
* by creating and sending a payment header. It will:
|
|
13
|
+
* 1. Make the initial request
|
|
14
|
+
* 2. If a 402 response is received, parse the payment requirements
|
|
15
|
+
* 3. Verify the payment amount is within the allowed maximum
|
|
16
|
+
* 4. Create a payment header using the provided wallet client
|
|
17
|
+
* 5. Retry the request with the payment header
|
|
18
|
+
*
|
|
19
|
+
* @param fetch - The fetch function to wrap (typically globalThis.fetch)
|
|
20
|
+
* @param client - The thirdweb client used to access RPC infrastructure
|
|
21
|
+
* @param wallet - The wallet used to sign payment messages
|
|
22
|
+
* @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
|
|
23
|
+
* @returns A wrapped fetch function that handles 402 responses automatically
|
|
24
|
+
*
|
|
25
|
+
* @example
|
|
26
|
+
* ```typescript
|
|
27
|
+
* import { wrapFetchWithPayment } from "thirdweb/x402";
|
|
28
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
29
|
+
* import { createWallet } from "thirdweb/wallets";
|
|
30
|
+
*
|
|
31
|
+
* const client = createThirdwebClient({ clientId: "your-client-id" });
|
|
32
|
+
* const wallet = createWallet("io.metamask");
|
|
33
|
+
* await wallet.connect({ client })
|
|
34
|
+
*
|
|
35
|
+
* const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
|
|
36
|
+
*
|
|
37
|
+
* // Make a request that may require payment
|
|
38
|
+
* const response = await fetchWithPay('https://api.example.com/paid-endpoint');
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* @throws {Error} If the payment amount exceeds the maximum allowed value
|
|
42
|
+
* @throws {Error} If a payment has already been attempted for this request
|
|
43
|
+
* @throws {Error} If there's an error creating the payment header
|
|
44
|
+
*
|
|
45
|
+
* @bridge x402
|
|
46
|
+
*/
|
|
47
|
+
function wrapFetchWithPayment(fetch, client, wallet, maxValue = BigInt(1 * 10 ** 6)) {
|
|
48
|
+
return async (input, init) => {
|
|
49
|
+
const response = await fetch(input, init);
|
|
50
|
+
if (response.status !== 402) {
|
|
51
|
+
return response;
|
|
52
|
+
}
|
|
53
|
+
const { x402Version, accepts } = (await response.json());
|
|
54
|
+
const parsedPaymentRequirements = accepts
|
|
55
|
+
.map((x) => types_1.PaymentRequirementsSchema.parse(x))
|
|
56
|
+
.filter((x) => x.scheme === "exact"); // TODO (402): accept other schemes
|
|
57
|
+
const account = wallet.getAccount();
|
|
58
|
+
let chain = wallet.getChain();
|
|
59
|
+
if (!account || !chain) {
|
|
60
|
+
throw new Error("Wallet not connected. Please connect your wallet to continue.");
|
|
61
|
+
}
|
|
62
|
+
const selectedPaymentRequirements = defaultPaymentRequirementsSelector(parsedPaymentRequirements, chain.id, "exact");
|
|
63
|
+
if (BigInt(selectedPaymentRequirements.maxAmountRequired) > maxValue) {
|
|
64
|
+
throw new Error("Payment amount exceeds maximum allowed");
|
|
65
|
+
}
|
|
66
|
+
const paymentChainId = types_1.EvmNetworkToChainId.get(selectedPaymentRequirements.network);
|
|
67
|
+
if (!paymentChainId) {
|
|
68
|
+
throw new Error(`No chain found for the selected payment requirement: ${selectedPaymentRequirements.network}`);
|
|
69
|
+
}
|
|
70
|
+
// switch to the payment chain if it's not the current chain
|
|
71
|
+
if (paymentChainId !== chain.id) {
|
|
72
|
+
await wallet.switchChain((0, utils_js_1.getCachedChain)(paymentChainId));
|
|
73
|
+
chain = wallet.getChain();
|
|
74
|
+
if (!chain) {
|
|
75
|
+
throw new Error(`Failed to switch chain (${paymentChainId})`);
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
const walletClient = viem_js_1.viemAdapter.wallet.toViem({
|
|
79
|
+
wallet: wallet,
|
|
80
|
+
chain,
|
|
81
|
+
client,
|
|
82
|
+
});
|
|
83
|
+
const paymentHeader = await (0, client_1.createPaymentHeader)(walletClient, x402Version, selectedPaymentRequirements);
|
|
84
|
+
const initParams = init || {};
|
|
85
|
+
if (initParams.__is402Retry) {
|
|
86
|
+
throw new Error("Payment already attempted");
|
|
87
|
+
}
|
|
88
|
+
const newInit = {
|
|
89
|
+
...initParams,
|
|
90
|
+
headers: {
|
|
91
|
+
...(initParams.headers || {}),
|
|
92
|
+
"X-PAYMENT": paymentHeader,
|
|
93
|
+
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
|
|
94
|
+
},
|
|
95
|
+
__is402Retry: true,
|
|
96
|
+
};
|
|
97
|
+
const secondResponse = await fetch(input, newInit);
|
|
98
|
+
return secondResponse;
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
function defaultPaymentRequirementsSelector(paymentRequirements, chainId, scheme) {
|
|
102
|
+
if (!paymentRequirements.length) {
|
|
103
|
+
throw new Error("No valid payment requirements found in server 402 response");
|
|
104
|
+
}
|
|
105
|
+
const currentWalletNetwork = types_1.ChainIdToNetwork[chainId];
|
|
106
|
+
// find the payment requirements matching the connected wallet chain
|
|
107
|
+
const matchingPaymentRequirements = paymentRequirements.find((x) => x.network === currentWalletNetwork && x.scheme === scheme);
|
|
108
|
+
if (matchingPaymentRequirements) {
|
|
109
|
+
return matchingPaymentRequirements;
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
// if no matching payment requirements, use the first payment requirement
|
|
113
|
+
// and switch the wallet to that chain
|
|
114
|
+
const firstPaymentRequirement = paymentRequirements.find((x) => x.scheme === scheme);
|
|
115
|
+
if (!firstPaymentRequirement) {
|
|
116
|
+
throw new Error("No suitable payment requirements found");
|
|
117
|
+
}
|
|
118
|
+
return firstPaymentRequirement;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
//# sourceMappingURL=fetchWithPayment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithPayment.js","sourceRoot":"","sources":["../../../src/x402/fetchWithPayment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.js","sourceRoot":"","sources":["../../../src/exports/x402.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,GAEZ,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -121,7 +121,7 @@ import { UnsupportedTokenScreen } from "./UnsupportedTokenScreen.js";
|
|
|
121
121
|
*
|
|
122
122
|
* Refer to the [`BuyWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/BuyWidgetConnectOptions) type for more details.
|
|
123
123
|
*
|
|
124
|
-
* @bridge
|
|
124
|
+
* @bridge
|
|
125
125
|
*/
|
|
126
126
|
export function BuyWidget(props) {
|
|
127
127
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
|
@@ -116,7 +116,7 @@ import { UnsupportedTokenScreen } from "./UnsupportedTokenScreen.js";
|
|
|
116
116
|
*
|
|
117
117
|
* Refer to the [`CheckoutWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/CheckoutWidgetConnectOptions) type for more details.
|
|
118
118
|
*
|
|
119
|
-
* @bridge
|
|
119
|
+
* @bridge
|
|
120
120
|
*/
|
|
121
121
|
export function CheckoutWidget(props) {
|
|
122
122
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
|
@@ -129,7 +129,7 @@ import { UnsupportedTokenScreen } from "./UnsupportedTokenScreen.js";
|
|
|
129
129
|
*
|
|
130
130
|
* Refer to the [`TransactionWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/TransactionWidgetConnectOptions) type for more details.
|
|
131
131
|
*
|
|
132
|
-
* @bridge
|
|
132
|
+
* @bridge
|
|
133
133
|
*/
|
|
134
134
|
export function TransactionWidget(props) {
|
|
135
135
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
|
@@ -85,6 +85,7 @@ import { useBridgeChains } from "./use-bridge-chains.js";
|
|
|
85
85
|
* }} />
|
|
86
86
|
* ```
|
|
87
87
|
*
|
|
88
|
+
* @bridge
|
|
88
89
|
*/
|
|
89
90
|
export function SwapWidget(props) {
|
|
90
91
|
return (_jsx(SwapWidgetContainer, { theme: props.theme, style: props.style, className: props.className, children: _jsx(SwapWidgetContent, { ...props }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwapWidget.js","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIzD,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAE7E,OAAO,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,uDAAuD,CAAC;AAI5F,OAAO,EAAE,gBAAgB,EAAE,MAAM,oCAAoC,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,2CAA2C,CAAC;AAC3E,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AACtE,OAAO,EAAE,aAAa,EAAE,MAAM,qCAAqC,CAAC;AACpE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACpE,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAMtC,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AA0IzD
|
|
1
|
+
{"version":3,"file":"SwapWidget.js","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"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"}
|
package/dist/esm/version.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export const version = "5.
|
|
1
|
+
export const version = "5.107.0";
|
|
2
2
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
const DEFAULT_BASE_URL = "https://api.thirdweb.com/v1/payments/x402";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a facilitator for the x402 payment protocol.
|
|
4
|
+
* Use this with any x402 middleware to enable settling transactions with your thirdweb server wallet.
|
|
5
|
+
*
|
|
6
|
+
* @param config - The configuration for the facilitator
|
|
7
|
+
* @returns a x402 compatible FacilitatorConfig
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* import { facilitator } from "thirdweb/x402";
|
|
12
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
13
|
+
*
|
|
14
|
+
* const client = createThirdwebClient({
|
|
15
|
+
* secretKey: "your-secret-key",
|
|
16
|
+
* });
|
|
17
|
+
* const thirdwebX402Facilitator = facilitator({
|
|
18
|
+
* client: client,
|
|
19
|
+
* serverWalletAddress: "0x1234567890123456789012345678901234567890",
|
|
20
|
+
* });
|
|
21
|
+
*
|
|
22
|
+
* // add the facilitator to any x402 payment middleware
|
|
23
|
+
* const middleware = paymentMiddleware(
|
|
24
|
+
* "0x1234567890123456789012345678901234567890",
|
|
25
|
+
* {
|
|
26
|
+
* "/api/paywall": {
|
|
27
|
+
* price: "$0.01",
|
|
28
|
+
* network: "base-sepolia",
|
|
29
|
+
* config: {
|
|
30
|
+
* description: "Access to paid content",
|
|
31
|
+
* },
|
|
32
|
+
* },
|
|
33
|
+
* },
|
|
34
|
+
* thirdwebX402Facilitator,
|
|
35
|
+
* );
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @bridge x402
|
|
39
|
+
*/
|
|
40
|
+
export function facilitator(config) {
|
|
41
|
+
const secretKey = config.client.secretKey;
|
|
42
|
+
if (!secretKey) {
|
|
43
|
+
throw new Error("Client secret key is required for the x402 facilitator");
|
|
44
|
+
}
|
|
45
|
+
const serverWalletAddress = config.serverWalletAddress;
|
|
46
|
+
if (!serverWalletAddress) {
|
|
47
|
+
throw new Error("Server wallet address is required for the x402 facilitator");
|
|
48
|
+
}
|
|
49
|
+
return {
|
|
50
|
+
url: (config.baseUrl ?? DEFAULT_BASE_URL),
|
|
51
|
+
createAuthHeaders: async () => {
|
|
52
|
+
return {
|
|
53
|
+
verify: {
|
|
54
|
+
"x-secret-key": secretKey,
|
|
55
|
+
},
|
|
56
|
+
settle: {
|
|
57
|
+
"x-secret-key": secretKey,
|
|
58
|
+
"x-settlement-wallet-address": serverWalletAddress,
|
|
59
|
+
...(config.vaultAccessToken
|
|
60
|
+
? { "x-vault-access-token": config.vaultAccessToken }
|
|
61
|
+
: {}),
|
|
62
|
+
},
|
|
63
|
+
supported: {
|
|
64
|
+
"x-secret-key": secretKey,
|
|
65
|
+
},
|
|
66
|
+
list: {
|
|
67
|
+
"x-secret-key": secretKey,
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=facilitator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../../src/x402/facilitator.ts"],"names":[],"mappings":"AAUA,MAAM,gBAAgB,GAAG,2CAA2C,CAAC;AAErE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,MAAM,UAAU,WAAW,CACzB,MAAqC;IAErC,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;IACvD,IAAI,CAAC,mBAAmB,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CACb,4DAA4D,CAC7D,CAAC;IACJ,CAAC;IACD,OAAO;QACL,GAAG,EAAE,CAAC,MAAM,CAAC,OAAO,IAAI,gBAAgB,CAA4B;QACpE,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC5B,OAAO;gBACL,MAAM,EAAE;oBACN,cAAc,EAAE,SAAS;iBAC1B;gBACD,MAAM,EAAE;oBACN,cAAc,EAAE,SAAS;oBACzB,6BAA6B,EAAE,mBAAmB;oBAClD,GAAG,CAAC,MAAM,CAAC,gBAAgB;wBACzB,CAAC,CAAC,EAAE,sBAAsB,EAAE,MAAM,CAAC,gBAAgB,EAAE;wBACrD,CAAC,CAAC,EAAE,CAAC;iBACR;gBACD,SAAS,EAAE;oBACT,cAAc,EAAE,SAAS;iBAC1B;gBACD,IAAI,EAAE;oBACJ,cAAc,EAAE,SAAS;iBAC1B;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { createPaymentHeader } from "x402/client";
|
|
2
|
+
import { ChainIdToNetwork, EvmNetworkToChainId, PaymentRequirementsSchema, } from "x402/types";
|
|
3
|
+
import { viemAdapter } from "../adapters/viem.js";
|
|
4
|
+
import { getCachedChain } from "../chains/utils.js";
|
|
5
|
+
/**
|
|
6
|
+
* Enables the payment of APIs using the x402 payment protocol.
|
|
7
|
+
*
|
|
8
|
+
* This function wraps the native fetch API to automatically handle 402 Payment Required responses
|
|
9
|
+
* by creating and sending a payment header. It will:
|
|
10
|
+
* 1. Make the initial request
|
|
11
|
+
* 2. If a 402 response is received, parse the payment requirements
|
|
12
|
+
* 3. Verify the payment amount is within the allowed maximum
|
|
13
|
+
* 4. Create a payment header using the provided wallet client
|
|
14
|
+
* 5. Retry the request with the payment header
|
|
15
|
+
*
|
|
16
|
+
* @param fetch - The fetch function to wrap (typically globalThis.fetch)
|
|
17
|
+
* @param client - The thirdweb client used to access RPC infrastructure
|
|
18
|
+
* @param wallet - The wallet used to sign payment messages
|
|
19
|
+
* @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
|
|
20
|
+
* @returns A wrapped fetch function that handles 402 responses automatically
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* import { wrapFetchWithPayment } from "thirdweb/x402";
|
|
25
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
26
|
+
* import { createWallet } from "thirdweb/wallets";
|
|
27
|
+
*
|
|
28
|
+
* const client = createThirdwebClient({ clientId: "your-client-id" });
|
|
29
|
+
* const wallet = createWallet("io.metamask");
|
|
30
|
+
* await wallet.connect({ client })
|
|
31
|
+
*
|
|
32
|
+
* const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
|
|
33
|
+
*
|
|
34
|
+
* // Make a request that may require payment
|
|
35
|
+
* const response = await fetchWithPay('https://api.example.com/paid-endpoint');
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* @throws {Error} If the payment amount exceeds the maximum allowed value
|
|
39
|
+
* @throws {Error} If a payment has already been attempted for this request
|
|
40
|
+
* @throws {Error} If there's an error creating the payment header
|
|
41
|
+
*
|
|
42
|
+
* @bridge x402
|
|
43
|
+
*/
|
|
44
|
+
export function wrapFetchWithPayment(fetch, client, wallet, maxValue = BigInt(1 * 10 ** 6)) {
|
|
45
|
+
return async (input, init) => {
|
|
46
|
+
const response = await fetch(input, init);
|
|
47
|
+
if (response.status !== 402) {
|
|
48
|
+
return response;
|
|
49
|
+
}
|
|
50
|
+
const { x402Version, accepts } = (await response.json());
|
|
51
|
+
const parsedPaymentRequirements = accepts
|
|
52
|
+
.map((x) => PaymentRequirementsSchema.parse(x))
|
|
53
|
+
.filter((x) => x.scheme === "exact"); // TODO (402): accept other schemes
|
|
54
|
+
const account = wallet.getAccount();
|
|
55
|
+
let chain = wallet.getChain();
|
|
56
|
+
if (!account || !chain) {
|
|
57
|
+
throw new Error("Wallet not connected. Please connect your wallet to continue.");
|
|
58
|
+
}
|
|
59
|
+
const selectedPaymentRequirements = defaultPaymentRequirementsSelector(parsedPaymentRequirements, chain.id, "exact");
|
|
60
|
+
if (BigInt(selectedPaymentRequirements.maxAmountRequired) > maxValue) {
|
|
61
|
+
throw new Error("Payment amount exceeds maximum allowed");
|
|
62
|
+
}
|
|
63
|
+
const paymentChainId = EvmNetworkToChainId.get(selectedPaymentRequirements.network);
|
|
64
|
+
if (!paymentChainId) {
|
|
65
|
+
throw new Error(`No chain found for the selected payment requirement: ${selectedPaymentRequirements.network}`);
|
|
66
|
+
}
|
|
67
|
+
// switch to the payment chain if it's not the current chain
|
|
68
|
+
if (paymentChainId !== chain.id) {
|
|
69
|
+
await wallet.switchChain(getCachedChain(paymentChainId));
|
|
70
|
+
chain = wallet.getChain();
|
|
71
|
+
if (!chain) {
|
|
72
|
+
throw new Error(`Failed to switch chain (${paymentChainId})`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
const walletClient = viemAdapter.wallet.toViem({
|
|
76
|
+
wallet: wallet,
|
|
77
|
+
chain,
|
|
78
|
+
client,
|
|
79
|
+
});
|
|
80
|
+
const paymentHeader = await createPaymentHeader(walletClient, x402Version, selectedPaymentRequirements);
|
|
81
|
+
const initParams = init || {};
|
|
82
|
+
if (initParams.__is402Retry) {
|
|
83
|
+
throw new Error("Payment already attempted");
|
|
84
|
+
}
|
|
85
|
+
const newInit = {
|
|
86
|
+
...initParams,
|
|
87
|
+
headers: {
|
|
88
|
+
...(initParams.headers || {}),
|
|
89
|
+
"X-PAYMENT": paymentHeader,
|
|
90
|
+
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
|
|
91
|
+
},
|
|
92
|
+
__is402Retry: true,
|
|
93
|
+
};
|
|
94
|
+
const secondResponse = await fetch(input, newInit);
|
|
95
|
+
return secondResponse;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
function defaultPaymentRequirementsSelector(paymentRequirements, chainId, scheme) {
|
|
99
|
+
if (!paymentRequirements.length) {
|
|
100
|
+
throw new Error("No valid payment requirements found in server 402 response");
|
|
101
|
+
}
|
|
102
|
+
const currentWalletNetwork = ChainIdToNetwork[chainId];
|
|
103
|
+
// find the payment requirements matching the connected wallet chain
|
|
104
|
+
const matchingPaymentRequirements = paymentRequirements.find((x) => x.network === currentWalletNetwork && x.scheme === scheme);
|
|
105
|
+
if (matchingPaymentRequirements) {
|
|
106
|
+
return matchingPaymentRequirements;
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
// if no matching payment requirements, use the first payment requirement
|
|
110
|
+
// and switch the wallet to that chain
|
|
111
|
+
const firstPaymentRequirement = paymentRequirements.find((x) => x.scheme === scheme);
|
|
112
|
+
if (!firstPaymentRequirement) {
|
|
113
|
+
throw new Error("No suitable payment requirements found");
|
|
114
|
+
}
|
|
115
|
+
return firstPaymentRequirement;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=fetchWithPayment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithPayment.js","sourceRoot":"","sources":["../../../src/x402/fetchWithPayment.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../../../src/exports/x402.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,KAAK,6BAA6B,GACnC,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -264,7 +264,7 @@ export type BuyWidgetProps = {
|
|
|
264
264
|
*
|
|
265
265
|
* Refer to the [`BuyWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/BuyWidgetConnectOptions) type for more details.
|
|
266
266
|
*
|
|
267
|
-
* @bridge
|
|
267
|
+
* @bridge
|
|
268
268
|
*/
|
|
269
269
|
export declare function BuyWidget(props: BuyWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
270
270
|
/**
|
|
@@ -260,7 +260,7 @@ export type CheckoutWidgetProps = {
|
|
|
260
260
|
*
|
|
261
261
|
* Refer to the [`CheckoutWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/CheckoutWidgetConnectOptions) type for more details.
|
|
262
262
|
*
|
|
263
|
-
* @bridge
|
|
263
|
+
* @bridge
|
|
264
264
|
*/
|
|
265
265
|
export declare function CheckoutWidget(props: CheckoutWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
266
266
|
/**
|
|
@@ -265,7 +265,7 @@ export type TransactionWidgetProps = {
|
|
|
265
265
|
*
|
|
266
266
|
* Refer to the [`TransactionWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/TransactionWidgetConnectOptions) type for more details.
|
|
267
267
|
*
|
|
268
|
-
* @bridge
|
|
268
|
+
* @bridge
|
|
269
269
|
*/
|
|
270
270
|
export declare function TransactionWidget(props: TransactionWidgetProps): import("react/jsx-runtime").JSX.Element;
|
|
271
271
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SwapWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAarE,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE;YACT,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF
|
|
1
|
+
{"version":3,"file":"SwapWidget.d.ts","sourceRoot":"","sources":["../../../../../../../src/react/web/ui/Bridge/swap-widget/SwapWidget.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAGhF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,yCAAyC,CAAC;AAarE,OAAO,KAAK,EACV,iBAAiB,EACjB,wBAAwB,EAEzB,MAAM,YAAY,CAAC;AAGpB,MAAM,MAAM,eAAe,GAAG;IAC5B;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,cAAc,CAAC;IACvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAgDG;IACH,OAAO,CAAC,EAAE;QACR,QAAQ,CAAC,EAAE;YACT,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,CAAC,EAAE;YACV,YAAY,CAAC,EAAE,MAAM,CAAC;YACtB,OAAO,EAAE,MAAM,CAAC;YAChB,MAAM,CAAC,EAAE,MAAM,CAAC;SACjB,CAAC;KACH,CAAC;IACF;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAC;IACjC;;;OAGG;IACH,QAAQ,CAAC,EAAE,qBAAqB,CAAC;IACjC,cAAc,CAAC,EAAE,wBAAwB,CAAC;IAC1C;;;OAGG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAC/B;;OAEG;IACH,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC/C;;OAEG;IACH,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC3D;;OAEG;IACH,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAC9C,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,eAAe,2CAUhD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IACzC,KAAK,EAAE,eAAe,CAAC,OAAO,CAAC,CAAC;IAChC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC;IAC9B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,GAAG,SAAS,CAAC;IACxC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B,2CAcA"}
|
package/dist/types/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const version = "5.
|
|
1
|
+
export declare const version = "5.107.0";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { FacilitatorConfig } from "x402/types";
|
|
2
|
+
import type { ThirdwebClient } from "../client/client.js";
|
|
3
|
+
export type ThirdwebX402FacilitatorConfig = {
|
|
4
|
+
client: ThirdwebClient;
|
|
5
|
+
serverWalletAddress: string;
|
|
6
|
+
vaultAccessToken?: string;
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* Creates a facilitator for the x402 payment protocol.
|
|
11
|
+
* Use this with any x402 middleware to enable settling transactions with your thirdweb server wallet.
|
|
12
|
+
*
|
|
13
|
+
* @param config - The configuration for the facilitator
|
|
14
|
+
* @returns a x402 compatible FacilitatorConfig
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```ts
|
|
18
|
+
* import { facilitator } from "thirdweb/x402";
|
|
19
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
20
|
+
*
|
|
21
|
+
* const client = createThirdwebClient({
|
|
22
|
+
* secretKey: "your-secret-key",
|
|
23
|
+
* });
|
|
24
|
+
* const thirdwebX402Facilitator = facilitator({
|
|
25
|
+
* client: client,
|
|
26
|
+
* serverWalletAddress: "0x1234567890123456789012345678901234567890",
|
|
27
|
+
* });
|
|
28
|
+
*
|
|
29
|
+
* // add the facilitator to any x402 payment middleware
|
|
30
|
+
* const middleware = paymentMiddleware(
|
|
31
|
+
* "0x1234567890123456789012345678901234567890",
|
|
32
|
+
* {
|
|
33
|
+
* "/api/paywall": {
|
|
34
|
+
* price: "$0.01",
|
|
35
|
+
* network: "base-sepolia",
|
|
36
|
+
* config: {
|
|
37
|
+
* description: "Access to paid content",
|
|
38
|
+
* },
|
|
39
|
+
* },
|
|
40
|
+
* },
|
|
41
|
+
* thirdwebX402Facilitator,
|
|
42
|
+
* );
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @bridge x402
|
|
46
|
+
*/
|
|
47
|
+
export declare function facilitator(config: ThirdwebX402FacilitatorConfig): FacilitatorConfig;
|
|
48
|
+
//# sourceMappingURL=facilitator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../../src/x402/facilitator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,MAAM,6BAA6B,GAAG;IAC1C,MAAM,EAAE,cAAc,CAAC;IACvB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAIF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,wBAAgB,WAAW,CACzB,MAAM,EAAE,6BAA6B,GACpC,iBAAiB,CAkCnB"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import type { ThirdwebClient } from "../client/client.js";
|
|
2
|
+
import type { Wallet } from "../wallets/interfaces/wallet.js";
|
|
3
|
+
/**
|
|
4
|
+
* Enables the payment of APIs using the x402 payment protocol.
|
|
5
|
+
*
|
|
6
|
+
* This function wraps the native fetch API to automatically handle 402 Payment Required responses
|
|
7
|
+
* by creating and sending a payment header. It will:
|
|
8
|
+
* 1. Make the initial request
|
|
9
|
+
* 2. If a 402 response is received, parse the payment requirements
|
|
10
|
+
* 3. Verify the payment amount is within the allowed maximum
|
|
11
|
+
* 4. Create a payment header using the provided wallet client
|
|
12
|
+
* 5. Retry the request with the payment header
|
|
13
|
+
*
|
|
14
|
+
* @param fetch - The fetch function to wrap (typically globalThis.fetch)
|
|
15
|
+
* @param client - The thirdweb client used to access RPC infrastructure
|
|
16
|
+
* @param wallet - The wallet used to sign payment messages
|
|
17
|
+
* @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
|
|
18
|
+
* @returns A wrapped fetch function that handles 402 responses automatically
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* import { wrapFetchWithPayment } from "thirdweb/x402";
|
|
23
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
24
|
+
* import { createWallet } from "thirdweb/wallets";
|
|
25
|
+
*
|
|
26
|
+
* const client = createThirdwebClient({ clientId: "your-client-id" });
|
|
27
|
+
* const wallet = createWallet("io.metamask");
|
|
28
|
+
* await wallet.connect({ client })
|
|
29
|
+
*
|
|
30
|
+
* const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
|
|
31
|
+
*
|
|
32
|
+
* // Make a request that may require payment
|
|
33
|
+
* const response = await fetchWithPay('https://api.example.com/paid-endpoint');
|
|
34
|
+
* ```
|
|
35
|
+
*
|
|
36
|
+
* @throws {Error} If the payment amount exceeds the maximum allowed value
|
|
37
|
+
* @throws {Error} If a payment has already been attempted for this request
|
|
38
|
+
* @throws {Error} If there's an error creating the payment header
|
|
39
|
+
*
|
|
40
|
+
* @bridge x402
|
|
41
|
+
*/
|
|
42
|
+
export declare function wrapFetchWithPayment(fetch: typeof globalThis.fetch, client: ThirdwebClient, wallet: Wallet, maxValue?: bigint): (input: RequestInfo, init?: RequestInit) => Promise<Response>;
|
|
43
|
+
//# sourceMappingURL=fetchWithPayment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetchWithPayment.d.ts","sourceRoot":"","sources":["../../../src/x402/fetchWithPayment.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAE9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,UAAU,CAAC,KAAK,EAC9B,MAAM,EAAE,cAAc,EACtB,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,MAA4B,IAExB,OAAO,WAAW,EAAE,OAAO,WAAW,uBAmFrD"}
|
package/package.json
CHANGED
|
@@ -38,9 +38,10 @@
|
|
|
38
38
|
"toml": "3.0.0",
|
|
39
39
|
"uqr": "0.1.2",
|
|
40
40
|
"viem": "2.33.2",
|
|
41
|
+
"x402": "0.6.1",
|
|
41
42
|
"zod": "3.25.75",
|
|
42
|
-
"@thirdweb-dev/
|
|
43
|
-
"@thirdweb-dev/
|
|
43
|
+
"@thirdweb-dev/insight": "1.1.1",
|
|
44
|
+
"@thirdweb-dev/engine": "3.2.1"
|
|
44
45
|
},
|
|
45
46
|
"devDependencies": {
|
|
46
47
|
"@aws-sdk/client-kms": "3.592.0",
|
|
@@ -226,6 +227,11 @@
|
|
|
226
227
|
"react-native": "./dist/esm/exports/wallets/in-app.native.js",
|
|
227
228
|
"import": "./dist/esm/exports/wallets/in-app.js",
|
|
228
229
|
"default": "./dist/cjs/exports/wallets/in-app.js"
|
|
230
|
+
},
|
|
231
|
+
"./x402": {
|
|
232
|
+
"types": "./dist/types/exports/x402.d.ts",
|
|
233
|
+
"import": "./dist/esm/exports/x402.js",
|
|
234
|
+
"default": "./dist/cjs/exports/x402.js"
|
|
229
235
|
}
|
|
230
236
|
},
|
|
231
237
|
"files": [
|
|
@@ -384,11 +390,14 @@
|
|
|
384
390
|
],
|
|
385
391
|
"insight": [
|
|
386
392
|
"./dist/types/exports/insight.d.ts"
|
|
393
|
+
],
|
|
394
|
+
"x402": [
|
|
395
|
+
"./dist/types/exports/x402.d.ts"
|
|
387
396
|
]
|
|
388
397
|
}
|
|
389
398
|
},
|
|
390
399
|
"typings": "./dist/types/exports/thirdweb.d.ts",
|
|
391
|
-
"version": "5.
|
|
400
|
+
"version": "5.107.0",
|
|
392
401
|
"scripts": {
|
|
393
402
|
"bench": "vitest -c ./test/vitest.config.ts bench",
|
|
394
403
|
"bench:compare": "bun run ./benchmarks/run.ts",
|
|
@@ -322,7 +322,7 @@ type UIOptionsResult =
|
|
|
322
322
|
*
|
|
323
323
|
* Refer to the [`BuyWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/BuyWidgetConnectOptions) type for more details.
|
|
324
324
|
*
|
|
325
|
-
* @bridge
|
|
325
|
+
* @bridge
|
|
326
326
|
*/
|
|
327
327
|
export function BuyWidget(props: BuyWidgetProps) {
|
|
328
328
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
|
@@ -318,7 +318,7 @@ type UIOptionsResult =
|
|
|
318
318
|
*
|
|
319
319
|
* Refer to the [`CheckoutWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/CheckoutWidgetConnectOptions) type for more details.
|
|
320
320
|
*
|
|
321
|
-
* @bridge
|
|
321
|
+
* @bridge
|
|
322
322
|
*/
|
|
323
323
|
export function CheckoutWidget(props: CheckoutWidgetProps) {
|
|
324
324
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
|
@@ -326,7 +326,7 @@ type UIOptionsResult =
|
|
|
326
326
|
*
|
|
327
327
|
* Refer to the [`TransactionWidgetConnectOptions`](https://portal.thirdweb.com/references/typescript/v5/TransactionWidgetConnectOptions) type for more details.
|
|
328
328
|
*
|
|
329
|
-
* @bridge
|
|
329
|
+
* @bridge
|
|
330
330
|
*/
|
|
331
331
|
export function TransactionWidget(props: TransactionWidgetProps) {
|
|
332
332
|
const localeQuery = useConnectLocale(props.locale || "en_US");
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const version = "5.
|
|
1
|
+
export const version = "5.107.0";
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { FacilitatorConfig } from "x402/types";
|
|
2
|
+
import type { ThirdwebClient } from "../client/client.js";
|
|
3
|
+
|
|
4
|
+
export type ThirdwebX402FacilitatorConfig = {
|
|
5
|
+
client: ThirdwebClient;
|
|
6
|
+
serverWalletAddress: string;
|
|
7
|
+
vaultAccessToken?: string;
|
|
8
|
+
baseUrl?: string;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
const DEFAULT_BASE_URL = "https://api.thirdweb.com/v1/payments/x402";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Creates a facilitator for the x402 payment protocol.
|
|
15
|
+
* Use this with any x402 middleware to enable settling transactions with your thirdweb server wallet.
|
|
16
|
+
*
|
|
17
|
+
* @param config - The configuration for the facilitator
|
|
18
|
+
* @returns a x402 compatible FacilitatorConfig
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* import { facilitator } from "thirdweb/x402";
|
|
23
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
24
|
+
*
|
|
25
|
+
* const client = createThirdwebClient({
|
|
26
|
+
* secretKey: "your-secret-key",
|
|
27
|
+
* });
|
|
28
|
+
* const thirdwebX402Facilitator = facilitator({
|
|
29
|
+
* client: client,
|
|
30
|
+
* serverWalletAddress: "0x1234567890123456789012345678901234567890",
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* // add the facilitator to any x402 payment middleware
|
|
34
|
+
* const middleware = paymentMiddleware(
|
|
35
|
+
* "0x1234567890123456789012345678901234567890",
|
|
36
|
+
* {
|
|
37
|
+
* "/api/paywall": {
|
|
38
|
+
* price: "$0.01",
|
|
39
|
+
* network: "base-sepolia",
|
|
40
|
+
* config: {
|
|
41
|
+
* description: "Access to paid content",
|
|
42
|
+
* },
|
|
43
|
+
* },
|
|
44
|
+
* },
|
|
45
|
+
* thirdwebX402Facilitator,
|
|
46
|
+
* );
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @bridge x402
|
|
50
|
+
*/
|
|
51
|
+
export function facilitator(
|
|
52
|
+
config: ThirdwebX402FacilitatorConfig,
|
|
53
|
+
): FacilitatorConfig {
|
|
54
|
+
const secretKey = config.client.secretKey;
|
|
55
|
+
if (!secretKey) {
|
|
56
|
+
throw new Error("Client secret key is required for the x402 facilitator");
|
|
57
|
+
}
|
|
58
|
+
const serverWalletAddress = config.serverWalletAddress;
|
|
59
|
+
if (!serverWalletAddress) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
"Server wallet address is required for the x402 facilitator",
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
url: (config.baseUrl ?? DEFAULT_BASE_URL) as `${string}://${string}`,
|
|
66
|
+
createAuthHeaders: async () => {
|
|
67
|
+
return {
|
|
68
|
+
verify: {
|
|
69
|
+
"x-secret-key": secretKey,
|
|
70
|
+
},
|
|
71
|
+
settle: {
|
|
72
|
+
"x-secret-key": secretKey,
|
|
73
|
+
"x-settlement-wallet-address": serverWalletAddress,
|
|
74
|
+
...(config.vaultAccessToken
|
|
75
|
+
? { "x-vault-access-token": config.vaultAccessToken }
|
|
76
|
+
: {}),
|
|
77
|
+
},
|
|
78
|
+
supported: {
|
|
79
|
+
"x-secret-key": secretKey,
|
|
80
|
+
},
|
|
81
|
+
list: {
|
|
82
|
+
"x-secret-key": secretKey,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
},
|
|
86
|
+
};
|
|
87
|
+
}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
import { createPaymentHeader } from "x402/client";
|
|
2
|
+
import {
|
|
3
|
+
ChainIdToNetwork,
|
|
4
|
+
EvmNetworkToChainId,
|
|
5
|
+
type PaymentRequirements,
|
|
6
|
+
PaymentRequirementsSchema,
|
|
7
|
+
type Signer,
|
|
8
|
+
} from "x402/types";
|
|
9
|
+
import { viemAdapter } from "../adapters/viem.js";
|
|
10
|
+
import { getCachedChain } from "../chains/utils.js";
|
|
11
|
+
import type { ThirdwebClient } from "../client/client.js";
|
|
12
|
+
import type { Wallet } from "../wallets/interfaces/wallet.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Enables the payment of APIs using the x402 payment protocol.
|
|
16
|
+
*
|
|
17
|
+
* This function wraps the native fetch API to automatically handle 402 Payment Required responses
|
|
18
|
+
* by creating and sending a payment header. It will:
|
|
19
|
+
* 1. Make the initial request
|
|
20
|
+
* 2. If a 402 response is received, parse the payment requirements
|
|
21
|
+
* 3. Verify the payment amount is within the allowed maximum
|
|
22
|
+
* 4. Create a payment header using the provided wallet client
|
|
23
|
+
* 5. Retry the request with the payment header
|
|
24
|
+
*
|
|
25
|
+
* @param fetch - The fetch function to wrap (typically globalThis.fetch)
|
|
26
|
+
* @param client - The thirdweb client used to access RPC infrastructure
|
|
27
|
+
* @param wallet - The wallet used to sign payment messages
|
|
28
|
+
* @param maxValue - The maximum allowed payment amount in base units (defaults to 1 USDC)
|
|
29
|
+
* @returns A wrapped fetch function that handles 402 responses automatically
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* import { wrapFetchWithPayment } from "thirdweb/x402";
|
|
34
|
+
* import { createThirdwebClient } from "thirdweb";
|
|
35
|
+
* import { createWallet } from "thirdweb/wallets";
|
|
36
|
+
*
|
|
37
|
+
* const client = createThirdwebClient({ clientId: "your-client-id" });
|
|
38
|
+
* const wallet = createWallet("io.metamask");
|
|
39
|
+
* await wallet.connect({ client })
|
|
40
|
+
*
|
|
41
|
+
* const fetchWithPay = wrapFetchWithPayment(fetch, client, wallet);
|
|
42
|
+
*
|
|
43
|
+
* // Make a request that may require payment
|
|
44
|
+
* const response = await fetchWithPay('https://api.example.com/paid-endpoint');
|
|
45
|
+
* ```
|
|
46
|
+
*
|
|
47
|
+
* @throws {Error} If the payment amount exceeds the maximum allowed value
|
|
48
|
+
* @throws {Error} If a payment has already been attempted for this request
|
|
49
|
+
* @throws {Error} If there's an error creating the payment header
|
|
50
|
+
*
|
|
51
|
+
* @bridge x402
|
|
52
|
+
*/
|
|
53
|
+
export function wrapFetchWithPayment(
|
|
54
|
+
fetch: typeof globalThis.fetch,
|
|
55
|
+
client: ThirdwebClient,
|
|
56
|
+
wallet: Wallet,
|
|
57
|
+
maxValue: bigint = BigInt(1 * 10 ** 6), // Default to 1 USDC
|
|
58
|
+
) {
|
|
59
|
+
return async (input: RequestInfo, init?: RequestInit) => {
|
|
60
|
+
const response = await fetch(input, init);
|
|
61
|
+
|
|
62
|
+
if (response.status !== 402) {
|
|
63
|
+
return response;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const { x402Version, accepts } = (await response.json()) as {
|
|
67
|
+
x402Version: number;
|
|
68
|
+
accepts: unknown[];
|
|
69
|
+
};
|
|
70
|
+
const parsedPaymentRequirements = accepts
|
|
71
|
+
.map((x) => PaymentRequirementsSchema.parse(x))
|
|
72
|
+
.filter((x) => x.scheme === "exact"); // TODO (402): accept other schemes
|
|
73
|
+
|
|
74
|
+
const account = wallet.getAccount();
|
|
75
|
+
let chain = wallet.getChain();
|
|
76
|
+
|
|
77
|
+
if (!account || !chain) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
"Wallet not connected. Please connect your wallet to continue.",
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
const selectedPaymentRequirements = defaultPaymentRequirementsSelector(
|
|
83
|
+
parsedPaymentRequirements,
|
|
84
|
+
chain.id,
|
|
85
|
+
"exact",
|
|
86
|
+
);
|
|
87
|
+
|
|
88
|
+
if (BigInt(selectedPaymentRequirements.maxAmountRequired) > maxValue) {
|
|
89
|
+
throw new Error("Payment amount exceeds maximum allowed");
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
const paymentChainId = EvmNetworkToChainId.get(
|
|
93
|
+
selectedPaymentRequirements.network,
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
if (!paymentChainId) {
|
|
97
|
+
throw new Error(
|
|
98
|
+
`No chain found for the selected payment requirement: ${selectedPaymentRequirements.network}`,
|
|
99
|
+
);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// switch to the payment chain if it's not the current chain
|
|
103
|
+
if (paymentChainId !== chain.id) {
|
|
104
|
+
await wallet.switchChain(getCachedChain(paymentChainId));
|
|
105
|
+
chain = wallet.getChain();
|
|
106
|
+
if (!chain) {
|
|
107
|
+
throw new Error(`Failed to switch chain (${paymentChainId})`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const walletClient = viemAdapter.wallet.toViem({
|
|
112
|
+
wallet: wallet,
|
|
113
|
+
chain,
|
|
114
|
+
client,
|
|
115
|
+
}) as Signer;
|
|
116
|
+
|
|
117
|
+
const paymentHeader = await createPaymentHeader(
|
|
118
|
+
walletClient,
|
|
119
|
+
x402Version,
|
|
120
|
+
selectedPaymentRequirements,
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
const initParams = init || {};
|
|
124
|
+
|
|
125
|
+
if ((initParams as { __is402Retry?: boolean }).__is402Retry) {
|
|
126
|
+
throw new Error("Payment already attempted");
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
const newInit = {
|
|
130
|
+
...initParams,
|
|
131
|
+
headers: {
|
|
132
|
+
...(initParams.headers || {}),
|
|
133
|
+
"X-PAYMENT": paymentHeader,
|
|
134
|
+
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
|
|
135
|
+
},
|
|
136
|
+
__is402Retry: true,
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
const secondResponse = await fetch(input, newInit);
|
|
140
|
+
return secondResponse;
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function defaultPaymentRequirementsSelector(
|
|
145
|
+
paymentRequirements: PaymentRequirements[],
|
|
146
|
+
chainId: number,
|
|
147
|
+
scheme: "exact",
|
|
148
|
+
) {
|
|
149
|
+
if (!paymentRequirements.length) {
|
|
150
|
+
throw new Error(
|
|
151
|
+
"No valid payment requirements found in server 402 response",
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
const currentWalletNetwork = ChainIdToNetwork[chainId];
|
|
155
|
+
// find the payment requirements matching the connected wallet chain
|
|
156
|
+
const matchingPaymentRequirements = paymentRequirements.find(
|
|
157
|
+
(x) => x.network === currentWalletNetwork && x.scheme === scheme,
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
if (matchingPaymentRequirements) {
|
|
161
|
+
return matchingPaymentRequirements;
|
|
162
|
+
} else {
|
|
163
|
+
// if no matching payment requirements, use the first payment requirement
|
|
164
|
+
// and switch the wallet to that chain
|
|
165
|
+
const firstPaymentRequirement = paymentRequirements.find(
|
|
166
|
+
(x) => x.scheme === scheme,
|
|
167
|
+
);
|
|
168
|
+
if (!firstPaymentRequirement) {
|
|
169
|
+
throw new Error("No suitable payment requirements found");
|
|
170
|
+
}
|
|
171
|
+
return firstPaymentRequirement;
|
|
172
|
+
}
|
|
173
|
+
}
|