Skip to content

Commit 7fc315f

Browse files
Add new chains to 1delta adapter #4551 (#4557)
* add new evm chains * fix start date for new chains * refactor * refactor adapter * handle undefined * Fix fuel chain * refactor --------- Co-authored-by: caglavol <[email protected]>
1 parent 3e3b43b commit 7fc315f

File tree

1 file changed

+69
-84
lines changed

1 file changed

+69
-84
lines changed

aggregators/1delta/index.ts

Lines changed: 69 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -1,111 +1,96 @@
1-
import { Chain } from "../../adapters/types";
21
import { Adapter, FetchOptions } from "../../adapters/types";
32
import { CHAIN } from "../../helpers/chains";
3+
import { httpGet, httpPost } from "../../utils/fetchURL";
44

55
const FUEL_SUBGRAPH_URL = 'https://endpoint.sentio.xyz/1delta/fuel-subgraph/volume'
66
const 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

9890
const 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

11196
export default adapter;

0 commit comments

Comments
 (0)