moltspay 0.9.5 → 0.9.7

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.
Files changed (51) hide show
  1. package/README.md +68 -45
  2. package/dist/cdp/index.d.mts +1 -1
  3. package/dist/cdp/index.d.ts +1 -1
  4. package/dist/cdp/index.js +63 -0
  5. package/dist/cdp/index.js.map +1 -1
  6. package/dist/cdp/index.mjs +63 -0
  7. package/dist/cdp/index.mjs.map +1 -1
  8. package/dist/chains/index.d.mts +9 -5
  9. package/dist/chains/index.d.ts +9 -5
  10. package/dist/chains/index.js +85 -0
  11. package/dist/chains/index.js.map +1 -1
  12. package/dist/chains/index.mjs +83 -0
  13. package/dist/chains/index.mjs.map +1 -1
  14. package/dist/cli/index.js +201 -38
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/index.mjs +201 -38
  17. package/dist/cli/index.mjs.map +1 -1
  18. package/dist/client/index.d.mts +18 -3
  19. package/dist/client/index.d.ts +18 -3
  20. package/dist/client/index.js +112 -15
  21. package/dist/client/index.js.map +1 -1
  22. package/dist/client/index.mjs +112 -15
  23. package/dist/client/index.mjs.map +1 -1
  24. package/dist/{index-Dg8n6wdW.d.mts → index-B3v8IWjM.d.mts} +11 -1
  25. package/dist/{index-Dg8n6wdW.d.ts → index-B3v8IWjM.d.ts} +11 -1
  26. package/dist/index.d.mts +1 -1
  27. package/dist/index.d.ts +1 -1
  28. package/dist/index.js +203 -42
  29. package/dist/index.js.map +1 -1
  30. package/dist/index.mjs +203 -42
  31. package/dist/index.mjs.map +1 -1
  32. package/dist/server/index.d.mts +19 -1
  33. package/dist/server/index.d.ts +19 -1
  34. package/dist/server/index.js +71 -19
  35. package/dist/server/index.js.map +1 -1
  36. package/dist/server/index.mjs +71 -19
  37. package/dist/server/index.mjs.map +1 -1
  38. package/dist/verify/index.d.mts +7 -0
  39. package/dist/verify/index.d.ts +7 -0
  40. package/dist/verify/index.js +83 -8
  41. package/dist/verify/index.js.map +1 -1
  42. package/dist/verify/index.mjs +83 -8
  43. package/dist/verify/index.mjs.map +1 -1
  44. package/dist/wallet/index.d.mts +16 -8
  45. package/dist/wallet/index.d.ts +16 -8
  46. package/dist/wallet/index.js +114 -18
  47. package/dist/wallet/index.js.map +1 -1
  48. package/dist/wallet/index.mjs +114 -18
  49. package/dist/wallet/index.mjs.map +1 -1
  50. package/package.json +1 -1
  51. package/schemas/moltspay.services.schema.json +13 -3
@@ -3,12 +3,19 @@ import { d as FacilitatorSelection } from '../registry-OsEO2dOu.mjs';
3
3
  /**
4
4
  * MoltsPay Server Types
5
5
  */
