@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
|
@@ -68,20 +68,23 @@ async function reserveRental(params, config) {
|
|
|
68
68
|
throw new Error('duration is required');
|
|
69
69
|
}
|
|
70
70
|
const bidPoints = params.bidPoints ?? 0;
|
|
71
|
-
let bidAtlasValue = params.bidAtlas ? (0, amount_1.convertAmount)(params.bidAtlas) : 0n;
|
|
71
|
+
let bidAtlasValue = params.bidAtlas !== undefined ? (0, amount_1.convertAmount)(params.bidAtlas) : 0n;
|
|
72
|
+
const userProvidedBid = params.bidPoints !== undefined || params.bidAtlas !== undefined;
|
|
72
73
|
if (bidPoints > 0 && bidAtlasValue > 0n) {
|
|
73
74
|
throw new Error('bidPoints and bidAtlas are mutually exclusive');
|
|
74
75
|
}
|
|
75
|
-
// Auto-fill the ATLAS bid
|
|
76
|
-
//
|
|
77
|
-
//
|
|
76
|
+
// Auto-fill the ATLAS bid when the caller omitted both bid params AND
|
|
77
|
+
// there is an existing defender to outbid. First reservations allow
|
|
78
|
+
// zero-bid, so we leave those untouched.
|
|
78
79
|
const autoMinBid = params.autoMinBid ?? true;
|
|
79
|
-
if (autoMinBid &&
|
|
80
|
+
if (autoMinBid && !userProvidedBid) {
|
|
80
81
|
const floor = await (0, bidMath_1.getMinimumBid)({
|
|
81
82
|
contractAddress: params.contract,
|
|
82
83
|
rpcUrl: config?.rpcUrl,
|
|
83
84
|
});
|
|
84
|
-
|
|
85
|
+
if (floor.defenderBidStardust > 0n) {
|
|
86
|
+
bidAtlasValue = floor.minBidStardust;
|
|
87
|
+
}
|
|
85
88
|
}
|
|
86
89
|
// Convert challenger to transaction signer
|
|
87
90
|
const challengerSigner = (0, signer_1.toTransactionSigner)(params.challenger);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reserveRental.js","sourceRoot":"","sources":["../../../src/instructions/reserveRental.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AA+GH,
|
|
1
|
+
{"version":3,"file":"reserveRental.js","sourceRoot":"","sources":["../../../src/instructions/reserveRental.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/kit/index.js
CHANGED
|
@@ -52,7 +52,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
52
52
|
};
|
|
53
53
|
})();
|
|
54
54
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
55
|
-
exports.codama = exports.claim = exports.VERSION = void 0;
|
|
55
|
+
exports.audit = exports.codama = exports.claim = exports.VERSION = void 0;
|
|
56
56
|
var version_1 = require("../version");
|
|
57
57
|
Object.defineProperty(exports, "VERSION", { enumerable: true, get: function () { return version_1.VERSION; } });
|
|
58
58
|
__exportStar(require("../utils"), exports);
|
|
@@ -65,4 +65,5 @@ __exportStar(require("../cost"), exports);
|
|
|
65
65
|
var slyvault_1 = require("@wuwei-labs/slyvault");
|
|
66
66
|
Object.defineProperty(exports, "claim", { enumerable: true, get: function () { return slyvault_1.claim; } });
|
|
67
67
|
exports.codama = __importStar(require("../generated/codama"));
|
|
68
|
+
exports.audit = __importStar(require("../audit"));
|
|
68
69
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kit/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,sCAAqC;AAA5B,kGAAA,OAAO,OAAA;AAChB,2CAAyB;AACzB,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,yCAAuB;AACvB,0CAAwB;AAExB,sBAAsB;AACtB,iDAG8B;AAF5B,iGAAA,KAAK,OAAA;AAIP,8DAA8C"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/kit/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;GAeG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,sCAAqC;AAA5B,kGAAA,OAAO,OAAA;AAChB,2CAAyB;AACzB,kDAAgC;AAChC,8CAA4B;AAC5B,4CAA0B;AAC1B,yCAAuB;AACvB,0CAAwB;AAExB,sBAAsB;AACtB,iDAG8B;AAF5B,iGAAA,KAAK,OAAA;AAIP,8DAA8C;AAC9C,kDAAkC"}
|
package/dist/cjs/package.json
CHANGED
package/dist/cjs/version.js
CHANGED
|
@@ -3,5 +3,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.VERSION = void 0;
|
|
4
4
|
// Auto-generated from package.json - DO NOT EDIT
|
|
5
5
|
// Run "pnpm run generate:version" to update
|
|
6
|
-
exports.VERSION = '4.
|
|
6
|
+
exports.VERSION = '4.4.0';
|
|
7
7
|
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Contract audit — reconstructs the full payment lifecycle from on-chain events.
|
|
3
|
+
*/
|
|
4
|
+
import { fetchContract } from '../accounts/contract';
|
|
5
|
+
import { getRpcUrl } from '../utils/config';
|
|
6
|
+
import { createRpc } from '../utils/rpc';
|
|
7
|
+
import { parseAnchorEvents } from './events';
|
|
8
|
+
const SRSLY_PROGRAM_ID = 'SRSLYxcFnjd5jG2DpJw4as6UEyjwJQK1U4J1TD1hvZH';
|
|
9
|
+
/**
|
|
10
|
+
* Fetch and reconstruct a contract's audit trail from transaction history.
|
|
11
|
+
*/
|
|
12
|
+
export async function fetchContractAudit(rpcUrl, contract, options) {
|
|
13
|
+
const resolvedRpcUrl = rpcUrl || getRpcUrl();
|
|
14
|
+
const rpc = createRpc(resolvedRpcUrl);
|
|
15
|
+
// 1. Fetch on-chain contract state
|
|
16
|
+
const contractAccount = await fetchContract(contract, resolvedRpcUrl);
|
|
17
|
+
const onChain = {
|
|
18
|
+
totalEarned: contractAccount.data.totalEarned,
|
|
19
|
+
ownerClaimable: contractAccount.data.ownerClaimable,
|
|
20
|
+
feeClaimable: contractAccount.data.feeClaimable,
|
|
21
|
+
};
|
|
22
|
+
// 2. Fetch transaction signatures
|
|
23
|
+
const lastN = options?.all ? undefined : (options?.lastN ?? 10);
|
|
24
|
+
const sinceTimestamp = options?.since ? Math.floor(Date.now() / 1000) - options.since : undefined;
|
|
25
|
+
const log = options?.onProgress ?? (() => { });
|
|
26
|
+
const { events: allEvents, exhausted } = await fetchEventHistory(rpc, contract, resolvedRpcUrl, lastN, sinceTimestamp, log);
|
|
27
|
+
// 3. Group events into rental lifecycles
|
|
28
|
+
// Filter out in-progress rentals — incomplete data makes reconciliation meaningless
|
|
29
|
+
const allRentals = buildRentalAudits(allEvents)
|
|
30
|
+
.filter(r => r.status !== 'in-progress');
|
|
31
|
+
// Only consider full history when we scanned every signature (no cutoffs)
|
|
32
|
+
const isFullHistory = exhausted;
|
|
33
|
+
const rentals = lastN && allRentals.length > lastN
|
|
34
|
+
? allRentals.slice(0, lastN)
|
|
35
|
+
: allRentals;
|
|
36
|
+
// 4. Compute summary
|
|
37
|
+
let ownerEarned = 0n;
|
|
38
|
+
let feeCollected = 0n;
|
|
39
|
+
let discount = 0n;
|
|
40
|
+
let refunds = 0n;
|
|
41
|
+
let ownerTransfers = 0n;
|
|
42
|
+
let allMatch = true;
|
|
43
|
+
for (const r of rentals) {
|
|
44
|
+
ownerEarned += r.totalOwnerEarned;
|
|
45
|
+
feeCollected += r.totalFeeCollected;
|
|
46
|
+
discount += r.totalDiscount;
|
|
47
|
+
refunds += r.totalRefund;
|
|
48
|
+
for (const t of r.ownerTransfers) {
|
|
49
|
+
ownerTransfers += t.amount;
|
|
50
|
+
}
|
|
51
|
+
if (r.reconciliation.status === 'mismatch')
|
|
52
|
+
allMatch = false;
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
contract,
|
|
56
|
+
onChain,
|
|
57
|
+
isFullHistory,
|
|
58
|
+
rentals,
|
|
59
|
+
summary: {
|
|
60
|
+
ownerEarned,
|
|
61
|
+
feeCollected,
|
|
62
|
+
discount,
|
|
63
|
+
refunds,
|
|
64
|
+
ownerTransfers,
|
|
65
|
+
matchesTotalEarned: isFullHistory ? ownerEarned === onChain.totalEarned : null,
|
|
66
|
+
allRentalsMatch: allMatch,
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Fetch all audit-relevant events from a contract's transaction history.
|
|
72
|
+
*/
|
|
73
|
+
async function fetchEventHistory(rpc, contract, rpcUrl, maxRentals, sinceTimestamp, log) {
|
|
74
|
+
const allEvents = [];
|
|
75
|
+
let before;
|
|
76
|
+
let rentalCount = 0;
|
|
77
|
+
let txCount = 0;
|
|
78
|
+
let page = 0;
|
|
79
|
+
while (true) {
|
|
80
|
+
const params = { limit: 100 };
|
|
81
|
+
if (before)
|
|
82
|
+
params.before = before;
|
|
83
|
+
page++;
|
|
84
|
+
log(`Fetching signatures (page ${page})...`);
|
|
85
|
+
const signatures = await rpc.getSignaturesForAddress(contract, params).send();
|
|
86
|
+
if (!signatures || signatures.length === 0) {
|
|
87
|
+
log(`No more signatures found`);
|
|
88
|
+
break;
|
|
89
|
+
}
|
|
90
|
+
log(`Got ${signatures.length} signatures, parsing transactions...`);
|
|
91
|
+
for (const sigInfo of signatures) {
|
|
92
|
+
// Time-based cutoff
|
|
93
|
+
if (sinceTimestamp && sigInfo.blockTime && Number(sigInfo.blockTime) < sinceTimestamp) {
|
|
94
|
+
log(`Reached time cutoff after ${txCount} txs, ${allEvents.length} events, ${rentalCount} rentals`);
|
|
95
|
+
return { events: allEvents, exhausted: false };
|
|
96
|
+
}
|
|
97
|
+
// Skip failed txs
|
|
98
|
+
if (sigInfo.err)
|
|
99
|
+
continue;
|
|
100
|
+
txCount++;
|
|
101
|
+
const tx = await rpc.getTransaction(sigInfo.signature, {
|
|
102
|
+
encoding: 'json',
|
|
103
|
+
maxSupportedTransactionVersion: 0,
|
|
104
|
+
}).send();
|
|
105
|
+
if (!tx?.meta?.logMessages)
|
|
106
|
+
continue;
|
|
107
|
+
const events = parseAnchorEvents(tx.meta.logMessages, SRSLY_PROGRAM_ID, BigInt(tx.slot), sigInfo.signature);
|
|
108
|
+
for (const evt of events) {
|
|
109
|
+
allEvents.push(evt);
|
|
110
|
+
if (evt.type === 'RentalAccepted') {
|
|
111
|
+
rentalCount++;
|
|
112
|
+
log(`Found rental #${rentalCount} (${txCount} txs scanned, ${allEvents.length} events)`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// Stop fetching once we have enough accepts to build N+1 lifecycles.
|
|
116
|
+
// The extra +1 ensures we don't cut off the Nth lifecycle's older events.
|
|
117
|
+
// The actual lastN trimming happens after grouping.
|
|
118
|
+
if (maxRentals && rentalCount > maxRentals) {
|
|
119
|
+
log(`Found ${rentalCount} rentals (need ${maxRentals}), ${txCount} txs scanned`);
|
|
120
|
+
return { events: allEvents, exhausted: false };
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Pagination
|
|
124
|
+
before = signatures[signatures.length - 1].signature;
|
|
125
|
+
}
|
|
126
|
+
log(`Done: ${txCount} txs scanned, ${allEvents.length} events, ${rentalCount} rentals`);
|
|
127
|
+
return { events: allEvents, exhausted: true };
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Group events into per-rental audit records.
|
|
131
|
+
*
|
|
132
|
+
* Challenges:
|
|
133
|
+
* - Rental state PDAs are reused (reset on close) → same PDA, multiple lifecycles
|
|
134
|
+
* - Queued rentals get promoted to active PDA → RentalAccepted references queued PDA,
|
|
135
|
+
* but all subsequent events (settle/cancel/close) reference active PDA
|
|
136
|
+
*
|
|
137
|
+
* Strategy: match events by borrower (stable across PDA promotion).
|
|
138
|
+
* RentalSettled has no borrower — match by PDA, then fall back to the only
|
|
139
|
+
* open lifecycle without a close.
|
|
140
|
+
*
|
|
141
|
+
* OwnerPaid and FeesPaid are contract-level — associated with the most
|
|
142
|
+
* recently closed rental via temporal proximity.
|
|
143
|
+
*/
|
|
144
|
+
function buildRentalAudits(events) {
|
|
145
|
+
// Process chronologically (events come newest-first from RPC)
|
|
146
|
+
const chronological = [...events].reverse();
|
|
147
|
+
// Track open lifecycles by borrower address (unique per contract at any time)
|
|
148
|
+
const openByBorrower = new Map();
|
|
149
|
+
// Secondary: track which PDA a lifecycle is currently on (for RentalSettled)
|
|
150
|
+
const pdaToBorrower = new Map();
|
|
151
|
+
const finalized = [];
|
|
152
|
+
const contractEvents = [];
|
|
153
|
+
for (const evt of chronological) {
|
|
154
|
+
switch (evt.type) {
|
|
155
|
+
case 'RentalAccepted': {
|
|
156
|
+
const borrower = evt.borrower;
|
|
157
|
+
const pda = evt.rentalState;
|
|
158
|
+
// If this borrower already has an open lifecycle, finalize it
|
|
159
|
+
const existing = openByBorrower.get(borrower);
|
|
160
|
+
if (existing?.accepted) {
|
|
161
|
+
finalized.push(existing);
|
|
162
|
+
}
|
|
163
|
+
// Start fresh lifecycle
|
|
164
|
+
const entry = {
|
|
165
|
+
accepted: evt,
|
|
166
|
+
settlements: [],
|
|
167
|
+
ownerTransfers: [],
|
|
168
|
+
};
|
|
169
|
+
openByBorrower.set(borrower, entry);
|
|
170
|
+
pdaToBorrower.set(pda, borrower);
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
case 'RentalSettled': {
|
|
174
|
+
// RentalSettled has no borrower — resolve via PDA
|
|
175
|
+
const pda = evt.rentalState;
|
|
176
|
+
let borrower = pdaToBorrower.get(pda);
|
|
177
|
+
if (!borrower) {
|
|
178
|
+
// PDA changed (queued→active promotion). Find the only open
|
|
179
|
+
// lifecycle that hasn't been closed yet.
|
|
180
|
+
for (const [b, entry] of openByBorrower) {
|
|
181
|
+
if (entry.accepted && !entry.closed && !entry.cancelled) {
|
|
182
|
+
borrower = b;
|
|
183
|
+
// Update PDA mapping for future settles
|
|
184
|
+
pdaToBorrower.set(pda, b);
|
|
185
|
+
break;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
if (borrower) {
|
|
190
|
+
const entry = openByBorrower.get(borrower);
|
|
191
|
+
if (entry)
|
|
192
|
+
(entry.settlements ??= []).push(evt);
|
|
193
|
+
}
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
case 'RentalCancelled': {
|
|
197
|
+
const borrower = evt.borrower;
|
|
198
|
+
const entry = openByBorrower.get(borrower);
|
|
199
|
+
if (entry) {
|
|
200
|
+
entry.cancelled = evt;
|
|
201
|
+
// Update PDA mapping (may have been promoted)
|
|
202
|
+
pdaToBorrower.set(evt.rentalState, borrower);
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
case 'RentalClosed': {
|
|
207
|
+
const borrower = evt.borrower;
|
|
208
|
+
const entry = openByBorrower.get(borrower);
|
|
209
|
+
if (entry) {
|
|
210
|
+
entry.closed = evt;
|
|
211
|
+
pdaToBorrower.set(evt.rentalState, borrower);
|
|
212
|
+
}
|
|
213
|
+
break;
|
|
214
|
+
}
|
|
215
|
+
case 'FeesPaid':
|
|
216
|
+
case 'OwnerPaid': {
|
|
217
|
+
contractEvents.push({ evt, slot: evt.slot });
|
|
218
|
+
break;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
// Finalize remaining open lifecycles
|
|
223
|
+
for (const entry of openByBorrower.values()) {
|
|
224
|
+
if (entry.accepted)
|
|
225
|
+
finalized.push(entry);
|
|
226
|
+
}
|
|
227
|
+
// Associate contract-level events with the nearest closed rental
|
|
228
|
+
const allWithCloseSlot = finalized
|
|
229
|
+
.filter(e => e.closed || e.cancelled)
|
|
230
|
+
.map(e => ({ entry: e, closeSlot: e.closed?.slot ?? e.cancelled.slot }))
|
|
231
|
+
.sort((a, b) => (a.closeSlot < b.closeSlot ? -1 : a.closeSlot > b.closeSlot ? 1 : 0));
|
|
232
|
+
for (const { evt, slot } of contractEvents) {
|
|
233
|
+
let best;
|
|
234
|
+
for (const { entry, closeSlot } of allWithCloseSlot) {
|
|
235
|
+
if (closeSlot <= slot)
|
|
236
|
+
best = entry;
|
|
237
|
+
else
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (best) {
|
|
241
|
+
if (evt.type === 'FeesPaid') {
|
|
242
|
+
best.feesPaid = evt;
|
|
243
|
+
}
|
|
244
|
+
else {
|
|
245
|
+
(best.ownerTransfers ??= []).push(evt);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
// Build final audits
|
|
250
|
+
const rentals = finalized
|
|
251
|
+
.filter(e => e.accepted)
|
|
252
|
+
.map(e => finalizeRental(e, []));
|
|
253
|
+
// Most recent first
|
|
254
|
+
rentals.sort((a, b) => {
|
|
255
|
+
const aTime = a.accepted.startTime;
|
|
256
|
+
const bTime = b.accepted.startTime;
|
|
257
|
+
return aTime > bTime ? -1 : aTime < bTime ? 1 : 0;
|
|
258
|
+
});
|
|
259
|
+
return rentals;
|
|
260
|
+
}
|
|
261
|
+
function finalizeRental(partial, _unassigned) {
|
|
262
|
+
const accepted = partial.accepted;
|
|
263
|
+
const settlements = partial.settlements ?? [];
|
|
264
|
+
const cancelled = partial.cancelled;
|
|
265
|
+
const closed = partial.closed;
|
|
266
|
+
const feesPaid = partial.feesPaid;
|
|
267
|
+
const ownerTransfers = partial.ownerTransfers ?? [];
|
|
268
|
+
// Derive status
|
|
269
|
+
let status = 'in-progress';
|
|
270
|
+
if (cancelled)
|
|
271
|
+
status = 'cancelled';
|
|
272
|
+
else if (closed)
|
|
273
|
+
status = 'completed';
|
|
274
|
+
// Compute dates (Solana timestamps are unix seconds)
|
|
275
|
+
const startTime = new Date(Number(accepted.startTime) * 1000);
|
|
276
|
+
const effectiveEndTime = cancelled ? cancelled.newEndTime : accepted.endTime;
|
|
277
|
+
const endTime = new Date(Number(effectiveEndTime) * 1000);
|
|
278
|
+
const durationSeconds = Number(effectiveEndTime - accepted.startTime);
|
|
279
|
+
// Sum actuals
|
|
280
|
+
let totalOwnerEarned = 0n;
|
|
281
|
+
let totalFeeCollected = 0n;
|
|
282
|
+
let totalRefund = 0n;
|
|
283
|
+
let totalDiscount = 0n;
|
|
284
|
+
for (const s of settlements) {
|
|
285
|
+
totalOwnerEarned += s.ownerEarned;
|
|
286
|
+
}
|
|
287
|
+
if (cancelled) {
|
|
288
|
+
totalOwnerEarned += cancelled.ownerEarned;
|
|
289
|
+
totalFeeCollected += cancelled.feeCollected;
|
|
290
|
+
totalRefund += cancelled.refund;
|
|
291
|
+
}
|
|
292
|
+
if (closed) {
|
|
293
|
+
totalOwnerEarned += closed.ownerEarned;
|
|
294
|
+
totalFeeCollected += closed.feeCollected;
|
|
295
|
+
}
|
|
296
|
+
if (feesPaid) {
|
|
297
|
+
totalDiscount += feesPaid.discount;
|
|
298
|
+
}
|
|
299
|
+
const reconciliation = computeReconciliation(accepted, totalOwnerEarned, totalFeeCollected, totalRefund, feesPaid);
|
|
300
|
+
return {
|
|
301
|
+
status,
|
|
302
|
+
borrower: accepted.borrower,
|
|
303
|
+
startTime,
|
|
304
|
+
endTime,
|
|
305
|
+
durationSeconds,
|
|
306
|
+
rate: accepted.rate,
|
|
307
|
+
feeBps: accepted.feeBps,
|
|
308
|
+
escrow: accepted.escrow,
|
|
309
|
+
serviceFee: accepted.serviceFee,
|
|
310
|
+
accepted,
|
|
311
|
+
settlements,
|
|
312
|
+
cancelled,
|
|
313
|
+
closed,
|
|
314
|
+
feesPaid,
|
|
315
|
+
ownerTransfers,
|
|
316
|
+
totalOwnerEarned,
|
|
317
|
+
totalFeeCollected,
|
|
318
|
+
totalDiscount,
|
|
319
|
+
totalRefund,
|
|
320
|
+
reconciliation,
|
|
321
|
+
};
|
|
322
|
+
}
|
|
323
|
+
/**
|
|
324
|
+
* Verify rental payment math e2e for all parties:
|
|
325
|
+
*
|
|
326
|
+
* Borrower:
|
|
327
|
+
* - Paid correct escrow (rate * duration / 86400)
|
|
328
|
+
* - Service fee correctly computed (escrow * fee_bps / 10000)
|
|
329
|
+
* - Refund + earned + fee = escrow (got back what they should)
|
|
330
|
+
* - Discount applied correctly if referrer present
|
|
331
|
+
*
|
|
332
|
+
* Owner:
|
|
333
|
+
* - Earned = escrow - fee - refund (conservation)
|
|
334
|
+
* - Fee ratio matches contracted fee_bps
|
|
335
|
+
*
|
|
336
|
+
* Protocol (slyvault):
|
|
337
|
+
* - Fee collected matches fee_bps proportion
|
|
338
|
+
* - Discount returned correctly to borrower
|
|
339
|
+
*/
|
|
340
|
+
function computeReconciliation(accepted, actualOwnerEarned, actualFeeCollected, actualRefund, feesPaid) {
|
|
341
|
+
const escrow = accepted.escrow;
|
|
342
|
+
const duration = accepted.endTime - accepted.startTime;
|
|
343
|
+
// 1. Conservation: all escrow accounted for
|
|
344
|
+
const escrowAccounted = actualOwnerEarned + actualFeeCollected + actualRefund;
|
|
345
|
+
const escrowDelta = escrowAccounted - escrow;
|
|
346
|
+
// 2. Borrower paid correct amount: escrow should = rate * duration / 86400
|
|
347
|
+
const expectedEscrow = duration > 0n ? (accepted.rate * duration) / 86400n : 0n;
|
|
348
|
+
const escrowCorrect = abs(escrow - expectedEscrow) <= 1n;
|
|
349
|
+
// 3. Service fee correctly calculated: service_fee = escrow * fee_bps / 10000
|
|
350
|
+
const expectedServiceFee = (escrow * BigInt(accepted.feeBps)) / 10000n;
|
|
351
|
+
const serviceFeeCorrect = abs(accepted.serviceFee - expectedServiceFee) <= 1n;
|
|
352
|
+
// 4. Fee ratio on payout: fee / (earned + fee) should ≈ fee_bps / 10000
|
|
353
|
+
const grossPayment = actualOwnerEarned + actualFeeCollected;
|
|
354
|
+
const feeRatioBps = grossPayment > 0n
|
|
355
|
+
? Number((actualFeeCollected * 10000n) / grossPayment)
|
|
356
|
+
: 0;
|
|
357
|
+
const expectedFeeBps = accepted.feeBps;
|
|
358
|
+
const feeRatioMatch = Math.abs(feeRatioBps - expectedFeeBps) <= 1;
|
|
359
|
+
// 5. Discount verification (if FeesPaid event with discount_bps > 0)
|
|
360
|
+
let discountVerified = null;
|
|
361
|
+
if (feesPaid && feesPaid.discountBps > 0) {
|
|
362
|
+
// discount should ≈ fee_collected * discount_bps / 10000
|
|
363
|
+
// (slyvault returns discount from its share)
|
|
364
|
+
const expectedDiscount = (feesPaid.feeCollected * BigInt(feesPaid.discountBps)) / 10000n;
|
|
365
|
+
discountVerified = abs(feesPaid.discount - expectedDiscount) <= 1n;
|
|
366
|
+
}
|
|
367
|
+
else if (feesPaid && feesPaid.discountBps === 0) {
|
|
368
|
+
// No discount expected — verify none given
|
|
369
|
+
discountVerified = feesPaid.discount === 0n;
|
|
370
|
+
}
|
|
371
|
+
const isMatch = abs(escrowDelta) <= 1n
|
|
372
|
+
&& escrowCorrect
|
|
373
|
+
&& serviceFeeCorrect
|
|
374
|
+
&& feeRatioMatch
|
|
375
|
+
&& (discountVerified === null || discountVerified);
|
|
376
|
+
return {
|
|
377
|
+
escrow,
|
|
378
|
+
escrowAccounted,
|
|
379
|
+
escrowDelta,
|
|
380
|
+
expectedEscrow,
|
|
381
|
+
escrowCorrect,
|
|
382
|
+
expectedServiceFee,
|
|
383
|
+
serviceFeeCorrect,
|
|
384
|
+
feeRatioBps,
|
|
385
|
+
expectedFeeBps,
|
|
386
|
+
feeRatioMatch,
|
|
387
|
+
discountVerified,
|
|
388
|
+
actualOwnerEarned,
|
|
389
|
+
actualFeeCollected,
|
|
390
|
+
actualRefund,
|
|
391
|
+
status: isMatch ? 'match' : 'mismatch',
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
function abs(n) {
|
|
395
|
+
return n < 0n ? -n : n;
|
|
396
|
+
}
|
|
397
|
+
//# 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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"}
|