1+ const sdk = require ( '@defillama/sdk' )
12const { sumTokensExport } = require ( '../helper/sumTokens' )
23const ADDRESSES = require ( '../helper/coreAssets.json' )
34const { defaultTokens } = require ( '../helper/cex' )
45const { getConfig } = require ( '../helper/cache.js' )
6+ const { getStakedSol } = require ( '../helper/solana' )
57
68const API_URL = 'https://api.backpack.exchange/api/v1/wallets'
79
810const _getConfig = async ( ) => {
9- const data = await getConfig ( 'backpack/wallets' , API_URL )
10- const config = { }
11+ const data = await getConfig ( 'backpack/wallets' , API_URL )
12+ const config = { }
1113 data . forEach ( ( { address, blockchain } ) => {
1214 let chain = blockchain . toLowerCase ( )
1315 if ( chain === 'avalanche' ) chain = 'avax'
@@ -17,24 +19,75 @@ const _getConfig = async () => {
1719 return config
1820}
1921
20- const exportObj = { timetravel : false }
21- const chains = [ 'ethereum' , 'solana' , 'bitcoin' , 'litecoin' , 'arbitrum' , 'optimism' , 'polygon' , 'base' , 'bsc' , 'avax' , 'tron' ] ;
22+ const exportObj = { timetravel : false }
23+ const CHAINS = [
24+ 'solana' ,
25+ 'ethereum' ,
26+ 'bitcoin' ,
27+ 'doge' ,
28+ 'litecoin' ,
29+ 'arbitrum' ,
30+ 'base' ,
31+ 'bsc' ,
32+ 'optimism' ,
33+ 'avax' ,
34+ 'polygon' ,
35+ 'tron' ,
36+ 'aptos' ,
37+ 'ripple' ,
38+ 'plasma' ,
39+ 'hyperliquid'
40+ ]
2241
23- chains . forEach ( ( chain ) => {
42+ const CHAIN_BLACKLISTS = {
43+ ethereum : [ '0x57ab1e02fee23774580c119740129eac7081e9d3' ] ,
44+ }
45+
46+ CHAINS . forEach ( ( chain ) => {
2447 exportObj [ chain ] = {
2548 tvl : async ( ) => {
2649 const config = await _getConfig ( )
2750 const entry = config [ chain ]
2851 if ( ! entry ) return { }
2952
30- let { tokensAndOwners, owners, tokens, blacklistedTokens, fungibleAssets } = entry
31- if ( ! tokensAndOwners && ! tokens && chain !== 'solana' ) tokens = defaultTokens [ chain ] || [ ADDRESSES . null ]
53+ const tokenLists = [ ...new Set ( [
54+ ...( Object . values ( ADDRESSES [ chain ] || { } ) ) ,
55+ ...( defaultTokens [ chain ] || [ ] ) ,
56+ ] ) ]
57+
58+ let { tokensAndOwners, owners, tokens, blacklistedTokens = [ ] , fungibleAssets } = entry
59+
60+ if ( ! tokensAndOwners && ! tokens ) tokens = tokenLists
61+
62+ if ( CHAIN_BLACKLISTS [ chain ] ) {
63+ blacklistedTokens = [
64+ ...new Set ( [ ...( blacklistedTokens || [ ] ) , ...CHAIN_BLACKLISTS [ chain ] ] ) ,
65+ ]
66+ }
3267
3368 const options = { ...entry , owners, tokens, chain, blacklistedTokens }
3469 if ( chain === 'solana' || chain === 'eclipse' ) options . solOwners = owners
3570 if ( chain === 'ton' ) options . onlyWhitelistedTokens = true
3671 if ( chain === 'aptos' && Array . isArray ( fungibleAssets ) ) options . fungibleAssets = fungibleAssets
3772
73+ if ( chain === 'solana' ) {
74+ const balances = await sumTokensExport ( options ) ( )
75+
76+ if ( Array . isArray ( owners ) && owners . length ) {
77+ const uniqOwners = [ ...new Set ( owners ) ]
78+ const BATCH = 50
79+ let totalStaked = 0
80+ for ( let i = 0 ; i < uniqOwners . length ; i += BATCH ) {
81+ const chunk = uniqOwners . slice ( i , i + BATCH )
82+ const parts = await Promise . all ( chunk . map ( addr => getStakedSol ( addr ) ) )
83+ totalStaked += parts . reduce ( ( a , b ) => a + b , 0 )
84+ }
85+ sdk . util . sumSingleBalance ( balances , `solana:${ ADDRESSES . solana . SOL } ` , totalStaked )
86+ }
87+
88+ return balances
89+ }
90+
3891 return sumTokensExport ( options ) ( )
3992 }
4093 }
0 commit comments