@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.
Files changed (57) hide show
  1. package/dist/esm/bytecodes/ccipGas.js +11 -0
  2. package/dist/esm/bytecodes/ccipGas.js.map +1 -0
  3. package/dist/esm/bytecodes/votemarket/batchCampaigns.js +1 -1
  4. package/dist/esm/bytecodes/votemarket/batchCampaigns.js.map +1 -1
  5. package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js +33 -0
  6. package/dist/esm/bytecodes/votemarket/batchCampaignsRestrictedVotes.js.map +1 -0
  7. package/dist/esm/bytecodes/votemarket/batchClaimableData.js +1 -1
  8. package/dist/esm/bytecodes/votemarket/batchClaimableData.js.map +1 -1
  9. package/dist/esm/ccip/fetchCcipFee.js +1 -1
  10. package/dist/esm/ccip/fetchCcipFee.js.map +1 -1
  11. package/dist/esm/ccip/fetchCcipGas.js +37 -0
  12. package/dist/esm/ccip/fetchCcipGas.js.map +1 -0
  13. package/dist/esm/index.js +3 -1
  14. package/dist/esm/index.js.map +1 -1
  15. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js +2 -2
  16. package/dist/esm/strategies/curve/fetch/curveApiData/getGaugesWeights.js.map +1 -1
  17. package/dist/esm/strategies/pendle/fetch.js +6 -5
  18. package/dist/esm/strategies/pendle/fetch.js.map +1 -1
  19. package/dist/esm/tsconfig.build.tsbuildinfo +1 -1
  20. package/dist/esm/utils.js +30 -2
  21. package/dist/esm/utils.js.map +1 -1
  22. package/dist/esm/votemarket/fetchCampaigns.js +78 -24
  23. package/dist/esm/votemarket/fetchCampaigns.js.map +1 -1
  24. package/dist/esm/votemarket/fetchPendingRemoteCampaigns.js +102 -0
  25. package/dist/esm/votemarket/fetchPendingRemoteCampaigns.js.map +1 -0
  26. package/dist/types/bytecodes/ccipGas.d.ts +4 -0
  27. package/dist/types/bytecodes/ccipGas.d.ts.map +1 -0
  28. package/dist/types/bytecodes/votemarket/batchCampaignsRestrictedVotes.d.ts +4 -0
  29. package/dist/types/bytecodes/votemarket/batchCampaignsRestrictedVotes.d.ts.map +1 -0
  30. package/dist/types/ccip/fetchCcipFee.d.ts +1 -1
  31. package/dist/types/ccip/fetchCcipGas.d.ts +22 -0
  32. package/dist/types/ccip/fetchCcipGas.d.ts.map +1 -0
  33. package/dist/types/index.d.ts +3 -1
  34. package/dist/types/index.d.ts.map +1 -1
  35. package/dist/types/strategies/pendle/fetch.d.ts.map +1 -1
  36. package/dist/types/utils.d.ts +3 -0
  37. package/dist/types/utils.d.ts.map +1 -1
  38. package/dist/types/votemarket/fetchCampaigns.d.ts +5 -1
  39. package/dist/types/votemarket/fetchCampaigns.d.ts.map +1 -1
  40. package/dist/types/votemarket/fetchPendingRemoteCampaigns.d.ts +46 -0
  41. package/dist/types/votemarket/fetchPendingRemoteCampaigns.d.ts.map +1 -0
  42. package/dist/types/votemarket/types.d.ts +2 -0
  43. package/dist/types/votemarket/types.d.ts.map +1 -1
  44. package/package.json +1 -1
  45. package/src/bytecodes/ccipGas.ts +14 -0
  46. package/src/bytecodes/votemarket/batchCampaigns.ts +1 -1
  47. package/src/bytecodes/votemarket/batchCampaignsRestrictedVotes.ts +35 -0
  48. package/src/bytecodes/votemarket/batchClaimableData.ts +1 -1
  49. package/src/ccip/fetchCcipFee.ts +2 -2
  50. package/src/ccip/fetchCcipGas.ts +68 -0
  51. package/src/index.ts +3 -1
  52. package/src/strategies/curve/fetch/curveApiData/getGaugesWeights.ts +2 -2
  53. package/src/strategies/pendle/fetch.ts +7 -5
  54. package/src/utils.ts +41 -2
  55. package/src/votemarket/fetchCampaigns.ts +115 -26
  56. package/src/votemarket/fetchPendingRemoteCampaigns.ts +141 -0
  57. package/src/votemarket/types.ts +2 -0
@@ -1,12 +1,21 @@
1
- import { ONE_WEEK, RPC, Zero, contract, contracts, tokenWithAddress, tokens } from '@stake-dao/constants'
2
- import { filter, range, remove, uniq } from 'lodash-es'
3
- import { decodeAbiParameters, encodeAbiParameters, formatUnits, parseAbiParameters, zeroAddress } from 'viem'
4
- import { mainnet } from 'viem/chains'
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
- export const fetchCampaigns = async ({ platform, chainId, rpcs }: FetchCampaignsProps): Promise<Campaign[]> => {
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
- const rawCampaigns = await batchJsonRpc({
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: RPC[mainnet.id],
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 ${RPC[mainnet.id]}`,
208
+ callsKey: `votemarket/fetchCampaigns.ts: rawGaugesWeights - chainId ${mainnet.id} - rpc ${rpcs[mainnet.id]!}`,
126
209
  })
127
210
 
128
- const campaignsTokens: string[] = uniq(rawCampaigns.map((rc) => rc.campaign.rewardToken))
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
- rewardPerPeriod: formatUnits(rawPreviousPeriod.rewardPerPeriod, decimals),
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
+ }
@@ -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