Skip to content

Commit a2accae

Browse files
committed
Refactor Accountable integration to remove Merkl rewards fetching and streamline APY calculations for vaults
1 parent 1750a60 commit a2accae

File tree

1 file changed

+35
-29
lines changed

1 file changed

+35
-29
lines changed

src/adaptors/accountable/index.js

Lines changed: 35 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
const sdk = require('@defillama/sdk');
2-
const axios = require('axios');
32
const utils = require('../utils');
43

54
const API_URL = 'https://yield.accountable.capital/api/loan';
6-
const MERKL_API_URL = 'https://api.merkl.xyz/v4/opportunities?explorerAddress=';
75
const chainIdToName = { 143: 'monad' };
86
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
97

@@ -92,23 +90,6 @@ const getVaultStats = async(vaults, chain = 'monad') => {
9290
}, {});
9391
};
9492

95-
const fetchMerklRewards = async(vaultAddress) => {
96-
try {
97-
const { data } = await axios.get(`${MERKL_API_URL}${vaultAddress}`);
98-
const opp =
99-
Array.isArray(data) &&
100-
(data.find((item) => item?.explorerAddress?.toLowerCase() === vaultAddress.toLowerCase()) || data[0]);
101-
if (!opp) return [];
102-
return (
103-
opp.rewardsRecord?.breakdowns
104-
?.map((b) => b?.token?.address?.toLowerCase())
105-
.filter(Boolean) || []
106-
);
107-
} catch (e) {
108-
return [];
109-
}
110-
};
111-
11293
const fetchBreakdowns = async(loanIds) => {
11394
const results = await Promise.allSettled(
11495
loanIds.map((id) => utils.getData(`${API_URL}/${id}/apy/breakdown`))
@@ -137,18 +118,43 @@ const apy = async() => {
137118
const vaultAddress = loanVaultMap[item.id];
138119
const stats = vaultAddress ? vaultStats[vaultAddress] || {} : {};
139120
const pointBoosts = item?.all_points_apy_boost?.boosts_by_points || [];
140-
const pointRewardApy = pointBoosts.reduce((sum, b) => sum + Number(b?.apy_boost_percent || 0), 0);
141-
const pointRewardTokens = pointBoosts.map((b) => b?.point_name).filter(Boolean);
142121

143122
const breakdown = breakdowns[item.id] || {};
144-
const merklApy = breakdown?.merkle_apy ?? 0;
145-
const nativeApy = breakdown?.native_apy ?? basisPointsToPercent(item.apy);
146-
const perfFee = breakdown?.performance_fee ?? 0;
147-
148-
const totalApyReward = (merklApy ?? 0) + pointRewardApy || null;
149-
const merklTokens = vaultAddress ? await fetchMerklRewards(vaultAddress) : [];
123+
const interestRate = Number(breakdown?.interest_rate);
124+
const perfFeePctRaw = Number(breakdown?.performance_fee_percentage);
125+
const perfFeePct =
126+
!Number.isNaN(perfFeePctRaw) && perfFeePctRaw > 1 ? perfFeePctRaw / 100 : perfFeePctRaw;
127+
const perfFeePoints = Number(breakdown?.performance_fee_points);
128+
const netInterest = breakdown?.net_interest_rate;
129+
const baseApy =
130+
netInterest != null
131+
? Number(netInterest)
132+
: !Number.isNaN(interestRate) && !Number.isNaN(perfFeePct)
133+
? interestRate * (1 - perfFeePct)
134+
: !Number.isNaN(interestRate) && !Number.isNaN(perfFeePoints)
135+
? interestRate - perfFeePoints
136+
: basisPointsToPercent(item.apy);
137+
138+
const merklApy = Number(breakdown?.merkl_apy_boost?.total_apr ?? breakdown?.merkle_apy ?? 0);
139+
const pointBoostsFromBreakdown = breakdown?.points_apy_boost?.boosts_by_points || pointBoosts;
140+
const pointRewardApyFromBreakdown =
141+
breakdown?.points_apy_boost?.total_apy_boost_percent ??
142+
pointBoostsFromBreakdown.reduce((sum, b) => sum + Number(b?.apy_boost_percent || 0), 0);
143+
const pointRewardTokens = pointBoostsFromBreakdown.map((b) => b?.point_name).filter(Boolean);
144+
145+
const merklTokens =
146+
breakdown?.merkl_apy_boost?.tokens?.map((t) => t?.address?.toLowerCase()).filter(Boolean) || [];
147+
148+
const rewardsBoost = Number(breakdown?.rewards_apy_boost?.total_apy_boost_percent ?? 0);
149+
const rewardBoostTokens =
150+
breakdown?.rewards_apy_boost?.boosts_by_token
151+
?.map((b) => b?.token?.address || b?.address || b?.token_address)
152+
.filter(Boolean)
153+
.map((addr) => addr.toLowerCase()) || [];
154+
155+
const totalApyReward = merklApy + pointRewardApyFromBreakdown + rewardsBoost || null;
150156
const combinedRewardTokens = Array.from(
151-
new Set([...(merklTokens || []), ...pointRewardTokens])
157+
new Set([...(merklTokens || []), ...rewardBoostTokens, ...pointRewardTokens])
152158
);
153159

154160
return {
@@ -157,7 +163,7 @@ const apy = async() => {
157163
project: 'accountable',
158164
symbol: utils.formatSymbol(item.asset_symbol),
159165
tvlUsd: formatAmount(stats.tvl, 6),
160-
apyBase: nativeApy + perfFee,
166+
apyBase: baseApy,
161167
apyReward: totalApyReward,
162168
rewardTokens: combinedRewardTokens,
163169
url: `https://yield.accountable.capital/vaults/${item.loan_address}`,

0 commit comments

Comments
 (0)