uvd-x402-sdk 2.2.2 → 2.4.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.
Files changed (57) hide show
  1. package/dist/adapters/index.d.mts +1 -1
  2. package/dist/adapters/index.d.ts +1 -1
  3. package/dist/adapters/index.js +83 -5
  4. package/dist/adapters/index.js.map +1 -1
  5. package/dist/adapters/index.mjs +83 -5
  6. package/dist/adapters/index.mjs.map +1 -1
  7. package/dist/{index-OZTSi1rJ.d.ts → index-BYX9BU79.d.ts} +1 -1
  8. package/dist/{index-I60aHxwu.d.mts → index-BrFeSWKm.d.mts} +1 -1
  9. package/dist/{index-BG738nMY.d.mts → index-DR2vXt-c.d.mts} +2 -1
  10. package/dist/{index-BG738nMY.d.ts → index-DR2vXt-c.d.ts} +2 -1
  11. package/dist/index.d.mts +3 -3
  12. package/dist/index.d.ts +3 -3
  13. package/dist/index.js +247 -139
  14. package/dist/index.js.map +1 -1
  15. package/dist/index.mjs +246 -140
  16. package/dist/index.mjs.map +1 -1
  17. package/dist/providers/evm/index.d.mts +1 -1
  18. package/dist/providers/evm/index.d.ts +1 -1
  19. package/dist/providers/evm/index.js +83 -5
  20. package/dist/providers/evm/index.js.map +1 -1
  21. package/dist/providers/evm/index.mjs +83 -5
  22. package/dist/providers/evm/index.mjs.map +1 -1
  23. package/dist/providers/near/index.d.mts +1 -1
  24. package/dist/providers/near/index.d.ts +1 -1
  25. package/dist/providers/near/index.js.map +1 -1
  26. package/dist/providers/near/index.mjs.map +1 -1
  27. package/dist/providers/solana/index.d.mts +1 -1
  28. package/dist/providers/solana/index.d.ts +1 -1
  29. package/dist/providers/solana/index.js +24 -5
  30. package/dist/providers/solana/index.js.map +1 -1
  31. package/dist/providers/solana/index.mjs +24 -5
  32. package/dist/providers/solana/index.mjs.map +1 -1
  33. package/dist/providers/stellar/index.d.mts +1 -1
  34. package/dist/providers/stellar/index.d.ts +1 -1
  35. package/dist/providers/stellar/index.js.map +1 -1
  36. package/dist/providers/stellar/index.mjs.map +1 -1
  37. package/dist/react/index.d.mts +3 -3
  38. package/dist/react/index.d.ts +3 -3
  39. package/dist/react/index.js +83 -5
  40. package/dist/react/index.js.map +1 -1
  41. package/dist/react/index.mjs +83 -5
  42. package/dist/react/index.mjs.map +1 -1
  43. package/dist/utils/index.d.mts +31 -2
  44. package/dist/utils/index.d.ts +31 -2
  45. package/dist/utils/index.js +125 -5
  46. package/dist/utils/index.js.map +1 -1
  47. package/dist/utils/index.mjs +124 -6
  48. package/dist/utils/index.mjs.map +1 -1
  49. package/package.json +2 -2
  50. package/src/adapters/wagmi.ts +4 -1
  51. package/src/chains/index.ts +23 -5
  52. package/src/client/X402Client.ts +4 -0
  53. package/src/index.ts +3 -0
  54. package/src/providers/evm/index.ts +4 -0
  55. package/src/types/index.ts +2 -1
  56. package/src/utils/index.ts +5 -0
  57. package/src/utils/validation.ts +151 -0
package/dist/index.mjs CHANGED
@@ -126,7 +126,7 @@ var SUPPORTED_CHAINS = {
126
126
  ausd: {
127
127
  address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
128
128
  decimals: 6,
129
- name: "AUSD",
129
+ name: "Agora Dollar",
130
130
  version: "1"
131
131
  }
132
132
  },
