uvd-x402-sdk 2.38.0 → 2.40.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 +45 -2
  2. package/dist/adapters/index.d.mts +1 -1
  3. package/dist/adapters/index.d.ts +1 -1
  4. package/dist/adapters/index.js +72 -1
  5. package/dist/adapters/index.js.map +1 -1
  6. package/dist/adapters/index.mjs +72 -1
  7. package/dist/adapters/index.mjs.map +1 -1
  8. package/dist/backend/index.d.mts +2 -2
  9. package/dist/backend/index.d.ts +2 -2
  10. package/dist/backend/index.js +63 -1
  11. package/dist/backend/index.js.map +1 -1
  12. package/dist/backend/index.mjs +63 -1
  13. package/dist/backend/index.mjs.map +1 -1
  14. package/dist/{index-SL4OVkNU.d.mts → index-Cz0xHYGy.d.mts} +12 -3
  15. package/dist/{index-CfTMJWAg.d.ts → index-DMPuzJv-.d.ts} +12 -3
  16. package/dist/{index-DsuzwOwF.d.mts → index-DNcDDyee.d.mts} +38 -4
  17. package/dist/{index-DsuzwOwF.d.ts → index-DNcDDyee.d.ts} +38 -4
  18. package/dist/index.d.mts +11 -2
  19. package/dist/index.d.ts +11 -2
  20. package/dist/index.js +114 -3
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.mjs +113 -4
  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 +76 -2
  27. package/dist/providers/algorand/index.js.map +1 -1
  28. package/dist/providers/algorand/index.mjs +76 -2
  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 +72 -1
  33. package/dist/providers/evm/index.js.map +1 -1
  34. package/dist/providers/evm/index.mjs +72 -1
  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 +63 -1
  39. package/dist/providers/near/index.js.map +1 -1
  40. package/dist/providers/near/index.mjs +63 -1
  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 +63 -1
  45. package/dist/providers/solana/index.js.map +1 -1
  46. package/dist/providers/solana/index.mjs +63 -1
  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 +63 -1
  51. package/dist/providers/stellar/index.js.map +1 -1
  52. package/dist/providers/stellar/index.mjs +63 -1
  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 +63 -1
  57. package/dist/providers/sui/index.js.map +1 -1
  58. package/dist/providers/sui/index.mjs +63 -1
  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 +1150 -0
  63. package/dist/providers/xrpl/index.js.map +1 -0
  64. package/dist/providers/xrpl/index.mjs +1145 -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 +81 -2
  69. package/dist/react/index.js.map +1 -1
  70. package/dist/react/index.mjs +81 -2
  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 +72 -1
  75. package/dist/utils/index.js.map +1 -1
  76. package/dist/utils/index.mjs +72 -1
  77. package/dist/utils/index.mjs.map +1 -1
  78. package/package.json +32 -4
  79. package/src/backend/index.ts +5222 -5220
  80. package/src/chains/index.ts +1146 -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 +44 -3
  86. package/src/utils/validation.ts +16 -1
package/README.md CHANGED
@@ -1,12 +1,12 @@
1
1
  # uvd-x402-sdk
2
2
 
3
- Gasless crypto payments across 21 blockchain networks using the x402 protocol.
3
+ Gasless crypto payments across 23 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
9
+ - **23 Networks**: EVM (13 including Scroll, SKALE Base), Solana, Fogo, Stellar, NEAR, Algorand, Sui, XRP Ledger (mainnet + testnet)
10
10
  - **Multi-Stablecoin**: USDC, EURC, AUSD, PYUSD, USDT
11
11
  - **x402 v1 & v2**: Both protocol versions with auto-detection
12
12
  - **Gasless**: Facilitator pays all network fees
@@ -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
@@ -629,6 +661,15 @@ const header = svm.encodePaymentHeader(payload, chainConfig);
629
661
  |---------|--------|--------|
630
662
  | Sui | USDC, AUSD | Sui Wallet |
631
663
 
664
+ ### XRPL
665
+
666
+ 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.
667
+
668
+ | Network | Asset | Network ID | Provider |
669
+ |---------|-------|------------|----------|
670
+ | XRP Ledger | XRP (native) | xrpl-mainnet | `uvd-x402-sdk/xrpl` |
671
+ | XRP Ledger Testnet | XRP (native) | xrpl-testnet | `uvd-x402-sdk/xrpl` |
672
+
632
673
  ### Other
633
674
 
634
675
  | Network | Wallet |
@@ -650,11 +691,13 @@ FACILITATOR_ADDRESSES.algorand; // KIMS5H6QLCUDL65L5UBTOXDPWLMTS7N3AAC3I6B2NCONE
650
691
  FACILITATOR_ADDRESSES.stellar; // GCHPGXJT2WFFRFCA5TV4G4E3PMMXLNIDUH27PKDYA4QJ2XGYZWGFZNHB
651
692
  FACILITATOR_ADDRESSES.near; // uvd-facilitator.near
652
693
  FACILITATOR_ADDRESSES.sui; // 0xe7bbf2b13f7d72714760aa16e024fa1b35a978793f9893d0568a4fbf356a764a
