Skip to content

Commit 3939e80

Browse files
Loop error handling and transition to single-table approach
1 parent 7be3dcc commit 3939e80

File tree

9 files changed

+49
-53
lines changed

9 files changed

+49
-53
lines changed

migrations/001.do.daily-reward-transfers.sql

Lines changed: 0 additions & 11 deletions
This file was deleted.

migrations/001.do.sql

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
SELECT now();
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CREATE TABLE daily_reward_transfers (
2+
day DATE NOT NULL,
3+
to_address TEXT NOT NULL,
4+
amount NUMERIC NOT NULL,
5+
last_checked_block INTEGER NOT NULL,
6+
PRIMARY KEY (day, to_address)
7+
);
8+
9+
CREATE INDEX daily_reward_transfers_day ON daily_reward_transfers (day);
10+
CREATE INDEX daily_reward_transfers_last_block ON daily_reward_transfers (last_checked_block DESC);

observer/bin/dry-run.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,6 @@ const provider = new ethers.JsonRpcProvider(fetchRequest, null, { polling: true
1515
const ieContract = new ethers.Contract(SparkImpactEvaluator.ADDRESS, SparkImpactEvaluator.ABI, provider)
1616

1717
await pgPool.query('DELETE FROM daily_reward_transfers')
18-
await pgPool.query('DELETE FROM reward_transfer_last_block')
19-
// Set the last block to -800 to simulate the observer starting from the beginning
20-
await pgPool.query('INSERT INTO reward_transfer_last_block (last_block) VALUES (-800)')
2118

2219
await observeTransferEvents(pgPool, ieContract, provider)
2320

observer/bin/spark-observer.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as SparkImpactEvaluator from '@filecoin-station/spark-impact-evaluator'
22
import { ethers } from 'ethers'
3+
import * as Sentry from '@sentry/node'
34

45
import { RPC_URL, rpcHeaders, OBSERVATION_INTERVAL_MS } from '../lib/config.js'
56
import { getPgPool } from '../lib/db.js'
@@ -15,6 +16,11 @@ const ieContract = new ethers.Contract(SparkImpactEvaluator.ADDRESS, SparkImpact
1516

1617
// Listen for Transfer events from the IE contract
1718
while (true) {
18-
observeTransferEvents(pgPool, ieContract, provider)
19+
try {
20+
await observeTransferEvents(pgPool, ieContract, provider)
21+
} catch (e) {
22+
console.error(e)
23+
Sentry.captureException(e)
24+
}
1925
await new Promise(resolve => setTimeout(resolve, OBSERVATION_INTERVAL_MS))
2026
}

observer/lib/observer.js

Lines changed: 7 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,9 @@ import { updateDailyTransferStats } from './platform-stats.js'
77
* @param {import('ethers').Provider} provider
88
*/
99
export const observeTransferEvents = async (pgPool, ieContract, provider) => {
10-
// Get the last checked block. Even though there should be only one row, use MAX just to be safe
1110
const lastCheckedBlock = await pgPool.query(
12-
'SELECT MAX(last_block) AS last_block FROM reward_transfer_last_block'
13-
).then(res => res.rows[0].last_block)
11+
'SELECT MAX(last_checked_block) FROM daily_reward_transfers'
12+
).then(res => res.rows[0].last_checked_block)
1413

1514
console.log('Querying impact evaluator Transfer events after block', lastCheckedBlock)
1615
let events
@@ -19,29 +18,21 @@ export const observeTransferEvents = async (pgPool, ieContract, provider) => {
1918
} catch (error) {
2019
console.error('Error querying impact evaluator Transfer events', error)
2120
if (error.message.includes('bad tipset height')) {
22-
console.log('Block number too old, GLIF only provides last 2000 blocks, querying from there')
23-
events = await ieContract.queryFilter(ieContract.filters.Transfer(), -1999)
21+
console.log('Block number too old, GLIF only provides last 2000 blocks, querying from -1900')
22+
events = await ieContract.queryFilter(ieContract.filters.Transfer(), -1900)
2423
} else {
2524
throw error
2625
}
2726
}
27+
const currentBlockNumber = await provider.getBlockNumber()
28+
console.log('Current block number:', currentBlockNumber)
2829
console.log(`Found ${events.length} Transfer events`)
2930
for (const event of events) {
3031
const transferEvent = {
3132
to_address: event.args.to,
3233
amount: event.args.amount
3334
}
3435
console.log('Transfer event:', transferEvent)
35-
await updateDailyTransferStats(pgPool, transferEvent)
36+
await updateDailyTransferStats(pgPool, transferEvent, currentBlockNumber)
3637
}
37-
38-
// Get the current block number and update the last_block in reward_transfer_last_block table
39-
// For safety, only update if the new block number is greater than the existing one
40-
const blockNumber = await provider.getBlockNumber()
41-
console.log('Current block number:', blockNumber)
42-
await pgPool.query(`
43-
UPDATE reward_transfer_last_block
44-
SET last_block = $1
45-
WHERE $1 > last_block
46-
`, [blockNumber])
4738
}

observer/lib/platform-stats.js

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@
33
* @param {Object} transferEvent
44
* @param {string} transferEvent.to_address
55
* @param {number} transferEvent.amount
6-
* @param {number} transferEvent.blockNumber
6+
* @param {number} currentBlockNumber
77
*/
8-
export const updateDailyTransferStats = async (pgClient, transferEvent) => {
8+
export const updateDailyTransferStats = async (pgClient, transferEvent, currentBlockNumber) => {
99
await pgClient.query(`
10-
INSERT INTO daily_reward_transfers (day, to_address, amount)
11-
VALUES (now(), $1, $2)
12-
ON CONFLICT (day, to_address) DO UPDATE
13-
SET amount = daily_reward_transfers.amount + EXCLUDED.amount
14-
`, [transferEvent.to_address, transferEvent.amount])
10+
INSERT INTO daily_reward_transfers (day, to_address, amount, last_checked_block)
11+
VALUES (now(), $1, $2, $3)
12+
ON CONFLICT (day, to_address) DO UPDATE SET
13+
amount = daily_reward_transfers.amount + EXCLUDED.amount,
14+
last_checked_block = EXCLUDED.last_checked_block
15+
`, [transferEvent.to_address, transferEvent.amount, currentBlockNumber])
1516
}

observer/test/platform-stats.test.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ describe('platform-stats-generator', () => {
3636

3737
describe('updateDailyTransferStats', () => {
3838
it('should correctly update daily Transfer stats with new transfer events', async () => {
39-
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 100, blockNumber: 1 })
40-
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 200, blockNumber: 1 })
39+
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 100 }, 1)
40+
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 200 }, 1)
4141

4242
const { rows } = await pgPool.query(`
4343
SELECT day::TEXT, to_address, amount FROM daily_reward_transfers
@@ -48,18 +48,18 @@ describe('platform-stats-generator', () => {
4848
})
4949

5050
it('should handle multiple addresses in daily Transfer stats', async () => {
51-
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 50, blockNumber: 1 })
52-
await updateDailyTransferStats(pgPool, { to_address: 'address2', amount: 150, blockNumber: 1 })
51+
await updateDailyTransferStats(pgPool, { to_address: 'address1', amount: 50 }, 1)
52+
await updateDailyTransferStats(pgPool, { to_address: 'address2', amount: 150 }, 1)
5353

5454
const { rows } = await pgPool.query(`
55-
SELECT day::TEXT, to_address, amount FROM daily_reward_transfers
55+
SELECT day::TEXT, to_address, amount, last_checked_block FROM daily_reward_transfers
5656
ORDER BY to_address
5757
`)
5858
assert.strictEqual(rows.length, 2)
5959

6060
assert.deepStrictEqual(rows, [
61-
{ day: today, to_address: 'address1', amount: '50' },
62-
{ day: today, to_address: 'address2', amount: '150' }
61+
{ day: today, to_address: 'address1', amount: '50', last_checked_block: 1 },
62+
{ day: today, to_address: 'address2', amount: '150', last_checked_block: 1 }
6363
])
6464
})
6565
})

