1
- import { Adapter , FetchOptions , FetchResultFees } from "../adapters/types" ;
1
+ import { Adapter , FetchOptions , } from "../adapters/types" ;
2
2
import { CHAIN } from "../helpers/chains" ;
3
- import { getTokenDiff } from "../helpers/token " ;
3
+ import { queryDuneSql } from "../helpers/dune " ;
4
4
5
5
const rainbowRouter = '0x00000000009726632680fb29d3f7a9734e3010e2'
6
6
7
- const fetch : any = async ( timestamp : number , _ : any , options : FetchOptions ) => {
8
- const { createBalances, getLogs, } = options
9
- const dailyFees = createBalances ( )
10
-
11
- const ethLogs = await getLogs ( { target : rainbowRouter , eventAbi : 'event EthWithdrawn(address indexed target, uint256 amount)' } )
12
- const tokenLogs = await getLogs ( { target : rainbowRouter , eventAbi : 'event TokenWithdrawn(address indexed token, address indexed target, uint256 amount)' } )
13
- let extraTokens = new Set < string > ( )
7
+ const RainBowRouter = {
8
+ [ CHAIN . ETHEREUM ] : rainbowRouter ,
9
+ [ CHAIN . OPTIMISM ] : rainbowRouter ,
10
+ [ CHAIN . BSC ] : rainbowRouter ,
11
+ [ CHAIN . UNICHAIN ] : '0x2a0332E28913A06Fa924d40A3E2160f763010417' ,
12
+ [ CHAIN . POLYGON ] : rainbowRouter ,
13
+ [ CHAIN . BASE ] : rainbowRouter ,
14
+ [ CHAIN . ARBITRUM ] : rainbowRouter ,
15
+ [ CHAIN . AVAX ] : rainbowRouter ,
16
+ [ CHAIN . INK ] : rainbowRouter ,
17
+ [ CHAIN . BERACHAIN ] : rainbowRouter ,
18
+ [ CHAIN . BLAST ] : rainbowRouter ,
19
+ [ CHAIN . ZORA ] : '0xA61550E9ddD2797E16489db09343162BE98d9483' ,
20
+ [ CHAIN . APECHAIN ] : rainbowRouter ,
21
+ [ CHAIN . GRAVITY ] : rainbowRouter ,
22
+ }
14
23
15
- ethLogs . forEach ( ( log : any ) => dailyFees . addGasToken ( log . amount ) )
16
- tokenLogs . forEach ( ( log : any ) => {
17
- extraTokens . add ( log . token )
18
- dailyFees . add ( log . token , log . amount )
19
- } )
24
+ // Prefetch function that will run once before any fetch calls
25
+ // don't do console.log(options) as there is circular dependency in ChainApi
26
+ const prefetch = async ( options : FetchOptions ) => {
27
+ return queryDuneSql ( options , `
28
+ SELECT
29
+ CASE
30
+ WHEN blockchain = 'bnb' THEN 'bsc'
31
+ WHEN blockchain = 'avalanche_c' THEN 'avax'
32
+ ELSE blockchain
33
+ END as chain,
34
+ sum(amount_usd) as volume,
35
+ sum(amount_usd * 0.0085) as fees
36
+ FROM dex.trades
37
+ WHERE (
38
+ (tx_to = 0x00000000009726632680fb29d3f7a9734e3010e2 AND blockchain NOT IN ('unichain', 'zora'))
39
+ OR
40
+ (tx_to = 0x2a0332E28913A06Fa924d40A3E2160f763010417 AND blockchain = 'unichain')
41
+ OR
42
+ (tx_to = 0xA61550E9ddD2797E16489db09343162BE98d9483 AND blockchain = 'zora')
43
+ )
44
+ AND block_time >= from_unixtime(${ options . startTimestamp } )
45
+ AND block_time <= from_unixtime(${ options . endTimestamp } )
46
+ GROUP BY 1
47
+ ` ) ;
48
+ } ;
20
49
21
- await getTokenDiff ( { options, target : rainbowRouter , balances : dailyFees , extraTokens : [ ...extraTokens ] , } )
22
- dailyFees . removeNegativeBalances ( )
50
+ const fetch : any = async ( timestamp : number , _ : any , options : FetchOptions ) => {
51
+ const results = options . preFetchedResults || [ ] ;
52
+
53
+ let dailyFees = 0 ;
54
+ for ( const result of results ) {
55
+ if ( result . chain === options . chain ) {
56
+ dailyFees = result . fees ;
57
+ break ;
58
+ }
59
+ }
23
60
24
61
return {
25
62
timestamp,
@@ -37,16 +74,10 @@ const methodology = {
37
74
const chainAdapter = { fetch, start : '2023-01-01' , meta : { methodology } }
38
75
39
76
const adapter : Adapter = {
40
- adapter : {
41
- [ CHAIN . ETHEREUM ] : chainAdapter ,
42
- [ CHAIN . OPTIMISM ] : chainAdapter ,
43
- [ CHAIN . ARBITRUM ] : chainAdapter ,
44
- [ CHAIN . POLYGON ] : chainAdapter ,
45
- [ CHAIN . BASE ] : chainAdapter ,
46
- [ CHAIN . BSC ] : chainAdapter ,
47
- [ CHAIN . AVAX ] : chainAdapter ,
48
- } ,
49
-
77
+ adapter : Object . fromEntries ( Object . entries ( RainBowRouter ) . map (
78
+ ( [ chain ] ) => [ chain , chainAdapter ]
79
+ ) ) ,
80
+ prefetch : prefetch ,
50
81
}
51
82
52
83
export default adapter ;
0 commit comments