@gearbox-protocol/sdk 3.0.0-next.168 → 3.0.0-next.169
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/lib/apy/curveAPY.d.ts +0 -3
- package/lib/apy/curveAPY.js +41 -47
- package/lib/apy/defiLamaAPY.js +13 -19
- package/lib/apy/lidoAPY.js +7 -13
- package/lib/gearboxRewards/api.js +8 -11
- package/lib/gearboxRewards/extraAPY.d.ts +1 -3
- package/lib/gearboxRewards/extraAPY.js +14 -17
- package/package.json +1 -1
package/lib/apy/curveAPY.d.ts
CHANGED
|
@@ -55,9 +55,6 @@ export type CurveAPYResult = PartialRecord<CurveAPYTokens, CurveAPY>;
|
|
|
55
55
|
export declare function getCurveAPY(network: NetworkType): Promise<{
|
|
56
56
|
curveAPY: CurveAPYResult;
|
|
57
57
|
gearAPY: CurveAPY;
|
|
58
|
-
} | {
|
|
59
|
-
curveAPY?: undefined;
|
|
60
|
-
gearAPY?: undefined;
|
|
61
58
|
}>;
|
|
62
59
|
export declare function getCurveGearPool(): Promise<CurvePoolData | undefined>;
|
|
63
60
|
export {};
|
package/lib/apy/curveAPY.js
CHANGED
|
@@ -24,54 +24,48 @@ const getFactoryTriCryptoURL = (n) => `https://api.curve.fi/api/getPools/${CURVE
|
|
|
24
24
|
const getFactoryCrvUsdURL = (n) => `https://api.curve.fi/api/getPools/${CURVE_CHAINS[n]}/factory-crvusd`;
|
|
25
25
|
const getFactoryStableNgURL = (n) => `https://api.curve.fi/api/getPools/${CURVE_CHAINS[n]}/factory-stable-ng`;
|
|
26
26
|
async function getCurveAPY(network) {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
gauge: extraRewards,
|
|
54
|
-
};
|
|
55
|
-
return acc;
|
|
56
|
-
}, {});
|
|
57
|
-
const poolFactoryByAddress = Object.fromEntries((mainnetFactoryPools?.data?.data?.poolData || []).map((p) => [p.lpTokenAddress.toLowerCase(), p]));
|
|
58
|
-
const mainnetVolumeByAddress = Object.fromEntries(mainnetVolumes.data.data.pools.map(v => [v.address.toLowerCase(), v]));
|
|
59
|
-
const gearPool = poolFactoryByAddress[GEAR_POOL];
|
|
60
|
-
const gearVolume = mainnetVolumeByAddress[(gearPool?.address || "").toLowerCase()];
|
|
61
|
-
const gearAPY = {
|
|
62
|
-
base: curveAPYToBn(gearVolume?.latestDailyApyPcent || 0),
|
|
63
|
-
crv: curveAPYToBn(Math.max(...(gearPool?.gaugeCrvApy || []), 0)),
|
|
64
|
-
gauge: (gearPool?.gaugeRewards || []).map(({ apy = 0, symbol }) => [
|
|
65
|
-
symbol.toLowerCase(),
|
|
66
|
-
curveAPYToBn(apy),
|
|
67
|
-
]),
|
|
27
|
+
const currentTokens = sdk_gov_1.tokenDataByNetwork[network];
|
|
28
|
+
const { mainnetVolumes, mainnetFactoryPools, volumes, pools } = await getCurvePools(network);
|
|
29
|
+
const volumeByAddress = Object.fromEntries(volumes.data.data.pools.map(v => [v.address.toLowerCase(), v]));
|
|
30
|
+
const poolDataByAddress = Object.fromEntries(pools
|
|
31
|
+
.map(poolCategory => {
|
|
32
|
+
const { poolData = [] } = poolCategory?.data?.data || {};
|
|
33
|
+
return poolData.map((p) => [
|
|
34
|
+
p.lpTokenAddress.toLowerCase(),
|
|
35
|
+
p,
|
|
36
|
+
]);
|
|
37
|
+
})
|
|
38
|
+
.flat(1));
|
|
39
|
+
const curveAPY = sdk_gov_1.TypedObjectUtils.entries(sdk_gov_1.curveTokens).reduce((acc, [curveSymbol]) => {
|
|
40
|
+
const address = (currentTokens?.[curveSymbol] || "").toLowerCase();
|
|
41
|
+
const pool = poolDataByAddress[address];
|
|
42
|
+
const volume = volumeByAddress[(pool?.address || "").toLowerCase()];
|
|
43
|
+
const baseAPY = volume?.latestDailyApyPcent || 0;
|
|
44
|
+
const maxCrv = Math.max(...(pool?.gaugeCrvApy || []), 0);
|
|
45
|
+
const extraRewards = (pool?.gaugeRewards || []).map(({ apy = 0, symbol }) => [
|
|
46
|
+
symbol.toLowerCase(),
|
|
47
|
+
curveAPYToBn(apy),
|
|
48
|
+
]);
|
|
49
|
+
acc[curveSymbol] = {
|
|
50
|
+
base: curveAPYToBn(baseAPY),
|
|
51
|
+
crv: curveAPYToBn(maxCrv),
|
|
52
|
+
gauge: extraRewards,
|
|
68
53
|
};
|
|
69
|
-
return
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
54
|
+
return acc;
|
|
55
|
+
}, {});
|
|
56
|
+
const poolFactoryByAddress = Object.fromEntries((mainnetFactoryPools?.data?.data?.poolData || []).map((p) => [p.lpTokenAddress.toLowerCase(), p]));
|
|
57
|
+
const mainnetVolumeByAddress = Object.fromEntries(mainnetVolumes.data.data.pools.map(v => [v.address.toLowerCase(), v]));
|
|
58
|
+
const gearPool = poolFactoryByAddress[GEAR_POOL];
|
|
59
|
+
const gearVolume = mainnetVolumeByAddress[(gearPool?.address || "").toLowerCase()];
|
|
60
|
+
const gearAPY = {
|
|
61
|
+
base: curveAPYToBn(gearVolume?.latestDailyApyPcent || 0),
|
|
62
|
+
crv: curveAPYToBn(Math.max(...(gearPool?.gaugeCrvApy || []), 0)),
|
|
63
|
+
gauge: (gearPool?.gaugeRewards || []).map(({ apy = 0, symbol }) => [
|
|
64
|
+
symbol.toLowerCase(),
|
|
65
|
+
curveAPYToBn(apy),
|
|
66
|
+
]),
|
|
67
|
+
};
|
|
68
|
+
return { curveAPY, gearAPY };
|
|
75
69
|
}
|
|
76
70
|
exports.getCurveAPY = getCurveAPY;
|
|
77
71
|
async function getCurvePools(network) {
|
package/lib/apy/defiLamaAPY.js
CHANGED
|
@@ -8,26 +8,20 @@ const sdk_gov_1 = require("@gearbox-protocol/sdk-gov");
|
|
|
8
8
|
const axios_1 = __importDefault(require("axios"));
|
|
9
9
|
const LAMA_URL = "https://charts-server.fly.dev/api/defillama?ids=";
|
|
10
10
|
async function getDefiLamaAPY(networkType) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
if (idList.length === 0)
|
|
15
|
-
return {};
|
|
16
|
-
const res = await axios_1.default.get(`${LAMA_URL}${idList.join(",")}`);
|
|
17
|
-
const itemsRecord = res.data.data.reduce((acc, item) => {
|
|
18
|
-
acc[item.pool] = item;
|
|
19
|
-
return acc;
|
|
20
|
-
}, {});
|
|
21
|
-
const allAPY = sdk_gov_1.TypedObjectUtils.fromEntries(sdk_gov_1.TypedObjectUtils.entries(currentNormal).map(([symbol, pool]) => {
|
|
22
|
-
const { apy = 0 } = itemsRecord[pool] || {};
|
|
23
|
-
return [symbol, Math.round(apy * Number(sdk_gov_1.PERCENTAGE_FACTOR))];
|
|
24
|
-
}));
|
|
25
|
-
return allAPY;
|
|
26
|
-
}
|
|
27
|
-
catch (e) {
|
|
28
|
-
console.error(e);
|
|
11
|
+
const currentNormal = NORMAL_TO_LAMA[networkType];
|
|
12
|
+
const idList = Object.values(currentNormal);
|
|
13
|
+
if (idList.length === 0)
|
|
29
14
|
return {};
|
|
30
|
-
}
|
|
15
|
+
const res = await axios_1.default.get(`${LAMA_URL}${idList.join(",")}`);
|
|
16
|
+
const itemsRecord = res.data.data.reduce((acc, item) => {
|
|
17
|
+
acc[item.pool] = item;
|
|
18
|
+
return acc;
|
|
19
|
+
}, {});
|
|
20
|
+
const allAPY = sdk_gov_1.TypedObjectUtils.fromEntries(sdk_gov_1.TypedObjectUtils.entries(currentNormal).map(([symbol, pool]) => {
|
|
21
|
+
const { apy = 0 } = itemsRecord[pool] || {};
|
|
22
|
+
return [symbol, Math.round(apy * Number(sdk_gov_1.PERCENTAGE_FACTOR))];
|
|
23
|
+
}));
|
|
24
|
+
return allAPY;
|
|
31
25
|
}
|
|
32
26
|
exports.getDefiLamaAPY = getDefiLamaAPY;
|
|
33
27
|
const NORMAL_TO_LAMA = {
|
package/lib/apy/lidoAPY.js
CHANGED
|
@@ -8,18 +8,12 @@ const sdk_gov_1 = require("@gearbox-protocol/sdk-gov");
|
|
|
8
8
|
const axios_1 = __importDefault(require("axios"));
|
|
9
9
|
const LIDO_URL = "https://eth-api.lido.fi/v1/protocol/steth/apr/sma";
|
|
10
10
|
async function getLidoAPY() {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
catch (e) {
|
|
21
|
-
console.error(e);
|
|
22
|
-
return {};
|
|
23
|
-
}
|
|
11
|
+
const res = await axios_1.default.get(LIDO_URL);
|
|
12
|
+
const { smaApr = 0 } = res?.data?.data || {};
|
|
13
|
+
const r = Math.round(smaApr * Number(sdk_gov_1.PERCENTAGE_FACTOR));
|
|
14
|
+
return {
|
|
15
|
+
STETH: r,
|
|
16
|
+
wstETH: r,
|
|
17
|
+
};
|
|
24
18
|
}
|
|
25
19
|
exports.getLidoAPY = getLidoAPY;
|
|
@@ -101,12 +101,15 @@ class GearboxRewardsApi {
|
|
|
101
101
|
if (!airdropDistributorAddress)
|
|
102
102
|
return { rewards: [], totalAvailable: 0n };
|
|
103
103
|
const distributor = types_1.IAirdropDistributor__factory.connect(airdropDistributorAddress, provider);
|
|
104
|
-
const [
|
|
104
|
+
const [claimedResp, merkleDataResp] = await Promise.all([
|
|
105
105
|
this.getClaimed({ distributor, account }),
|
|
106
106
|
this.getMerkle(provider, airdropDistributorAddress, network, account),
|
|
107
107
|
]);
|
|
108
|
-
const amountOnContract = this.getAmountOnContract({
|
|
109
|
-
|
|
108
|
+
const amountOnContract = this.getAmountOnContract({
|
|
109
|
+
account,
|
|
110
|
+
merkleData: merkleDataResp,
|
|
111
|
+
});
|
|
112
|
+
const diff = amountOnContract - claimedResp;
|
|
110
113
|
const availableToClaimV2 = math_1.BigIntMath.max(0n, diff);
|
|
111
114
|
const rewards = [
|
|
112
115
|
{
|
|
@@ -207,14 +210,8 @@ class GearboxRewardsApi {
|
|
|
207
210
|
const root = await distributor.merkleRoot();
|
|
208
211
|
const path = `${network}_${root.slice(2)}/${account.slice(2, 4)}`;
|
|
209
212
|
const url = `https://am.gearbox.finance/${path.toLowerCase()}.json`;
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
return result.data;
|
|
213
|
-
}
|
|
214
|
-
catch (error) {
|
|
215
|
-
console.error("core/gearboxRewards/lmRewards/getMerkle", error);
|
|
216
|
-
return undefined;
|
|
217
|
-
}
|
|
213
|
+
const result = await axios_1.default.get(url);
|
|
214
|
+
return result.data;
|
|
218
215
|
}
|
|
219
216
|
static async getClaimed({ distributor, account, }) {
|
|
220
217
|
const claimedRewardsResponse = await distributor.queryFilter(distributor.filters.Claimed(account, undefined, false));
|
|
@@ -22,9 +22,7 @@ interface PoolPointsInfo {
|
|
|
22
22
|
name: string;
|
|
23
23
|
}
|
|
24
24
|
export declare class GearboxRewardsExtraApy {
|
|
25
|
-
static getTotalTokensOnProtocol({ currentTokenData, chainId, tokensList, network, }: GetTotalTokensOnProtocolProps): Promise<
|
|
26
|
-
[k: string]: Asset;
|
|
27
|
-
}>;
|
|
25
|
+
static getTotalTokensOnProtocol({ currentTokenData, chainId, tokensList, network, }: GetTotalTokensOnProtocolProps): Promise<[SupportedToken, PromiseSettledResult<Asset>][]>;
|
|
28
26
|
private static getTokenTotal;
|
|
29
27
|
static getPointsByPool({ totalTokenBalances, pools, tokensList, currentTokenData, network, }: GetPointsByPoolProps): {
|
|
30
28
|
[k: string]: Asset[];
|
|
@@ -56,25 +56,22 @@ const REWARD_PERIOD = 30 * 24 * 60 * 60;
|
|
|
56
56
|
class GearboxRewardsExtraApy {
|
|
57
57
|
static async getTotalTokensOnProtocol({ currentTokenData, chainId, tokensList, network, }) {
|
|
58
58
|
const currTokens = TOKENS[network];
|
|
59
|
-
const res = await Promise.
|
|
60
|
-
return
|
|
59
|
+
const res = await Promise.allSettled(currTokens.map(s => this.getTokenTotal(currentTokenData[s], chainId, tokensList)));
|
|
60
|
+
return res.map((r, i) => [
|
|
61
|
+
currTokens[i],
|
|
62
|
+
r,
|
|
63
|
+
]);
|
|
61
64
|
}
|
|
62
65
|
static async getTokenTotal(token, chainId, tokensList) {
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
return { token, balance: (0, formatter_1.toBN)(String(balance), decimals) };
|
|
73
|
-
}
|
|
74
|
-
catch (error) {
|
|
75
|
-
console.error("core/apy/extraAPYApi/getTokenTotal", error);
|
|
76
|
-
return undefined;
|
|
77
|
-
}
|
|
66
|
+
const url = endpoint_1.ChartsApi.getUrl("getBalanceAt", chainId, {
|
|
67
|
+
params: {
|
|
68
|
+
asset: token,
|
|
69
|
+
},
|
|
70
|
+
});
|
|
71
|
+
const result = await axios_1.default.get(url);
|
|
72
|
+
const balance = result.data.result.reduce((sum, r) => r.effective_balance + sum, 0);
|
|
73
|
+
const { decimals = 18 } = tokensList[token] || {};
|
|
74
|
+
return { token, balance: (0, formatter_1.toBN)(String(balance), decimals) };
|
|
78
75
|
}
|
|
79
76
|
static getPointsByPool({ totalTokenBalances, pools, tokensList, currentTokenData, network, }) {
|
|
80
77
|
const r = Object.fromEntries(pools.map(p => {
|