@pincerpay/merchant 0.5.0 → 0.6.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 +126 -46
- package/dist/client.d.ts +2 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/middleware/nextjs.d.ts +2 -1
- package/dist/middleware/nextjs.d.ts.map +1 -1
- package/dist/middleware/nextjs.js +29 -9
- package/dist/middleware/nextjs.js.map +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -5,28 +5,29 @@
|
|
|
5
5
|
[](https://github.com/ds1/pincerpay/blob/master/LICENSE)
|
|
6
6
|
[](https://www.typescriptlang.org/)
|
|
7
7
|
|
|
8
|
-
Merchant SDK for accepting on-chain USDC payments from AI agents via the [x402 protocol](https://x402.org).
|
|
8
|
+
Merchant SDK for accepting on-chain USDC payments from AI agents via the [x402 protocol](https://x402.org). Ships a Hono middleware that runs natively in Hono apps and inside Next.js App Router via `hono/vercel`.
|
|
9
9
|
|
|
10
10
|
> **ESM Required:** Your project must have `"type": "module"` in package.json. This package is ESM-only.
|
|
11
11
|
|
|
12
12
|
## Install
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
|
-
npm install @pincerpay/merchant
|
|
15
|
+
npm install @pincerpay/merchant hono
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
## Quick Start
|
|
19
19
|
|
|
20
|
-
###
|
|
20
|
+
### Hono
|
|
21
21
|
|
|
22
22
|
```typescript
|
|
23
|
-
import
|
|
24
|
-
import {
|
|
23
|
+
import { Hono } from "hono";
|
|
24
|
+
import { createPincerPayMiddleware } from "@pincerpay/merchant/nextjs";
|
|
25
25
|
|
|
26
|
-
const app =
|
|
26
|
+
const app = new Hono();
|
|
27
27
|
|
|
28
28
|
app.use(
|
|
29
|
-
|
|
29
|
+
"*",
|
|
30
|
+
createPincerPayMiddleware({
|
|
30
31
|
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
31
32
|
merchantAddress: "YOUR_SOLANA_ADDRESS",
|
|
32
33
|
routes: {
|
|
@@ -44,26 +45,29 @@ app.use(
|
|
|
44
45
|
})
|
|
45
46
|
);
|
|
46
47
|
|
|
47
|
-
app.get("/api/weather", (
|
|
48
|
-
res.json({ temp: 72, unit: "F" });
|
|
49
|
-
});
|
|
48
|
+
app.get("/api/weather", (c) => c.json({ temp: 72, unit: "F" }));
|
|
50
49
|
|
|
51
|
-
app
|
|
50
|
+
export default app;
|
|
52
51
|
```
|
|
53
52
|
|
|
54
|
-
###
|
|
53
|
+
### Next.js (App Router)
|
|
54
|
+
|
|
55
|
+
Next.js doesn't have native x402 middleware support. Use Hono as a lightweight handler inside a catch-all App Router route:
|
|
55
56
|
|
|
56
57
|
```typescript
|
|
58
|
+
// app/api/[...route]/route.ts
|
|
57
59
|
import { Hono } from "hono";
|
|
58
|
-
import {
|
|
60
|
+
import { handle } from "hono/vercel";
|
|
61
|
+
import { createPincerPayMiddleware } from "@pincerpay/merchant/nextjs";
|
|
59
62
|
|
|
60
|
-
const app = new Hono();
|
|
63
|
+
const app = new Hono().basePath("/api");
|
|
61
64
|
|
|
62
65
|
app.use(
|
|
63
66
|
"*",
|
|
64
|
-
|
|
67
|
+
createPincerPayMiddleware({
|
|
65
68
|
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
66
69
|
merchantAddress: "YOUR_SOLANA_ADDRESS",
|
|
70
|
+
syncFacilitatorOnStart: false, // Avoids build-time network call during prerendering
|
|
67
71
|
routes: {
|
|
68
72
|
"GET /api/weather": {
|
|
69
73
|
price: "0.01",
|
|
@@ -74,58 +78,117 @@ app.use(
|
|
|
74
78
|
})
|
|
75
79
|
);
|
|
76
80
|
|
|
77
|
-
app.get("/
|
|
81
|
+
app.get("/weather", (c) => c.json({ temp: 72 }));
|
|
78
82
|
|
|
79
|
-
export
|
|
83
|
+
export const GET = handle(app);
|
|
84
|
+
export const POST = handle(app);
|
|
80
85
|
```
|
|
81
86
|
|
|
82
|
-
|
|
87
|
+
> **Note:** `basePath("/api")` must match the catch-all route location. Route handlers use paths relative to basePath (`/weather` serves `/api/weather`).
|
|
83
88
|
|
|
84
|
-
|
|
89
|
+
### Express
|
|
90
|
+
|
|
91
|
+
Express adapter is on the roadmap. Use Hono today — it runs anywhere Express does and is a drop-in for most paywall workloads. Track [the Express adapter issue](https://github.com/ds1/pincerpay/issues) for the upcoming release.
|
|
92
|
+
|
|
93
|
+
## Multi-chain Receiving Wallets
|
|
94
|
+
|
|
95
|
+
> **How routing works:** Agents pay on whichever chain they hold USDC; PincerPay routes settlement to your registered wallet on that chain. **No cross-chain conversion happens.** If you accept Solana and Polygon and an agent pays on Polygon, USDC arrives in your Polygon wallet.
|
|
96
|
+
|
|
97
|
+
Solana and EVM addresses are categorically different formats — a single string can't hold both. Use `merchantAddresses` to bind one wallet per chain:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
// Single-chain merchant (legacy — still supported)
|
|
101
|
+
createPincerPayMiddleware({
|
|
102
|
+
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
103
|
+
merchantAddress: "GjsWy1viAxWZkb4VyLVz3oU7sNpvyuKXnRu11uUybNgm",
|
|
104
|
+
routes: {
|
|
105
|
+
"GET /api/weather": { price: "0.01", chain: "solana" },
|
|
106
|
+
},
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
// Multi-chain merchant (recommended)
|
|
110
|
+
createPincerPayMiddleware({
|
|
111
|
+
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
112
|
+
merchantAddresses: {
|
|
113
|
+
solana: process.env.MERCHANT_ADDRESS_SOLANA!, // Solana base58
|
|
114
|
+
polygon: process.env.MERCHANT_ADDRESS_POLYGON!, // EVM 0x-hex
|
|
115
|
+
base: process.env.MERCHANT_ADDRESS_BASE!, // EVM 0x-hex
|
|
116
|
+
},
|
|
117
|
+
routes: {
|
|
118
|
+
"POST /api/trade": {
|
|
119
|
+
price: "0.05",
|
|
120
|
+
chains: ["solana", "polygon", "base"],
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
**Resolution rule.** For each route × chain combination, the middleware resolves `payTo` in this order:
|
|
127
|
+
1. `merchantAddresses[chainShorthand]` (case-insensitive key match)
|
|
128
|
+
2. `merchantAddress` (legacy single-string fallback)
|
|
129
|
+
3. Throws at middleware construction with a chain-named error.
|
|
130
|
+
|
|
131
|
+
You can have both fields set: `merchantAddresses` wins for chains in the map, `merchantAddress` covers the rest.
|
|
132
|
+
|
|
133
|
+
**Format validation is fail-fast.** A Solana base58 address under a `polygon` key (or vice versa) throws at init with a chain-named error message — not at request time, not at settle time.
|
|
134
|
+
|
|
135
|
+
### Troubleshooting
|
|
136
|
+
|
|
137
|
+
To check which address PincerPay would actually use for a given chain in your config:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { resolveMerchantAddress } from "@pincerpay/core";
|
|
141
|
+
|
|
142
|
+
resolveMerchantAddress(config, "polygon"); // "0x..."
|
|
143
|
+
resolveMerchantAddress(config, "solana"); // "GjsW..."
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
## Reading the Verified Payer
|
|
147
|
+
|
|
148
|
+
After successful settlement, the middleware surfaces the verified payer (and the rest of the settlement metadata) on the Hono request context under the `pincerpay` key. Your route handlers can attribute the action to the paying agent without re-decoding the `X-PAYMENT` request header.
|
|
85
149
|
|
|
86
150
|
```typescript
|
|
87
|
-
// app/api/[...route]/route.ts
|
|
88
151
|
import { Hono } from "hono";
|
|
89
|
-
import {
|
|
90
|
-
|
|
152
|
+
import {
|
|
153
|
+
createPincerPayMiddleware,
|
|
154
|
+
type PincerPayContextVariables,
|
|
155
|
+
} from "@pincerpay/merchant/nextjs";
|
|
91
156
|
|
|
92
|
-
const app = new Hono()
|
|
157
|
+
const app = new Hono<{ Variables: PincerPayContextVariables }>();
|
|
93
158
|
|
|
94
159
|
app.use(
|
|
95
160
|
"*",
|
|
96
|
-
|
|
161
|
+
createPincerPayMiddleware({
|
|
97
162
|
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
98
163
|
merchantAddress: "YOUR_SOLANA_ADDRESS",
|
|
99
|
-
syncFacilitatorOnStart: false, // Avoids build-time network call during prerendering
|
|
100
164
|
routes: {
|
|
101
|
-
"
|
|
102
|
-
price: "0.01",
|
|
103
|
-
chain: "solana",
|
|
104
|
-
description: "Current weather data",
|
|
105
|
-
},
|
|
165
|
+
"POST /api/trade": { price: "0.05", chain: "solana", description: "Place trade" },
|
|
106
166
|
},
|
|
107
167
|
})
|
|
108
168
|
);
|
|
109
169
|
|
|
110
|
-
app.
|
|
170
|
+
app.post("/api/trade", async (c) => {
|
|
171
|
+
const { payer, transaction, network } = c.get("pincerpay");
|
|
172
|
+
// payer -> verified agent wallet (Solana base58 or EVM 0x-hex)
|
|
173
|
+
// transaction -> settlement tx hash
|
|
174
|
+
// network -> CAIP-2 network id (e.g., "solana:5eykt4...", "eip155:8453")
|
|
111
175
|
|
|
112
|
-
|
|
113
|
-
|
|
176
|
+
await recordTrade({ agentWallet: payer, txHash: transaction });
|
|
177
|
+
return c.json({ ok: true });
|
|
178
|
+
});
|
|
114
179
|
```
|
|
115
180
|
|
|
116
|
-
|
|
181
|
+
`payer` comes from the facilitator's verified settle response — not the unverified `X-PAYMENT` request header. It is canonical across schemes (EVM `authorization.from`, Solana signer, etc. are all normalized to a single string).
|
|
117
182
|
|
|
118
|
-
> **
|
|
119
|
-
|
|
120
|
-
## API Reference
|
|
183
|
+
> **Don't re-decode `X-PAYMENT` to extract the payer.** The request header carries an unverified, scheme-specific payload. The middleware already verifies, settles, and surfaces the canonical payer on `c.get("pincerpay")`. If you find yourself probing `payload.authorization.from` / `payload.from` / `payload.signer`, stop — read `c.get("pincerpay").payer` instead.
|
|
121
184
|
|
|
122
|
-
|
|
185
|
+
The same `payer` field is also included in the base64-encoded `payment-response` response header for clients that bypass the middleware and post directly to `/v1/settle`.
|
|
123
186
|
|
|
124
|
-
|
|
187
|
+
## API Reference
|
|
125
188
|
|
|
126
|
-
### `
|
|
189
|
+
### `createPincerPayMiddleware(config): Hono.MiddlewareHandler`
|
|
127
190
|
|
|
128
|
-
Hono middleware with
|
|
191
|
+
Hono middleware that intercepts requests matching configured routes and returns HTTP 402 with x402 payment requirements. On a successful payment, settles via the PincerPay facilitator and sets `c.set("pincerpay", { payer, transaction, network })` before passing to the next handler. Used directly in Hono apps and inside Next.js App Router via `hono/vercel`.
|
|
129
192
|
|
|
130
193
|
### `PincerPayClient`
|
|
131
194
|
|
|
@@ -151,7 +214,10 @@ const supported = await client.getSupported();
|
|
|
151
214
|
```typescript
|
|
152
215
|
interface PincerPayConfig {
|
|
153
216
|
apiKey: string;
|
|
154
|
-
merchantAddress
|
|
217
|
+
/** Single-chain receiving wallet (legacy / fallback). At least one of `merchantAddress` or `merchantAddresses` must be set. */
|
|
218
|
+
merchantAddress?: string;
|
|
219
|
+
/** Per-chain receiving wallets. Keys are chain shorthands ("solana", "polygon", "base", "solana-devnet", ...). */
|
|
220
|
+
merchantAddresses?: Record<string, string>;
|
|
155
221
|
facilitatorUrl?: string; // defaults to https://facilitator.pincerpay.com
|
|
156
222
|
routes: Record<string, RoutePaywallConfig>;
|
|
157
223
|
syncFacilitatorOnStart?: boolean; // defer facilitator sync to first request (default: false)
|
|
@@ -163,6 +229,16 @@ interface RoutePaywallConfig {
|
|
|
163
229
|
chains?: string[]; // Multiple chains
|
|
164
230
|
description?: string; // Human-readable description
|
|
165
231
|
}
|
|
232
|
+
|
|
233
|
+
interface PincerPayPaymentInfo {
|
|
234
|
+
payer: string; // Verified agent wallet (Solana base58 or EVM 0x-hex)
|
|
235
|
+
transaction: string; // Settlement transaction hash
|
|
236
|
+
network: string; // CAIP-2 network id
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
type PincerPayContextVariables = {
|
|
240
|
+
pincerpay: PincerPayPaymentInfo;
|
|
241
|
+
};
|
|
166
242
|
```
|
|
167
243
|
|
|
168
244
|
### Utility Functions
|
|
@@ -184,7 +260,7 @@ getUsdcAsset("base"); // USDC contract address for Base
|
|
|
184
260
|
### Multi-chain pricing
|
|
185
261
|
|
|
186
262
|
```typescript
|
|
187
|
-
|
|
263
|
+
createPincerPayMiddleware({
|
|
188
264
|
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
189
265
|
merchantAddress: "YOUR_ADDRESS",
|
|
190
266
|
routes: {
|
|
@@ -202,7 +278,7 @@ pincerpay({
|
|
|
202
278
|
Routes not listed in `routes` pass through without payment. Only matching `METHOD /path` patterns trigger the 402 paywall.
|
|
203
279
|
|
|
204
280
|
```typescript
|
|
205
|
-
|
|
281
|
+
createPincerPayMiddleware({
|
|
206
282
|
apiKey: process.env.PINCERPAY_API_KEY!,
|
|
207
283
|
merchantAddress: "YOUR_ADDRESS",
|
|
208
284
|
routes: {
|
|
@@ -244,10 +320,10 @@ Your webhook secret is in the [dashboard settings](https://www.pincerpay.com/das
|
|
|
244
320
|
|
|
245
321
|
```typescript
|
|
246
322
|
// Bad
|
|
247
|
-
|
|
323
|
+
createPincerPayMiddleware({ apiKey: "pp_live_abc123...", ... });
|
|
248
324
|
|
|
249
325
|
// Good
|
|
250
|
-
|
|
326
|
+
createPincerPayMiddleware({ apiKey: process.env.PINCERPAY_API_KEY!, ... });
|
|
251
327
|
```
|
|
252
328
|
|
|
253
329
|
### Don't use the merchant SDK on the agent side
|
|
@@ -257,3 +333,7 @@ The merchant SDK is for servers accepting payments. Agents should use `@pincerpa
|
|
|
257
333
|
### Don't set price to "0"
|
|
258
334
|
|
|
259
335
|
A price of "0" will still trigger the 402 flow. If a route should be free, omit it from the `routes` config.
|
|
336
|
+
|
|
337
|
+
### Don't re-decode `X-PAYMENT` to find the payer
|
|
338
|
+
|
|
339
|
+
The verified payer is on `c.get("pincerpay").payer` after the middleware settles. Reading it from the request header bypasses verification and forces scheme-specific shape probing — see "Reading the Verified Payer" above.
|
package/dist/client.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ import type { PincerPayConfig, RoutePaywallConfig } from "@pincerpay/core";
|
|
|
6
6
|
export declare class PincerPayClient {
|
|
7
7
|
readonly facilitatorUrl: string;
|
|
8
8
|
readonly apiKey: string;
|
|
9
|
-
readonly merchantAddress
|
|
9
|
+
readonly merchantAddress?: string;
|
|
10
|
+
readonly merchantAddresses?: Record<string, string>;
|
|
10
11
|
constructor(config: PincerPayConfig);
|
|
11
12
|
private request;
|
|
12
13
|
verify(paymentPayload: unknown, paymentRequirements: unknown): Promise<unknown>;
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,eAAe,EACf,kBAAkB,EACnB,MAAM,iBAAiB,CAAC;AAGzB;;;GAGG;AACH,qBAAa,eAAe;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;gBAExC,MAAM,EAAE,eAAe;YAOrB,OAAO;IAmBf,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO;IAO5D,MAAM,CAAC,cAAc,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO;IAO5D,YAAY;IAIZ,SAAS,CAAC,MAAM,EAAE,MAAM;CAG/B;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAGtE;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAMlD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM,CAM3D"}
|
package/dist/client.js
CHANGED
|
@@ -8,10 +8,12 @@ export class PincerPayClient {
|
|
|
8
8
|
facilitatorUrl;
|
|
9
9
|
apiKey;
|
|
10
10
|
merchantAddress;
|
|
11
|
+
merchantAddresses;
|
|
11
12
|
constructor(config) {
|
|
12
13
|
this.facilitatorUrl = config.facilitatorUrl ?? DEFAULT_FACILITATOR_URL;
|
|
13
14
|
this.apiKey = config.apiKey;
|
|
14
15
|
this.merchantAddress = config.merchantAddress;
|
|
16
|
+
this.merchantAddresses = config.merchantAddresses;
|
|
15
17
|
}
|
|
16
18
|
async request(path, body) {
|
|
17
19
|
const url = `${this.facilitatorUrl}${path}`;
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,kBAAkB,EAClB,cAAc,GACf,MAAM,iBAAiB,CAAC;AAKzB,OAAO,EAAE,YAAY,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAExD;;;GAGG;AACH,MAAM,OAAO,eAAe;IACjB,cAAc,CAAS;IACvB,MAAM,CAAS;IACf,eAAe,
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { PincerPayConfig } from "@pincerpay/core";
|
|
1
|
+
import type { PincerPayConfig, PincerPayPaymentInfo, PincerPayContextVariables } from "@pincerpay/core";
|
|
2
|
+
export type { PincerPayPaymentInfo, PincerPayContextVariables };
|
|
2
3
|
/**
|
|
3
4
|
* Lightweight Next.js / Hono middleware for PincerPay x402 paywalls.
|
|
4
5
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/middleware/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"nextjs.d.ts","sourceRoot":"","sources":["../../src/middleware/nextjs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,eAAe,EACf,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,iBAAiB,CAAC;AAWzB,YAAY,EAAE,oBAAoB,EAAE,yBAAyB,EAAE,CAAC;AAahE;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,eAAe,GA+NzD,GAAG,CACV"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { resolveChain, DEFAULT_FACILITATOR_URL, API_KEY_HEADER, FACILITATOR_ROUTES, } from "@pincerpay/core";
|
|
1
|
+
import { resolveChain, resolveMerchantAddress, validateMerchantAddressForChain, DEFAULT_FACILITATOR_URL, API_KEY_HEADER, FACILITATOR_ROUTES, } from "@pincerpay/core";
|
|
2
2
|
/**
|
|
3
3
|
* Convert human-readable USDC price (e.g., "0.01") to base units (e.g., "10000").
|
|
4
4
|
*/
|
|
@@ -59,10 +59,12 @@ export function createPincerPayMiddleware(config) {
|
|
|
59
59
|
})
|
|
60
60
|
.catch(() => new Map());
|
|
61
61
|
const resolvedRoutes = new Map();
|
|
62
|
-
// Default extra fields per namespace
|
|
63
|
-
|
|
62
|
+
// Default extra fields per namespace. `feePayer` defaults to the resolved
|
|
63
|
+
// Solana payTo and is overridden by the facilitator's `/supported` response
|
|
64
|
+
// once it lands.
|
|
65
|
+
function defaultExtra(namespace, payTo) {
|
|
64
66
|
return namespace === "solana"
|
|
65
|
-
? { feePayer:
|
|
67
|
+
? { feePayer: payTo }
|
|
66
68
|
: { name: "USD Coin", version: "2" };
|
|
67
69
|
}
|
|
68
70
|
for (const [pattern, routeConfig] of Object.entries(config.routes)) {
|
|
@@ -72,14 +74,22 @@ export function createPincerPayMiddleware(config) {
|
|
|
72
74
|
const chain = resolveChain(chainShorthand);
|
|
73
75
|
if (!chain)
|
|
74
76
|
throw new Error(`Unknown chain: ${chainShorthand}`);
|
|
77
|
+
const payTo = resolveMerchantAddress(config, chainShorthand);
|
|
78
|
+
if (!payTo) {
|
|
79
|
+
throw new Error(`[pincerpay] Route ${JSON.stringify(pattern)} targets chain ${JSON.stringify(chainShorthand)} but no receiving wallet was found. Set merchantAddresses.${chainShorthand} or a legacy merchantAddress.`);
|
|
80
|
+
}
|
|
81
|
+
const formatError = validateMerchantAddressForChain(payTo, chainShorthand);
|
|
82
|
+
if (formatError) {
|
|
83
|
+
throw new Error(`[pincerpay] Route ${JSON.stringify(pattern)} targets chain ${JSON.stringify(chainShorthand)}: ${formatError}`);
|
|
84
|
+
}
|
|
75
85
|
return {
|
|
76
86
|
scheme: "exact",
|
|
77
87
|
network: chain.caip2Id,
|
|
78
88
|
amount: toBaseUnits(routeConfig.price),
|
|
79
89
|
asset: chain.usdcAddress,
|
|
80
|
-
payTo
|
|
90
|
+
payTo,
|
|
81
91
|
maxTimeoutSeconds: 300,
|
|
82
|
-
extra: defaultExtra(chain.namespace),
|
|
92
|
+
extra: defaultExtra(chain.namespace, payTo),
|
|
83
93
|
};
|
|
84
94
|
});
|
|
85
95
|
resolvedRoutes.set(pattern, {
|
|
@@ -162,12 +172,22 @@ export function createPincerPayMiddleware(config) {
|
|
|
162
172
|
message: settle.errorMessage,
|
|
163
173
|
}, 402);
|
|
164
174
|
}
|
|
165
|
-
// Payment succeeded —
|
|
175
|
+
// Payment succeeded — surface verified payer on the request context
|
|
176
|
+
// so route handlers can attribute the action without re-decoding X-PAYMENT.
|
|
177
|
+
const paymentInfo = {
|
|
178
|
+
payer: settle.payer ?? "",
|
|
179
|
+
transaction: settle.transaction ?? "",
|
|
180
|
+
network: settle.network ?? "",
|
|
181
|
+
};
|
|
182
|
+
c.set("pincerpay", paymentInfo);
|
|
183
|
+
// Attach settlement response header (clients that bypass middleware
|
|
184
|
+
// can read the canonical verified payer here too).
|
|
166
185
|
const settleResponse = {
|
|
167
186
|
x402Version: 2,
|
|
168
187
|
success: true,
|
|
169
|
-
transaction:
|
|
170
|
-
network:
|
|
188
|
+
transaction: paymentInfo.transaction,
|
|
189
|
+
network: paymentInfo.network,
|
|
190
|
+
payer: paymentInfo.payer,
|
|
171
191
|
};
|
|
172
192
|
c.header("payment-response", Buffer.from(JSON.stringify(settleResponse)).toString("base64"));
|
|
173
193
|
return next();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/middleware/nextjs.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"nextjs.js","sourceRoot":"","sources":["../../src/middleware/nextjs.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pincerpay/merchant",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Merchant SDK for PincerPay. Lightweight Next.js middleware for accepting USDC payments from AI agents via x402.",
|
|
6
6
|
"license": "MIT",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"dependencies": {
|
|
57
57
|
"zod": "^3.24",
|
|
58
|
-
"@pincerpay/core": "0.
|
|
58
|
+
"@pincerpay/core": "0.6.0"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"hono": "^4"
|