@armory-sh/client-ethers 0.2.18 → 0.2.20-alpha.3.11

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/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { PaymentRequirementsV2, Address, PaymentPayloadV2, CustomToken } from '@armory-sh/base';
1
+ import { PaymentRequirementsV2, Address, PaymentPayloadV2, CustomToken, NetworkId, TokenId, ArmoryPaymentResult, ValidationError } from '@armory-sh/base';
2
2
  export { Address, BalanceOfParams, CAIP2ChainId, CAIPAssetId, EIP712_TYPES, ERC20_ABI, Extensions, NETWORKS, NetworkConfig, PayToV2, PaymentPayload, PaymentPayloadV2, PaymentRequirements, PaymentRequirementsV2, SettlementResponse, SettlementResponseV2, Signature, TransferWithAuthorizationParams, V2_HEADERS, createEIP712Domain, createTransferWithAuthorization, decodePayment, decodePaymentV2, decodeSettlementV2, detectPaymentVersion, encodePaymentV2, encodeSettlementV2, getMainnets, getNetworkByChainId, getNetworkConfig, getTestnets, getTxHash, isCAIP2ChainId, isCAIPAssetId, isPaymentV2, isSettlementSuccessful, isSettlementV2, isX402V2PaymentRequired, safeBase64Decode, validateTransferWithAuthorization } from '@armory-sh/base';
3
3
  import { Signer, Provider } from 'ethers';
4
4
  export { Provider, Signer } from 'ethers';
@@ -198,4 +198,116 @@ declare function createX402Client(config: X402ClientConfig & SignerClientConfig
198
198
  }): X402Client;
199
199
  declare function createX402Client(config: X402ClientConfig & ProviderClientConfig): X402Client;
200
200
 
