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.
- package/README.md +45 -2
- package/dist/adapters/index.d.mts +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.js +72 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +72 -1
- package/dist/adapters/index.mjs.map +1 -1
- package/dist/backend/index.d.mts +2 -2
- package/dist/backend/index.d.ts +2 -2
- package/dist/backend/index.js +63 -1
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/index.mjs +63 -1
- package/dist/backend/index.mjs.map +1 -1
- package/dist/{index-SL4OVkNU.d.mts → index-Cz0xHYGy.d.mts} +12 -3
- package/dist/{index-CfTMJWAg.d.ts → index-DMPuzJv-.d.ts} +12 -3
- package/dist/{index-DsuzwOwF.d.mts → index-DNcDDyee.d.mts} +38 -4
- package/dist/{index-DsuzwOwF.d.ts → index-DNcDDyee.d.ts} +38 -4
- package/dist/index.d.mts +11 -2
- package/dist/index.d.ts +11 -2
- package/dist/index.js +114 -3
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +113 -4
- 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 +76 -2
- package/dist/providers/algorand/index.js.map +1 -1
- package/dist/providers/algorand/index.mjs +76 -2
- 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 +72 -1
- package/dist/providers/evm/index.js.map +1 -1
- package/dist/providers/evm/index.mjs +72 -1
- 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 +63 -1
- package/dist/providers/near/index.js.map +1 -1
- package/dist/providers/near/index.mjs +63 -1
- 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 +63 -1
- package/dist/providers/solana/index.js.map +1 -1
- package/dist/providers/solana/index.mjs +63 -1
- 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 +63 -1
- package/dist/providers/stellar/index.js.map +1 -1
- package/dist/providers/stellar/index.mjs +63 -1
- 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 +63 -1
- package/dist/providers/sui/index.js.map +1 -1
- package/dist/providers/sui/index.mjs +63 -1
- 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 +1150 -0
- package/dist/providers/xrpl/index.js.map +1 -0
- package/dist/providers/xrpl/index.mjs +1145 -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 +81 -2
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +81 -2
- 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 +72 -1
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +72 -1
- package/dist/utils/index.mjs.map +1 -1
- package/package.json +32 -4
- package/src/backend/index.ts +5222 -5220
- package/src/chains/index.ts +1146 -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 +44 -3
- 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
|
|
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
|
-
- **
|
|
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-
|
|
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
|
|
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-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
|
|
package/dist/adapters/index.js
CHANGED
|
@@ -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
|
}
|