uvd-x402-sdk 2.46.0 → 2.48.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 +65 -0
- package/dist/adapters/index.d.mts +3 -3
- package/dist/adapters/index.d.ts +3 -3
- package/dist/adapters/index.js +58 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/adapters/index.mjs +58 -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 +62 -2
- package/dist/backend/index.js.map +1 -1
- package/dist/backend/index.mjs +62 -2
- package/dist/backend/index.mjs.map +1 -1
- package/dist/{index-BidnFGw_.d.mts → index-BQ45e-Xa.d.ts} +18 -2
- package/dist/{index-H64xdjKh.d.ts → index-BkeMrSHP.d.mts} +18 -2
- package/dist/{index-DgChnK_c.d.mts → index-DeJMYEKC.d.mts} +41 -1
- package/dist/{index-DgChnK_c.d.ts → index-DeJMYEKC.d.ts} +41 -1
- package/dist/index.d.mts +388 -6
- package/dist/index.d.ts +388 -6
- package/dist/index.js +503 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +487 -11
- package/dist/index.mjs.map +1 -1
- package/dist/{ows-DTDixPzO.d.ts → ows-C-KmORG9.d.ts} +1 -1
- package/dist/{ows-CYIVd4xO.d.mts → ows-Z9v4GxOZ.d.mts} +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 +58 -1
- package/dist/providers/algorand/index.js.map +1 -1
- package/dist/providers/algorand/index.mjs +58 -1
- package/dist/providers/algorand/index.mjs.map +1 -1
- package/dist/providers/evm/index.d.mts +10 -2
- package/dist/providers/evm/index.d.ts +10 -2
- package/dist/providers/evm/index.js +107 -2
- package/dist/providers/evm/index.js.map +1 -1
- package/dist/providers/evm/index.mjs +107 -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 +58 -1
- package/dist/providers/near/index.js.map +1 -1
- package/dist/providers/near/index.mjs +58 -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 +58 -1
- package/dist/providers/solana/index.js.map +1 -1
- package/dist/providers/solana/index.mjs +58 -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 +58 -1
- package/dist/providers/stellar/index.js.map +1 -1
- package/dist/providers/stellar/index.mjs +58 -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 +58 -1
- package/dist/providers/sui/index.js.map +1 -1
- package/dist/providers/sui/index.mjs +58 -1
- package/dist/providers/sui/index.mjs.map +1 -1
- package/dist/providers/xrpl/index.d.mts +1 -1
- package/dist/providers/xrpl/index.d.ts +1 -1
- package/dist/providers/xrpl/index.js +58 -1
- package/dist/providers/xrpl/index.js.map +1 -1
- package/dist/providers/xrpl/index.mjs +58 -1
- package/dist/providers/xrpl/index.mjs.map +1 -1
- package/dist/react/index.d.mts +3 -3
- package/dist/react/index.d.ts +3 -3
- package/dist/react/index.js +124 -7
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +124 -7
- package/dist/react/index.mjs.map +1 -1
- package/dist/utils/index.d.mts +68 -2
- package/dist/utils/index.d.ts +68 -2
- package/dist/utils/index.js +103 -2
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/index.mjs +100 -3
- package/dist/utils/index.mjs.map +1 -1
- package/dist/{wallet-0cX9Pw2F.d.mts → wallet-w7BnImDG.d.mts} +1 -1
- package/dist/{wallet-0cX9Pw2F.d.ts → wallet-w7BnImDG.d.ts} +1 -1
- package/package.json +38 -13
- package/src/backend/index.ts +22 -1
- package/src/chains/index.ts +82 -0
- package/src/client/X402Client.ts +41 -12
- package/src/erc8128.ts +443 -0
- package/src/escrow-preauth.ts +416 -0
- package/src/index.ts +44 -0
- package/src/providers/algorand/index.ts +2 -2
- package/src/providers/evm/index.ts +28 -4
- package/src/providers/near/index.ts +2 -2
- package/src/providers/solana/index.ts +2 -2
- package/src/providers/stellar/index.ts +2 -2
- package/src/providers/sui/index.ts +2 -2
- package/src/providers/xrpl/index.ts +2 -2
- package/src/types/index.ts +42 -0
- package/src/utils/base64.ts +58 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/token-metadata.ts +44 -0
- package/src/utils/x402.ts +3 -2
package/README.md
CHANGED
|
@@ -13,9 +13,11 @@ Users sign a message or transaction, and the Ultravioleta facilitator handles on
|
|
|
13
13
|
- **Type-Safe**: Full TypeScript support
|
|
14
14
|
- **React & Wagmi**: First-class integrations
|
|
15
15
|
- **Signing Wallet Adapters**: EnvKeyAdapter (server/CLI), OWSWalletAdapter (Open Wallet Standard), or bring your own
|
|
16
|
+
- **ERC-8128 Signed Requests**: Authenticate HTTP requests with a wallet (RFC 9421 + EIP-191) — no API keys
|
|
16
17
|
- **ERC-8004 Trustless Agents**: On-chain reputation and identity across 20 networks (18 EVM + 2 Solana)
|
|
17
18
|
- **Escrow & Refunds**: Hold payments with dispute resolution
|
|
18
19
|
- **Advanced Escrow**: Full escrow lifecycle (authorize, release, refund, charge) with SigningWalletAdapter support
|
|
20
|
+
- **Escrow Pre-Auth**: Sign-on-assignment `X-Payment-Auth` builder (`buildEscrowPreAuth`) — vector-pinned parity with the Python SDK and Execution Market
|
|
19
21
|
- **Commerce Scheme**: `'commerce'` scheme alias for marketplace integrations (identical to `'escrow'` on-chain)
|
|
20
22
|
- **`/accepts` Negotiation**: Discover facilitator capabilities before constructing payments
|
|
21
23
|
- **Bazaar Discovery**: Register and discover paid resources across the x402 network
|
|
@@ -586,6 +588,69 @@ class MyAdapter implements SigningWalletAdapter {
|
|
|
586
588
|
}
|
|
587
589
|
```
|
|
588
590
|
|
|
591
|
+
## ERC-8128 Signed Requests
|
|
592
|
+
|
|
593
|
+
Authenticate HTTP requests with a wallet instead of an API key. The SDK builds the RFC 9421 signature base, signs it with EIP-191 personal_sign, and produces the `Signature`, `Signature-Input`, and (for bodies) `Content-Digest` headers. Used by APIs that only accept wallet signing, like [Execution Market](https://execution.market).
|
|
594
|
+
|
|
595
|
+
Wire format is pinned by golden vectors (`src/erc8128.vectors.json`): `alg="eip191"`, keyid always lowercase (`erc8128:{chainId}:{address}`), params in the order `created;expires;nonce;keyid;alg`.
|
|
596
|
+
|
|
597
|
+
```typescript
|
|
598
|
+
import { createSignedFetch, EnvKeyAdapter } from 'uvd-x402-sdk';
|
|
599
|
+
|
|
600
|
+
// Auto-signing fetch: fetches a fresh nonce and signs every request
|
|
601
|
+
const signedFetch = createSignedFetch({
|
|
602
|
+
wallet: new EnvKeyAdapter(), // or privateKey: process.env.KEY!
|
|
603
|
+
apiBase: 'https://api.execution.market',
|
|
604
|
+
chainId: 8453, // Base (default)
|
|
605
|
+
});
|
|
606
|
+
|
|
607
|
+
const resp = await signedFetch('/api/v1/tasks', {
|
|
608
|
+
method: 'POST',
|
|
609
|
+
body: JSON.stringify({ title: 'test' }),
|
|
610
|
+
});
|
|
611
|
+
```
|
|
612
|
+
|
|
613
|
+
For manual control, sign a single request (the nonce is single-use — fetch one per request):
|
|
614
|
+
|
|
615
|
+
```typescript
|
|
616
|
+
import { fetchNonce, signRequestWithWallet, EnvKeyAdapter } from 'uvd-x402-sdk';
|
|
617
|
+
|
|
618
|
+
const wallet = new EnvKeyAdapter();
|
|
619
|
+
const nonce = await fetchNonce('https://api.execution.market');
|
|
620
|
+
const headers = await signRequestWithWallet(wallet, {
|
|
621
|
+
method: 'POST',
|
|
622
|
+
url: 'https://api.execution.market/api/v1/tasks',
|
|
623
|
+
body: '{"title":"test"}',
|
|
624
|
+
nonce,
|
|
625
|
+
});
|
|
626
|
+
// headers = { Signature, 'Signature-Input', 'Content-Digest' } — merge into your request
|
|
627
|
+
```
|
|
628
|
+
|
|
629
|
+
Also available: `signRequest` (raw private key) and `signRequestWithSigner` (callback-based, for browser wallets / out-of-process signers where the key never leaves the signer), plus `buildSignatureBase` / `buildSignatureParams` to reproduce the exact signed bytes externally.
|
|
630
|
+
|
|
631
|
+
## Escrow Pre-Auth (sign-on-assignment)
|
|
632
|
+
|
|
633
|
+
Build and sign the EIP-3009 `ReceiveWithAuthorization` that locks a bounty in the x402r AuthCaptureEscrow, packed as the raw-JSON `X-Payment-Auth` wrapper the facilitator's `/settle` expects. Used by marketplaces on the escrow rail (e.g. [Execution Market](https://execution.market)'s universal escrow).
|
|
634
|
+
|
|
635
|
+
The EIP-3009 nonce is `AuthCaptureEscrow.getHash(paymentInfo)`, which **includes the receiver** — the signature cryptographically commits to the chosen worker, so it can only be created AT ASSIGNMENT. The wire format is pinned by golden vectors (`src/escrow-preauth.vectors.json`) shared with the Python SDK and Execution Market's dashboard/mobile suites.
|
|
636
|
+
|
|
637
|
+
```typescript
|
|
638
|
+
import { buildEscrowPreAuth, EnvKeyAdapter } from 'uvd-x402-sdk';
|
|
639
|
+
|
|
640
|
+
// Escrow config as published by the marketplace server
|
|
641
|
+
// (e.g. Execution Market's GET /api/v1/h2a/payment-config).
|
|
642
|
+
const paymentAuth = await buildEscrowPreAuth(new EnvKeyAdapter(), {
|
|
643
|
+
networkConfig: config.escrow.networks.base,
|
|
644
|
+
payerWallet: '0xPublisher...',
|
|
645
|
+
workerWallet: '0xWorker...', // escrow receiver — committed by the nonce
|
|
646
|
+
bountyAtomic: '100000', // $0.10 in 6-decimal USDC
|
|
647
|
+
reviewDeadlineSec: taskDeadline, // release window outlasts it
|
|
648
|
+
});
|
|
649
|
+
// Send as the X-Payment-Auth header (raw JSON, NOT base64).
|
|
650
|
+
```
|
|
651
|
+
|
|
652
|
+
Any `SigningWalletAdapter` works as the signer (only `signTypedData` is used); browser wallets can pass a minimal `{ signTypedData }` wrapper. Validation fails loud instead of falling back: incomplete network config, unknown tier, bounty outside the on-chain deposit limit ($100), or a `maxFeeBps` below the operator's 1300 bps all throw before anything is signed. `computeEscrowNonce` is exported to reproduce `AuthCaptureEscrow.getHash` externally.
|
|
653
|
+
|
|
589
654
|
## Multi-Stablecoin (EVM)
|
|
590
655
|
|
|
591
656
|
```typescript
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { X as X402Version, b as PaymentResult } from '../index-
|
|
2
|
-
export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-
|
|
3
|
-
import '../wallet-
|
|
1
|
+
import { X as X402Version, b as PaymentResult } from '../index-DeJMYEKC.mjs';
|
|
2
|
+
export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-Z9v4GxOZ.mjs';
|
|
3
|
+
import '../wallet-w7BnImDG.mjs';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* uvd-x402-sdk - Wagmi/Viem Adapter
|
package/dist/adapters/index.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { X as X402Version, b as PaymentResult } from '../index-
|
|
2
|
-
export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-
|
|
3
|
-
import '../wallet-
|
|
1
|
+
import { X as X402Version, b as PaymentResult } from '../index-DeJMYEKC.js';
|
|
2
|
+
export { E as EnvKeyAdapter, O as OWSWallet, a as OWSWalletAdapter } from '../ows-C-KmORG9.js';
|
|
3
|
+
import '../wallet-w7BnImDG.js';
|
|
4
4
|
|
|
5
5
|
/**
|
|
6
6
|
* uvd-x402-sdk - Wagmi/Viem Adapter
|
package/dist/adapters/index.js
CHANGED
|
@@ -416,6 +416,49 @@ var SUPPORTED_CHAINS = {
|
|
|
416
416
|
enabled: true
|
|
417
417
|
}
|
|
418
418
|
},
|
|
419
|
+
bsc: {
|
|
420
|
+
chainId: 56,
|
|
421
|
+
chainIdHex: "0x38",
|
|
422
|
+
name: "bsc",
|
|
423
|
+
displayName: "BNB Smart Chain",
|
|
424
|
+
networkType: "evm",
|
|
425
|
+
rpcUrl: "https://binance.llamarpc.com",
|
|
426
|
+
explorerUrl: "https://bscscan.com",
|
|
427
|
+
nativeCurrency: {
|
|
428
|
+
name: "Binance Coin",
|
|
429
|
+
symbol: "BNB",
|
|
430
|
+
decimals: 18
|
|
431
|
+
},
|
|
432
|
+
usdc: {
|
|
433
|
+
// Binance-Peg USDC — 18 decimals, NOT the 6 every other chain uses.
|
|
434
|
+
address: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
|
|
435
|
+
decimals: 18,
|
|
436
|
+
name: "USD Coin",
|
|
437
|
+
version: "2"
|
|
438
|
+
},
|
|
439
|
+
tokens: {
|
|
440
|
+
usdc: {
|
|
441
|
+
address: "0x8AC76a51cc950d9822D68b83fE1Ad97B32Cd580d",
|
|
442
|
+
decimals: 18,
|
|
443
|
+
name: "USD Coin",
|
|
444
|
+
version: "2"
|
|
445
|
+
},
|
|
446
|
+
ausd: {
|
|
447
|
+
address: "0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a",
|
|
448
|
+
decimals: 6,
|
|
449
|
+
name: "Agora Dollar",
|
|
450
|
+
version: "1"
|
|
451
|
+
}
|
|
452
|
+
},
|
|
453
|
+
x402: {
|
|
454
|
+
facilitatorUrl: DEFAULT_FACILITATOR_URL,
|
|
455
|
+
// Disabled on purpose: Binance-Peg USDC does not implement ERC-3009
|
|
456
|
+
// `transferWithAuthorization`, so the exact scheme cannot settle it. The
|
|
457
|
+
// entry exists so the 18-decimal figure is on record — assuming the usual
|
|
458
|
+
// 6 here mis-prices a payment by 12 orders of magnitude.
|
|
459
|
+
enabled: false
|
|
460
|
+
}
|
|
461
|
+
},
|
|
419
462
|
scroll: {
|
|
420
463
|
chainId: 534352,
|
|
421
464
|
chainIdHex: "0x82750",
|
|
@@ -955,6 +998,7 @@ var CAIP2_IDENTIFIERS = {
|
|
|
955
998
|
hyperevm: "eip155:999",
|
|
956
999
|
unichain: "eip155:130",
|
|
957
1000
|
monad: "eip155:143",
|
|
1001
|
+
bsc: "eip155:56",
|
|
958
1002
|
scroll: "eip155:534352",
|
|
959
1003
|
"skale-base": "eip155:1187947933",
|
|
960
1004
|
"skale-base-sepolia": "eip155:324705682",
|
|
@@ -994,6 +1038,19 @@ var X402Error = class _X402Error extends Error {
|
|
|
994
1038
|
}
|
|
995
1039
|
};
|
|
996
1040
|
|
|
1041
|
+
// src/utils/base64.ts
|
|
1042
|
+
function encodeBase64Utf8(value) {
|
|
1043
|
+
const bytes = new TextEncoder().encode(value);
|
|
1044
|
+
let binary = "";
|
|
1045
|
+
for (let i = 0; i < bytes.length; i++) {
|
|
1046
|
+
binary += String.fromCharCode(bytes[i]);
|
|
1047
|
+
}
|
|
1048
|
+
return btoa(binary);
|
|
1049
|
+
}
|
|
1050
|
+
function encodeBase64Json(value) {
|
|
1051
|
+
return encodeBase64Utf8(JSON.stringify(value));
|
|
1052
|
+
}
|
|
1053
|
+
|
|
997
1054
|
// src/utils/x402.ts
|
|
998
1055
|
function chainToCAIP2(chainName) {
|
|
999
1056
|
const caip2 = CAIP2_IDENTIFIERS[chainName.toLowerCase()];
|
|
@@ -1010,7 +1067,7 @@ function chainToCAIP2(chainName) {
|
|
|
1010
1067
|
return chainName;
|
|
1011
1068
|
}
|
|
1012
1069
|
function encodeX402Header(header) {
|
|
1013
|
-
return
|
|
1070
|
+
return encodeBase64Json(header);
|
|
1014
1071
|
}
|
|
1015
1072
|
function createX402V1Header(network, payload) {
|
|
1016
1073
|
return {
|