@dexterai/x402 3.2.0 → 3.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/README.md +64 -0
- package/assets/x402gle-by-dexter.svg +49 -0
- package/assets/x402gle-wordmark.svg +22 -0
- package/dist/adapters/index.d.cts +3 -3
- package/dist/adapters/index.d.ts +3 -3
- package/dist/batch-settlement/index.cjs +1 -0
- package/dist/batch-settlement/index.d.cts +126 -0
- package/dist/batch-settlement/index.d.ts +126 -0
- package/dist/batch-settlement/index.js +1 -0
- package/dist/client/index.cjs +1 -1
- package/dist/client/index.d.cts +5 -5
- package/dist/client/index.d.ts +5 -5
- package/dist/client/index.js +1 -1
- package/dist/react/index.cjs +1 -1
- package/dist/react/index.d.cts +5 -5
- package/dist/react/index.d.ts +5 -5
- package/dist/react/index.js +1 -1
- package/dist/server/index.cjs +10 -10
- package/dist/server/index.d.cts +15 -3
- package/dist/server/index.d.ts +15 -3
- package/dist/server/index.js +10 -10
- package/dist/{sponsored-access-DP61rXDl.d.ts → sponsored-access-4wVjCYrH.d.ts} +2 -2
- package/dist/{sponsored-access-BuecDKXL.d.cts → sponsored-access-BEufXQ6c.d.cts} +2 -2
- package/dist/{types-i7C2GiVY.d.cts → types-B3kS1y_t.d.cts} +1 -1
- package/dist/{types-CKiTYeJ-.d.ts → types-Bcsi5jQb.d.cts} +11 -2
- package/dist/{types-CKiTYeJ-.d.cts → types-Bcsi5jQb.d.ts} +11 -2
- package/dist/{types-BPKUVJEl.d.ts → types-HFS_C6RX.d.ts} +1 -1
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -176,6 +176,67 @@ function PayButton() {
|
|
|
176
176
|
|
|
177
177
|
---
|
|
178
178
|
|
|
179
|
+
## Batch settlement (EVM)
|
|
180
|
+
|
|
181
|
+
Batch settlement lets a buyer pre-fund an escrow channel once, make many
|
|
182
|
+
**discrete** paid API calls against it with cheap off-chain vouchers, and then
|
|
183
|
+
close the channel — the seller's many charges are batched into a handful of
|
|
184
|
+
on-chain transactions instead of one per call. It amortizes gas across
|
|
185
|
+
high-frequency discrete purchasing.
|
|
186
|
+
|
|
187
|
+
It is **not** a streaming primitive — it batches discrete purchases. EVM only
|
|
188
|
+
(Base, Arbitrum, Polygon). The buyer never needs a gas token: every step
|
|
189
|
+
(deposit, voucher, claim, settle, refund) is signature-based; the Dexter
|
|
190
|
+
facilitator submits the transactions and pays the gas.
|
|
191
|
+
|
|
192
|
+
### Buyer
|
|
193
|
+
|
|
194
|
+
```ts
|
|
195
|
+
import { openBatchChannel } from '@dexterai/x402/batch-settlement';
|
|
196
|
+
|
|
197
|
+
// Open a channel — signs an escrow deposit authorization (no gas needed).
|
|
198
|
+
const channel = await openBatchChannel({
|
|
199
|
+
wallet: evmWallet, // any { address, signTypedData }
|
|
200
|
+
network: 'eip155:8453', // Base
|
|
201
|
+
deposit: '0.30', // USDC escrowed for this channel
|
|
202
|
+
});
|
|
203
|
+
|
|
204
|
+
// Each call signs a cumulative voucher against the channel.
|
|
205
|
+
const a = await channel.fetch('https://api.example.com/v1/data');
|
|
206
|
+
const b = await channel.fetch('https://api.example.com/v1/data');
|
|
207
|
+
|
|
208
|
+
console.log(channel.state); // { deposited: '0.3', spent: '0.16', remaining: '0.14' }
|
|
209
|
+
|
|
210
|
+
// Close — the facilitator claims, settles to the seller, and refunds the rest.
|
|
211
|
+
const receipt = await channel.close();
|
|
212
|
+
console.log(receipt.settledAmount, receipt.refundedAmount);
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Channel state auto-persists (localStorage in the browser, a file under
|
|
216
|
+
`~/.dexter-x402/channels` in Node). If the process restarts mid-session,
|
|
217
|
+
calling `openBatchChannel` again with the same wallet, network, and store
|
|
218
|
+
transparently resumes the open channel — the channel's state is recovered from
|
|
219
|
+
storage, or from on-chain state if storage was lost. Pass a custom `store` (any
|
|
220
|
+
`ChannelStore`) to persist elsewhere.
|
|
221
|
+
|
|
222
|
+
### Seller
|
|
223
|
+
|
|
224
|
+
Advertise the scheme from the existing server or middleware with one option —
|
|
225
|
+
Dexter operates the delegate authorizer, so the seller manages no signing key:
|
|
226
|
+
|
|
227
|
+
```ts
|
|
228
|
+
import { x402Middleware } from '@dexterai/x402/server';
|
|
229
|
+
|
|
230
|
+
app.use(x402Middleware({
|
|
231
|
+
payTo: '0xYourReceivingAddress',
|
|
232
|
+
amount: '0.08',
|
|
233
|
+
network: 'eip155:8453',
|
|
234
|
+
scheme: 'batch-settlement',
|
|
235
|
+
}));
|
|
236
|
+
```
|
|
237
|
+
|
|
238
|
+
---
|
|
239
|
+
|
|
179
240
|
## Supported Networks
|
|
180
241
|
|
|
181
242
|
All networks supported by the [Dexter facilitator](https://x402.dexter.cash/supported). USDC on every chain.
|
|
@@ -251,6 +312,9 @@ import { createX402Client } from '@dexterai/x402/client';
|
|
|
251
312
|
// Client - Node.js (private key wallet)
|
|
252
313
|
import { wrapFetch, createKeypairWallet } from '@dexterai/x402/client';
|
|
253
314
|
|
|
315
|
+
// Batch settlement - EVM escrow channel (gas amortization)
|
|
316
|
+
import { openBatchChannel } from '@dexterai/x402/batch-settlement';
|
|
317
|
+
|
|
254
318
|
// React hook
|
|
255
319
|
import { useX402Payment } from '@dexterai/x402/react';
|
|
256
320
|
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 600 240" role="img" aria-label="x402gle by Dexter">
|
|
3
|
+
<defs>
|
|
4
|
+
<linearGradient id="dexterGradient" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
5
|
+
<stop offset="0%" stop-color="#d13f00" />
|
|
6
|
+
<stop offset="42%" stop-color="#ff6b00" />
|
|
7
|
+
<stop offset="100%" stop-color="#ffb42c" />
|
|
8
|
+
</linearGradient>
|
|
9
|
+
<style><![CDATA[
|
|
10
|
+
@font-face {
|
|
11
|
+
font-family: 'X402gleJakarta';
|
|
12
|
+
font-style: normal;
|
|
13
|
+
font-weight: 700;
|
|
14
|
+
src: url(data:font/woff2;base64,d09GMgABAAAAAATYAA8AAAAACOAAAAR/AAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAbBEICoYkhSMBNgIkAygLFgAEIAWEZgcgG0IHUVRRIgC+SLCpiHsuNpoiUrSljaJMlstVmsruw+HhQ/rfCL7f73XPfRBCyahRAVkAtJnY6EiZiSzaelKdClf55/tOmwmqKeDLBq4Ys+b2JdsD5CTnL4CIcNtPl6NWhF7R/wDXD5EhR55KQG2J2CeOmS4aR9NsoaFmYqZFte8mttEAo63/Hwuk6b35yeR1G9LzAdzQ0i+Txx9KoB6QhFAKgVodEsGlFbUZ+MihIgBDZwgNabzAp3OiF0QjgZbn6TkdRyW9dQ+wOR8nTtAio/jDv9fWVunAalxDZmAlQNEMmwEBqYf0BtCDLIRqCe1IGEB6uW0nIJn709ANkZBrBiFq0gcgE1LUgwAJGdqRBdpR7AFaBSNLZvAJNWrRptuQL37A4N/g3FxWWWG5xWYEKZ4QFS2oWl/bDmjAf+ISAPmpoJMQ2zc6PSKYlh5MCYwKDk5A1IapbnYc8KMiEn2XB01zucDo+/et0zweOMbt9ptqU4DRLlfDVDMc48EI7tTF4f4wQL3KfbNgrt9PWR2Cpt1iWJbjhVgM27bCNeHaOQix3ff9FoewmBBRRuPklVUYH3Zzf0RFFFRViSx+NmSv8LMis2XqwUy44ACadirJZq5Ffk8Vqt79SOJVTzQEQds9zz6v4i4NJFvXgW+91BwAAqA/bEMkBPxAIz+AnNWCChrZ1650DPsxriz/WB23RDNMJR+l18nGDFPWDGJJsEwFl5spl9BZDLGNUHLkivnjBcXIPEIlGaMzSkcOVahL6zGRIq02J5CVv7658tmMWNkVBvY7WZvDS1WLMRbrRVKH4KeooDoFiB8XtQ1QSoOGsA5I2ULajWja8Bm7a3iF6kES0RC1RjSoX6wqquZ/Ch48nCoT4wNLTJ3052llDHp6+QsMK8sgOV22KCvNAEU/xv0A9SeCTwYunf9YMnAuORF4PHjJ3EeiPcDIx5ELfXrOSoJZk7+kmWDPe+uMDUf464/M5OmiAoU2EzSgigl1yh1OQrGNDquoGl+n2u50KrdPqLcPE8iKMwmDIZOQFwn5siIB6t9mCWC3Xbl7slS5IJ6zgc2VZH8fmH5UYe1kF8q7BYU1JbQETYH+y85DIicYut7q0Nydea/H0bN+0HMvfbXtYwAEUitLNcG1tW6FP6pH9g/g5x5mNAD82TSvWp9iVP5dlJKVkp9W/h2BuB8CUrvUpleFXa2ozQZ0ugH+20E2QGlDft4nubXAOlM6iFpXvB2hxsrMBOq8WXl5DT4BUImhz3liUu0vMbPoIzE3ESaxMBs7oTSSuUyRqY/3lprLEHXvoF9Oq1cbP4jg+gzh0KFNO0IyPu5oTGb2Aluo9br1cwaVGnSVoAOhgYEmcy8nLtMB16lFUySDslXRhHY4B8ZAs8NChD5O+Tg42nT06/ZrxNYE14ODgOuCIwzRpwUng/Ima/1iGf4t5XDdmvGxceXgKWCmo6JTsIeWFaHuLyHDY61aOEZ3wPVK3j26TSsCzh+PUxUutjxsAlw1GdltWs5tsQKhQbcOTYxwPf3dyEBlaBQAAA==) format('woff2');
|
|
15
|
+
}
|
|
16
|
+
@font-face {
|
|
17
|
+
font-family: 'DexterOrbitron';
|
|
18
|
+
font-style: normal;
|
|
19
|
+
font-weight: 800;
|
|
20
|
+
src: url(data:font/truetype;base64,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) format('truetype');
|
|
21
|
+
}
|
|
22
|
+
.wm {
|
|
23
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
24
|
+
font-weight: 700;
|
|
25
|
+
letter-spacing: -0.02em;
|
|
26
|
+
font-size: 140px;
|
|
27
|
+
}
|
|
28
|
+
.by {
|
|
29
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
30
|
+
font-weight: 700;
|
|
31
|
+
font-size: 18px;
|
|
32
|
+
fill: #888;
|
|
33
|
+
}
|
|
34
|
+
.dexter {
|
|
35
|
+
font-family: 'DexterOrbitron', 'Orbitron', sans-serif;
|
|
36
|
+
font-weight: 800;
|
|
37
|
+
letter-spacing: 0.01em;
|
|
38
|
+
font-size: 32px;
|
|
39
|
+
}
|
|
40
|
+
]]></style>
|
|
41
|
+
</defs>
|
|
42
|
+
<text class="wm" x="300" y="120" text-anchor="middle">
|
|
43
|
+
<tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
|
|
44
|
+
</text>
|
|
45
|
+
<g transform="translate(300, 200)">
|
|
46
|
+
<text class="by" x="-72" y="0" text-anchor="end">by</text>
|
|
47
|
+
<text class="dexter" x="-60" y="4" fill="url(#dexterGradient)">DEXTER</text>
|
|
48
|
+
</g>
|
|
49
|
+
</svg>
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 573 157" role="img" aria-label="x402gle wordmark">
|
|
3
|
+
<defs>
|
|
4
|
+
<style><![CDATA[
|
|
5
|
+
@font-face {
|
|
6
|
+
font-family: 'X402gleJakarta';
|
|
7
|
+
font-style: normal;
|
|
8
|
+
font-weight: 700;
|
|
9
|
+
src: url(data:font/woff2;base64,d09GMgABAAAAAAQ4AA8AAAAACAgAAAPfAAISLQAAAAAAAAAAAAAAAAAAAAAAAAAAGhYbIBwqBmA/U1RBVEQAZBEICoRghAkBNgIkAyALEgAEIAWEZgcgG5gGAB6D424plMVSBvOu5PJojxZB/X5lz/tv6f7esQwjSVLExrBwcajYJpJVKsJEJvvXd9brYAFGnHgJTSrT2QOk4PwFqf8BqkVOXI7/Nz/9425MwdTWwLamY03vEuspzLfP84CjaINtIArYU9X5VOWAgjPqDIHYl0ATkISQhUCbfkKgZStySsBOhtb/AI6CEURo4lzOHcZ94McETM/pQjoKTNIDWgWwVhcTB4giHeiGv8a2jdn5sBKUBmaX1kClC7UAAWkQ7SUGoQuhLqEPDcPQLp3swIjO6fONPchRyLogiEZ6BaAQUjRBgIQCfegCfRg2AV3c0DGJmlardj0Gtv57z+tM7lhqiQWmhsBmIVrqBHXQBbThJUA/AXKEMUkipOVG8dwYLl1uwY7Mww8slhhltZZTzLCMawu9nFD7uoeW622Tr5oGrzSb98JuSEuXmkxcckL5MvOIK2cCjd5pcghOlsuQY75mMu3hu60x6qFMJtdOY5a53LvHsbStvKzY7VBWllQ0iiJ2TLFiliDa+cX63Gu8PfpYZWvIP2VRiTO0RzNOlrRSmyNTnOnT4xxLLmenjsovShs+ODMnoUGcnMmtC3eRR61tqXo8LSD9klT8g5UXruLkpIjl8qehnZpvydE1bEj5GtsuzEpzHTR+XxqhFV3zEw2dtrNWFZMzIDV5UE5u8gBjSnZsjfq928ChzPRlZH98cZfkCTdRKuElPRWLE/mqQWIukZjAh9i/Y75yeu123GXx3AepQnvRMZejbotm308eC4fLytv1WdsonLnlXq6yemx99laKyto6rqFiiCY9ToALC8+QjFitOj3WBgoOOh6Ik5duv0nImhekWEcoU8O+9PMOZ5Z1ETEZPZqY2nhRcG50wcftB5IpGPyszJB7e/qdXkPv2gFP9A4dYwAgkHrkn/dM5dW7xny1oxd/4PsumR8AvzbMqflf/v8/c0T+AqlKIPglDJ8Y+L+OARD4dvV0DWJSC2GaCkJ/xCYCHNNbs1IpcZoOPAh1x9jah5kjvRAoPbBycgNvwcGHIc7ySd1vvrDAOz4bFzK+Yk5UcFWjYrZKFJrxoqmRyxnlHvJ+taa2+Gwpkt4gBp3adcBY1JTSxVLiBVplC/QwokKzNOrWGGPEGslSzN2H4q3AgNSlVTOMJZER1oFk4DhFKkyE6VGiKCi061y7GjUhNCP1UsBI3UjYIHqtFB2UTv3sVdzhY0lC6tFCjaAUTiVaiXzZ8kXXsMkz1Pwm9Hy6TCvD8E6kPqzqke3aYOR1fyjVlAiRCBpKtR0FyrV+t8mZsEY9OjUrQupdR6MDrVYiAAAA) format('woff2');
|
|
10
|
+
}
|
|
11
|
+
.wm {
|
|
12
|
+
font-family: 'X402gleJakarta', 'Plus Jakarta Sans', system-ui, sans-serif;
|
|
13
|
+
font-weight: 700;
|
|
14
|
+
letter-spacing: -0.02em;
|
|
15
|
+
font-size: 140px;
|
|
16
|
+
}
|
|
17
|
+
]]></style>
|
|
18
|
+
</defs>
|
|
19
|
+
<text class="wm" x="286.5" y="116" text-anchor="middle">
|
|
20
|
+
<tspan fill="#4285F4">x</tspan><tspan fill="#EA4335">4</tspan><tspan fill="#FBBC05">0</tspan><tspan fill="#4285F4">2</tspan><tspan fill="#34A853">g</tspan><tspan fill="#EA4335">l</tspan><tspan fill="#FBBC05">e</tspan>
|
|
21
|
+
</text>
|
|
22
|
+
</svg>
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-
|
|
2
|
-
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-
|
|
1
|
+
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-B3kS1y_t.cjs';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-B3kS1y_t.cjs';
|
|
3
3
|
export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.cjs';
|
|
4
|
-
import '../types-
|
|
4
|
+
import '../types-Bcsi5jQb.cjs';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Check if an asset address is a known USDC contract (any chain).
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-
|
|
2
|
-
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-
|
|
1
|
+
import { b as SolanaAdapter, d as EvmAdapter, C as ChainAdapter } from '../types-HFS_C6RX.js';
|
|
2
|
+
export { A as AdapterConfig, B as BalanceInfo, E as EvmWallet, G as GenericWallet, e as SignedTransaction, S as SolanaWallet, W as WalletSet, a as createEvmAdapter, c as createSolanaAdapter, f as isEvmWallet, i as isSolanaWallet } from '../types-HFS_C6RX.js';
|
|
3
3
|
export { A as ARBITRUM_ONE, l as AVALANCHE, B as BASE_MAINNET, j as BASE_SEPOLIA, f as BSC_MAINNET, i as BSC_STABLECOIN_ADDRESSES, h as BSC_USDC, g as BSC_USDT, E as ETHEREUM_MAINNET, O as OPTIMISM, P as PERMIT2_ADDRESS, k as POLYGON, m as SKALE_BASE, n as SKALE_BASE_SEPOLIA, d as SOLANA_DEVNET, S as SOLANA_MAINNET, e as SOLANA_TESTNET, o as USDC_ADDRESSES, X as X402_EXACT_PERMIT2_PROXY } from '../constants-qU-4U3L-.js';
|
|
4
|
-
import '../types-
|
|
4
|
+
import '../types-Bcsi5jQb.js';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Check if an asset address is a known USDC contract (any chain).
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var b=Object.defineProperty;var Z=Object.getOwnPropertyDescriptor;var ee=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var ne=(e,t)=>{for(var n in t)b(e,n,{get:t[n],enumerable:!0})},re=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ee(t))!te.call(e,a)&&a!==n&&b(e,a,{get:()=>t[a],enumerable:!(r=Z(t,a))||r.enumerable});return e};var ae=e=>re(b({},"__esModule",{value:!0}),e);var se={};ne(se,{InsufficientBalanceError:()=>w,UnsupportedNetworkError:()=>d,createFileChannelStore:()=>U,createLocalStorageChannelStore:()=>I,getDefaultChannelStore:()=>S,openBatchChannel:()=>G,resumeBatchChannel:()=>K});module.exports=ae(se);var i=require("viem"),u=require("viem/chains"),N=require("@x402/evm"),x=require("@x402/evm/batch-settlement/client"),k=require("@x402/core/client");var D=require("os"),$=require("path"),M=require("@x402/evm/batch-settlement/client");function U(e){return new M.FileClientChannelStorage({directory:e})}var v="dexter-x402-channel:";function I(e){return{async get(t){let n=e.getItem(v+t);return n?JSON.parse(n):void 0},async set(t,n){e.setItem(v+t,JSON.stringify(n))},async delete(t){e.removeItem(v+t)}}}function S(){let e=globalThis.localStorage;return e?I(e):U((0,$.join)((0,D.homedir)(),".dexter-x402","channels"))}var B=require("viem"),F=require("@x402/core/server"),H=require("@x402/evm/batch-settlement/server"),j=6;async function _(e,t,n){let{claims:r,settle:a}=await e.claimAndSettle();if(r.length===0&&BigInt(n.settledAtomic)>0n)throw new Error(`batch-settlement close inconsistency: channel accounting expected a settled amount of ${n.settledAtomic} atomic units, but the facilitator's claimAndSettle reported no claim transaction (claims was empty)`);let p=(await e.refund([t]))[0];return{claimTx:r[0]?.transaction??"",settleTx:a?.transaction??"",refundTx:p?.transaction??"",settledAmount:(0,B.formatUnits)(BigInt(n.settledAtomic),j),refundedAmount:(0,B.formatUnits)(BigInt(n.refundedAtomic),j)}}function q(e,t,n){let r=new F.HTTPFacilitatorClient({url:e});return new H.BatchSettlementEvmScheme(n).createChannelManager(r,t)}var w=class extends Error{constructor(t){super(t),this.name="InsufficientBalanceError"}},d=class extends Error{constructor(t){super(t),this.name="UnsupportedNetworkError"}};var W={"eip155:8453":{chain:u.base,defaultRpc:"https://mainnet.base.org"},"eip155:42161":{chain:u.arbitrum,defaultRpc:"https://arb1.arbitrum.io/rpc"},"eip155:137":{chain:u.polygon,defaultRpc:"https://polygon-rpc.com"}};function J(e){let t=W[e.network];if(!t)throw new d(`batch-settlement is not available on network "${e.network}" \u2014 supported: ${Object.keys(W).join(", ")}`);let n=e.rpcUrl??t.defaultRpc,r=e.wallet.signTypedData;if(typeof r!="function")throw new Error("batch-settlement requires an EvmWallet that supports signTypedData (EIP-712)");let a=(0,i.createWalletClient)({account:{address:e.wallet.address,type:"json-rpc"},chain:t.chain,transport:(0,i.http)(n)}).extend(i.publicActions),s=Object.assign(a,{address:e.wallet.address,signTypedData:o=>r.call(e.wallet,o)}),p=(0,N.toClientEvmSigner)(s),c=new x.BatchSettlementEvmScheme(p,{storage:e.store,depositPolicy:{depositMultiplier:4},depositStrategy:()=>e.depositAtomic}),l=new k.x402Client;l.register(e.network,c);let R=new k.x402HTTPClient(l);return{scheme:c,x402Cli:l,httpClient:R,rpcUrl:n}}var y=6,X="https://x402.dexter.cash";function oe(e,t){let n=t>e?0n:e-t;return{deposited:(0,i.formatUnits)(e,y),spent:(0,i.formatUnits)(t,y),remaining:(0,i.formatUnits)(n,y)}}function ie(e){let t=e.payload;if(!t||typeof t!="object")return"";let n=t.voucher;if(!n||typeof n!="object")return"";let r=n.channelId;return typeof r=="string"?r:""}function z(e){let{stack:t,store:n,facilitatorUrl:r,network:a}=e,s="",p="",c=e.depositedAtomic,l=0n;async function R(){if(!s)return;let o=await(0,x.getChannel)(n,s);o&&(o.chargedCumulativeAmount!==void 0&&(l=BigInt(o.chargedCumulativeAmount)),c===0n&&o.balance!==void 0&&(c=BigInt(o.balance)))}return{get channelId(){return s},get network(){return a},get state(){return oe(c,l)},async fetch(o,f){let{httpClient:m}=t,h=await fetch(o,f);if(h.status!==402)return h;let E=m.getPaymentRequiredResponse(g=>h.headers.get(g),await h.clone().json().catch(()=>{})),P=E.accepts?.[0];P?.payTo&&(p=P.payTo);let T=2,L;for(let g=1;g<=T;g+=1){let A=await m.createPaymentPayload(E),O=ie(A);O&&(s=O);let Q=m.encodePaymentSignatureHeader(A),C=await fetch(o,{...f,headers:{...f?.headers??{},...Q}});L=C;let{recovered:V}=await m.processPaymentResult(A,Y=>C.headers.get(Y),C.status);if(await R(),!(C.status===402&&V&&g<T))return C}return L},async close(){if(!s)throw new Error("cannot close a channel that has made no requests \u2014 call fetch() at least once first");if(!p)throw new Error("cannot close: the seller payout address is unknown (no 402 was observed)");let o=l.toString(),f=(l>c?0n:c-l).toString(),m=q(r,a,p),h=await _(m,s,{settledAtomic:o,refundedAtomic:f});return await n.delete(s.toLowerCase()),h}}}async function G(e){let t=e.store??S(),n=e.facilitatorUrl??X,r;try{r=(0,i.parseUnits)(e.deposit,y)}catch{throw new Error(`deposit must be a valid USDC amount in decimal units (e.g. "0.30"), got "${e.deposit}"`)}if(r<=0n)throw new Error(`deposit must be a positive amount, got "${e.deposit}"`);let a=J({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:r.toString()});return z({stack:a,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:r})}async function K(e){let t=e.store??S(),n=e.facilitatorUrl??X,r=J({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:"0"});return z({stack:r,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:0n})}0&&(module.exports={InsufficientBalanceError,UnsupportedNetworkError,createFileChannelStore,createLocalStorageChannelStore,getDefaultChannelStore,openBatchChannel,resumeBatchChannel});
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { ClientChannelStorage } from '@x402/evm/batch-settlement/client';
|
|
2
|
+
import { E as EvmWallet } from '../types-B3kS1y_t.cjs';
|
|
3
|
+
import '../types-Bcsi5jQb.cjs';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Channel persistence. This is the upstream `ClientChannelStorage` interface
|
|
7
|
+
* (`get` / `set` / `delete`, keyed by lowercased channelId). The SDK ships
|
|
8
|
+
* file-backed and localStorage-backed implementations; a consumer may pass any
|
|
9
|
+
* `ClientChannelStorage` (e.g. one backed by their own database).
|
|
10
|
+
*/
|
|
11
|
+
type ChannelStore = ClientChannelStorage;
|
|
12
|
+
/** Channel accounting, all amounts USDC human units (e.g. "0.30"). */
|
|
13
|
+
interface ChannelState {
|
|
14
|
+
/** Total escrowed into the channel. */
|
|
15
|
+
deposited: string;
|
|
16
|
+
/** Cumulative amount spent via vouchers. */
|
|
17
|
+
spent: string;
|
|
18
|
+
/** deposited - spent. */
|
|
19
|
+
remaining: string;
|
|
20
|
+
}
|
|
21
|
+
/** Options for opening a fresh (or auto-resumed) channel. */
|
|
22
|
+
interface OpenBatchChannelOptions {
|
|
23
|
+
/** EVM wallet — any { address, signTypedData }. The same EvmWallet the exact scheme uses. */
|
|
24
|
+
wallet: EvmWallet;
|
|
25
|
+
/** CAIP-2 network: eip155:8453 (Base), eip155:42161 (Arbitrum), eip155:137 (Polygon). */
|
|
26
|
+
network: string;
|
|
27
|
+
/** Total escrow for the channel, USDC human units, e.g. "0.30". */
|
|
28
|
+
deposit: string;
|
|
29
|
+
/** Facilitator base URL. Default: https://x402.dexter.cash */
|
|
30
|
+
facilitatorUrl?: string;
|
|
31
|
+
/** RPC URL override. Default: per-network. */
|
|
32
|
+
rpcUrl?: string;
|
|
33
|
+
/** Channel persistence. Default: localStorage (browser) / file (Node). */
|
|
34
|
+
store?: ChannelStore;
|
|
35
|
+
}
|
|
36
|
+
/** Options for explicitly resuming an existing channel. */
|
|
37
|
+
interface ResumeBatchChannelOptions {
|
|
38
|
+
wallet: EvmWallet;
|
|
39
|
+
network: string;
|
|
40
|
+
facilitatorUrl?: string;
|
|
41
|
+
rpcUrl?: string;
|
|
42
|
+
store?: ChannelStore;
|
|
43
|
+
}
|
|
44
|
+
/** Result of channel.close() — the three settlement tx hashes and final amounts. */
|
|
45
|
+
interface CloseReceipt {
|
|
46
|
+
/** claimWithSignature tx hash. */
|
|
47
|
+
claimTx: string;
|
|
48
|
+
/** settle tx hash. */
|
|
49
|
+
settleTx: string;
|
|
50
|
+
/** refundWithSignature tx hash. */
|
|
51
|
+
refundTx: string;
|
|
52
|
+
/** Amount paid to the seller, USDC human units. */
|
|
53
|
+
settledAmount: string;
|
|
54
|
+
/** Unspent amount returned to the buyer, USDC human units. */
|
|
55
|
+
refundedAmount: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A live escrow channel. Returned by openBatchChannel / resumeBatchChannel.
|
|
59
|
+
* Hold this handle for the lifetime of a batching session.
|
|
60
|
+
*/
|
|
61
|
+
interface BatchSettlementChannel {
|
|
62
|
+
/** On-chain channel id (bytes32 hex). Empty until the first fetch resolves it. */
|
|
63
|
+
readonly channelId: string;
|
|
64
|
+
/** CAIP-2 network. */
|
|
65
|
+
readonly network: string;
|
|
66
|
+
/** Live channel accounting; updated after each fetch. */
|
|
67
|
+
readonly state: ChannelState;
|
|
68
|
+
/** Drop-in fetch. On a batch-settlement 402, signs a voucher and retries. */
|
|
69
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
70
|
+
/** Facilitator-driven claim -> settle -> refund. Resumable if interrupted. */
|
|
71
|
+
close(): Promise<CloseReceipt>;
|
|
72
|
+
}
|
|
73
|
+
/** Thrown by openBatchChannel when the buyer wallet lacks USDC for the deposit. */
|
|
74
|
+
declare class InsufficientBalanceError extends Error {
|
|
75
|
+
constructor(message: string);
|
|
76
|
+
}
|
|
77
|
+
/** Thrown when a network has no deployed x402BatchSettlement contract. */
|
|
78
|
+
declare class UnsupportedNetworkError extends Error {
|
|
79
|
+
constructor(message: string);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Opens a fresh batch-settlement escrow channel. No network call happens here:
|
|
84
|
+
* the channel is escrowed lazily on the FIRST `fetch`, where the upstream
|
|
85
|
+
* scheme signs an ERC-3009 deposit authorization (the facilitator pays the
|
|
86
|
+
* deposit gas — the buyer needs no native token, only USDC).
|
|
87
|
+
*
|
|
88
|
+
* The returned handle exposes accounting immediately (`deposited` from the
|
|
89
|
+
* `deposit` option, `spent` 0); `channelId` stays empty until the first fetch.
|
|
90
|
+
*
|
|
91
|
+
* @throws UnsupportedNetworkError when the network has no deployed contract.
|
|
92
|
+
* @throws Error when `deposit` is not a positive amount.
|
|
93
|
+
*/
|
|
94
|
+
declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
|
|
95
|
+
/**
|
|
96
|
+
* Resumes an already-open batch-settlement channel — same buyer wallet, same
|
|
97
|
+
* network, no new deposit. The upstream scheme recovers channel state from the
|
|
98
|
+
* `store` (or, with an RPC, from on-chain) on the first `fetch`.
|
|
99
|
+
*
|
|
100
|
+
* Because no deposit is opened, the handle's accounting starts at zero and is
|
|
101
|
+
* corrected from the recovered channel context (its on-chain `balance`) once
|
|
102
|
+
* the first `fetch` resolves the channel; `channelId`, `fetch`, and `close`
|
|
103
|
+
* are fully functional throughout.
|
|
104
|
+
*
|
|
105
|
+
* @throws UnsupportedNetworkError when the network has no deployed contract.
|
|
106
|
+
*/
|
|
107
|
+
declare function resumeBatchChannel(options: ResumeBatchChannelOptions): Promise<BatchSettlementChannel>;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* File-backed ChannelStore for Node. This is the upstream FileClientChannelStorage,
|
|
111
|
+
* which persists each channel context as a JSON file under `{root}/client/`.
|
|
112
|
+
*/
|
|
113
|
+
declare function createFileChannelStore(root: string): ChannelStore;
|
|
114
|
+
/**
|
|
115
|
+
* localStorage-backed ChannelStore for browsers. Channel contexts are stored
|
|
116
|
+
* under a prefixed key so they never collide with other localStorage entries.
|
|
117
|
+
* Implements the upstream ClientChannelStorage interface (get / set / delete).
|
|
118
|
+
*/
|
|
119
|
+
declare function createLocalStorageChannelStore(storage: Storage): ChannelStore;
|
|
120
|
+
/**
|
|
121
|
+
* Returns the environment-appropriate default ChannelStore: localStorage in a
|
|
122
|
+
* browser, a file store at ~/.dexter-x402/channels in Node.
|
|
123
|
+
*/
|
|
124
|
+
declare function getDefaultChannelStore(): ChannelStore;
|
|
125
|
+
|
|
126
|
+
export { type BatchSettlementChannel, type ChannelState, type ChannelStore, type CloseReceipt, InsufficientBalanceError, type OpenBatchChannelOptions, type ResumeBatchChannelOptions, UnsupportedNetworkError, createFileChannelStore, createLocalStorageChannelStore, getDefaultChannelStore, openBatchChannel, resumeBatchChannel };
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { ClientChannelStorage } from '@x402/evm/batch-settlement/client';
|
|
2
|
+
import { E as EvmWallet } from '../types-HFS_C6RX.js';
|
|
3
|
+
import '../types-Bcsi5jQb.js';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Channel persistence. This is the upstream `ClientChannelStorage` interface
|
|
7
|
+
* (`get` / `set` / `delete`, keyed by lowercased channelId). The SDK ships
|
|
8
|
+
* file-backed and localStorage-backed implementations; a consumer may pass any
|
|
9
|
+
* `ClientChannelStorage` (e.g. one backed by their own database).
|
|
10
|
+
*/
|
|
11
|
+
type ChannelStore = ClientChannelStorage;
|
|
12
|
+
/** Channel accounting, all amounts USDC human units (e.g. "0.30"). */
|
|
13
|
+
interface ChannelState {
|
|
14
|
+
/** Total escrowed into the channel. */
|
|
15
|
+
deposited: string;
|
|
16
|
+
/** Cumulative amount spent via vouchers. */
|
|
17
|
+
spent: string;
|
|
18
|
+
/** deposited - spent. */
|
|
19
|
+
remaining: string;
|
|
20
|
+
}
|
|
21
|
+
/** Options for opening a fresh (or auto-resumed) channel. */
|
|
22
|
+
interface OpenBatchChannelOptions {
|
|
23
|
+
/** EVM wallet — any { address, signTypedData }. The same EvmWallet the exact scheme uses. */
|
|
24
|
+
wallet: EvmWallet;
|
|
25
|
+
/** CAIP-2 network: eip155:8453 (Base), eip155:42161 (Arbitrum), eip155:137 (Polygon). */
|
|
26
|
+
network: string;
|
|
27
|
+
/** Total escrow for the channel, USDC human units, e.g. "0.30". */
|
|
28
|
+
deposit: string;
|
|
29
|
+
/** Facilitator base URL. Default: https://x402.dexter.cash */
|
|
30
|
+
facilitatorUrl?: string;
|
|
31
|
+
/** RPC URL override. Default: per-network. */
|
|
32
|
+
rpcUrl?: string;
|
|
33
|
+
/** Channel persistence. Default: localStorage (browser) / file (Node). */
|
|
34
|
+
store?: ChannelStore;
|
|
35
|
+
}
|
|
36
|
+
/** Options for explicitly resuming an existing channel. */
|
|
37
|
+
interface ResumeBatchChannelOptions {
|
|
38
|
+
wallet: EvmWallet;
|
|
39
|
+
network: string;
|
|
40
|
+
facilitatorUrl?: string;
|
|
41
|
+
rpcUrl?: string;
|
|
42
|
+
store?: ChannelStore;
|
|
43
|
+
}
|
|
44
|
+
/** Result of channel.close() — the three settlement tx hashes and final amounts. */
|
|
45
|
+
interface CloseReceipt {
|
|
46
|
+
/** claimWithSignature tx hash. */
|
|
47
|
+
claimTx: string;
|
|
48
|
+
/** settle tx hash. */
|
|
49
|
+
settleTx: string;
|
|
50
|
+
/** refundWithSignature tx hash. */
|
|
51
|
+
refundTx: string;
|
|
52
|
+
/** Amount paid to the seller, USDC human units. */
|
|
53
|
+
settledAmount: string;
|
|
54
|
+
/** Unspent amount returned to the buyer, USDC human units. */
|
|
55
|
+
refundedAmount: string;
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* A live escrow channel. Returned by openBatchChannel / resumeBatchChannel.
|
|
59
|
+
* Hold this handle for the lifetime of a batching session.
|
|
60
|
+
*/
|
|
61
|
+
interface BatchSettlementChannel {
|
|
62
|
+
/** On-chain channel id (bytes32 hex). Empty until the first fetch resolves it. */
|
|
63
|
+
readonly channelId: string;
|
|
64
|
+
/** CAIP-2 network. */
|
|
65
|
+
readonly network: string;
|
|
66
|
+
/** Live channel accounting; updated after each fetch. */
|
|
67
|
+
readonly state: ChannelState;
|
|
68
|
+
/** Drop-in fetch. On a batch-settlement 402, signs a voucher and retries. */
|
|
69
|
+
fetch(input: string | URL | Request, init?: RequestInit): Promise<Response>;
|
|
70
|
+
/** Facilitator-driven claim -> settle -> refund. Resumable if interrupted. */
|
|
71
|
+
close(): Promise<CloseReceipt>;
|
|
72
|
+
}
|
|
73
|
+
/** Thrown by openBatchChannel when the buyer wallet lacks USDC for the deposit. */
|
|
74
|
+
declare class InsufficientBalanceError extends Error {
|
|
75
|
+
constructor(message: string);
|
|
76
|
+
}
|
|
77
|
+
/** Thrown when a network has no deployed x402BatchSettlement contract. */
|
|
78
|
+
declare class UnsupportedNetworkError extends Error {
|
|
79
|
+
constructor(message: string);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Opens a fresh batch-settlement escrow channel. No network call happens here:
|
|
84
|
+
* the channel is escrowed lazily on the FIRST `fetch`, where the upstream
|
|
85
|
+
* scheme signs an ERC-3009 deposit authorization (the facilitator pays the
|
|
86
|
+
* deposit gas — the buyer needs no native token, only USDC).
|
|
87
|
+
*
|
|
88
|
+
* The returned handle exposes accounting immediately (`deposited` from the
|
|
89
|
+
* `deposit` option, `spent` 0); `channelId` stays empty until the first fetch.
|
|
90
|
+
*
|
|
91
|
+
* @throws UnsupportedNetworkError when the network has no deployed contract.
|
|
92
|
+
* @throws Error when `deposit` is not a positive amount.
|
|
93
|
+
*/
|
|
94
|
+
declare function openBatchChannel(options: OpenBatchChannelOptions): Promise<BatchSettlementChannel>;
|
|
95
|
+
/**
|
|
96
|
+
* Resumes an already-open batch-settlement channel — same buyer wallet, same
|
|
97
|
+
* network, no new deposit. The upstream scheme recovers channel state from the
|
|
98
|
+
* `store` (or, with an RPC, from on-chain) on the first `fetch`.
|
|
99
|
+
*
|
|
100
|
+
* Because no deposit is opened, the handle's accounting starts at zero and is
|
|
101
|
+
* corrected from the recovered channel context (its on-chain `balance`) once
|
|
102
|
+
* the first `fetch` resolves the channel; `channelId`, `fetch`, and `close`
|
|
103
|
+
* are fully functional throughout.
|
|
104
|
+
*
|
|
105
|
+
* @throws UnsupportedNetworkError when the network has no deployed contract.
|
|
106
|
+
*/
|
|
107
|
+
declare function resumeBatchChannel(options: ResumeBatchChannelOptions): Promise<BatchSettlementChannel>;
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* File-backed ChannelStore for Node. This is the upstream FileClientChannelStorage,
|
|
111
|
+
* which persists each channel context as a JSON file under `{root}/client/`.
|
|
112
|
+
*/
|
|
113
|
+
declare function createFileChannelStore(root: string): ChannelStore;
|
|
114
|
+
/**
|
|
115
|
+
* localStorage-backed ChannelStore for browsers. Channel contexts are stored
|
|
116
|
+
* under a prefixed key so they never collide with other localStorage entries.
|
|
117
|
+
* Implements the upstream ClientChannelStorage interface (get / set / delete).
|
|
118
|
+
*/
|
|
119
|
+
declare function createLocalStorageChannelStore(storage: Storage): ChannelStore;
|
|
120
|
+
/**
|
|
121
|
+
* Returns the environment-appropriate default ChannelStore: localStorage in a
|
|
122
|
+
* browser, a file store at ~/.dexter-x402/channels in Node.
|
|
123
|
+
*/
|
|
124
|
+
declare function getDefaultChannelStore(): ChannelStore;
|
|
125
|
+
|
|
126
|
+
export { type BatchSettlementChannel, type ChannelState, type ChannelStore, type CloseReceipt, InsufficientBalanceError, type OpenBatchChannelOptions, type ResumeBatchChannelOptions, UnsupportedNetworkError, createFileChannelStore, createLocalStorageChannelStore, getDefaultChannelStore, openBatchChannel, resumeBatchChannel };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{createWalletClient as X,http as z,publicActions as G,parseUnits as K,formatUnits as k}from"viem";import{base as Q,arbitrum as V,polygon as Y}from"viem/chains";import{toClientEvmSigner as Z}from"@x402/evm";import{BatchSettlementEvmScheme as ee,getChannel as te}from"@x402/evm/batch-settlement/client";import{x402Client as ne,x402HTTPClient as re}from"@x402/core/client";import{homedir as _}from"os";import{join as q}from"path";import{FileClientChannelStorage as W}from"@x402/evm/batch-settlement/client";function I(e){return new W({directory:e})}var y="dexter-x402-channel:";function B(e){return{async get(t){let n=e.getItem(y+t);return n?JSON.parse(n):void 0},async set(t,n){e.setItem(y+t,JSON.stringify(n))},async delete(t){e.removeItem(y+t)}}}function g(){let e=globalThis.localStorage;return e?B(e):I(q(_(),".dexter-x402","channels"))}import{formatUnits as E}from"viem";import{HTTPFacilitatorClient as N}from"@x402/core/server";import{BatchSettlementEvmScheme as J}from"@x402/evm/batch-settlement/server";var P=6;async function T(e,t,n){let{claims:r,settle:i}=await e.claimAndSettle();if(r.length===0&&BigInt(n.settledAtomic)>0n)throw new Error(`batch-settlement close inconsistency: channel accounting expected a settled amount of ${n.settledAtomic} atomic units, but the facilitator's claimAndSettle reported no claim transaction (claims was empty)`);let c=(await e.refund([t]))[0];return{claimTx:r[0]?.transaction??"",settleTx:i?.transaction??"",refundTx:c?.transaction??"",settledAmount:E(BigInt(n.settledAtomic),P),refundedAmount:E(BigInt(n.refundedAtomic),P)}}function L(e,t,n){let r=new N({url:e});return new J(n).createChannelManager(r,t)}var x=class extends Error{constructor(t){super(t),this.name="InsufficientBalanceError"}},f=class extends Error{constructor(t){super(t),this.name="UnsupportedNetworkError"}};var O={"eip155:8453":{chain:Q,defaultRpc:"https://mainnet.base.org"},"eip155:42161":{chain:V,defaultRpc:"https://arb1.arbitrum.io/rpc"},"eip155:137":{chain:Y,defaultRpc:"https://polygon-rpc.com"}};function D(e){let t=O[e.network];if(!t)throw new f(`batch-settlement is not available on network "${e.network}" \u2014 supported: ${Object.keys(O).join(", ")}`);let n=e.rpcUrl??t.defaultRpc,r=e.wallet.signTypedData;if(typeof r!="function")throw new Error("batch-settlement requires an EvmWallet that supports signTypedData (EIP-712)");let i=X({account:{address:e.wallet.address,type:"json-rpc"},chain:t.chain,transport:z(n)}).extend(G),o=Object.assign(i,{address:e.wallet.address,signTypedData:a=>r.call(e.wallet,a)}),c=Z(o),l=new ee(c,{storage:e.store,depositPolicy:{depositMultiplier:4},depositStrategy:()=>e.depositAtomic}),s=new ne;s.register(e.network,l);let S=new re(s);return{scheme:l,x402Cli:s,httpClient:S,rpcUrl:n}}var C=6,$="https://x402.dexter.cash";function ae(e,t){let n=t>e?0n:e-t;return{deposited:k(e,C),spent:k(t,C),remaining:k(n,C)}}function oe(e){let t=e.payload;if(!t||typeof t!="object")return"";let n=t.voucher;if(!n||typeof n!="object")return"";let r=n.channelId;return typeof r=="string"?r:""}function M(e){let{stack:t,store:n,facilitatorUrl:r,network:i}=e,o="",c="",l=e.depositedAtomic,s=0n;async function S(){if(!o)return;let a=await te(n,o);a&&(a.chargedCumulativeAmount!==void 0&&(s=BigInt(a.chargedCumulativeAmount)),l===0n&&a.balance!==void 0&&(l=BigInt(a.balance)))}return{get channelId(){return o},get network(){return i},get state(){return ae(l,s)},async fetch(a,h){let{httpClient:p}=t,m=await fetch(a,h);if(m.status!==402)return m;let R=p.getPaymentRequiredResponse(d=>m.headers.get(d),await m.clone().json().catch(()=>{})),A=R.accepts?.[0];A?.payTo&&(c=A.payTo);let b=2,v;for(let d=1;d<=b;d+=1){let w=await p.createPaymentPayload(R),U=oe(w);U&&(o=U);let j=p.encodePaymentSignatureHeader(w),u=await fetch(a,{...h,headers:{...h?.headers??{},...j}});v=u;let{recovered:F}=await p.processPaymentResult(w,H=>u.headers.get(H),u.status);if(await S(),!(u.status===402&&F&&d<b))return u}return v},async close(){if(!o)throw new Error("cannot close a channel that has made no requests \u2014 call fetch() at least once first");if(!c)throw new Error("cannot close: the seller payout address is unknown (no 402 was observed)");let a=s.toString(),h=(s>l?0n:l-s).toString(),p=L(r,i,c),m=await T(p,o,{settledAtomic:a,refundedAtomic:h});return await n.delete(o.toLowerCase()),m}}}async function ie(e){let t=e.store??g(),n=e.facilitatorUrl??$,r;try{r=K(e.deposit,C)}catch{throw new Error(`deposit must be a valid USDC amount in decimal units (e.g. "0.30"), got "${e.deposit}"`)}if(r<=0n)throw new Error(`deposit must be a positive amount, got "${e.deposit}"`);let i=D({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:r.toString()});return M({stack:i,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:r})}async function se(e){let t=e.store??g(),n=e.facilitatorUrl??$,r=D({wallet:e.wallet,network:e.network,rpcUrl:e.rpcUrl,store:t,depositAtomic:"0"});return M({stack:r,store:t,facilitatorUrl:n,network:e.network,depositedAtomic:0n})}export{x as InsufficientBalanceError,f as UnsupportedNetworkError,I as createFileChannelStore,B as createLocalStorageChannelStore,g as getDefaultChannelStore,ie as openBatchChannel,se as resumeBatchChannel};
|