Skip to content

Commit 1945ce1

Browse files
committed
pool booster wip
1 parent 0b84a7b commit 1945ce1

File tree

6 files changed

+108
-12
lines changed

6 files changed

+108
-12
lines changed

db/migrations/1739244714499-Data.js renamed to db/migrations/1739297862213-Data.js

+12-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

schema.graphql

+12
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,18 @@ type PoolBoosterFeeCollected @entity {
361361
feeAmount: BigInt!
362362
txHash: String!
363363
}
364+
365+
type PoolBoosterTokensRescued @entity {
366+
id: ID! @index
367+
chainId: Int! @index
368+
address: String! @index
369+
timestamp: DateTime! @index
370+
blockNumber: Int! @index
371+
token: String!
372+
amount: BigInt!
373+
receiver: String!
374+
txHash: String!
375+
}
364376
type OToken @entity {
365377
id: ID! @index
366378
chainId: Int! @index

src/model/generated/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export * from "./bridgeTransferState.model"
3232
export * from "./transactionDetails.model"
3333
export * from "./poolBoosterCampaign.model"
3434
export * from "./poolBoosterFeeCollected.model"
35+
export * from "./poolBoosterTokensRescued.model"
3536
export * from "./oToken.model"
3637
export * from "./woToken.model"
3738
export * from "./oTokenAsset.model"
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import {Entity as Entity_, Column as Column_, PrimaryColumn as PrimaryColumn_, IntColumn as IntColumn_, Index as Index_, StringColumn as StringColumn_, DateTimeColumn as DateTimeColumn_, BigIntColumn as BigIntColumn_} from "@subsquid/typeorm-store"
2+
3+
@Entity_()
4+
export class PoolBoosterTokensRescued {
5+
constructor(props?: Partial<PoolBoosterTokensRescued>) {
6+
Object.assign(this, props)
7+
}
8+
9+
@PrimaryColumn_()
10+
id!: string
11+
12+
@Index_()
13+
@IntColumn_({nullable: false})
14+
chainId!: number
15+
16+
@Index_()
17+
@StringColumn_({nullable: false})
18+
address!: string
19+
20+
@Index_()
21+
@DateTimeColumn_({nullable: false})
22+
timestamp!: Date
23+
24+
@Index_()
25+
@IntColumn_({nullable: false})
26+
blockNumber!: number
27+
28+
@StringColumn_({nullable: false})
29+
token!: string
30+
31+
@BigIntColumn_({nullable: false})
32+
amount!: bigint
33+
34+
@StringColumn_({nullable: false})
35+
receiver!: string
36+
37+
@StringColumn_({nullable: false})
38+
txHash!: string
39+
}

src/templates/otoken/curve-pool-booster.graphql

+12
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,15 @@ type PoolBoosterFeeCollected @entity {
2020
feeAmount: BigInt!
2121
txHash: String!
2222
}
23+
24+
type PoolBoosterTokensRescued @entity {
25+
id: ID! @index
26+
chainId: Int! @index
27+
address: String! @index
28+
timestamp: DateTime! @index
29+
blockNumber: Int! @index
30+
token: String!
31+
amount: BigInt!
32+
receiver: String!
33+
txHash: String!
34+
}

src/templates/otoken/curve-pool-booster.ts

+32-10
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import * as curvePoolBoosterAbi from '@abi/otoken-curve-pool-booster'
2-
import { PoolBoosterCampaign, PoolBoosterFeeCollected } from '@model'
2+
import { PoolBoosterCampaign, PoolBoosterFeeCollected, PoolBoosterTokensRescued } from '@model'
33
import { Context, blockFrequencyUpdater, defineProcessor, logFilter } from '@originprotocol/squid-utils'
44
import { EvmBatchProcessor } from '@subsquid/evm-processor'
55

66
export const createCurvePoolBoosterProcessor = (params: { otokenAddress: string; from: number }) => {
77
const frequencyUpdate = blockFrequencyUpdater({ from: params.from })
88

9-
const bribeCreatedFilter = logFilter({
9+
const feeCollectedFilter = logFilter({
1010
topic0: [curvePoolBoosterAbi.events.FeeCollected.topic],
1111
range: { from: params.from },
1212
})
@@ -22,18 +22,28 @@ export const createCurvePoolBoosterProcessor = (params: { otokenAddress: string;
2222
topic0: [curvePoolBoosterAbi.events.CampaignClosed.topic],
2323
range: { from: params.from },
2424
})
25+
const tokensRescuedFilter = logFilter({
26+
topic0: [curvePoolBoosterAbi.events.TokensRescued.topic],
27+
range: { from: params.from },
28+
})
2529

2630
return defineProcessor({
2731
name: `curve-pool-booster`,
2832
setup: (processor: EvmBatchProcessor) => {
29-
processor.addLog(bribeCreatedFilter.value)
33+
processor.addLog(campaignCreatedFilter.value)
34+
processor.addLog(campaignIdUpdatedFilter.value)
35+
processor.addLog(campaignClosedFilter.value)
36+
processor.addLog(feeCollectedFilter.value)
37+
processor.addLog(tokensRescuedFilter.value)
3038
},
3139
process: async (ctx: Context) => {
3240
const campaigns = new Map<string, PoolBoosterCampaign>()
3341
const feesCollected = new Map<string, PoolBoosterFeeCollected>()
42+
const tokensRescued = new Map<string, PoolBoosterTokensRescued>()
3443

3544
for (const block of ctx.blocksWithContent) {
3645
for (const log of block.logs) {
46+
// TODO: Validate campaign feeCollector is in our whitelist.
3747
if (campaignCreatedFilter.matches(log)) {
3848
const data = curvePoolBoosterAbi.events.CampaignCreated.decode(log)
3949
const id = `${ctx.chain.id}-${log.address}`
@@ -47,23 +57,20 @@ export const createCurvePoolBoosterProcessor = (params: { otokenAddress: string;
4757
totalRewardAmount: data.totalRewardAmount,
4858
})
4959
campaigns.set(id, campaign)
50-
}
51-
if (campaignIdUpdatedFilter.matches(log)) {
60+
} else if (campaignIdUpdatedFilter.matches(log)) {
5261
const data = curvePoolBoosterAbi.events.CampaignIdUpdated.decode(log)
5362
const id = `${ctx.chain.id}-${log.address}`
5463
let campaign = campaigns.get(id) || (await ctx.store.get(PoolBoosterCampaign, id))
5564
if (campaign) {
5665
campaign.campaignId = data.newId
5766
}
58-
}
59-
if (campaignClosedFilter.matches(log)) {
67+
} else if (campaignClosedFilter.matches(log)) {
6068
const id = `${ctx.chain.id}-${log.address}`
6169
let campaign = campaigns.get(id) || (await ctx.store.get(PoolBoosterCampaign, id))
6270
if (campaign) {
6371
campaign.closed = true
6472
}
65-
}
66-
if (bribeCreatedFilter.matches(log)) {
73+
} else if (feeCollectedFilter.matches(log)) {
6774
const data = curvePoolBoosterAbi.events.FeeCollected.decode(log)
6875
const feeCollected = new PoolBoosterFeeCollected({
6976
id: `${ctx.chain.id}-${log.id}`,
@@ -76,11 +83,26 @@ export const createCurvePoolBoosterProcessor = (params: { otokenAddress: string;
7683
txHash: log.transactionHash,
7784
})
7885
feesCollected.set(feeCollected.id, feeCollected)
86+
} else if (tokensRescuedFilter.matches(log)) {
87+
const data = curvePoolBoosterAbi.events.TokensRescued.decode(log)
88+
const tokensRescuedEvent = new PoolBoosterTokensRescued({
89+
id: `${ctx.chain.id}-${log.id}`,
90+
chainId: ctx.chain.id,
91+
address: log.address,
92+
token: data.token,
93+
amount: data.amount,
94+
receiver: data.receiver,
95+
timestamp: new Date(block.header.timestamp),
96+
blockNumber: block.header.height,
97+
txHash: log.transactionHash,
98+
})
99+
tokensRescued.set(tokensRescuedEvent.id, tokensRescuedEvent)
79100
}
80101
}
81102
}
82-
await ctx.store.insert([...campaigns.values()])
103+
await ctx.store.upsert([...campaigns.values()])
83104
await ctx.store.insert([...feesCollected.values()])
105+
await ctx.store.insert([...tokensRescued.values()])
84106
},
85107
})
86108
}

0 commit comments

Comments
 (0)