/
allbridge-classic.ts
99 lines (90 loc) · 3.06 KB
/
allbridge-classic.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { CHAIN } from "../helpers/chains";
import type { Adapter, BaseAdapter, FetchResultFees, IJSON } from '../adapters/types';
import type { Chain } from '@defillama/sdk/build/general';
import fetchURL from '../utils/fetchURL';
interface ChainData {
id: string;
feeCollected?: number;
}
const getFees = async (chainCode: string, fromDate: string, toDate: string): Promise<number> => {
const url = `https://stats.a11bd.net/aggregated?dateFrom=${fromDate}&dateTo=${toDate}`;
const responseBody = (await fetchURL(url));
const chainData = responseBody.data.chains
.filter((d: ChainData) => d.id === chainCode)
.pop();
return chainData?.feeCollected ?? 0;
}
const getFeesFunction = (chain: Chain) => {
return async (timestamp: number): Promise<FetchResultFees> => {
const chainCode = chainCodeMap[chain];
const dateString = formatTimestampAsIsoDate(timestamp);
const dailyFees = await getFees(chainCode, dateString, dateString);
const dailyRevenue = dailyFees * 0.2;
const dailySupplySideRevenue = dailyFees * 0.8;
return {
timestamp,
dailyFees: dailyFees !== undefined ? String(dailyFees) : undefined,
dailyProtocolRevenue: dailyRevenue !== undefined ? String(dailyRevenue) : undefined,
dailySupplySideRevenue: dailySupplySideRevenue !== undefined ? String(dailySupplySideRevenue) : undefined,
} as FetchResultFees;
}
}
function formatTimestampAsIsoDate(timestamp: number) {
return new Date(timestamp * 1000).toISOString().split("T")[0];
}
const chainCodeMap: {[key: Chain]: string} = {
[CHAIN.ETHEREUM]: "ETH",
[CHAIN.BSC]: "BSC",
[CHAIN.TERRA]: "TRA",
[CHAIN.AURORA]: "AURO",
[CHAIN.POLYGON]: "POL",
[CHAIN.HECO]: "HECO",
[CHAIN.CELO]: "CELO",
[CHAIN.AVAX]: "AVA",
[CHAIN.FANTOM]: "FTM",
[CHAIN.FUSE]: "FUSE",
[CHAIN.SOLANA]: "SOL",
[CHAIN.NEAR]: "NEAR",
[CHAIN.HARMONY]: "HRM",
[CHAIN.TEZOS]: "TEZ",
[CHAIN.KLAYTN]: "KLAY",
[CHAIN.WAVES]: "WAVE",
[CHAIN.STELLAR]: "XLM",
[CHAIN.STACKS]: "STKS",
}
const startTimes = {
[CHAIN.ETHEREUM]: 1636761600,
[CHAIN.BSC]: 1636761600,
[CHAIN.TERRA]: 1639008000,
[CHAIN.AURORA]: 1639440000,
[CHAIN.POLYGON]: 1636502400,
[CHAIN.HECO]: 1636761600,
[CHAIN.CELO]: 1636761600,
[CHAIN.AVAX]: 1636761600,
[CHAIN.FANTOM]: 1637452800,
[CHAIN.FUSE]: 1640995200,
[CHAIN.SOLANA]: 1636502400,
[CHAIN.NEAR]: 1643673600,
[CHAIN.HARMONY]: 1640995200,
[CHAIN.TEZOS]: 1654387200,
[CHAIN.KLAYTN]: 1660521600,
[CHAIN.WAVES]: 1663200000,
[CHAIN.STELLAR]: 1672358400,
[CHAIN.STACKS]: 1690416000,
} as IJSON<number>;
const methodology = {
Fees: "Users pay bridge fee for each transfer on the source chain.",
ProtocolRevenue: "Protocol receives 20% of the collected bridge fee.",
SupplySideRevenue: "80% of the collected bridge fee is used for rewards to the stakers",
};
const adapter: Adapter = {
adapter: Object.keys(chainCodeMap).reduce((acc, chain) => {
acc[chain] = {
fetch: getFeesFunction(chain),
meta: { methodology },
start: startTimes[chain],
};
return acc;
}, {} as BaseAdapter)
}
export default adapter;