@sluzen/sdk 1.0.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 ADDED
@@ -0,0 +1,38 @@
1
+ # @sluzen/sdk
2
+
3
+ Client for **Sluzen** (x402 on the XRP Ledger).
4
+
5
+ Agents and applications use this package to call HTTP APIs that require on-chain payment before granting access. Typed x402 contracts, a Base64 challenge codec, and `AgentClient` handle the handshake: decode the challenge, sign an XRPL `Payment` in **XRP drops** (`challenge.amount` is an integer drop count, not USD), retry with `PAYMENT-SIGNATURE`. Issued currencies (IOU/RLUSD) are not supported.
6
+
7
+ ## HTTP 402
8
+
9
+ - **Challenge:** `402` **with** `PAYMENT-REQUIRED`. Only this is a quote to sign.
10
+ - **Settlement / bind failure:** `402` **without** that header (or `409` replay). Do not treat every 402 as “sign this header”. `AgentClient` only negotiates the unsigned 402 that carries `PAYMENT-REQUIRED`.
11
+
12
+ ## Installation
13
+
14
+ ```bash
15
+ npm i @sluzen/sdk
16
+ ```
17
+
18
+ ## Usage
19
+
20
+ Set `CLIENT_WALLET_SEED` (XRPL wallet seed) and `XRPL_NODE` (rippled WebSocket URL), then:
21
+
22
+ ```typescript
23
+ import { AgentClient } from "@sluzen/sdk";
24
+
25
+ const client = new AgentClient({
26
+ baseUrl: "http://localhost:3000",
27
+ // walletSeed: "sEd7..." // optional if CLIENT_WALLET_SEED is set
28
+ });
29
+
30
+ const response = await client.request("/api/premium-data");
31
+ console.log(response.status, response.data);
32
+ ```
33
+
34
+ On a protected route, the client receives HTTP 402 + `PAYMENT-REQUIRED`, signs the XRPL payment, resends, and returns the upstream response plus any `PAYMENT-RESPONSE` hash.
35
+
36
+ ## License
37
+
38
+ ISC
@@ -0,0 +1,15 @@
1
+ import { type AgentClientOptions, type AgentResponse } from "./types.js";
2
+ export declare class AgentClient {
3
+ private readonly baseUrl;
4
+ private readonly walletSeed;
5
+ private readonly fetchFn;
6
+ constructor(options: AgentClientOptions);
7
+ /**
8
+ * Negotiate a challenge only on unsigned 402 + PAYMENT-REQUIRED.
9
+ * A 402 without that header is a settlement/bind failure, not a new quote.
10
+ */
11
+ request(path: string, init?: RequestInit): Promise<AgentResponse>;
12
+ private signPayment;
13
+ private parseBody;
14
+ }
15
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,kBAAkB,EACvB,KAAK,aAAa,EAEnB,MAAM,YAAY,CAAC;AAMpB,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;gBAE3B,OAAO,EAAE,kBAAkB;IAUvC;;;OAGG;IACG,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,aAAa,CAAC;YAyCzD,WAAW;YAsCX,SAAS;CAUxB"}
package/dist/client.js ADDED
@@ -0,0 +1,96 @@
1
+ import { Client, Wallet } from "xrpl";
2
+ import { decodeChallenge } from "./codec.js";
3
+ import { CHALLENGE_NONCE_MEMO_TYPE, isXrpDropsCurrency, PAYMENT_REQUIRED_HEADER, PAYMENT_RESPONSE_HEADER, PAYMENT_SIGNATURE_HEADER, } from "./types.js";
4
+ function utf8ToHex(value) {
5
+ return Buffer.from(value, "utf8").toString("hex").toUpperCase();
6
+ }
7
+ export class AgentClient {
8
+ baseUrl;
9
+ walletSeed;
10
+ fetchFn;
11
+ constructor(options) {
12
+ this.baseUrl = options.baseUrl.replace(/\/$/, "");
13
+ this.walletSeed =
14
+ options.walletSeed ?? process.env.CLIENT_WALLET_SEED ?? "";
15
+ if (!this.walletSeed) {
16
+ throw new Error("CLIENT_WALLET_SEED environment variable is required");
17
+ }
18
+ this.fetchFn = options.fetchFn ?? fetch;
19
+ }
20
+ /**
21
+ * Negotiate a challenge only on unsigned 402 + PAYMENT-REQUIRED.
22
+ * A 402 without that header is a settlement/bind failure, not a new quote.
23
+ */
24
+ async request(path, init) {
25
+ const url = `${this.baseUrl}${path}`;
26
+ const initialResponse = await this.fetchFn(url, init);
27
+ if (initialResponse.status !== 402) {
28
+ const data = await this.parseBody(initialResponse);
29
+ return {
30
+ status: initialResponse.status,
31
+ data,
32
+ paymentResponse: initialResponse.headers.get(PAYMENT_RESPONSE_HEADER) ?? undefined,
33
+ };
34
+ }
35
+ const paymentRequired = initialResponse.headers.get(PAYMENT_REQUIRED_HEADER);
36
+ if (!paymentRequired) {
37
+ throw new Error("402 response missing PAYMENT-REQUIRED header");
38
+ }
39
+ const challenge = decodeChallenge(paymentRequired);
40
+ if (!challenge.nonce) {
41
+ throw new Error("402 challenge missing nonce");
42
+ }
43
+ const txBlob = await this.signPayment(challenge);
44
+ const headers = new Headers(init?.headers);
45
+ headers.set(PAYMENT_SIGNATURE_HEADER, txBlob);
46
+ const paidResponse = await this.fetchFn(url, { ...init, headers });
47
+ const data = await this.parseBody(paidResponse);
48
+ return {
49
+ status: paidResponse.status,
50
+ data,
51
+ paymentResponse: paidResponse.headers.get(PAYMENT_RESPONSE_HEADER) ?? undefined,
52
+ };
53
+ }
54
+ async signPayment(challenge) {
55
+ if (!isXrpDropsCurrency(challenge.currency)) {
56
+ throw new Error(`Issued currency ${challenge.currency} is not supported; Sluzen settles XRP drops only`);
57
+ }
58
+ const wallet = Wallet.fromSeed(this.walletSeed);
59
+ const node = process.env.XRPL_NODE;
60
+ if (!node) {
61
+ throw new Error("XRPL_NODE environment variable is required");
62
+ }
63
+ const client = new Client(node);
64
+ const payment = {
65
+ TransactionType: "Payment",
66
+ Account: wallet.address,
67
+ Destination: challenge.destination,
68
+ Amount: String(challenge.amount),
69
+ Memos: [
70
+ {
71
+ Memo: {
72
+ MemoType: utf8ToHex(CHALLENGE_NONCE_MEMO_TYPE),
73
+ MemoData: utf8ToHex(challenge.nonce),
74
+ },
75
+ },
76
+ ],
77
+ };
78
+ await client.connect();
79
+ try {
80
+ const prepared = await client.autofill(payment);
81
+ return wallet.sign(prepared).tx_blob;
82
+ }
83
+ finally {
84
+ await client.disconnect();
85
+ }
86
+ }
87
+ async parseBody(response) {
88
+ const contentType = response.headers.get("content-type") ?? "";
89
+ const text = await response.text();
90
+ if (contentType.includes("application/json") && text.length > 0) {
91
+ return JSON.parse(text);
92
+ }
93
+ return text;
94
+ }
95
+ }
96
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { X402Challenge } from "./types.js";
2
+ export declare function encodeChallenge(challenge: X402Challenge): string;
3
+ export declare function decodeChallenge(encoded: string): X402Challenge;
4
+ //# sourceMappingURL=codec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,wBAAgB,eAAe,CAAC,SAAS,EAAE,aAAa,GAAG,MAAM,CAEhE;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,aAAa,CAI9D"}
package/dist/codec.js ADDED
@@ -0,0 +1,7 @@
1
+ export function encodeChallenge(challenge) {
2
+ return Buffer.from(JSON.stringify(challenge)).toString("base64");
3
+ }
4
+ export function decodeChallenge(encoded) {
5
+ return JSON.parse(Buffer.from(encoded, "base64").toString("utf-8"));
6
+ }
7
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAAC,SAAwB;IACtD,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,OAAO,IAAI,CAAC,KAAK,CACf,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAChC,CAAC;AACrB,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./codec.js";
3
+ export * from "./client.js";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from "./types.js";
2
+ export * from "./codec.js";
3
+ export * from "./client.js";
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC"}
@@ -0,0 +1,29 @@
1
+ /** Live product currency. Payment Amount is native XRPL drops (string). IOU/RLUSD is not implemented. */
2
+ export declare const NATIVE_SETTLEMENT_CURRENCY: "XRP";
3
+ export declare function isXrpDropsCurrency(currency: string): boolean;
4
+ export interface X402Challenge {
5
+ network: string;
6
+ currency: string;
7
+ /** Integer XRP drops. Not USD microcents. */
8
+ amount: number;
9
+ destination: string;
10
+ expiration: number;
11
+ /** Server-issued challenge nonce; must appear in Payment Memos */
12
+ nonce: string;
13
+ }
14
+ export interface AgentResponse {
15
+ status: number;
16
+ data: unknown;
17
+ paymentResponse?: string;
18
+ }
19
+ export interface AgentClientOptions {
20
+ baseUrl: string;
21
+ walletSeed?: string;
22
+ fetchFn?: typeof fetch;
23
+ }
24
+ export declare const PAYMENT_REQUIRED_HEADER: "PAYMENT-REQUIRED";
25
+ export declare const PAYMENT_SIGNATURE_HEADER: "PAYMENT-SIGNATURE";
26
+ export declare const PAYMENT_RESPONSE_HEADER: "PAYMENT-RESPONSE";
27
+ /** XRPL MemoType ASCII for challenge binding */
28
+ export declare const CHALLENGE_NONCE_MEMO_TYPE: "pons/challenge-nonce";
29
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,eAAO,MAAM,0BAA0B,EAAG,KAAc,CAAC;AAEzD,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,6CAA6C;IAC7C,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,kEAAkE;IAClE,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,OAAO,KAAK,CAAC;CACxB;AAED,eAAO,MAAM,uBAAuB,EAAG,kBAA2B,CAAC;AACnE,eAAO,MAAM,wBAAwB,EAAG,mBAA4B,CAAC;AACrE,eAAO,MAAM,uBAAuB,EAAG,kBAA2B,CAAC;AAEnE,gDAAgD;AAChD,eAAO,MAAM,yBAAyB,EAAG,sBAA+B,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,11 @@
1
+ /** Live product currency. Payment Amount is native XRPL drops (string). IOU/RLUSD is not implemented. */
2
+ export const NATIVE_SETTLEMENT_CURRENCY = "XRP";
3
+ export function isXrpDropsCurrency(currency) {
4
+ return currency.trim().toUpperCase() === NATIVE_SETTLEMENT_CURRENCY;
5
+ }
6
+ export const PAYMENT_REQUIRED_HEADER = "PAYMENT-REQUIRED";
7
+ export const PAYMENT_SIGNATURE_HEADER = "PAYMENT-SIGNATURE";
8
+ export const PAYMENT_RESPONSE_HEADER = "PAYMENT-RESPONSE";
9
+ /** XRPL MemoType ASCII for challenge binding */
10
+ export const CHALLENGE_NONCE_MEMO_TYPE = "pons/challenge-nonce";
11
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,yGAAyG;AACzG,MAAM,CAAC,MAAM,0BAA0B,GAAG,KAAc,CAAC;AAEzD,MAAM,UAAU,kBAAkB,CAAC,QAAgB;IACjD,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,0BAA0B,CAAC;AACtE,CAAC;AAyBD,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAA2B,CAAC;AACnE,MAAM,CAAC,MAAM,wBAAwB,GAAG,mBAA4B,CAAC;AACrE,MAAM,CAAC,MAAM,uBAAuB,GAAG,kBAA2B,CAAC;AAEnE,gDAAgD;AAChD,MAAM,CAAC,MAAM,yBAAyB,GAAG,sBAA+B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "name": "@sluzen/sdk",
3
+ "version": "1.0.0",
4
+ "description": "Sluzen x402 client — types, codec, and AgentClient for HTTP 402 payment flows on XRPL",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": ["dist"],
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "prepublishOnly": "npm run build"
12
+ },
13
+ "publishConfig": {
14
+ "access": "public"
15
+ },
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/guidoalejo/pons-proxy-core.git",
19
+ "directory": "pons-sdk"
20
+ },
21
+ "homepage": "https://pons.network",
22
+ "keywords": [
23
+ "sluzen",
24
+ "x402",
25
+ "xrpl",
26
+ "pons",
27
+ "agentic-commerce",
28
+ "payment-required",
29
+ "http-402"
30
+ ],
31
+ "author": "Vectis",
32
+ "license": "ISC",
33
+ "dependencies": {
34
+ "xrpl": "^5.0.0"
35
+ },
36
+ "devDependencies": {
37
+ "typescript": "^6.0.3"
38
+ }
39
+ }