mirror of
https://github.com/alexgo-io/DefiLlama-Adapters.git
synced 2026-01-12 16:53:02 +08:00
* ic * revert package lock change * bump version --------- Co-authored-by: 0xngmi <0xngmi@protonmail.com>
135 lines
4.3 KiB
JavaScript
135 lines
4.3 KiB
JavaScript
const sdk = require("@defillama/sdk");
|
|
const sdk = require('@defillama/sdk');
|
|
const { sumTokens2, } = require('../helper/unwrapLPs');
|
|
const { cachedGraphQuery } = require('../helper/cache');
|
|
|
|
const PRIME_MASTER_NETWORK = 'moonbeam';
|
|
|
|
const PRIME_SATELLITE_NETWORKS = {
|
|
moonbeam: 1284,
|
|
avax: 43114,
|
|
arbitrum: 42161,
|
|
ethereum: 1,
|
|
bsc: 56,
|
|
polygon: 137,
|
|
base: 8453,
|
|
optimism: 10,
|
|
celo: 42220,
|
|
// filecoin: 314
|
|
};
|
|
|
|
const primeSubgraphUrl = sdk.graph.modifyEndpoint('6LrvPGTZeMZfEQh4p9DvDBBv4G8cjhLs4v3mdiUycERp');
|
|
|
|
const primeMarketsQuery = `{
|
|
markets { address chainId }
|
|
}`;
|
|
|
|
const MASTER_VIEW_CONTRACT = {
|
|
v1_4_6: {
|
|
address: '0x47ecFB57deD0160d66103A6A201C5f30f7CC7d13',
|
|
abi: {
|
|
calculateAssetTVL: 'function calculateRawAssetTVL(uint256 chainId, address pToken) view returns (uint256)'
|
|
}
|
|
}
|
|
};
|
|
|
|
const PRIME_CONTRACTS = {
|
|
MASTER_VIEW_v1_4_6: {
|
|
address: '0x47ecFB57deD0160d66103A6A201C5f30f7CC7d13',
|
|
abi: {
|
|
calculateAssetTVL: 'function calculateRawAssetTVL(uint256 chainId, address pToken) view returns (uint256)'
|
|
}
|
|
},
|
|
MASTER_VIEW_v1_10_2: {
|
|
address: '0x30095B6616eB637B72f86E9613cdAcF18C11ED8d',
|
|
abi: {
|
|
getCollateralFactors: 'function getCollateralFactors(address[] memory underlyings, uint256[] memory chainIds) view returns (uint256[] memory collateralFactors)',
|
|
}
|
|
},
|
|
IRM_ROUTER_v1_10_2: {
|
|
address: '0xd7af46089C5ED25871b770F18a2Ff1C07929abfa',
|
|
abi: {
|
|
borrowInterestRatePerBlock: 'function borrowInterestRatePerBlock(address loanAsset, uint256 loanAssetChainId) view returns (uint256)',
|
|
}
|
|
},
|
|
PTOKEN_v1_10_2: {
|
|
abi: {
|
|
underlying: 'function underlying() view returns (address)'
|
|
}
|
|
},
|
|
MASTER_VIEW_v1_10_3: {
|
|
address: '0x9Ee26206Bc1143668aD56498b8C7A621bFa27c00',
|
|
abi: {
|
|
supplierInterestRateWithoutTuple: 'function supplierInterestRateWithoutTuple(uint256 chainId, address loanAsset) view returns (uint256 rate, uint256 factor)'
|
|
}
|
|
},
|
|
};
|
|
|
|
async function getMarketsForCurrentNetwork(api) {
|
|
const { markets: primeMarketsData } = await cachedGraphQuery('prime-protocol', primeSubgraphUrl, primeMarketsQuery)
|
|
|
|
const markets = [];
|
|
|
|
for (let m = 0; m < primeMarketsData.length; m++) {
|
|
const market = primeMarketsData[m];
|
|
const marketAddress = market.address;
|
|
const marketChainId = market.chainId;
|
|
|
|
if (PRIME_SATELLITE_NETWORKS[api.chain] == marketChainId) {
|
|
const underlyingAddress = (
|
|
await api.multiCall({
|
|
abi: PRIME_CONTRACTS.PTOKEN_v1_10_2.abi.underlying,
|
|
calls: [marketAddress].map((ma) => ({
|
|
target: ma,
|
|
})),
|
|
permitFailure: true,
|
|
chain: api.chain,
|
|
})
|
|
)[0];
|
|
|
|
markets.push({
|
|
pTokenMarketAddress: marketAddress,
|
|
pTokenUnderlyingAddress: underlyingAddress
|
|
});
|
|
}
|
|
}
|
|
|
|
return markets;
|
|
}
|
|
|
|
async function borrowed(api) {
|
|
const moonbeamApi = new sdk.ChainApi({ chain: PRIME_MASTER_NETWORK });
|
|
|
|
const markets = await getMarketsForCurrentNetwork(api);
|
|
|
|
let uDecimals = await api.multiCall({ abi: 'erc20:decimals', calls: markets.map(market => market.pTokenUnderlyingAddress), permitFailure: true, })
|
|
uDecimals = uDecimals.map(i => i ?? 18)
|
|
|
|
let rawTvls = await moonbeamApi.multiCall({
|
|
abi: MASTER_VIEW_CONTRACT.v1_4_6.abi.calculateAssetTVL,
|
|
target: MASTER_VIEW_CONTRACT.v1_4_6.address,
|
|
calls: markets.map(i => ({ params: [PRIME_SATELLITE_NETWORKS[api.chain], i.pTokenMarketAddress] })),
|
|
})
|
|
|
|
rawTvls.forEach((v, i) => api.add(markets[i].pTokenUnderlyingAddress, v * (10 ** uDecimals[i] / 1e18)))
|
|
const tvlBal = await sumTokens2({ balances: {}, api, tokensAndOwners: markets.map(market => [market.pTokenUnderlyingAddress, market.pTokenMarketAddress]) })
|
|
Object.entries(tvlBal).forEach(([token, bal]) => {
|
|
api.add(token, bal * -1, { skipChain: true })
|
|
})
|
|
}
|
|
|
|
async function tvl(api) {
|
|
const markets = await getMarketsForCurrentNetwork(api);
|
|
|
|
return sumTokens2({ api, tokensAndOwners: markets.map(market => [market.pTokenUnderlyingAddress, market.pTokenMarketAddress]) })
|
|
}
|
|
|
|
module.exports = {
|
|
timetravel: false,
|
|
methodology: 'Adds the deposits of each market to the borrows that were not redeposited into that market.',
|
|
};
|
|
|
|
Object.keys(PRIME_SATELLITE_NETWORKS).forEach(primeSatelliteNetwork => {
|
|
module.exports[primeSatelliteNetwork] = { tvl, borrowed, }
|
|
})
|