|
| 1 | +import { Adapter, FetchOptions } from '../../adapters/types'; |
| 2 | +import { httpGet } from '../../utils/fetchURL'; |
| 3 | +import { CHAIN } from '../../helpers/chains'; |
| 4 | + |
| 5 | +const RangoChains: Record<string, string> = { |
| 6 | + [CHAIN.ETHEREUM]: 'ETH', |
| 7 | + [CHAIN.SOLANA]: 'SOLANA', |
| 8 | + [CHAIN.BSC]: 'BSC', |
| 9 | + [CHAIN.SCROLL]: 'SCROLL', |
| 10 | + [CHAIN.BASE]: 'BASE', |
| 11 | + [CHAIN.BITCOIN]: 'BTC', |
| 12 | + [CHAIN.ARBITRUM]: 'ARBITRUM', |
| 13 | + [CHAIN.POLYGON]: 'POLYGON', |
| 14 | + [CHAIN.OPTIMISM]: 'OPTIMISM', |
| 15 | + [CHAIN.LINEA]: 'LINEA', |
| 16 | + [CHAIN.CELO]: 'CELO', |
| 17 | + [CHAIN.AVAX]: 'AVAX_CCHAIN', |
| 18 | + [CHAIN.ERA]: 'ZKSYNC', |
| 19 | + [CHAIN.MODE]: 'MODE', |
| 20 | + [CHAIN.TRON]: 'TRON', |
| 21 | + [CHAIN.ZORA]: 'ZORA', |
| 22 | + [CHAIN.BLAST]: 'BLAST', |
| 23 | + [CHAIN.OSMOSIS]: 'OSMOSIS', |
| 24 | + [CHAIN.COSMOS]: 'COSMOS', |
| 25 | + [CHAIN.FANTOM]: 'FANTOM', |
| 26 | + [CHAIN.MOONRIVER]: 'MOONRIVER', |
| 27 | + [CHAIN.TAIKO]: 'TAIKO', |
| 28 | + [CHAIN.STARKNET]: 'STARKNET', |
| 29 | + [CHAIN.POLYGON_ZKEVM]: 'POLYGONZK', |
| 30 | + [CHAIN.SUI]: 'SUI', |
| 31 | + [CHAIN.CRONOS]: 'CRONOS', |
| 32 | + [CHAIN.NOBLE]: 'NOBLE', |
| 33 | + [CHAIN.BOBA]: 'BOBA', |
| 34 | + [CHAIN.THORCHAIN]: 'THOR', |
| 35 | + [CHAIN.FUSE]: 'FUSE', |
| 36 | + [CHAIN.XDAI]: 'GNOSIS', |
| 37 | + [CHAIN.HARMONY]: 'HARMONY', |
| 38 | + [CHAIN.MOONBEAM]: 'MOONBEAM', |
| 39 | + [CHAIN.TERRA]: 'TERRA', |
| 40 | + [CHAIN.SONIC]: 'SONIC', |
| 41 | + [CHAIN.TON]: 'TON', |
| 42 | + [CHAIN.BERACHAIN]: 'BERACHAIN', |
| 43 | + [CHAIN.AURORA]: 'AURORA', |
| 44 | +}; |
| 45 | + |
| 46 | +const fetch: any = async (timestamp: number, _: any, options: FetchOptions) => { |
| 47 | + const prefetchData = options.preFetchedResults as Record<string, any[]>; |
| 48 | + const chainCode = RangoChains[options.chain]; |
| 49 | + const statsForChain = prefetchData[chainCode] || []; |
| 50 | + |
| 51 | + const date = new Date(timestamp * 1000).toISOString().split('T')[0]; |
| 52 | + |
| 53 | + const statEntry = statsForChain.find(item => { |
| 54 | + const itemDate = item.date.split('T')[0]; |
| 55 | + return itemDate === date; |
| 56 | + }); |
| 57 | + |
| 58 | + return { |
| 59 | + dailyVolume: Number(statEntry?.volume || 0) |
| 60 | + } |
| 61 | +} |
| 62 | + |
| 63 | +const prefetch = async (_: FetchOptions) => { |
| 64 | + const API_KEY = '4a624ab5-16ff-4f96-90b7-ab00ddfc342c' |
| 65 | + const DAYS = 10000 |
| 66 | + const BREAKDOWN = 'SOURCE' |
| 67 | + |
| 68 | + // fire off one request per chain |
| 69 | + const entries = await Promise.all( |
| 70 | + Object.values(RangoChains).map(chainCode => |
| 71 | + httpGet( |
| 72 | + `https://api.rango.exchange/scanner/summary/daily` + |
| 73 | + `?days=${DAYS}` + |
| 74 | + `&breakDownBy=${BREAKDOWN}` + |
| 75 | + `&apiKey=${API_KEY}` + |
| 76 | + `&source=${chainCode}` + |
| 77 | + `&destination=${chainCode}` |
| 78 | + ).then(response => [chainCode, response.stats]) |
| 79 | + ) |
| 80 | + ); |
| 81 | + |
| 82 | + return Object.fromEntries(entries); |
| 83 | +} |
| 84 | + |
| 85 | + |
| 86 | +const chainAdapter = { fetch, start: '2021-08-04' } |
| 87 | + |
| 88 | +const adapter: Adapter = { |
| 89 | + adapter: Object.fromEntries(Object.entries(RangoChains).map( |
| 90 | + ([chain]) => [chain, chainAdapter] |
| 91 | + )), |
| 92 | + prefetch: prefetch, |
| 93 | +} |
| 94 | + |
| 95 | +export default adapter; |
0 commit comments