Skip to content

Commit 6c79d6a

Browse files
authored
Merge pull request #330 from Gearbox-protocol/pool-apy
fix: pool apy
2 parents 9310b25 + 2130b3a commit 6c79d6a

File tree

1 file changed

+82
-49
lines changed

1 file changed

+82
-49
lines changed

src/gearboxRewards/api.ts

Lines changed: 82 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,12 @@ export interface FarmInfo {
9797
symbol: SupportedToken;
9898
}
9999

100-
type PoolsWithExtraRewardsList = Record<NetworkType, Array<SupportedToken>>;
100+
type PoolsWithExtraRewardsList = Record<NetworkType, Array<Address>>;
101101

102102
const DEFAULT_POOLS_WITH_EXTRA_REWARDS: PoolsWithExtraRewardsList = {
103-
Mainnet: ["dtBTCV3"],
103+
Mainnet: [
104+
"0x7354EC6E852108411e681D13E11185c3a2567981", // dtBTCV3
105+
],
104106
Arbitrum: [],
105107
Optimism: [],
106108
Base: [],
@@ -110,7 +112,6 @@ type ReportHandler = (e: unknown, description?: string) => void;
110112

111113
export interface GetLmRewardsInfoProps {
112114
pools: Record<Address, PoolData>;
113-
currentTokenData: Record<SupportedToken, Address>;
114115
tokensList: Record<Address, TokenData>;
115116
provider: PublicClient;
116117

@@ -151,7 +152,6 @@ export interface ClaimLmRewardsV3Props {
151152
export class GearboxRewardsApi {
152153
static async getLmRewardsInfo({
153154
pools,
154-
currentTokenData,
155155
provider,
156156
multicallAddress,
157157
tokensList,
@@ -160,7 +160,7 @@ export class GearboxRewardsApi {
160160
network,
161161
reportError,
162162
}: GetLmRewardsInfoProps) {
163-
const poolByStakedToken = Object.values(pools).reduce<
163+
const poolByStakedDiesel = Object.values(pools).reduce<
164164
Record<Address, Address>
165165
>((acc, p) => {
166166
p.stakedDieselToken.forEach(t => {
@@ -173,36 +173,48 @@ export class GearboxRewardsApi {
173173
return acc;
174174
}, {});
175175

176-
const poolTokens = TypedObjectUtils.keys(poolByStakedToken);
176+
const poolByDiesel = Object.values(pools).reduce<Record<Address, Address>>(
177+
(acc, p) => {
178+
acc[p.dieselToken] = p.address;
179+
180+
return acc;
181+
},
182+
{},
183+
);
184+
185+
const poolByItsToken = { ...poolByStakedDiesel, ...poolByDiesel };
186+
187+
const poolStakedTokens = TypedObjectUtils.keys(poolByStakedDiesel);
188+
const allPoolTokens = TypedObjectUtils.keys(poolByItsToken);
177189

178190
const chainId = CHAINS[network];
179191
const poolTokensWithExtraReward = (
180192
poolsWithExtraRewards[network] || []
181-
).filter(symbol => {
182-
const addr = currentTokenData[symbol];
193+
).filter(p => {
194+
const token = tokensList[p.toLowerCase() as Address];
183195

184-
if (!addr) {
185-
console.error(`Pool staked token not found ${symbol}`);
196+
if (!token) {
197+
console.error(`Pool token not found ${p}`);
186198
return false;
187199
}
188200
return true;
189201
});
190202

191-
const farmInfoCalls = poolTokens.map(address => ({
203+
const farmInfoCalls = poolStakedTokens.map(address => ({
192204
address,
193205
abi: iFarmingPoolAbi,
194206
functionName: "farmInfo",
195207
args: [],
196208
}));
197209

198-
const farmSupplyCalls = poolTokens.map(address => ({
210+
const farmSupplyCalls = allPoolTokens.map(address => ({
199211
address,
200212
abi: iFarmingPoolAbi,
201213
functionName: "totalSupply",
202214
args: [],
203215
}));
204216

205-
const rewardTokenCalls = poolTokens.map(address => ({
217+
const rewardTokenCalls = poolStakedTokens.map(address => ({
206218
address,
207219
abi: POOL_REWARDS_ABI,
208220
functionName: "rewardsToken",
@@ -227,14 +239,12 @@ export class GearboxRewardsApi {
227239
],
228240
}),
229241

230-
...poolTokensWithExtraReward.map(symbol => {
231-
const addr = currentTokenData[symbol];
232-
242+
...poolTokensWithExtraReward.map(t => {
233243
return axios.get<MerkleXYZRewardsCampaignsResponse>(
234244
MerkleXYZApi.getRewardsCampaignsUrl({
235245
params: {
236246
chainId,
237-
mainParameter: getAddress(addr),
247+
mainParameter: getAddress(t),
238248
},
239249
}),
240250
);
@@ -264,14 +274,38 @@ export class GearboxRewardsApi {
264274
rewardTokenCallsEnd,
265275
) as Array<Address>;
266276

277+
const infoByPool = poolStakedTokens.reduce<Record<Address, FarmInfoOutput>>(
278+
(acc, p, index) => {
279+
const info = farmInfo[index];
280+
281+
if (info) acc[p] = info;
282+
283+
return acc;
284+
},
285+
{},
286+
);
287+
288+
const rewardTokenPool = poolStakedTokens.reduce<Record<Address, Address>>(
289+
(acc, p, index) => {
290+
const token = rewardTokens[index];
291+
292+
if (token) {
293+
acc[p] = token.toLowerCase() as Address;
294+
}
295+
296+
return acc;
297+
},
298+
{},
299+
);
300+
267301
const extraRewards = extra.reduce<Record<string, Array<FarmInfo>>>(
268302
(acc, r, index) => {
269-
const stakedSymbol = poolTokensWithExtraReward[index];
303+
const p = poolTokensWithExtraReward[index].toLowerCase() as Address;
270304

271305
const safeResp = this.extractFulfilled(
272306
r,
273307
reportError,
274-
`merkleCampaign: ${stakedSymbol}`,
308+
`merkleCampaign: ${p}`,
275309
);
276310

277311
const l = safeResp?.data.reduce<Array<FarmInfo>>((infos, d) => {
@@ -290,7 +324,7 @@ export class GearboxRewardsApi {
290324

291325
if (rewardTokenData && reward > 0) {
292326
infos.push({
293-
pool: poolByStakedToken[currentTokenData[stakedSymbol]],
327+
pool: poolByItsToken[p],
294328
duration: toBigInt(d.endTimestamp - d.startTimestamp),
295329
finished,
296330
reward,
@@ -304,49 +338,48 @@ export class GearboxRewardsApi {
304338
}, []);
305339

306340
if (l) {
307-
acc[currentTokenData[stakedSymbol]] = l;
341+
acc[p] = l;
308342
}
309343

310344
return acc;
311345
},
312346
{},
313347
);
314348

315-
const rewardPoolsInfo = poolTokens.reduce<{
349+
const stakedTokenRewards = allPoolTokens.reduce<{
316350
base: Record<string, FarmInfo>;
317351
extra: Record<string, Array<FarmInfo>>;
318352
all: Record<string, Array<FarmInfo>>;
319353
}>(
320-
(acc, address, i) => {
321-
const currentInfo = farmInfo[i];
322-
const poolBaseRewardTokenLc = (
323-
rewardTokens[i] || ""
324-
).toLowerCase() as Address;
325-
const tokenData = tokensList[poolBaseRewardTokenLc];
326-
327-
if (tokenData) {
328-
const baseReward: FarmInfo = {
329-
pool: poolByStakedToken[address],
330-
duration: BigInt(currentInfo.duration),
331-
finished: BigInt(currentInfo.finished),
332-
reward: currentInfo.reward,
333-
balance: currentInfo.balance,
334-
symbol: tokenData.symbol,
335-
};
336-
337-
const extra = extraRewards[address] || [];
338-
339-
acc.base[address] = baseReward;
340-
acc.extra[address] = extra;
341-
acc.all[address] = [baseReward, ...extra];
342-
}
354+
(acc, pool) => {
355+
const info = infoByPool[pool];
356+
const token = rewardTokenPool[pool];
357+
const tokenData = tokensList[token];
358+
359+
const baseReward: FarmInfo | undefined =
360+
info && tokenData
361+
? {
362+
pool: poolByItsToken[pool],
363+
duration: BigInt(info.duration),
364+
finished: BigInt(info.finished),
365+
reward: info.reward,
366+
balance: info.balance,
367+
symbol: tokenData.symbol,
368+
}
369+
: undefined;
370+
371+
const extra = extraRewards[pool] || [];
372+
373+
if (baseReward) acc.base[pool] = baseReward;
374+
acc.extra[pool] = extra;
375+
acc.all[pool] = [...(baseReward ? [baseReward] : []), ...extra];
343376

344377
return acc;
345378
},
346379
{ base: {}, extra: {}, all: {} },
347380
);
348381

349-
const rewardPoolsSupply = poolTokens.reduce<Record<string, bigint>>(
382+
const rewardPoolsSupply = allPoolTokens.reduce<Record<string, bigint>>(
350383
(acc, address, i) => {
351384
acc[address] = farmSupply[i] || 0n;
352385

@@ -356,9 +389,9 @@ export class GearboxRewardsApi {
356389
);
357390

358391
return {
359-
rewardPoolsInfo: rewardPoolsInfo.all,
360-
baseRewardPoolsInfo: rewardPoolsInfo.base,
361-
extraRewardPoolsInfo: rewardPoolsInfo.extra,
392+
rewardPoolsInfo: stakedTokenRewards.all,
393+
baseRewardPoolsInfo: stakedTokenRewards.base,
394+
extraRewardPoolsInfo: stakedTokenRewards.extra,
362395
rewardPoolsSupply,
363396
};
364397
}

0 commit comments

Comments
 (0)