uvd-x402-sdk 2.38.0 → 2.41.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 (86) hide show
  1. package/README.md +51 -4
  2. package/dist/adapters/index.d.mts +1 -1
  3. package/dist/adapters/index.d.ts +1 -1
  4. package/dist/adapters/index.js +152 -2
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/adapters/index.mjs +152 -2
  7. package/dist/adapters/index.mjs.map +1 -1
  8. package/dist/backend/index.d.mts +3 -3
  9. package/dist/backend/index.d.ts +3 -3
  10. package/dist/backend/index.js +143 -2
  11. package/dist/backend/index.js.map +1 -1
  12. package/dist/backend/index.mjs +143 -2
  13. package/dist/backend/index.mjs.map +1 -1
  14. package/dist/{index-SL4OVkNU.d.mts → index-BJrBRC2u.d.mts} +13 -4
  15. package/dist/{index-DsuzwOwF.d.mts → index-DBCFd6mO.d.mts} +40 -5
  16. package/dist/{index-DsuzwOwF.d.ts → index-DBCFd6mO.d.ts} +40 -5
  17. package/dist/{index-CfTMJWAg.d.ts → index-m2PwYmcQ.d.ts} +13 -4
  18. package/dist/index.d.mts +11 -2
  19. package/dist/index.d.ts +11 -2
  20. package/dist/index.js +194 -4
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +193 -5
  23. package/dist/index.mjs.map +1 -1
  24. package/dist/providers/algorand/index.d.mts +1 -1
  25. package/dist/providers/algorand/index.d.ts +1 -1
  26. package/dist/providers/algorand/index.js +156 -3
  27. package/dist/providers/algorand/index.js.map +1 -1
  28. package/dist/providers/algorand/index.mjs +156 -3
  29. package/dist/providers/algorand/index.mjs.map +1 -1
  30. package/dist/providers/evm/index.d.mts +1 -1
  31. package/dist/providers/evm/index.d.ts +1 -1
  32. package/dist/providers/evm/index.js +152 -2
  33. package/dist/providers/evm/index.js.map +1 -1
  34. package/dist/providers/evm/index.mjs +152 -2
  35. package/dist/providers/evm/index.mjs.map +1 -1
  36. package/dist/providers/near/index.d.mts +1 -1
  37. package/dist/providers/near/index.d.ts +1 -1
  38. package/dist/providers/near/index.js +143 -2
  39. package/dist/providers/near/index.js.map +1 -1
  40. package/dist/providers/near/index.mjs +143 -2
  41. package/dist/providers/near/index.mjs.map +1 -1
  42. package/dist/providers/solana/index.d.mts +1 -1
  43. package/dist/providers/solana/index.d.ts +1 -1
  44. package/dist/providers/solana/index.js +143 -2
  45. package/dist/providers/solana/index.js.map +1 -1
  46. package/dist/providers/solana/index.mjs +143 -2
  47. package/dist/providers/solana/index.mjs.map +1 -1
  48. package/dist/providers/stellar/index.d.mts +1 -1
  49. package/dist/providers/stellar/index.d.ts +1 -1
  50. package/dist/providers/stellar/index.js +143 -2
  51. package/dist/providers/stellar/index.js.map +1 -1
  52. package/dist/providers/stellar/index.mjs +143 -2
  53. package/dist/providers/stellar/index.mjs.map +1 -1
  54. package/dist/providers/sui/index.d.mts +1 -1
  55. package/dist/providers/sui/index.d.ts +1 -1
  56. package/dist/providers/sui/index.js +143 -2
  57. package/dist/providers/sui/index.js.map +1 -1
  58. package/dist/providers/sui/index.mjs +143 -2
  59. package/dist/providers/sui/index.mjs.map +1 -1
  60. package/dist/providers/xrpl/index.d.mts +114 -0
  61. package/dist/providers/xrpl/index.d.ts +114 -0
  62. package/dist/providers/xrpl/index.js +1229 -0
  63. package/dist/providers/xrpl/index.js.map +1 -0
  64. package/dist/providers/xrpl/index.mjs +1224 -0
  65. package/dist/providers/xrpl/index.mjs.map +1 -0
  66. package/dist/react/index.d.mts +3 -3
  67. package/dist/react/index.d.ts +3 -3
  68. package/dist/react/index.js +161 -3
  69. package/dist/react/index.js.map +1 -1
  70. package/dist/react/index.mjs +161 -3
  71. package/dist/react/index.mjs.map +1 -1
  72. package/dist/utils/index.d.mts +2 -2
  73. package/dist/utils/index.d.ts +2 -2
  74. package/dist/utils/index.js +152 -2
  75. package/dist/utils/index.js.map +1 -1
  76. package/dist/utils/index.mjs +152 -2
  77. package/dist/utils/index.mjs.map +1 -1
  78. package/package.json +35 -4
  79. package/src/backend/index.ts +5224 -5220
  80. package/src/chains/index.ts +1219 -1065
  81. package/src/client/X402Client.ts +9 -1
  82. package/src/facilitator.ts +18 -0
  83. package/src/index.ts +274 -256
  84. package/src/providers/xrpl/index.ts +380 -0
  85. package/src/types/index.ts +48 -4
  86. package/src/utils/validation.ts +16 -1
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # uvd-x402-sdk
2
2
 