stats/test/platform-routes.test.js

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -163,17 +163,17 @@ describe('Platform Routes HTTP request handler', () => {
163163
describe('GET /transfers/daily', () => {
164164
it('returns daily total Rewards sent for the given date range', async () => {
165165
await givenDailyRewardTransferMetrics(pgPoolStatsDb, '2024-01-10', [
166-
{ to_address: 'to1', amount: 100 }
166+
{ to_address: 'to1', amount: 100, last_checked_block: 1 }
167167
])
168168
await givenDailyRewardTransferMetrics(pgPoolStatsDb, '2024-01-11', [
169-
{ to_address: 'to2', amount: 150 }
169+
{ to_address: 'to2', amount: 150, last_checked_block: 1 }
170170
])
171171
await givenDailyRewardTransferMetrics(pgPoolStatsDb, '2024-01-12', [
172-
{ to_address: 'to2', amount: 300 },
173-
{ to_address: 'to3', amount: 250 }
172+
{ to_address: 'to2', amount: 300, last_checked_block: 1 },
173+
{ to_address: 'to3', amount: 250, last_checked_block: 1 }
174174
])
175175
await givenDailyRewardTransferMetrics(pgPoolStatsDb, '2024-01-13', [
176-
{ to_address: 'to1', amount: 100 }
176+
{ to_address: 'to1', amount: 100, last_checked_block: 1 }
177177
])
178178

179179
const res = await fetch(
@@ -208,12 +208,13 @@ const givenDailyStationMetrics = async (pgPoolEvaluateDb, day, stationStats) =>
208208

209209
const givenDailyRewardTransferMetrics = async (pgPoolStatsDb, day, transferStats) => {
210210
await pgPoolStatsDb.query(`
211-
INSERT INTO daily_reward_transfers (day, to_address, amount)
212-
SELECT $1 AS day, UNNEST($2::text[]) AS to_address, UNNEST($3::int[]) AS amount
211+
INSERT INTO daily_reward_transfers (day, to_address, amount, last_checked_block)
212+
SELECT $1 AS day, UNNEST($2::text[]) AS to_address, UNNEST($3::int[]) AS amount, UNNEST($4::int[]) AS last_checked_block
213213
ON CONFLICT DO NOTHING
214214
`, [
215215
day,
216216
transferStats.map(s => s.to_address),
217-
transferStats.map(s => s.amount)
217+
transferStats.map(s => s.amount),
218+
transferStats.map(s => s.last_checked_block)
218219
])
219220
}

0 commit comments

Comments
 (0)