@perkos/agent-sdk 0.2.0 → 0.3.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.
- package/CHANGELOG.md +35 -0
- package/README.md +21 -5
- package/SECURITY.md +12 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/x402-direct.d.ts +16 -0
- package/dist/x402-direct.d.ts.map +1 -1
- package/dist/x402-direct.js +43 -26
- package/dist/x402-direct.js.map +1 -1
- package/dist/x402-paying.d.ts +193 -0
- package/dist/x402-paying.d.ts.map +1 -0
- package/dist/x402-paying.js +587 -0
- package/dist/x402-paying.js.map +1 -0
- package/docs/X402_PAYMENTS.md +143 -0
- package/docs/plans/2026-08-27-x402-nonce-zero-hotfix-design.md +32 -0
- package/docs/plans/2026-08-27-x402-paying-flow-design.md +125 -0
- package/examples/x402-payment-intent.ts +81 -0
- package/package.json +3 -1
|
@@ -0,0 +1,587 @@
|
|
|
1
|
+
import { bufferCVFromString, getAddressFromPublicKey, makeUnsignedContractCall, makeUnsignedSTXTokenTransfer, noneCV, someCV, standardPrincipalCV, transactionToHex, uintCV, } from "@stacks/transactions";
|
|
2
|
+
import { PerkOSError } from "./errors.js";
|
|
3
|
+
import { assertPrincipal, toUint } from "./validation.js";
|
|
4
|
+
import { NayoriX402DirectVerificationError, createNayoriX402DirectPaymentPayload, getNayoriX402Asset, validateNayoriX402PaymentContext, verifyNayoriX402DirectPayment, } from "./x402-direct.js";
|
|
5
|
+
export const NAYORI_X402_PAYMENT_INTENT_VERSION = 1;
|
|
6
|
+
export const NAYORI_X402_PAYMENT_INTENT_PREFIX = "nyi_";
|
|
7
|
+
const PUBLIC_KEY_PATTERN = /^(02|03)[0-9a-f]{64}$/;
|
|
8
|
+
const TRANSACTION_HEX_PATTERN = /^(?:0x)?[0-9a-fA-F]+$/;
|
|
9
|
+
const MAX_SIGNED_QUOTE_BYTES = 16_384;
|
|
10
|
+
const MAX_TRANSACTION_HEX_CHARACTERS = 32_768;
|
|
11
|
+
const PAYMENT_ASSETS = new Set(["stx", "sbtc", "usdcx"]);
|
|
12
|
+
const PAYMENT_NETWORKS = new Set(["mainnet", "testnet"]);
|
|
13
|
+
function nonEmpty(values, field) {
|
|
14
|
+
if (!Array.isArray(values) || values.length === 0) {
|
|
15
|
+
throw new PerkOSError("CONFIG_INVALID", `${field} must contain at least one value.`);
|
|
16
|
+
}
|
|
17
|
+
return values;
|
|
18
|
+
}
|
|
19
|
+
function normalizePublicKey(value) {
|
|
20
|
+
const publicKey = value.trim().toLowerCase().replace(/^0x/, "");
|
|
21
|
+
if (!PUBLIC_KEY_PATTERN.test(publicKey)) {
|
|
22
|
+
throw new PerkOSError("CONFIG_INVALID", "The x402 payer public key must be a compressed secp256k1 public key.");
|
|
23
|
+
}
|
|
24
|
+
return publicKey;
|
|
25
|
+
}
|
|
26
|
+
function validateSignerIdentity(network, addressValue, publicKeyValue) {
|
|
27
|
+
const address = addressValue.trim();
|
|
28
|
+
assertPrincipal(address, "x402 payer address", network);
|
|
29
|
+
const publicKey = normalizePublicKey(publicKeyValue);
|
|
30
|
+
let derivedAddress;
|
|
31
|
+
try {
|
|
32
|
+
derivedAddress = getAddressFromPublicKey(publicKey, network);
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
throw new PerkOSError("CONFIG_INVALID", "The x402 payer public key is invalid.");
|
|
36
|
+
}
|
|
37
|
+
if (derivedAddress !== address) {
|
|
38
|
+
throw new PerkOSError("SIGNER_MISMATCH", "The x402 payer public key does not derive the configured address.");
|
|
39
|
+
}
|
|
40
|
+
return { address, publicKey };
|
|
41
|
+
}
|
|
42
|
+
function normalizeTransactionHex(value) {
|
|
43
|
+
if (typeof value !== "string" ||
|
|
44
|
+
value.length === 0 ||
|
|
45
|
+
value.length > MAX_TRANSACTION_HEX_CHARACTERS ||
|
|
46
|
+
value.replace(/^0x/, "").length % 2 !== 0 ||
|
|
47
|
+
!TRANSACTION_HEX_PATTERN.test(value)) {
|
|
48
|
+
throw new PerkOSError("SIGNING_FAILED", "The signer returned an invalid transaction.");
|
|
49
|
+
}
|
|
50
|
+
return value.replace(/^0x/, "").toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
function signedTransactionFrom(value) {
|
|
53
|
+
if (typeof value === "string") {
|
|
54
|
+
return Object.freeze({ transaction: normalizeTransactionHex(value) });
|
|
55
|
+
}
|
|
56
|
+
if (!value || typeof value !== "object") {
|
|
57
|
+
throw new PerkOSError("SIGNING_FAILED", "The signer did not return a signed transaction.");
|
|
58
|
+
}
|
|
59
|
+
const record = value;
|
|
60
|
+
const nested = record.result && typeof record.result === "object"
|
|
61
|
+
? record.result
|
|
62
|
+
: undefined;
|
|
63
|
+
const transaction = record.transaction ?? record.txRaw ?? nested?.transaction ?? nested?.txRaw;
|
|
64
|
+
return Object.freeze({ transaction: normalizeTransactionHex(transaction) });
|
|
65
|
+
}
|
|
66
|
+
async function sha256Hex(value) {
|
|
67
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
|
|
68
|
+
return Array.from(new Uint8Array(digest), (byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
69
|
+
}
|
|
70
|
+
function freezeRequirements(requirement) {
|
|
71
|
+
return Object.freeze({
|
|
72
|
+
...requirement,
|
|
73
|
+
...(requirement.extra ? { extra: Object.freeze({ ...requirement.extra }) } : {}),
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function freezePaymentPayload(paymentPayload) {
|
|
77
|
+
return Object.freeze({
|
|
78
|
+
...paymentPayload,
|
|
79
|
+
...(paymentPayload.resource
|
|
80
|
+
? { resource: Object.freeze({ ...paymentPayload.resource }) }
|
|
81
|
+
: {}),
|
|
82
|
+
accepted: paymentPayload.accepted,
|
|
83
|
+
payload: Object.freeze({ ...paymentPayload.payload }),
|
|
84
|
+
extensions: Object.freeze({ ...paymentPayload.extensions }),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
function freezeQuote(quote) {
|
|
88
|
+
return Object.freeze({ ...quote });
|
|
89
|
+
}
|
|
90
|
+
function contextError(cause) {
|
|
91
|
+
if (cause instanceof NayoriX402DirectVerificationError) {
|
|
92
|
+
return new PerkOSError("X402_INVALID", cause.message, { reason: cause.reason });
|
|
93
|
+
}
|
|
94
|
+
if (cause instanceof PerkOSError)
|
|
95
|
+
return cause;
|
|
96
|
+
return new PerkOSError("X402_INVALID", "The x402 payment context is invalid.");
|
|
97
|
+
}
|
|
98
|
+
function signedPaymentError(cause) {
|
|
99
|
+
if (cause instanceof NayoriX402DirectVerificationError) {
|
|
100
|
+
return new PerkOSError("SIGNING_FAILED", "The signer returned a transaction that failed local x402 verification.", { reason: cause.reason });
|
|
101
|
+
}
|
|
102
|
+
if (cause instanceof PerkOSError)
|
|
103
|
+
return cause;
|
|
104
|
+
return new PerkOSError("SIGNING_FAILED", "The signer returned a transaction that could not be verified.");
|
|
105
|
+
}
|
|
106
|
+
export async function createNayoriX402PaymentIntent(input) {
|
|
107
|
+
const paymentRequirements = freezeRequirements(input.paymentRequirements);
|
|
108
|
+
const quote = freezeQuote(input.quote);
|
|
109
|
+
const request = Object.freeze({
|
|
110
|
+
method: input.request.method,
|
|
111
|
+
url: input.request.url,
|
|
112
|
+
...(input.request.body === undefined
|
|
113
|
+
? {}
|
|
114
|
+
: {
|
|
115
|
+
body: typeof input.request.body === "string"
|
|
116
|
+
? input.request.body
|
|
117
|
+
: Uint8Array.from(input.request.body),
|
|
118
|
+
}),
|
|
119
|
+
});
|
|
120
|
+
let context;
|
|
121
|
+
try {
|
|
122
|
+
context = await validateNayoriX402PaymentContext({
|
|
123
|
+
paymentRequirements,
|
|
124
|
+
trustedQuote: quote,
|
|
125
|
+
request,
|
|
126
|
+
...(input.nowSeconds === undefined ? {} : { nowSeconds: input.nowSeconds }),
|
|
127
|
+
...(input.clockSkewSeconds === undefined
|
|
128
|
+
? {}
|
|
129
|
+
: { clockSkewSeconds: input.clockSkewSeconds }),
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
catch (cause) {
|
|
133
|
+
throw contextError(cause);
|
|
134
|
+
}
|
|
135
|
+
const identity = validateSignerIdentity(context.network, input.payer, input.publicKey);
|
|
136
|
+
const fee = toUint(input.fee, "fee");
|
|
137
|
+
const nonce = toUint(input.nonce, "nonce", true);
|
|
138
|
+
if (fee === 0n) {
|
|
139
|
+
throw new PerkOSError("INPUT_INVALID", "fee must be greater than zero.");
|
|
140
|
+
}
|
|
141
|
+
const canonical = {
|
|
142
|
+
version: NAYORI_X402_PAYMENT_INTENT_VERSION,
|
|
143
|
+
quoteId: context.quote.quoteId,
|
|
144
|
+
merchantId: context.quote.merchantId,
|
|
145
|
+
network: context.network,
|
|
146
|
+
asset: context.quote.paymentAsset,
|
|
147
|
+
amount: context.quote.amount,
|
|
148
|
+
payTo: context.quote.payTo,
|
|
149
|
+
payer: identity.address,
|
|
150
|
+
publicKey: identity.publicKey,
|
|
151
|
+
fee: fee.toString(),
|
|
152
|
+
nonce: nonce.toString(),
|
|
153
|
+
method: context.quote.method,
|
|
154
|
+
url: context.quote.url,
|
|
155
|
+
bodySha256: context.quote.bodySha256,
|
|
156
|
+
issuedAt: context.quote.issuedAt,
|
|
157
|
+
expiresAt: context.quote.expiresAt,
|
|
158
|
+
quoteFingerprint: context.quoteFingerprint,
|
|
159
|
+
};
|
|
160
|
+
const intentId = `${NAYORI_X402_PAYMENT_INTENT_PREFIX}${await sha256Hex(`nayori-x402-payment-intent-v1\n${JSON.stringify(canonical)}`)}`;
|
|
161
|
+
return Object.freeze({ ...canonical, intentId });
|
|
162
|
+
}
|
|
163
|
+
function resolveLimits(input, allowedAssets, field) {
|
|
164
|
+
const limits = {};
|
|
165
|
+
for (const asset of allowedAssets) {
|
|
166
|
+
const value = input[asset];
|
|
167
|
+
if (value === undefined) {
|
|
168
|
+
throw new PerkOSError("POLICY_LIMIT_REQUIRED", `${field}.${asset} is required for an allowed payment asset.`);
|
|
169
|
+
}
|
|
170
|
+
const amount = toUint(value, `${field}.${asset}`);
|
|
171
|
+
if (amount === 0n) {
|
|
172
|
+
throw new PerkOSError("CONFIG_INVALID", `${field}.${asset} must be greater than zero.`);
|
|
173
|
+
}
|
|
174
|
+
limits[asset] = amount;
|
|
175
|
+
}
|
|
176
|
+
return limits;
|
|
177
|
+
}
|
|
178
|
+
function canonicalOrigin(value) {
|
|
179
|
+
let parsed;
|
|
180
|
+
try {
|
|
181
|
+
parsed = new URL(value);
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
throw new PerkOSError("CONFIG_INVALID", "allowedOrigins contains an invalid URL.");
|
|
185
|
+
}
|
|
186
|
+
if (parsed.protocol !== "https:" || parsed.origin !== value) {
|
|
187
|
+
throw new PerkOSError("CONFIG_INVALID", "allowedOrigins must contain canonical HTTPS origins.");
|
|
188
|
+
}
|
|
189
|
+
return parsed.origin;
|
|
190
|
+
}
|
|
191
|
+
export class NayoriX402PaymentPolicy {
|
|
192
|
+
allowedNetworks;
|
|
193
|
+
allowedAssets;
|
|
194
|
+
allowedRecipients;
|
|
195
|
+
allowedOrigins;
|
|
196
|
+
allowedMerchantIds;
|
|
197
|
+
maxPerTransaction;
|
|
198
|
+
maxPerSession;
|
|
199
|
+
maxFeePerTransaction;
|
|
200
|
+
maxFeePerSession;
|
|
201
|
+
minQuoteValiditySeconds;
|
|
202
|
+
nowSeconds;
|
|
203
|
+
spent = {
|
|
204
|
+
stx: 0n,
|
|
205
|
+
sbtc: 0n,
|
|
206
|
+
usdcx: 0n,
|
|
207
|
+
};
|
|
208
|
+
reserved = {
|
|
209
|
+
stx: 0n,
|
|
210
|
+
sbtc: 0n,
|
|
211
|
+
usdcx: 0n,
|
|
212
|
+
};
|
|
213
|
+
feeSpent = 0n;
|
|
214
|
+
feeReserved = 0n;
|
|
215
|
+
active = new Map();
|
|
216
|
+
committed = new Set();
|
|
217
|
+
activeQuotes = new Set();
|
|
218
|
+
committedQuotes = new Set();
|
|
219
|
+
constructor(input, nowSeconds) {
|
|
220
|
+
this.allowedNetworks = new Set(nonEmpty(input.allowedNetworks, "allowedNetworks"));
|
|
221
|
+
this.allowedAssets = new Set(nonEmpty(input.allowedAssets, "allowedAssets"));
|
|
222
|
+
if ([...this.allowedNetworks].some((network) => !PAYMENT_NETWORKS.has(network))) {
|
|
223
|
+
throw new PerkOSError("CONFIG_INVALID", "allowedNetworks contains an unsupported network.");
|
|
224
|
+
}
|
|
225
|
+
if ([...this.allowedAssets].some((asset) => !PAYMENT_ASSETS.has(asset))) {
|
|
226
|
+
throw new PerkOSError("CONFIG_INVALID", "allowedAssets contains an unsupported asset.");
|
|
227
|
+
}
|
|
228
|
+
this.allowedRecipients = new Set(nonEmpty(input.allowedRecipients, "allowedRecipients"));
|
|
229
|
+
this.allowedOrigins = new Set(nonEmpty(input.allowedOrigins, "allowedOrigins").map(canonicalOrigin));
|
|
230
|
+
this.allowedMerchantIds = input.allowedMerchantIds
|
|
231
|
+
? new Set(nonEmpty(input.allowedMerchantIds, "allowedMerchantIds"))
|
|
232
|
+
: undefined;
|
|
233
|
+
this.maxPerTransaction = resolveLimits(input.maxPerTransaction, this.allowedAssets, "maxPerTransaction");
|
|
234
|
+
this.maxPerSession = resolveLimits(input.maxPerSession, this.allowedAssets, "maxPerSession");
|
|
235
|
+
this.maxFeePerTransaction = toUint(input.maxFeePerTransaction, "maxFeePerTransaction");
|
|
236
|
+
this.maxFeePerSession = toUint(input.maxFeePerSession, "maxFeePerSession");
|
|
237
|
+
if (this.maxFeePerTransaction === 0n || this.maxFeePerSession === 0n) {
|
|
238
|
+
throw new PerkOSError("CONFIG_INVALID", "Fee limits must be greater than zero.");
|
|
239
|
+
}
|
|
240
|
+
if (this.maxFeePerTransaction > this.maxFeePerSession) {
|
|
241
|
+
throw new PerkOSError("CONFIG_INVALID", "maxFeePerTransaction cannot exceed maxFeePerSession.");
|
|
242
|
+
}
|
|
243
|
+
for (const asset of this.allowedAssets) {
|
|
244
|
+
if (this.maxPerTransaction[asset] > this.maxPerSession[asset]) {
|
|
245
|
+
throw new PerkOSError("CONFIG_INVALID", `maxPerTransaction.${asset} cannot exceed maxPerSession.${asset}.`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
this.minQuoteValiditySeconds = input.minQuoteValiditySeconds ?? 15;
|
|
249
|
+
if (!Number.isSafeInteger(this.minQuoteValiditySeconds) ||
|
|
250
|
+
this.minQuoteValiditySeconds < 0) {
|
|
251
|
+
throw new PerkOSError("CONFIG_INVALID", "minQuoteValiditySeconds must be a non-negative safe integer.");
|
|
252
|
+
}
|
|
253
|
+
if (nowSeconds !== undefined && typeof nowSeconds !== "function") {
|
|
254
|
+
throw new PerkOSError("CONFIG_INVALID", "The payment policy clock must be a function.");
|
|
255
|
+
}
|
|
256
|
+
this.nowSeconds = nowSeconds ?? (() => Math.floor(Date.now() / 1_000));
|
|
257
|
+
}
|
|
258
|
+
reserve(intent) {
|
|
259
|
+
if (this.committed.has(intent.intentId) ||
|
|
260
|
+
this.active.has(intent.intentId) ||
|
|
261
|
+
this.committedQuotes.has(intent.quoteFingerprint) ||
|
|
262
|
+
this.activeQuotes.has(intent.quoteFingerprint)) {
|
|
263
|
+
throw new PerkOSError("POLICY_DENIED", "The payment quote was already authorized.", {
|
|
264
|
+
intentId: intent.intentId,
|
|
265
|
+
});
|
|
266
|
+
}
|
|
267
|
+
if (!this.allowedNetworks.has(intent.network)) {
|
|
268
|
+
throw new PerkOSError("POLICY_DENIED", `Network ${intent.network} is not allowed.`);
|
|
269
|
+
}
|
|
270
|
+
if (!this.allowedAssets.has(intent.asset)) {
|
|
271
|
+
throw new PerkOSError("POLICY_DENIED", `Asset ${intent.asset} is not allowed.`);
|
|
272
|
+
}
|
|
273
|
+
if (!this.allowedRecipients.has(intent.payTo)) {
|
|
274
|
+
throw new PerkOSError("POLICY_DENIED", "The payment recipient is not allowed.");
|
|
275
|
+
}
|
|
276
|
+
const origin = new URL(intent.url).origin;
|
|
277
|
+
if (!this.allowedOrigins.has(origin)) {
|
|
278
|
+
throw new PerkOSError("POLICY_DENIED", `Origin ${origin} is not allowed.`);
|
|
279
|
+
}
|
|
280
|
+
if (this.allowedMerchantIds && !this.allowedMerchantIds.has(intent.merchantId)) {
|
|
281
|
+
throw new PerkOSError("POLICY_DENIED", "The quote merchant is not allowed.");
|
|
282
|
+
}
|
|
283
|
+
const now = this.nowSeconds();
|
|
284
|
+
if (!Number.isSafeInteger(now) || now < 0) {
|
|
285
|
+
throw new PerkOSError("CONFIG_INVALID", "The payment policy clock is invalid.");
|
|
286
|
+
}
|
|
287
|
+
if (intent.expiresAt - now < this.minQuoteValiditySeconds) {
|
|
288
|
+
throw new PerkOSError("POLICY_DENIED", "The quote does not have enough validity remaining for safe signing.");
|
|
289
|
+
}
|
|
290
|
+
const amount = BigInt(intent.amount);
|
|
291
|
+
const fee = BigInt(intent.fee);
|
|
292
|
+
const transactionLimit = this.maxPerTransaction[intent.asset];
|
|
293
|
+
const sessionLimit = this.maxPerSession[intent.asset];
|
|
294
|
+
if (amount > transactionLimit) {
|
|
295
|
+
throw new PerkOSError("POLICY_DENIED", `Payment amount exceeds the ${intent.asset} per-transaction limit.`);
|
|
296
|
+
}
|
|
297
|
+
const nextAmount = this.spent[intent.asset] + this.reserved[intent.asset] + amount;
|
|
298
|
+
if (nextAmount > sessionLimit) {
|
|
299
|
+
throw new PerkOSError("POLICY_DENIED", `Payment would exceed the ${intent.asset} session limit.`);
|
|
300
|
+
}
|
|
301
|
+
if (fee > this.maxFeePerTransaction) {
|
|
302
|
+
throw new PerkOSError("POLICY_DENIED", "Payment fee exceeds the per-transaction limit.");
|
|
303
|
+
}
|
|
304
|
+
const nextFee = this.feeSpent + this.feeReserved + fee;
|
|
305
|
+
if (nextFee > this.maxFeePerSession) {
|
|
306
|
+
throw new PerkOSError("POLICY_DENIED", "Payment fee would exceed the session limit.");
|
|
307
|
+
}
|
|
308
|
+
const spentThisSession = this.spent[intent.asset];
|
|
309
|
+
const reservedThisSession = this.reserved[intent.asset];
|
|
310
|
+
this.reserved[intent.asset] += amount;
|
|
311
|
+
this.feeReserved += fee;
|
|
312
|
+
this.active.set(intent.intentId, { intent, amount, fee });
|
|
313
|
+
this.activeQuotes.add(intent.quoteFingerprint);
|
|
314
|
+
let finished = false;
|
|
315
|
+
const finish = (commit) => {
|
|
316
|
+
if (finished)
|
|
317
|
+
return;
|
|
318
|
+
finished = true;
|
|
319
|
+
this.finish(intent.intentId, commit);
|
|
320
|
+
};
|
|
321
|
+
return Object.freeze({
|
|
322
|
+
intentId: intent.intentId,
|
|
323
|
+
asset: intent.asset,
|
|
324
|
+
amount,
|
|
325
|
+
fee,
|
|
326
|
+
spentThisSession,
|
|
327
|
+
reservedThisSession,
|
|
328
|
+
remainingThisSession: sessionLimit - nextAmount,
|
|
329
|
+
commit: () => finish(true),
|
|
330
|
+
release: () => finish(false),
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
usage(asset) {
|
|
334
|
+
const maximum = this.maxPerSession[asset] ?? 0n;
|
|
335
|
+
return Object.freeze({
|
|
336
|
+
asset,
|
|
337
|
+
spent: this.spent[asset],
|
|
338
|
+
reserved: this.reserved[asset],
|
|
339
|
+
remaining: maximum - this.spent[asset] - this.reserved[asset],
|
|
340
|
+
feeSpent: this.feeSpent,
|
|
341
|
+
feeReserved: this.feeReserved,
|
|
342
|
+
feeRemaining: this.maxFeePerSession - this.feeSpent - this.feeReserved,
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
finish(intentId, commit) {
|
|
346
|
+
const record = this.active.get(intentId);
|
|
347
|
+
if (!record)
|
|
348
|
+
return;
|
|
349
|
+
this.active.delete(intentId);
|
|
350
|
+
this.activeQuotes.delete(record.intent.quoteFingerprint);
|
|
351
|
+
this.reserved[record.intent.asset] -= record.amount;
|
|
352
|
+
this.feeReserved -= record.fee;
|
|
353
|
+
if (commit) {
|
|
354
|
+
this.spent[record.intent.asset] += record.amount;
|
|
355
|
+
this.feeSpent += record.fee;
|
|
356
|
+
this.committed.add(intentId);
|
|
357
|
+
this.committedQuotes.add(record.intent.quoteFingerprint);
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
export class LeatherSigner {
|
|
362
|
+
network;
|
|
363
|
+
address;
|
|
364
|
+
publicKey;
|
|
365
|
+
request;
|
|
366
|
+
constructor(options) {
|
|
367
|
+
if (typeof options.request !== "function") {
|
|
368
|
+
throw new PerkOSError("CONFIG_INVALID", "LeatherSigner requires a request callback.");
|
|
369
|
+
}
|
|
370
|
+
const identity = validateSignerIdentity(options.network, options.address, options.publicKey);
|
|
371
|
+
this.network = options.network;
|
|
372
|
+
this.address = identity.address;
|
|
373
|
+
this.publicKey = identity.publicKey;
|
|
374
|
+
this.request = options.request;
|
|
375
|
+
}
|
|
376
|
+
getAddress() {
|
|
377
|
+
return this.address;
|
|
378
|
+
}
|
|
379
|
+
getPublicKey() {
|
|
380
|
+
return this.publicKey;
|
|
381
|
+
}
|
|
382
|
+
async signTransaction(request) {
|
|
383
|
+
this.assertIntent(request.intent);
|
|
384
|
+
try {
|
|
385
|
+
const result = await this.request("stx_signTransaction", {
|
|
386
|
+
transaction: request.transaction,
|
|
387
|
+
broadcast: false,
|
|
388
|
+
});
|
|
389
|
+
return signedTransactionFrom(result);
|
|
390
|
+
}
|
|
391
|
+
catch (cause) {
|
|
392
|
+
if (cause instanceof PerkOSError)
|
|
393
|
+
throw cause;
|
|
394
|
+
throw new PerkOSError("SIGNING_FAILED", "Leather rejected or cancelled the x402 payment signature.", { intentId: request.intent.intentId });
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
assertIntent(intent) {
|
|
398
|
+
if (intent.network !== this.network ||
|
|
399
|
+
intent.payer !== this.address ||
|
|
400
|
+
intent.publicKey !== this.publicKey) {
|
|
401
|
+
throw new PerkOSError("SIGNER_MISMATCH", "LeatherSigner does not match the payment intent.");
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
export class PolicySigner {
|
|
406
|
+
network;
|
|
407
|
+
address;
|
|
408
|
+
publicKey;
|
|
409
|
+
sign;
|
|
410
|
+
constructor(options) {
|
|
411
|
+
if (typeof options.sign !== "function") {
|
|
412
|
+
throw new PerkOSError("CONFIG_INVALID", "PolicySigner requires a signing callback.");
|
|
413
|
+
}
|
|
414
|
+
const identity = validateSignerIdentity(options.network, options.address, options.publicKey);
|
|
415
|
+
this.network = options.network;
|
|
416
|
+
this.address = identity.address;
|
|
417
|
+
this.publicKey = identity.publicKey;
|
|
418
|
+
this.sign = options.sign;
|
|
419
|
+
}
|
|
420
|
+
getAddress() {
|
|
421
|
+
return this.address;
|
|
422
|
+
}
|
|
423
|
+
getPublicKey() {
|
|
424
|
+
return this.publicKey;
|
|
425
|
+
}
|
|
426
|
+
async signTransaction(request) {
|
|
427
|
+
if (request.intent.network !== this.network ||
|
|
428
|
+
request.intent.payer !== this.address ||
|
|
429
|
+
request.intent.publicKey !== this.publicKey) {
|
|
430
|
+
throw new PerkOSError("SIGNER_MISMATCH", "PolicySigner does not match the payment intent.");
|
|
431
|
+
}
|
|
432
|
+
try {
|
|
433
|
+
return signedTransactionFrom(await this.sign(request));
|
|
434
|
+
}
|
|
435
|
+
catch (cause) {
|
|
436
|
+
if (cause instanceof PerkOSError)
|
|
437
|
+
throw cause;
|
|
438
|
+
throw new PerkOSError("SIGNING_FAILED", "The remote policy signer rejected the x402 payment signature.", { intentId: request.intent.intentId });
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
export async function buildNayoriX402UnsignedPaymentTransaction(intent) {
|
|
443
|
+
const definition = getNayoriX402Asset(intent.network, intent.asset);
|
|
444
|
+
const amount = BigInt(intent.amount);
|
|
445
|
+
const fee = BigInt(intent.fee);
|
|
446
|
+
const nonce = BigInt(intent.nonce);
|
|
447
|
+
if (definition.kind === "stx") {
|
|
448
|
+
const transaction = await makeUnsignedSTXTokenTransfer({
|
|
449
|
+
recipient: intent.payTo,
|
|
450
|
+
amount,
|
|
451
|
+
memo: intent.quoteFingerprint,
|
|
452
|
+
publicKey: intent.publicKey,
|
|
453
|
+
network: intent.network,
|
|
454
|
+
fee,
|
|
455
|
+
nonce,
|
|
456
|
+
sponsored: false,
|
|
457
|
+
});
|
|
458
|
+
return transactionToHex(transaction).toLowerCase();
|
|
459
|
+
}
|
|
460
|
+
const [contractAddress, contractName] = definition.contract.split(".");
|
|
461
|
+
if (!contractAddress || !contractName) {
|
|
462
|
+
throw new PerkOSError("X402_INVALID", "The canonical SIP-010 contract is invalid.");
|
|
463
|
+
}
|
|
464
|
+
const transaction = await makeUnsignedContractCall({
|
|
465
|
+
contractAddress,
|
|
466
|
+
contractName,
|
|
467
|
+
functionName: "transfer",
|
|
468
|
+
functionArgs: [
|
|
469
|
+
uintCV(amount),
|
|
470
|
+
standardPrincipalCV(intent.payer),
|
|
471
|
+
standardPrincipalCV(intent.payTo),
|
|
472
|
+
intent.quoteFingerprint
|
|
473
|
+
? someCV(bufferCVFromString(intent.quoteFingerprint))
|
|
474
|
+
: noneCV(),
|
|
475
|
+
],
|
|
476
|
+
publicKey: intent.publicKey,
|
|
477
|
+
network: intent.network,
|
|
478
|
+
fee,
|
|
479
|
+
nonce,
|
|
480
|
+
sponsored: false,
|
|
481
|
+
postConditionMode: "deny",
|
|
482
|
+
postConditions: [
|
|
483
|
+
{
|
|
484
|
+
type: "ft-postcondition",
|
|
485
|
+
address: intent.payer,
|
|
486
|
+
condition: "eq",
|
|
487
|
+
amount,
|
|
488
|
+
asset: definition.postConditionAsset,
|
|
489
|
+
},
|
|
490
|
+
],
|
|
491
|
+
});
|
|
492
|
+
return transactionToHex(transaction).toLowerCase();
|
|
493
|
+
}
|
|
494
|
+
export class NayoriX402PaymentClient {
|
|
495
|
+
signer;
|
|
496
|
+
policy;
|
|
497
|
+
nowSeconds;
|
|
498
|
+
clockSkewSeconds;
|
|
499
|
+
constructor(options) {
|
|
500
|
+
if (!options.signer || !options.policy) {
|
|
501
|
+
throw new PerkOSError("CONFIG_INVALID", "NayoriX402PaymentClient requires a signer and payment policy.");
|
|
502
|
+
}
|
|
503
|
+
this.signer = options.signer;
|
|
504
|
+
this.policy = options.policy;
|
|
505
|
+
this.nowSeconds = options.nowSeconds ?? (() => Math.floor(Date.now() / 1_000));
|
|
506
|
+
this.clockSkewSeconds = options.clockSkewSeconds ?? 30;
|
|
507
|
+
if (!Number.isSafeInteger(this.clockSkewSeconds) || this.clockSkewSeconds < 0) {
|
|
508
|
+
throw new PerkOSError("CONFIG_INVALID", "clockSkewSeconds must be a non-negative safe integer.");
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
async preparePayment(input) {
|
|
512
|
+
if (typeof input.signedQuote !== "string" ||
|
|
513
|
+
input.signedQuote.length === 0 ||
|
|
514
|
+
new TextEncoder().encode(input.signedQuote).byteLength > MAX_SIGNED_QUOTE_BYTES) {
|
|
515
|
+
throw new PerkOSError("X402_INVALID", "signedQuote is missing or too large.");
|
|
516
|
+
}
|
|
517
|
+
const nowSeconds = this.nowSeconds();
|
|
518
|
+
const quote = freezeQuote(input.quote);
|
|
519
|
+
const request = Object.freeze({
|
|
520
|
+
method: input.request.method,
|
|
521
|
+
url: input.request.url,
|
|
522
|
+
...(input.request.body === undefined ? {} : { body: input.request.body }),
|
|
523
|
+
});
|
|
524
|
+
const paymentRequirements = freezeRequirements(input.paymentRequirements);
|
|
525
|
+
const resource = input.resource
|
|
526
|
+
? Object.freeze({ ...input.resource })
|
|
527
|
+
: Object.freeze({ url: quote.url });
|
|
528
|
+
const [payer, publicKey] = await Promise.all([
|
|
529
|
+
this.signer.getAddress(),
|
|
530
|
+
this.signer.getPublicKey(),
|
|
531
|
+
]);
|
|
532
|
+
const intent = await createNayoriX402PaymentIntent({
|
|
533
|
+
paymentRequirements,
|
|
534
|
+
quote,
|
|
535
|
+
request,
|
|
536
|
+
payer,
|
|
537
|
+
publicKey,
|
|
538
|
+
fee: input.fee,
|
|
539
|
+
nonce: input.nonce,
|
|
540
|
+
nowSeconds,
|
|
541
|
+
clockSkewSeconds: this.clockSkewSeconds,
|
|
542
|
+
});
|
|
543
|
+
const authorization = this.policy.reserve(intent);
|
|
544
|
+
try {
|
|
545
|
+
const unsignedTransaction = await buildNayoriX402UnsignedPaymentTransaction(intent);
|
|
546
|
+
const signed = await this.signer.signTransaction(Object.freeze({ intent, transaction: unsignedTransaction }));
|
|
547
|
+
const paymentPayload = freezePaymentPayload(createNayoriX402DirectPaymentPayload({
|
|
548
|
+
paymentRequirements,
|
|
549
|
+
transaction: signed.transaction,
|
|
550
|
+
resource,
|
|
551
|
+
}));
|
|
552
|
+
let verifiedPayment;
|
|
553
|
+
try {
|
|
554
|
+
verifiedPayment = await verifyNayoriX402DirectPayment({
|
|
555
|
+
paymentPayload,
|
|
556
|
+
paymentRequirements,
|
|
557
|
+
trustedQuote: quote,
|
|
558
|
+
request,
|
|
559
|
+
nowSeconds: this.nowSeconds(),
|
|
560
|
+
clockSkewSeconds: this.clockSkewSeconds,
|
|
561
|
+
});
|
|
562
|
+
}
|
|
563
|
+
catch (cause) {
|
|
564
|
+
throw signedPaymentError(cause);
|
|
565
|
+
}
|
|
566
|
+
if (verifiedPayment.payer !== intent.payer ||
|
|
567
|
+
verifiedPayment.originNonce !== BigInt(intent.nonce) ||
|
|
568
|
+
verifiedPayment.originFee !== BigInt(intent.fee) ||
|
|
569
|
+
verifiedPayment.sponsored) {
|
|
570
|
+
throw new PerkOSError("SIGNING_FAILED", "The signed transaction does not match the authorized payment intent.", { intentId: intent.intentId });
|
|
571
|
+
}
|
|
572
|
+
authorization.commit();
|
|
573
|
+
const settlementRequest = Object.freeze({
|
|
574
|
+
signedQuote: input.signedQuote,
|
|
575
|
+
paymentRequirements,
|
|
576
|
+
paymentPayload,
|
|
577
|
+
request,
|
|
578
|
+
});
|
|
579
|
+
return Object.freeze({ intent, settlementRequest, verifiedPayment });
|
|
580
|
+
}
|
|
581
|
+
catch (cause) {
|
|
582
|
+
authorization.release();
|
|
583
|
+
throw cause;
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
//# sourceMappingURL=x402-paying.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-paying.js","sourceRoot":"","sources":["../src/x402-paying.ts"],"names":[],"mappings":"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"}
|