From f3e74f80ef1e33a729beb2f17b3a6445bbada0fd Mon Sep 17 00:00:00 2001 From: 0xpeluche <110820448+0xpeluche@users.noreply.github.com> Date: Thu, 6 Nov 2025 17:05:19 +0100 Subject: [PATCH] Update: Backpack (#16972) --- projects/backpack/index.js | 67 +++++++++++++++++++++++++++++---- projects/helper/coreAssets.json | 3 +- 2 files changed, 62 insertions(+), 8 deletions(-) diff --git a/projects/backpack/index.js b/projects/backpack/index.js index 13896157b..d928ee4a9 100644 --- a/projects/backpack/index.js +++ b/projects/backpack/index.js @@ -1,13 +1,15 @@ +const sdk = require('@defillama/sdk') const { sumTokensExport } = require('../helper/sumTokens') const ADDRESSES = require('../helper/coreAssets.json') const { defaultTokens } = require('../helper/cex') const { getConfig } = require('../helper/cache.js') +const { getStakedSol } = require('../helper/solana') const API_URL = 'https://api.backpack.exchange/api/v1/wallets' const _getConfig = async () => { - const data = await getConfig('backpack/wallets', API_URL) - const config = {} + const data = await getConfig('backpack/wallets', API_URL) + const config = {} data.forEach(({ address, blockchain }) => { let chain = blockchain.toLowerCase() if (chain === 'avalanche') chain = 'avax' @@ -17,24 +19,75 @@ const _getConfig = async () => { return config } -const exportObj = { timetravel: false } -const chains = ['ethereum', 'solana', 'bitcoin', 'litecoin', 'arbitrum', 'optimism', 'polygon', 'base', 'bsc', 'avax', 'tron']; +const exportObj = { timetravel: false } +const CHAINS = [ + 'solana', + 'ethereum', + 'bitcoin', + 'doge', + 'litecoin', + 'arbitrum', + 'base', + 'bsc', + 'optimism', + 'avax', + 'polygon', + 'tron', + 'aptos', + 'ripple', + 'plasma', + 'hyperliquid' +] -chains.forEach((chain) => { +const CHAIN_BLACKLISTS = { + ethereum: ['0x57ab1e02fee23774580c119740129eac7081e9d3'], +} + +CHAINS.forEach((chain) => { exportObj[chain] = { tvl: async () => { const config = await _getConfig() const entry = config[chain] if (!entry) return {} - let { tokensAndOwners, owners, tokens, blacklistedTokens, fungibleAssets } = entry - if (!tokensAndOwners && !tokens && chain !== 'solana') tokens = defaultTokens[chain] || [ADDRESSES.null] + const tokenLists = [...new Set([ + ...(Object.values(ADDRESSES[chain] || {})), + ...(defaultTokens[chain] || []), + ])] + + let { tokensAndOwners, owners, tokens, blacklistedTokens = [], fungibleAssets } = entry + + if (!tokensAndOwners && !tokens) tokens = tokenLists + + if (CHAIN_BLACKLISTS[chain]) { + blacklistedTokens = [ + ...new Set([...(blacklistedTokens || []), ...CHAIN_BLACKLISTS[chain]]), + ] + } const options = { ...entry, owners, tokens, chain, blacklistedTokens } if (chain === 'solana' || chain === 'eclipse') options.solOwners = owners if (chain === 'ton') options.onlyWhitelistedTokens = true if (chain === 'aptos' && Array.isArray(fungibleAssets)) options.fungibleAssets = fungibleAssets + if (chain === 'solana') { + const balances = await sumTokensExport(options)() + + if (Array.isArray(owners) && owners.length) { + const uniqOwners = [...new Set(owners)] + const BATCH = 50 + let totalStaked = 0 + for (let i = 0; i < uniqOwners.length; i += BATCH) { + const chunk = uniqOwners.slice(i, i + BATCH) + const parts = await Promise.all(chunk.map(addr => getStakedSol(addr))) + totalStaked += parts.reduce((a, b) => a + b, 0) + } + sdk.util.sumSingleBalance(balances, `solana:${ADDRESSES.solana.SOL}`, totalStaked) + } + + return balances + } + return sumTokensExport(options)() } } diff --git a/projects/helper/coreAssets.json b/projects/helper/coreAssets.json index d86a05616..c2cc4d560 100644 --- a/projects/helper/coreAssets.json +++ b/projects/helper/coreAssets.json @@ -626,7 +626,8 @@ "JupSOL": "jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v", "BNSOL": "BNso1VUJnh4zcfpZa6986Ea66P6TCp59hvtNJ8b1X85", "bbSOL": "Bybit2vBJGhPF52GBdNaQfUJ6ZpThSgHBobjWZpLPb4B", - "JitoSOL": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn" + "JitoSOL": "J1toso1uCk3RLmjorhTtrVwY9HJ7X8V9yYac6Y7kGCPn", + "PYUSD": "2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo" }, "soon": { "USDT": "742wcXVzkhNuEePAot7L3GvPseh93pvYFPgyHLX8mUy9",