@@ -170,7 +170,7 @@ var SUPPORTED_CHAINS = {
170
170
  ausd: {
171
171
  address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
172
172
  decimals: 6,
173
- name: "AUSD",
173
+ name: "Agora Dollar",
174
174
  version: "1"
175
175
  },
176
176
  pyusd: {
@@ -214,7 +214,7 @@ var SUPPORTED_CHAINS = {
214
214
  ausd: {
215
215
  address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
216
216
  decimals: 6,
217
- name: "AUSD",
217
+ name: "Agora Dollar",
218
218
  version: "1"
219
219
  }
220
220
  },
@@ -252,7 +252,13 @@ var SUPPORTED_CHAINS = {
252
252
  ausd: {
253
253
  address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
254
254
  decimals: 6,
255
- name: "AUSD",
255
+ name: "Agora Dollar",
256
+ version: "1"
257
+ },
258
+ usdt: {
259
+ address: "0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9",
260
+ decimals: 6,
261
+ name: "USD\u20AE0",
256
262
  version: "1"
257
263
  }
258
264
  },
@@ -286,6 +292,12 @@ var SUPPORTED_CHAINS = {
286
292
  decimals: 6,
287
293
  name: "USD Coin",
288
294
  version: "2"
295
+ },
296
+ usdt: {
297
+ address: "0x01bff41798a0bcf287b996046ca68b395dbc1071",
298
+ decimals: 6,
299
+ name: "USD\u20AE0",
300
+ version: "1"
289
301
  }
290
302
  },
291
303
  x402: {
@@ -320,6 +332,13 @@ var SUPPORTED_CHAINS = {
320
332
  name: "USDC",
321
333
  // Celo uses "USDC" not "USD Coin" for EIP-712
322
334
  version: "2"
335
+ },
336
+ usdt: {
337
+ address: "0x48065fbBE25f71C9282ddf5e1cD6D6A887483D5e",
338
+ decimals: 6,
339
+ name: "Tether USD",
340
+ // Celo USDT uses "Tether USD" for EIP-712
341
+ version: "1"
323
342
  }
324
343
  },
325
344
  x402: {
@@ -426,7 +445,7 @@ var SUPPORTED_CHAINS = {
426
445
  ausd: {
427
446
  address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
428
447
  decimals: 6,
429
- name: "AUSD",
448
+ name: "Agora Dollar",
430
449
  version: "1"
431
450
  }
432
451
  },
@@ -663,6 +682,226 @@ function getChainsByToken(tokenType) {
663
682
  });
664
683
  }
665
684
 
