chit402-verify 0.3.5 → 0.4.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/LICENSE +1 -1
- package/README.md +205 -17
- package/dist/anchor-trust.d.ts +144 -0
- package/dist/anchor-trust.d.ts.map +1 -0
- package/dist/anchor-trust.js +441 -0
- package/dist/anchor-trust.js.map +1 -0
- package/dist/anchor-witness.d.ts +265 -0
- package/dist/anchor-witness.d.ts.map +1 -0
- package/dist/anchor-witness.js +833 -0
- package/dist/anchor-witness.js.map +1 -0
- package/dist/base-payer.d.ts +65 -0
- package/dist/base-payer.d.ts.map +1 -0
- package/dist/base-payer.js +222 -0
- package/dist/base-payer.js.map +1 -0
- package/dist/binding.d.ts +52 -0
- package/dist/binding.d.ts.map +1 -0
- package/dist/binding.js +80 -0
- package/dist/binding.js.map +1 -0
- package/dist/canonical-preimage.d.ts +9 -0
- package/dist/canonical-preimage.d.ts.map +1 -0
- package/dist/canonical-preimage.js +25 -0
- package/dist/canonical-preimage.js.map +1 -0
- package/dist/carry-forward.d.ts +79 -0
- package/dist/carry-forward.d.ts.map +1 -0
- package/dist/carry-forward.js +184 -0
- package/dist/carry-forward.js.map +1 -0
- package/dist/cli.d.ts +18 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +2090 -0
- package/dist/cli.js.map +1 -0
- package/dist/epoch.d.ts +143 -0
- package/dist/epoch.d.ts.map +1 -0
- package/dist/epoch.js +352 -0
- package/dist/epoch.js.map +1 -0
- package/dist/head-binding.d.ts +24 -0
- package/dist/head-binding.d.ts.map +1 -0
- package/dist/head-binding.js +61 -0
- package/dist/head-binding.js.map +1 -0
- package/dist/index.d.ts +585 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1648 -0
- package/dist/index.js.map +1 -0
- package/dist/issuer-history.d.ts +151 -0
- package/dist/issuer-history.d.ts.map +1 -0
- package/dist/issuer-history.js +595 -0
- package/dist/issuer-history.js.map +1 -0
- package/dist/issuer-pin.d.ts +126 -0
- package/dist/issuer-pin.d.ts.map +1 -0
- package/dist/issuer-pin.js +567 -0
- package/dist/issuer-pin.js.map +1 -0
- package/dist/jcs.d.ts +8 -0
- package/dist/jcs.d.ts.map +1 -0
- package/dist/jcs.js +64 -0
- package/dist/jcs.js.map +1 -0
- package/dist/jws.d.ts +46 -0
- package/dist/jws.d.ts.map +1 -0
- package/dist/jws.js +129 -0
- package/dist/jws.js.map +1 -0
- package/dist/payer.d.ts +65 -0
- package/dist/payer.d.ts.map +1 -0
- package/dist/payer.js +148 -0
- package/dist/payer.js.map +1 -0
- package/dist/preimage.d.ts +78 -0
- package/dist/preimage.d.ts.map +1 -0
- package/dist/preimage.js +363 -0
- package/dist/preimage.js.map +1 -0
- package/dist/receipt-lane.d.ts +235 -0
- package/dist/receipt-lane.d.ts.map +1 -0
- package/dist/receipt-lane.js +446 -0
- package/dist/receipt-lane.js.map +1 -0
- package/dist/receipt-version.d.ts +98 -0
- package/dist/receipt-version.d.ts.map +1 -0
- package/dist/receipt-version.js +364 -0
- package/dist/receipt-version.js.map +1 -0
- package/dist/refusal.d.ts +93 -0
- package/dist/refusal.d.ts.map +1 -0
- package/dist/refusal.js +249 -0
- package/dist/refusal.js.map +1 -0
- package/dist/request-binding.d.ts +7 -0
- package/dist/request-binding.d.ts.map +1 -0
- package/dist/request-binding.js +26 -0
- package/dist/request-binding.js.map +1 -0
- package/dist/row-hash.d.ts +22 -0
- package/dist/row-hash.d.ts.map +1 -0
- package/dist/row-hash.js +26 -0
- package/dist/row-hash.js.map +1 -0
- package/dist/shell.d.ts +65 -0
- package/dist/shell.d.ts.map +1 -0
- package/dist/shell.js +268 -0
- package/dist/shell.js.map +1 -0
- package/dist/solana-payer.d.ts +99 -0
- package/dist/solana-payer.d.ts.map +1 -0
- package/dist/solana-payer.js +258 -0
- package/dist/solana-payer.js.map +1 -0
- package/dist/v11-receipt.d.ts +23 -0
- package/dist/v11-receipt.d.ts.map +1 -0
- package/dist/v11-receipt.js +368 -0
- package/dist/v11-receipt.js.map +1 -0
- package/dist/verdict.d.ts +94 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +381 -0
- package/dist/verdict.js.map +1 -0
- package/issuer-history.snapshot.json +1 -0
- package/package.json +32 -22
- package/cli.js +0 -42
- package/index.cjs +0 -8
- package/index.d.ts +0 -5
- package/index.js +0 -7
package/dist/shell.js
ADDED
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.INCLUDED_SHELL_LINE = exports.SHELL_SCHEMA = void 0;
|
|
7
|
+
exports.isReceiptShell = isReceiptShell;
|
|
8
|
+
exports.decodeJwsPayload = decodeJwsPayload;
|
|
9
|
+
exports.shellFromHolder = shellFromHolder;
|
|
10
|
+
exports.holderDocumentFromOwnerView = holderDocumentFromOwnerView;
|
|
11
|
+
exports.shellHolderVerdict = shellHolderVerdict;
|
|
12
|
+
exports.signedShellFromHolder = signedShellFromHolder;
|
|
13
|
+
exports.compareShellToJws = compareShellToJws;
|
|
14
|
+
exports.openV11Commitment = openV11Commitment;
|
|
15
|
+
/**
|
|
16
|
+
* Public receipt shell verdicts.
|
|
17
|
+
* A shell is inclusion and payment facts without the holder signature.
|
|
18
|
+
* INCLUDED_SHELL is never VERIFIED. A gated URL without the holder JWS
|
|
19
|
+
* is owner_proof_required.
|
|
20
|
+
* `--jws` is VERIFIED only when the holder key is trusted, inclusion
|
|
21
|
+
* passed, and the signed payment is present. The key inside the holder
|
|
22
|
+
* is not a trust root.
|
|
23
|
+
*/
|
|
24
|
+
const node_crypto_1 = __importDefault(require("node:crypto"));
|
|
25
|
+
exports.SHELL_SCHEMA = 'chit402.receipt_shell.v1';
|
|
26
|
+
exports.INCLUDED_SHELL_LINE = 'INCLUDED_SHELL: signature requires owner view';
|
|
27
|
+
function isReceiptShell(doc) {
|
|
28
|
+
return !!doc && typeof doc === 'object' && doc.schema === exports.SHELL_SCHEMA;
|
|
29
|
+
}
|
|
30
|
+
function jcs(value) {
|
|
31
|
+
return JSON.stringify(canonicalize(value));
|
|
32
|
+
}
|
|
33
|
+
function canonicalize(value) {
|
|
34
|
+
if (Array.isArray(value))
|
|
35
|
+
return value.map(canonicalize);
|
|
36
|
+
if (value && typeof value === 'object') {
|
|
37
|
+
const out = {};
|
|
38
|
+
for (const key of Object.keys(value).sort()) {
|
|
39
|
+
const child = value[key];
|
|
40
|
+
if (child === undefined)
|
|
41
|
+
continue;
|
|
42
|
+
out[key] = canonicalize(child);
|
|
43
|
+
}
|
|
44
|
+
return out;
|
|
45
|
+
}
|
|
46
|
+
return value;
|
|
47
|
+
}
|
|
48
|
+
function decodeJwsPayload(jws) {
|
|
49
|
+
if (typeof jws !== 'string')
|
|
50
|
+
return null;
|
|
51
|
+
const parts = jws.split('.');
|
|
52
|
+
if (parts.length !== 3)
|
|
53
|
+
return null;
|
|
54
|
+
try {
|
|
55
|
+
return JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function minuteIso(value) {
|
|
62
|
+
if (value == null || value === '')
|
|
63
|
+
return null;
|
|
64
|
+
const ms = typeof value === 'number'
|
|
65
|
+
? (value < 1e12 ? value * 1000 : value)
|
|
66
|
+
: Date.parse(String(value));
|
|
67
|
+
if (!Number.isFinite(ms))
|
|
68
|
+
return null;
|
|
69
|
+
const date = new Date(ms);
|
|
70
|
+
date.setUTCSeconds(0, 0);
|
|
71
|
+
return date.toISOString();
|
|
72
|
+
}
|
|
73
|
+
function paymentOf(claims, receipt) {
|
|
74
|
+
const payment = (claims?.payment && typeof claims.payment === 'object')
|
|
75
|
+
? claims.payment
|
|
76
|
+
: {};
|
|
77
|
+
const outer = (receipt.payment && typeof receipt.payment === 'object')
|
|
78
|
+
? receipt.payment
|
|
79
|
+
: {};
|
|
80
|
+
return { ...outer, ...payment };
|
|
81
|
+
}
|
|
82
|
+
/** Project the public shell from a holder receipt. Leaf proof is not invented. */
|
|
83
|
+
function shellFromHolder(receipt) {
|
|
84
|
+
const issuer = (receipt.issuer_signature && typeof receipt.issuer_signature === 'object')
|
|
85
|
+
? receipt.issuer_signature
|
|
86
|
+
: {};
|
|
87
|
+
const claims = decodeJwsPayload(issuer.jws) || {};
|
|
88
|
+
const payment = paymentOf(claims, receipt);
|
|
89
|
+
const ref = String(payment.ref || '');
|
|
90
|
+
const prefix = ref.includes(':') ? ref.slice(0, ref.indexOf(':')) : '';
|
|
91
|
+
const network = String(payment.network || receipt.payment_meta?.network || prefix || '');
|
|
92
|
+
const tx = ref.includes(':') ? ref.slice(ref.indexOf(':') + 1) : (ref || null);
|
|
93
|
+
const receiptId = (receipt.task_id || claims.task_id || receipt.receipt_id || null);
|
|
94
|
+
const gross = payment.gross_amount ?? null;
|
|
95
|
+
const settled = payment.settled_amount ?? null;
|
|
96
|
+
const inclusion = (receipt.inclusion && typeof receipt.inclusion === 'object')
|
|
97
|
+
? receipt.inclusion
|
|
98
|
+
: null;
|
|
99
|
+
return {
|
|
100
|
+
schema: exports.SHELL_SCHEMA,
|
|
101
|
+
unsigned: true,
|
|
102
|
+
receipt_id: receiptId,
|
|
103
|
+
task_id: receiptId,
|
|
104
|
+
payload_version: claims.payload_version ?? issuer.payload_version ?? null,
|
|
105
|
+
asset: payment.asset || 'USDC',
|
|
106
|
+
chain: network || null,
|
|
107
|
+
pay_to: payment.payee ?? null,
|
|
108
|
+
amount_gross: gross == null ? null : String(gross),
|
|
109
|
+
amount_settled: settled == null ? null : String(settled),
|
|
110
|
+
payment_tx: tx,
|
|
111
|
+
issued_at: minuteIso(claims.iat ?? receipt.created_at ?? receipt.issued_at ?? null),
|
|
112
|
+
inclusion: {
|
|
113
|
+
leaf_hash: inclusion?.leaf || inclusion?.leaf_hash || null,
|
|
114
|
+
proof: inclusion?.proof ?? null,
|
|
115
|
+
signed_head: inclusion?.root
|
|
116
|
+
? { root: inclusion.root, tree_size: inclusion.tree_size ?? null, signature: null }
|
|
117
|
+
: null,
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
const COMPARE_FIELDS = [
|
|
122
|
+
'receipt_id',
|
|
123
|
+
'payload_version',
|
|
124
|
+
'asset',
|
|
125
|
+
'chain',
|
|
126
|
+
'pay_to',
|
|
127
|
+
'amount_gross',
|
|
128
|
+
'amount_settled',
|
|
129
|
+
'payment_tx',
|
|
130
|
+
'issued_at',
|
|
131
|
+
];
|
|
132
|
+
/**
|
|
133
|
+
* The owner view returns `{ jws, salt, private_fields }`. A saved holder
|
|
134
|
+
* receipt has `issuer_signature`. Either can be the `--jws` file.
|
|
135
|
+
* An `issuer_jwk` on the owner-view body is ignored. Trust is a pinned
|
|
136
|
+
* kid or a JWKS entry, not a key the response carries.
|
|
137
|
+
*/
|
|
138
|
+
function holderDocumentFromOwnerView(doc) {
|
|
139
|
+
if (typeof doc === 'string') {
|
|
140
|
+
const compact = doc.trim();
|
|
141
|
+
if (compact.split('.').length === 3)
|
|
142
|
+
return holderDocumentFromOwnerView({ jws: compact });
|
|
143
|
+
throw new Error('holder is not a receipt or an owner-view response');
|
|
144
|
+
}
|
|
145
|
+
const signature = doc.issuer_signature;
|
|
146
|
+
if (signature && typeof signature === 'object' && typeof signature.jws === 'string') {
|
|
147
|
+
return doc;
|
|
148
|
+
}
|
|
149
|
+
const jws = typeof doc.jws === 'string' ? doc.jws : null;
|
|
150
|
+
if (!jws || jws.split('.').length !== 3) {
|
|
151
|
+
throw new Error('owner view is missing the holder JWS');
|
|
152
|
+
}
|
|
153
|
+
const claims = decodeJwsPayload(jws) || {};
|
|
154
|
+
let kid;
|
|
155
|
+
try {
|
|
156
|
+
const header = JSON.parse(Buffer.from(jws.split('.')[0], 'base64url').toString('utf8'));
|
|
157
|
+
if (typeof header.kid === 'string')
|
|
158
|
+
kid = header.kid;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
kid = undefined;
|
|
162
|
+
}
|
|
163
|
+
// Owner view carries this receipt's own book row hash so the leaf
|
|
164
|
+
// task_id|row_hash can be rebuilt. It is not a signed claim; the leaf
|
|
165
|
+
// still has to be in a signed tree head.
|
|
166
|
+
const rowHash = typeof doc.row_hash === 'string' && /^[0-9a-f]{64}$/i.test(doc.row_hash) ? doc.row_hash : null;
|
|
167
|
+
return {
|
|
168
|
+
...claims,
|
|
169
|
+
task_id: claims.task_id ?? null,
|
|
170
|
+
...(rowHash ? { book_chain: { row_hash: rowHash } } : {}),
|
|
171
|
+
issuer_signature: {
|
|
172
|
+
jws,
|
|
173
|
+
kid,
|
|
174
|
+
payload_version: claims.payload_version ?? null,
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* VERIFIED requires a trusted issuer key, a passing inclusion proof, and a
|
|
180
|
+
* signed payment. A shell alone, a missing proof, or a key that only
|
|
181
|
+
* verifies because it is embedded in the holder is not VERIFIED.
|
|
182
|
+
*/
|
|
183
|
+
function shellHolderVerdict(check) {
|
|
184
|
+
if (!check.signatureValid || !check.keyTrusted) {
|
|
185
|
+
return { verified: false, reason: check.signatureReason || 'key untrusted' };
|
|
186
|
+
}
|
|
187
|
+
if (!check.inclusionSupplied || !check.inclusionOk) {
|
|
188
|
+
return { verified: false, reason: check.inclusionReason || 'inclusion_missing' };
|
|
189
|
+
}
|
|
190
|
+
const shellLeaf = check.shellLeaf ? String(check.shellLeaf).replace(/^0x/i, '').toLowerCase() : '';
|
|
191
|
+
const proved = check.provedLeaf ? String(check.provedLeaf).replace(/^0x/i, '').toLowerCase() : '';
|
|
192
|
+
if (shellLeaf && proved && shellLeaf !== proved) {
|
|
193
|
+
return { verified: false, reason: 'inclusion_mismatch' };
|
|
194
|
+
}
|
|
195
|
+
if (shellLeaf && !proved) {
|
|
196
|
+
return { verified: false, reason: 'inclusion_mismatch' };
|
|
197
|
+
}
|
|
198
|
+
// A {root, tree_size} written by hand (or a proof's own root) is not a log.
|
|
199
|
+
if (check.headSigned !== true) {
|
|
200
|
+
return { verified: false, reason: 'head_signature_missing' };
|
|
201
|
+
}
|
|
202
|
+
const ref = check.paymentRef ? String(check.paymentRef) : '';
|
|
203
|
+
if (!ref)
|
|
204
|
+
return { verified: false, reason: 'payment_unchecked' };
|
|
205
|
+
if (check.bindingExpected && !check.bindingMatches) {
|
|
206
|
+
return { verified: false, reason: 'payment_unchecked' };
|
|
207
|
+
}
|
|
208
|
+
return { verified: true, reason: null };
|
|
209
|
+
}
|
|
210
|
+
/**
|
|
211
|
+
* Expected shell from the signed JWS claims only. Outer holder fields
|
|
212
|
+
* (payment.settled_amount, payment.network, payment_meta, task_id) are
|
|
213
|
+
* not signed and are not used, so they cannot ride along under VERIFIED.
|
|
214
|
+
*/
|
|
215
|
+
function signedShellFromHolder(holder) {
|
|
216
|
+
const holderDoc = typeof holder === 'string' ? { issuer_signature: { jws: holder } } : holder;
|
|
217
|
+
const sig = (holderDoc.issuer_signature && typeof holderDoc.issuer_signature === 'object')
|
|
218
|
+
? holderDoc.issuer_signature
|
|
219
|
+
: {};
|
|
220
|
+
return shellFromHolder({ issuer_signature: { jws: typeof sig.jws === 'string' ? sig.jws : null } });
|
|
221
|
+
}
|
|
222
|
+
function compareShellToJws(shell, holder) {
|
|
223
|
+
const holderDoc = typeof holder === 'string' ? { issuer_signature: { jws: holder } } : holder;
|
|
224
|
+
const expected = signedShellFromHolder(holderDoc);
|
|
225
|
+
for (const field of COMPARE_FIELDS) {
|
|
226
|
+
if (String(shell[field] ?? '') !== String(expected[field] ?? '')) {
|
|
227
|
+
return { ok: false, field };
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
const shellLeaf = shell.inclusion?.leaf_hash ?? null;
|
|
231
|
+
const expectedLeaf = expected.inclusion?.leaf_hash ?? null;
|
|
232
|
+
if (shellLeaf && expectedLeaf && String(shellLeaf) !== String(expectedLeaf)) {
|
|
233
|
+
return { ok: false, field: 'inclusion.leaf_hash' };
|
|
234
|
+
}
|
|
235
|
+
return { ok: true };
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* v11: body_commitment = HMAC-SHA256(salt, raw body),
|
|
239
|
+
* request_digest = SHA-256 of the JCS object
|
|
240
|
+
* {body_commitment, idempotency_key, method, nonce, path}.
|
|
241
|
+
*/
|
|
242
|
+
function openV11Commitment(input) {
|
|
243
|
+
const payload = input.payload;
|
|
244
|
+
if (!payload || payload.request_digest == null)
|
|
245
|
+
return { ok: false, reason: 'no_v11_commitment' };
|
|
246
|
+
let salt;
|
|
247
|
+
try {
|
|
248
|
+
salt = Buffer.from(input.saltHex, 'hex');
|
|
249
|
+
}
|
|
250
|
+
catch {
|
|
251
|
+
return { ok: false, reason: 'bad_salt' };
|
|
252
|
+
}
|
|
253
|
+
if (salt.length !== 32)
|
|
254
|
+
return { ok: false, reason: 'bad_salt' };
|
|
255
|
+
const body = Buffer.isBuffer(input.body) ? input.body : Buffer.from(input.body);
|
|
256
|
+
const bodyCommitment = node_crypto_1.default.createHmac('sha256', salt).update(body).digest('hex');
|
|
257
|
+
const digest = node_crypto_1.default.createHash('sha256').update(jcs({
|
|
258
|
+
body_commitment: bodyCommitment,
|
|
259
|
+
idempotency_key: input.idempotencyKey ?? payload.idempotency_key ?? null,
|
|
260
|
+
method: input.method ?? payload.method ?? null,
|
|
261
|
+
nonce: input.nonce ?? payload.nonce ?? null,
|
|
262
|
+
path: input.path ?? payload.path ?? null,
|
|
263
|
+
})).digest('hex');
|
|
264
|
+
if (digest !== String(payload.request_digest))
|
|
265
|
+
return { ok: false, reason: 'commitment_mismatch' };
|
|
266
|
+
return { ok: true };
|
|
267
|
+
}
|
|
268
|
+
//# sourceMappingURL=shell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shell.js","sourceRoot":"","sources":["../src/shell.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Offline Solana payer verification for Chit402 receipts.
|
|
3
|
+
*
|
|
4
|
+
* When payment.ref starts with `solana:`, fetch the settled transaction and
|
|
5
|
+
* confirm a USDC transfer of payment.gross_amount involving caller_binding.payer_wallet
|
|
6
|
+
* as authority (x402 exact-svm) without trusting Chit logs.
|
|
7
|
+
*/
|
|
8
|
+
/** Solana mainnet USDC mint (SPL, 6 decimals). */
|
|
9
|
+
export declare const SOLANA_USDC_MINT_MAINNET = "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v";
|
|
10
|
+
/** Solana devnet USDC mint (SPL, 6 decimals). */
|
|
11
|
+
export declare const SOLANA_USDC_MINT_DEVNET = "Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr";
|
|
12
|
+
/** Default public Solana mainnet RPC (override with SOLANA_RPC_URL). */
|
|
13
|
+
export declare const SOLANA_RPC_URL = "https://api.mainnet-beta.solana.com";
|
|
14
|
+
export interface SolanaPayerVerification {
|
|
15
|
+
checked: boolean;
|
|
16
|
+
valid: boolean;
|
|
17
|
+
signature?: string;
|
|
18
|
+
payerWallet?: string;
|
|
19
|
+
expectedAmount?: string;
|
|
20
|
+
transferredAmount?: string;
|
|
21
|
+
mint?: string;
|
|
22
|
+
reason?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface SolanaRpcGetTransactionResult {
|
|
25
|
+
meta?: {
|
|
26
|
+
err?: unknown;
|
|
27
|
+
preTokenBalances?: Array<{
|
|
28
|
+
accountIndex: number;
|
|
29
|
+
mint: string;
|
|
30
|
+
owner?: string;
|
|
31
|
+
uiTokenAmount?: {
|
|
32
|
+
amount: string;
|
|
33
|
+
};
|
|
34
|
+
}>;
|
|
35
|
+
postTokenBalances?: Array<{
|
|
36
|
+
accountIndex: number;
|
|
37
|
+
mint: string;
|
|
38
|
+
owner?: string;
|
|
39
|
+
uiTokenAmount?: {
|
|
40
|
+
amount: string;
|
|
41
|
+
};
|
|
42
|
+
}>;
|
|
43
|
+
} | null;
|
|
44
|
+
transaction?: {
|
|
45
|
+
message?: {
|
|
46
|
+
accountKeys?: Array<{
|
|
47
|
+
pubkey: string;
|
|
48
|
+
signer?: boolean;
|
|
49
|
+
} | string>;
|
|
50
|
+
instructions?: Array<{
|
|
51
|
+
program?: string;
|
|
52
|
+
programId?: string;
|
|
53
|
+
parsed?: {
|
|
54
|
+
type?: string;
|
|
55
|
+
info?: Record<string, unknown>;
|
|
56
|
+
};
|
|
57
|
+
}>;
|
|
58
|
+
};
|
|
59
|
+
signatures?: string[];
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
export type SolanaRpcFetcher = (signature: string, rpcUrl: string) => Promise<SolanaRpcGetTransactionResult | null>;
|
|
63
|
+
/**
|
|
64
|
+
* True for a plausible Solana base58 pubkey (32–44 chars).
|
|
65
|
+
*/
|
|
66
|
+
export declare function isSolanaBase58Pubkey(value: unknown): boolean;
|
|
67
|
+
/**
|
|
68
|
+
* Extract the tx signature from `solana:<sig>` payment.ref.
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseSolanaPaymentRef(paymentRef: string | null | undefined): string | null;
|
|
71
|
+
/**
|
|
72
|
+
* Parse USDC transfer instructions from a jsonParsed getTransaction result.
|
|
73
|
+
*/
|
|
74
|
+
export declare function extractUsdcTransfersFromTx(tx: SolanaRpcGetTransactionResult, mint?: string): Array<{
|
|
75
|
+
authority: string;
|
|
76
|
+
amount: bigint;
|
|
77
|
+
mint: string;
|
|
78
|
+
}>;
|
|
79
|
+
/**
|
|
80
|
+
* Fallback: infer USDC outflow from pre/post token balance deltas for a payer owner.
|
|
81
|
+
*/
|
|
82
|
+
export declare function inferUsdcOutflowFromBalances(tx: SolanaRpcGetTransactionResult, payerWallet: string, mint?: string): bigint;
|
|
83
|
+
/**
|
|
84
|
+
* Default JSON-RPC fetcher for getTransaction (jsonParsed).
|
|
85
|
+
*/
|
|
86
|
+
export declare function fetchSolanaTransaction(signature: string, rpcUrl?: string): Promise<SolanaRpcGetTransactionResult | null>;
|
|
87
|
+
export interface VerifySolanaPayerInput {
|
|
88
|
+
paymentRef: string;
|
|
89
|
+
payerWallet: string;
|
|
90
|
+
grossAmount: string | number | bigint;
|
|
91
|
+
mint?: string;
|
|
92
|
+
rpcUrl?: string;
|
|
93
|
+
fetchTransaction?: SolanaRpcFetcher;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Verify caller_binding.payer_wallet against a Solana USDC settlement tx.
|
|
97
|
+
*/
|
|
98
|
+
export declare function verifySolanaPayer(input: VerifySolanaPayerInput): Promise<SolanaPayerVerification>;
|
|
99
|
+
//# sourceMappingURL=solana-payer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-payer.d.ts","sourceRoot":"","sources":["../src/solana-payer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Offline Solana payer verification for Chit402 receipts.
|
|
4
|
+
*
|
|
5
|
+
* When payment.ref starts with `solana:`, fetch the settled transaction and
|
|
6
|
+
* confirm a USDC transfer of payment.gross_amount involving caller_binding.payer_wallet
|
|
7
|
+
* as authority (x402 exact-svm) without trusting Chit logs.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.SOLANA_RPC_URL = exports.SOLANA_USDC_MINT_DEVNET = exports.SOLANA_USDC_MINT_MAINNET = void 0;
|
|
11
|
+
exports.isSolanaBase58Pubkey = isSolanaBase58Pubkey;
|
|
12
|
+
exports.parseSolanaPaymentRef = parseSolanaPaymentRef;
|
|
13
|
+
exports.extractUsdcTransfersFromTx = extractUsdcTransfersFromTx;
|
|
14
|
+
exports.inferUsdcOutflowFromBalances = inferUsdcOutflowFromBalances;
|
|
15
|
+
exports.fetchSolanaTransaction = fetchSolanaTransaction;
|
|
16
|
+
exports.verifySolanaPayer = verifySolanaPayer;
|
|
17
|
+
/** Solana mainnet USDC mint (SPL, 6 decimals). */
|
|
18
|
+
exports.SOLANA_USDC_MINT_MAINNET = 'EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v';
|
|
19
|
+
/** Solana devnet USDC mint (SPL, 6 decimals). */
|
|
20
|
+
exports.SOLANA_USDC_MINT_DEVNET = 'Gh9ZwEmdLJ8DscKNTkTqPbNwLNNBjuSzaG9Vp2KGtKJr';
|
|
21
|
+
/** Default public Solana mainnet RPC (override with SOLANA_RPC_URL). */
|
|
22
|
+
exports.SOLANA_RPC_URL = 'https://api.mainnet-beta.solana.com';
|
|
23
|
+
/** SPL Token program id. */
|
|
24
|
+
const TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';
|
|
25
|
+
/** Base58 alphabet (no 0, O, I, l). */
|
|
26
|
+
const BASE58_RE = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/;
|
|
27
|
+
function resolveRpcUrl(override) {
|
|
28
|
+
return override || process.env.SOLANA_RPC_URL || exports.SOLANA_RPC_URL;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* True for a plausible Solana base58 pubkey (32–44 chars).
|
|
32
|
+
*/
|
|
33
|
+
function isSolanaBase58Pubkey(value) {
|
|
34
|
+
return typeof value === 'string' && BASE58_RE.test(value);
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract the tx signature from `solana:<sig>` payment.ref.
|
|
38
|
+
*/
|
|
39
|
+
function parseSolanaPaymentRef(paymentRef) {
|
|
40
|
+
if (!paymentRef || typeof paymentRef !== 'string')
|
|
41
|
+
return null;
|
|
42
|
+
const trimmed = paymentRef.trim();
|
|
43
|
+
if (!trimmed.toLowerCase().startsWith('solana:'))
|
|
44
|
+
return null;
|
|
45
|
+
const sig = trimmed.slice('solana:'.length).trim();
|
|
46
|
+
return sig.length > 0 ? sig : null;
|
|
47
|
+
}
|
|
48
|
+
function accountPubkey(key) {
|
|
49
|
+
return typeof key === 'string' ? key : key.pubkey;
|
|
50
|
+
}
|
|
51
|
+
function isSigner(key) {
|
|
52
|
+
return typeof key !== 'string' && key.signer === true;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse USDC transfer instructions from a jsonParsed getTransaction result.
|
|
56
|
+
*/
|
|
57
|
+
function extractUsdcTransfersFromTx(tx, mint = exports.SOLANA_USDC_MINT_MAINNET) {
|
|
58
|
+
const transfers = [];
|
|
59
|
+
const instructions = tx.transaction?.message?.instructions || [];
|
|
60
|
+
for (const ix of instructions) {
|
|
61
|
+
const program = ix.program || '';
|
|
62
|
+
const programId = ix.programId || '';
|
|
63
|
+
if (program !== 'spl-token' && programId !== TOKEN_PROGRAM_ID)
|
|
64
|
+
continue;
|
|
65
|
+
const parsed = ix.parsed;
|
|
66
|
+
if (!parsed || typeof parsed !== 'object')
|
|
67
|
+
continue;
|
|
68
|
+
const type = parsed.type;
|
|
69
|
+
const info = parsed.info || {};
|
|
70
|
+
if (type === 'transferChecked') {
|
|
71
|
+
const ixMint = String(info.mint || '');
|
|
72
|
+
if (ixMint !== mint)
|
|
73
|
+
continue;
|
|
74
|
+
const authority = String(info.authority || info.sourceOwner || '');
|
|
75
|
+
const tokenAmount = info.tokenAmount;
|
|
76
|
+
const raw = tokenAmount?.amount ?? info.amount;
|
|
77
|
+
if (!authority || raw == null)
|
|
78
|
+
continue;
|
|
79
|
+
transfers.push({ authority, amount: BigInt(String(raw)), mint: ixMint });
|
|
80
|
+
continue;
|
|
81
|
+
}
|
|
82
|
+
if (type === 'transfer') {
|
|
83
|
+
// Legacy transfer ix — confirm mint via token balance owner match when possible.
|
|
84
|
+
const authority = String(info.authority || info.source || '');
|
|
85
|
+
const raw = info.tokenAmount?.amount ?? info.amount;
|
|
86
|
+
if (!authority || raw == null)
|
|
87
|
+
continue;
|
|
88
|
+
transfers.push({ authority, amount: BigInt(String(raw)), mint });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return transfers;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Fallback: infer USDC outflow from pre/post token balance deltas for a payer owner.
|
|
95
|
+
*/
|
|
96
|
+
function inferUsdcOutflowFromBalances(tx, payerWallet, mint = exports.SOLANA_USDC_MINT_MAINNET) {
|
|
97
|
+
const pre = tx.meta?.preTokenBalances || [];
|
|
98
|
+
const post = tx.meta?.postTokenBalances || [];
|
|
99
|
+
const byIndex = new Map();
|
|
100
|
+
for (const row of pre) {
|
|
101
|
+
if (row.mint !== mint || !row.owner)
|
|
102
|
+
continue;
|
|
103
|
+
const entry = byIndex.get(row.accountIndex) || {
|
|
104
|
+
pre: 0n,
|
|
105
|
+
post: 0n,
|
|
106
|
+
owner: row.owner,
|
|
107
|
+
mint: row.mint,
|
|
108
|
+
};
|
|
109
|
+
entry.pre = BigInt(row.uiTokenAmount?.amount || '0');
|
|
110
|
+
byIndex.set(row.accountIndex, entry);
|
|
111
|
+
}
|
|
112
|
+
for (const row of post) {
|
|
113
|
+
if (row.mint !== mint || !row.owner)
|
|
114
|
+
continue;
|
|
115
|
+
const entry = byIndex.get(row.accountIndex) || {
|
|
116
|
+
pre: 0n,
|
|
117
|
+
post: 0n,
|
|
118
|
+
owner: row.owner,
|
|
119
|
+
mint: row.mint,
|
|
120
|
+
};
|
|
121
|
+
entry.post = BigInt(row.uiTokenAmount?.amount || '0');
|
|
122
|
+
byIndex.set(row.accountIndex, entry);
|
|
123
|
+
}
|
|
124
|
+
let totalOut = 0n;
|
|
125
|
+
for (const entry of byIndex.values()) {
|
|
126
|
+
if (entry.owner !== payerWallet)
|
|
127
|
+
continue;
|
|
128
|
+
if (entry.pre > entry.post) {
|
|
129
|
+
totalOut += entry.pre - entry.post;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return totalOut;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Default JSON-RPC fetcher for getTransaction (jsonParsed).
|
|
136
|
+
*/
|
|
137
|
+
async function fetchSolanaTransaction(signature, rpcUrl) {
|
|
138
|
+
const url = resolveRpcUrl(rpcUrl);
|
|
139
|
+
const body = {
|
|
140
|
+
jsonrpc: '2.0',
|
|
141
|
+
id: 1,
|
|
142
|
+
method: 'getTransaction',
|
|
143
|
+
params: [signature, { encoding: 'jsonParsed', maxSupportedTransactionVersion: 0 }],
|
|
144
|
+
};
|
|
145
|
+
const res = await fetch(url, {
|
|
146
|
+
method: 'POST',
|
|
147
|
+
headers: { 'content-type': 'application/json' },
|
|
148
|
+
body: JSON.stringify(body),
|
|
149
|
+
});
|
|
150
|
+
if (!res.ok) {
|
|
151
|
+
throw new Error(`Solana RPC HTTP ${res.status}`);
|
|
152
|
+
}
|
|
153
|
+
const json = await res.json();
|
|
154
|
+
if (json.error) {
|
|
155
|
+
throw new Error(`Solana RPC error: ${json.error.message || 'unknown'}`);
|
|
156
|
+
}
|
|
157
|
+
return json.result ?? null;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Verify caller_binding.payer_wallet against a Solana USDC settlement tx.
|
|
161
|
+
*/
|
|
162
|
+
async function verifySolanaPayer(input) {
|
|
163
|
+
const signature = parseSolanaPaymentRef(input.paymentRef);
|
|
164
|
+
if (!signature) {
|
|
165
|
+
return { checked: false, valid: false, reason: 'not_solana_payment_ref' };
|
|
166
|
+
}
|
|
167
|
+
const payerWallet = String(input.payerWallet || '').trim();
|
|
168
|
+
if (!isSolanaBase58Pubkey(payerWallet)) {
|
|
169
|
+
return { checked: false, valid: false, reason: 'invalid_solana_payer_wallet' };
|
|
170
|
+
}
|
|
171
|
+
const expectedAmount = BigInt(String(input.grossAmount ?? '0'));
|
|
172
|
+
if (expectedAmount <= 0n) {
|
|
173
|
+
return { checked: false, valid: false, reason: 'invalid_gross_amount' };
|
|
174
|
+
}
|
|
175
|
+
const mint = input.mint || exports.SOLANA_USDC_MINT_MAINNET;
|
|
176
|
+
const fetcher = input.fetchTransaction || fetchSolanaTransaction;
|
|
177
|
+
const rpcUrl = resolveRpcUrl(input.rpcUrl);
|
|
178
|
+
let tx;
|
|
179
|
+
try {
|
|
180
|
+
tx = await fetcher(signature, rpcUrl);
|
|
181
|
+
}
|
|
182
|
+
catch (err) {
|
|
183
|
+
return {
|
|
184
|
+
checked: true,
|
|
185
|
+
valid: false,
|
|
186
|
+
signature,
|
|
187
|
+
payerWallet,
|
|
188
|
+
expectedAmount: expectedAmount.toString(),
|
|
189
|
+
mint,
|
|
190
|
+
reason: `rpc_error: ${err.message}`,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
if (!tx) {
|
|
194
|
+
return {
|
|
195
|
+
checked: true,
|
|
196
|
+
valid: false,
|
|
197
|
+
signature,
|
|
198
|
+
payerWallet,
|
|
199
|
+
expectedAmount: expectedAmount.toString(),
|
|
200
|
+
mint,
|
|
201
|
+
reason: 'transaction_not_found',
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
if (tx.meta?.err != null) {
|
|
205
|
+
return {
|
|
206
|
+
checked: true,
|
|
207
|
+
valid: false,
|
|
208
|
+
signature,
|
|
209
|
+
payerWallet,
|
|
210
|
+
expectedAmount: expectedAmount.toString(),
|
|
211
|
+
mint,
|
|
212
|
+
reason: 'transaction_failed',
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
const accountKeys = tx.transaction?.message?.accountKeys || [];
|
|
216
|
+
const payerIsSigner = accountKeys.some((k) => accountPubkey(k) === payerWallet && isSigner(k));
|
|
217
|
+
const transfers = extractUsdcTransfersFromTx(tx, mint);
|
|
218
|
+
const authorityMatch = transfers.find((t) => t.authority === payerWallet && t.amount >= expectedAmount);
|
|
219
|
+
if (authorityMatch) {
|
|
220
|
+
return {
|
|
221
|
+
checked: true,
|
|
222
|
+
valid: true,
|
|
223
|
+
signature,
|
|
224
|
+
payerWallet,
|
|
225
|
+
expectedAmount: expectedAmount.toString(),
|
|
226
|
+
transferredAmount: authorityMatch.amount.toString(),
|
|
227
|
+
mint,
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
// x402 exact-svm: payer may co-sign while authority is their ATA owner — accept signer + balance delta.
|
|
231
|
+
const outflow = inferUsdcOutflowFromBalances(tx, payerWallet, mint);
|
|
232
|
+
if (payerIsSigner && outflow >= expectedAmount) {
|
|
233
|
+
return {
|
|
234
|
+
checked: true,
|
|
235
|
+
valid: true,
|
|
236
|
+
signature,
|
|
237
|
+
payerWallet,
|
|
238
|
+
expectedAmount: expectedAmount.toString(),
|
|
239
|
+
transferredAmount: outflow.toString(),
|
|
240
|
+
mint,
|
|
241
|
+
reason: undefined,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
const anyTransfer = transfers.find((t) => t.amount >= expectedAmount);
|
|
245
|
+
return {
|
|
246
|
+
checked: true,
|
|
247
|
+
valid: false,
|
|
248
|
+
signature,
|
|
249
|
+
payerWallet,
|
|
250
|
+
expectedAmount: expectedAmount.toString(),
|
|
251
|
+
transferredAmount: anyTransfer?.amount.toString(),
|
|
252
|
+
mint,
|
|
253
|
+
reason: anyTransfer
|
|
254
|
+
? `payer_mismatch: authority ${anyTransfer.authority} !== ${payerWallet}`
|
|
255
|
+
: `no_usdc_transfer_of_${expectedAmount.toString()}_from_${payerWallet}`,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=solana-payer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"solana-payer.js","sourceRoot":"","sources":["../src/solana-payer.ts"],"names":[],"mappings":"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"}
|