3
- Gasless crypto payments across 21 blockchain networks using the x402 protocol.
3
+ Gasless crypto payments across 25 blockchain networks using the x402 protocol.
4
4
 
5
5
  Users sign a message or transaction, and the Ultravioleta facilitator handles on-chain settlement. No gas fees for users.
6
6
 
7
7
  ## Features
8
8
 
9
- - **21 Networks**: EVM (13 including Scroll, SKALE Base), Solana, Fogo, Stellar, NEAR, Algorand, Sui
10
- - **Multi-Stablecoin**: USDC, EURC, AUSD, PYUSD, USDT
9
+ - **25 Networks**: EVM (15 including Scroll, SKALE Base, Robinhood Chain), Solana, Fogo, Stellar, NEAR, Algorand, Sui, XRP Ledger (mainnet + testnet)
10
+ - **Multi-Stablecoin**: USDC, EURC, AUSD, PYUSD, USDT, USDG (Robinhood Chain)
11
11
  - **x402 v1 & v2**: Both protocol versions with auto-detection
12
12
  - **Gasless**: Facilitator pays all network fees
13
13
  - **Type-Safe**: Full TypeScript support
@@ -47,6 +47,9 @@ npm install algosdk lute-connect
47
47
 
48
48
  # Sui
49
49
  npm install @mysten/sui
50
+
51
+ # XRPL (XRP Ledger)
52
+ npm install xrpl
50
53
  ```
51
54
 
52
55
  ## Quick Start
@@ -210,6 +213,35 @@ Sui uses sponsored transactions:
210
213
  - Facilitator sponsors gas (pays in SUI)
211
214
  - User pays zero gas fees
212
215
 
216
+ ### XRPL (XRP Ledger)
217
+
218
+ ```typescript
219
+ import { XRPLProvider } from 'uvd-x402-sdk/xrpl';
220
+ import { getChainByName } from 'uvd-x402-sdk';
221
+
222
+ // Seed-based signer (Node.js / server-side)
223
+ const xrpl = new XRPLProvider({ seed: process.env.XRPL_SEED });
224
+ const address = await xrpl.connect(); // classic r-address
225
+ const chainConfig = getChainByName('xrpl-mainnet')!;
226
+
227
+ // Build + FULLY sign the Payment off-chain. Returns JSON: { signedTxBlob }
228
+ const payload = await xrpl.signPayment({
229
+ recipient: 'rfADKkVXBNqK3z72tVSS3LVzAR3psYkonp', // classic r-address
230
+ amount: '10.00',
231
+ }, chainConfig);
232
+
233
+ const header = xrpl.encodePaymentHeader(payload);
234
+ ```
235
+
236
+ XRPL uses the **t54 "pre-signed Payment blob"** scheme:
237
+ - The client builds and FULLY signs a native XRP `Payment` off-chain (paying its own XRP fee)
238
+ - Only one field is sent to the facilitator: `{ "signedTxBlob": "<hex tx blob>" }`
239
+ - The facilitator decodes the blob to re-derive payer/amount/destination and submits it
240
+ - The Payment sets `LastLedgerSequence`, must NOT set `tfPartialPayment`, and must NOT use `SendMax`
241
+ - All payment-level fields (destination, amount, InvoiceID, SourceTag, Memo) come from the requirements
242
+
243
+ > Requires the optional peer dependency `xrpl` (`npm install xrpl`).
244
+
213
245
  ### Stellar
214
246
 
215
247
  ```typescript
@@ -592,7 +624,7 @@ const header = svm.encodePaymentHeader(payload, chainConfig);
592
624
 