694
+ FACILITATOR_ADDRESSES['xrpl-mainnet']; // rfADKkVXBNqK3z72tVSS3LVzAR3psYkonp
653
695
 
654
696
  // Or get by chain name
655
697
  getFacilitatorAddress('algorand'); // KIMS5H6...
656
698
  getFacilitatorAddress('base', 'evm'); // 0x1030...
657
699
  getFacilitatorAddress('sui'); // 0xe7bbf...
700
+ getFacilitatorAddress('xrpl-mainnet'); // rfADKk...
658
701
  ```
659
702
 
660
703
  ## 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-DNcDDyee.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-DNcDDyee.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
 
@@ -800,6 +800,65 @@ var SUPPORTED_CHAINS = {
800
800
  facilitatorUrl: DEFAULT_FACILITATOR_URL,
801
801
  enabled: true
802
802
  }
803
+ },
804
+ // ============================================================================
805
+ // XRPL (2 networks) - XRP Ledger, native XRP via pre-signed Payment blobs
806
+ // ============================================================================
807
+ "xrpl-mainnet": {
808
+ chainId: 0,
809
+ // Non-EVM (XRPL uses network id strings, no numeric chain ID)
810
+ chainIdHex: "0x0",
811
+ name: "xrpl-mainnet",
812
+ displayName: "XRP Ledger",
813
+ networkType: "xrpl",
814
+ rpcUrl: "https://xrplcluster.com",
815
+ explorerUrl: "https://livenet.xrpl.org",
816
+ nativeCurrency: {
817
+ name: "XRP",
818
+ symbol: "XRP",
819
+ decimals: 6
820
+ // XRPL uses 6 decimals (drops); 1 XRP = 1,000,000 drops
821
+ },
822
+ // XRPL settles in native XRP - there is no USDC/token contract.
823
+ // The `usdc` field describes the native asset for interface compatibility.
824
+ usdc: {
825
+ address: "XRP",
826
+ // Native asset - no token contract
827
+ decimals: 6,
828
+ name: "XRP",
829
+ version: "1"
830
+ },
831
+ x402: {
832
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
833
+ enabled: true
834
+ }
835
+ },
836
+ "xrpl-testnet": {
837
+ chainId: 0,
838
+ // Non-EVM
839
+ chainIdHex: "0x0",
840
+ name: "xrpl-testnet",
841
+ displayName: "XRP Ledger Testnet",
842
+ networkType: "xrpl",
843
+ rpcUrl: "https://s.altnet.rippletest.net:51234",
844
+ explorerUrl: "https://testnet.xrpl.org",
845
+ nativeCurrency: {
846
+ name: "XRP",
847
+ symbol: "XRP",
848
+ decimals: 6
849
+ },
850
+ // XRPL settles in native XRP - there is no USDC/token contract.
851
+ usdc: {
852
+ address: "XRP",
853
+ // Native asset - no token contract
854
+ decimals: 6,
855
+ name: "XRP",
856
+ version: "1"
857
+ },
858
+ x402: {
859
+ facilitatorUrl: DEFAULT_FACILITATOR_URL,
860
+ enabled: true
861
+ }
803
862
  }
804
863
  };
805
864
  function getChainByName(name) {
@@ -834,7 +893,10 @@ var CAIP2_IDENTIFIERS = {
834
893
  "algorand-testnet": "algorand:testnet",
835
894
  // Sui
836
895
  sui: "sui:mainnet",
837
- "sui-testnet": "sui:testnet"
896
+ "sui-testnet": "sui:testnet",
897
+ // XRPL (XRP Ledger has no CAIP-2 form - the v1 string IS the network id)
898
+ "xrpl-mainnet": "xrpl-mainnet",
899
+ "xrpl-testnet": "xrpl-testnet"
838
900
  };
839
901
  Object.fromEntries(
840
902
  Object.entries(CAIP2_IDENTIFIERS).map(([k, v]) => [v, k])
@@ -894,6 +956,7 @@ var ETH_ADDRESS_REGEX = /^0x[a-fA-F0-9]{40}$/;
894
956
  var SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
895
957
  var STELLAR_ADDRESS_REGEX = /^G[A-Z2-7]{55}$/;
896
958
  var NEAR_ADDRESS_REGEX = /^[a-z0-9._-]+$/;
959
+ var XRPL_ADDRESS_REGEX = /^r[1-9A-HJ-NP-Za-km-z]{24,34}$/;
897
960
  function validateRecipient(recipient, networkType) {
898
961
  if (!recipient) {
899
962
  throw new X402Error(
@@ -943,6 +1006,14 @@ function validateRecipient(recipient, networkType) {
943
1006
  );
944
1007
  }
945
1008
  break;
1009
+ case "xrpl":
1010
+ if (!XRPL_ADDRESS_REGEX.test(trimmed)) {
1011
+ throw new X402Error(
1012
+ `Invalid XRPL recipient address: "${trimmed}". Expected a classic r-address (base58, Ripple alphabet).`,
1013
+ "INVALID_RECIPIENT"
1014
+ );
1015
+ }
1016
+ break;
946
1017
  }
947
1018
  }
948
1019
  }