@perkos/agent-sdk 0.1.0 → 0.2.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.
@@ -0,0 +1,576 @@
1
+ import { AuthType, PostConditionMode, addressFromVersionHash, addressHashModeToVersion, addressToString, deserializeTransaction, isContractCallPayload, isTokenTransferPayload, transactionToHex, wireToPostCondition, } from "@stacks/transactions";
2
+ import { validatePaymentPayload, validatePaymentRequirements } from "@x402/core/schemas";
3
+ import { deepEqual } from "@x402/core/utils";
4
+ import { expectPrincipal, expectUint, optionalBuffer } from "./clarity.js";
5
+ import { PerkOSError } from "./errors.js";
6
+ import { normalizeTxid } from "./txid.js";
7
+ import { assertPrincipal, toUint } from "./validation.js";
8
+ import { PERKOS_X402_SCHEME, X402_VERSION, fromStacksX402Network, toStacksX402Network, } from "./x402.js";
9
+ export const NAYORI_X402_DIRECT_ASSET_TRANSFER_METHOD = "stacks-signed-tx-v1";
10
+ export const NAYORI_X402_DIRECT_PAYMENT_FLOW = "upfront";
11
+ export const NAYORI_X402_QUOTE_VERSION = 1;
12
+ export const NAYORI_X402_QUOTE_FINGERPRINT_PREFIX = "ny1_";
13
+ const MAX_QUOTE_LIFETIME_SECONDS = 3_600;
14
+ const DEFAULT_CLOCK_SKEW_SECONDS = 30;
15
+ const MAX_SERIALIZED_TRANSACTION_BYTES = 16_384;
16
+ const MAX_PROTECTED_REQUEST_BODY_BYTES = 1_048_576;
17
+ const QUOTE_DIGEST_BYTES = 20;
18
+ const ID_PATTERN = /^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/;
19
+ const SHA256_PATTERN = /^[0-9a-f]{64}$/;
20
+ const METHOD_PATTERN = /^[A-Z][A-Z0-9!#$%&'*+.^_`|~-]{0,31}$/;
21
+ const BASE64URL_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_";
22
+ const MAINNET_SBTC = "SM3VDXK3WZZSA84XXFKAFAF15NNZX32CTSG82JFQ4.sbtc-token";
23
+ const TESTNET_SBTC = "ST1F7QA2MDF17S807EPA36TSS8AMEFY4KA9TVGWXT.sbtc-token";
24
+ const MAINNET_USDCX = "SP120SBRBQJ00MCWS7TM5R8WJNTTKD5K0HFRC2CNE.usdcx";
25
+ const TESTNET_USDCX = "ST1PQHQKV0RJXZFY1DGX8MNSNYVE3VGZJSRTPGZGM.usdcx";
26
+ function stxAsset(network) {
27
+ const x402Network = toStacksX402Network(network);
28
+ return Object.freeze({
29
+ network,
30
+ x402Network,
31
+ paymentAsset: "stx",
32
+ symbol: "STX",
33
+ decimals: 6,
34
+ wireAsset: "STX",
35
+ canonicalAssetId: `${x402Network}/slip44:5757`,
36
+ kind: "stx",
37
+ });
38
+ }
39
+ function sip010Asset(network, paymentAsset, symbol, decimals, contract, tokenName) {
40
+ const x402Network = toStacksX402Network(network);
41
+ return Object.freeze({
42
+ network,
43
+ x402Network,
44
+ paymentAsset,
45
+ symbol,
46
+ decimals,
47
+ wireAsset: contract,
48
+ canonicalAssetId: `${x402Network}/sip010:${contract}.${tokenName}`,
49
+ kind: "sip010",
50
+ contract,
51
+ tokenName,
52
+ postConditionAsset: `${contract}::${tokenName}`,
53
+ });
54
+ }
55
+ export const NAYORI_X402_DIRECT_ASSETS = Object.freeze({
56
+ mainnet: Object.freeze({
57
+ stx: stxAsset("mainnet"),
58
+ sbtc: sip010Asset("mainnet", "sbtc", "sBTC", 8, MAINNET_SBTC, "sbtc-token"),
59
+ usdcx: sip010Asset("mainnet", "usdcx", "USDCx", 6, MAINNET_USDCX, "usdcx-token"),
60
+ }),
61
+ testnet: Object.freeze({
62
+ stx: stxAsset("testnet"),
63
+ sbtc: sip010Asset("testnet", "sbtc", "sBTC", 8, TESTNET_SBTC, "sbtc-token"),
64
+ usdcx: sip010Asset("testnet", "usdcx", "USDCx", 6, TESTNET_USDCX, "usdcx-token"),
65
+ }),
66
+ });
67
+ export class NayoriX402DirectVerificationError extends Error {
68
+ reason;
69
+ details;
70
+ constructor(reason, message, details) {
71
+ super(message);
72
+ this.name = "NayoriX402DirectVerificationError";
73
+ this.reason = reason;
74
+ this.details = details;
75
+ }
76
+ }
77
+ function verificationError(reason, message, details) {
78
+ return new NayoriX402DirectVerificationError(reason, message, details);
79
+ }
80
+ function requireSafeTimestamp(value, field) {
81
+ if (!Number.isSafeInteger(value) || value < 0) {
82
+ throw verificationError("invalid_quote", `${field} must be a non-negative safe integer.`);
83
+ }
84
+ return value;
85
+ }
86
+ function requireId(value, field) {
87
+ if (!ID_PATTERN.test(value)) {
88
+ throw verificationError("invalid_quote", `${field} must use 1-128 URL-safe identifier characters.`);
89
+ }
90
+ return value;
91
+ }
92
+ function normalizeMethod(value) {
93
+ const method = value.trim().toUpperCase();
94
+ if (!METHOD_PATTERN.test(method)) {
95
+ throw verificationError("invalid_request", "The protected request method is invalid.");
96
+ }
97
+ return method;
98
+ }
99
+ export function canonicalizeNayoriX402ResourceUrl(value) {
100
+ let url;
101
+ try {
102
+ url = new URL(value);
103
+ }
104
+ catch (cause) {
105
+ throw verificationError("invalid_request", "The protected resource URL is invalid.", {
106
+ cause,
107
+ });
108
+ }
109
+ if (url.protocol !== "https:" && url.protocol !== "http:") {
110
+ throw verificationError("invalid_request", "The protected resource must use HTTP or HTTPS.");
111
+ }
112
+ if (url.username || url.password || url.hash) {
113
+ throw verificationError("invalid_request", "The protected resource URL cannot include credentials or a fragment.");
114
+ }
115
+ return url.href;
116
+ }
117
+ function bytesFromBody(body) {
118
+ const bytes = body === undefined
119
+ ? new Uint8Array()
120
+ : typeof body === "string"
121
+ ? new TextEncoder().encode(body)
122
+ : Uint8Array.from(body);
123
+ if (bytes.byteLength > MAX_PROTECTED_REQUEST_BODY_BYTES) {
124
+ throw verificationError("invalid_request", `The protected request body exceeds ${MAX_PROTECTED_REQUEST_BODY_BYTES} bytes.`);
125
+ }
126
+ return bytes;
127
+ }
128
+ async function sha256(value) {
129
+ const digest = await globalThis.crypto.subtle.digest("SHA-256", Uint8Array.from(value));
130
+ return new Uint8Array(digest);
131
+ }
132
+ function hexFromBytes(value) {
133
+ return Array.from(value, (byte) => byte.toString(16).padStart(2, "0")).join("");
134
+ }
135
+ function base64Url(value) {
136
+ let encoded = "";
137
+ for (let index = 0; index < value.length; index += 3) {
138
+ const first = value[index] ?? 0;
139
+ const hasSecond = index + 1 < value.length;
140
+ const hasThird = index + 2 < value.length;
141
+ const second = hasSecond ? (value[index + 1] ?? 0) : 0;
142
+ const third = hasThird ? (value[index + 2] ?? 0) : 0;
143
+ encoded += BASE64URL_ALPHABET[first >> 2];
144
+ encoded += BASE64URL_ALPHABET[((first & 0x03) << 4) | (second >> 4)];
145
+ if (hasSecond) {
146
+ encoded += BASE64URL_ALPHABET[((second & 0x0f) << 2) | (third >> 6)];
147
+ }
148
+ if (hasThird)
149
+ encoded += BASE64URL_ALPHABET[third & 0x3f];
150
+ }
151
+ return encoded;
152
+ }
153
+ export async function hashNayoriX402RequestBody(body) {
154
+ return hexFromBytes(await sha256(bytesFromBody(body)));
155
+ }
156
+ export function getNayoriX402Asset(network, asset) {
157
+ const definition = NAYORI_X402_DIRECT_ASSETS[network]?.[asset];
158
+ if (!definition) {
159
+ throw verificationError("unsupported_asset", "The Stacks x402 asset is not supported.", {
160
+ network,
161
+ asset,
162
+ });
163
+ }
164
+ return definition;
165
+ }
166
+ function normalizeQuote(quote) {
167
+ if (quote.version !== NAYORI_X402_QUOTE_VERSION) {
168
+ throw verificationError("invalid_quote", "The Nayori quote version is not supported.");
169
+ }
170
+ const quoteId = requireId(quote.quoteId, "quoteId");
171
+ const merchantId = requireId(quote.merchantId, "merchantId");
172
+ const method = normalizeMethod(quote.method);
173
+ if (method !== quote.method) {
174
+ throw verificationError("invalid_quote", "The quote method is not canonical.");
175
+ }
176
+ const url = canonicalizeNayoriX402ResourceUrl(quote.url);
177
+ if (url !== quote.url) {
178
+ throw verificationError("invalid_quote", "The quote URL is not canonical.");
179
+ }
180
+ if (!SHA256_PATTERN.test(quote.bodySha256)) {
181
+ throw verificationError("invalid_quote", "The quote bodySha256 must be lowercase SHA-256.");
182
+ }
183
+ let network;
184
+ try {
185
+ network = fromStacksX402Network(quote.network);
186
+ }
187
+ catch (cause) {
188
+ throw verificationError("invalid_quote", "The quote network is unsupported.", { cause });
189
+ }
190
+ const definition = getNayoriX402Asset(network, quote.paymentAsset);
191
+ if (quote.asset !== definition.canonicalAssetId) {
192
+ throw verificationError("invalid_quote", "The quote asset is not canonical for the network.");
193
+ }
194
+ let amount;
195
+ try {
196
+ amount = toUint(quote.amount, "quote.amount");
197
+ }
198
+ catch (cause) {
199
+ throw verificationError("invalid_quote", "The quote amount is invalid.", { cause });
200
+ }
201
+ if (amount === 0n || amount.toString() !== quote.amount) {
202
+ throw verificationError("invalid_quote", "The quote amount must be a positive canonical uint.");
203
+ }
204
+ try {
205
+ assertPrincipal(quote.payTo, "quote.payTo", network);
206
+ }
207
+ catch (cause) {
208
+ throw verificationError("invalid_quote", "The quote recipient is invalid.", { cause });
209
+ }
210
+ const issuedAt = requireSafeTimestamp(quote.issuedAt, "issuedAt");
211
+ const expiresAt = requireSafeTimestamp(quote.expiresAt, "expiresAt");
212
+ const lifetime = expiresAt - issuedAt;
213
+ if (lifetime < 1 || lifetime > MAX_QUOTE_LIFETIME_SECONDS) {
214
+ throw verificationError("invalid_quote", `The quote lifetime must be between 1 and ${MAX_QUOTE_LIFETIME_SECONDS} seconds.`);
215
+ }
216
+ return {
217
+ version: NAYORI_X402_QUOTE_VERSION,
218
+ quoteId,
219
+ merchantId,
220
+ method,
221
+ url,
222
+ bodySha256: quote.bodySha256,
223
+ network: definition.x402Network,
224
+ paymentAsset: definition.paymentAsset,
225
+ asset: definition.canonicalAssetId,
226
+ amount: amount.toString(),
227
+ payTo: quote.payTo,
228
+ issuedAt,
229
+ expiresAt,
230
+ };
231
+ }
232
+ export async function createNayoriX402Quote(input) {
233
+ const definition = getNayoriX402Asset(input.network, input.asset);
234
+ const amount = toUint(input.amount, "amount");
235
+ if (amount === 0n) {
236
+ throw new PerkOSError("X402_INVALID", "amount must be greater than zero.");
237
+ }
238
+ const quote = {
239
+ version: NAYORI_X402_QUOTE_VERSION,
240
+ quoteId: input.quoteId,
241
+ merchantId: input.merchantId,
242
+ method: normalizeMethod(input.method),
243
+ url: canonicalizeNayoriX402ResourceUrl(input.url),
244
+ bodySha256: await hashNayoriX402RequestBody(input.body),
245
+ network: definition.x402Network,
246
+ paymentAsset: definition.paymentAsset,
247
+ asset: definition.canonicalAssetId,
248
+ amount: amount.toString(),
249
+ payTo: input.payTo,
250
+ issuedAt: input.issuedAt,
251
+ expiresAt: input.expiresAt,
252
+ };
253
+ return normalizeQuote(quote);
254
+ }
255
+ export function canonicalizeNayoriX402Quote(quote) {
256
+ const normalized = normalizeQuote(quote);
257
+ return JSON.stringify({
258
+ version: normalized.version,
259
+ quoteId: normalized.quoteId,
260
+ merchantId: normalized.merchantId,
261
+ method: normalized.method,
262
+ url: normalized.url,
263
+ bodySha256: normalized.bodySha256,
264
+ network: normalized.network,
265
+ paymentAsset: normalized.paymentAsset,
266
+ asset: normalized.asset,
267
+ amount: normalized.amount,
268
+ payTo: normalized.payTo,
269
+ issuedAt: normalized.issuedAt,
270
+ expiresAt: normalized.expiresAt,
271
+ });
272
+ }
273
+ export async function createNayoriX402QuoteFingerprint(quote) {
274
+ const canonical = canonicalizeNayoriX402Quote(quote);
275
+ const digest = await sha256(new TextEncoder().encode(canonical));
276
+ const fingerprint = `${NAYORI_X402_QUOTE_FINGERPRINT_PREFIX}${base64Url(digest.slice(0, QUOTE_DIGEST_BYTES))}`;
277
+ if (new TextEncoder().encode(fingerprint).length > 34) {
278
+ throw verificationError("invalid_quote", "The quote fingerprint exceeds the memo limit.");
279
+ }
280
+ return fingerprint;
281
+ }
282
+ export async function createNayoriX402PaymentRequirements(quoteInput) {
283
+ const quote = normalizeQuote(quoteInput);
284
+ const network = fromStacksX402Network(quote.network);
285
+ const definition = getNayoriX402Asset(network, quote.paymentAsset);
286
+ const requirement = {
287
+ scheme: PERKOS_X402_SCHEME,
288
+ network: quote.network,
289
+ amount: quote.amount,
290
+ asset: definition.wireAsset,
291
+ payTo: quote.payTo,
292
+ maxTimeoutSeconds: quote.expiresAt - quote.issuedAt,
293
+ extra: {
294
+ assetTransferMethod: NAYORI_X402_DIRECT_ASSET_TRANSFER_METHOD,
295
+ paymentFlow: NAYORI_X402_DIRECT_PAYMENT_FLOW,
296
+ paymentAsset: definition.paymentAsset,
297
+ nayoriAssetId: definition.canonicalAssetId,
298
+ quoteVersion: String(NAYORI_X402_QUOTE_VERSION),
299
+ quoteFingerprint: await createNayoriX402QuoteFingerprint(quote),
300
+ },
301
+ };
302
+ try {
303
+ validatePaymentRequirements(requirement);
304
+ }
305
+ catch (cause) {
306
+ throw verificationError("invalid_payment_requirements", "The x402 requirement is invalid.", {
307
+ cause,
308
+ });
309
+ }
310
+ return requirement;
311
+ }
312
+ export function createNayoriX402DirectPaymentPayload(input) {
313
+ const payload = {
314
+ x402Version: X402_VERSION,
315
+ ...(input.resource ? { resource: input.resource } : {}),
316
+ accepted: input.paymentRequirements,
317
+ payload: { transaction: input.transaction },
318
+ extensions: {},
319
+ };
320
+ try {
321
+ validatePaymentPayload(payload);
322
+ }
323
+ catch (cause) {
324
+ throw verificationError("invalid_payload", "The direct Stacks payment payload is invalid.", {
325
+ cause,
326
+ });
327
+ }
328
+ return payload;
329
+ }
330
+ function requiredExtraString(requirement, field) {
331
+ const value = requirement.extra?.[field];
332
+ if (typeof value !== "string" || value.length === 0) {
333
+ throw verificationError("invalid_payment_requirements", `paymentRequirements.extra.${field} must be a non-empty string.`);
334
+ }
335
+ return value;
336
+ }
337
+ async function validateRequirement(requirement, quote) {
338
+ try {
339
+ validatePaymentRequirements(requirement);
340
+ }
341
+ catch (cause) {
342
+ throw verificationError("invalid_payment_requirements", "The x402 requirement is invalid.", {
343
+ cause,
344
+ });
345
+ }
346
+ const network = fromStacksX402Network(quote.network);
347
+ const definition = getNayoriX402Asset(network, quote.paymentAsset);
348
+ if (requirement.scheme !== PERKOS_X402_SCHEME ||
349
+ requirement.network !== quote.network ||
350
+ requirement.amount !== quote.amount ||
351
+ requirement.asset !== definition.wireAsset ||
352
+ requirement.payTo !== quote.payTo ||
353
+ requirement.maxTimeoutSeconds !== quote.expiresAt - quote.issuedAt) {
354
+ throw verificationError("requirement_mismatch", "The x402 requirement does not match the trusted quote.");
355
+ }
356
+ if (requiredExtraString(requirement, "assetTransferMethod") !==
357
+ NAYORI_X402_DIRECT_ASSET_TRANSFER_METHOD ||
358
+ requiredExtraString(requirement, "paymentFlow") !== NAYORI_X402_DIRECT_PAYMENT_FLOW ||
359
+ requiredExtraString(requirement, "paymentAsset") !== definition.paymentAsset ||
360
+ requiredExtraString(requirement, "nayoriAssetId") !== definition.canonicalAssetId ||
361
+ requiredExtraString(requirement, "quoteVersion") !==
362
+ String(NAYORI_X402_QUOTE_VERSION) ||
363
+ requiredExtraString(requirement, "quoteFingerprint") !==
364
+ (await createNayoriX402QuoteFingerprint(quote))) {
365
+ throw verificationError("requirement_mismatch", "The x402 mechanism or quote metadata does not match the trusted quote.");
366
+ }
367
+ return definition;
368
+ }
369
+ function parseTransaction(transactionValue) {
370
+ if (typeof transactionValue !== "string") {
371
+ throw verificationError("invalid_transaction", "payload.transaction must be hex.");
372
+ }
373
+ const hex = transactionValue.startsWith("0x")
374
+ ? transactionValue.slice(2)
375
+ : transactionValue;
376
+ if (hex.length === 0 ||
377
+ hex.length % 2 !== 0 ||
378
+ hex.length > MAX_SERIALIZED_TRANSACTION_BYTES * 2 ||
379
+ !/^[0-9a-fA-F]+$/.test(hex)) {
380
+ throw verificationError("invalid_transaction", "The serialized Stacks transaction is invalid.");
381
+ }
382
+ try {
383
+ const transaction = deserializeTransaction(hex);
384
+ if (transactionToHex(transaction).toLowerCase() !== hex.toLowerCase()) {
385
+ throw verificationError("invalid_transaction", "The serialized Stacks transaction is non-canonical or has trailing bytes.");
386
+ }
387
+ return { transaction, serialized: hex.toLowerCase() };
388
+ }
389
+ catch (cause) {
390
+ if (cause instanceof NayoriX402DirectVerificationError)
391
+ throw cause;
392
+ throw verificationError("invalid_transaction", "The Stacks transaction cannot be decoded.", {
393
+ cause,
394
+ });
395
+ }
396
+ }
397
+ function expectedNetworkEncoding(network) {
398
+ return network === "mainnet"
399
+ ? { transactionVersion: 0x00, chainId: 0x00000001 }
400
+ : { transactionVersion: 0x80, chainId: 0x80000000 };
401
+ }
402
+ function originPayer(transaction, network) {
403
+ try {
404
+ transaction.verifyOrigin();
405
+ }
406
+ catch (cause) {
407
+ throw verificationError("invalid_origin_signature", "The transaction origin signature is invalid.", { cause });
408
+ }
409
+ const condition = transaction.auth.spendingCondition;
410
+ const version = addressHashModeToVersion(condition.hashMode, network);
411
+ return addressToString(addressFromVersionHash(version, condition.signer));
412
+ }
413
+ function asciiHex(value) {
414
+ return hexFromBytes(new TextEncoder().encode(value));
415
+ }
416
+ function verifyStxTransfer(transaction, amount, payer, payTo, fingerprint) {
417
+ if (!isTokenTransferPayload(transaction.payload)) {
418
+ throw verificationError("unsupported_transaction", "The quote requires an STX token-transfer transaction.");
419
+ }
420
+ let recipient;
421
+ try {
422
+ recipient = expectPrincipal(transaction.payload.recipient, "STX transfer recipient");
423
+ }
424
+ catch (cause) {
425
+ throw verificationError("recipient_mismatch", "The STX recipient is invalid.", { cause });
426
+ }
427
+ if (transaction.payload.amount !== amount) {
428
+ throw verificationError("amount_mismatch", "The STX transfer amount does not match the quote.");
429
+ }
430
+ if (recipient !== payTo) {
431
+ throw verificationError("recipient_mismatch", "The STX recipient does not match the quote.");
432
+ }
433
+ if (transaction.payload.memo.content !== fingerprint) {
434
+ throw verificationError("memo_mismatch", "The STX memo does not bind to the quote.");
435
+ }
436
+ if (transaction.postConditionMode !== PostConditionMode.Deny ||
437
+ transaction.postConditions.values.length !== 0) {
438
+ throw verificationError("post_condition_mismatch", "Direct STX transfers require deny mode and no redundant post-conditions.", { payer });
439
+ }
440
+ }
441
+ function verifySip010Transfer(transaction, definition, amount, payer, payTo, fingerprint) {
442
+ if (!isContractCallPayload(transaction.payload)) {
443
+ throw verificationError("unsupported_transaction", `The quote requires a canonical ${definition.symbol} SIP-010 transfer.`);
444
+ }
445
+ const contract = `${addressToString(transaction.payload.contractAddress)}.${transaction.payload.contractName.content}`;
446
+ if (contract !== definition.contract || transaction.payload.functionName.content !== "transfer") {
447
+ throw verificationError("asset_mismatch", `The transaction is not a transfer through the canonical ${definition.symbol} contract.`);
448
+ }
449
+ const args = transaction.payload.functionArgs;
450
+ if (args.length !== 4) {
451
+ throw verificationError("unsupported_transaction", "SIP-010 transfer requires four arguments.");
452
+ }
453
+ let transferAmount;
454
+ let sender;
455
+ let recipient;
456
+ let memo;
457
+ try {
458
+ transferAmount = expectUint(args[0], "SIP-010 transfer amount");
459
+ sender = expectPrincipal(args[1], "SIP-010 transfer sender");
460
+ recipient = expectPrincipal(args[2], "SIP-010 transfer recipient");
461
+ memo = optionalBuffer(args[3], "SIP-010 transfer memo");
462
+ }
463
+ catch (cause) {
464
+ throw verificationError("unsupported_transaction", "The SIP-010 transfer arguments are invalid.", {
465
+ cause,
466
+ });
467
+ }
468
+ if (transferAmount !== amount) {
469
+ throw verificationError("amount_mismatch", "The SIP-010 amount does not match the quote.");
470
+ }
471
+ if (sender !== payer) {
472
+ throw verificationError("payer_mismatch", "The SIP-010 sender is not the signed origin.");
473
+ }
474
+ if (recipient !== payTo) {
475
+ throw verificationError("recipient_mismatch", "The SIP-010 recipient does not match the quote.");
476
+ }
477
+ if (memo !== asciiHex(fingerprint)) {
478
+ throw verificationError("memo_mismatch", "The SIP-010 memo does not bind to the quote.");
479
+ }
480
+ if (transaction.postConditionMode !== PostConditionMode.Deny ||
481
+ transaction.postConditions.values.length !== 1) {
482
+ throw verificationError("post_condition_mismatch", "SIP-010 payments require deny mode and exactly one post-condition.");
483
+ }
484
+ const postCondition = wireToPostCondition(transaction.postConditions.values[0]);
485
+ if (postCondition.type !== "ft-postcondition" ||
486
+ postCondition.address !== payer ||
487
+ postCondition.condition !== "eq" ||
488
+ BigInt(postCondition.amount) !== amount ||
489
+ postCondition.asset !== definition.postConditionAsset) {
490
+ throw verificationError("post_condition_mismatch", `The ${definition.symbol} post-condition is not exact and canonical.`);
491
+ }
492
+ }
493
+ export async function verifyNayoriX402DirectPayment(input) {
494
+ const quote = normalizeQuote(input.trustedQuote);
495
+ const nowSeconds = input.nowSeconds ?? Math.floor(Date.now() / 1_000);
496
+ const clockSkewSeconds = input.clockSkewSeconds ?? DEFAULT_CLOCK_SKEW_SECONDS;
497
+ if (!Number.isSafeInteger(nowSeconds) || nowSeconds < 0) {
498
+ throw verificationError("invalid_verifier_config", "nowSeconds must be a safe timestamp.");
499
+ }
500
+ if (!Number.isSafeInteger(clockSkewSeconds) || clockSkewSeconds < 0) {
501
+ throw verificationError("invalid_verifier_config", "clockSkewSeconds must be a non-negative safe integer.");
502
+ }
503
+ if (nowSeconds < quote.issuedAt - clockSkewSeconds) {
504
+ throw verificationError("quote_not_yet_valid", "The trusted quote is not valid yet.");
505
+ }
506
+ if (nowSeconds > quote.expiresAt + clockSkewSeconds) {
507
+ throw verificationError("quote_expired", "The trusted quote has expired.");
508
+ }
509
+ const requestMethod = normalizeMethod(input.request.method);
510
+ const requestUrl = canonicalizeNayoriX402ResourceUrl(input.request.url);
511
+ const requestBodySha256 = await hashNayoriX402RequestBody(input.request.body);
512
+ if (requestMethod !== quote.method ||
513
+ requestUrl !== quote.url ||
514
+ requestBodySha256 !== quote.bodySha256) {
515
+ throw verificationError("request_mismatch", "The protected request does not match the trusted quote.");
516
+ }
517
+ try {
518
+ validatePaymentPayload(input.paymentPayload);
519
+ }
520
+ catch (cause) {
521
+ throw verificationError("invalid_payload", "The direct Stacks payment payload is invalid.", {
522
+ cause,
523
+ });
524
+ }
525
+ if (input.paymentPayload.x402Version !== X402_VERSION) {
526
+ throw verificationError("invalid_payload", `x402Version must be ${X402_VERSION}.`);
527
+ }
528
+ if (!deepEqual(input.paymentPayload.accepted, input.paymentRequirements)) {
529
+ throw verificationError("requirement_mismatch", "The payment payload accepted field differs from the server requirement.");
530
+ }
531
+ if (input.paymentPayload.resource &&
532
+ canonicalizeNayoriX402ResourceUrl(input.paymentPayload.resource.url) !== quote.url) {
533
+ throw verificationError("request_mismatch", "The payment payload resource differs from the trusted quote.");
534
+ }
535
+ const definition = await validateRequirement(input.paymentRequirements, quote);
536
+ const parsed = parseTransaction(input.paymentPayload.payload.transaction);
537
+ const network = fromStacksX402Network(quote.network);
538
+ const expectedEncoding = expectedNetworkEncoding(network);
539
+ if (parsed.transaction.transactionVersion !== expectedEncoding.transactionVersion ||
540
+ parsed.transaction.chainId !== expectedEncoding.chainId) {
541
+ throw verificationError("network_mismatch", "The signed transaction network does not match the quote.");
542
+ }
543
+ if (parsed.transaction.auth.authType !== AuthType.Standard &&
544
+ parsed.transaction.auth.authType !== AuthType.Sponsored) {
545
+ throw verificationError("unsupported_transaction", "The transaction authorization is unsupported.");
546
+ }
547
+ const payer = originPayer(parsed.transaction, network);
548
+ const amount = BigInt(quote.amount);
549
+ const fingerprint = await createNayoriX402QuoteFingerprint(quote);
550
+ if (definition.kind === "stx") {
551
+ verifyStxTransfer(parsed.transaction, amount, payer, quote.payTo, fingerprint);
552
+ }
553
+ else {
554
+ verifySip010Transfer(parsed.transaction, definition, amount, payer, quote.payTo, fingerprint);
555
+ }
556
+ const transactionHash = normalizeTxid(parsed.transaction.txid());
557
+ return {
558
+ network,
559
+ x402Network: definition.x402Network,
560
+ asset: definition.paymentAsset,
561
+ assetDefinition: definition,
562
+ amount,
563
+ payer,
564
+ payTo: quote.payTo,
565
+ transaction: parsed.serialized,
566
+ transactionHash,
567
+ ...(parsed.transaction.auth.authType === AuthType.Standard
568
+ ? { transactionId: transactionHash }
569
+ : {}),
570
+ originNonce: parsed.transaction.auth.spendingCondition.nonce,
571
+ sponsored: parsed.transaction.auth.authType === AuthType.Sponsored,
572
+ quoteId: quote.quoteId,
573
+ quoteFingerprint: fingerprint,
574
+ };
575
+ }
576
+ //# sourceMappingURL=x402-direct.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"x402-direct.js","sourceRoot":"","sources":["../src/x402-direct.ts"],"names":[],"mappings":"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"}