Adapter

ETH Burned

Queries metrics regarding the ETH burned by EIP-1559

Sub-Adapters 1

Preview and test each sub adapter.

ETH Burned (eth-burned)

Metadata

ID
eth-burned
name

"ETH Burned"

icon

Queries

Adapter Code

Check the entire code written for the Adapter.

Source code

Showing TS source.
1export const name = 'ETH Burned';
2export const version = '0.2.2';
3export const license = 'MIT';
4export const description = 'Queries metrics regarding the ETH burned by EIP-1559';
5
6// https://thegraph.com/explorer/subgraph?id=J2RS1vzH8LnfR4XV8kEv6ZNyRyWSbwjqQ4i1zdgsf1TB
7const subgraphId = 'J2RS1vzH8LnfR4XV8kEv6ZNyRyWSbwjqQ4i1zdgsf1TB';
8
9export function setup(sdk: Context) {
10  const getCurrentIndexedBlock = async () => {
11    const query = `{
12      _meta {
13        block {
14          number
15        }
16      }
17    }`;
18    const data = await sdk.graph.query({ subgraphId, query });
19    return parseInt(data._meta.block.number);
20  };
21
22  const burnedOnDateRange = async (field: string, dateStart: string, dateEnd: string): Promise<number> => {
23    const startOfDayBlock = await sdk.chainData.getBlockNumber(dateStart, 'ethereum');
24    const endOfDayBlock = await sdk.chainData.getBlockNumber(dateEnd, 'ethereum');
25
26    const query = `query ethBurned{
27        startOfDay: ethburned(id: "1", block: {number: ${startOfDayBlock}}) {
28          ${field}
29        }
30        endOfDay: ethburned(id: "1", block: {number: ${endOfDayBlock}}) {
31          ${field}
32        }
33      }`
34
35    const data = await sdk.graph.query({ subgraphId, query });
36
37    const ethBurned = parseFloat(data.endOfDay[field]) - parseFloat(data.startOfDay[field]);
38
39    return ethBurned;
40  }
41
42  const getBurnedOnDate = (field: string) =>
43    (date: string) => burnedOnDateRange(field, date, sdk.date.offsetDaysFormatted(date, 1));
44
45  const getBurnedOnDateRange = (field: string) =>
46    (dateStart: string, dateEnd: string) => burnedOnDateRange(field, dateStart, dateEnd);
47
48  const getBurnedTotal = (field: string) => async () => {
49    const query = `{
50      ethburned(id: "1") {
51        ${field}
52      }
53    }`;
54    const data = await sdk.graph.query({ subgraphId, query });
55
56    return parseFloat(data.ethburned[field]);
57  }
58
59  const getBurnedOnRecentBlocks = async (numBlocks: number) => {
60    const currentBlock = await getCurrentIndexedBlock();
61
62    const burnQueries = [];
63    for (let block = currentBlock - numBlocks; block <= currentBlock; block += 1) {
64      burnQueries.push(`block_${block}: ethburned(id: "1", block: { number: ${block} }) { burned }`);
65    }
66
67    const query = `{ ${burnQueries.join('\n')} }`;
68    const burnQuery = await sdk.graph.query({ subgraphId, query });
69
70    const dataQuery = sdk.graph.query(
71      'blocklytics/ethereum-blocks',
72      `query ($startBlock: Int!, $endBlock: Int!){
73        blocks(where: {number_gte: $startBlock, number_lte: $endBlock }, orderBy: number) {
74          number
75          timestamp
76        }
77      }`,
78      {
79        variables: {
80          startBlock: currentBlock - numBlocks,
81          endBlock: currentBlock,
82        },
83      }
84    );
85
86    const [result, dateResults] = await Promise.all([burnQuery, dataQuery]);
87
88    const burnedOnBlock: { block: number; burned: number; timestamp: number }[] = [];
89    for (let i = 0; i <= 30; i += 1) {
90      if (!dateResults.blocks[i]) {
91        break;
92      }
93
94      const block = currentBlock - 30 + i;
95
96      if (!result[`block_${block}`]) {
97        continue;
98      }
99      burnedOnBlock.push({
100        block,
101        burned: parseFloat(result[`block_${block}`].burned),
102        timestamp: parseInt(dateResults.blocks[i].timestamp),
103      });
104    }
105
106    return burnedOnBlock;
107  };
108
109  const getBurnedInRecentTimePeriod = async (period: string, numPeriods: number) => {
110    if (['minute', 'hour', 'day'].indexOf(period) === -1) {
111      throw new Error(`Invalid period ${period}`);
112    }
113
114    const date = new Date();
115    let periodLength: number;
116    if (period === 'day') {
117      date.setHours(0, 0, 0, 0);
118      periodLength = 24 * 60 * 60;
119    } else if (period === 'hour') {
120      date.setMinutes(0, 0, 0);
121      periodLength = 60 * 60;
122    } else {
123      // minute
124      date.setSeconds(0, 0);
125      periodLength = 60;
126    }
127
128    const blockQueries = [];
129    const timestamps = [];
130    for (let i = 0; i < numPeriods; i += 1) {
131      const timestamp = date.getTime() / 1000 - periodLength * i;
132      timestamps.push(timestamp);
133      blockQueries.push(`block_${i}: blocks(where: {
134        timestamp_gte: ${timestamp},
135        timestamp_lte: ${timestamp + 100}
136      }, orderBy: number, limit: 1) {
137        number
138      }`);
139    }
140    const blockResult = await sdk.graph.query(
141      'blocklytics/ethereum-blocks',
142      `{${blockQueries.join('\n')}}`
143    );
144
145    const blocks = [];
146    const burnQueries = [];
147    for (let i = 0; i < numPeriods; i += 1) {
148      if (blockResult[`block_${i}`].length === 0) {
149        blocks.push(0);
150        continue;
151      }
152
153      const blockNum = blockResult[`block_${i}`][0].number;
154      blocks.push(parseInt(blockNum));
155      burnQueries.push(`burned_${i}: ethburned(id:"1", block: { number: ${blockNum} }){ burned }`);
156    }
157
158    burnQueries.push('now: ethburned(id:"1") { burned }');
159    burnQueries.push('_meta { block { number } }');
160
161    const burnResult = await sdk.graph.query({ subgraphId, query: `{${burnQueries.join('\n')}}` });
162
163    const response = [
164      {
165        burned: parseFloat(burnResult.now.burned),
166        timestamp: Math.floor(Date.now() / 1000),
167        block: parseInt(burnResult._meta.block.number),
168      },
169    ];
170    for (let i = 0; i < numPeriods; i += 1) {
171      if (blocks[i] === 0) {
172        continue;
173      }
174
175      response.push({
176        burned: parseFloat(burnResult[`burned_${i}`]?.burned || '0'),
177        timestamp: timestamps[i],
178        block: blocks[i],
179      });
180    }
181
182    return response.reverse();
183  };
184
185  const getBurnedInRecentSeconds = (field: string) => async (seconds: number) => {
186    const start = new Date().getTime() - (seconds * 1000);
187    const startBlock = await sdk.chainData.getBlockNumber(start, 'ethereum');
188
189    const query = `query {
190      now: ethburned(id:"1") {
191        burned
192        burnedUSD
193      }
194      start: ethburned(id:"1", block: { number: ${startBlock} }) {
195        burned
196        burnedUSD
197      }
198    }`;
199
200    const result = await sdk.graph.query({ subgraphId, query });
201
202    if (!result.start) {
203      return parseFloat(result.now[field]);
204    }
205
206    return result.now[field] - result.start[field];
207  }
208
209  sdk.register({
210    id: 'eth-burned',
211    queries: {
212      tokensBurnedTotal: getBurnedTotal('burned'),
213      tokensBurnedTotalUSD: getBurnedTotal('burnedUSD'),
214      tokensBurnedOnDay: getBurnedOnDate('burned'),
215      tokensBurnedOnDayUSD: getBurnedOnDate('burnedUSD'),
216      tokensBurnedOnDateRange: getBurnedOnDateRange('burned'),
217      tokensBurnedOnDateRangeUSD: getBurnedOnDateRange('burnedUSD'),
218      tokensBurnedInRecentBlocks: getBurnedOnRecentBlocks,
219      tokensBurnedInRecentSeconds: getBurnedInRecentSeconds('burned'),
220      tokensBurnedInRecentSecondsUSD: getBurnedInRecentSeconds('burnedUSD'),
221      tokensBurnedInRecentTimePeriods: getBurnedInRecentTimePeriod,
222      currentIndexedBlock: getCurrentIndexedBlock,
223    },
224    metadata: {
225      name: 'ETH Burned',
226      icon: sdk.ipfs.getDataURILoader('QmedJLPy6R7x3dDEy2cfMd8gXbZm9e3vxvgBLXp3YZEHCy', 'image/svg+xml'),
227    },
228  })
229}
230

It's something off?

Report it to the discussion board on Discord, we will take care of it.

Adapter Info

Version

0.2.2

License

MIT

IPFS CID

QmQfmDBSfAQPnMqEqmrqkjt2wHc5rRu86YazagaFUHBYdx

CID (source)

QmXbfp6WDbj94yqMuoMSQsGFTg1hCED5ZFBaXkGe7fV14X

Collections

Author

mihal.eth