@openserv-labs/client 2.3.0 → 2.4.2
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/client.d.ts.map +1 -1
- package/dist/client.js +7 -6
- package/dist/erc8004-api.d.ts.map +1 -1
- package/dist/erc8004-api.js +15 -15
- package/dist/payments-api.d.ts.map +1 -1
- package/dist/payments-api.js +9 -7
- package/dist/provision.d.ts.map +1 -1
- package/dist/provision.js +8 -8
- package/dist/types.d.ts +2 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +10 -0
- package/dist/web3-api.d.ts.map +1 -1
- package/dist/web3-api.js +60 -17
- package/dist/x402.d.ts +39 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +210 -0
- package/package.json +2 -4
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAc,EAAE,KAAK,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAG3E,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,UAAU,CAAgB;IAElC,gHAAgH;IAChH,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8BAA8B;IAC9B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,+CAA+C;IAC/C,QAAQ,CAAC,YAAY,EAAE,eAAe,CAAC;IACvC,+CAA+C;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,yCAAyC;IACzC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,sCAAsC;IACtC,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC;IACzB,iCAAiC;IACjC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,4CAA4C;IAC5C,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,qDAAqD;IACrD,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAE7B;;;OAGG;IACH,IAAI,SAAS,IAAI,aAAa,CAE7B;IAED;;;;;OAKG;IACG,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKnE;;;;;;OAMG;IACG,IAAI,CAAC,CAAC,EACV,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAKb;;;;;;OAMG;IACG,GAAG,CAAC,CAAC,EACT,IAAI,EAAE,MAAM,EACZ,IAAI,CAAC,EAAE,OAAO,EACd,MAAM,CAAC,EAAE,kBAAkB,GAC1B,OAAO,CAAC,CAAC,CAAC;IAKb;;;;;OAKG;IACG,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,CAAC,CAAC;IAKtE;;;;;;OAMG;gBACS,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE;IAuB3D;;;;;;;;;;;;;;;;;OAiBG;IACG,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAmExD;;;;;;;;OAQG;IACH,oBAAoB,IAAI,MAAM,GAAG,SAAS;CAS3C"}
|
package/dist/client.js
CHANGED
|
@@ -5,7 +5,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.PlatformClient = void 0;
|
|
7
7
|
const axios_1 = __importDefault(require("axios"));
|
|
8
|
-
const
|
|
8
|
+
const accounts_1 = require("viem/accounts");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
9
10
|
const agents_api_1 = require("./agents-api");
|
|
10
11
|
const integrations_api_1 = require("./integrations-api");
|
|
11
12
|
const models_api_1 = require("./models-api");
|
|
@@ -154,9 +155,9 @@ class PlatformClient {
|
|
|
154
155
|
// If no wallet key, assume API key auth is already set up
|
|
155
156
|
return "";
|
|
156
157
|
}
|
|
157
|
-
// Create
|
|
158
|
-
const
|
|
159
|
-
const walletAddress =
|
|
158
|
+
// Create account and store address for x402 wallet resolution
|
|
159
|
+
const account = (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(walletKey));
|
|
160
|
+
const walletAddress = account.address;
|
|
160
161
|
this.walletAddress = walletAddress;
|
|
161
162
|
// Step 1: Get nonce from platform
|
|
162
163
|
const nonceResponse = await this._apiClient.post("/auth/wallet/nonce", {
|
|
@@ -182,7 +183,7 @@ Chain ID: 1
|
|
|
182
183
|
Nonce: ${nonce}
|
|
183
184
|
Issued At: ${issuedAt}`;
|
|
184
185
|
// Step 2: Sign the message
|
|
185
|
-
const signature = await
|
|
186
|
+
const signature = await account.signMessage({ message });
|
|
186
187
|
// Step 3: Verify signature and get API key
|
|
187
188
|
const verifyResponse = await this._apiClient.post("/auth/wallet/verify", {
|
|
188
189
|
walletAddress,
|
|
@@ -207,7 +208,7 @@ Issued At: ${issuedAt}`;
|
|
|
207
208
|
if (this.walletAddress)
|
|
208
209
|
return this.walletAddress;
|
|
209
210
|
if (process.env.WALLET_PRIVATE_KEY) {
|
|
210
|
-
return
|
|
211
|
+
return (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(process.env.WALLET_PRIVATE_KEY)).address;
|
|
211
212
|
}
|
|
212
213
|
return undefined;
|
|
213
214
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"erc8004-api.d.ts","sourceRoot":"","sources":["../src/erc8004-api.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACb,MAAM,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"erc8004-api.d.ts","sourceRoot":"","sources":["../src/erc8004-api.ts"],"names":[],"mappings":"AAYA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EACV,oBAAoB,EACpB,sBAAsB,EACtB,YAAY,EACb,MAAM,SAAS,CAAC;AAKjB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,qBAAa,UAAU;IACT,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAM1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAqDG;IACG,MAAM,CACV,MAAM,EAAE,oBAAoB,GAAG;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,GACpD,OAAO,CAAC,YAAY,CAAC;IAsBxB;;;OAGG;YACW,iBAAiB;IAiC/B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAiCG;IACG,eAAe,CAAC,MAAM,EAAE;QAC5B,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAmQlC;;OAEG;YACW,YAAY;IAyB1B;;;OAGG;IACH,OAAO,CAAC,yBAAyB;IA8CjC;;;;;;;;;;;;;;;;OAgBG;IACG,cAAc,CAAC,MAAM,EAAE;QAC3B,UAAU,EAAE,MAAM,CAAC;KACpB,GAAG,OAAO,CAAC,sBAAsB,CAAC;CAKpC;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;IAChB,yDAAyD;IACzD,MAAM,EAAE,MAAM,CAAC;IACf,yCAAyC;IACzC,YAAY,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,gBAAgB,EAAE,MAAM,CAAC;IACzB,4FAA4F;IAC5F,OAAO,EAAE,MAAM,CAAC;CACjB"}
|
package/dist/erc8004-api.js
CHANGED
|
@@ -6,6 +6,7 @@ const accounts_1 = require("viem/accounts");
|
|
|
6
6
|
const pinata_1 = require("pinata");
|
|
7
7
|
const erc8004_abi_js_1 = require("./erc8004-abi.js");
|
|
8
8
|
const erc8004_contracts_js_1 = require("./erc8004-contracts.js");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
9
10
|
/**
|
|
10
11
|
* API for ERC-8004 agent identity operations on the OpenServ platform.
|
|
11
12
|
*
|
|
@@ -214,25 +215,12 @@ class Erc8004API {
|
|
|
214
215
|
// 2. Build ERC-8004 agent card (matches monorepo addRegistrationFile format)
|
|
215
216
|
const baseUrl = this.client.rawClient.defaults.baseURL || "https://api.openserv.ai";
|
|
216
217
|
const services = [];
|
|
217
|
-
// MCP endpoint (machine-facing, aggregates all x402 triggers)
|
|
218
|
-
const mcpEndpoint = `${baseUrl}/workspaces/${workflowId}/trigger-x402-mcp/mcp`;
|
|
219
|
-
services.push({
|
|
220
|
-
name: "MCP",
|
|
221
|
-
endpoint: mcpEndpoint,
|
|
222
|
-
version: "2025-06-18",
|
|
223
|
-
});
|
|
224
218
|
for (const t of callableTriggers) {
|
|
225
219
|
const meta = {};
|
|
226
220
|
if (t.name)
|
|
227
221
|
meta.triggerName = t.name;
|
|
228
222
|
if (t.description)
|
|
229
223
|
meta.description = t.description;
|
|
230
|
-
// WEB endpoint (human-facing paywall URL)
|
|
231
|
-
services.push({
|
|
232
|
-
name: "web",
|
|
233
|
-
endpoint: t.webEndpoint,
|
|
234
|
-
...(Object.keys(meta).length > 0 ? meta : {}),
|
|
235
|
-
});
|
|
236
224
|
// HTTP endpoint (machine-facing x402 URL)
|
|
237
225
|
if (t.httpEndpoint) {
|
|
238
226
|
const httpMeta = { ...meta };
|
|
@@ -244,7 +232,20 @@ class Erc8004API {
|
|
|
244
232
|
...(Object.keys(httpMeta).length > 0 ? httpMeta : {}),
|
|
245
233
|
});
|
|
246
234
|
}
|
|
235
|
+
// WEB endpoint (human-facing paywall URL)
|
|
236
|
+
services.push({
|
|
237
|
+
name: "web",
|
|
238
|
+
endpoint: t.webEndpoint,
|
|
239
|
+
...(Object.keys(meta).length > 0 ? meta : {}),
|
|
240
|
+
});
|
|
247
241
|
}
|
|
242
|
+
// MCP endpoint (machine-facing, aggregates all x402 triggers)
|
|
243
|
+
const mcpEndpoint = `${baseUrl}/workspaces/${workflowId}/x402/mcp`;
|
|
244
|
+
services.push({
|
|
245
|
+
name: "MCP",
|
|
246
|
+
endpoint: mcpEndpoint,
|
|
247
|
+
version: "2025-06-18",
|
|
248
|
+
});
|
|
248
249
|
// Add walletAddress as an endpoint (deduplicate first)
|
|
249
250
|
if (wallet.address) {
|
|
250
251
|
const filtered = services.filter((s) => s.name !== "agentWallet" && s.name !== "wallet");
|
|
@@ -323,8 +324,7 @@ class Erc8004API {
|
|
|
323
324
|
default: { http: [rpcUrl] },
|
|
324
325
|
},
|
|
325
326
|
});
|
|
326
|
-
const
|
|
327
|
-
const account = (0, accounts_1.privateKeyToAccount)(normalizedKey);
|
|
327
|
+
const account = (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(privateKey));
|
|
328
328
|
const publicClient = (0, viem_1.createPublicClient)({
|
|
329
329
|
chain: viemChain,
|
|
330
330
|
transport: (0, viem_1.http)(rpcUrl),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"payments-api.d.ts","sourceRoot":"","sources":["../src/payments-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"payments-api.d.ts","sourceRoot":"","sources":["../src/payments-api.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC/C,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAGrE;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,WAAW;IACV,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkDG;IACG,WAAW,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAiDzE;;OAEG;YACW,qBAAqB;IAmCnC;;;;;;;;;;;;;;;;;OAiBG;IACG,gBAAgB,IAAI,OAAO,CAC/B,KAAK,CAAC;QACJ,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,aAAa,EAAE,MAAM,CAAC;QACtB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC,CACH;IAmBD;;;;;;;;;;;;;;;;;;;;OAoBG;IACG,mBAAmB,CAAC,MAAM,EAAE;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAC5D,SAAS,EAAE,MAAM,CAAC;QAClB,WAAW,EAAE,MAAM,CAAC;QACpB,kBAAkB,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,WAAW,EAAE,OAAO,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,iBAAiB,EAAE,MAAM,CAAC;QAC1B,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;KAC/B,CAAC;CAeH"}
|
package/dist/payments-api.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PaymentsAPI = void 0;
|
|
4
4
|
const accounts_1 = require("viem/accounts");
|
|
5
|
-
const
|
|
5
|
+
const x402_1 = require("./x402");
|
|
6
6
|
/**
|
|
7
7
|
* API for making x402 payments to access paid workflows.
|
|
8
8
|
*
|
|
@@ -86,10 +86,11 @@ class PaymentsAPI {
|
|
|
86
86
|
}
|
|
87
87
|
// Create account from private key (for getting address)
|
|
88
88
|
const account = (0, accounts_1.privateKeyToAccount)(privateKey);
|
|
89
|
-
// Create signer for x402 payments
|
|
90
|
-
const
|
|
89
|
+
// Create signer for x402 payments (defaults to Base mainnet)
|
|
90
|
+
const network = params.network ?? "base";
|
|
91
|
+
const signer = (0, x402_1.createSigner)(network, privateKey);
|
|
91
92
|
// Wrap fetch with x402 payment handling
|
|
92
|
-
const x402Fetch = (0,
|
|
93
|
+
const x402Fetch = (0, x402_1.wrapFetchWithPayment)(fetch, signer);
|
|
93
94
|
// Make the request - x402Fetch automatically handles 402 responses
|
|
94
95
|
const response = await x402Fetch(triggerUrl, {
|
|
95
96
|
method: "POST",
|
|
@@ -109,8 +110,8 @@ class PaymentsAPI {
|
|
|
109
110
|
txHash: "", // x402 handles this internally, tx hash not exposed
|
|
110
111
|
price: "", // Price is handled by x402 protocol
|
|
111
112
|
response: responseData,
|
|
112
|
-
network
|
|
113
|
-
chainId: 8453,
|
|
113
|
+
network,
|
|
114
|
+
chainId: signer.chain?.id ?? 8453,
|
|
114
115
|
};
|
|
115
116
|
}
|
|
116
117
|
/**
|
|
@@ -183,7 +184,8 @@ class PaymentsAPI {
|
|
|
183
184
|
*/
|
|
184
185
|
async getTriggerPreflight(params) {
|
|
185
186
|
// This endpoint is public and doesn't require authentication
|
|
186
|
-
const
|
|
187
|
+
const baseUrl = this.client.rawClient.defaults.baseURL || "https://api.openserv.ai";
|
|
188
|
+
const response = await fetch(`${baseUrl}/webhooks/trigger/${params.token}`);
|
|
187
189
|
if (!response.ok) {
|
|
188
190
|
const errorData = await response.json().catch(() => ({}));
|
|
189
191
|
throw new Error(`Failed to get trigger preflight: ${response.status} ${JSON.stringify(errorData)}`);
|
package/dist/provision.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"provision.d.ts","sourceRoot":"","sources":["../src/provision.ts"],"names":[],"mappings":"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"}
|
package/dist/provision.js
CHANGED
|
@@ -38,9 +38,10 @@ exports.provision = provision;
|
|
|
38
38
|
exports.isProvisioned = isProvisioned;
|
|
39
39
|
exports.getProvisionedInfo = getProvisionedInfo;
|
|
40
40
|
exports.clearProvisionedState = clearProvisionedState;
|
|
41
|
-
const
|
|
41
|
+
const accounts_1 = require("viem/accounts");
|
|
42
42
|
const fs = __importStar(require("node:fs"));
|
|
43
43
|
const path = __importStar(require("node:path"));
|
|
44
|
+
const utils_1 = require("./utils");
|
|
44
45
|
const client_1 = require("./client");
|
|
45
46
|
const STATE_FILE = ".openserv.json";
|
|
46
47
|
const defaultLogger = {
|
|
@@ -162,13 +163,13 @@ function writeWalletToEnv(privateKey) {
|
|
|
162
163
|
async function getOrCreateWallet() {
|
|
163
164
|
const { privateKey } = getWalletFromEnv();
|
|
164
165
|
if (privateKey) {
|
|
165
|
-
const
|
|
166
|
-
return { privateKey, address:
|
|
166
|
+
const account = (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(privateKey));
|
|
167
|
+
return { privateKey, address: account.address };
|
|
167
168
|
}
|
|
168
169
|
// Create new wallet
|
|
169
|
-
const
|
|
170
|
-
const
|
|
171
|
-
const newAddress =
|
|
170
|
+
const newPrivateKey = (0, accounts_1.generatePrivateKey)();
|
|
171
|
+
const account = (0, accounts_1.privateKeyToAccount)(newPrivateKey);
|
|
172
|
+
const newAddress = account.address;
|
|
172
173
|
// Persist to .env (secrets stay in .env)
|
|
173
174
|
writeWalletToEnv(newPrivateKey);
|
|
174
175
|
logger.info("Created new wallet:", newAddress);
|
|
@@ -178,8 +179,7 @@ async function getOrCreateWallet() {
|
|
|
178
179
|
// Platform API Client
|
|
179
180
|
// ============================================================================
|
|
180
181
|
async function createAuthenticatedClient(privateKey) {
|
|
181
|
-
const
|
|
182
|
-
const walletAddress = wallet.address;
|
|
182
|
+
const walletAddress = (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(privateKey)).address;
|
|
183
183
|
// Check if we have a saved user API key (for session continuity)
|
|
184
184
|
const state = readState();
|
|
185
185
|
const existingApiKey = state.userApiKey;
|
package/dist/types.d.ts
CHANGED
|
@@ -326,6 +326,8 @@ export interface X402PaymentRequest {
|
|
|
326
326
|
privateKey?: string;
|
|
327
327
|
/** Input data to pass to the workflow */
|
|
328
328
|
input?: Record<string, unknown>;
|
|
329
|
+
/** Network to use for payment (default: "base"). Use "base-sepolia" for testnet. */
|
|
330
|
+
network?: string;
|
|
329
331
|
}
|
|
330
332
|
/**
|
|
331
333
|
* Result from paying and executing an x402 workflow.
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/utils.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAEhC;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAEpD"}
|
package/dist/utils.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.normalizePrivateKey = normalizePrivateKey;
|
|
4
|
+
/**
|
|
5
|
+
* Normalize a private key string to a 0x-prefixed hex string.
|
|
6
|
+
* Accepts keys with or without the 0x prefix.
|
|
7
|
+
*/
|
|
8
|
+
function normalizePrivateKey(key) {
|
|
9
|
+
return (key.startsWith("0x") ? key : `0x${key}`);
|
|
10
|
+
}
|
package/dist/web3-api.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"web3-api.d.ts","sourceRoot":"","sources":["../src/web3-api.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"web3-api.d.ts","sourceRoot":"","sources":["../src/web3-api.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C,OAAO,KAAK,EACV,eAAe,EACf,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EACnB,MAAM,SAAS,CAAC;AA4BjB;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,OAAO;IACN,OAAO,CAAC,MAAM;gBAAN,MAAM,EAAE,cAAc;IAE1C;;;;;;;;;;;;;;;;;OAiBG;IACG,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC;IAIpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACG,qBAAqB,CACzB,MAAM,EAAE,iBAAiB,GACxB,OAAO,CAAC,kBAAkB,CAAC;IAO9B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACG,KAAK,CAAC,MAAM,EAAE;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,eAAe,CAAC;CAuG7B"}
|
package/dist/web3-api.js
CHANGED
|
@@ -1,11 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Web3API = void 0;
|
|
4
|
-
const
|
|
5
|
-
|
|
4
|
+
const viem_1 = require("viem");
|
|
5
|
+
const accounts_1 = require("viem/accounts");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
// ERC20 ABI (minimal, for balance check and transfer)
|
|
6
8
|
const ERC20_ABI = [
|
|
7
|
-
|
|
8
|
-
|
|
9
|
+
{
|
|
10
|
+
name: "transfer",
|
|
11
|
+
type: "function",
|
|
12
|
+
stateMutability: "nonpayable",
|
|
13
|
+
inputs: [
|
|
14
|
+
{ name: "to", type: "address" },
|
|
15
|
+
{ name: "amount", type: "uint256" },
|
|
16
|
+
],
|
|
17
|
+
outputs: [{ name: "", type: "bool" }],
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
name: "balanceOf",
|
|
21
|
+
type: "function",
|
|
22
|
+
stateMutability: "view",
|
|
23
|
+
inputs: [{ name: "owner", type: "address" }],
|
|
24
|
+
outputs: [{ name: "", type: "uint256" }],
|
|
25
|
+
},
|
|
9
26
|
];
|
|
10
27
|
// Known RPC URLs for supported chains
|
|
11
28
|
const CHAIN_RPC_URLS = {
|
|
@@ -143,33 +160,59 @@ class Web3API {
|
|
|
143
160
|
const rpcUrl = params.rpcUrl ||
|
|
144
161
|
CHAIN_RPC_URLS[config.chainId] ||
|
|
145
162
|
`https://rpc.ankr.com/${config.network}`;
|
|
146
|
-
// Step 2: Create
|
|
147
|
-
const
|
|
148
|
-
const
|
|
163
|
+
// Step 2: Create viem clients
|
|
164
|
+
const account = (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(privateKey));
|
|
165
|
+
const chain = (0, viem_1.defineChain)({
|
|
166
|
+
id: config.chainId,
|
|
167
|
+
name: config.network,
|
|
168
|
+
nativeCurrency: { name: "ETH", symbol: "ETH", decimals: 18 },
|
|
169
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
170
|
+
});
|
|
171
|
+
const publicClient = (0, viem_1.createPublicClient)({
|
|
172
|
+
chain,
|
|
173
|
+
transport: (0, viem_1.http)(rpcUrl),
|
|
174
|
+
});
|
|
175
|
+
const walletClient = (0, viem_1.createWalletClient)({
|
|
176
|
+
account,
|
|
177
|
+
chain,
|
|
178
|
+
transport: (0, viem_1.http)(rpcUrl),
|
|
179
|
+
});
|
|
149
180
|
// Step 3: Check USDC balance
|
|
150
|
-
const usdcContract = new ethers_1.ethers.Contract(config.usdcContractAddress, ERC20_ABI, wallet);
|
|
151
181
|
// USDC has 6 decimals
|
|
152
|
-
const amountInSmallestUnit =
|
|
153
|
-
const balance = await
|
|
182
|
+
const amountInSmallestUnit = (0, viem_1.parseUnits)(params.amountUsd.toString(), 6);
|
|
183
|
+
const balance = await publicClient.readContract({
|
|
184
|
+
address: config.usdcContractAddress,
|
|
185
|
+
abi: ERC20_ABI,
|
|
186
|
+
functionName: "balanceOf",
|
|
187
|
+
args: [account.address],
|
|
188
|
+
});
|
|
154
189
|
if (balance < amountInSmallestUnit) {
|
|
155
|
-
const balanceFormatted =
|
|
190
|
+
const balanceFormatted = (0, viem_1.formatUnits)(balance, 6);
|
|
156
191
|
throw new Error(`Insufficient USDC balance. Have: ${balanceFormatted} USDC, need: ${params.amountUsd} USDC`);
|
|
157
192
|
}
|
|
158
193
|
// Step 4: Send USDC transfer
|
|
159
|
-
const
|
|
194
|
+
const txHash = await walletClient.writeContract({
|
|
195
|
+
address: config.usdcContractAddress,
|
|
196
|
+
abi: ERC20_ABI,
|
|
197
|
+
functionName: "transfer",
|
|
198
|
+
args: [config.receiverAddress, amountInSmallestUnit],
|
|
199
|
+
});
|
|
160
200
|
// Step 5: Wait for confirmation
|
|
161
|
-
const receipt = await
|
|
162
|
-
|
|
201
|
+
const receipt = await publicClient.waitForTransactionReceipt({
|
|
202
|
+
hash: txHash,
|
|
203
|
+
});
|
|
204
|
+
if (receipt.status !== "success") {
|
|
163
205
|
throw new Error("Transaction failed or was reverted");
|
|
164
206
|
}
|
|
165
|
-
const txHash = receipt.hash;
|
|
166
207
|
// Step 6: Sign verification message
|
|
167
208
|
const verificationMessage = `Verify USDC top-up: ${txHash}`;
|
|
168
|
-
const signature = await
|
|
209
|
+
const signature = await account.signMessage({
|
|
210
|
+
message: verificationMessage,
|
|
211
|
+
});
|
|
169
212
|
// Step 7: Verify transaction and add credits
|
|
170
213
|
const verifyResult = await this.verifyUsdcTransaction({
|
|
171
214
|
txHash,
|
|
172
|
-
payerAddress:
|
|
215
|
+
payerAddress: account.address,
|
|
173
216
|
signature,
|
|
174
217
|
});
|
|
175
218
|
return {
|
package/dist/x402.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vendored x402 EVM client-side payment implementation.
|
|
3
|
+
*
|
|
4
|
+
* This replaces the `x402-fetch` and `x402` npm packages to avoid pulling in
|
|
5
|
+
* wagmi, WalletConnect, Reown, MetaMask SDK, Solana SDK, and hundreds of MB
|
|
6
|
+
* of transitive dependencies that are unnecessary for server-side EVM usage.
|
|
7
|
+
*
|
|
8
|
+
* Only EVM payment support is included (Base network), which is all this SDK needs.
|
|
9
|
+
* The x402 protocol specification: https://www.x402.org/
|
|
10
|
+
*
|
|
11
|
+
* @module
|
|
12
|
+
*/
|
|
13
|
+
import { type WalletClient } from "viem";
|
|
14
|
+
/**
|
|
15
|
+
* Create a viem WalletClient configured for x402 payment signing.
|
|
16
|
+
*
|
|
17
|
+
* @param network - Network name (e.g., "base", "base-sepolia")
|
|
18
|
+
* @param privateKey - Hex-encoded private key
|
|
19
|
+
* @returns Configured WalletClient
|
|
20
|
+
*/
|
|
21
|
+
export declare function createSigner(network: string, privateKey: string): WalletClient;
|
|
22
|
+
/**
|
|
23
|
+
* Wrap a fetch function with x402 payment handling.
|
|
24
|
+
*
|
|
25
|
+
* When the wrapped fetch receives a 402 response, it automatically:
|
|
26
|
+
* 1. Parses the payment requirements from the response
|
|
27
|
+
* 2. Signs an EIP-3009 TransferWithAuthorization
|
|
28
|
+
* 3. Retries the request with the signed payment in the X-PAYMENT header
|
|
29
|
+
*
|
|
30
|
+
* The retry calls the raw (unwrapped) fetch directly, so a second 402
|
|
31
|
+
* is returned to the caller as-is without infinite retry loops.
|
|
32
|
+
*
|
|
33
|
+
* @param fetchFn - The fetch function to wrap
|
|
34
|
+
* @param walletClient - Wallet client for signing payments
|
|
35
|
+
* @param maxValue - Maximum payment amount in atomic units (default: 0.1 USDC = 100000)
|
|
36
|
+
* @returns Wrapped fetch function with x402 payment support
|
|
37
|
+
*/
|
|
38
|
+
export declare function wrapFetchWithPayment(fetchFn: typeof fetch, walletClient: WalletClient, maxValue?: bigint): typeof fetch;
|
|
39
|
+
//# sourceMappingURL=x402.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402.d.ts","sourceRoot":"","sources":["../src/x402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAKL,KAAK,YAAY,EAElB,MAAM,MAAM,CAAC;AAqNd;;;;;;GAMG;AACH,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,GACjB,YAAY,CAad;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,OAAO,KAAK,EACrB,YAAY,EAAE,YAAY,EAC1B,QAAQ,GAAE,MAA8B,GACvC,OAAO,KAAK,CA6Cd"}
|
package/dist/x402.js
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Vendored x402 EVM client-side payment implementation.
|
|
4
|
+
*
|
|
5
|
+
* This replaces the `x402-fetch` and `x402` npm packages to avoid pulling in
|
|
6
|
+
* wagmi, WalletConnect, Reown, MetaMask SDK, Solana SDK, and hundreds of MB
|
|
7
|
+
* of transitive dependencies that are unnecessary for server-side EVM usage.
|
|
8
|
+
*
|
|
9
|
+
* Only EVM payment support is included (Base network), which is all this SDK needs.
|
|
10
|
+
* The x402 protocol specification: https://www.x402.org/
|
|
11
|
+
*
|
|
12
|
+
* @module
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.createSigner = createSigner;
|
|
16
|
+
exports.wrapFetchWithPayment = wrapFetchWithPayment;
|
|
17
|
+
const viem_1 = require("viem");
|
|
18
|
+
const accounts_1 = require("viem/accounts");
|
|
19
|
+
const chains_1 = require("viem/chains");
|
|
20
|
+
const node_crypto_1 = require("node:crypto");
|
|
21
|
+
const utils_1 = require("./utils");
|
|
22
|
+
// ============================================================================
|
|
23
|
+
// Constants
|
|
24
|
+
// ============================================================================
|
|
25
|
+
/** Map network names to viem Chain objects. */
|
|
26
|
+
const NETWORK_CHAINS = {
|
|
27
|
+
base: chains_1.base,
|
|
28
|
+
"base-sepolia": chains_1.baseSepolia,
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* EIP-712 typed data for USDC TransferWithAuthorization (EIP-3009).
|
|
32
|
+
* Used to sign USDC transfer authorizations without an on-chain transaction.
|
|
33
|
+
*/
|
|
34
|
+
const TRANSFER_WITH_AUTHORIZATION_TYPES = {
|
|
35
|
+
TransferWithAuthorization: [
|
|
36
|
+
{ name: "from", type: "address" },
|
|
37
|
+
{ name: "to", type: "address" },
|
|
38
|
+
{ name: "value", type: "uint256" },
|
|
39
|
+
{ name: "validAfter", type: "uint256" },
|
|
40
|
+
{ name: "validBefore", type: "uint256" },
|
|
41
|
+
{ name: "nonce", type: "bytes32" },
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// Helpers
|
|
46
|
+
// ============================================================================
|
|
47
|
+
function base64Encode(str) {
|
|
48
|
+
return Buffer.from(str).toString("base64");
|
|
49
|
+
}
|
|
50
|
+
function createNonce() {
|
|
51
|
+
return (0, viem_1.toHex)((0, node_crypto_1.randomBytes)(32));
|
|
52
|
+
}
|
|
53
|
+
function encodePayment(payment) {
|
|
54
|
+
const safe = {
|
|
55
|
+
...payment,
|
|
56
|
+
payload: {
|
|
57
|
+
...payment.payload,
|
|
58
|
+
authorization: Object.fromEntries(Object.entries(payment.payload.authorization).map(([key, value]) => [
|
|
59
|
+
key,
|
|
60
|
+
typeof value === "bigint" ? value.toString() : value,
|
|
61
|
+
])),
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
return base64Encode(JSON.stringify(safe));
|
|
65
|
+
}
|
|
66
|
+
// ============================================================================
|
|
67
|
+
// Payment Logic
|
|
68
|
+
// ============================================================================
|
|
69
|
+
/**
|
|
70
|
+
* Select the best payment requirement from the server's options.
|
|
71
|
+
* Prefers requirements matching the wallet's network and "exact" scheme.
|
|
72
|
+
*/
|
|
73
|
+
function selectPaymentRequirements(requirements, network) {
|
|
74
|
+
if (network) {
|
|
75
|
+
const matching = requirements.filter((r) => r.scheme === "exact" && r.network === network);
|
|
76
|
+
if (matching.length > 0)
|
|
77
|
+
return matching[0];
|
|
78
|
+
}
|
|
79
|
+
// Fallback: first "exact" scheme requirement, then any
|
|
80
|
+
const exact = requirements.filter((r) => r.scheme === "exact");
|
|
81
|
+
return exact[0] ?? requirements[0];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Sign an EIP-3009 TransferWithAuthorization using the wallet client.
|
|
85
|
+
*/
|
|
86
|
+
async function signAuthorization(walletClient, authorization, paymentRequirements) {
|
|
87
|
+
const chainId = walletClient.chain?.id;
|
|
88
|
+
if (!chainId) {
|
|
89
|
+
throw new Error("Wallet client must have a chain configured");
|
|
90
|
+
}
|
|
91
|
+
const signature = await walletClient.signTypedData({
|
|
92
|
+
account: walletClient.account,
|
|
93
|
+
types: TRANSFER_WITH_AUTHORIZATION_TYPES,
|
|
94
|
+
domain: {
|
|
95
|
+
name: paymentRequirements.extra?.name,
|
|
96
|
+
version: paymentRequirements.extra?.version,
|
|
97
|
+
chainId,
|
|
98
|
+
verifyingContract: (0, viem_1.getAddress)(paymentRequirements.asset),
|
|
99
|
+
},
|
|
100
|
+
primaryType: "TransferWithAuthorization",
|
|
101
|
+
message: {
|
|
102
|
+
from: (0, viem_1.getAddress)(authorization.from),
|
|
103
|
+
to: (0, viem_1.getAddress)(authorization.to),
|
|
104
|
+
value: BigInt(authorization.value),
|
|
105
|
+
validAfter: BigInt(authorization.validAfter),
|
|
106
|
+
validBefore: BigInt(authorization.validBefore),
|
|
107
|
+
nonce: authorization.nonce,
|
|
108
|
+
},
|
|
109
|
+
});
|
|
110
|
+
return signature;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a signed x402 payment header for an EVM payment.
|
|
114
|
+
*/
|
|
115
|
+
async function createPaymentHeader(walletClient, x402Version, paymentRequirements) {
|
|
116
|
+
const from = walletClient.account.address;
|
|
117
|
+
const nonce = createNonce();
|
|
118
|
+
const validAfter = BigInt(Math.floor(Date.now() / 1000) - 600).toString();
|
|
119
|
+
const validBefore = BigInt(Math.floor(Date.now() / 1000 + paymentRequirements.maxTimeoutSeconds)).toString();
|
|
120
|
+
const unsignedPayment = {
|
|
121
|
+
x402Version,
|
|
122
|
+
scheme: paymentRequirements.scheme,
|
|
123
|
+
network: paymentRequirements.network,
|
|
124
|
+
payload: {
|
|
125
|
+
signature: undefined,
|
|
126
|
+
authorization: {
|
|
127
|
+
from,
|
|
128
|
+
to: paymentRequirements.payTo,
|
|
129
|
+
value: paymentRequirements.maxAmountRequired,
|
|
130
|
+
validAfter,
|
|
131
|
+
validBefore,
|
|
132
|
+
nonce,
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
const signature = await signAuthorization(walletClient, unsignedPayment.payload.authorization, paymentRequirements);
|
|
137
|
+
return encodePayment({
|
|
138
|
+
...unsignedPayment,
|
|
139
|
+
payload: {
|
|
140
|
+
...unsignedPayment.payload,
|
|
141
|
+
signature,
|
|
142
|
+
},
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
// ============================================================================
|
|
146
|
+
// Public API
|
|
147
|
+
// ============================================================================
|
|
148
|
+
/**
|
|
149
|
+
* Create a viem WalletClient configured for x402 payment signing.
|
|
150
|
+
*
|
|
151
|
+
* @param network - Network name (e.g., "base", "base-sepolia")
|
|
152
|
+
* @param privateKey - Hex-encoded private key
|
|
153
|
+
* @returns Configured WalletClient
|
|
154
|
+
*/
|
|
155
|
+
function createSigner(network, privateKey) {
|
|
156
|
+
const chain = NETWORK_CHAINS[network];
|
|
157
|
+
if (!chain) {
|
|
158
|
+
throw new Error(`Unsupported network: ${network}. Supported: ${Object.keys(NETWORK_CHAINS).join(", ")}`);
|
|
159
|
+
}
|
|
160
|
+
return (0, viem_1.createWalletClient)({
|
|
161
|
+
account: (0, accounts_1.privateKeyToAccount)((0, utils_1.normalizePrivateKey)(privateKey)),
|
|
162
|
+
chain,
|
|
163
|
+
transport: (0, viem_1.http)(),
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Wrap a fetch function with x402 payment handling.
|
|
168
|
+
*
|
|
169
|
+
* When the wrapped fetch receives a 402 response, it automatically:
|
|
170
|
+
* 1. Parses the payment requirements from the response
|
|
171
|
+
* 2. Signs an EIP-3009 TransferWithAuthorization
|
|
172
|
+
* 3. Retries the request with the signed payment in the X-PAYMENT header
|
|
173
|
+
*
|
|
174
|
+
* The retry calls the raw (unwrapped) fetch directly, so a second 402
|
|
175
|
+
* is returned to the caller as-is without infinite retry loops.
|
|
176
|
+
*
|
|
177
|
+
* @param fetchFn - The fetch function to wrap
|
|
178
|
+
* @param walletClient - Wallet client for signing payments
|
|
179
|
+
* @param maxValue - Maximum payment amount in atomic units (default: 0.1 USDC = 100000)
|
|
180
|
+
* @returns Wrapped fetch function with x402 payment support
|
|
181
|
+
*/
|
|
182
|
+
function wrapFetchWithPayment(fetchFn, walletClient, maxValue = BigInt(0.1 * 10 ** 6)) {
|
|
183
|
+
return async (input, init) => {
|
|
184
|
+
const response = await fetchFn(input, init);
|
|
185
|
+
if (response.status !== 402) {
|
|
186
|
+
return response;
|
|
187
|
+
}
|
|
188
|
+
// Parse payment requirements from 402 response
|
|
189
|
+
const body = (await response.json());
|
|
190
|
+
// Detect wallet's network name from chain ID
|
|
191
|
+
const chainId = walletClient.chain?.id;
|
|
192
|
+
const network = chainId
|
|
193
|
+
? Object.entries(NETWORK_CHAINS).find(([, c]) => c.id === chainId)?.[0]
|
|
194
|
+
: undefined;
|
|
195
|
+
const selected = selectPaymentRequirements(body.accepts, network);
|
|
196
|
+
if (BigInt(selected.maxAmountRequired) > maxValue) {
|
|
197
|
+
throw new Error("Payment amount exceeds maximum allowed");
|
|
198
|
+
}
|
|
199
|
+
const paymentHeader = await createPaymentHeader(walletClient, body.x402Version, selected);
|
|
200
|
+
// Retry with payment header using raw fetchFn (not the wrapper) to avoid loops
|
|
201
|
+
return fetchFn(input, {
|
|
202
|
+
...init,
|
|
203
|
+
headers: {
|
|
204
|
+
...(init?.headers || {}),
|
|
205
|
+
"X-PAYMENT": paymentHeader,
|
|
206
|
+
"Access-Control-Expose-Headers": "X-PAYMENT-RESPONSE",
|
|
207
|
+
},
|
|
208
|
+
});
|
|
209
|
+
};
|
|
210
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openserv-labs/client",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.2",
|
|
4
4
|
"description": "OpenServ Platform Client - Manage agents, workflows, tasks, and triggers via the OpenServ API",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -38,10 +38,8 @@
|
|
|
38
38
|
"license": "MIT",
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"axios": "^1.6.8",
|
|
41
|
-
"ethers": "^6.16.0",
|
|
42
41
|
"pinata": "^2.5.1",
|
|
43
|
-
"viem": "^2.45.1"
|
|
44
|
-
"x402-fetch": "^1.1.0"
|
|
42
|
+
"viem": "^2.45.1"
|
|
45
43
|
},
|
|
46
44
|
"devDependencies": {
|
|
47
45
|
"@eslint/js": "^9.39.2",
|