593
625
  ## Supported Networks
594
626
 
595
- ### EVM (13)
627
+ ### EVM (15)
596
628
 
597
629
  | Network | Chain ID | Tokens |
598
630
  |---------|----------|--------|
@@ -609,6 +641,10 @@ const header = svm.encodePaymentHeader(payload, chainConfig);
609
641
  | Scroll | 534352 | USDC |
610
642
  | SKALE Base | 1187947933 | USDC.e |
611
643
  | SKALE Base Sepolia | 324705682 | USDC.e |
644
+ | Robinhood Chain | 4663 | USDG |
645
+ | Robinhood Chain Testnet | 46630 | USDG |
646
+
647
+ > **Robinhood Chain / USDG:** Robinhood Chain has no USDC — the settlement stablecoin is Paxos **USDG** (Global Dollar, 6 decimals, EIP-3009). Its on-chain `version()` getter reverts, so the EIP-712 domain `{ name: "Global Dollar", version: "1" }` can never be resolved on-chain. The SDK carries this domain in the chain config; when constructing `PaymentRequirements` yourself, send it in `extra`: `{ "name": "Global Dollar", "version": "1" }`. Use `tokenType: 'usdg'` (or the default, which resolves to USDG on these networks).
612
648
 
613
649
  ### SVM (2)
614
650
 
@@ -629,6 +665,15 @@ const header = svm.encodePaymentHeader(payload, chainConfig);
629
665
  |---------|--------|--------|
630
666
  | Sui | USDC, AUSD | Sui Wallet |
631
667
 
