1- import { Chain } from "../../adapters/types" ;
21import { Adapter , FetchOptions } from "../../adapters/types" ;
32import { CHAIN } from "../../helpers/chains" ;
3+ import { httpGet , httpPost } from "../../utils/fetchURL" ;
44
55const FUEL_SUBGRAPH_URL = 'https://endpoint.sentio.xyz/1delta/fuel-subgraph/volume'
66const FUEL_SUBGRAPH_API_KEY = 'mHWELZ01Oo3BRfGb0WrhFvryge78baQVT'
77
8- const createFuelVolumeFetcher = ( ) => {
9- return async ( { startTimestamp, endTimestamp } : FetchOptions ) => {
10- return fetch ( FUEL_SUBGRAPH_URL , {
11- method : 'POST' ,
12- headers : {
13- 'api-key' : FUEL_SUBGRAPH_API_KEY ,
14- 'Content-Type' : 'application/json' ,
15- } ,
16- body : JSON . stringify ( {
17- "startTimestamp" : startTimestamp ,
18- "endTimestamp" : endTimestamp
19- } ) ,
20- } )
21- . then ( ( response ) => {
22- if ( ! response . ok ) {
23- throw new Error ( `HTTP error! Status: ${ response . status } ` )
24- }
25- return response . json ( ) ;
26- } )
27- . then ( ( result ) => {
28- const rows = result . syncSqlResponse . result ?. rows || [ ]
8+ const fetchFuelVolume = async ( options : FetchOptions ) => {
9+ const data = await httpPost (
10+ FUEL_SUBGRAPH_URL ,
11+ JSON . stringify ( {
12+ "startTimestamp" : options . startTimestamp ,
13+ "endTimestamp" : options . endTimestamp
14+ } ) , {
15+ headers : {
16+ 'api-key' : FUEL_SUBGRAPH_API_KEY ,
17+ 'Content-Type' : 'application/json' ,
18+ }
19+ } )
2920
30- const dailyVolume = rows . reduce ( ( acc : number , row ) => acc + Number ( row . volumeUsd ) , 0 )
21+ const dailyVolume = data . syncSqlResponse . result ?. rows . reduce ( ( acc : number , row : any ) => acc + Number ( row . volumeUsd ) , 0 )
3122
32- return {
33- dailyVolume,
34- }
35- } )
23+ return {
24+ dailyVolume,
3625 }
3726}
3827
39- const SUPPORTED_CHAIN_MAPPING : { [ chain : Chain ] : number } = {
40- [ CHAIN . MANTLE ] : 5000 ,
41- [ CHAIN . OPTIMISM ] : 10 ,
42- [ CHAIN . POLYGON ] : 137 ,
43- [ CHAIN . LINEA ] : 59144 ,
44- [ CHAIN . BSC ] : 56 ,
45- [ CHAIN . AVAX ] : 43114 ,
46- [ CHAIN . TAIKO ] : 167000 ,
47- [ CHAIN . BASE ] : 8453 ,
48- // [CHAIN.ARBITRUM]: 42161,
49- [ CHAIN . BLAST ] : 81457 ,
50- [ CHAIN . METIS ] : 1088 ,
51- [ CHAIN . XDAI ] : 100 ,
52- [ CHAIN . MODE ] : 34443 ,
53- [ CHAIN . HEMI ] : 43111 ,
54- [ CHAIN . SCROLL ] : 534352 ,
55- [ CHAIN . CORE ] : 1116 ,
56- [ CHAIN . SONIC ] : 146 ,
57- [ CHAIN . FANTOM ] : 250
28+ const chainConfig : Record < string , { chainId : number , start : string } > = {
29+ [ CHAIN . MANTLE ] : { chainId : 5000 , start : '2025-03-01' } ,
30+ [ CHAIN . OPTIMISM ] : { chainId : 10 , start : '2025-03-01' } ,
31+ [ CHAIN . POLYGON ] : { chainId : 137 , start : '2025-03-01' } ,
32+ [ CHAIN . LINEA ] : { chainId : 59144 , start : '2025-03-01' } ,
33+ [ CHAIN . BSC ] : { chainId : 56 , start : '2025-03-01' } ,
34+ [ CHAIN . AVAX ] : { chainId : 43114 , start : '2025-03-01' } ,
35+ [ CHAIN . TAIKO ] : { chainId : 167000 , start : '2025-03-01' } ,
36+ [ CHAIN . BASE ] : { chainId : 8453 , start : '2025-03-01' } ,
37+ [ CHAIN . ARBITRUM ] : { chainId : 42161 , start : '2025-03-01' } ,
38+ [ CHAIN . BLAST ] : { chainId : 81457 , start : '2025-03-01' } ,
39+ [ CHAIN . METIS ] : { chainId : 1088 , start : '2025-03-01' } ,
40+ [ CHAIN . XDAI ] : { chainId : 100 , start : '2025-03-01' } ,
41+ [ CHAIN . MODE ] : { chainId : 34443 , start : '2025-03-01' } ,
42+ [ CHAIN . HEMI ] : { chainId : 43111 , start : '2025-03-01' } ,
43+ [ CHAIN . SCROLL ] : { chainId : 534352 , start : '2025-03-01' } ,
44+ [ CHAIN . CORE ] : { chainId : 1116 , start : '2025-03-01' } ,
45+ [ CHAIN . SONIC ] : { chainId : 146 , start : '2025-03-01' } ,
46+ [ CHAIN . FANTOM ] : { chainId : 250 , start : '2025-03-01' } ,
47+ [ CHAIN . KLAYTN ] : { chainId : 8217 , start : '2025-10-21' } , // Kaia
48+ [ CHAIN . SONEIUM ] : { chainId : 1868 , start : '2025-10-21' } ,
49+ [ CHAIN . HYPERLIQUID ] : { chainId : 999 , start : '2025-10-21' } ,
50+ [ CHAIN . BERACHAIN ] : { chainId : 80094 , start : '2025-10-21' } ,
51+ [ CHAIN . CRONOS ] : { chainId : 25 , start : '2025-10-21' } ,
52+ [ CHAIN . XDC ] : { chainId : 50 , start : '2025-10-21' } ,
53+ [ CHAIN . UNICHAIN ] : { chainId : 130 , start : '2025-10-21' } ,
54+ [ CHAIN . KATANA ] : { chainId : 747474 , start : '2025-10-21' } ,
55+ [ CHAIN . ETHEREUM ] : { chainId : 1 , start : '2025-10-21' } ,
56+ [ CHAIN . TELOS ] : { chainId : 40 , start : '2025-10-21' } ,
57+ [ CHAIN . MORPH ] : { chainId : 2818 , start : '2025-10-21' } ,
58+ [ CHAIN . MANTA ] : { chainId : 169 , start : '2025-10-21' } ,
59+ [ CHAIN . PLASMA ] : { chainId : 9745 , start : '2025-10-21' } ,
60+ [ CHAIN . MOONBEAM ] : { chainId : 1284 , start : '2025-10-21' } ,
61+ [ CHAIN . FUEL ] : { chainId : 0 , start : '2025-01-20' }
5862}
5963
60- const getEVMVolumeAPI = ( chainId : number , fromBlock : number , toBlock : number ) =>
61- `https://volume.1delta.io/volume?chainId=${ chainId } &fromBlock=${ fromBlock } &toBlock=${ toBlock } `
62-
63- const createEVMVolumeFetcher = ( chain : string ) => {
64- return async ( { getFromBlock, getToBlock, api, createBalances } : FetchOptions ) => {
65- const dailyVolume = createBalances ( )
6664
67- const chainId : number | undefined = SUPPORTED_CHAIN_MAPPING [ chain ] ?? api . chainId
68- if ( ! chainId ) throw new Error ( `Chain ${ chain } is not supported` )
65+ const fetch = async ( options : FetchOptions ) => {
66+ const chain = options . chain as CHAIN ;
67+ const dailyVolume = options . createBalances ( )
68+ if ( chain === CHAIN . FUEL ) {
69+ return await fetchFuelVolume ( options )
70+ }
6971
70- const fromBlock = await getFromBlock ( )
71- const toBlock = await getToBlock ( )
72+ const fromBlock = await options . getFromBlock ( )
73+ const toBlock = await options . getToBlock ( )
7274
73- const response = await fetch ( getEVMVolumeAPI ( chainId , fromBlock , toBlock ) , {
74- method : 'GET' ,
75- headers : {
76- 'Content-Type' : 'application/json' ,
77- } ,
78- } )
75+ const url = `https://volume.1delta.io/volume?chainId=${ chainConfig [ chain ] . chainId } &fromBlock=${ fromBlock } &toBlock=${ toBlock } `
7976
80- if ( ! response . ok || response . status !== 200 ) {
81- // throw new Error(`HTTP error! Status: ${response.status}`)
82- return { }
77+ const volumeByAsset = await httpGet ( url , {
78+ headers : {
79+ 'Content-Type' : 'application/json' ,
8380 }
81+ } )
8482
85- const volumeByAsset = await response . json ( )
86-
87- const asssets = Object . keys ( volumeByAsset )
88- const volumes = Object . values ( volumeByAsset )
83+ Object . entries ( volumeByAsset ) . forEach ( ( [ asset , volume ] ) => {
84+ dailyVolume . add ( asset , volume )
85+ } )
8986
90- dailyVolume . add ( asssets , volumes )
91-
92- return {
93- dailyVolume,
94- }
95- }
87+ return { dailyVolume }
9688}
9789
9890const adapter : Adapter = {
9991 version : 2 ,
100- adapter : {
101- ...Object . fromEntries (
102- Object . keys ( SUPPORTED_CHAIN_MAPPING ) . map ( chain => [
103- chain ,
104- { fetch : createEVMVolumeFetcher ( chain ) , start : '2025-03-01' }
105- ] )
106- ) ,
107- [ CHAIN . FUEL ] : { fetch : createFuelVolumeFetcher ( ) , start : '2025-01-20' }
108- } ,
92+ fetch,
93+ adapter : chainConfig
10994}
11095
11196export default adapter ;
0 commit comments