Files
DefiLlama-Adapters/projects/prime-protocol/index.js
slasher125 102433e7a7 graphql-migration (#10635)
* ic

* revert package lock change

* bump version

---------

Co-authored-by: 0xngmi <0xngmi@protonmail.com>
2024-06-13 22:50:55 +05:30

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, }
})