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.
- package/README.md +51 -4
- package/dist/adapters/index.d.mts +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +152 -2
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +152 -2
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/backend/index.d.mts +3 -3
- package/dist/backend/index.d.ts +3 -3
- package/dist/backend/index.js +143 -2
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/index.mjs +143 -2
- package/dist/backend/index.mjs.map +1 -1
- package/dist/{index-SL4OVkNU.d.mts → index-BJrBRC2u.d.mts} +13 -4
- package/dist/{index-DsuzwOwF.d.mts → index-DBCFd6mO.d.mts} +40 -5
- package/dist/{index-DsuzwOwF.d.ts → index-DBCFd6mO.d.ts} +40 -5
- package/dist/{index-CfTMJWAg.d.ts → index-m2PwYmcQ.d.ts} +13 -4
- package/dist/index.d.mts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +194 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +193 -5
- package/dist/index.mjs.map +1 -1
- package/dist/providers/algorand/index.d.mts +1 -1
- package/dist/providers/algorand/index.d.ts +1 -1
- package/dist/providers/algorand/index.js +156 -3
- package/dist/providers/algorand/index.js.map +1 -1
- package/dist/providers/algorand/index.mjs +156 -3
- package/dist/providers/algorand/index.mjs.map +1 -1
- package/dist/providers/evm/index.d.mts +1 -1
- package/dist/providers/evm/index.d.ts +1 -1
- package/dist/providers/evm/index.js +152 -2
- package/dist/providers/evm/index.js.map +1 -1
- package/dist/providers/evm/index.mjs +152 -2
- package/dist/providers/evm/index.mjs.map +1 -1
- package/dist/providers/near/index.d.mts +1 -1
- package/dist/providers/near/index.d.ts +1 -1
- package/dist/providers/near/index.js +143 -2
- package/dist/providers/near/index.js.map +1 -1
- package/dist/providers/near/index.mjs +143 -2
- package/dist/providers/near/index.mjs.map +1 -1
- package/dist/providers/solana/index.d.mts +1 -1
- package/dist/providers/solana/index.d.ts +1 -1
- package/dist/providers/solana/index.js +143 -2
- package/dist/providers/solana/index.js.map +1 -1
- package/dist/providers/solana/index.mjs +143 -2
- package/dist/providers/solana/index.mjs.map +1 -1
- package/dist/providers/stellar/index.d.mts +1 -1
- package/dist/providers/stellar/index.d.ts +1 -1
- package/dist/providers/stellar/index.js +143 -2
- package/dist/providers/stellar/index.js.map +1 -1
- package/dist/providers/stellar/index.mjs +143 -2
- package/dist/providers/stellar/index.mjs.map +1 -1
- package/dist/providers/sui/index.d.mts +1 -1
- package/dist/providers/sui/index.d.ts +1 -1
- package/dist/providers/sui/index.js +143 -2
- package/dist/providers/sui/index.js.map +1 -1
- package/dist/providers/sui/index.mjs +143 -2
- package/dist/providers/sui/index.mjs.map +1 -1
- package/dist/providers/xrpl/index.d.mts +114 -0
- package/dist/providers/xrpl/index.d.ts +114 -0
- package/dist/providers/xrpl/index.js +1229 -0
- package/dist/providers/xrpl/index.js.map +1 -0
- package/dist/providers/xrpl/index.mjs +1224 -0
- package/dist/providers/xrpl/index.mjs.map +1 -0
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +161 -3
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +161 -3
- package/dist/react/index.mjs.map +1 -1
- package/dist/utils/index.d.mts +2 -2
- package/dist/utils/index.d.ts +2 -2
- package/dist/utils/index.js +152 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +152 -2
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +35 -4
- package/src/backend/index.ts +5224 -5220
- package/src/chains/index.ts +1219 -1065
- package/src/client/X402Client.ts +9 -1
- package/src/facilitator.ts +18 -0
- package/src/index.ts +274 -256
- package/src/providers/xrpl/index.ts +380 -0
- package/src/types/index.ts +48 -4
- 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
|
|
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
|
-
- **
|
|
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 (
|
|
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-
|
|
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
|
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { O as X402Version, k as PaymentResult } from '../index-
|
|
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
|
|
package/dist/adapters/index.js
CHANGED
|
@@ -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 (
|
|
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
|
}
|