11const sdk = require ( '@defillama/sdk' ) ;
2- const axios = require ( 'axios' ) ;
32const utils = require ( '../utils' ) ;
43
54const API_URL = 'https://yield.accountable.capital/api/loan' ;
6- const MERKL_API_URL = 'https://api.merkl.xyz/v4/opportunities?explorerAddress=' ;
75const chainIdToName = { 143 : 'monad' } ;
86const 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-
11293const 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