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.1';
3export const license = 'MIT';
4
5const SUBGRAPH = 'dmihal/eth-burned';
6
7export function setup(sdk: Context) {
8  const getCurrentIndexedBlock = async () => {
9    const data = await sdk.graph.query(SUBGRAPH, `{
10      _meta {
11        block {
12          number
13        }
14      }
15    }`);
16    return parseInt(data._meta.block.number);
17  };
18
19  const burnedOnDateRange = async (field: string, dateStart: string, dateEnd: string): Promise<number> => {
20    const startOfDayBlock = await sdk.chainData.getBlockNumber(dateStart, 'ethereum');
21    const endOfDayBlock = await sdk.chainData.getBlockNumber(dateEnd, 'ethereum');
22
23    const variables = {
24      startOfDay: startOfDayBlock,
25      endOfDay: endOfDayBlock,
26    };
27
28    const query = `query ethBurned($startOfDay: Int!, $endOfDay: Int!){
29        startOfDay: ethburned(id: "1", block: {number: $startOfDay}) {
30          ${field}
31        }
32        endOfDay: ethburned(id: "1", block: {number: $endOfDay}) {
33          ${field}
34        }
35      }`
36
37    const data = await sdk.graph.query(SUBGRAPH, query, { variables });
38
39    const ethBurned = parseFloat(data.endOfDay[field]) - parseFloat(data.startOfDay[field]);
40
41    return ethBurned;
42  }
43
44  const getBurnedOnDate = (field: string) =>
45    (date: string) => burnedOnDateRange(field, date, sdk.date.offsetDaysFormatted(date, 1));
46
47  const getBurnedOnDateRange = (field: string) =>
48    (dateStart: string, dateEnd: string) => burnedOnDateRange(field, dateStart, dateEnd);
49
50  const getBurnedTotal = (field: string) => async () => {
51    const data = await sdk.graph.query(SUBGRAPH, `{
52      ethburned(id: "1") {
53        ${field}
54      }
55    }`);
56
57    return parseFloat(data.ethburned[field]);
58  }
59
60  const getBurnedOnRecentBlocks = async (numBlocks: number) => {
61    const currentBlock = await getCurrentIndexedBlock();
62
63    const burnQueries = [];
64    for (let block = currentBlock - numBlocks; block <= currentBlock; block += 1) {
65      burnQueries.push(`block_${block}: ethburned(id: "1", block: { number: ${block} }) { burned }`);
66    }
67
68    const burnQuery = sdk.graph.query(SUBGRAPH, `{${burnQueries.join('\n')}}`);
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(SUBGRAPH, `{${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 result = await sdk.graph.query(
190      SUBGRAPH,
191      `query ($startBlock: Int!){
192      now: ethburned(id:"1") {
193        burned
194        burnedUSD
195      }
196      start: ethburned(id:"1", block: { number: $startBlock }) {
197        burned
198        burnedUSD
199      }
200    }`,
201      {
202        variables: { startBlock },
203      }
204    );
205
206    if (!result.start) {
207      return parseFloat(result.now[field]);
208    }
209
210    return result.now[field] - result.start[field];
211  }
212
213  sdk.register({
214    id: 'eth-burned',
215    queries: {
216      tokensBurnedTotal: getBurnedTotal('burned'),
217      tokensBurnedTotalUSD: getBurnedTotal('burnedUSD'),
218      tokensBurnedOnDay: getBurnedOnDate('burned'),
219      tokensBurnedOnDayUSD: getBurnedOnDate('burnedUSD'),
220      tokensBurnedOnDateRange: getBurnedOnDateRange('burned'),
221      tokensBurnedOnDateRangeUSD: getBurnedOnDateRange('burnedUSD'),
222      tokensBurnedInRecentBlocks: getBurnedOnRecentBlocks,
223      tokensBurnedInRecentSeconds: getBurnedInRecentSeconds('burned'),
224      tokensBurnedInRecentSecondsUSD: getBurnedInRecentSeconds('burnedUSD'),
225      tokensBurnedInRecentTimePeriods: getBurnedInRecentTimePeriod,
226      currentIndexedBlock: getCurrentIndexedBlock,
227    },
228    metadata: {
229      name: 'ETH Burned',
230      icon: sdk.ipfs.getDataURILoader('QmedJLPy6R7x3dDEy2cfMd8gXbZm9e3vxvgBLXp3YZEHCy', 'image/svg+xml'),
231    },
232  })
233}
234

It's something off?

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

Adapter Info

Version

0.2.1

License

MIT

IPFS CID

QmXQDGDAn9v8BBYzXdNhVQeAEqTacHx3qK5cW6mTPXFM8H

CID (source)

QmNVQKdUeqkThz7G9PSzyqLpKiEdq1XBsFbWvC6u9Qy1QX

Author

mihal.eth