668
+ ### XRPL
669
+
670
+ XRP Ledger settles in **native XRP** (6 decimals / drops) using the **t54 pre-signed Payment blob** scheme. The client builds and fully signs the Payment off-chain and sends `{ signedTxBlob }` to the facilitator. There is no stablecoin/token contract on XRPL. Use network ids `xrpl-mainnet` and `xrpl-testnet`. See [XRPL (XRP Ledger)](#xrpl-xrp-ledger) above for the `uvd-x402-sdk/xrpl` provider usage.
671
+
672
+ | Network | Asset | Network ID | Provider |
673
+ |---------|-------|------------|----------|
674
+ | XRP Ledger | XRP (native) | xrpl-mainnet | `uvd-x402-sdk/xrpl` |
675
+ | XRP Ledger Testnet | XRP (native) | xrpl-testnet | `uvd-x402-sdk/xrpl` |
676
+
632
677
  ### Other
633
678
 
634
679
  | Network | Wallet |
@@ -650,11 +695,13 @@ FACILITATOR_ADDRESSES.algorand; // KIMS5H6QLCUDL65L5UBTOXDPWLMTS7N3AAC3I6B2NCONE
650
695
  FACILITATOR_ADDRESSES.stellar; // GCHPGXJT2WFFRFCA5TV4G4E3PMMXLNIDUH27PKDYA4QJ2XGYZWGFZNHB
651
696
  FACILITATOR_ADDRESSES.near; // uvd-facilitator.near
652
697
  FACILITATOR_ADDRESSES.sui; // 0xe7bbf2b13f7d72714760aa16e024fa1b35a978793f9893d0568a4fbf356a764a
698
+ FACILITATOR_ADDRESSES['xrpl-mainnet']; // rfADKkVXBNqK3z72tVSS3LVzAR3psYkonp
653
699
 
654
700
  // Or get by chain name
655
701
  getFacilitatorAddress('algorand'); // KIMS5H6...
656
702
  getFacilitatorAddress('base', 'evm'); // 0x1030...
657
703
  getFacilitatorAddress('sui'); // 0xe7bbf...
704
+ getFacilitatorAddress('xrpl-mainnet'); // rfADKk...
658
705
  ```
659
706
 
660
707
  ## Backend
@@ -1,4 +1,4 @@
1
- import { O as X402Version, k as PaymentResult } from '../index-DsuzwOwF.mjs';
1
+ import { O as X402Version, k as PaymentResult } from '../index-DBCFd6mO.mjs';
2
2
  export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-CYIVd4xO.mjs';
3
3
  import '../wallet-0cX9Pw2F.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { O as X402Version, k as PaymentResult } from '../index-DsuzwOwF.js';
1
+ import { O as X402Version, k as PaymentResult } from '../index-DBCFd6mO.js';
2
2
  export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-DTDixPzO.js';
3
3
  import '../wallet-0cX9Pw2F.js';
4
4
 
@@ -6,7 +6,7 @@ var ethers = require('ethers');
6
6
  var DEFAULT_FACILITATOR_URL = "https://facilitator.ultravioletadao.xyz";
7
7
  var SUPPORTED_CHAINS = {
8
8
  // ============================================================================
9
- // EVM CHAINS (10 networks)
9
+ // EVM CHAINS (15 networks)
10
10
  // ============================================================================
11
11
  base: {
12
12
  chainId: 8453,
@@ -516,6 +516,83 @@ var SUPPORTED_CHAINS = {
516
516
  enabled: true
517
517
  }
518
518
  },
519
+ // Robinhood Chain (Arbitrum Orbit L2). NOTE: there is NO USDC on this chain -
520
+ // the settlement stablecoin is Paxos USDG (Global Dollar). The `usdc` field
521
+ // below carries USDG for interface compatibility (same pattern as XRPL's native
522
+ // asset), and `tokens.usdg` is the canonical entry.
523
+ // CRITICAL: USDG's on-chain version() getter REVERTS, so the EIP-712 domain
524
+ // { name: 'Global Dollar', version: '1' } can NEVER be resolved on-chain and
525
+ // MUST come from this config (mirrored into PaymentRequirements.extra by callers).
526
+ robinhood: {
527
+ chainId: 4663,
528
+ chainIdHex: "0x1237",
529
+ name: "robinhood",
530
+ displayName: "Robinhood Chain",
531
+ networkType: "evm",
532
+ rpcUrl: "https://rpc.mainnet.chain.robinhood.com",
533
+ explorerUrl: "https://robinhoodchain.blockscout.com",
534
+ nativeCurrency: {
535
+ name: "Ethereum",
536
+ symbol: "ETH",
537
+ decimals: 18
538
+ },
539
+ usdc: {
540
+ address: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
541
+ // Paxos USDG (no USDC on this chain)
542
+ decimals: 6,
543
+ name: "Global Dollar",
544
+ // on-chain version() reverts; domain must be supplied off-chain
545
+ version: "1"
546
+ },
547
+ tokens: {
548
+ usdg: {
549
+ address: "0x5fc5360D0400a0Fd4f2af552ADD042D716F1d168",
550
+ decimals: 6,
551
+ name: "Global Dollar",
552
+ // on-chain version() reverts; domain must be supplied off-chain
553
+ version: "1"
554
+ }
555
+ },
556
+ x402: {
557
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
558
+ enabled: true
559
+ }
560
+ },
561
+ "robinhood-testnet": {
562
+ chainId: 46630,
563
+ chainIdHex: "0xb626",
564
+ name: "robinhood-testnet",
565
+ displayName: "Robinhood Chain Testnet",
566
+ networkType: "evm",
567
+ rpcUrl: "https://rpc.testnet.chain.robinhood.com",
568
+ explorerUrl: "https://explorer.testnet.chain.robinhood.com",
569
+ nativeCurrency: {
570
+ name: "Ethereum",
571
+ symbol: "ETH",
572
+ decimals: 18
573
+ },
574
+ usdc: {
575
+ address: "0x7E955252E15c84f5768B83c41a71F9eba181802F",
576
+ // Paxos USDG testnet (no USDC on this chain)
577
+ decimals: 6,
578
+ name: "Global Dollar",
579
+ // on-chain version() reverts; domain must be supplied off-chain
580
+ version: "1"
581
+ },
582
+ tokens: {
583
+ usdg: {
584
+ address: "0x7E955252E15c84f5768B83c41a71F9eba181802F",
585
+ decimals: 6,
586
+ name: "Global Dollar",
587
+ // on-chain version() reverts; domain must be supplied off-chain
588
+ version: "1"
589
+ }
590
+ },
591
+ x402: {
592
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
593
+ enabled: true
594
+ }
595
+ },
519
596
  // ============================================================================
520
597
  // SVM CHAINS (2 networks) - Solana Virtual Machine
521
598
  // ============================================================================
@@ -800,6 +877,65 @@ var SUPPORTED_CHAINS = {
800
877
  facilitatorUrl: DEFAULT_FACILITATOR_URL,
801
878
  enabled: true
802
879
  }
880
+ },
881
+ // ============================================================================
882
+ // XRPL (2 networks) - XRP Ledger, native XRP via pre-signed Payment blobs
883
+ // ============================================================================
884
+ "xrpl-mainnet": {
885
+ chainId: 0,
886
+ // Non-EVM (XRPL uses network id strings, no numeric chain ID)
887
+ chainIdHex: "0x0",
888
+ name: "xrpl-mainnet",
889
+ displayName: "XRP Ledger",
890
+ networkType: "xrpl",
891
+ rpcUrl: "https://xrplcluster.com",
892
+ explorerUrl: "https://livenet.xrpl.org",
893
+ nativeCurrency: {
894
+ name: "XRP",
895
+ symbol: "XRP",
896
+ decimals: 6
897
+ // XRPL uses 6 decimals (drops); 1 XRP = 1,000,000 drops
898
+ },
899
+ // XRPL settles in native XRP - there is no USDC/token contract.
900
+ // The `usdc` field describes the native asset for interface compatibility.
901
+ usdc: {
902
+ address: "XRP",
903
+ // Native asset - no token contract
904
+ decimals: 6,
905
+ name: "XRP",
906
+ version: "1"
907
+ },
908
+ x402: {
909
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
910
+ enabled: true
911
+ }
912
+ },
913
+ "xrpl-testnet": {
914
+ chainId: 0,
915
+ // Non-EVM
916
+ chainIdHex: "0x0",
917
+ name: "xrpl-testnet",
918
+ displayName: "XRP Ledger Testnet",
919
+ networkType: "xrpl",
920
+ rpcUrl: "https://s.altnet.rippletest.net:51234",
921
+ explorerUrl: "https://testnet.xrpl.org",
922
+ nativeCurrency: {
923
+ name: "XRP",
924
+ symbol: "XRP",
925
+ decimals: 6
926
+ },
927
+ // XRPL settles in native XRP - there is no USDC/token contract.
928
+ usdc: {
929
+ address: "XRP",
930
+ // Native asset - no token contract
931
+ decimals: 6,
932
+ name: "XRP",
933
+ version: "1"
934
+ },
935
+ x402: {
936
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
937
+ enabled: true
938
+ }
803
939
  }
804
940
  };
805
941
  function getChainByName(name) {
@@ -822,6 +958,8 @@ var CAIP2_IDENTIFIERS = {
822
958
  scroll: "eip155:534352",
823
959
  "skale-base": "eip155:1187947933",
824
960
  "skale-base-sepolia": "eip155:324705682",
961
+ robinhood: "eip155:4663",
962
+ "robinhood-testnet": "eip155:46630",
825
963
  // SVM chains
826
964
  solana: "solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp",
827
965
  fogo: "svm:fogo",
@@ -834,7 +972,10 @@ var CAIP2_IDENTIFIERS = {
834
972
  "algorand-testnet": "algorand:testnet",
835
973
  // Sui
836
974
  sui: "sui:mainnet",
837
- "sui-testnet": "sui:testnet"
975
+ "sui-testnet": "sui:testnet",
976
+ // XRPL (XRP Ledger has no CAIP-2 form - the v1 string IS the network id)
977
+ "xrpl-mainnet": "xrpl-mainnet",
978
+ "xrpl-testnet": "xrpl-testnet"
838
979
  };
839
980
  Object.fromEntries(
840
981
  Object.entries(CAIP2_IDENTIFIERS).map(([k, v]) => [v, k])
@@ -894,6 +1035,7 @@ var ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
894
1035
  var SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
895
1036
  var STELLAR_ADDRESS_REGEX = /^G[A-Z2-7]{55}$/;
896
1037
  var NEAR_ADDRESS_REGEX = /^[a-z0-9._-]+$/;
1038
+ var XRPL_ADDRESS_REGEX = /^r[1-9A-HJ-NP-Za-km-z]{24,34}$/;
897
1039
  function validateRecipient(recipient, networkType) {
898
1040
  if (!recipient) {
899
1041
  throw new X402Error(
@@ -943,6 +1085,14 @@ function validateRecipient(recipient, networkType) {
943
1085
  );
944
1086
  }
945
1087
  break;
1088
+ case "xrpl":
1089
+ if (!XRPL_ADDRESS_REGEX.test(trimmed)) {
1090
+ throw new X402Error(
1091
+ `Invalid XRPL recipient address: "${trimmed}". Expected a classic r-address (base58, Ripple alphabet).`,
1092
+ "INVALID_RECIPIENT"
1093
+ );
1094
+ }
1095
+ break;
946
1096
  }
947
1097
  }
948
1098
  }