@armory-sh/client-ethers 0.2.18 → 0.2.19

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,3 +1,10 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
1
8
  // src/index.ts
2
9
  import {
3
10
  V2_HEADERS as V2_HEADERS3,
@@ -5,7 +12,7 @@ import {
5
12
  getTxHash,
6
13
  NETWORKS,
7
14
  getNetworkConfig as getNetworkConfig2,
8
- getNetworkByChainId as getNetworkByChainId2,
15
+ getNetworkByChainId as getNetworkByChainId3,
9
16
  getMainnets,
10
17
  getTestnets,
11
18
  ERC20_ABI,
@@ -394,6 +401,200 @@ function createX402Client(config) {
394
401
  getSigner: () => transport.getSigner()
395
402
  };
396
403
  }
404
+
405
+ // src/payment-api.ts
406
+ import {
407
+ resolveNetwork,
408
+ resolveToken,
409
+ validatePaymentConfig,
410
+ isValidationError
411
+ } from "@armory-sh/base";
412
+ var normalizeWallet = (wallet) => {
413
+ if (typeof wallet === "object" && wallet !== null && "signer" in wallet) {
414
+ return wallet.signer;
415
+ }
416
+ return wallet;
417
+ };
418
+ var armoryPay = async (wallet, url, network, token, options) => {
419
+ try {
420
+ const signer = normalizeWallet(wallet);
421
+ const config = validatePaymentConfig(network, token);
422
+ if (isValidationError(config)) {
423
+ return {
424
+ success: false,
425
+ code: config.code,
426
+ message: config.message,
427
+ details: config
428
+ };
429
+ }
430
+ const transport = createX402Transport();
431
+ transport.setSigner(signer);
432
+ const method = options?.method ?? "GET";
433
+ const headers = { ...options?.headers };
434
+ let response;
435
+ if (method === "GET") {
436
+ response = await transport.get(url, { headers });
437
+ } else if (method === "POST") {
438
+ response = await transport.post(url, options?.body, { headers });
439
+ } else if (method === "PUT") {
440
+ response = await transport.put(url, options?.body, { headers });
441
+ } else if (method === "DELETE") {
442
+ response = await transport.del(url, { headers });
443
+ } else if (method === "PATCH") {
444
+ response = await transport.patch(url, options?.body, { headers });
445
+ } else {
446
+ response = await transport.fetch(url, { method, headers });
447
+ }
448
+ if (!response.ok) {
449
+ const error = await response.text();
450
+ return {
451
+ success: false,
452
+ code: "PAYMENT_DECLINED",
453
+ message: `Request failed: ${response.status} ${error}`
454
+ };
455
+ }
456
+ const data = await response.json();
457
+ const txHash = response.headers.get("X-PAYMENT-RESPONSE") || response.headers.get("PAYMENT-RESPONSE");
458
+ return {
459
+ success: true,
460
+ data,
461
+ ...txHash && { txHash }
462
+ };
463
+ } catch (error) {
464
+ return {
465
+ success: false,
466
+ code: "NETWORK_ERROR",
467
+ message: error instanceof Error ? error.message : "Unknown error occurred",
468
+ details: error
469
+ };
470
+ }
471
+ };
472
+ var armoryGet = (wallet, url, network, token, options) => {
473
+ return armoryPay(wallet, url, network, token, { ...options, method: "GET" });
474
+ };
475
+ var armoryPost = (wallet, url, network, token, body, options) => {
476
+ return armoryPay(wallet, url, network, token, { ...options, method: "POST", body });
477
+ };
478
+ var armoryPut = (wallet, url, network, token, body, options) => {
479
+ return armoryPay(wallet, url, network, token, { ...options, method: "PUT", body });
480
+ };
481
+ var armoryDelete = (wallet, url, network, token, options) => {
482
+ return armoryPay(wallet, url, network, token, { ...options, method: "DELETE" });
483
+ };
484
+ var armoryPatch = (wallet, url, network, token, body, options) => {
485
+ return armoryPay(wallet, url, network, token, { ...options, method: "PATCH", body });
486
+ };
487
+ var getWalletAddress = async (wallet) => {
488
+ const signer = normalizeWallet(wallet);
489
+ return signer.getAddress();
490
+ };
491
+ var validateNetwork = (network) => {
492
+ const resolved = resolveNetwork(network);
493
+ if (isValidationError(resolved)) {
494
+ return resolved;
495
+ }
496
+ return { success: true, network: resolved.config.name };
497
+ };
498
+ var validateToken = (token, network) => {
499
+ let resolvedNetwork = void 0;
500
+ if (network) {
501
+ const networkResult = resolveNetwork(network);
502
+ if (isValidationError(networkResult)) {
503
+ return networkResult;
504
+ }
505
+ resolvedNetwork = networkResult;
506
+ }
507
+ const resolved = resolveToken(token, resolvedNetwork);
508
+ if (isValidationError(resolved)) {
509
+ return resolved;
510
+ }
511
+ return {
512
+ success: true,
513
+ token: resolved.config.symbol,
514
+ network: resolved.network.config.name
515
+ };
516
+ };
517
+ var getNetworks = () => {
518
+ const { getAvailableNetworks } = __require("@armory-sh/base");
519
+ return getAvailableNetworks();
520
+ };
521
+ var getTokens = () => {
522
+ const { getAvailableTokens } = __require("@armory-sh/base");
523
+ return getAvailableTokens();
524
+ };
525
+
526
+ // src/armory-api.ts
527
+ import {
528
+ resolveNetwork as resolveNetwork2,
529
+ resolveToken as resolveToken2
530
+ } from "@armory-sh/base";
531
+ var ALL_METHODS = /* @__PURE__ */ new Set(["GET", "POST", "PUT", "DELETE", "PATCH"]);
532
+ var arrayify = (value) => {
533
+ if (value === void 0) return void 0;
534
+ return Array.isArray(value) ? value : [value];
535
+ };
536
+ var normalizeArmoryConfig = (config) => ({
537
+ wallet: normalizeWallet(config.wallet),
538
+ allowedMethods: config.methods ? new Set(arrayify(config.methods)) : ALL_METHODS,
539
+ allowedTokens: arrayify(config.tokens) ?? [],
540
+ allowedChains: arrayify(config.chains) ?? [],
541
+ debug: config.debug ?? false
542
+ });
543
+ var createArmory = (config) => {
544
+ const internal = normalizeArmoryConfig(config);
545
+ const transport = createX402Transport();
546
+ transport.setSigner(internal.wallet);
547
+ const makeRequest = async (url, method, body) => {
548
+ try {
549
+ let response;
550
+ const headers = {};
551
+ if (method === "GET") {
552
+ response = await transport.get(url, { headers });
553
+ } else if (method === "POST") {
554
+ response = await transport.post(url, body, { headers });
555
+ } else if (method === "PUT") {
556
+ response = await transport.put(url, body, { headers });
557
+ } else if (method === "DELETE") {
558
+ response = await transport.del(url, { headers });
559
+ } else if (method === "PATCH") {
560
+ response = await transport.patch(url, body, { headers });
561
+ } else {
562
+ response = await transport.fetch(url, { method, headers });
563
+ }
564
+ if (!response.ok) {
565
+ const error = await response.text();
566
+ return {
567
+ success: false,
568
+ code: "PAYMENT_DECLINED",
569
+ message: `Request failed: ${response.status} ${error}`
570
+ };
571
+ }
572
+ const data = await response.json();
573
+ const txHash = response.headers.get("X-PAYMENT-RESPONSE") || response.headers.get("PAYMENT-RESPONSE");
574
+ return {
575
+ success: true,
576
+ data,
577
+ ...txHash && { txHash }
578
+ };
579
+ } catch (error) {
580
+ return {
581
+ success: false,
582
+ code: "NETWORK_ERROR",
583
+ message: error instanceof Error ? error.message : "Unknown error occurred",
584
+ details: error
585
+ };
586
+ }
587
+ };
588
+ return {
589
+ get: (url, body) => makeRequest(url, "GET", body),
590
+ post: (url, body) => makeRequest(url, "POST", body),
591
+ put: (url, body) => makeRequest(url, "PUT", body),
592
+ delete: (url) => makeRequest(url, "DELETE"),
593
+ patch: (url, body) => makeRequest(url, "PATCH", body),
594
+ pay: (url, options) => makeRequest(url, options?.method ?? "GET", options?.body),
595
+ call: (url) => makeRequest(url, "GET")
596
+ };
597
+ };
397
598
  export {
398
599
  AuthorizationError,
399
600
  EIP712_TYPES2 as EIP712_TYPES,
@@ -405,6 +606,13 @@ export {
405
606
  SigningError,
406
607
  V2_HEADERS3 as V2_HEADERS,
407
608
  X402ClientError,
609
+ armoryDelete,
610
+ armoryGet,
611
+ armoryPatch,
612
+ armoryPay,
613
+ armoryPost,
614
+ armoryPut,
615
+ createArmory,
408
616
  createEIP712Domain3 as createEIP712Domain,
409
617
  createTransferWithAuthorization2 as createTransferWithAuthorization,
410
618
  createX402Client,
@@ -419,22 +627,28 @@ export {
419
627
  encodeSettlementV2,
420
628
  encodeX402Payment,
421
629
  getMainnets,
422
- getNetworkByChainId2 as getNetworkByChainId,
630
+ getNetworkByChainId3 as getNetworkByChainId,
423
631
  getNetworkConfig2 as getNetworkConfig,
632
+ getNetworks,
424
633
  getPaymentHeaderName,
425
634
  getTestnets,
635
+ getTokens,
426
636
  getTxHash,
637
+ getWalletAddress,
427
638
  isCAIP2ChainId,
428
639
  isCAIPAssetId,
429
640
  isPaymentV2,
430
641
  isSettlementSuccessful2 as isSettlementSuccessful,
431
642
  isSettlementV2,
432
643
  isX402V2PaymentRequired2 as isX402V2PaymentRequired,
644
+ normalizeWallet,
433
645
  parsePaymentRequired,
434
646
  recoverEIP3009Signer,
435
647
  safeBase64Decode,
436
648
  signEIP3009,
437
649
  signEIP3009WithDomain,
438
650
  signPayment,
651
+ validateNetwork,
652
+ validateToken,
439
653
  validateTransferWithAuthorization
440
654
  };
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.19",
4
4
  "license": "MIT",
5
5
  "author": "Sawyer Cutler <sawyer@dirtroad.dev>",
6
6
  "type": "module",
@@ -27,7 +27,7 @@
27
27
  "directory": "packages/client-ethers"
28
28
  },
29
29
  "dependencies": {
30
- "@armory-sh/base": "^0.2.19",
30
+ "@armory-sh/base": "^0.2.20",
31
31
  "ethers": "6.16.0"
32
32
  },
33
33
  "devDependencies": {