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