Skip to content

Commit f4ae12b

Browse files
authored
Merge pull request #2197 from isle-labs/isle-finance
feature: Add Isle Finance adapter
2 parents abc6d20 + 5bd68b1 commit f4ae12b

File tree

1 file changed

+81
-0
lines changed

1 file changed

+81
-0
lines changed

src/adaptors/isle-finance/index.js

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
const { request } = require('graphql-request');
2+
3+
const GRAPH_URL = {
4+
Hedera: "https://api.goldsky.com/api/public/project_cmdfkhd2uxajf01vq022c7ion/subgraphs/isle-hedera-main/main/gn"
5+
};
6+
const POOL_URL_BASE= "https://app.isle.finance/pools/";
7+
const PROJECT_SLUG = "isle-finance";
8+
const gqlQueries = {
9+
poolsData: `
10+
query PoolsData {
11+
pools: markets(where: { isActive: true }) {
12+
address: id
13+
lockedAmount: inputTokenBalance
14+
borrowedAmount: variableBorrowedTokenBalance
15+
rates {
16+
rate
17+
side
18+
}
19+
inputToken {
20+
address: id
21+
decimals
22+
name
23+
symbol
24+
}
25+
}
26+
}
27+
`
28+
}
29+
30+
function roundTo2Decimals(num) {
31+
return Math.round(num * 100) / 100;
32+
}
33+
34+
function formatByDecimals(value, decimals = 0) {
35+
if (value == null || isNaN(value)) return 0;
36+
const num = Number(value) / 10 ** decimals;
37+
return roundTo2Decimals(num);
38+
}
39+
40+
function formatApy(value) {
41+
if (value == null || isNaN(value)) return 0;
42+
const num = Number(value);
43+
return roundTo2Decimals(num);
44+
}
45+
46+
const apy = async () => {
47+
const allPools = [];
48+
49+
for (const [chain, url] of Object.entries(GRAPH_URL)) {
50+
try {
51+
const { pools } = await request(url, gqlQueries.poolsData);
52+
if (!pools?.length) continue;
53+
54+
const chainPools = pools.map((p) => {
55+
const tokenAddr = p?.inputToken?.address || "";
56+
const tokenDecimals = p?.inputToken?.decimals ?? 0;
57+
return {
58+
pool: `${p?.address || ""}-${chain}`.toLowerCase(),
59+
chain,
60+
project: PROJECT_SLUG,
61+
symbol: p?.inputToken?.symbol || "",
62+
tvlUsd: formatByDecimals(p?.lockedAmount, tokenDecimals),
63+
totalBorrowUsd: formatByDecimals(p?.borrowedAmount, tokenDecimals),
64+
apyBase: formatApy(p?.rates?.find((r) => (r?.side || "") === "LENDER")?.rate),
65+
apyBaseBorrow: formatApy(p?.rates?.find((r) => (r?.side || "") === "BORROWER")?.rate),
66+
underlyingTokens: tokenAddr ? [tokenAddr] : [],
67+
url: `${POOL_URL_BASE}${p?.address ?? ""}/overview`,
68+
};
69+
});
70+
71+
allPools.push(...chainPools);
72+
} catch (err) {
73+
console.error(`${chain} error:`, err?.message ?? err);
74+
}
75+
}
76+
return allPools;
77+
};
78+
79+
module.exports = {
80+
apy,
81+
};

0 commit comments

Comments
 (0)