fix: Ponder: fix mintNextHourProjected divisor, dead param, dead code (#308)

This commit is contained in:
openhands 2026-02-27 05:47:51 +00:00
parent c540d56d08
commit a4a3a85fdc
6 changed files with 31 additions and 32 deletions

View file

@ -45,17 +45,17 @@
"@graphql-codegen/typescript": "^4.0.6",
"@graphql-codegen/typescript-operations": "^4.2.0",
"@graphql-typed-document-node/core": "^3.2.0",
"@types/jest": "^29.5.12",
"@types/node": "^24.6.0",
"@typescript-eslint/eslint-plugin": "^8.45.0",
"@typescript-eslint/parser": "^8.45.0",
"@vitest/coverage-v8": "^3.0.0",
"eslint": "^9.36.0",
"husky": "^9.1.7",
"jest": "^29.7.0",
"lint-staged": "^16.2.3",
"picomatch": "^4.0.3",
"prettier": "^3.6.2",
"ts-jest": "^29.1.2",
"typescript": "^5.4.3"
"typescript": "^5.4.3",
"vitest": "^3.0.0"
}
},
"node_modules/@adraffy/ens-normalize": {

View file

@ -92,11 +92,11 @@ function computeProjections(ringBuffer: bigint[], pointer: number, timestamp: bi
const project = (current: bigint, previous: bigint, weekly: bigint) => {
if (elapsedSeconds === 0n) {
return weekly / 7n;
return weekly / 168n;
}
const projectedTotal = (current * BigInt(SECONDS_IN_HOUR)) / elapsedSeconds;
const medium = (previous + projectedTotal) / 2n;
return medium > 0n ? medium : weekly / 7n;
return medium > 0n ? medium : weekly / 168n;
};
const mintProjection = project(ringBuffer[currentBase + 1], ringBuffer[previousBase + 1], metrics.mintedWeek);
@ -259,8 +259,8 @@ export async function updateHourlyData(context: StatsContext, timestamp: bigint)
ethReserveLastWeek: metrics.ethReserveLatest > 0n ? metrics.ethReserveLatest - metrics.ethReserve7dAgo : 0n,
netSupplyChangeDay: metrics.mintedDay - metrics.burnedDay,
netSupplyChangeWeek: metrics.mintedWeek - metrics.burnedWeek,
mintNextHourProjected: metrics.mintedWeek / 7n,
burnNextHourProjected: metrics.burnedWeek / 7n,
mintNextHourProjected: metrics.mintedWeek / 168n,
burnNextHourProjected: metrics.burnedWeek / 168n,
});
} else {
const metrics = computeMetrics(ringBuffer, pointer);
@ -325,7 +325,7 @@ export async function refreshOutstandingStake(context: StatsContext) {
* Record ETH reserve snapshot in ring buffer slot 0.
* Called from lm.ts on Recentered events (where we know the pool's ETH balance).
*/
export async function recordEthReserveSnapshot(context: StatsContext, timestamp: bigint, ethBalance: bigint) {
export async function recordEthReserveSnapshot(context: StatsContext, ethBalance: bigint) {
const statsData = await context.db.find(stats, { id: STATS_ID });
if (!statsData) return;

View file

@ -189,7 +189,7 @@ async function updateReserveStats(
vwapTick: number | bigint
) {
// Record ETH reserve in ring buffer for hourly time-series
await recordEthReserveSnapshot(context, event.block.timestamp, ethBalance);
await recordEthReserveSnapshot(context, ethBalance);
// Compute 7d growth from ring buffer (slot 0 = ethReserve snapshots)
const statsData = await context.db.find(stats, { id: STATS_ID });

View file

@ -291,14 +291,14 @@ describe('updateHourlyData', () => {
// Filled slots: i=2..49 from pointer=7 (48 slots × 10n minted / 5n burned).
// mintedLastDay: i<24 → i=2..23 = 22 slots × 10n = 220n
// mintedLastWeek: 48 × 10n = 480n
// mintNextHourProjected = mintedWeek / 7n = 480n / 7n = 68n (BigInt truncation)
// burnNextHourProjected = burnedWeek / 7n = 240n / 7n = 34n
// mintNextHourProjected = mintedWeek / 168n = 480n / 168n = 2n (BigInt truncation)
// burnNextHourProjected = burnedWeek / 168n = 240n / 168n = 1n
expect(setArg.mintedLastWeek).toBe(480n);
expect(setArg.mintedLastDay).toBe(220n);
expect(setArg.burnedLastWeek).toBe(240n);
expect(setArg.burnedLastDay).toBe(110n);
expect(setArg.mintNextHourProjected).toBe(68n);
expect(setArg.burnNextHourProjected).toBe(34n);
expect(setArg.mintNextHourProjected).toBe(2n);
expect(setArg.burnNextHourProjected).toBe(1n);
expect(setArg.netSupplyChangeDay).toBe(110n);
expect(setArg.netSupplyChangeWeek).toBe(240n);
});
@ -399,7 +399,7 @@ describe('updateHourlyData', () => {
describe('recordEthReserveSnapshot', () => {
it('returns early when no stats row exists', async () => {
const ctx = createMockContext(null);
await recordEthReserveSnapshot(ctx, 1000n, 500n);
await recordEthReserveSnapshot(ctx, 500n);
expect((ctx as unknown as { db: { update: ReturnType<typeof vi.fn> } }).db.update).not.toHaveBeenCalled();
});
@ -409,7 +409,7 @@ describe('recordEthReserveSnapshot', () => {
const ctx = createMockContext(row);
const ethBalance = 12345678n;
await recordEthReserveSnapshot(ctx, 1000n, ethBalance);
await recordEthReserveSnapshot(ctx, ethBalance);
const dbMock = ctx as unknown as { db: { update: ReturnType<typeof vi.fn> } };
const setArg = (dbMock.db.update as ReturnType<typeof vi.fn>).mock.results[0].value.set.mock.calls[0][0];