@apitoll/seller-sdk 0.1.0-beta.1

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.
@@ -0,0 +1,130 @@
1
+ import { usdcToSmallestUnit, usdcFromSmallestUnit, matchRoute, calculateFeeBreakdown, getPlatformWallet, } from "@apitoll/shared";
2
+ // ─── Payment Requirement Builder ────────────────────────────────
3
+ /**
4
+ * Build the PaymentRequired response body for a given endpoint config.
5
+ * Returns an array of PaymentRequirement objects (one per supported chain).
6
+ * When platform fees are configured, the response includes fee metadata.
7
+ */
8
+ export function buildPaymentRequirements(endpoint, sellerWallet, chainConfigs, platformFee) {
9
+ const feeBreakdown = calculateFeeBreakdown(endpoint.price, platformFee);
10
+ return endpoint.chains.map((chain) => {
11
+ const config = chainConfigs[chain];
12
+ const platformWallet = getPlatformWallet(chain, platformFee);
13
+ return {
14
+ scheme: "exact",
15
+ network: config.networkId,
16
+ maxAmountRequired: usdcToSmallestUnit(endpoint.price),
17
+ description: endpoint.description,
18
+ payTo: sellerWallet,
19
+ asset: config.usdcAddress,
20
+ extra: {
21
+ name: "USDC",
22
+ decimals: 6,
23
+ // Platform fee metadata — facilitator uses this for fee splitting
24
+ ...(platformFee && platformFee.feeBps > 0 && platformWallet
25
+ ? {
26
+ platformFee: {
27
+ feeBps: platformFee.feeBps,
28
+ platformWallet,
29
+ sellerAmount: usdcToSmallestUnit(feeBreakdown.sellerAmount),
30
+ platformAmount: usdcToSmallestUnit(feeBreakdown.platformFee),
31
+ },
32
+ }
33
+ : {}),
34
+ },
35
+ };
36
+ });
37
+ }
38
+ /**
39
+ * Get the fee breakdown for an endpoint price.
40
+ */
41
+ export function getEndpointFeeBreakdown(endpoint, platformFee) {
42
+ return calculateFeeBreakdown(endpoint.price, platformFee);
43
+ }
44
+ /**
45
+ * Build the base64-encoded PAYMENT-REQUIRED header value.
46
+ */
47
+ export function encodePaymentRequired(requirements) {
48
+ return Buffer.from(JSON.stringify(requirements)).toString("base64");
49
+ }
50
+ /**
51
+ * Verify a payment by calling the x402 facilitator.
52
+ * The facilitator checks on-chain that the payment is valid and settles it.
53
+ */
54
+ export async function verifyPayment(options, platformFee) {
55
+ const { paymentHeader, requirements, facilitatorUrl } = options;
56
+ try {
57
+ // Parse the payment payload from the header
58
+ const paymentPayload = JSON.parse(Buffer.from(paymentHeader, "base64").toString("utf-8"));
59
+ // Call the facilitator's /verify endpoint
60
+ const response = await fetch(`${facilitatorUrl}/verify`, {
61
+ method: "POST",
62
+ headers: { "Content-Type": "application/json" },
63
+ body: JSON.stringify({
64
+ payload: paymentPayload,
65
+ requirements,
66
+ }),
67
+ });
68
+ if (!response.ok) {
69
+ const errorBody = await response.text();
70
+ return {
71
+ valid: false,
72
+ error: `Facilitator returned ${response.status}: ${errorBody}`,
73
+ };
74
+ }
75
+ const result = await response.json();
76
+ if (result.valid || result.success) {
77
+ const amount = requirements[0]
78
+ ? usdcFromSmallestUnit(requirements[0].maxAmountRequired)
79
+ : "0";
80
+ // Calculate fee breakdown for the verified amount
81
+ const feeBreakdown = calculateFeeBreakdown(amount, platformFee);
82
+ return {
83
+ valid: true,
84
+ receipt: {
85
+ txHash: result.txHash || result.transaction?.hash || "",
86
+ chain: detectChainFromNetwork(paymentPayload.network || requirements[0]?.network),
87
+ amount,
88
+ from: result.from || paymentPayload.from || "",
89
+ to: requirements[0]?.payTo || "",
90
+ timestamp: new Date().toISOString(),
91
+ blockNumber: result.blockNumber,
92
+ },
93
+ feeBreakdown,
94
+ };
95
+ }
96
+ return {
97
+ valid: false,
98
+ error: result.error || result.message || "Payment verification failed",
99
+ };
100
+ }
101
+ catch (err) {
102
+ return {
103
+ valid: false,
104
+ error: `Payment verification error: ${err instanceof Error ? err.message : String(err)}`,
105
+ };
106
+ }
107
+ }
108
+ /**
109
+ * Detect chain from CAIP-2 network identifier.
110
+ */
111
+ function detectChainFromNetwork(network) {
112
+ if (network.startsWith("eip155:"))
113
+ return "base";
114
+ if (network.startsWith("solana:"))
115
+ return "solana";
116
+ return "base"; // default fallback
117
+ }
118
+ // ─── Route Matching ─────────────────────────────────────────────
119
+ /**
120
+ * Find the matching endpoint config for a given request.
121
+ */
122
+ export function findEndpointConfig(method, path, endpoints) {
123
+ for (const [pattern, config] of Object.entries(endpoints)) {
124
+ if (matchRoute(method, path, pattern)) {
125
+ return { pattern, config };
126
+ }
127
+ }
128
+ return null;
129
+ }
130
+ //# sourceMappingURL=payment.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.js","sourceRoot":"","sources":["../src/payment.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=payment.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.test.d.ts","sourceRoot":"","sources":["../src/payment.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,221 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
2
+ import { buildPaymentRequirements, encodePaymentRequired, verifyPayment, findEndpointConfig, getEndpointFeeBreakdown, } from "./payment";
3
+ import { DEFAULT_CHAIN_CONFIGS } from "@apitoll/shared";
4
+ const TEST_WALLET = "0x1234567890abcdef1234567890abcdef12345678";
5
+ const CHAIN_CONFIGS = DEFAULT_CHAIN_CONFIGS;
6
+ const testEndpoint = {
7
+ price: "0.005",
8
+ chains: ["base"],
9
+ description: "Test data endpoint",
10
+ };
11
+ // ─── buildPaymentRequirements ───────────────────────────────────
12
+ describe("buildPaymentRequirements", () => {
13
+ it("builds requirements for a single chain", () => {
14
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
15
+ expect(reqs).toHaveLength(1);
16
+ expect(reqs[0].scheme).toBe("exact");
17
+ expect(reqs[0].network).toBe("eip155:8453");
18
+ expect(reqs[0].maxAmountRequired).toBe("5000");
19
+ expect(reqs[0].payTo).toBe(TEST_WALLET);
20
+ expect(reqs[0].asset).toBe(DEFAULT_CHAIN_CONFIGS.base.usdcAddress);
21
+ });
22
+ it("builds requirements for multiple chains", () => {
23
+ const multiChain = { ...testEndpoint, chains: ["base", "solana"] };
24
+ const reqs = buildPaymentRequirements(multiChain, TEST_WALLET, CHAIN_CONFIGS);
25
+ expect(reqs).toHaveLength(2);
26
+ expect(reqs[0].network).toBe("eip155:8453");
27
+ expect(reqs[1].network).toBe("solana:5eykt4UsFv8P8NJdTREpY1vzqKqZKvdp");
28
+ });
29
+ it("includes platform fee metadata when configured", () => {
30
+ const platformFee = {
31
+ feeBps: 300,
32
+ platformWalletBase: "0xPlatform",
33
+ };
34
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS, platformFee);
35
+ expect(reqs[0].extra).toBeDefined();
36
+ expect(reqs[0].extra.platformFee).toBeDefined();
37
+ expect(reqs[0].extra.platformFee.feeBps).toBe(300);
38
+ expect(reqs[0].extra.platformFee.platformWallet).toBe("0xPlatform");
39
+ });
40
+ it("omits platform fee metadata when feeBps is 0", () => {
41
+ const platformFee = { feeBps: 0, platformWalletBase: "0xPlatform" };
42
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS, platformFee);
43
+ expect(reqs[0].extra.platformFee).toBeUndefined();
44
+ });
45
+ it("includes description from endpoint config", () => {
46
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
47
+ expect(reqs[0].description).toBe("Test data endpoint");
48
+ });
49
+ });
50
+ // ─── encodePaymentRequired ──────────────────────────────────────
51
+ describe("encodePaymentRequired", () => {
52
+ it("encodes requirements to base64", () => {
53
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
54
+ const encoded = encodePaymentRequired(reqs);
55
+ const decoded = JSON.parse(Buffer.from(encoded, "base64").toString("utf-8"));
56
+ expect(decoded).toEqual(reqs);
57
+ });
58
+ it("produces valid base64 string", () => {
59
+ const reqs = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
60
+ const encoded = encodePaymentRequired(reqs);
61
+ expect(() => Buffer.from(encoded, "base64")).not.toThrow();
62
+ });
63
+ });
64
+ // ─── verifyPayment ──────────────────────────────────────────────
65
+ describe("verifyPayment", () => {
66
+ const mockFetch = vi.fn();
67
+ beforeEach(() => {
68
+ vi.stubGlobal("fetch", mockFetch);
69
+ });
70
+ afterEach(() => {
71
+ vi.restoreAllMocks();
72
+ });
73
+ it("returns valid result on successful verification", async () => {
74
+ mockFetch.mockResolvedValue({
75
+ ok: true,
76
+ json: async () => ({ valid: true, txHash: "0xabc123" }),
77
+ });
78
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
79
+ const paymentHeader = Buffer.from(JSON.stringify({ network: "eip155:8453", from: "0xPayer" })).toString("base64");
80
+ const result = await verifyPayment({
81
+ paymentHeader,
82
+ requirements,
83
+ facilitatorUrl: "https://test-facilitator.com",
84
+ });
85
+ expect(result.valid).toBe(true);
86
+ expect(result.receipt).toBeDefined();
87
+ expect(result.receipt?.txHash).toBe("0xabc123");
88
+ expect(result.receipt?.chain).toBe("base");
89
+ });
90
+ it("returns valid when facilitator returns success=true", async () => {
91
+ mockFetch.mockResolvedValue({
92
+ ok: true,
93
+ json: async () => ({ success: true, transaction: { hash: "0xdef456" } }),
94
+ });
95
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
96
+ const paymentHeader = Buffer.from(JSON.stringify({ network: "eip155:8453" })).toString("base64");
97
+ const result = await verifyPayment({
98
+ paymentHeader,
99
+ requirements,
100
+ facilitatorUrl: "https://test-facilitator.com",
101
+ });
102
+ expect(result.valid).toBe(true);
103
+ expect(result.receipt?.txHash).toBe("0xdef456");
104
+ });
105
+ it("returns invalid on facilitator HTTP error", async () => {
106
+ mockFetch.mockResolvedValue({
107
+ ok: false,
108
+ status: 500,
109
+ text: async () => "Internal Server Error",
110
+ });
111
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
112
+ const paymentHeader = Buffer.from(JSON.stringify({})).toString("base64");
113
+ const result = await verifyPayment({
114
+ paymentHeader,
115
+ requirements,
116
+ facilitatorUrl: "https://test-facilitator.com",
117
+ });
118
+ expect(result.valid).toBe(false);
119
+ expect(result.error).toContain("500");
120
+ });
121
+ it("returns invalid when facilitator says not valid", async () => {
122
+ mockFetch.mockResolvedValue({
123
+ ok: true,
124
+ json: async () => ({ valid: false, error: "Signature mismatch" }),
125
+ });
126
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
127
+ const paymentHeader = Buffer.from(JSON.stringify({})).toString("base64");
128
+ const result = await verifyPayment({
129
+ paymentHeader,
130
+ requirements,
131
+ facilitatorUrl: "https://test-facilitator.com",
132
+ });
133
+ expect(result.valid).toBe(false);
134
+ expect(result.error).toBe("Signature mismatch");
135
+ });
136
+ it("handles network errors gracefully", async () => {
137
+ mockFetch.mockRejectedValue(new Error("ECONNREFUSED"));
138
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
139
+ const paymentHeader = Buffer.from(JSON.stringify({})).toString("base64");
140
+ const result = await verifyPayment({
141
+ paymentHeader,
142
+ requirements,
143
+ facilitatorUrl: "https://unreachable.com",
144
+ });
145
+ expect(result.valid).toBe(false);
146
+ expect(result.error).toContain("ECONNREFUSED");
147
+ });
148
+ it("handles malformed payment header", async () => {
149
+ const result = await verifyPayment({
150
+ paymentHeader: "not-valid-base64!!!",
151
+ requirements: [],
152
+ facilitatorUrl: "https://test-facilitator.com",
153
+ });
154
+ expect(result.valid).toBe(false);
155
+ expect(result.error).toBeDefined();
156
+ });
157
+ it("calculates fee breakdown with platform fee config", async () => {
158
+ mockFetch.mockResolvedValue({
159
+ ok: true,
160
+ json: async () => ({ valid: true, txHash: "0xabc" }),
161
+ });
162
+ const requirements = buildPaymentRequirements(testEndpoint, TEST_WALLET, CHAIN_CONFIGS);
163
+ const paymentHeader = Buffer.from(JSON.stringify({ network: "eip155:8453" })).toString("base64");
164
+ const result = await verifyPayment({
165
+ paymentHeader,
166
+ requirements,
167
+ facilitatorUrl: "https://test-facilitator.com",
168
+ }, { feeBps: 300, platformWalletBase: "0xPlatform" });
169
+ expect(result.valid).toBe(true);
170
+ expect(result.feeBreakdown).toBeDefined();
171
+ expect(result.feeBreakdown?.feeBps).toBe(300);
172
+ });
173
+ });
174
+ // ─── findEndpointConfig ─────────────────────────────────────────
175
+ describe("findEndpointConfig", () => {
176
+ const endpoints = {
177
+ "GET /api/data": testEndpoint,
178
+ "POST /api/inference": {
179
+ price: "0.01",
180
+ chains: ["base"],
181
+ description: "AI inference",
182
+ },
183
+ "GET /api/users/:id": {
184
+ price: "0.002",
185
+ chains: ["base"],
186
+ description: "User lookup",
187
+ },
188
+ };
189
+ it("finds matching endpoint", () => {
190
+ const match = findEndpointConfig("GET", "/api/data", endpoints);
191
+ expect(match).not.toBeNull();
192
+ expect(match?.pattern).toBe("GET /api/data");
193
+ expect(match?.config.price).toBe("0.005");
194
+ });
195
+ it("returns null for non-matching endpoint", () => {
196
+ const match = findEndpointConfig("GET", "/api/unknown", endpoints);
197
+ expect(match).toBeNull();
198
+ });
199
+ it("matches parameterized routes", () => {
200
+ const match = findEndpointConfig("GET", "/api/users/123", endpoints);
201
+ expect(match).not.toBeNull();
202
+ expect(match?.pattern).toBe("GET /api/users/:id");
203
+ });
204
+ it("respects HTTP method", () => {
205
+ const match = findEndpointConfig("POST", "/api/data", endpoints);
206
+ expect(match).toBeNull();
207
+ });
208
+ });
209
+ // ─── getEndpointFeeBreakdown ────────────────────────────────────
210
+ describe("getEndpointFeeBreakdown", () => {
211
+ it("returns fee breakdown with platform fee", () => {
212
+ const result = getEndpointFeeBreakdown(testEndpoint, { feeBps: 300 });
213
+ expect(result.totalAmount).toBe("0.005");
214
+ expect(result.feeBps).toBe(300);
215
+ });
216
+ it("returns zero fees without platform fee config", () => {
217
+ const result = getEndpointFeeBreakdown(testEndpoint);
218
+ expect(result.platformFee).toBe("0.000000");
219
+ });
220
+ });
221
+ //# sourceMappingURL=payment.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"payment.test.js","sourceRoot":"","sources":["../src/payment.test.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@apitoll/seller-sdk",
3
+ "version": "0.1.0-beta.1",
4
+ "description": "x402 payment middleware for API and MCP tool monetization. Add per-request micropayments in 3 lines of code.",
5
+ "license": "MIT",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": ["dist", "README.md"],
9
+ "engines": {
10
+ "node": ">=18"
11
+ },
12
+ "repository": {
13
+ "type": "git",
14
+ "url": "https://github.com/TasnidChain/APITOLL"
15
+ },
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "scripts": {
20
+ "build": "tsc",
21
+ "dev": "tsc --watch",
22
+ "test": "vitest"
23
+ },
24
+ "keywords": ["x402", "micropayments", "agent", "mcp", "usdc", "stablecoin", "api-monetization"],
25
+ "dependencies": {
26
+ "@apitoll/shared": "0.1.0-beta.1"
27
+ },
28
+ "peerDependencies": {
29
+ "express": ">=4.0.0",
30
+ "hono": ">=4.0.0"
31
+ },
32
+ "peerDependenciesMeta": {
33
+ "express": { "optional": true },
34
+ "hono": { "optional": true }
35
+ },
36
+ "devDependencies": {
37
+ "typescript": "^5.4.0",
38
+ "@types/express": "^4.17.0",
39
+ "vitest": "^1.6.0"
40
+ }
41
+ }