685
+ // src/utils/x402.ts
686
+ function detectX402Version(data) {
687
+ if (typeof data !== "object" || data === null) {
688
+ return 1;
689
+ }
690
+ const obj = data;
691
+ if (obj.x402Version === 2) {
692
+ return 2;
693
+ }
694
+ if (obj.accepts && Array.isArray(obj.accepts)) {
695
+ return 2;
696
+ }
697
+ if (typeof obj.network === "string") {
698
+ if (obj.network.includes(":")) {
699
+ return 2;
700
+ }
701
+ }
702
+ return 1;
703
+ }
704
+ function chainToCAIP2(chainName) {
705
+ const caip2 = CAIP2_IDENTIFIERS[chainName.toLowerCase()];
706
+ if (caip2) {
707
+ return caip2;
708
+ }
709
+ const chain = getChainByName(chainName);
710
+ if (chain) {
711
+ if (chain.networkType === "evm") {
712
+ return `eip155:${chain.chainId}`;
713
+ }
714
+ return `${chain.networkType}:${chainName}`;
715
+ }
716
+ return chainName;
717
+ }
718
+ function caip2ToChain(caip2) {
719
+ if (CAIP2_TO_CHAIN[caip2]) {
720
+ return CAIP2_TO_CHAIN[caip2];
721
+ }
722
+ const match = caip2.match(/^eip155:(\d+)$/);
723
+ if (match) {
724
+ const chainId = parseInt(match[1], 10);
725
+ for (const [name, _config] of Object.entries(CAIP2_IDENTIFIERS)) {
726
+ const chain = getChainByName(name);
727
+ if (chain?.chainId === chainId) {
728
+ return name;
729
+ }
730
+ }
731
+ }
732
+ const parts = caip2.split(":");
733
+ if (parts.length === 2) {
734
+ const networkName = parts[1];
735
+ if (getChainByName(networkName)) {
736
+ return networkName;
737
+ }
738
+ }
739
+ return null;
740
+ }
741
+ function parseNetworkIdentifier(network) {
742
+ if (network.includes(":")) {
743
+ return caip2ToChain(network) || network;
744
+ }
745
+ return network.toLowerCase();
746
+ }
747
+ function encodeX402Header(header) {
748
+ return btoa(JSON.stringify(header));
749
+ }
750
+ function decodeX402Header(encoded) {
751
+ const json = atob(encoded);
752
+ return JSON.parse(json);
753
+ }
754
+ function createX402V1Header(network, payload) {
755
+ return {
756
+ x402Version: 1,
757
+ scheme: "exact",
758
+ network,
759
+ payload
760
+ };
761
+ }
762
+ function createX402V2Header(network, payload, accepts) {
763
+ const header = {
764
+ x402Version: 2,
765
+ scheme: "exact",
766
+ network: network.includes(":") ? network : chainToCAIP2(network),
767
+ payload
768
+ };
769
+ if (accepts && accepts.length > 0) {
770
+ header.accepts = accepts;
771
+ }
772
+ return header;
773
+ }
774
+ function createX402Header(chainConfig, payload, version = "auto") {
775
+ const effectiveVersion = version === "auto" ? 1 : version;
776
+ if (effectiveVersion === 2) {
777
+ return createX402V2Header(chainConfig.name, payload);
778
+ }
779
+ return createX402V1Header(chainConfig.name, payload);
780
+ }
781
+ function generatePaymentOptions(chainConfigs, amount, facilitator) {
782
+ return chainConfigs.filter((chain) => chain.x402.enabled).map((chain) => {
783
+ const atomicAmount = Math.floor(
784
+ parseFloat(amount) * Math.pow(10, chain.usdc.decimals)
785
+ ).toString();
786
+ return {
787
+ network: chainToCAIP2(chain.name),
788
+ asset: chain.usdc.address,
789
+ amount: atomicAmount,
790
+ facilitator: facilitator || chain.x402.facilitatorUrl
791
+ };
792
+ });
793
+ }
794
+ function isCAIP2Format(network) {
795
+ return network.includes(":");
796
+ }
797
+ function convertX402Header(header, targetVersion) {
798
+ if (header.x402Version === targetVersion) {
799
+ return header;
800
+ }
801
+ if (targetVersion === 2) {
802
+ return {
803
+ x402Version: 2,
804
+ scheme: "exact",
805
+ network: chainToCAIP2(header.network),
806
+ payload: header.payload
807
+ };
808
+ } else {
809
+ const chainName = isCAIP2Format(header.network) ? caip2ToChain(header.network) || header.network : header.network;
810
+ return {
811
+ x402Version: 1,
812
+ scheme: "exact",
813
+ network: chainName,
814
+ payload: header.payload
815
+ };
816
+ }
817
+ }
818
+
819
+ // src/utils/validation.ts
820
+ var ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
821
+ var SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
822
+ var STELLAR_ADDRESS_REGEX = /^G[A-Z2-7]{55}$/;
823
+ var NEAR_ADDRESS_REGEX = /^[a-z0-9._-]+$/;
824
+ function validateRecipient(recipient, networkType) {
825
+ if (!recipient) {
826
+ throw new X402Error(
827
+ "Recipient address is required. The payTo/recipient field cannot be empty. Please provide a valid recipient address where payments should be sent.",
828
+ "INVALID_RECIPIENT"
829
+ );
830
+ }
831
+ const trimmed = recipient.trim();
832
+ if (trimmed === "") {
833
+ throw new X402Error(
834
+ "Recipient address cannot be empty or whitespace. Please provide a valid recipient address.",
835
+ "INVALID_RECIPIENT"
836
+ );
837
+ }
838
+ if (networkType) {
839
+ switch (networkType) {
840
+ case "evm":
841
+ if (!ETH_ADDRESS_REGEX.test(trimmed)) {
842
+ throw new X402Error(
843
+ `Invalid EVM recipient address: "${trimmed}". Expected a 40-character hexadecimal address starting with 0x.`,
844
+ "INVALID_RECIPIENT"
845
+ );
846
+ }
847
+ break;
848
+ case "svm":
849
+ case "solana":
850
+ if (!SOLANA_ADDRESS_REGEX.test(trimmed)) {
851
+ throw new X402Error(
852
+ `Invalid Solana recipient address: "${trimmed}". Expected a base58-encoded public key (32-44 characters).`,
853
+ "INVALID_RECIPIENT"
854
+ );
855
+ }
856
+ break;
857
+ case "stellar":
858
+ if (!STELLAR_ADDRESS_REGEX.test(trimmed)) {
859
+ throw new X402Error(
860
+ `Invalid Stellar recipient address: "${trimmed}". Expected a G-prefixed public key (56 characters).`,
861
+ "INVALID_RECIPIENT"
862
+ );
863
+ }
864
+ break;
865
+ case "near":
866
+ if (!NEAR_ADDRESS_REGEX.test(trimmed) || trimmed.length > 64) {
867
+ throw new X402Error(
868
+ `Invalid NEAR recipient address: "${trimmed}". Expected a valid NEAR account ID.`,
869
+ "INVALID_RECIPIENT"
870
+ );
871
+ }
872
+ break;
873
+ }
874
+ }
875
+ }
876
+ function validateAmount(amount) {
877
+ if (!amount) {
878
+ throw new X402Error(
879
+ "Payment amount is required.",
880
+ "INVALID_AMOUNT"
881
+ );
882
+ }
883
+ const trimmed = amount.trim();
884
+ if (trimmed === "") {
885
+ throw new X402Error(
886
+ "Payment amount cannot be empty.",
887
+ "INVALID_AMOUNT"
888
+ );
889
+ }
890
+ const num = parseFloat(trimmed);
891
+ if (isNaN(num)) {
892
+ throw new X402Error(
893
+ `Invalid payment amount: "${trimmed}". Expected a valid number.`,
894
+ "INVALID_AMOUNT"
895
+ );
896
+ }
897
+ if (num <= 0) {
898
+ throw new X402Error(
899
+ `Payment amount must be positive. Got: ${trimmed}`,
900
+ "INVALID_AMOUNT"
901
+ );
902
+ }
903
+ }
904
+
666
905
  // src/client/X402Client.ts
