1+ const axios = require ( 'axios' ) ;
2+ const { request, gql } = require ( 'graphql-request' ) ;
3+ const utils = require ( '../utils' ) ;
4+
5+ const RAM = '0x13A466998Ce03Db73aBc2d4DF3bBD845Ed1f28E7' ;
6+ const PROJECT = 'ramses-hl' ;
7+ const CHAIN = 'hyperliquid' ;
8+ const SUBGRAPH = 'https://hyperevm.kingdomsubgraph.com/subgraphs/name/ramses-v3-pruned/' ;
9+
10+ const poolsQuery = gql `
11+ query getPools($first: Int!, $skip: Int!) {
12+ clPools(
13+ first: $first
14+ skip: $skip
15+ orderBy: totalValueLockedUSD
16+ orderDirection: desc
17+ where: { gauge_not: null }
18+ ) {
19+ id
20+ token0 {
21+ id
22+ symbol
23+ }
24+ token1 {
25+ id
26+ symbol
27+ }
28+ feeTier
29+ tickSpacing
30+ totalValueLockedUSD
31+ gauge {
32+ id
33+ }
34+ poolDayData(first: 7, orderBy: startOfDay, orderDirection: desc) {
35+ volumeUSD
36+ }
37+ }
38+ }
39+ ` ;
40+
41+ async function fetchAllPools ( ) {
42+ let allPools = [ ] ;
43+ let skip = 0 ;
44+ const first = 1000 ;
45+
46+ while ( true ) {
47+ const poolsData = await request ( SUBGRAPH , poolsQuery , { first, skip } ) ;
48+ const pools = poolsData . clPools ;
49+
50+ if ( pools . length === 0 ) break ;
51+
52+ allPools = allPools . concat ( pools ) ;
53+
54+ if ( pools . length < first ) break ;
55+
56+ skip += first ;
57+ }
58+
59+ return allPools ;
60+ }
61+
62+ async function apy ( ) {
63+ try {
64+ const pools = await fetchAllPools ( ) ;
65+
66+ let ramsesPools = [ ] ;
67+ try {
68+ const ramsesApiData = await axios . get ( 'https://api2.ramses.xyz/all-pools' ) ;
69+ if ( ramsesApiData . data && Array . isArray ( ramsesApiData . data . pools ) ) {
70+ ramsesPools = ramsesApiData . data . pools ;
71+ }
72+ } catch ( error ) {
73+ console . error ( 'Failed to fetch Ramses API data:' , error . message ) ;
74+ }
75+
76+ const aprMap = { } ;
77+ for ( const pool of ramsesPools ) {
78+ if ( pool . id ) {
79+ aprMap [ pool . id . toLowerCase ( ) ] = {
80+ lpApr : Number ( pool . lpApr ) || 0
81+ } ;
82+ }
83+ }
84+
85+ const results = [ ] ;
86+
87+ for ( const pool of pools ) {
88+ const tvlUsd = Number ( pool . totalValueLockedUSD ) || 0 ;
89+
90+ if ( ! pool . gauge ?. id ) continue ;
91+
92+ const poolAddress = pool . id . toLowerCase ( ) ;
93+ const apiData = aprMap [ poolAddress ] ;
94+
95+ if ( ! apiData ) continue ;
96+
97+ const apyBase = 0 ;
98+ let apyReward = 0 ;
99+ const tickSpacing = parseInt ( pool . tickSpacing ) ;
100+
101+ const apiPool = ramsesPools . find ( p => p . id . toLowerCase ( ) === poolAddress ) ;
102+ if ( apiPool && apiPool . recommendedRanges ) {
103+ if ( tickSpacing === 1 || tickSpacing === 5 ) {
104+ const wideRange = apiPool . recommendedRanges . find ( range => range . name === 'Wide' ) ;
105+ apyReward = wideRange ? wideRange . lpApr : apiData . lpApr || 0 ;
106+ } else {
107+ const narrowRange = apiPool . recommendedRanges . find ( range => range . name === 'Narrow' ) ;
108+ apyReward = narrowRange ? narrowRange . lpApr : apiData . lpApr || 0 ;
109+ }
110+ } else {
111+ apyReward = apiData . lpApr || 0 ;
112+ }
113+
114+ results . push ( {
115+ pool : `${ poolAddress } -${ utils . formatChain ( CHAIN ) } ` . toLowerCase ( ) ,
116+ chain : utils . formatChain ( CHAIN ) ,
117+ project : PROJECT ,
118+ poolMeta : `CL ${ ( Number ( pool . feeTier ) / 10000 ) . toFixed ( 2 ) } %` ,
119+ symbol : `${ pool . token0 . symbol } -${ pool . token1 . symbol } ` ,
120+ tvlUsd,
121+ apyBase,
122+ apyBase7d : 0 ,
123+ apyReward,
124+ rewardTokens : apyReward > 0 ? [ RAM ] : [ ] ,
125+ underlyingTokens : [
126+ pool . token0 . id . toLowerCase ( ) ,
127+ pool . token1 . id . toLowerCase ( )
128+ ] ,
129+ url : `https://www.ramses.xyz/liquidity/${ poolAddress } ` ,
130+ volumeUsd1d : pool . poolDayData ?. [ 0 ] ?. volumeUSD
131+ ? Number ( pool . poolDayData [ 0 ] . volumeUSD )
132+ : 0 ,
133+ volumeUsd7d : pool . poolDayData
134+ ? pool . poolDayData . reduce ( ( sum , day ) => sum + Number ( day . volumeUSD || 0 ) , 0 )
135+ : 0 ,
136+ } ) ;
137+ }
138+
139+ return results . filter ( ( p ) => utils . keepFinite ( p ) ) ;
140+
141+ } catch ( error ) {
142+ console . error ( 'Error fetching Ramses CL data:' , error ) ;
143+ return [ ] ;
144+ }
145+ }
146+
147+ module . exports = {
148+ timetravel : false ,
149+ apy : apy ,
150+ } ;
0 commit comments