@perkos/agent-sdk 0.1.0 → 0.3.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/CHANGELOG.md +73 -0
- package/README.md +191 -5
- package/SECURITY.md +12 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/x402-direct.d.ts +116 -0
- package/dist/x402-direct.d.ts.map +1 -0
- package/dist/x402-direct.js +593 -0
- package/dist/x402-direct.js.map +1 -0
- package/dist/x402-facilitator.d.ts +86 -0
- package/dist/x402-facilitator.d.ts.map +1 -0
- package/dist/x402-facilitator.js +480 -0
- package/dist/x402-facilitator.js.map +1 -0
- 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/dist/x402.d.ts +60 -0
- package/dist/x402.d.ts.map +1 -0
- package/dist/x402.js +306 -0
- package/dist/x402.js.map +1 -0
- package/docs/ARCHITECTURE.md +25 -1
- package/docs/X402_PAYMENTS.md +143 -0
- package/docs/plans/2026-08-25-stacks-x402-direct-profile-design.md +68 -0
- package/docs/plans/2026-08-25-stacks-x402-facilitator-design.md +143 -0
- package/docs/plans/2026-08-25-stacks-x402-v2-design.md +139 -0
- package/docs/plans/2026-08-27-x402-paying-flow-design.md +125 -0
- package/examples/x402-facilitator.ts +69 -0
- package/examples/x402-foundation.ts +30 -0
- package/examples/x402-payment-intent.ts +81 -0
- package/package.json +12 -5
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import type { PaymentPayload, PaymentRequirements, SchemeNetworkFacilitator, SettleResponse, VerifyResponse } from "@x402/core/types";
|
|
2
|
+
import type { PaymentAsset, PerkOSNetwork, ResolvedPerkOSConfig } from "./types.js";
|
|
3
|
+
export type X402VerifierFetch = (input: string | URL | Request, init?: RequestInit) => Promise<Response>;
|
|
4
|
+
export interface PerkOSX402TransactionSource {
|
|
5
|
+
getTransaction(txid: string): Promise<unknown | null>;
|
|
6
|
+
getChainTip(): Promise<number>;
|
|
7
|
+
}
|
|
8
|
+
export interface HiroX402TransactionSourceOptions {
|
|
9
|
+
readonly network: PerkOSNetwork;
|
|
10
|
+
readonly apiUrl?: string;
|
|
11
|
+
readonly fetch?: X402VerifierFetch;
|
|
12
|
+
}
|
|
13
|
+
export interface PerkOSX402ReplayRecord {
|
|
14
|
+
readonly key: string;
|
|
15
|
+
readonly network: PerkOSNetwork;
|
|
16
|
+
readonly transaction: string;
|
|
17
|
+
readonly payer: string;
|
|
18
|
+
readonly asset: PaymentAsset;
|
|
19
|
+
readonly jobId: string;
|
|
20
|
+
readonly amount: string;
|
|
21
|
+
readonly resource?: string;
|
|
22
|
+
readonly consumedAt: string;
|
|
23
|
+
}
|
|
24
|
+
export interface PerkOSX402ReplayStore {
|
|
25
|
+
has(key: string): Promise<boolean>;
|
|
26
|
+
consume(key: string, record: PerkOSX402ReplayRecord): Promise<boolean>;
|
|
27
|
+
}
|
|
28
|
+
export interface PerkOSX402VerifiedPayment {
|
|
29
|
+
readonly network: PerkOSNetwork;
|
|
30
|
+
readonly transaction: string;
|
|
31
|
+
readonly payer: string;
|
|
32
|
+
readonly asset: PaymentAsset;
|
|
33
|
+
readonly jobId: bigint;
|
|
34
|
+
readonly amount: bigint;
|
|
35
|
+
readonly commerceContract: string;
|
|
36
|
+
readonly blockHeight: number;
|
|
37
|
+
readonly blockHash: string;
|
|
38
|
+
readonly blockTime: number;
|
|
39
|
+
readonly confirmations: number;
|
|
40
|
+
readonly replayKey: string;
|
|
41
|
+
}
|
|
42
|
+
export interface PerkOSX402FacilitatorOptions {
|
|
43
|
+
readonly config: ResolvedPerkOSConfig;
|
|
44
|
+
readonly replayStore: PerkOSX402ReplayStore;
|
|
45
|
+
readonly transactionSource?: PerkOSX402TransactionSource;
|
|
46
|
+
readonly minConfirmations?: number;
|
|
47
|
+
readonly clockSkewSeconds?: number;
|
|
48
|
+
readonly now?: () => number;
|
|
49
|
+
}
|
|
50
|
+
export declare class PerkOSX402VerificationError extends Error {
|
|
51
|
+
readonly reason: string;
|
|
52
|
+
readonly details: Readonly<Record<string, unknown>> | undefined;
|
|
53
|
+
constructor(reason: string, message: string, details?: Readonly<Record<string, unknown>>);
|
|
54
|
+
}
|
|
55
|
+
export declare function perkosX402ReplayKey(network: PerkOSNetwork, txid: string): string;
|
|
56
|
+
export declare class HiroX402TransactionSource implements PerkOSX402TransactionSource {
|
|
57
|
+
private readonly apiUrl;
|
|
58
|
+
private readonly fetch;
|
|
59
|
+
constructor(options: HiroX402TransactionSourceOptions);
|
|
60
|
+
getTransaction(txidInput: string): Promise<unknown | null>;
|
|
61
|
+
getChainTip(): Promise<number>;
|
|
62
|
+
}
|
|
63
|
+
export declare class InMemoryX402ReplayStore implements PerkOSX402ReplayStore {
|
|
64
|
+
private readonly records;
|
|
65
|
+
has(key: string): Promise<boolean>;
|
|
66
|
+
consume(key: string, record: PerkOSX402ReplayRecord): Promise<boolean>;
|
|
67
|
+
get(key: string): PerkOSX402ReplayRecord | undefined;
|
|
68
|
+
}
|
|
69
|
+
export declare class PerkOSX402Facilitator implements SchemeNetworkFacilitator {
|
|
70
|
+
readonly scheme = "exact";
|
|
71
|
+
readonly caipFamily = "stacks:*";
|
|
72
|
+
private readonly config;
|
|
73
|
+
private readonly replayStore;
|
|
74
|
+
private readonly transactionSource;
|
|
75
|
+
private readonly minConfirmations;
|
|
76
|
+
private readonly clockSkewSeconds;
|
|
77
|
+
private readonly now;
|
|
78
|
+
constructor(options: PerkOSX402FacilitatorOptions);
|
|
79
|
+
getExtra(network: string): Record<string, unknown> | undefined;
|
|
80
|
+
getSigners(_network: string): string[];
|
|
81
|
+
verify(payload: PaymentPayload, requirements: PaymentRequirements): Promise<VerifyResponse>;
|
|
82
|
+
settle(payload: PaymentPayload, requirements: PaymentRequirements): Promise<SettleResponse>;
|
|
83
|
+
inspect(payload: PaymentPayload, requirements: PaymentRequirements): Promise<PerkOSX402VerifiedPayment>;
|
|
84
|
+
private asVerificationError;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=x402-facilitator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-facilitator.d.ts","sourceRoot":"","sources":["../src/x402-facilitator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,480 @@
|
|
|
1
|
+
import { deepEqual } from "@x402/core/utils";
|
|
2
|
+
import { deserializeCV } from "@stacks/transactions";
|
|
3
|
+
import { PerkOSError } from "./errors.js";
|
|
4
|
+
import { expectPrincipal, expectString, expectTuple, expectUint, } from "./clarity.js";
|
|
5
|
+
import { normalizeTxid } from "./txid.js";
|
|
6
|
+
import { normalizeApiUrl } from "./validation.js";
|
|
7
|
+
import { PERKOS_X402_ASSET_TRANSFER_METHOD, PERKOS_X402_PAYMENT_FLOW, PERKOS_X402_SCHEME, fromStacksX402Network, parsePerkOSX402PaymentPayload, parsePerkOSX402Requirement, toStacksX402Network, } from "./x402.js";
|
|
8
|
+
const DEFAULT_API_URL = {
|
|
9
|
+
mainnet: "https://api.hiro.so",
|
|
10
|
+
testnet: "https://api.testnet.hiro.so",
|
|
11
|
+
};
|
|
12
|
+
const DEFAULT_MIN_CONFIRMATIONS = 1;
|
|
13
|
+
const DEFAULT_CLOCK_SKEW_SECONDS = 30;
|
|
14
|
+
export class PerkOSX402VerificationError extends Error {
|
|
15
|
+
reason;
|
|
16
|
+
details;
|
|
17
|
+
constructor(reason, message, details) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "PerkOSX402VerificationError";
|
|
20
|
+
this.reason = reason;
|
|
21
|
+
this.details = details;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
function verificationError(reason, message, details) {
|
|
25
|
+
return new PerkOSX402VerificationError(reason, message, details);
|
|
26
|
+
}
|
|
27
|
+
function positiveInteger(value, fallback, field) {
|
|
28
|
+
const resolved = value ?? fallback;
|
|
29
|
+
if (!Number.isSafeInteger(resolved) || resolved < 1) {
|
|
30
|
+
throw new PerkOSError("CONFIG_INVALID", `${field} must be a positive safe integer.`, {
|
|
31
|
+
field,
|
|
32
|
+
value: resolved,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
return resolved;
|
|
36
|
+
}
|
|
37
|
+
function nonNegativeInteger(value, fallback, field) {
|
|
38
|
+
const resolved = value ?? fallback;
|
|
39
|
+
if (!Number.isSafeInteger(resolved) || resolved < 0) {
|
|
40
|
+
throw new PerkOSError("CONFIG_INVALID", `${field} must be a non-negative safe integer.`, { field, value: resolved });
|
|
41
|
+
}
|
|
42
|
+
return resolved;
|
|
43
|
+
}
|
|
44
|
+
function asRecord(value, label) {
|
|
45
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
46
|
+
throw verificationError("verification_unavailable", `The Stacks API returned an invalid ${label}.`);
|
|
47
|
+
}
|
|
48
|
+
return value;
|
|
49
|
+
}
|
|
50
|
+
function requiredString(record, field) {
|
|
51
|
+
const value = record[field];
|
|
52
|
+
if (typeof value !== "string" || value.length === 0) {
|
|
53
|
+
throw verificationError("verification_unavailable", `The Stacks API response is missing ${field}.`);
|
|
54
|
+
}
|
|
55
|
+
return value;
|
|
56
|
+
}
|
|
57
|
+
function requiredInteger(record, field) {
|
|
58
|
+
const value = record[field];
|
|
59
|
+
if (!Number.isSafeInteger(value) || value < 0) {
|
|
60
|
+
throw verificationError("verification_unavailable", `The Stacks API response has an invalid ${field}.`);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
function optionalPayloadString(payload, field) {
|
|
65
|
+
const value = payload.payload[field];
|
|
66
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
67
|
+
}
|
|
68
|
+
function normalizePayloadTxid(payload) {
|
|
69
|
+
const transaction = optionalPayloadString(payload, "transaction");
|
|
70
|
+
if (!transaction)
|
|
71
|
+
return "";
|
|
72
|
+
try {
|
|
73
|
+
return normalizeTxid(transaction);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
return "";
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function payloadPayer(payload) {
|
|
80
|
+
return optionalPayloadString(payload, "payer");
|
|
81
|
+
}
|
|
82
|
+
function transferMatches(value, proof) {
|
|
83
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
84
|
+
return false;
|
|
85
|
+
const event = value;
|
|
86
|
+
const expectedType = proof.asset === "sbtc" ? "ft_asset" : "stx_asset";
|
|
87
|
+
if (event.type !== expectedType)
|
|
88
|
+
return false;
|
|
89
|
+
const assetKey = proof.asset === "sbtc" ? "ft_asset" : "stx_asset";
|
|
90
|
+
const assetValue = event[assetKey];
|
|
91
|
+
if (!assetValue || typeof assetValue !== "object" || Array.isArray(assetValue)) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
const asset = assetValue;
|
|
95
|
+
if (asset.type !== "transfer" ||
|
|
96
|
+
asset.sender !== proof.payer ||
|
|
97
|
+
asset.recipient !== proof.commerceContract ||
|
|
98
|
+
asset.amount !== proof.amount.toString()) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
return proof.asset === "stx" || asset.asset_identifier === proof.assetIdentifier;
|
|
102
|
+
}
|
|
103
|
+
function fundingLogMatches(value, proof, sbtcToken) {
|
|
104
|
+
if (!value || typeof value !== "object" || Array.isArray(value))
|
|
105
|
+
return false;
|
|
106
|
+
const event = value;
|
|
107
|
+
if (event.type !== "contract_log")
|
|
108
|
+
return false;
|
|
109
|
+
if (!event.contract_log ||
|
|
110
|
+
typeof event.contract_log !== "object" ||
|
|
111
|
+
Array.isArray(event.contract_log)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const log = event.contract_log;
|
|
115
|
+
if (log.contract_id !== proof.commerceContract || log.topic !== "print") {
|
|
116
|
+
return false;
|
|
117
|
+
}
|
|
118
|
+
if (!log.value || typeof log.value !== "object" || Array.isArray(log.value)) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const hex = log.value.hex;
|
|
122
|
+
if (typeof hex !== "string" || hex.length === 0)
|
|
123
|
+
return false;
|
|
124
|
+
try {
|
|
125
|
+
const tuple = expectTuple(deserializeCV(hex), "x402 funding event");
|
|
126
|
+
if (expectString(tuple.event, "x402 funding event.event") !== "job-funded" ||
|
|
127
|
+
expectUint(tuple["job-id"], "x402 funding event.job-id") !== proof.jobId ||
|
|
128
|
+
expectUint(tuple.amount, "x402 funding event.amount") !== proof.amount) {
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
return (proof.asset === "stx" ||
|
|
132
|
+
expectPrincipal(tuple.token, "x402 funding event.token") === sbtcToken);
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
return false;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
function requirementFailure(cause) {
|
|
139
|
+
return verificationError("invalid_payment_requirements", "The payment requirements are not valid for the configured PerkOS deployment.", { cause });
|
|
140
|
+
}
|
|
141
|
+
function payloadFailure(cause) {
|
|
142
|
+
return verificationError("invalid_payload", "The payment payload is not a valid PerkOS Stacks proof.", { cause });
|
|
143
|
+
}
|
|
144
|
+
export function perkosX402ReplayKey(network, txid) {
|
|
145
|
+
return `${network}:${normalizeTxid(txid)}`;
|
|
146
|
+
}
|
|
147
|
+
export class HiroX402TransactionSource {
|
|
148
|
+
apiUrl;
|
|
149
|
+
fetch;
|
|
150
|
+
constructor(options) {
|
|
151
|
+
this.apiUrl = normalizeApiUrl(options.apiUrl ?? DEFAULT_API_URL[options.network], "HiroX402TransactionSource apiUrl");
|
|
152
|
+
this.fetch = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
153
|
+
}
|
|
154
|
+
async getTransaction(txidInput) {
|
|
155
|
+
const txid = normalizeTxid(txidInput);
|
|
156
|
+
let response;
|
|
157
|
+
try {
|
|
158
|
+
response = await this.fetch(`${this.apiUrl}/extended/v3/transactions/${encodeURIComponent(txid)}`, { headers: { accept: "application/json" } });
|
|
159
|
+
}
|
|
160
|
+
catch (cause) {
|
|
161
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Could not reach the Stacks transaction API.", { cause, txid });
|
|
162
|
+
}
|
|
163
|
+
if (response.status === 404)
|
|
164
|
+
return null;
|
|
165
|
+
if (!response.ok) {
|
|
166
|
+
const body = await response.text().catch(() => "");
|
|
167
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", `Stacks transaction API returned HTTP ${response.status}.`, { txid, status: response.status, body: body.slice(0, 500) });
|
|
168
|
+
}
|
|
169
|
+
let transaction;
|
|
170
|
+
try {
|
|
171
|
+
transaction = await response.json();
|
|
172
|
+
}
|
|
173
|
+
catch (cause) {
|
|
174
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Stacks transaction API returned invalid JSON.", { cause, txid });
|
|
175
|
+
}
|
|
176
|
+
let eventsResponse;
|
|
177
|
+
try {
|
|
178
|
+
eventsResponse = await this.fetch(`${this.apiUrl}/extended/v3/transactions/${encodeURIComponent(txid)}/events?limit=50`, { headers: { accept: "application/json" } });
|
|
179
|
+
}
|
|
180
|
+
catch (cause) {
|
|
181
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Could not reach the Stacks transaction events API.", { cause, txid });
|
|
182
|
+
}
|
|
183
|
+
if (!eventsResponse.ok) {
|
|
184
|
+
const body = await eventsResponse.text().catch(() => "");
|
|
185
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", `Stacks transaction events API returned HTTP ${eventsResponse.status}.`, { txid, status: eventsResponse.status, body: body.slice(0, 500) });
|
|
186
|
+
}
|
|
187
|
+
let events;
|
|
188
|
+
try {
|
|
189
|
+
events = await eventsResponse.json();
|
|
190
|
+
}
|
|
191
|
+
catch (cause) {
|
|
192
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Stacks transaction events API returned invalid JSON.", { cause, txid });
|
|
193
|
+
}
|
|
194
|
+
return { transaction, events };
|
|
195
|
+
}
|
|
196
|
+
async getChainTip() {
|
|
197
|
+
let response;
|
|
198
|
+
try {
|
|
199
|
+
response = await this.fetch(`${this.apiUrl}/v2/info`, {
|
|
200
|
+
headers: { accept: "application/json" },
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
catch (cause) {
|
|
204
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Could not read the Stacks chain tip.", { cause });
|
|
205
|
+
}
|
|
206
|
+
if (!response.ok) {
|
|
207
|
+
const body = await response.text().catch(() => "");
|
|
208
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", `Stacks chain info API returned HTTP ${response.status}.`, { status: response.status, body: body.slice(0, 500) });
|
|
209
|
+
}
|
|
210
|
+
let raw;
|
|
211
|
+
try {
|
|
212
|
+
raw = await response.json();
|
|
213
|
+
}
|
|
214
|
+
catch (cause) {
|
|
215
|
+
throw new PerkOSError("X402_PAYMENT_FAILED", "Stacks chain info API returned invalid JSON.", { cause });
|
|
216
|
+
}
|
|
217
|
+
const record = asRecord(raw, "chain info response");
|
|
218
|
+
return requiredInteger(record, "stacks_tip_height");
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
export class InMemoryX402ReplayStore {
|
|
222
|
+
records = new Map();
|
|
223
|
+
async has(key) {
|
|
224
|
+
return this.records.has(key);
|
|
225
|
+
}
|
|
226
|
+
async consume(key, record) {
|
|
227
|
+
if (this.records.has(key))
|
|
228
|
+
return false;
|
|
229
|
+
this.records.set(key, record);
|
|
230
|
+
return true;
|
|
231
|
+
}
|
|
232
|
+
get(key) {
|
|
233
|
+
return this.records.get(key);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
export class PerkOSX402Facilitator {
|
|
237
|
+
scheme = PERKOS_X402_SCHEME;
|
|
238
|
+
caipFamily = "stacks:*";
|
|
239
|
+
config;
|
|
240
|
+
replayStore;
|
|
241
|
+
transactionSource;
|
|
242
|
+
minConfirmations;
|
|
243
|
+
clockSkewSeconds;
|
|
244
|
+
now;
|
|
245
|
+
constructor(options) {
|
|
246
|
+
this.config = options.config;
|
|
247
|
+
this.replayStore = options.replayStore;
|
|
248
|
+
this.transactionSource =
|
|
249
|
+
options.transactionSource ??
|
|
250
|
+
new HiroX402TransactionSource({
|
|
251
|
+
network: options.config.network,
|
|
252
|
+
...(options.config.apiUrl ? { apiUrl: options.config.apiUrl } : {}),
|
|
253
|
+
});
|
|
254
|
+
this.minConfirmations = positiveInteger(options.minConfirmations, DEFAULT_MIN_CONFIRMATIONS, "minConfirmations");
|
|
255
|
+
this.clockSkewSeconds = nonNegativeInteger(options.clockSkewSeconds, DEFAULT_CLOCK_SKEW_SECONDS, "clockSkewSeconds");
|
|
256
|
+
this.now = options.now ?? Date.now;
|
|
257
|
+
}
|
|
258
|
+
getExtra(network) {
|
|
259
|
+
try {
|
|
260
|
+
if (fromStacksX402Network(network) !== this.config.network)
|
|
261
|
+
return undefined;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return undefined;
|
|
265
|
+
}
|
|
266
|
+
return {
|
|
267
|
+
assetTransferMethod: PERKOS_X402_ASSET_TRANSFER_METHOD,
|
|
268
|
+
paymentFlow: PERKOS_X402_PAYMENT_FLOW,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
getSigners(_network) {
|
|
272
|
+
return [];
|
|
273
|
+
}
|
|
274
|
+
async verify(payload, requirements) {
|
|
275
|
+
try {
|
|
276
|
+
const verified = await this.inspect(payload, requirements);
|
|
277
|
+
return {
|
|
278
|
+
isValid: true,
|
|
279
|
+
payer: verified.payer,
|
|
280
|
+
extra: {
|
|
281
|
+
transaction: verified.transaction,
|
|
282
|
+
blockHeight: verified.blockHeight,
|
|
283
|
+
confirmations: verified.confirmations,
|
|
284
|
+
},
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
catch (cause) {
|
|
288
|
+
const failure = this.asVerificationError(cause);
|
|
289
|
+
const payer = payloadPayer(payload);
|
|
290
|
+
return {
|
|
291
|
+
isValid: false,
|
|
292
|
+
invalidReason: failure.reason,
|
|
293
|
+
invalidMessage: failure.message,
|
|
294
|
+
...(payer ? { payer } : {}),
|
|
295
|
+
};
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
async settle(payload, requirements) {
|
|
299
|
+
const network = toStacksX402Network(this.config.network);
|
|
300
|
+
const claimedTransaction = normalizePayloadTxid(payload);
|
|
301
|
+
const claimedPayer = payloadPayer(payload);
|
|
302
|
+
try {
|
|
303
|
+
const verified = await this.inspect(payload, requirements);
|
|
304
|
+
const record = {
|
|
305
|
+
key: verified.replayKey,
|
|
306
|
+
network: verified.network,
|
|
307
|
+
transaction: verified.transaction,
|
|
308
|
+
payer: verified.payer,
|
|
309
|
+
asset: verified.asset,
|
|
310
|
+
jobId: verified.jobId.toString(),
|
|
311
|
+
amount: verified.amount.toString(),
|
|
312
|
+
...(payload.resource?.url ? { resource: payload.resource.url } : {}),
|
|
313
|
+
consumedAt: new Date(this.now()).toISOString(),
|
|
314
|
+
};
|
|
315
|
+
let consumed;
|
|
316
|
+
try {
|
|
317
|
+
consumed = await this.replayStore.consume(verified.replayKey, record);
|
|
318
|
+
}
|
|
319
|
+
catch (cause) {
|
|
320
|
+
throw verificationError("replay_store_unavailable", "The replay store could not consume the payment proof.", { cause });
|
|
321
|
+
}
|
|
322
|
+
if (!consumed) {
|
|
323
|
+
throw verificationError("payment_already_used", "The Stacks funding transaction was already consumed.");
|
|
324
|
+
}
|
|
325
|
+
return {
|
|
326
|
+
success: true,
|
|
327
|
+
payer: verified.payer,
|
|
328
|
+
transaction: verified.transaction,
|
|
329
|
+
network,
|
|
330
|
+
amount: verified.amount.toString(),
|
|
331
|
+
extra: {
|
|
332
|
+
asset: verified.asset,
|
|
333
|
+
jobId: verified.jobId.toString(),
|
|
334
|
+
blockHeight: verified.blockHeight,
|
|
335
|
+
confirmations: verified.confirmations,
|
|
336
|
+
},
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
catch (cause) {
|
|
340
|
+
const failure = this.asVerificationError(cause);
|
|
341
|
+
return {
|
|
342
|
+
success: false,
|
|
343
|
+
errorReason: failure.reason,
|
|
344
|
+
errorMessage: failure.message,
|
|
345
|
+
...(claimedPayer ? { payer: claimedPayer } : {}),
|
|
346
|
+
transaction: claimedTransaction,
|
|
347
|
+
network,
|
|
348
|
+
};
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
async inspect(payload, requirements) {
|
|
352
|
+
if (!deepEqual(payload.accepted, requirements)) {
|
|
353
|
+
throw verificationError("payment_requirements_mismatch", "The payload accepted requirements do not match the server requirements.");
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
parsePerkOSX402Requirement(this.config, requirements);
|
|
357
|
+
}
|
|
358
|
+
catch (cause) {
|
|
359
|
+
throw requirementFailure(cause);
|
|
360
|
+
}
|
|
361
|
+
let proof;
|
|
362
|
+
try {
|
|
363
|
+
proof = parsePerkOSX402PaymentPayload(this.config, payload);
|
|
364
|
+
}
|
|
365
|
+
catch (cause) {
|
|
366
|
+
throw payloadFailure(cause);
|
|
367
|
+
}
|
|
368
|
+
let raw;
|
|
369
|
+
try {
|
|
370
|
+
raw = await this.transactionSource.getTransaction(proof.transaction);
|
|
371
|
+
}
|
|
372
|
+
catch (cause) {
|
|
373
|
+
throw verificationError("verification_unavailable", "The Stacks transaction could not be loaded.", { cause });
|
|
374
|
+
}
|
|
375
|
+
if (raw === null) {
|
|
376
|
+
throw verificationError("transaction_not_found", "The Stacks funding transaction was not found.");
|
|
377
|
+
}
|
|
378
|
+
const evidence = asRecord(raw, "transaction evidence");
|
|
379
|
+
const transaction = asRecord(evidence.transaction, "transaction");
|
|
380
|
+
const apiTxid = normalizeTxid(requiredString(transaction, "tx_id"));
|
|
381
|
+
if (apiTxid !== proof.transaction) {
|
|
382
|
+
throw verificationError("transaction_mismatch", "The Stacks API returned a different transaction ID.");
|
|
383
|
+
}
|
|
384
|
+
if (requiredString(transaction, "status") !== "success") {
|
|
385
|
+
throw verificationError("invalid_transaction_state", "The Stacks funding transaction did not execute successfully.");
|
|
386
|
+
}
|
|
387
|
+
if (requiredString(transaction, "type") !== "contract_call") {
|
|
388
|
+
throw verificationError("invalid_transaction_type", "The payment proof is not a Stacks contract call.");
|
|
389
|
+
}
|
|
390
|
+
const sender = asRecord(transaction.sender, "transaction sender");
|
|
391
|
+
if (requiredString(sender, "address") !== proof.payer) {
|
|
392
|
+
throw verificationError("payer_mismatch", "The Stacks transaction sender does not match the payment payer.");
|
|
393
|
+
}
|
|
394
|
+
const call = asRecord(transaction.contract_call, "contract call");
|
|
395
|
+
if (requiredString(call, "contract_id") !== proof.commerceContract) {
|
|
396
|
+
throw verificationError("contract_mismatch", "The funding call contract does not match the payment requirement.");
|
|
397
|
+
}
|
|
398
|
+
if (requiredString(call, "function_name") !== "fund-job") {
|
|
399
|
+
throw verificationError("function_mismatch", "The Stacks transaction did not call fund-job.");
|
|
400
|
+
}
|
|
401
|
+
const eventsPage = asRecord(evidence.events, "transaction events page");
|
|
402
|
+
if (!Array.isArray(eventsPage.results)) {
|
|
403
|
+
throw verificationError("verification_unavailable", "The Stacks API response has no transaction events.");
|
|
404
|
+
}
|
|
405
|
+
const eventTotal = requiredInteger(eventsPage, "total");
|
|
406
|
+
if (eventTotal !== eventsPage.results.length) {
|
|
407
|
+
throw verificationError("verification_unavailable", "The Stacks transaction event page is incomplete.");
|
|
408
|
+
}
|
|
409
|
+
if (!eventsPage.results.some((event) => fundingLogMatches(event, proof, this.config.contracts.sbtcToken))) {
|
|
410
|
+
throw verificationError("funding_event_mismatch", "No exact job-funded contract event matches the payment requirement.");
|
|
411
|
+
}
|
|
412
|
+
if (!eventsPage.results.some((event) => transferMatches(event, proof))) {
|
|
413
|
+
throw verificationError("transfer_mismatch", "No exact escrow transfer event matches the payment requirement.");
|
|
414
|
+
}
|
|
415
|
+
const block = asRecord(transaction.block, "transaction block");
|
|
416
|
+
const blockHeight = requiredInteger(block, "height");
|
|
417
|
+
const blockHash = requiredString(block, "hash");
|
|
418
|
+
const blockTime = requiredInteger(block, "time");
|
|
419
|
+
if ((proof.blockHeight !== undefined && proof.blockHeight !== blockHeight) ||
|
|
420
|
+
(proof.blockHash !== undefined && proof.blockHash !== blockHash)) {
|
|
421
|
+
throw verificationError("proof_block_mismatch", "The client proof block metadata does not match the Stacks API.");
|
|
422
|
+
}
|
|
423
|
+
let chainTip;
|
|
424
|
+
try {
|
|
425
|
+
chainTip = await this.transactionSource.getChainTip();
|
|
426
|
+
}
|
|
427
|
+
catch (cause) {
|
|
428
|
+
throw verificationError("verification_unavailable", "The Stacks chain tip could not be loaded.", { cause });
|
|
429
|
+
}
|
|
430
|
+
if (!Number.isSafeInteger(chainTip) || chainTip < blockHeight) {
|
|
431
|
+
throw verificationError("verification_unavailable", "The Stacks chain tip is inconsistent with the transaction block.");
|
|
432
|
+
}
|
|
433
|
+
const confirmations = chainTip - blockHeight + 1;
|
|
434
|
+
if (confirmations < this.minConfirmations) {
|
|
435
|
+
throw verificationError("insufficient_confirmations", "The Stacks funding transaction has insufficient confirmations.", { confirmations, required: this.minConfirmations });
|
|
436
|
+
}
|
|
437
|
+
const nowSeconds = Math.floor(this.now() / 1_000);
|
|
438
|
+
if (!Number.isSafeInteger(nowSeconds) || nowSeconds < 0) {
|
|
439
|
+
throw verificationError("verification_unavailable", "The verifier clock returned an invalid time.");
|
|
440
|
+
}
|
|
441
|
+
if (blockTime > nowSeconds + this.clockSkewSeconds) {
|
|
442
|
+
throw verificationError("transaction_time_in_future", "The Stacks funding transaction time is in the future.");
|
|
443
|
+
}
|
|
444
|
+
if (nowSeconds - blockTime >
|
|
445
|
+
proof.maxTimeoutSeconds + this.clockSkewSeconds) {
|
|
446
|
+
throw verificationError("payment_expired", "The Stacks funding transaction is older than the x402 payment window.");
|
|
447
|
+
}
|
|
448
|
+
const replayKey = perkosX402ReplayKey(proof.network, proof.transaction);
|
|
449
|
+
let alreadyUsed;
|
|
450
|
+
try {
|
|
451
|
+
alreadyUsed = await this.replayStore.has(replayKey);
|
|
452
|
+
}
|
|
453
|
+
catch (cause) {
|
|
454
|
+
throw verificationError("replay_store_unavailable", "The replay store could not check the payment proof.", { cause });
|
|
455
|
+
}
|
|
456
|
+
if (alreadyUsed) {
|
|
457
|
+
throw verificationError("payment_already_used", "The Stacks funding transaction was already consumed.");
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
network: proof.network,
|
|
461
|
+
transaction: proof.transaction,
|
|
462
|
+
payer: proof.payer,
|
|
463
|
+
asset: proof.asset,
|
|
464
|
+
jobId: proof.jobId,
|
|
465
|
+
amount: proof.amount,
|
|
466
|
+
commerceContract: proof.commerceContract,
|
|
467
|
+
blockHeight,
|
|
468
|
+
blockHash,
|
|
469
|
+
blockTime,
|
|
470
|
+
confirmations,
|
|
471
|
+
replayKey,
|
|
472
|
+
};
|
|
473
|
+
}
|
|
474
|
+
asVerificationError(cause) {
|
|
475
|
+
if (cause instanceof PerkOSX402VerificationError)
|
|
476
|
+
return cause;
|
|
477
|
+
return verificationError("unexpected_verify_error", "The Stacks payment proof could not be verified.", { cause });
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
//# sourceMappingURL=x402-facilitator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"x402-facilitator.js","sourceRoot":"","sources":["../src/x402-facilitator.ts"],"names":[],"mappings":"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"}
|