@wuwei-labs/srsly 4.3.0 → 4.4.2
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/dist/cjs/audit/audit.js +400 -0
- package/dist/cjs/audit/audit.js.map +1 -0
- package/dist/cjs/audit/events.js +227 -0
- package/dist/cjs/audit/events.js.map +1 -0
- package/dist/cjs/audit/index.js +8 -0
- package/dist/cjs/audit/index.js.map +1 -0
- package/dist/cjs/audit/types.js +3 -0
- package/dist/cjs/audit/types.js.map +1 -0
- package/dist/cjs/generated/codama/types/feesPaid.js +33 -0
- package/dist/cjs/generated/codama/types/feesPaid.js.map +1 -0
- package/dist/cjs/generated/codama/types/fleet.js +0 -14
- package/dist/cjs/generated/codama/types/fleet.js.map +1 -1
- package/dist/cjs/generated/codama/types/index.js +3 -18
- package/dist/cjs/generated/codama/types/index.js.map +1 -1
- package/dist/cjs/generated/codama/types/ownerPaid.js +31 -0
- package/dist/cjs/generated/codama/types/ownerPaid.js.map +1 -0
- package/dist/cjs/generated/codama/types/rentalAccepted.js +8 -0
- package/dist/cjs/generated/codama/types/rentalAccepted.js.map +1 -1
- package/dist/cjs/generated/codama/types/rentalCancelled.js +6 -2
- package/dist/cjs/generated/codama/types/rentalCancelled.js.map +1 -1
- package/dist/cjs/generated/codama/types/rentalClosed.js +4 -2
- package/dist/cjs/generated/codama/types/rentalClosed.js.map +1 -1
- package/dist/cjs/generated/codama/types/rentalSettled.js +35 -0
- package/dist/cjs/generated/codama/types/rentalSettled.js.map +1 -0
- package/dist/cjs/generated/codama/types/shipStats.js +0 -2
- package/dist/cjs/generated/codama/types/shipStats.js.map +1 -1
- package/dist/cjs/idl/srsly.json +6748 -0
- package/dist/cjs/instructions/reserveRental.js +9 -6
- package/dist/cjs/instructions/reserveRental.js.map +1 -1
- package/dist/cjs/kit/index.js +2 -1
- package/dist/cjs/kit/index.js.map +1 -1
- package/dist/cjs/package.json +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/esm/audit/audit.js +397 -0
- package/dist/esm/audit/audit.js.map +1 -0
- package/dist/esm/audit/events.js +221 -0
- package/dist/esm/audit/events.js.map +1 -0
- package/dist/esm/audit/index.js +3 -0
- package/dist/esm/audit/index.js.map +1 -0
- package/dist/esm/audit/types.js +2 -0
- package/dist/esm/audit/types.js.map +1 -0
- package/dist/esm/generated/codama/types/feesPaid.js +28 -0
- package/dist/esm/generated/codama/types/feesPaid.js.map +1 -0
- package/dist/esm/generated/codama/types/fleet.js +1 -15
- package/dist/esm/generated/codama/types/fleet.js.map +1 -1
- package/dist/esm/generated/codama/types/index.js +3 -18
- package/dist/esm/generated/codama/types/index.js.map +1 -1
- package/dist/esm/generated/codama/types/ownerPaid.js +26 -0
- package/dist/esm/generated/codama/types/ownerPaid.js.map +1 -0
- package/dist/esm/generated/codama/types/rentalAccepted.js +9 -1
- package/dist/esm/generated/codama/types/rentalAccepted.js.map +1 -1
- package/dist/esm/generated/codama/types/rentalCancelled.js +6 -2
- package/dist/esm/generated/codama/types/rentalCancelled.js.map +1 -1
- package/dist/esm/generated/codama/types/rentalClosed.js +4 -2
- package/dist/esm/generated/codama/types/rentalClosed.js.map +1 -1
- package/dist/esm/generated/codama/types/rentalSettled.js +30 -0
- package/dist/esm/generated/codama/types/rentalSettled.js.map +1 -0
- package/dist/esm/generated/codama/types/shipStats.js +1 -3
- package/dist/esm/generated/codama/types/shipStats.js.map +1 -1
- package/dist/esm/idl/srsly.json +6748 -0
- package/dist/esm/instructions/reserveRental.js +9 -6
- package/dist/esm/instructions/reserveRental.js.map +1 -1
- package/dist/esm/kit/index.js +1 -0
- package/dist/esm/kit/index.js.map +1 -1
- package/dist/esm/package.json +1 -1
- package/dist/esm/version.js +1 -1
- package/dist/idl/srsly.json +122 -687
- package/dist/types/audit/audit.d.ts +10 -0
- package/dist/types/audit/audit.d.ts.map +1 -0
- package/dist/types/audit/events.d.ts +17 -0
- package/dist/types/audit/events.d.ts.map +1 -0
- package/dist/types/audit/index.d.ts +4 -0
- package/dist/types/audit/index.d.ts.map +1 -0
- package/dist/types/audit/types.d.ts +132 -0
- package/dist/types/audit/types.d.ts.map +1 -0
- package/dist/types/generated/codama/types/feesPaid.d.ts +28 -0
- package/dist/types/generated/codama/types/feesPaid.d.ts.map +1 -0
- package/dist/types/generated/codama/types/fleet.d.ts +0 -14
- package/dist/types/generated/codama/types/fleet.d.ts.map +1 -1
- package/dist/types/generated/codama/types/index.d.ts +3 -18
- package/dist/types/generated/codama/types/index.d.ts.map +1 -1
- package/dist/types/generated/codama/types/ownerPaid.d.ts +26 -0
- package/dist/types/generated/codama/types/ownerPaid.d.ts.map +1 -0
- package/dist/types/generated/codama/types/rentalAccepted.d.ts +12 -0
- package/dist/types/generated/codama/types/rentalAccepted.d.ts.map +1 -1
- package/dist/types/generated/codama/types/rentalCancelled.d.ts +10 -2
- package/dist/types/generated/codama/types/rentalCancelled.d.ts.map +1 -1
- package/dist/types/generated/codama/types/rentalClosed.d.ts +8 -2
- package/dist/types/generated/codama/types/rentalClosed.d.ts.map +1 -1
- package/dist/types/generated/codama/types/rentalSettled.d.ts +30 -0
- package/dist/types/generated/codama/types/rentalSettled.d.ts.map +1 -0
- package/dist/types/generated/codama/types/shipStats.d.ts +1 -3
- package/dist/types/generated/codama/types/shipStats.d.ts.map +1 -1
- package/dist/types/instructions/reserveRental.d.ts.map +1 -1
- package/dist/types/kit/index.d.ts +1 -0
- package/dist/types/kit/index.d.ts.map +1 -1
- package/dist/types/version.d.ts +1 -1
- package/package.json +8 -1
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Contract audit — reconstructs the full payment lifecycle from on-chain events.
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.fetchContractAudit = fetchContractAudit;
|
|
7
|
+
const contract_1 = require("../accounts/contract");
|
|
8
|
+
const config_1 = require("../utils/config");
|
|
9
|
+
const rpc_1 = require("../utils/rpc");
|
|
10
|
+
const events_1 = require("./events");
|
|
11
|
+
const SRSLY_PROGRAM_ID = 'SRSLYxcFnjd5jG2DpJw4as6UEyjwJQK1U4J1TD1hvZH';
|
|
12
|
+
/**
|
|
13
|
+
* Fetch and reconstruct a contract's audit trail from transaction history.
|
|
14
|
+
*/
|
|
15
|
+
async function fetchContractAudit(rpcUrl, contract, options) {
|
|
16
|
+
const resolvedRpcUrl = rpcUrl || (0, config_1.getRpcUrl)();
|
|
17
|
+
const rpc = (0, rpc_1.createRpc)(resolvedRpcUrl);
|
|
18
|
+
// 1. Fetch on-chain contract state
|
|
19
|
+
const contractAccount = await (0, contract_1.fetchContract)(contract, resolvedRpcUrl);
|
|
20
|
+
const onChain = {
|
|
21
|
+
totalEarned: contractAccount.data.totalEarned,
|
|
22
|
+
ownerClaimable: contractAccount.data.ownerClaimable,
|
|
23
|
+
feeClaimable: contractAccount.data.feeClaimable,
|
|
24
|
+
};
|
|
25
|
+
// 2. Fetch transaction signatures
|
|
26
|
+
const lastN = options?.all ? undefined : (options?.lastN ?? 10);
|
|
27
|
+
const sinceTimestamp = options?.since ? Math.floor(Date.now() / 1000) - options.since : undefined;
|
|
28
|
+
const log = options?.onProgress ?? (() => { });
|
|
29
|
+
const { events: allEvents, exhausted } = await fetchEventHistory(rpc, contract, resolvedRpcUrl, lastN, sinceTimestamp, log);
|
|
30
|
+
// 3. Group events into rental lifecycles
|
|
31
|
+
// Filter out in-progress rentals — incomplete data makes reconciliation meaningless
|
|
32
|
+
const allRentals = buildRentalAudits(allEvents)
|
|
33
|
+
.filter(r => r.status !== 'in-progress');
|
|
34
|
+
// Only consider full history when we scanned every signature (no cutoffs)
|
|
35
|
+
const isFullHistory = exhausted;
|
|
36
|
+
const rentals = lastN && allRentals.length > lastN
|
|
37
|
+
? allRentals.slice(0, lastN)
|
|
38
|
+
: allRentals;
|
|
39
|
+
// 4. Compute summary
|
|
40
|
+
let ownerEarned = 0n;
|
|
41
|
+
let feeCollected = 0n;
|
|
42
|
+
let discount = 0n;
|
|
43
|
+
let refunds = 0n;
|
|
44
|
+
let ownerTransfers = 0n;
|
|
45
|
+
let allMatch = true;
|
|
46
|
+
for (const r of rentals) {
|
|
47
|
+
ownerEarned += r.totalOwnerEarned;
|
|
48
|
+
feeCollected += r.totalFeeCollected;
|
|
49
|
+
discount += r.totalDiscount;
|
|
50
|
+
refunds += r.totalRefund;
|
|
51
|
+
for (const t of r.ownerTransfers) {
|
|
52
|
+
ownerTransfers += t.amount;
|
|
53
|
+
}
|
|
54
|
+
if (r.reconciliation.status === 'mismatch')
|
|
55
|
+
allMatch = false;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
contract,
|
|
59
|
+
onChain,
|
|
60
|
+
isFullHistory,
|
|
61
|
+
rentals,
|
|
62
|
+
summary: {
|
|
63
|
+
ownerEarned,
|
|
64
|
+
feeCollected,
|
|
65
|
+
discount,
|
|
66
|
+
refunds,
|
|
67
|
+
ownerTransfers,
|
|
68
|
+
matchesTotalEarned: isFullHistory ? ownerEarned === onChain.totalEarned : null,
|
|
69
|
+
allRentalsMatch: allMatch,
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Fetch all audit-relevant events from a contract's transaction history.
|
|
75
|
+
*/
|
|
76
|
+
async function fetchEventHistory(rpc, contract, rpcUrl, maxRentals, sinceTimestamp, log) {
|
|
77
|
+
const allEvents = [];
|
|
78
|
+
let before;
|
|
79
|
+
let rentalCount = 0;
|
|
80
|
+
let txCount = 0;
|
|
81
|
+
let page = 0;
|
|
82
|
+
while (true) {
|
|
83
|
+
const params = { limit: 100 };
|
|
84
|
+
if (before)
|
|
85
|
+
params.before = before;
|
|
86
|
+
page++;
|
|
87
|
+
log(`Fetching signatures (page ${page})...`);
|
|
88
|
+
const signatures = await rpc.getSignaturesForAddress(contract, params).send();
|
|
89
|
+
if (!signatures || signatures.length === 0) {
|
|
90
|
+
log(`No more signatures found`);
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
log(`Got ${signatures.length} signatures, parsing transactions...`);
|
|
94
|
+
for (const sigInfo of signatures) {
|
|
95
|
+
// Time-based cutoff
|
|
96
|
+
if (sinceTimestamp && sigInfo.blockTime && Number(sigInfo.blockTime) < sinceTimestamp) {
|
|
97
|
+
log(`Reached time cutoff after ${txCount} txs, ${allEvents.length} events, ${rentalCount} rentals`);
|
|
98
|
+
return { events: allEvents, exhausted: false };
|
|
99
|
+
}
|
|
100
|
+
// Skip failed txs
|
|
101
|
+
if (sigInfo.err)
|
|
102
|
+
continue;
|
|
103
|
+
txCount++;
|
|
104
|
+
const tx = await rpc.getTransaction(sigInfo.signature, {
|
|
105
|
+
encoding: 'json',
|
|
106
|
+
maxSupportedTransactionVersion: 0,
|
|
107
|
+
}).send();
|
|
108
|
+
if (!tx?.meta?.logMessages)
|
|
109
|
+
continue;
|
|
110
|
+
const events = (0, events_1.parseAnchorEvents)(tx.meta.logMessages, SRSLY_PROGRAM_ID, BigInt(tx.slot), sigInfo.signature);
|
|
111
|
+
for (const evt of events) {
|
|
112
|
+
allEvents.push(evt);
|
|
113
|
+
if (evt.type === 'RentalAccepted') {
|
|
114
|
+
rentalCount++;
|
|
115
|
+
log(`Found rental #${rentalCount} (${txCount} txs scanned, ${allEvents.length} events)`);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
// Stop fetching once we have enough accepts to build N+1 lifecycles.
|
|
119
|
+
// The extra +1 ensures we don't cut off the Nth lifecycle's older events.
|
|
120
|
+
// The actual lastN trimming happens after grouping.
|
|
121
|
+
if (maxRentals && rentalCount > maxRentals) {
|
|
122
|
+
log(`Found ${rentalCount} rentals (need ${maxRentals}), ${txCount} txs scanned`);
|
|
123
|
+
return { events: allEvents, exhausted: false };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Pagination
|
|
127
|
+
before = signatures[signatures.length - 1].signature;
|
|
128
|
+
}
|
|
129
|
+
log(`Done: ${txCount} txs scanned, ${allEvents.length} events, ${rentalCount} rentals`);
|
|
130
|
+
return { events: allEvents, exhausted: true };
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Group events into per-rental audit records.
|
|
134
|
+
*
|
|
135
|
+
* Challenges:
|
|
136
|
+
* - Rental state PDAs are reused (reset on close) → same PDA, multiple lifecycles
|
|
137
|
+
* - Queued rentals get promoted to active PDA → RentalAccepted references queued PDA,
|
|
138
|
+
* but all subsequent events (settle/cancel/close) reference active PDA
|
|
139
|
+
*
|
|
140
|
+
* Strategy: match events by borrower (stable across PDA promotion).
|
|
141
|
+
* RentalSettled has no borrower — match by PDA, then fall back to the only
|
|
142
|
+
* open lifecycle without a close.
|
|
143
|
+
*
|
|
144
|
+
* OwnerPaid and FeesPaid are contract-level — associated with the most
|
|
145
|
+
* recently closed rental via temporal proximity.
|
|
146
|
+
*/
|
|
147
|
+
function buildRentalAudits(events) {
|
|
148
|
+
// Process chronologically (events come newest-first from RPC)
|
|
149
|
+
const chronological = [...events].reverse();
|
|
150
|
+
// Track open lifecycles by borrower address (unique per contract at any time)
|
|
151
|
+
const openByBorrower = new Map();
|
|
152
|
+
// Secondary: track which PDA a lifecycle is currently on (for RentalSettled)
|
|
153
|
+
const pdaToBorrower = new Map();
|
|
154
|
+
const finalized = [];
|
|
155
|
+
const contractEvents = [];
|
|
156
|
+
for (const evt of chronological) {
|
|
157
|
+
switch (evt.type) {
|
|
158
|
+
case 'RentalAccepted': {
|
|
159
|
+
const borrower = evt.borrower;
|
|
160
|
+
const pda = evt.rentalState;
|
|
161
|
+
// If this borrower already has an open lifecycle, finalize it
|
|
162
|
+
const existing = openByBorrower.get(borrower);
|
|
163
|
+
if (existing?.accepted) {
|
|
164
|
+
finalized.push(existing);
|
|
165
|
+
}
|
|
166
|
+
// Start fresh lifecycle
|
|
167
|
+
const entry = {
|
|
168
|
+
accepted: evt,
|
|
169
|
+
settlements: [],
|
|
170
|
+
ownerTransfers: [],
|
|
171
|
+
};
|
|
172
|
+
openByBorrower.set(borrower, entry);
|
|
173
|
+
pdaToBorrower.set(pda, borrower);
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case 'RentalSettled': {
|
|
177
|
+
// RentalSettled has no borrower — resolve via PDA
|
|
178
|
+
const pda = evt.rentalState;
|
|
179
|
+
let borrower = pdaToBorrower.get(pda);
|
|
180
|
+
if (!borrower) {
|
|
181
|
+
// PDA changed (queued→active promotion). Find the only open
|
|
182
|
+
// lifecycle that hasn't been closed yet.
|
|
183
|
+
for (const [b, entry] of openByBorrower) {
|
|
184
|
+
if (entry.accepted && !entry.closed && !entry.cancelled) {
|
|
185
|
+
borrower = b;
|
|
186
|
+
// Update PDA mapping for future settles
|
|
187
|
+
pdaToBorrower.set(pda, b);
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
if (borrower) {
|
|
193
|
+
const entry = openByBorrower.get(borrower);
|
|
194
|
+
if (entry)
|
|
195
|
+
(entry.settlements ??= []).push(evt);
|
|
196
|
+
}
|
|
197
|
+
break;
|
|
198
|
+
}
|
|
199
|
+
case 'RentalCancelled': {
|
|
200
|
+
const borrower = evt.borrower;
|
|
201
|
+
const entry = openByBorrower.get(borrower);
|
|
202
|
+
if (entry) {
|
|
203
|
+
entry.cancelled = evt;
|
|
204
|
+
// Update PDA mapping (may have been promoted)
|
|
205
|
+
pdaToBorrower.set(evt.rentalState, borrower);
|
|
206
|
+
}
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
case 'RentalClosed': {
|
|
210
|
+
const borrower = evt.borrower;
|
|
211
|
+
const entry = openByBorrower.get(borrower);
|
|
212
|
+
if (entry) {
|
|
213
|
+
entry.closed = evt;
|
|
214
|
+
pdaToBorrower.set(evt.rentalState, borrower);
|
|
215
|
+
}
|
|
216
|
+
break;
|
|
217
|
+
}
|
|
218
|
+
case 'FeesPaid':
|
|
219
|
+
case 'OwnerPaid': {
|
|
220
|
+
contractEvents.push({ evt, slot: evt.slot });
|
|
221
|
+
break;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
// Finalize remaining open lifecycles
|
|
226
|
+
for (const entry of openByBorrower.values()) {
|
|
227
|
+
if (entry.accepted)
|
|
228
|
+
finalized.push(entry);
|
|
229
|
+
}
|
|
230
|
+
// Associate contract-level events with the nearest closed rental
|
|
231
|
+
const allWithCloseSlot = finalized
|
|
232
|
+
.filter(e => e.closed || e.cancelled)
|
|
233
|
+
.map(e => ({ entry: e, closeSlot: e.closed?.slot ?? e.cancelled.slot }))
|
|
234
|
+
.sort((a, b) => (a.closeSlot < b.closeSlot ? -1 : a.closeSlot > b.closeSlot ? 1 : 0));
|
|
235
|
+
for (const { evt, slot } of contractEvents) {
|
|
236
|
+
let best;
|
|
237
|
+
for (const { entry, closeSlot } of allWithCloseSlot) {
|
|
238
|
+
if (closeSlot <= slot)
|
|
239
|
+
best = entry;
|
|
240
|
+
else
|
|
241
|
+
break;
|
|
242
|
+
}
|
|
243
|
+
if (best) {
|
|
244
|
+
if (evt.type === 'FeesPaid') {
|
|
245
|
+
best.feesPaid = evt;
|
|
246
|
+
}
|
|
247
|
+
else {
|
|
248
|
+
(best.ownerTransfers ??= []).push(evt);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
// Build final audits
|
|
253
|
+
const rentals = finalized
|
|
254
|
+
.filter(e => e.accepted)
|
|
255
|
+
.map(e => finalizeRental(e, []));
|
|
256
|
+
// Most recent first
|
|
257
|
+
rentals.sort((a, b) => {
|
|
258
|
+
const aTime = a.accepted.startTime;
|
|
259
|
+
const bTime = b.accepted.startTime;
|
|
260
|
+
return aTime > bTime ? -1 : aTime < bTime ? 1 : 0;
|
|
261
|
+
});
|
|
262
|
+
return rentals;
|
|
263
|
+
}
|
|
264
|
+
function finalizeRental(partial, _unassigned) {
|
|
265
|
+
const accepted = partial.accepted;
|
|
266
|
+
const settlements = partial.settlements ?? [];
|
|
267
|
+
const cancelled = partial.cancelled;
|
|
268
|
+
const closed = partial.closed;
|
|
269
|
+
const feesPaid = partial.feesPaid;
|
|
270
|
+
const ownerTransfers = partial.ownerTransfers ?? [];
|
|
271
|
+
// Derive status
|
|
272
|
+
let status = 'in-progress';
|
|
273
|
+
if (cancelled)
|
|
274
|
+
status = 'cancelled';
|
|
275
|
+
else if (closed)
|
|
276
|
+
status = 'completed';
|
|
277
|
+
// Compute dates (Solana timestamps are unix seconds)
|
|
278
|
+
const startTime = new Date(Number(accepted.startTime) * 1000);
|
|
279
|
+
const effectiveEndTime = cancelled ? cancelled.newEndTime : accepted.endTime;
|
|
280
|
+
const endTime = new Date(Number(effectiveEndTime) * 1000);
|
|
281
|
+
const durationSeconds = Number(effectiveEndTime - accepted.startTime);
|
|
282
|
+
// Sum actuals
|
|
283
|
+
let totalOwnerEarned = 0n;
|
|
284
|
+
let totalFeeCollected = 0n;
|
|
285
|
+
let totalRefund = 0n;
|
|
286
|
+
let totalDiscount = 0n;
|
|
287
|
+
for (const s of settlements) {
|
|
288
|
+
totalOwnerEarned += s.ownerEarned;
|
|
289
|
+
}
|
|
290
|
+
if (cancelled) {
|
|
291
|
+
totalOwnerEarned += cancelled.ownerEarned;
|
|
292
|
+
totalFeeCollected += cancelled.feeCollected;
|
|
293
|
+
totalRefund += cancelled.refund;
|
|
294
|
+
}
|
|
295
|
+
if (closed) {
|
|
296
|
+
totalOwnerEarned += closed.ownerEarned;
|
|
297
|
+
totalFeeCollected += closed.feeCollected;
|
|
298
|
+
}
|
|
299
|
+
if (feesPaid) {
|
|
300
|
+
totalDiscount += feesPaid.discount;
|
|
301
|
+
}
|
|
302
|
+
const reconciliation = computeReconciliation(accepted, totalOwnerEarned, totalFeeCollected, totalRefund, feesPaid);
|
|
303
|
+
return {
|
|
304
|
+
status,
|
|
305
|
+
borrower: accepted.borrower,
|
|
306
|
+
startTime,
|
|
307
|
+
endTime,
|
|
308
|
+
durationSeconds,
|
|
309
|
+
rate: accepted.rate,
|
|
310
|
+
feeBps: accepted.feeBps,
|
|
311
|
+
escrow: accepted.escrow,
|
|
312
|
+
serviceFee: accepted.serviceFee,
|
|
313
|
+
accepted,
|
|
314
|
+
settlements,
|
|
315
|
+
cancelled,
|
|
316
|
+
closed,
|
|
317
|
+
feesPaid,
|
|
318
|
+
ownerTransfers,
|
|
319
|
+
totalOwnerEarned,
|
|
320
|
+
totalFeeCollected,
|
|
321
|
+
totalDiscount,
|
|
322
|
+
totalRefund,
|
|
323
|
+
reconciliation,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Verify rental payment math e2e for all parties:
|
|
328
|
+
*
|
|
329
|
+
* Borrower:
|
|
330
|
+
* - Paid correct escrow (rate * duration / 86400)
|
|
331
|
+
* - Service fee correctly computed (escrow * fee_bps / 10000)
|
|
332
|
+
* - Refund + earned + fee = escrow (got back what they should)
|
|
333
|
+
* - Discount applied correctly if referrer present
|
|
334
|
+
*
|
|
335
|
+
* Owner:
|
|
336
|
+
* - Earned = escrow - fee - refund (conservation)
|
|
337
|
+
* - Fee ratio matches contracted fee_bps
|
|
338
|
+
*
|
|
339
|
+
* Protocol (slyvault):
|
|
340
|
+
* - Fee collected matches fee_bps proportion
|
|
341
|
+
* - Discount returned correctly to borrower
|
|
342
|
+
*/
|
|
343
|
+
function computeReconciliation(accepted, actualOwnerEarned, actualFeeCollected, actualRefund, feesPaid) {
|
|
344
|
+
const escrow = accepted.escrow;
|
|
345
|
+
const duration = accepted.endTime - accepted.startTime;
|
|
346
|
+
// 1. Conservation: all escrow accounted for
|
|
347
|
+
const escrowAccounted = actualOwnerEarned + actualFeeCollected + actualRefund;
|
|
348
|
+
const escrowDelta = escrowAccounted - escrow;
|
|
349
|
+
// 2. Borrower paid correct amount: escrow should = rate * duration / 86400
|
|
350
|
+
const expectedEscrow = duration > 0n ? (accepted.rate * duration) / 86400n : 0n;
|
|
351
|
+
const escrowCorrect = abs(escrow - expectedEscrow) <= 1n;
|
|
352
|
+
// 3. Service fee correctly calculated: service_fee = escrow * fee_bps / 10000
|
|
353
|
+
const expectedServiceFee = (escrow * BigInt(accepted.feeBps)) / 10000n;
|
|
354
|
+
const serviceFeeCorrect = abs(accepted.serviceFee - expectedServiceFee) <= 1n;
|
|
355
|
+
// 4. Fee ratio on payout: fee / (earned + fee) should ≈ fee_bps / 10000
|
|
356
|
+
const grossPayment = actualOwnerEarned + actualFeeCollected;
|
|
357
|
+
const feeRatioBps = grossPayment > 0n
|
|
358
|
+
? Number((actualFeeCollected * 10000n) / grossPayment)
|
|
359
|
+
: 0;
|
|
360
|
+
const expectedFeeBps = accepted.feeBps;
|
|
361
|
+
const feeRatioMatch = Math.abs(feeRatioBps - expectedFeeBps) <= 1;
|
|
362
|
+
// 5. Discount verification (if FeesPaid event with discount_bps > 0)
|
|
363
|
+
let discountVerified = null;
|
|
364
|
+
if (feesPaid && feesPaid.discountBps > 0) {
|
|
365
|
+
// discount should ≈ fee_collected * discount_bps / 10000
|
|
366
|
+
// (slyvault returns discount from its share)
|
|
367
|
+
const expectedDiscount = (feesPaid.feeCollected * BigInt(feesPaid.discountBps)) / 10000n;
|
|
368
|
+
discountVerified = abs(feesPaid.discount - expectedDiscount) <= 1n;
|
|
369
|
+
}
|
|
370
|
+
else if (feesPaid && feesPaid.discountBps === 0) {
|
|
371
|
+
// No discount expected — verify none given
|
|
372
|
+
discountVerified = feesPaid.discount === 0n;
|
|
373
|
+
}
|
|
374
|
+
const isMatch = abs(escrowDelta) <= 1n
|
|
375
|
+
&& escrowCorrect
|
|
376
|
+
&& serviceFeeCorrect
|
|
377
|
+
&& feeRatioMatch
|
|
378
|
+
&& (discountVerified === null || discountVerified);
|
|
379
|
+
return {
|
|
380
|
+
escrow,
|
|
381
|
+
escrowAccounted,
|
|
382
|
+
escrowDelta,
|
|
383
|
+
expectedEscrow,
|
|
384
|
+
escrowCorrect,
|
|
385
|
+
expectedServiceFee,
|
|
386
|
+
serviceFeeCorrect,
|
|
387
|
+
feeRatioBps,
|
|
388
|
+
expectedFeeBps,
|
|
389
|
+
feeRatioMatch,
|
|
390
|
+
discountVerified,
|
|
391
|
+
actualOwnerEarned,
|
|
392
|
+
actualFeeCollected,
|
|
393
|
+
actualRefund,
|
|
394
|
+
status: isMatch ? 'match' : 'mismatch',
|
|
395
|
+
};
|
|
396
|
+
}
|
|
397
|
+
function abs(n) {
|
|
398
|
+
return n < 0n ? -n : n;
|
|
399
|
+
}
|
|
400
|
+
//# sourceMappingURL=audit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../../src/audit/audit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Anchor event log parser for SRSLY audit events.
|
|
4
|
+
*
|
|
5
|
+
* Discriminators are read from the IDL (precomputed by Anchor's build).
|
|
6
|
+
* Borsh decoding is manual — no external borsh dependency needed.
|
|
7
|
+
*/
|
|
8
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
9
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.parseAnchorEvents = parseAnchorEvents;
|
|
13
|
+
const kit_1 = require("@solana/kit");
|
|
14
|
+
const srsly_json_1 = __importDefault(require("../idl/srsly.json"));
|
|
15
|
+
/** Convert byte array to hex string */
|
|
16
|
+
function toHex(bytes) {
|
|
17
|
+
return Array.from(bytes).map(b => b.toString(16).padStart(2, '0')).join('');
|
|
18
|
+
}
|
|
19
|
+
// Build discriminator → event name map from IDL
|
|
20
|
+
const DISC_MAP = new Map();
|
|
21
|
+
for (const evt of srsly_json_1.default.events ?? []) {
|
|
22
|
+
const hex = toHex(evt.discriminator);
|
|
23
|
+
DISC_MAP.set(hex, evt.name);
|
|
24
|
+
}
|
|
25
|
+
const addressDecoder = (0, kit_1.getAddressDecoder)();
|
|
26
|
+
/** Decode base64 string to Uint8Array (browser + Node compatible via atob) */
|
|
27
|
+
function decodeBase64(str) {
|
|
28
|
+
const binary = atob(str);
|
|
29
|
+
const bytes = new Uint8Array(binary.length);
|
|
30
|
+
for (let i = 0; i < binary.length; i++)
|
|
31
|
+
bytes[i] = binary.charCodeAt(i);
|
|
32
|
+
return bytes;
|
|
33
|
+
}
|
|
34
|
+
// ── Borsh deserialization helpers ──
|
|
35
|
+
function readAddress(buf, offset) {
|
|
36
|
+
const bytes = buf.slice(offset, offset + 32);
|
|
37
|
+
const address = addressDecoder.decode(bytes);
|
|
38
|
+
return [address, offset + 32];
|
|
39
|
+
}
|
|
40
|
+
function readU64(buf, offset) {
|
|
41
|
+
const lo = buf.getUint32(offset, true);
|
|
42
|
+
const hi = buf.getUint32(offset + 4, true);
|
|
43
|
+
return [BigInt(lo) + (BigInt(hi) << 32n), offset + 8];
|
|
44
|
+
}
|
|
45
|
+
function readI64(buf, offset) {
|
|
46
|
+
const value = buf.getBigInt64(offset, true);
|
|
47
|
+
return [value, offset + 8];
|
|
48
|
+
}
|
|
49
|
+
function readU16(buf, offset) {
|
|
50
|
+
return [buf.getUint16(offset, true), offset + 2];
|
|
51
|
+
}
|
|
52
|
+
function readBool(buf, offset) {
|
|
53
|
+
return [buf.getUint8(offset) !== 0, offset + 1];
|
|
54
|
+
}
|
|
55
|
+
// ── Event decoders ──
|
|
56
|
+
function decodeRentalAccepted(raw, dv, offset, slot, signature) {
|
|
57
|
+
let rentalState, contract, borrower;
|
|
58
|
+
let escrow, rate, serviceFee;
|
|
59
|
+
let feeBps;
|
|
60
|
+
let startTime, endTime;
|
|
61
|
+
[rentalState, offset] = readAddress(raw, offset);
|
|
62
|
+
[contract, offset] = readAddress(raw, offset);
|
|
63
|
+
[borrower, offset] = readAddress(raw, offset);
|
|
64
|
+
[escrow, offset] = readU64(dv, offset);
|
|
65
|
+
[rate, offset] = readU64(dv, offset);
|
|
66
|
+
[serviceFee, offset] = readU64(dv, offset);
|
|
67
|
+
[feeBps, offset] = readU16(dv, offset);
|
|
68
|
+
[startTime, offset] = readI64(dv, offset);
|
|
69
|
+
[endTime, offset] = readI64(dv, offset);
|
|
70
|
+
return {
|
|
71
|
+
type: 'RentalAccepted', rentalState, contract, borrower,
|
|
72
|
+
escrow, rate, serviceFee, feeBps, startTime, endTime, slot, signature,
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
function decodeRentalSettled(raw, dv, offset, slot, signature) {
|
|
76
|
+
let rentalState, contract;
|
|
77
|
+
let ownerEarned, escrowRemaining;
|
|
78
|
+
let isFinal;
|
|
79
|
+
[rentalState, offset] = readAddress(raw, offset);
|
|
80
|
+
[contract, offset] = readAddress(raw, offset);
|
|
81
|
+
[ownerEarned, offset] = readU64(dv, offset);
|
|
82
|
+
[escrowRemaining, offset] = readU64(dv, offset);
|
|
83
|
+
[isFinal, offset] = readBool(dv, offset);
|
|
84
|
+
return {
|
|
85
|
+
type: 'RentalSettled', rentalState, contract,
|
|
86
|
+
ownerEarned, escrowRemaining, isFinal, slot, signature,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
function decodeRentalCancelled(raw, dv, offset, slot, signature) {
|
|
90
|
+
let rentalState, contract, borrower;
|
|
91
|
+
let ownerEarned, feeCollected, refund;
|
|
92
|
+
let newEndTime;
|
|
93
|
+
[rentalState, offset] = readAddress(raw, offset);
|
|
94
|
+
[contract, offset] = readAddress(raw, offset);
|
|
95
|
+
[borrower, offset] = readAddress(raw, offset);
|
|
96
|
+
[ownerEarned, offset] = readU64(dv, offset);
|
|
97
|
+
[feeCollected, offset] = readU64(dv, offset);
|
|
98
|
+
[refund, offset] = readU64(dv, offset);
|
|
99
|
+
[newEndTime, offset] = readI64(dv, offset);
|
|
100
|
+
return {
|
|
101
|
+
type: 'RentalCancelled', rentalState, contract, borrower,
|
|
102
|
+
ownerEarned, feeCollected, refund, newEndTime, slot, signature,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
function decodeRentalClosed(raw, dv, offset, slot, signature) {
|
|
106
|
+
let rentalState, contract, borrower;
|
|
107
|
+
let ownerEarned, feeCollected, pointsAwarded;
|
|
108
|
+
[rentalState, offset] = readAddress(raw, offset);
|
|
109
|
+
[contract, offset] = readAddress(raw, offset);
|
|
110
|
+
[borrower, offset] = readAddress(raw, offset);
|
|
111
|
+
[ownerEarned, offset] = readU64(dv, offset);
|
|
112
|
+
[feeCollected, offset] = readU64(dv, offset);
|
|
113
|
+
[pointsAwarded, offset] = readU64(dv, offset);
|
|
114
|
+
return {
|
|
115
|
+
type: 'RentalClosed', rentalState, contract, borrower,
|
|
116
|
+
ownerEarned, feeCollected, pointsAwarded, slot, signature,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
function decodeOwnerPaid(raw, dv, offset, slot, signature) {
|
|
120
|
+
let contract, owner;
|
|
121
|
+
let amount;
|
|
122
|
+
[contract, offset] = readAddress(raw, offset);
|
|
123
|
+
[owner, offset] = readAddress(raw, offset);
|
|
124
|
+
[amount, offset] = readU64(dv, offset);
|
|
125
|
+
return {
|
|
126
|
+
type: 'OwnerPaid', contract, owner, amount, slot, signature,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
function decodeFeesPaid(raw, dv, offset, slot, signature) {
|
|
130
|
+
let contract;
|
|
131
|
+
let feeCollected, discount;
|
|
132
|
+
let discountBps;
|
|
133
|
+
[contract, offset] = readAddress(raw, offset);
|
|
134
|
+
[feeCollected, offset] = readU64(dv, offset);
|
|
135
|
+
[discount, offset] = readU64(dv, offset);
|
|
136
|
+
[discountBps, offset] = readU16(dv, offset);
|
|
137
|
+
return {
|
|
138
|
+
type: 'FeesPaid', contract, feeCollected, discount, discountBps, slot, signature,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
// Sanity check: timestamps should be between 2024 and 2030
|
|
142
|
+
const MIN_TS = 1704067200n; // 2024-01-01
|
|
143
|
+
const MAX_TS = 1893456000n; // 2030-01-01
|
|
144
|
+
function isPlausibleEvent(event) {
|
|
145
|
+
if (event.type === 'RentalAccepted') {
|
|
146
|
+
return event.startTime >= MIN_TS && event.startTime <= MAX_TS
|
|
147
|
+
&& event.endTime >= MIN_TS && event.endTime <= MAX_TS
|
|
148
|
+
&& event.endTime > event.startTime;
|
|
149
|
+
}
|
|
150
|
+
if (event.type === 'RentalCancelled') {
|
|
151
|
+
return event.newEndTime >= MIN_TS && event.newEndTime <= MAX_TS;
|
|
152
|
+
}
|
|
153
|
+
// For other events, check amounts aren't astronomically large (> 1 trillion stardust = 10k ATLAS)
|
|
154
|
+
if (event.type === 'RentalSettled') {
|
|
155
|
+
return event.ownerEarned < 1000000000000000n;
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
const DECODERS = {
|
|
160
|
+
RentalAccepted: decodeRentalAccepted,
|
|
161
|
+
RentalSettled: decodeRentalSettled,
|
|
162
|
+
RentalCancelled: decodeRentalCancelled,
|
|
163
|
+
RentalClosed: decodeRentalClosed,
|
|
164
|
+
OwnerPaid: decodeOwnerPaid,
|
|
165
|
+
FeesPaid: decodeFeesPaid,
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Parse Anchor events from transaction log messages.
|
|
169
|
+
*
|
|
170
|
+
* Anchor emits events as `Program data: <base64>` log lines where the data
|
|
171
|
+
* starts with an 8-byte discriminator followed by borsh-serialized fields.
|
|
172
|
+
*
|
|
173
|
+
* Discriminators are matched against the IDL — no runtime hashing needed.
|
|
174
|
+
*/
|
|
175
|
+
function parseAnchorEvents(logs, programId, slot, signature) {
|
|
176
|
+
const events = [];
|
|
177
|
+
// Track execution context as a stack of program IDs.
|
|
178
|
+
// `Program data:` lines belong to the program on top of the stack.
|
|
179
|
+
// This correctly handles CPI chains (thread → SRSLY → token → ...).
|
|
180
|
+
const execStack = [];
|
|
181
|
+
const invokeRe = /^Program (\w+) invoke \[(\d+)\]$/;
|
|
182
|
+
for (const log of logs) {
|
|
183
|
+
const invokeMatch = log.match(invokeRe);
|
|
184
|
+
if (invokeMatch) {
|
|
185
|
+
execStack.push(invokeMatch[1]);
|
|
186
|
+
continue;
|
|
187
|
+
}
|
|
188
|
+
if (log.startsWith('Program ') && (log.endsWith(' success') || log.endsWith(' failed'))) {
|
|
189
|
+
execStack.pop();
|
|
190
|
+
continue;
|
|
191
|
+
}
|
|
192
|
+
// Only parse `Program data:` when our program is on top of the stack
|
|
193
|
+
const currentProgram = execStack[execStack.length - 1];
|
|
194
|
+
if (currentProgram !== programId || !log.startsWith('Program data: '))
|
|
195
|
+
continue;
|
|
196
|
+
const base64Data = log.slice('Program data: '.length);
|
|
197
|
+
let raw;
|
|
198
|
+
try {
|
|
199
|
+
raw = decodeBase64(base64Data);
|
|
200
|
+
}
|
|
201
|
+
catch {
|
|
202
|
+
continue;
|
|
203
|
+
}
|
|
204
|
+
if (raw.length < 8)
|
|
205
|
+
continue;
|
|
206
|
+
const discHex = toHex(raw.slice(0, 8));
|
|
207
|
+
const eventName = DISC_MAP.get(discHex);
|
|
208
|
+
if (!eventName)
|
|
209
|
+
continue;
|
|
210
|
+
const decoder = DECODERS[eventName];
|
|
211
|
+
if (!decoder)
|
|
212
|
+
continue;
|
|
213
|
+
try {
|
|
214
|
+
const dv = new DataView(raw.buffer, raw.byteOffset, raw.byteLength);
|
|
215
|
+
const event = decoder(raw, dv, 8, slot, signature);
|
|
216
|
+
// Validate: reject events from old program versions with mismatched layouts
|
|
217
|
+
if (!isPlausibleEvent(event))
|
|
218
|
+
continue;
|
|
219
|
+
events.push(event);
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
// Skip malformed events
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
return events;
|
|
226
|
+
}
|
|
227
|
+
//# sourceMappingURL=events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/audit/events.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;;;AAwMH,8CA0DC;AAhQD,qCAA8D;AAE9D,mEAAoC;AAEpC,uCAAuC;AACvC,SAAS,KAAK,CAAC,KAA4B;IACzC,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC9E,CAAC;AAED,gDAAgD;AAChD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;AAE3C,KAAK,MAAM,GAAG,IAAK,oBAAW,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;IAC5C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,aAAyB,CAAC,CAAC;IACjD,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,cAAc,GAAG,IAAA,uBAAiB,GAAE,CAAC;AAE3C,8EAA8E;AAC9E,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;QAAE,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxE,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sCAAsC;AAEtC,SAAS,WAAW,CAAC,GAAe,EAAE,MAAc;IAClD,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC7C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,CAAC;AAChC,CAAC;AAED,SAAS,OAAO,CAAC,GAAa,EAAE,MAAc;IAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,OAAO,CAAC,GAAa,EAAE,MAAc;IAC5C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5C,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,OAAO,CAAC,GAAa,EAAE,MAAc;IAC5C,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAa,EAAE,MAAc;IAC7C,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,CAAC;AAClD,CAAC;AAED,uBAAuB;AAEvB,SAAS,oBAAoB,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IAC1G,IAAI,WAAoB,EAAE,QAAiB,EAAE,QAAiB,CAAC;IAC/D,IAAI,MAAc,EAAE,IAAY,EAAE,UAAkB,CAAC;IACrD,IAAI,MAAc,CAAC;IACnB,IAAI,SAAiB,EAAE,OAAe,CAAC;IAEvC,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,IAAI,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACrC,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAExC,OAAO;QACL,IAAI,EAAE,gBAAgB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;QACvD,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;KACtE,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IACzG,IAAI,WAAoB,EAAE,QAAiB,CAAC;IAC5C,IAAI,WAAmB,EAAE,eAAuB,CAAC;IACjD,IAAI,OAAgB,CAAC;IAErB,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC,eAAe,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,OAAO,EAAE,MAAM,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAEzC,OAAO;QACL,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,QAAQ;QAC5C,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;KACvD,CAAC;AACJ,CAAC;AAED,SAAS,qBAAqB,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IAC3G,IAAI,WAAoB,EAAE,QAAiB,EAAE,QAAiB,CAAC;IAC/D,IAAI,WAAmB,EAAE,YAAoB,EAAE,MAAc,CAAC;IAC9D,IAAI,UAAkB,CAAC;IAEvB,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACvC,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAE3C,OAAO;QACL,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;QACxD,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IACxG,IAAI,WAAoB,EAAE,QAAiB,EAAE,QAAiB,CAAC;IAC/D,IAAI,WAAmB,EAAE,YAAoB,EAAE,aAAqB,CAAC;IAErE,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC,aAAa,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAE9C,OAAO;QACL,IAAI,EAAE,cAAc,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;QACrD,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS;KAC1D,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IACrG,IAAI,QAAiB,EAAE,KAAc,CAAC;IACtC,IAAI,MAAc,CAAC;IAEnB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC3C,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAEvC,OAAO;QACL,IAAI,EAAE,WAAW,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS;KAC5D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,GAAe,EAAE,EAAY,EAAE,MAAc,EAAE,IAAY,EAAE,SAAiB;IACpG,IAAI,QAAiB,CAAC;IACtB,IAAI,YAAoB,EAAE,QAAgB,CAAC;IAC3C,IAAI,WAAmB,CAAC;IAExB,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC9C,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC7C,CAAC,QAAQ,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACzC,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAE5C,OAAO;QACL,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS;KACjF,CAAC;AACJ,CAAC;AAED,2DAA2D;AAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa;AACzC,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,aAAa;AAEzC,SAAS,gBAAgB,CAAC,KAAiB;IACzC,IAAI,KAAK,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,SAAS,IAAI,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,MAAM;eACxD,KAAK,CAAC,OAAO,IAAI,MAAM,IAAI,KAAK,CAAC,OAAO,IAAI,MAAM;eAClD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAC,SAAS,CAAC;IACvC,CAAC;IACD,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACrC,OAAO,KAAK,CAAC,UAAU,IAAI,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,MAAM,CAAC;IAClE,CAAC;IACD,kGAAkG;IAClG,IAAI,KAAK,CAAC,IAAI,KAAK,eAAe,EAAE,CAAC;QACnC,OAAO,KAAK,CAAC,WAAW,GAAG,iBAAsB,CAAC;IACpD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAID,MAAM,QAAQ,GAA4B;IACxC,cAAc,EAAE,oBAAoB;IACpC,aAAa,EAAE,mBAAmB;IAClC,eAAe,EAAE,qBAAqB;IACtC,YAAY,EAAE,kBAAkB;IAChC,SAAS,EAAE,eAAe;IAC1B,QAAQ,EAAE,cAAc;CACzB,CAAC;AAEF;;;;;;;GAOG;AACH,SAAgB,iBAAiB,CAC/B,IAAuB,EACvB,SAAiB,EACjB,IAAY,EACZ,SAAiB;IAEjB,MAAM,MAAM,GAAiB,EAAE,CAAC;IAEhC,qDAAqD;IACrD,mEAAmE;IACnE,oEAAoE;IACpE,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,kCAAkC,CAAC;IAEpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACxC,IAAI,WAAW,EAAE,CAAC;YAChB,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;YAC/B,SAAS;QACX,CAAC;QACD,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACxF,SAAS,CAAC,GAAG,EAAE,CAAC;YAChB,SAAS;QACX,CAAC;QAED,qEAAqE;QACrE,MAAM,cAAc,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACvD,IAAI,cAAc,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,gBAAgB,CAAC;YAAE,SAAS;QAEhF,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,GAAe,CAAC;QACpB,IAAI,CAAC;YACH,GAAG,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAE7B,MAAM,OAAO,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACvC,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACxC,IAAI,CAAC,SAAS;YAAE,SAAS;QAEzB,MAAM,OAAO,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,IAAI,CAAC;YACH,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;YACpE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;YACnD,4EAA4E;YAC5E,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC;gBAAE,SAAS;YACvC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAnchorEvents = exports.fetchContractAudit = void 0;
|
|
4
|
+
var audit_1 = require("./audit");
|
|
5
|
+
Object.defineProperty(exports, "fetchContractAudit", { enumerable: true, get: function () { return audit_1.fetchContractAudit; } });
|
|
6
|
+
var events_1 = require("./events");
|
|
7
|
+
Object.defineProperty(exports, "parseAnchorEvents", { enumerable: true, get: function () { return events_1.parseAnchorEvents; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|