667
906
  var X402Client = class {
668
907
  // Configuration
@@ -1013,6 +1252,7 @@ var X402Client = class {
1013
1252
  throw new X402Error("Wallet not connected", "WALLET_NOT_CONNECTED");
1014
1253
  }
1015
1254
  const recipient = this.getRecipientForNetwork(paymentInfo, "evm");
1255
+ validateRecipient(recipient, "evm");
1016
1256
  const nonceBytes = new Uint8Array(32);
1017
1257
  if (typeof window !== "undefined" && window.crypto) {
1018
1258
  window.crypto.getRandomValues(nonceBytes);
@@ -1155,140 +1395,6 @@ var X402Client = class {
1155
1395
  }
1156
1396
  };
1157
1397
 
1158
- // src/utils/x402.ts
1159
- function detectX402Version(data) {
1160
- if (typeof data !== "object" || data === null) {
1161
- return 1;
1162
- }
1163
- const obj = data;
1164
- if (obj.x402Version === 2) {
1165
- return 2;
1166
- }
1167
- if (obj.accepts && Array.isArray(obj.accepts)) {
1168
- return 2;
1169
- }
1170
- if (typeof obj.network === "string") {
1171
- if (obj.network.includes(":")) {
1172
- return 2;
1173
- }
1174
- }
1175
- return 1;
1176
- }
1177
- function chainToCAIP2(chainName) {
1178
- const caip2 = CAIP2_IDENTIFIERS[chainName.toLowerCase()];
1179
- if (caip2) {
1180
- return caip2;
1181
- }
1182
- const chain = getChainByName(chainName);
1183
- if (chain) {
1184
- if (chain.networkType === "evm") {
1185
- return `eip155:${chain.chainId}`;
1186
- }
1187
- return `${chain.networkType}:${chainName}`;
1188
- }
1189
- return chainName;
1190
- }
1191
- function caip2ToChain(caip2) {
1192
- if (CAIP2_TO_CHAIN[caip2]) {
1193
- return CAIP2_TO_CHAIN[caip2];
1194
- }
1195
- const match = caip2.match(/^eip155:(\d+)$/);
1196
- if (match) {
1197
- const chainId = parseInt(match[1], 10);
1198
- for (const [name, _config] of Object.entries(CAIP2_IDENTIFIERS)) {
1199
- const chain = getChainByName(name);
1200
- if (chain?.chainId === chainId) {
1201
- return name;
1202
- }
1203
- }
1204
- }
1205
- const parts = caip2.split(":");
1206
- if (parts.length === 2) {
1207
- const networkName = parts[1];
1208
- if (getChainByName(networkName)) {
1209
- return networkName;
1210
- }
1211
- }
1212
- return null;
1213
- }
1214
- function parseNetworkIdentifier(network) {
1215
- if (network.includes(":")) {
1216
- return caip2ToChain(network) || network;
1217
- }
1218
- return network.toLowerCase();
1219
- }
1220
- function encodeX402Header(header) {
1221
- return btoa(JSON.stringify(header));
1222
- }
1223
- function decodeX402Header(encoded) {
1224
- const json = atob(encoded);
1225
- return JSON.parse(json);
1226
- }
1227
- function createX402V1Header(network, payload) {
1228
- return {
1229
- x402Version: 1,
1230
- scheme: "exact",
1231
- network,
1232
- payload
1233
- };
1234
- }
1235
- function createX402V2Header(network, payload, accepts) {
1236
- const header = {
1237
- x402Version: 2,
1238
- scheme: "exact",
1239
- network: network.includes(":") ? network : chainToCAIP2(network),
1240
- payload
1241
- };
1242
- if (accepts && accepts.length > 0) {
1243
- header.accepts = accepts;
1244
- }
1245
- return header;
1246
- }
1247
- function createX402Header(chainConfig, payload, version = "auto") {
1248
- const effectiveVersion = version === "auto" ? 1 : version;
1249
- if (effectiveVersion === 2) {
1250
- return createX402V2Header(chainConfig.name, payload);
1251
- }
1252
- return createX402V1Header(chainConfig.name, payload);
1253
- }
1254
- function generatePaymentOptions(chainConfigs, amount, facilitator) {
1255
- return chainConfigs.filter((chain) => chain.x402.enabled).map((chain) => {
1256
- const atomicAmount = Math.floor(
1257
- parseFloat(amount) * Math.pow(10, chain.usdc.decimals)
1258
- ).toString();
1259
- return {
1260
- network: chainToCAIP2(chain.name),
1261
- asset: chain.usdc.address,
1262
- amount: atomicAmount,
1263
- facilitator: facilitator || chain.x402.facilitatorUrl
1264
- };
1265
- });
1266
- }
1267
- function isCAIP2Format(network) {
1268
- return network.includes(":");
1269
- }
1270
- function convertX402Header(header, targetVersion) {
1271
- if (header.x402Version === targetVersion) {
1272
- return header;
1273
- }
1274
- if (targetVersion === 2) {
1275
- return {
1276
- x402Version: 2,
1277
- scheme: "exact",
1278
- network: chainToCAIP2(header.network),
1279
- payload: header.payload
1280
- };
1281
- } else {
1282
- const chainName = isCAIP2Format(header.network) ? caip2ToChain(header.network) || header.network : header.network;
1283
- return {
1284
- x402Version: 1,
1285
- scheme: "exact",
1286
- network: chainName,
1287
- payload: header.payload
1288
- };
1289
- }
1290
- }
1291
-
1292
- export { CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN, DEFAULT_CHAIN, DEFAULT_CONFIG, DEFAULT_FACILITATOR_URL, SUPPORTED_CHAINS, X402Client, X402Error, caip2ToChain, chainToCAIP2, convertX402Header, createX402Header, createX402V1Header, createX402V2Header, decodeX402Header, detectX402Version, encodeX402Header, generatePaymentOptions, getChainById, getChainByName, getChainsByNetworkType, getChainsByToken, getEVMChainIds, getEnabledChains, getExplorerAddressUrl, getExplorerTxUrl, getNetworkType, getSVMChains, getSupportedTokens, getTokenConfig, isCAIP2Format, isChainSupported, isSVMChain, isTokenSupported, parseNetworkIdentifier };
1398
+ export { CAIP2_IDENTIFIERS, CAIP2_TO_CHAIN, DEFAULT_CHAIN, DEFAULT_CONFIG, DEFAULT_FACILITATOR_URL, SUPPORTED_CHAINS, X402Client, X402Error, caip2ToChain, chainToCAIP2, convertX402Header, createX402Header, createX402V1Header, createX402V2Header, decodeX402Header, detectX402Version, encodeX402Header, generatePaymentOptions, getChainById, getChainByName, getChainsByNetworkType, getChainsByToken, getEVMChainIds, getEnabledChains, getExplorerAddressUrl, getExplorerTxUrl, getNetworkType, getSVMChains, getSupportedTokens, getTokenConfig, isCAIP2Format, isChainSupported, isSVMChain, isTokenSupported, parseNetworkIdentifier, validateAmount, validateRecipient };
1293
1399
  //# sourceMappingURL=index.mjs.map
1294
1400
  //# sourceMappingURL=index.mjs.map