6
+ type TokenSymbol = 'USDC' | 'USDT';
6
7
  interface ServiceConfig {
7
8
  id: string;
8
9
  name: string;
9
10
  description?: string;
10
11
  price: number;
11
12
  currency: string;
13
+ /**
14
+ * Tokens accepted for payment (optional).
15
+ * If not specified, defaults to [currency].
16
+ * Example: ["USDC", "USDT"]
17
+ */
18
+ acceptedCurrencies?: TokenSymbol[];
12
19
  input: Record<string, InputField>;
13
20
  output: Record<string, OutputField>;
14
21
  /** Shell command to execute for this service. Params passed as JSON to stdin. */
@@ -138,6 +145,7 @@ declare class MoltsPayServer {
138
145
  private handleExecute;
139
146
  /**
140
147
  * Return 402 with x402 payment requirements (v2 format)
148
+ * Includes requirements for all accepted currencies
141
149
  */
142
150
  private sendPaymentRequired;
143
151
  /**
@@ -146,8 +154,18 @@ declare class MoltsPayServer {
146
154
  private validatePayment;
147
155
  /**
148
156
  * Build payment requirements for facilitator
157
+ * Returns requirements for the primary currency (USDC by default)
158
+ * Server accepts any of the acceptedCurrencies
149
159
  */
150
160
  private buildPaymentRequirements;
161
+ /**
162
+ * Detect which token is being used in the payment
163
+ */
164
+ private detectPaymentToken;
165
+ /**
166
+ * Check if payment token is accepted for service
167
+ */
168
+ private isTokenAccepted;
151
169
  private readBody;
152
170
  private sendJson;
153
171
  /**
@@ -177,4 +195,4 @@ declare class MoltsPayServer {
177
195
  private sendProxyPaymentRequired;
178
196
  }
179
197
 
180
- export { type Charge, type ChargeStatus, type InputField, MoltsPayServer, type MoltsPayServerOptions, type MoltsPayServerOptionsExtended, type OutputField, type PaymentRequest, type ProviderConfig, type RegisteredSkill, type ServiceConfig, type ServicesManifest, type SkillFunction, type VerifyRequest };
198
+ export { type Charge, type ChargeStatus, type InputField, MoltsPayServer, type MoltsPayServerOptions, type MoltsPayServerOptionsExtended, type OutputField, type PaymentRequest, type ProviderConfig, type RegisteredSkill, type ServiceConfig, type ServicesManifest, type SkillFunction, type TokenSymbol, type VerifyRequest };
@@ -3,12 +3,19 @@ import { d as FacilitatorSelection } from '../registry-OsEO2dOu.js';
3
3
  /**
4
4
  * MoltsPay Server Types
5
5
  */
6
+ type TokenSymbol = 'USDC' | 'USDT';
6
7
  interface ServiceConfig {
7
8
  id: string;
8
9
  name: string;
9
10
  description?: string;
10
11
  price: number;
11
12
  currency: string;
13
+ /**
14
+ * Tokens accepted for payment (optional).
15
+ * If not specified, defaults to [currency].
16
+ * Example: ["USDC", "USDT"]
17
+ */
18
+ acceptedCurrencies?: TokenSymbol[];
12
19
  input: Record<string, InputField>;
13
20
  output: Record<string, OutputField>;
14
21
  /** Shell command to execute for this service. Params passed as JSON to stdin. */
@@ -138,6 +145,7 @@ declare class MoltsPayServer {
138
145
  private handleExecute;
139
146
  /**
140
147
  * Return 402 with x402 payment requirements (v2 format)
148
+ * Includes requirements for all accepted currencies
141
149
  */
142
150
  private sendPaymentRequired;
143
151
  /**
@@ -146,8 +154,18 @@ declare class MoltsPayServer {
146
154
  private validatePayment;
147
155
  /**
148
156
  * Build payment requirements for facilitator
157
+ * Returns requirements for the primary currency (USDC by default)
158
+ * Server accepts any of the acceptedCurrencies
149
159
  */
150
160
  private buildPaymentRequirements;
161
+ /**
162
+ * Detect which token is being used in the payment
163
+ */
164
+ private detectPaymentToken;
165
+ /**
166
+ * Check if payment token is accepted for service
167
+ */
168
+ private isTokenAccepted;
151
169
  private readBody;
152
170
  private sendJson;
153
171
  /**
@@ -177,4 +195,4 @@ declare class MoltsPayServer {
177
195
  private sendProxyPaymentRequired;
178
196
  }
179
197
 
180
- export { type Charge, type ChargeStatus, type InputField, MoltsPayServer, type MoltsPayServerOptions, type MoltsPayServerOptionsExtended, type OutputField, type PaymentRequest, type ProviderConfig, type RegisteredSkill, type ServiceConfig, type ServicesManifest, type SkillFunction, type VerifyRequest };
198
+ export { type Charge, type ChargeStatus, type InputField, MoltsPayServer, type MoltsPayServerOptions, type MoltsPayServerOptionsExtended, type OutputField, type PaymentRequest, type ProviderConfig, type RegisteredSkill, type ServiceConfig, type ServicesManifest, type SkillFunction, type TokenSymbol, type VerifyRequest };
@@ -486,16 +486,24 @@ var X402_VERSION2 = 2;
486
486
  var PAYMENT_REQUIRED_HEADER = "x-payment-required";
487
487
  var PAYMENT_HEADER = "x-payment";
488
488
  var PAYMENT_RESPONSE_HEADER = "x-payment-response";
489
- var USDC_ADDRESSES = {
490
- "eip155:8453": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
491
- // Base mainnet
492
- "eip155:84532": "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
493
- // Base Sepolia
489
+ var TOKEN_ADDRESSES = {
490
+ "eip155:8453": {
491
+ USDC: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
492
+ USDT: "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2"
493
+ },
494
+ "eip155:84532": {
495
+ USDC: "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
496
+ USDT: "0x036CbD53842c5426634e7929541eC2318f3dCF7e"
497
+ // Same as USDC on testnet
498
+ }
494
499
  };
495
- var USDC_DOMAIN = {
496
- name: "USD Coin",
497
- version: "2"
500
+ var TOKEN_DOMAINS = {
501
+ USDC: { name: "USD Coin", version: "2" },
502
+ USDT: { name: "Tether USD", version: "2" }
498
503
  };
504
+ function getAcceptedCurrencies(config) {
505
+ return config.acceptedCurrencies ?? [config.currency];
506
+ }
499
507
  function loadEnvFile2() {
500
508
  const envPaths = [
501
509
  path2.join(process.cwd(), ".env"),
@@ -643,6 +651,7 @@ var MoltsPayServer = class {
643
651
  description: s.description,
644
652
  price: s.price,
645
653
  currency: s.currency,
654
+ acceptedCurrencies: getAcceptedCurrencies(s),
646
655
  input: s.input,
647
656
  output: s.output,
648
657
  available: this.skills.has(s.id)
@@ -680,6 +689,7 @@ var MoltsPayServer = class {
680
689
  description: s.description,
681
690
  price: s.price,
682
691
  currency: s.currency,
692
+ acceptedCurrencies: getAcceptedCurrencies(s),
683
693
  input: s.input,
684
694
  output: s.output,
685
695
  available: this.skills.has(s.id)
@@ -746,7 +756,14 @@ var MoltsPayServer = class {
746
756
  if (!validation.valid) {
747
757
  return this.sendJson(res, 402, { error: validation.error });
748
758
  }
749
- const requirements = this.buildPaymentRequirements(skill.config);
759
+ const paymentToken = this.detectPaymentToken(payment);
760
+ if (paymentToken && !this.isTokenAccepted(skill.config, paymentToken)) {
761
+ const accepted = getAcceptedCurrencies(skill.config);
762
+ return this.sendJson(res, 402, {
763
+ error: `Token ${paymentToken} not accepted. Accepted: ${accepted.join(", ")}`
764
+ });
765
+ }
766
+ const requirements = this.buildPaymentRequirements(skill.config, paymentToken);
750
767
  console.log(`[MoltsPay] Verifying payment...`);
751
768
  const verifyResult = await this.registry.verify(payment, requirements);
752
769
  if (!verifyResult.valid) {
@@ -801,12 +818,15 @@ var MoltsPayServer = class {
801
818
  }
802
819
  /**
803
820
  * Return 402 with x402 payment requirements (v2 format)
821
+ * Includes requirements for all accepted currencies
804
822
  */
805
823
  sendPaymentRequired(config, res) {
806
- const requirements = this.buildPaymentRequirements(config);
824
+ const acceptedTokens = getAcceptedCurrencies(config);
825
+ const accepts = acceptedTokens.map((token) => this.buildPaymentRequirements(config, token));
807
826
  const paymentRequired = {
808
827
  x402Version: X402_VERSION2,
809
- accepts: [requirements],
828
+ accepts,
829
+ acceptedCurrencies: acceptedTokens,
810
830
  resource: {
811
831
  url: `/execute?service=${config.id}`,
812
832
  description: `${config.name} - $${config.price} ${config.currency}`,
@@ -821,6 +841,7 @@ var MoltsPayServer = class {
821
841
  res.end(JSON.stringify({
822
842
  error: "Payment required",
823
843
  message: `Service requires $${config.price} ${config.currency}`,
844
+ acceptedCurrencies: acceptedTokens,
824
845
  x402: paymentRequired
825
846
  }, null, 2));
826
847
  }
@@ -843,20 +864,47 @@ var MoltsPayServer = class {
843
864
  }
844
865
  /**
845
866
  * Build payment requirements for facilitator
867
+ * Returns requirements for the primary currency (USDC by default)
868
+ * Server accepts any of the acceptedCurrencies
846
869
  */
847
- buildPaymentRequirements(config) {
870
+ buildPaymentRequirements(config, token) {
848
871
  const amountInUnits = Math.floor(config.price * 1e6).toString();
849
- const usdcAddress = USDC_ADDRESSES[this.networkId];
872
+ const acceptedTokens = getAcceptedCurrencies(config);
873
+ const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
874
+ const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
875
+ const tokenAddress = tokenAddresses[selectedToken];
876
+ const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
850
877
  return {
851
878
  scheme: "exact",
852
879
  network: this.networkId,
853
- asset: usdcAddress,
880
+ asset: tokenAddress,
854
881
  amount: amountInUnits,
855
882
  payTo: this.manifest.provider.wallet,
856
883
  maxTimeoutSeconds: 300,
857
- extra: USDC_DOMAIN
884
+ extra: tokenDomain
858
885
  };
859
886
  }
887
+ /**
888
+ * Detect which token is being used in the payment
889
+ */
890
+ detectPaymentToken(payment) {
891
+ const asset = payment.accepted?.asset || payment.payload?.asset;
892
+ if (!asset) return void 0;
893
+ const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
894
+ for (const [symbol, address] of Object.entries(tokenAddresses)) {
895
+ if (address.toLowerCase() === asset.toLowerCase()) {
896
+ return symbol;
897
+ }
898
+ }
899
+ return void 0;
900
+ }
901
+ /**
902
+ * Check if payment token is accepted for service
903
+ */
904
+ isTokenAccepted(config, token) {
905
+ const accepted = getAcceptedCurrencies(config);
906
+ return accepted.includes(token);
907
+ }
860
908
  async readBody(req) {
861
909
  return new Promise((resolve, reject) => {
862
910
  let body = "";
@@ -1056,18 +1104,22 @@ var MoltsPayServer = class {
1056
1104
  /**
1057
1105
  * Build payment requirements for proxy endpoint (uses provided wallet)
1058
1106
  */
1059
- buildProxyPaymentRequirements(config, wallet) {
1107
+ buildProxyPaymentRequirements(config, wallet, token) {
1060
1108
  const amountInUnits = Math.floor(config.price * 1e6).toString();
1061
- const usdcAddress = USDC_ADDRESSES[this.networkId];
1109
+ const acceptedTokens = getAcceptedCurrencies(config);
1110
+ const selectedToken = token && acceptedTokens.includes(token) ? token : acceptedTokens[0];
1111
+ const tokenAddresses = TOKEN_ADDRESSES[this.networkId] || {};
1112
+ const tokenAddress = tokenAddresses[selectedToken];
1113
+ const tokenDomain = TOKEN_DOMAINS[selectedToken] || TOKEN_DOMAINS.USDC;
1062
1114
  return {
1063
1115
  scheme: "exact",
1064
1116
  network: this.networkId,
1065
- asset: usdcAddress,
1117
+ asset: tokenAddress,
1066
1118
  amount: amountInUnits,
1067
1119
  payTo: wallet,
1068
1120
  // Use provided wallet, not manifest
1069
1121
  maxTimeoutSeconds: 300,
1070
- extra: USDC_DOMAIN
1122
+ extra: tokenDomain
1071
1123
  };
1072
1124
  }
1073
1125
  /**