201
- export { AuthorizationError, type ClientConfig, type ParsedPaymentRequirements, PaymentError, ProviderRequiredError, SignerRequiredError, SigningError, type X402Client, type X402ClientConfig, X402ClientError, type X402RequestInit, type X402Transport, type X402TransportConfig, createX402Client, createX402Payment, createX402Transport, detectX402Version, encodeX402Payment, getPaymentHeaderName, parsePaymentRequired, recoverEIP3009Signer, signEIP3009, signEIP3009WithDomain, signPayment };
201
+ /**
202
+ * Simple one-line payment API for Armory (Ethers)
203
+ * Focus on DX/UX - "everything just magically works"
204
+ */
205
+
206
+ /**
207
+ * Simple wallet input - accepts wallet directly or wrapped for backward compatibility
208
+ */
209
+ type SimpleWalletInput = Signer | {
210
+ signer: Signer;
211
+ };
212
+ /**
213
+ * Normalized wallet (internal use)
214
+ */
215
+ type NormalizedWallet = Signer;
216
+ /**
217
+ * Normalize wallet input to internal format
218
+ */
219
+ declare const normalizeWallet: (wallet: SimpleWalletInput) => NormalizedWallet;
220
+ /**
221
+ * Make a payment-protected API request with one line of code
222
+ */
223
+ declare const armoryPay: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, options?: {
224
+ /** Request method (default: GET) */
225
+ method?: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
226
+ /** Request body (for POST/PUT/PATCH) */
227
+ body?: unknown;
228
+ /** Request headers */
229
+ headers?: Record<string, string>;
230
+ /** Protocol version (V2 only) */
231
+ version?: 2;
232
+ /** Payment amount in token units (default: from 402 header) */
233
+ amount?: string;
234
+ /** Enable debug logging */
235
+ debug?: boolean;
236
+ }) => Promise<ArmoryPaymentResult<T>>;
237
+ /**
238
+ * Make a GET request with payment
239
+ */
240
+ declare const armoryGet: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, options?: Omit<Parameters<typeof armoryPay>[4], "method">) => Promise<ArmoryPaymentResult<T>>;
241
+ /**
242
+ * Make a POST request with payment
243
+ */
244
+ declare const armoryPost: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, body?: unknown, options?: Omit<Parameters<typeof armoryPay>[4], "method" | "body">) => Promise<ArmoryPaymentResult<T>>;
245
+ /**
246
+ * Make a PUT request with payment
247
+ */
248
+ declare const armoryPut: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, body?: unknown, options?: Omit<Parameters<typeof armoryPay>[4], "method" | "body">) => Promise<ArmoryPaymentResult<T>>;
249
+ /**
250
+ * Make a DELETE request with payment
251
+ */
252
+ declare const armoryDelete: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, options?: Omit<Parameters<typeof armoryPay>[4], "method">) => Promise<ArmoryPaymentResult<T>>;
253
+ /**
254
+ * Make a PATCH request with payment
255
+ */
256
+ declare const armoryPatch: <T = unknown>(wallet: SimpleWalletInput, url: string, network: NetworkId, token: TokenId, body?: unknown, options?: Omit<Parameters<typeof armoryPay>[4], "method" | "body">) => Promise<ArmoryPaymentResult<T>>;
257
+ /**
258
+ * Get the wallet address from a SimpleWalletInput
259
+ */
260
+ declare const getWalletAddress: (wallet: SimpleWalletInput) => Promise<string>;
261
+ /**
262
+ * Validate a network identifier without making a request
263
+ */
264
+ declare const validateNetwork: (network: NetworkId) => ValidationError | {
265
+ success: true;
266
+ network: string;
267
+ };
268
+ /**
269
+ * Validate a token identifier without making a request
270
+ */
271
+ declare const validateToken: (token: TokenId, network?: NetworkId) => ValidationError | {
272
+ success: true;
273
+ token: string;
274
+ network: string;
275
+ };
276
+ /**
277
+ * Get list of available networks
278
+ */
279
+ declare const getNetworks: () => string[];
280
+ /**
281
+ * Get list of available tokens
282
+ */
283
+ declare const getTokens: () => string[];
284
+
285
+ /**
286
+ * Armory API - Simplified payment interface (Ethers)
287
+ * Provides a configurable object with method-based payment functions
288
+ */
289
+
290
+ type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
291
+ interface ArmoryConfig {
292
+ wallet: SimpleWalletInput;
293
+ methods?: HttpMethod[] | HttpMethod;
294
+ tokens?: TokenId[] | TokenId;
295
+ chains?: NetworkId[] | NetworkId;
296
+ debug?: boolean;
297
+ }
298
+ interface PaymentOptions {
299
+ method?: HttpMethod;
300
+ body?: unknown;
301
+ }
302
+ interface ArmoryInstance {
303
+ get<T>(url: string, body?: unknown): Promise<ArmoryPaymentResult<T>>;
304
+ post<T>(url: string, body?: unknown): Promise<ArmoryPaymentResult<T>>;
305
+ put<T>(url: string, body?: unknown): Promise<ArmoryPaymentResult<T>>;
306
+ delete<T>(url: string): Promise<ArmoryPaymentResult<T>>;
307
+ patch<T>(url: string, body?: unknown): Promise<ArmoryPaymentResult<T>>;
308
+ pay<T>(url: string, options?: PaymentOptions): Promise<ArmoryPaymentResult<T>>;
309
+ call<T>(url: string): Promise<ArmoryPaymentResult<T>>;
310
+ }
311
+ declare const createArmory: (config: ArmoryConfig) => ArmoryInstance;
312
+
313
+ export { type ArmoryConfig, type ArmoryInstance, AuthorizationError, type ClientConfig, type HttpMethod, type NormalizedWallet, type ParsedPaymentRequirements, PaymentError, type PaymentOptions, ProviderRequiredError, SignerRequiredError, SigningError, type SimpleWalletInput, type X402Client, type X402ClientConfig, X402ClientError, type X402RequestInit, type X402Transport, type X402TransportConfig, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version, encodeX402Payment, getNetworks, getPaymentHeaderName, getTokens, getWalletAddress, normalizeWallet, parsePaymentRequired, recoverEIP3009Signer, signEIP3009, signEIP3009WithDomain, signPayment, validateNetwork, validateToken };
package/dist/index.js CHANGED
@@ -1,47 +1,13 @@
1
- // src/index.ts
2
- import {
3
- V2_HEADERS as V2_HEADERS3,
4
- isSettlementSuccessful as isSettlementSuccessful2,
5
- getTxHash,
6
- NETWORKS,
7
- getNetworkConfig as getNetworkConfig2,
8
- getNetworkByChainId as getNetworkByChainId2,
9
- getMainnets,
10
- getTestnets,
11
- ERC20_ABI,
12
- encodePaymentV2,
13
- decodePaymentV2,
14
- encodeSettlementV2,
15
- decodeSettlementV2 as decodeSettlementV22,
16
- detectPaymentVersion,
17
- decodePayment,
18
- isPaymentV2,
19
- isSettlementV2,
20
- isX402V2PaymentRequired as isX402V2PaymentRequired2,
21
- EIP712_TYPES as EIP712_TYPES2,
22
- createEIP712Domain as createEIP712Domain3,
23
- createTransferWithAuthorization as createTransferWithAuthorization2,
24
- validateTransferWithAuthorization,
25
- isCAIP2ChainId,
26
- isCAIPAssetId,
27
- safeBase64Decode
28
- } from "@armory-sh/base";
1
+ import { createEIP712Domain, V2_HEADERS, isX402V2PaymentRequired, validatePaymentConfig, isValidationError, resolveNetwork, resolveToken, getNetworkConfig, normalizeNetworkName, decodeSettlementV2 } from '@armory-sh/base';
2
+ export { EIP712_TYPES, ERC20_ABI, NETWORKS, V2_HEADERS, createEIP712Domain, createTransferWithAuthorization, decodePayment, decodePaymentV2, decodeSettlementV2, detectPaymentVersion, encodePaymentV2, encodeSettlementV2, getMainnets, getNetworkByChainId, getNetworkConfig, getTestnets, getTxHash, isCAIP2ChainId, isCAIPAssetId, isPaymentV2, isSettlementSuccessful, isSettlementV2, isX402V2PaymentRequired, safeBase64Decode, validateTransferWithAuthorization } from '@armory-sh/base';
3
+ import { ethers } from 'ethers';
29
4
 
