@stake-dao/reader 0.4.33 → 0.4.35
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/esm/bytecodes/ccipGas.js +11 -0
- package/dist/esm/bytecodes/ccipGas.js.map +1 -0
- package/dist/esm/bytecodes/votemarket/batchCampaigns.js +1 -1
- package/dist/esm/bytecodes/votemarket/batchCampaigns.js.map +1 -1
- package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js +33 -0
- package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js.map +1 -0
- package/dist/esm/bytecodes/votemarket/batchClaimableData.js +1 -1
- package/dist/esm/bytecodes/votemarket/batchClaimableData.js.map +1 -1
- package/dist/esm/ccip/fetchCcipFee.js +1 -1
- package/dist/esm/ccip/fetchCcipFee.js.map +1 -1
- package/dist/esm/ccip/fetchCcipGas.js +37 -0
- package/dist/esm/ccip/fetchCcipGas.js.map +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +2 -2
- package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
- package/dist/esm/strategies/pendle/fetch.js +6 -5
- package/dist/esm/strategies/pendle/fetch.js.map +1 -1
- package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
- package/dist/esm/utils.js +30 -2
- package/dist/esm/utils.js.map +1 -1
- package/dist/esm/votemarket/fetchCampaigns.js +78 -24
- package/dist/esm/votemarket/fetchCampaigns.js.map +1 -1
- package/dist/esm/votemarket/fetchPendingRemoteCampaigns.js +102 -0
- package/dist/esm/votemarket/fetchPendingRemoteCampaigns.js.map +1 -0
- package/dist/types/bytecodes/ccipGas.d.ts +4 -0
- package/dist/types/bytecodes/ccipGas.d.ts.map +1 -0
- package/dist/types/bytecodes/votemarket/batchCampaignsRestrictedVotes.d.ts +4 -0
- package/dist/types/bytecodes/votemarket/batchCampaignsRestrictedVotes.d.ts.map +1 -0
- package/dist/types/ccip/fetchCcipFee.d.ts +1 -1
- package/dist/types/ccip/fetchCcipGas.d.ts +22 -0
- package/dist/types/ccip/fetchCcipGas.d.ts.map +1 -0
- package/dist/types/index.d.ts +3 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/strategies/pendle/fetch.d.ts.map +1 -1
- package/dist/types/utils.d.ts +3 -0
- package/dist/types/utils.d.ts.map +1 -1
- package/dist/types/votemarket/fetchCampaigns.d.ts +5 -1
- package/dist/types/votemarket/fetchCampaigns.d.ts.map +1 -1
- package/dist/types/votemarket/fetchPendingRemoteCampaigns.d.ts +46 -0
- package/dist/types/votemarket/fetchPendingRemoteCampaigns.d.ts.map +1 -0
- package/dist/types/votemarket/types.d.ts +2 -0
- package/dist/types/votemarket/types.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/bytecodes/ccipGas.ts +14 -0
- package/src/bytecodes/votemarket/batchCampaigns.ts +1 -1
- package/src/bytecodes/votemarket/batchCampaignsRestrictedVotes.ts +35 -0
- package/src/bytecodes/votemarket/batchClaimableData.ts +1 -1
- package/src/ccip/fetchCcipFee.ts +2 -2
- package/src/ccip/fetchCcipGas.ts +68 -0
- package/src/index.ts +3 -1
- package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +2 -2
- package/src/strategies/pendle/fetch.ts +7 -5
- package/src/utils.ts +41 -2
- package/src/votemarket/fetchCampaigns.ts +115 -26
- package/src/votemarket/fetchPendingRemoteCampaigns.ts +141 -0
- package/src/votemarket/types.ts +2 -0
|
@@ -1,12 +1,21 @@
|
|
|
1
|
-
import { ONE_WEEK,
|
|
2
|
-
import { filter, range, remove, uniq } from 'lodash-es'
|
|
3
|
-
import {
|
|
4
|
-
|
|
1
|
+
import { ONE_WEEK, Zero, contract, contracts, tokenWithAddress, tokens } from '@stake-dao/constants'
|
|
2
|
+
import { chunk, filter, range, remove, uniq } from 'lodash-es'
|
|
3
|
+
import {
|
|
4
|
+
decodeAbiParameters,
|
|
5
|
+
encodeAbiParameters,
|
|
6
|
+
formatEther,
|
|
7
|
+
formatUnits,
|
|
8
|
+
parseAbiParameters,
|
|
9
|
+
zeroAddress,
|
|
10
|
+
} from 'viem'
|
|
11
|
+
import { arbitrum, mainnet } from 'viem/chains'
|
|
5
12
|
import batchCampaigns from '../bytecodes/votemarket/batchCampaigns.js'
|
|
13
|
+
import batchCampaignsRestrictedVotes from '../bytecodes/votemarket/batchCampaignsRestrictedVotes.js'
|
|
6
14
|
import batchGaugesWeight from '../bytecodes/votemarket/batchGaugesWeight.js'
|
|
7
15
|
import { getPrices } from '../prices.js'
|
|
8
16
|
import { rpcFetchTokensData } from '../tokens.js'
|
|
9
17
|
import { batchJsonRpc, concatBytecode, equalTlc, rpcCall, rpcGetLastBlockTimetstamp } from '../utils.js'
|
|
18
|
+
import { fetchPendingRemoteCampaigns } from './fetchPendingRemoteCampaigns.js'
|
|
10
19
|
import type { Campaign, RawCampaign, RawPeriod } from './types.js'
|
|
11
20
|
|
|
12
21
|
export const CAMPAIGNS_CHUNK_SIZE = 10
|
|
@@ -15,8 +24,12 @@ export const CLOSE_WINDOW_LENGTH = 4 // weeks
|
|
|
15
24
|
|
|
16
25
|
interface FetchCampaignsProps {
|
|
17
26
|
platform: string
|
|
27
|
+
gaugeController: string
|
|
18
28
|
chainId: number
|
|
19
29
|
rpcs: { [chainId: number]: string }
|
|
30
|
+
etherscanApiKey?: string
|
|
31
|
+
fromBlock?: number
|
|
32
|
+
mainnetVmRemote?: string
|
|
20
33
|
}
|
|
21
34
|
|
|
22
35
|
const updateEpoch = ({
|
|
@@ -79,7 +92,22 @@ const updateEpoch = ({
|
|
|
79
92
|
return campaign
|
|
80
93
|
}
|
|
81
94
|
|
|
82
|
-
|
|
95
|
+
const formatPeriod = (rawPeriod: any, decimals: number) => ({
|
|
96
|
+
rewardPerPeriod: formatUnits(rawPeriod.rewardPerPeriod, decimals),
|
|
97
|
+
rewardPerVote: formatUnits(rawPeriod.rewardPerVote, decimals),
|
|
98
|
+
leftover: formatUnits(rawPeriod.leftover, decimals),
|
|
99
|
+
updated: rawPeriod.updated,
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
export const fetchCampaigns = async ({
|
|
103
|
+
platform,
|
|
104
|
+
gaugeController,
|
|
105
|
+
chainId,
|
|
106
|
+
rpcs,
|
|
107
|
+
etherscanApiKey,
|
|
108
|
+
fromBlock,
|
|
109
|
+
mainnetVmRemote,
|
|
110
|
+
}: FetchCampaignsProps): Promise<Campaign[]> => {
|
|
83
111
|
const rpc = rpcs[chainId]!
|
|
84
112
|
|
|
85
113
|
const block = await rpcGetLastBlockTimetstamp(rpc)
|
|
@@ -101,7 +129,7 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
101
129
|
return concatBytecode(batchCampaigns.bytecode[1]!, inputData)
|
|
102
130
|
})
|
|
103
131
|
|
|
104
|
-
|
|
132
|
+
let rawCampaigns = await batchJsonRpc({
|
|
105
133
|
rpc,
|
|
106
134
|
calls,
|
|
107
135
|
outputTypeAbi: batchCampaigns.outputType![1]!,
|
|
@@ -109,9 +137,64 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
109
137
|
callsKey: `votemarket/fetchCampaigns.ts: rawCampaigns - chainId ${chainId} - rpc ${rpc}`,
|
|
110
138
|
})
|
|
111
139
|
|
|
140
|
+
if (chainId === arbitrum.id && etherscanApiKey && fromBlock && mainnetVmRemote) {
|
|
141
|
+
const nextIndex = rawCampaigns.length > 0 ? Math.max(...rawCampaigns.map((rc) => Number(rc.id))) + 1 : 0
|
|
142
|
+
const { remoteCampaigns: pendingRemoteCampaigns } = await fetchPendingRemoteCampaigns({
|
|
143
|
+
mainnetVmRemote,
|
|
144
|
+
chainId,
|
|
145
|
+
fromBlock,
|
|
146
|
+
etherscanApiKey,
|
|
147
|
+
nextIndex,
|
|
148
|
+
})
|
|
149
|
+
|
|
150
|
+
rawCampaigns = [
|
|
151
|
+
...rawCampaigns,
|
|
152
|
+
...pendingRemoteCampaigns.filter((rmtC) => {
|
|
153
|
+
const existingCampaign = rawCampaigns.find(
|
|
154
|
+
(rc) =>
|
|
155
|
+
rc.addresses.length === rmtC.addresses.length &&
|
|
156
|
+
rc.addresses.every((rca, index) => equalTlc(rca, rmtC.addresses[index])) &&
|
|
157
|
+
equalTlc(rc.rewardAddress, rmtC.rewardAddress) &&
|
|
158
|
+
rc.rewardChainId === rmtC.rewardChainId &&
|
|
159
|
+
rc.campaign.startTimestamp === rmtC.campaign.startTimestamp &&
|
|
160
|
+
rc.campaign.endTimestamp === rmtC.campaign.endTimestamp &&
|
|
161
|
+
rc.campaign.numberOfPeriods === rmtC.campaign.numberOfPeriods &&
|
|
162
|
+
rc.campaign.maxRewardPerVote === rmtC.campaign.maxRewardPerVote &&
|
|
163
|
+
rc.campaign.totalRewardAmount === rmtC.campaign.totalRewardAmount &&
|
|
164
|
+
equalTlc(rc.campaign.gauge, rmtC.campaign.gauge) &&
|
|
165
|
+
equalTlc(rc.campaign.hook, rmtC.campaign.hook) &&
|
|
166
|
+
equalTlc(rc.campaign.manager, rmtC.campaign.manager),
|
|
167
|
+
)
|
|
168
|
+
|
|
169
|
+
return typeof existingCampaign === 'undefined'
|
|
170
|
+
}),
|
|
171
|
+
]
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const callsRestrictedVotes = rawCampaigns
|
|
175
|
+
.filter((rc) => rc.addresses.length > 0)
|
|
176
|
+
.map((rc) => [rc.campaign.chainId, rc.id, rc.campaign.gauge, rc.addresses])
|
|
177
|
+
const callsRestrictedVotesChunks = chunk(callsRestrictedVotes, CAMPAIGNS_CHUNK_SIZE).map((restrictedVoteChunk) => {
|
|
178
|
+
const inputData = encodeAbiParameters(parseAbiParameters(batchCampaignsRestrictedVotes.inputType[1]!) as any, [
|
|
179
|
+
gaugeController,
|
|
180
|
+
restrictedVoteChunk,
|
|
181
|
+
])
|
|
182
|
+
return concatBytecode(batchCampaignsRestrictedVotes.bytecode[1]!, inputData)
|
|
183
|
+
})
|
|
184
|
+
|
|
185
|
+
const rawCampaignsRestrictedVotes = await batchJsonRpc({
|
|
186
|
+
rpc: rpcs[mainnet.id]!,
|
|
187
|
+
calls: callsRestrictedVotesChunks,
|
|
188
|
+
outputTypeAbi: batchCampaignsRestrictedVotes.outputType![1]!,
|
|
189
|
+
parse: false,
|
|
190
|
+
callsKey: `votemarket/fetchCampaigns.ts: rawCampaignsRestrictedVotes - chainId ${mainnet.id} - rpc ${rpcs[
|
|
191
|
+
mainnet.id
|
|
192
|
+
]!}`,
|
|
193
|
+
})
|
|
194
|
+
|
|
112
195
|
const campaignsGauges: string[] = uniq(rawCampaigns.map((rc) => rc.campaign.gauge))
|
|
113
196
|
const rawGaugesWeights = await batchJsonRpc({
|
|
114
|
-
rpc:
|
|
197
|
+
rpc: rpcs[mainnet.id]!,
|
|
115
198
|
calls: [
|
|
116
199
|
concatBytecode(
|
|
117
200
|
batchGaugesWeight.bytecode[mainnet.id]!,
|
|
@@ -122,10 +205,12 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
122
205
|
),
|
|
123
206
|
],
|
|
124
207
|
outputTypeAbi: batchGaugesWeight.outputTypeHr[mainnet.id]!,
|
|
125
|
-
callsKey: `votemarket/fetchCampaigns.ts: rawGaugesWeights - chainId ${mainnet.id} - rpc ${
|
|
208
|
+
callsKey: `votemarket/fetchCampaigns.ts: rawGaugesWeights - chainId ${mainnet.id} - rpc ${rpcs[mainnet.id]!}`,
|
|
126
209
|
})
|
|
127
210
|
|
|
128
|
-
const campaignsTokens: string[] = uniq(
|
|
211
|
+
const campaignsTokens: string[] = uniq(
|
|
212
|
+
rawCampaigns.map((rc) => (!rc.isPendingRemote ? rc.campaign.rewardToken : undefined)).filter(Boolean),
|
|
213
|
+
)
|
|
129
214
|
const tokensToFetch: string[] = remove(campaignsTokens, (t) => !tokenWithAddress(t, chainId))
|
|
130
215
|
const rawTokensData: any[] = tokensToFetch.length > 0 ? await rpcFetchTokensData(chainId, rpc, tokensToFetch) : []
|
|
131
216
|
|
|
@@ -165,6 +250,7 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
165
250
|
// { address: '0x0Cc20784f790805537D4eE33B41f1aC4eC55446B', symbol: 'USDC', usdPrice: 1 }, // For test purpose
|
|
166
251
|
// { address: '0x59c9a01163e685719FAbE5De34779F563f49D4a3', symbol: 'CRV', usdPrice: 30 }, // For test purpose
|
|
167
252
|
// { address: '0x3c7b193aa39a85FDE911465d35CE3A74499F0A7B', symbol: 'ARR', usdPrice: 10 }, // For test purpose
|
|
253
|
+
//{ address: '0xd9879d9dbdc5042d8f1c2710be293909b985dc90', symbol: 'rEYWA', usdPrice: 0.14 }, // tmp rEYWA price
|
|
168
254
|
]
|
|
169
255
|
|
|
170
256
|
const allFetchedTokens = [...fetchedTokens, ...nativeFetchedTokens]
|
|
@@ -173,17 +259,26 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
173
259
|
|
|
174
260
|
const campaigns = rawCampaigns.map((rc) => {
|
|
175
261
|
const gaugeWeightData = rawGaugesWeights.find((g) => equalTlc(g.gauge, rc.campaign.gauge))
|
|
176
|
-
|
|
177
|
-
let receiptRewardToken = undefined
|
|
262
|
+
let receiptRewardToken: any = undefined
|
|
178
263
|
let rewardToken = allFetchedTokens.find(
|
|
179
264
|
(t) => equalTlc(t.address, rc.campaign.rewardToken) && t.chainId === chainId,
|
|
180
265
|
)
|
|
181
266
|
|
|
182
|
-
if (!equalTlc(rewardToken.address, rc.rewardAddress)) {
|
|
267
|
+
if (rc.isPendingRemote || !equalTlc(rewardToken.address, rc.rewardAddress)) {
|
|
183
268
|
receiptRewardToken = rewardToken
|
|
184
269
|
rewardToken = allFetchedTokens.find(
|
|
185
270
|
(t) => equalTlc(t.address, rc.rewardAddress) && t.chainId === Number(rc.rewardChainId),
|
|
186
271
|
)
|
|
272
|
+
|
|
273
|
+
if (rc.isPendingRemote) {
|
|
274
|
+
receiptRewardToken = {
|
|
275
|
+
name: `LaPoste ${rewardToken.name}`,
|
|
276
|
+
symbol: `p${rewardToken.symbol}`,
|
|
277
|
+
address: undefined,
|
|
278
|
+
decimals: rewardToken.decimals,
|
|
279
|
+
chainId,
|
|
280
|
+
}
|
|
281
|
+
}
|
|
187
282
|
}
|
|
188
283
|
|
|
189
284
|
const decimals = rewardToken ? rewardToken.decimals : 18
|
|
@@ -215,6 +310,10 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
215
310
|
const rawCurrentPeriod = rc.periods[indexOfCurrentPeriod]
|
|
216
311
|
const rawPreviousPeriod = rc.periods[indexOfCurrentPeriod - 1]
|
|
217
312
|
|
|
313
|
+
const restrictedVotesData = rawCampaignsRestrictedVotes.find(
|
|
314
|
+
(rvc) => rvc.chainId === rc.campaign.chainId && rvc.campaignId === rc.id && rvc.gauge === rc.campaign.gauge,
|
|
315
|
+
)
|
|
316
|
+
|
|
218
317
|
return {
|
|
219
318
|
id: Number(rc.id),
|
|
220
319
|
chainId,
|
|
@@ -234,23 +333,13 @@ export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaigns
|
|
|
234
333
|
endTimestamp,
|
|
235
334
|
hook: rc.campaign.hook,
|
|
236
335
|
isClosed: rc.isClosed,
|
|
336
|
+
restrictedVotes: formatEther(restrictedVotesData?.restrictedVotes || Zero),
|
|
237
337
|
addresses: rc.addresses,
|
|
238
338
|
isWhitelist: rc.isWhitelistOnly,
|
|
239
339
|
isBlacklist: !rc.isWhitelistOnly && rc.addresses.length > 0,
|
|
240
|
-
previousPeriod: rawPreviousPeriod
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
rewardPerVote: formatUnits(rawPreviousPeriod.rewardPerVote, decimals),
|
|
244
|
-
leftover: formatUnits(rawPreviousPeriod.leftover, decimals),
|
|
245
|
-
updated: rawPreviousPeriod.updated,
|
|
246
|
-
}
|
|
247
|
-
: undefined,
|
|
248
|
-
currentPeriod: {
|
|
249
|
-
rewardPerPeriod: formatUnits(rawCurrentPeriod.rewardPerPeriod, decimals),
|
|
250
|
-
rewardPerVote: formatUnits(rawCurrentPeriod.rewardPerVote, decimals),
|
|
251
|
-
leftover: formatUnits(rawCurrentPeriod.leftover, decimals),
|
|
252
|
-
updated: rawCurrentPeriod.updated,
|
|
253
|
-
},
|
|
340
|
+
previousPeriod: rawPreviousPeriod ? formatPeriod(rawPreviousPeriod, decimals) : undefined,
|
|
341
|
+
currentPeriod: formatPeriod(rawCurrentPeriod, decimals),
|
|
342
|
+
periods: rc.periods.map((rawP) => formatPeriod(rawP, decimals)),
|
|
254
343
|
status: {
|
|
255
344
|
voteOpen: endTimestamp - ONE_WEEK > currentTimestamp,
|
|
256
345
|
voteClosed: currentTimestamp > endTimestamp - ONE_WEEK,
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { LA_POSTE_MESSAGE_SENT_EVENT, ONE_WEEK, One, Zero, contract } from '@stake-dao/constants'
|
|
2
|
+
import { range } from 'lodash-es'
|
|
3
|
+
import { decodeAbiParameters, decodeEventLog, parseAbiParameters, zeroAddress } from 'viem'
|
|
4
|
+
import { mainnet } from 'viem/chains'
|
|
5
|
+
|
|
6
|
+
export const CAMPAIGNS_CHUNK_SIZE = 10
|
|
7
|
+
export const CLAIM_WINDOW_LENGTH = 24 // weeks
|
|
8
|
+
export const CLOSE_WINDOW_LENGTH = 4 // weeks
|
|
9
|
+
|
|
10
|
+
interface FetchPendingRemoteCampaignsProps {
|
|
11
|
+
mainnetVmRemote: string
|
|
12
|
+
chainId: number
|
|
13
|
+
fromBlock: number
|
|
14
|
+
etherscanApiKey: string
|
|
15
|
+
nextIndex: number
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export const fetchPendingRemoteCampaigns = async ({
|
|
19
|
+
mainnetVmRemote,
|
|
20
|
+
chainId,
|
|
21
|
+
fromBlock,
|
|
22
|
+
etherscanApiKey,
|
|
23
|
+
nextIndex,
|
|
24
|
+
}: FetchPendingRemoteCampaignsProps) => {
|
|
25
|
+
const queryParams = {
|
|
26
|
+
chainid: `${mainnet.id}`,
|
|
27
|
+
module: 'logs',
|
|
28
|
+
action: 'getLogs',
|
|
29
|
+
address: contract('laPoste', chainId),
|
|
30
|
+
topic0: LA_POSTE_MESSAGE_SENT_EVENT.topic,
|
|
31
|
+
topic0_3_opr: 'and',
|
|
32
|
+
topic3: mainnetVmRemote.replace('0x', '0x000000000000000000000000'),
|
|
33
|
+
apikey: etherscanApiKey,
|
|
34
|
+
fromBlock: `${fromBlock}`,
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const rawEvents = await fetch(`https://api.etherscan.io/v2/api?${new URLSearchParams(queryParams)}`).then((res) =>
|
|
38
|
+
res.json(),
|
|
39
|
+
)
|
|
40
|
+
|
|
41
|
+
const campaignsParams: any[] = []
|
|
42
|
+
const manageParams: any[] = []
|
|
43
|
+
|
|
44
|
+
if (rawEvents.message === 'OK') {
|
|
45
|
+
for (const e of rawEvents.result) {
|
|
46
|
+
const decodedEvent: any = decodeEventLog({
|
|
47
|
+
abi: LA_POSTE_MESSAGE_SENT_EVENT.abi,
|
|
48
|
+
data: e.data,
|
|
49
|
+
topics: e.topics,
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
try {
|
|
53
|
+
if (Number(decodedEvent.args.chainId) === chainId) {
|
|
54
|
+
const payload = decodeAbiParameters(
|
|
55
|
+
parseAbiParameters([
|
|
56
|
+
'Payload payload',
|
|
57
|
+
'struct Payload { uint256 actionType; address sender; bytes parameters }',
|
|
58
|
+
]),
|
|
59
|
+
decodedEvent.args.message.payload,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
// Create Campaign (actionType === 0)
|
|
63
|
+
if (payload[0].actionType === Zero) {
|
|
64
|
+
const decodedParams = decodeAbiParameters(
|
|
65
|
+
parseAbiParameters([
|
|
66
|
+
'CampaignCreationParams params',
|
|
67
|
+
'struct CampaignCreationParams { uint256 chainId; address gauge; address manager; address rewardToken; uint8 numberOfPeriods; uint256 maxRewardPerVote; uint256 totalRewardAmount; address[] addresses; address hook; bool isWhitelist; }',
|
|
68
|
+
]),
|
|
69
|
+
(payload[0] as any).parameters,
|
|
70
|
+
)
|
|
71
|
+
|
|
72
|
+
campaignsParams.push({ decoded: decodedParams[0], eventTimestamp: Number(e.timeStamp) })
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Manage Campaign (actionType === 1)
|
|
76
|
+
if (payload[0].actionType === One) {
|
|
77
|
+
const decodedParams = decodeAbiParameters(
|
|
78
|
+
parseAbiParameters([
|
|
79
|
+
'CampaignManagementParams params',
|
|
80
|
+
'struct CampaignManagementParams { uint256 campaignId; address rewardToken; uint8 numberOfPeriods; uint256 totalRewardAmount; uint256 maxRewardPerVote; }',
|
|
81
|
+
]),
|
|
82
|
+
(payload[0] as any).parameters,
|
|
83
|
+
)
|
|
84
|
+
|
|
85
|
+
manageParams.push({ decoded: decodedParams[0], eventTimestamp: Number(e.timeStamp) })
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
} catch (err) {
|
|
89
|
+
console.error(err)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const remoteCampaigns = campaignsParams.map((element) => {
|
|
95
|
+
const campaignParams = element.decoded
|
|
96
|
+
|
|
97
|
+
const totalRewardAmount = campaignParams.totalRewardAmount
|
|
98
|
+
const maxRewardPerVote = campaignParams.maxRewardPerVote
|
|
99
|
+
const numberOfPeriods = BigInt(campaignParams.numberOfPeriods)
|
|
100
|
+
|
|
101
|
+
const startTimestamp = BigInt(Math.floor(element.eventTimestamp / ONE_WEEK) * ONE_WEEK + ONE_WEEK)
|
|
102
|
+
const endTimestamp = startTimestamp + numberOfPeriods * BigInt(ONE_WEEK)
|
|
103
|
+
|
|
104
|
+
const campaign = {
|
|
105
|
+
isPendingRemote: true,
|
|
106
|
+
id: BigInt(nextIndex),
|
|
107
|
+
addresses: campaignParams.addresses,
|
|
108
|
+
campaign: {
|
|
109
|
+
chainId: campaignParams.chainId,
|
|
110
|
+
startTimestamp,
|
|
111
|
+
endTimestamp,
|
|
112
|
+
gauge: campaignParams.gauge,
|
|
113
|
+
hook: campaignParams.hook,
|
|
114
|
+
manager: campaignParams.manager,
|
|
115
|
+
maxRewardPerVote,
|
|
116
|
+
numberOfPeriods: Number(numberOfPeriods),
|
|
117
|
+
rewardToken: zeroAddress, // Unknown
|
|
118
|
+
totalDistributed: Zero,
|
|
119
|
+
totalRewardAmount,
|
|
120
|
+
},
|
|
121
|
+
isKilled: false,
|
|
122
|
+
isWhitelistOnly: campaignParams.isWhitelist,
|
|
123
|
+
periodLeft: campaignParams.numberOfPeriods,
|
|
124
|
+
periods: range(0, Number(numberOfPeriods)).map((index) => ({
|
|
125
|
+
timestampStart: startTimestamp + BigInt(index) * BigInt(ONE_WEEK),
|
|
126
|
+
timestampEnd: startTimestamp + BigInt(ONE_WEEK) + BigInt(index) * BigInt(ONE_WEEK),
|
|
127
|
+
rewardPerPeriod: totalRewardAmount / numberOfPeriods,
|
|
128
|
+
rewardPerVote: maxRewardPerVote,
|
|
129
|
+
leftover: Zero,
|
|
130
|
+
updated: false,
|
|
131
|
+
})),
|
|
132
|
+
rewardAddress: campaignParams.rewardToken,
|
|
133
|
+
rewardChainId: BigInt(mainnet.id),
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
nextIndex++
|
|
137
|
+
return campaign
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
return { remoteCampaigns, remoteCampaignsUpdate: manageParams }
|
|
141
|
+
}
|
package/src/votemarket/types.ts
CHANGED
|
@@ -11,6 +11,7 @@ export type Campaign = {
|
|
|
11
11
|
gauge: string
|
|
12
12
|
gaugeChainId: number
|
|
13
13
|
manager: string
|
|
14
|
+
restrictedVotes: string
|
|
14
15
|
rewardChainId: number
|
|
15
16
|
receiptRewardToken: {
|
|
16
17
|
name: string
|
|
@@ -41,6 +42,7 @@ export type Campaign = {
|
|
|
41
42
|
previousPeriod: Period
|
|
42
43
|
currentPeriod: Period
|
|
43
44
|
periodLeft: number
|
|
45
|
+
periods: Period[]
|
|
44
46
|
status: {
|
|
45
47
|
voteOpen: boolean
|
|
46
48
|
voteClosed: boolean
|