Skip to content

Commit 7ce4468

Browse files
authored
Merge pull request #2130 from franzns/fix-beets-dex-yield
add v2 beets dex yield
2 parents ccd728f + 11f942d commit 7ce4468

File tree

3 files changed

+103
-76
lines changed

3 files changed

+103
-76
lines changed

src/adaptors/beets-dex/index.js

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

src/adaptors/beets-dex/index.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { getPools } from './utils';
2+
3+
const poolsFunction = async () => {
4+
const [sonicPoolsV2] = await Promise.all([getPools('SONIC', 'sonic', 2)]);
5+
6+
return [...sonicPoolsV2];
7+
};
8+
9+
module.exports = {
10+
timetravel: false,
11+
apy: poolsFunction,
12+
url: 'https://beets.fi/pools',
13+
};

src/adaptors/beets-dex/utils.ts

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
const { gql, request } = require('graphql-request');
2+
const utils = require('../utils');
3+
4+
const query = gql`
5+
query GetPools($chain: GqlChain!, $version: Int!) {
6+
poolGetPools(
7+
first: 1000
8+
where: { chainIn: [$chain], protocolVersionIn: [$version], minTvl: 10000 }
9+
) {
10+
id
11+
chain
12+
symbol
13+
address
14+
poolTokens {
15+
address
16+
symbol
17+
}
18+
dynamicData {
19+
totalLiquidity
20+
aprItems {
21+
type
22+
apr
23+
rewardTokenAddress
24+
}
25+
}
26+
}
27+
}
28+
`;
29+
30+
export const getPools = async (backendChain, chainString, version) => {
31+
try {
32+
const { poolGetPools } = await request(
33+
'https://backend-v3.beets-ftm-node.com/graphql',
34+
query,
35+
{ chain: backendChain, version: version }
36+
);
37+
38+
return poolGetPools.map((pool) => {
39+
const aprItems = pool.dynamicData.aprItems || [];
40+
41+
const baseApr = aprItems
42+
.filter(
43+
(item) => item.type === 'SWAP_FEE_24H' || item.type === 'IB_YIELD'
44+
)
45+
.reduce((sum, item) => sum + Number(item.apr), 0);
46+
47+
const stakingApr = aprItems
48+
.filter(
49+
(item) =>
50+
item.type === 'STAKING' ||
51+
item.type === 'MABEETS_EMISSIONS' ||
52+
item.type === 'STAKING_BOOST'
53+
)
54+
.reduce((sum, item) => sum + Number(item.apr), 0);
55+
56+
const rewardTokens = aprItems
57+
.filter(
58+
(item) =>
59+
(item.type === 'STAKING' ||
60+
item.type === 'MABEETS_EMISSIONS' ||
61+
item.type === 'STAKING_BOOST') &&
62+
item.rewardTokenAddress
63+
)
64+
.map((item) => item.rewardTokenAddress);
65+
66+
const underlyingTokens = pool.poolTokens
67+
.map((token) => token.address)
68+
.filter(Boolean);
69+
70+
return {
71+
pool: pool.address,
72+
chain: utils.formatChain(chainString),
73+
project: version === 3 ? 'beets-dex-v3' : 'beets-dex',
74+
symbol: utils.formatSymbol(pool.symbol),
75+
tvlUsd: Number(pool.dynamicData.totalLiquidity),
76+
apyBase: baseApr * 100,
77+
apyReward: stakingApr * 100,
78+
rewardTokens: rewardTokens,
79+
underlyingTokens: underlyingTokens,
80+
url: `https://beets.fi/pools/${chainString}/v${version}/${pool.id}`,
81+
};
82+
});
83+
} catch (error) {
84+
console.error(
85+
`Error fetching Beets V${version} pools for ${chainString}:`,
86+
error
87+
);
88+
return [];
89+
}
90+
};

0 commit comments

Comments
 (0)