30
- // src/protocol.ts
31
- import {
32
- V2_HEADERS,
33
- isX402V2PaymentRequired,
34
- getNetworkByChainId,
35
- getNetworkConfig,
36
- createEIP712Domain as createEIP712Domain2,
37
- normalizeNetworkName
38
- } from "@armory-sh/base";
39
-
40
- // src/eip3009.ts
41
- import { ethers } from "ethers";
42
- import {
43
- createEIP712Domain
44
- } from "@armory-sh/base";
5
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
6
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
7
+ }) : x)(function(x) {
8
+ if (typeof require !== "undefined") return require.apply(this, arguments);
9
+ throw Error('Dynamic require of "' + x + '" is not supported');
10
+ });
45
11
 
46
12
  // src/errors.ts
47
13
  var X402ClientError = class extends Error {
@@ -199,7 +165,7 @@ function createNonce() {
199
165
  async function createX402V2Payment(signer, requirements, fromAddress, nonce, validBefore, domainName, domainVersion) {
200
166
  const contractAddress = requirements.asset;
201
167
  const chainId = extractChainId(requirements.network);
202
- const domain = createEIP712Domain2(chainId, contractAddress);
168
+ const domain = createEIP712Domain(chainId, contractAddress);
203
169
  const customDomain = domainName || domainVersion ? { ...domain, name: domainName ?? domain.name, version: domainVersion ?? domain.version } : domain;
204
170
  const authorization = {
205
171
  from: fromAddress,
@@ -246,12 +212,6 @@ async function createX402Payment(signer, parsed, fromAddress, nonce, validBefore
246
212
  function encodeX402Payment(payload) {
247
213
  return Buffer.from(JSON.stringify(payload)).toString("base64");
248
214
  }
249
-
250
- // src/transport.ts
251
- import {
252
- decodeSettlementV2,
253
- V2_HEADERS as V2_HEADERS2
254
- } from "@armory-sh/base";
255
215
  var defaultConfig = {
256
216
  baseURL: "",
257
217
  headers: {},
@@ -302,7 +262,7 @@ var handlePaymentRequired = async (state, response) => {
302
262
  },
303
263
  state.config.timeout
304
264
  );
305
- const settlement = decodeSettlementV2(paymentResponse.headers.get(V2_HEADERS2.PAYMENT_RESPONSE) || "");
265
+ const settlement = decodeSettlementV2(paymentResponse.headers.get(V2_HEADERS.PAYMENT_RESPONSE) || "");
306
266
  return { success: true, settlement };
307
267
  } catch (error) {
308
268
  return { success: false, error: error instanceof Error ? error : new Error(String(error)) };
@@ -394,47 +354,185 @@ function createX402Client(config) {
394
354
  getSigner: () => transport.getSigner()
395
355
  };
396
356
  }
397
- export {
398
- AuthorizationError,
399
- EIP712_TYPES2 as EIP712_TYPES,
400
- ERC20_ABI,
401
- NETWORKS,
402
- PaymentError,
403
- ProviderRequiredError,
404
- SignerRequiredError,
405
- SigningError,
406
- V2_HEADERS3 as V2_HEADERS,
407
- X402ClientError,
408
- createEIP712Domain3 as createEIP712Domain,
409
- createTransferWithAuthorization2 as createTransferWithAuthorization,
410
- createX402Client,
411
- createX402Payment,
412
- createX402Transport,
413
- decodePayment,
414
- decodePaymentV2,
415
- decodeSettlementV22 as decodeSettlementV2,
416
- detectPaymentVersion,
417
- detectX402Version,
418
- encodePaymentV2,
419
- encodeSettlementV2,
420
- encodeX402Payment,
421
- getMainnets,
422
- getNetworkByChainId2 as getNetworkByChainId,
423
- getNetworkConfig2 as getNetworkConfig,
424
- getPaymentHeaderName,
425
- getTestnets,
426
- getTxHash,
427
- isCAIP2ChainId,
428
- isCAIPAssetId,
429
- isPaymentV2,
430
- isSettlementSuccessful2 as isSettlementSuccessful,
431
- isSettlementV2,
432
- isX402V2PaymentRequired2 as isX402V2PaymentRequired,
433
- parsePaymentRequired,
434
- recoverEIP3009Signer,
435
- safeBase64Decode,
436
- signEIP3009,
437
- signEIP3009WithDomain,
438
- signPayment,
439
- validateTransferWithAuthorization
357
+ var normalizeWallet = (wallet) => {
358
+ if (typeof wallet === "object" && wallet !== null && "signer" in wallet) {
359
+ return wallet.signer;
360
+ }
361
+ return wallet;
362
+ };
363
+ var armoryPay = async (wallet, url, network, token, options) => {
364
+ try {
365
+ const signer = normalizeWallet(wallet);
366
+ const config = validatePaymentConfig(network, token);
367
+ if (isValidationError(config)) {
368
+ return {
369
+ success: false,
370
+ code: config.code,
371
+ message: config.message,
372
+ details: config
373
+ };
374
+ }
375
+ const transport = createX402Transport();
376
+ transport.setSigner(signer);
377
+ const method = options?.method ?? "GET";
378
+ const headers = { ...options?.headers };
379
+ let response;
380
+ if (method === "GET") {
381
+ response = await transport.get(url, { headers });
382
+ } else if (method === "POST") {
383
+ response = await transport.post(url, options?.body, { headers });
384
+ } else if (method === "PUT") {
385
+ response = await transport.put(url, options?.body, { headers });
386
+ } else if (method === "DELETE") {
387
+ response = await transport.del(url, { headers });
388
+ } else if (method === "PATCH") {
389
+ response = await transport.patch(url, options?.body, { headers });
390
+ } else {
391
+ response = await transport.fetch(url, { method, headers });
392
+ }
393
+ if (!response.ok) {
394
+ const error = await response.text();
395
+ return {
396
+ success: false,
397
+ code: "PAYMENT_DECLINED",
398
+ message: `Request failed: ${response.status} ${error}`
399
+ };
400
+ }
401
+ const data = await response.json();
402
+ const txHash = response.headers.get("X-PAYMENT-RESPONSE") || response.headers.get("PAYMENT-RESPONSE");
403
+ return {
404
+ success: true,
405
+ data,
406
+ ...txHash && { txHash }
407
+ };
408
+ } catch (error) {
409
+ return {
410
+ success: false,
411
+ code: "NETWORK_ERROR",
412
+ message: error instanceof Error ? error.message : "Unknown error occurred",
413
+ details: error
414
+ };
415
+ }
416
+ };
417
+ var armoryGet = (wallet, url, network, token, options) => {
418
+ return armoryPay(wallet, url, network, token, { ...options, method: "GET" });
419
+ };
420
+ var armoryPost = (wallet, url, network, token, body, options) => {
421
+ return armoryPay(wallet, url, network, token, { ...options, method: "POST", body });
422
+ };
423
+ var armoryPut = (wallet, url, network, token, body, options) => {
424
+ return armoryPay(wallet, url, network, token, { ...options, method: "PUT", body });
425
+ };
426
+ var armoryDelete = (wallet, url, network, token, options) => {
427
+ return armoryPay(wallet, url, network, token, { ...options, method: "DELETE" });
428
+ };
429
+ var armoryPatch = (wallet, url, network, token, body, options) => {
430
+ return armoryPay(wallet, url, network, token, { ...options, method: "PATCH", body });
431
+ };
432
+ var getWalletAddress = async (wallet) => {
433
+ const signer = normalizeWallet(wallet);
434
+ return signer.getAddress();
440
435
  };
436
+ var validateNetwork = (network) => {
437
+ const resolved = resolveNetwork(network);
438
+ if (isValidationError(resolved)) {
439
+ return resolved;
440
+ }
441
+ return { success: true, network: resolved.config.name };
442
+ };
443
+ var validateToken = (token, network) => {
444
+ let resolvedNetwork = void 0;
445
+ if (network) {
446
+ const networkResult = resolveNetwork(network);
447
+ if (isValidationError(networkResult)) {
448
+ return networkResult;
449
+ }
450
+ resolvedNetwork = networkResult;
451
+ }
452
+ const resolved = resolveToken(token, resolvedNetwork);
453
+ if (isValidationError(resolved)) {
454
+ return resolved;
455
+ }
456
+ return {
457
+ success: true,
458
+ token: resolved.config.symbol,
459
+ network: resolved.network.config.name
460
+ };
461
+ };
462
+ var getNetworks = () => {
463
+ const { getAvailableNetworks } = __require("@armory-sh/base");
464
+ return getAvailableNetworks();
465
+ };
466
+ var getTokens = () => {
467
+ const { getAvailableTokens } = __require("@armory-sh/base");
468
+ return getAvailableTokens();
469
+ };
470
+ var ALL_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "DELETE", "PATCH"]);
471
+ var arrayify = (value) => {
472
+ if (value === void 0) return void 0;
473
+ return Array.isArray(value) ? value : [value];
474
+ };
475
+ var normalizeArmoryConfig = (config) => ({
476
+ wallet: normalizeWallet(config.wallet),
477
+ allowedMethods: config.methods ? new Set(arrayify(config.methods)) : ALL_METHODS,
478
+ allowedTokens: arrayify(config.tokens) ?? [],
479
+ allowedChains: arrayify(config.chains) ?? [],
480
+ debug: config.debug ?? false
481
+ });
482
+ var createArmory = (config) => {
483
+ const internal = normalizeArmoryConfig(config);
484
+ const transport = createX402Transport();
485
+ transport.setSigner(internal.wallet);
486
+ const makeRequest = async (url, method, body) => {
487
+ try {
488
+ let response;
489
+ const headers = {};
490
+ if (method === "GET") {
491
+ response = await transport.get(url, { headers });
492
+ } else if (method === "POST") {
493
+ response = await transport.post(url, body, { headers });
494
+ } else if (method === "PUT") {
495
+ response = await transport.put(url, body, { headers });
496
+ } else if (method === "DELETE") {
497
+ response = await transport.del(url, { headers });
498
+ } else if (method === "PATCH") {
499
+ response = await transport.patch(url, body, { headers });
500
+ } else {
501
+ response = await transport.fetch(url, { method, headers });
502
+ }
503
+ if (!response.ok) {
504
+ const error = await response.text();
505
+ return {
506
+ success: false,
507
+ code: "PAYMENT_DECLINED",
508
+ message: `Request failed: ${response.status} ${error}`
509
+ };
510
+ }
511
+ const data = await response.json();
512
+ const txHash = response.headers.get("X-PAYMENT-RESPONSE") || response.headers.get("PAYMENT-RESPONSE");
513
+ return {
514
+ success: true,
515
+ data,
516
+ ...txHash && { txHash }
517
+ };
518
+ } catch (error) {
519
+ return {
520
+ success: false,
521
+ code: "NETWORK_ERROR",
522
+ message: error instanceof Error ? error.message : "Unknown error occurred",
523
+ details: error
524
+ };
525
+ }
526
+ };
527
+ return {
528
+ get: (url, body) => makeRequest(url, "GET", body),
529
+ post: (url, body) => makeRequest(url, "POST", body),
530
+ put: (url, body) => makeRequest(url, "PUT", body),
531
+ delete: (url) => makeRequest(url, "DELETE"),
532
+ patch: (url, body) => makeRequest(url, "PATCH", body),
533
+ pay: (url, options) => makeRequest(url, options?.method ?? "GET", options?.body),
534
+ call: (url) => makeRequest(url, "GET")
535
+ };
536
+ };
537
+
538
+ export { AuthorizationError, PaymentError, ProviderRequiredError, SignerRequiredError, SigningError, X402ClientError, armoryDelete, armoryGet, armoryPatch, armoryPay, armoryPost, armoryPut, createArmory, createX402Client, createX402Payment, createX402Transport, detectX402Version, encodeX402Payment, getNetworks, getPaymentHeaderName, getTokens, getWalletAddress, normalizeWallet, parsePaymentRequired, recoverEIP3009Signer, signEIP3009, signEIP3009WithDomain, signPayment, validateNetwork, validateToken };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@armory-sh/client-ethers",
3
- "version": "0.2.18",
3
+ "version": "0.2.20-alpha.3.11",
4
4
  "license": "MIT",
5
5
  "author": "Sawyer Cutler <sawyer@dirtroad.dev>",
6
6
  "type": "module",
@@ -23,11 +23,11 @@
23
23
  },
24
24
  "repository": {
25
25
  "type": "git",
26
- "url": "git+https://github.com/thegreataxios/armory.git",
26
+ "url": "https://github.com/TheGreatAxios/armory",
27
27
  "directory": "packages/client-ethers"
28
28
  },
29
29
  "dependencies": {
30
- "@armory-sh/base": "^0.2.19",
30
+ "@armory-sh/base": "^0.2.21",
31
31
  "ethers": "6.16.0"
32
32
  },
33
33
  "devDependencies": {