@xyo-network/react-price-forecast-plugin 7.4.1 → 7.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/components/DetailsBox.stories.d.ts +2 -2
- package/dist/browser/components/DetailsBox.stories.d.ts.map +1 -1
- package/dist/browser/index.mjs +95 -51
- package/dist/browser/index.mjs.map +1 -1
- package/dist/browser/lib/MockSourcePayloads.d.ts +3 -1
- package/dist/browser/lib/MockSourcePayloads.d.ts.map +1 -1
- package/dist/browser/lib/SourcePayloads.d.ts +3 -1
- package/dist/browser/lib/SourcePayloads.d.ts.map +1 -1
- package/package.json +21 -21
- package/src/lib/MockSourcePayloads.ts +4 -2
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { Meta } from '@storybook/react-vite';
|
|
2
2
|
import { PriceForecastDetailsBox } from './DetailsBox.tsx';
|
|
3
3
|
declare const StorybookEntry: Meta<typeof PriceForecastDetailsBox>;
|
|
4
|
-
declare const Default: import("
|
|
5
|
-
declare const WithData: import("
|
|
4
|
+
declare const Default: import("storybook/internal/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("./DetailsBox.tsx").PriceForecastDetailsBoxProps>;
|
|
5
|
+
declare const WithData: import("storybook/internal/csf").AnnotatedStoryFn<import("@storybook/react").ReactRenderer, import("./DetailsBox.tsx").PriceForecastDetailsBoxProps>;
|
|
6
6
|
export { Default, WithData };
|
|
7
7
|
export default StorybookEntry;
|
|
8
8
|
//# sourceMappingURL=DetailsBox.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DetailsBox.stories.d.ts","sourceRoot":"","sources":["../../../src/components/DetailsBox.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,uBAAuB,CAAA;AAO1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAa1D,QAAA,MAAM,cAAc,EAKf,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAyCzC,QAAA,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"DetailsBox.stories.d.ts","sourceRoot":"","sources":["../../../src/components/DetailsBox.stories.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAW,MAAM,uBAAuB,CAAA;AAO1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAA;AAa1D,QAAA,MAAM,cAAc,EAKf,IAAI,CAAC,OAAO,uBAAuB,CAAC,CAAA;AAyCzC,QAAA,MAAM,OAAO,sJAAoB,CAAA;AAGjC,QAAA,MAAM,QAAQ,sJAAoB,CAAA;AAGlC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAA;AAE5B,eAAe,cAAc,CAAA"}
|
package/dist/browser/index.mjs
CHANGED
|
@@ -1,20 +1,13 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
1
4
|
// src/components/DetailsBox.tsx
|
|
2
5
|
import "chartjs-adapter-luxon";
|
|
3
6
|
import { useTheme } from "@mui/material";
|
|
4
7
|
import { useAsyncEffect } from "@xylabs/react-async-effect";
|
|
5
8
|
import { FlexCol } from "@xylabs/react-flexbox";
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
Chart as ChartJS,
|
|
9
|
-
Legend,
|
|
10
|
-
LinearScale,
|
|
11
|
-
LineElement,
|
|
12
|
-
PointElement,
|
|
13
|
-
TimeScale,
|
|
14
|
-
Title,
|
|
15
|
-
Tooltip
|
|
16
|
-
} from "chart.js";
|
|
17
|
-
import { useState } from "react";
|
|
9
|
+
import { CategoryScale, Chart as ChartJS, Legend, LinearScale, LineElement, PointElement, TimeScale, Title, Tooltip } from "chart.js";
|
|
10
|
+
import React, { useState } from "react";
|
|
18
11
|
import { Line } from "react-chartjs-2";
|
|
19
12
|
|
|
20
13
|
// src/lib/ForecastLineChartConfigBuilder.ts
|
|
@@ -22,22 +15,23 @@ import { useIsDark } from "@xylabs/react-theme";
|
|
|
22
15
|
|
|
23
16
|
// src/lib/DataLineStyles.ts
|
|
24
17
|
import { alphaCss } from "@xylabs/react-theme";
|
|
25
|
-
var DataLineStyles = (color) => ({
|
|
18
|
+
var DataLineStyles = /* @__PURE__ */ __name((color) => ({
|
|
26
19
|
backgroundColor: color ? alphaCss(color, 0.5) : void 0,
|
|
27
20
|
borderColor: color
|
|
28
|
-
});
|
|
21
|
+
}), "DataLineStyles");
|
|
29
22
|
|
|
30
23
|
// src/lib/DataPointStyles.ts
|
|
31
|
-
var DataPointStyles = (pointHoverBackgroundColor) => ({
|
|
24
|
+
var DataPointStyles = /* @__PURE__ */ __name((pointHoverBackgroundColor) => ({
|
|
32
25
|
pointHitRadius: 20,
|
|
33
26
|
pointHoverBackgroundColor,
|
|
34
27
|
pointHoverRadius: 10,
|
|
35
28
|
pointRadius: 5,
|
|
36
29
|
pointStyle: "circle"
|
|
37
|
-
});
|
|
30
|
+
}), "DataPointStyles");
|
|
38
31
|
|
|
39
32
|
// src/lib/MockSourcePayloads.ts
|
|
40
|
-
|
|
33
|
+
import { asSchema } from "@xyo-network/payload-model";
|
|
34
|
+
var MockSourcePayloads = /* @__PURE__ */ __name(() => {
|
|
41
35
|
const tenMin = 6e5;
|
|
42
36
|
return [
|
|
43
37
|
{
|
|
@@ -54,7 +48,7 @@ var MockSourcePayloads = () => {
|
|
|
54
48
|
medium: 0.38,
|
|
55
49
|
veryHigh: 1.3900000000000001
|
|
56
50
|
},
|
|
57
|
-
schema: "network.xyo.blockchain.ethereum.gas",
|
|
51
|
+
schema: asSchema("network.xyo.blockchain.ethereum.gas", true),
|
|
58
52
|
timestamp: Date.now() - tenMin
|
|
59
53
|
},
|
|
60
54
|
{
|
|
@@ -71,14 +65,17 @@ var MockSourcePayloads = () => {
|
|
|
71
65
|
medium: 0.38,
|
|
72
66
|
veryHigh: 1.3900000000000001
|
|
73
67
|
},
|
|
74
|
-
schema: "network.xyo.blockchain.ethereum.gas",
|
|
68
|
+
schema: asSchema("network.xyo.blockchain.ethereum.gas", true),
|
|
75
69
|
timestamp: Date.now()
|
|
76
70
|
}
|
|
77
71
|
];
|
|
78
|
-
};
|
|
72
|
+
}, "MockSourcePayloads");
|
|
79
73
|
|
|
80
74
|
// src/lib/SourcePayloads.ts
|
|
81
75
|
var SourcePayloads = class {
|
|
76
|
+
static {
|
|
77
|
+
__name(this, "SourcePayloads");
|
|
78
|
+
}
|
|
82
79
|
sourcePayloads;
|
|
83
80
|
sourcePrices = [];
|
|
84
81
|
constructor(sourcePayloads) {
|
|
@@ -92,7 +89,10 @@ var SourcePayloads = class {
|
|
|
92
89
|
const instance = new this(sourcePayloads);
|
|
93
90
|
const paths = jsonPath.split(".");
|
|
94
91
|
instance.sourcePrices = sourcePayloads.map((payload) => {
|
|
95
|
-
return {
|
|
92
|
+
return {
|
|
93
|
+
x: payload.timestamp,
|
|
94
|
+
y: instance.jsonPathTraverser(payload, paths)
|
|
95
|
+
};
|
|
96
96
|
});
|
|
97
97
|
return instance;
|
|
98
98
|
}
|
|
@@ -117,12 +117,21 @@ var SourcePayloads = class {
|
|
|
117
117
|
};
|
|
118
118
|
|
|
119
119
|
// src/lib/ForecastLineChartConfigBuilder.ts
|
|
120
|
-
var defaultOptions = () => ({
|
|
121
|
-
plugins: {
|
|
120
|
+
var defaultOptions = /* @__PURE__ */ __name(() => ({
|
|
121
|
+
plugins: {
|
|
122
|
+
legend: {
|
|
123
|
+
position: "top"
|
|
124
|
+
}
|
|
125
|
+
},
|
|
122
126
|
responsive: true
|
|
123
|
-
});
|
|
127
|
+
}), "defaultOptions");
|
|
124
128
|
var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
125
|
-
|
|
129
|
+
static {
|
|
130
|
+
__name(this, "ForecastLineChartConfigBuilder");
|
|
131
|
+
}
|
|
132
|
+
data = {
|
|
133
|
+
datasets: []
|
|
134
|
+
};
|
|
126
135
|
options = defaultOptions();
|
|
127
136
|
themeColors;
|
|
128
137
|
payload;
|
|
@@ -150,14 +159,18 @@ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
|
150
159
|
}
|
|
151
160
|
async buildData(includeSources) {
|
|
152
161
|
const forecastData = this.generateDataSetForecastData();
|
|
153
|
-
const datasets = [
|
|
162
|
+
const datasets = [
|
|
163
|
+
forecastData
|
|
164
|
+
];
|
|
154
165
|
if (includeSources) {
|
|
155
166
|
const sourceData = await this.generateDataSetSourcePayloads();
|
|
156
167
|
datasets.unshift(sourceData);
|
|
157
168
|
const lastSourceDataItem = sourceData.data.at(-1);
|
|
158
169
|
forecastData.data.unshift(lastSourceDataItem);
|
|
159
170
|
}
|
|
160
|
-
this.data = {
|
|
171
|
+
this.data = {
|
|
172
|
+
datasets
|
|
173
|
+
};
|
|
161
174
|
return this;
|
|
162
175
|
}
|
|
163
176
|
buildOptions() {
|
|
@@ -169,8 +182,12 @@ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
|
169
182
|
return this;
|
|
170
183
|
}
|
|
171
184
|
refreshValues() {
|
|
172
|
-
this.data = {
|
|
173
|
-
|
|
185
|
+
this.data = {
|
|
186
|
+
...this.data
|
|
187
|
+
};
|
|
188
|
+
this.options = {
|
|
189
|
+
...this.options
|
|
190
|
+
};
|
|
174
191
|
}
|
|
175
192
|
generateLegend() {
|
|
176
193
|
return {
|
|
@@ -183,11 +200,19 @@ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
|
183
200
|
generateScales() {
|
|
184
201
|
return {
|
|
185
202
|
x: {
|
|
186
|
-
grid: {
|
|
187
|
-
|
|
203
|
+
grid: {
|
|
204
|
+
color: this.themeColors?.gridColor
|
|
205
|
+
},
|
|
206
|
+
time: {
|
|
207
|
+
unit: "minute"
|
|
208
|
+
},
|
|
188
209
|
type: "time"
|
|
189
210
|
},
|
|
190
|
-
y: {
|
|
211
|
+
y: {
|
|
212
|
+
grid: {
|
|
213
|
+
color: this.themeColors?.gridColor
|
|
214
|
+
}
|
|
215
|
+
}
|
|
191
216
|
};
|
|
192
217
|
}
|
|
193
218
|
generateTitle() {
|
|
@@ -206,9 +231,14 @@ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
|
206
231
|
}
|
|
207
232
|
generateDataSetForecastData() {
|
|
208
233
|
return {
|
|
209
|
-
borderDash: [
|
|
234
|
+
borderDash: [
|
|
235
|
+
5
|
|
236
|
+
],
|
|
210
237
|
borderDashOffset: 0.5,
|
|
211
|
-
data: this.forecastPayload.values.map((price) => ({
|
|
238
|
+
data: this.forecastPayload.values.map((price) => ({
|
|
239
|
+
x: price.timestamp ?? 0,
|
|
240
|
+
y: price.value
|
|
241
|
+
})),
|
|
212
242
|
label: "Forecast Price",
|
|
213
243
|
...DataPointStyles(this.themeColors?.dataSetColorPrimary),
|
|
214
244
|
...DataLineStyles(this.themeColors?.dataSetColorPrimary)
|
|
@@ -226,32 +256,46 @@ var ForecastLineChartConfigBuilder = class _ForecastLineChartConfigBuilder {
|
|
|
226
256
|
};
|
|
227
257
|
|
|
228
258
|
// src/components/DetailsBox.tsx
|
|
229
|
-
import { jsx } from "react/jsx-runtime";
|
|
230
259
|
ChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend);
|
|
231
|
-
var PriceForecastDetailsBox = ({ payload, ...props }) => {
|
|
260
|
+
var PriceForecastDetailsBox = /* @__PURE__ */ __name(({ payload, ...props }) => {
|
|
232
261
|
const priceForecastPayload = payload;
|
|
233
262
|
const theme = useTheme();
|
|
234
|
-
const [data, setData] = useState({
|
|
263
|
+
const [data, setData] = useState({
|
|
264
|
+
datasets: []
|
|
265
|
+
});
|
|
235
266
|
const [options, setOptions] = useState({});
|
|
236
|
-
useAsyncEffect(
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
}
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
267
|
+
useAsyncEffect(async (mounted) => {
|
|
268
|
+
const { data: data2, options: options2 } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, {
|
|
269
|
+
fetch: true
|
|
270
|
+
});
|
|
271
|
+
if (mounted()) {
|
|
272
|
+
setData(data2);
|
|
273
|
+
setOptions(options2);
|
|
274
|
+
}
|
|
275
|
+
}, [
|
|
276
|
+
priceForecastPayload,
|
|
277
|
+
theme
|
|
278
|
+
]);
|
|
279
|
+
return /* @__PURE__ */ React.createElement(FlexCol, {
|
|
280
|
+
...props,
|
|
281
|
+
busy: priceForecastPayload === void 0,
|
|
282
|
+
minHeight: "25vh"
|
|
283
|
+
}, priceForecastPayload ? /* @__PURE__ */ React.createElement(Line, {
|
|
284
|
+
options,
|
|
285
|
+
data
|
|
286
|
+
}) : null);
|
|
287
|
+
}, "PriceForecastDetailsBox");
|
|
248
288
|
|
|
249
289
|
// src/Plugin.ts
|
|
250
290
|
import { createPayloadRenderPlugin } from "@xyo-network/react-payload-plugin";
|
|
251
291
|
var PriceForecastRenderPlugin = {
|
|
252
292
|
...createPayloadRenderPlugin({
|
|
253
|
-
canRender: () => true,
|
|
254
|
-
components: {
|
|
293
|
+
canRender: /* @__PURE__ */ __name(() => true, "canRender"),
|
|
294
|
+
components: {
|
|
295
|
+
box: {
|
|
296
|
+
detailsBox: PriceForecastDetailsBox
|
|
297
|
+
}
|
|
298
|
+
},
|
|
255
299
|
name: "PriceForecast"
|
|
256
300
|
})
|
|
257
301
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/components/DetailsBox.tsx","../../src/lib/ForecastLineChartConfigBuilder.ts","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/Plugin.ts"],"sourcesContent":["import 'chartjs-adapter-luxon'\n\nimport { useTheme } from '@mui/material'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport type { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type {\n ChartData,\n ChartOptions,\n} from 'chart.js'\nimport {\n CategoryScale,\n Chart as ChartJS,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Title,\n Tooltip,\n} from 'chart.js'\nimport React, { useState } from 'react'\nimport { Line } from 'react-chartjs-2'\n\nimport { ForecastLineChartConfigBuilder } from '../lib/index.ts'\n\nChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend)\n\nexport interface PriceForecastDetailsBoxProps extends FlexBoxProps {\n payload?: Payload\n}\n\nexport const PriceForecastDetailsBox: React.FC<PriceForecastDetailsBoxProps> = ({ payload, ...props }) => {\n const priceForecastPayload = payload as ForecastPayload | undefined\n const theme = useTheme()\n const [data, setData] = useState<ChartData<'line'>>({ datasets: [] })\n const [options, setOptions] = useState<ChartOptions<'line'>>({})\n\n useAsyncEffect(\n\n async (mounted) => {\n const { data, options } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true })\n if (mounted()) {\n setData(data)\n setOptions(options)\n }\n },\n [priceForecastPayload, theme],\n )\n\n return (\n <FlexCol {...props} busy={priceForecastPayload === undefined} minHeight=\"25vh\">\n {priceForecastPayload\n ? <Line options={options} data={data} />\n : null}\n </FlexCol>\n )\n}\n","import type { Theme } from '@mui/material'\nimport { useIsDark } from '@xylabs/react-theme'\nimport type { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport type {\n ChartData, ChartDataset, ChartOptions, LegendOptions, Point, ScaleChartOptions,\n} from 'chart.js'\n\nimport { DataLineStyles } from './DataLineStyles.ts'\nimport { DataPointStyles } from './DataPointStyles.ts'\nimport { SourcePayloads } from './SourcePayloads.ts'\n\ninterface SourcePayloadConfig {\n fetch: boolean\n sampleSize?: number\n}\n\ninterface ThemeColors {\n dataSetColorPrimary: string\n dataSetColorSecondary: string\n gridColor: string\n}\n\nconst defaultOptions: () => ChartOptions<'line'> = () => ({\n plugins: { legend: { position: 'top' as const } },\n responsive: true,\n})\n\nexport class ForecastLineChartConfigBuilder {\n data: ChartData<'line'> = { datasets: [] }\n\n options: ChartOptions<'line'> = defaultOptions()\n themeColors: ThemeColors | undefined\n\n private payload?: ForecastPayload\n\n constructor(\n theme: Theme,\n payload?: ForecastPayload,\n ) {\n this.payload = payload\n this.themeColors = this.parseTheme(theme)\n }\n\n get forecastPayload() {\n if (this.payload) {\n return this.payload\n } else {\n throw new Error('ForecastPayload was not defined')\n }\n }\n\n static async create(theme: Theme, payload?: ForecastPayload, sourcePayloadConfig?: SourcePayloadConfig) {\n const instance = new ForecastLineChartConfigBuilder(theme, payload)\n\n await instance.build(sourcePayloadConfig?.fetch)\n\n instance.refreshValues()\n\n return instance\n }\n\n async build(includeSources?: boolean) {\n this.buildOptions()\n await this.buildData(includeSources)\n return this\n }\n\n async buildData(includeSources?: boolean) {\n const forecastData = this.generateDataSetForecastData()\n\n const datasets: ChartDataset<'line'>[] = [forecastData]\n\n if (includeSources) {\n // build data from sources in forecastPayload\n const sourceData = await this.generateDataSetSourcePayloads()\n datasets.unshift(sourceData)\n\n // add last source point as first item in prediction to connect the lines\n const lastSourceDataItem = sourceData.data.at(-1) as Point\n forecastData.data.unshift(lastSourceDataItem)\n }\n\n this.data = { datasets }\n\n return this\n }\n\n buildOptions() {\n if (this.options.plugins) {\n this.options.plugins.title = this.generateTitle()\n this.options.plugins.legend = this.generateLegend()\n }\n this.options.scales = this.generateScales()\n\n return this\n }\n\n refreshValues() {\n this.data = { ...this.data }\n this.options = { ...this.options }\n }\n\n protected generateLegend() {\n return {\n labels: {\n pointStyle: 'circle',\n usePointStyle: true,\n },\n } as LegendOptions<'line'>\n }\n\n protected generateScales() {\n return {\n x: {\n grid: { color: this.themeColors?.gridColor },\n time: { unit: 'minute' },\n type: 'time',\n },\n y: { grid: { color: this.themeColors?.gridColor } },\n } as unknown as ScaleChartOptions<'line'>['scales']\n }\n\n protected generateTitle() {\n return {\n display: true,\n text: `Gas Price Forecaster (GWEI over time from ${\n this.forecastPayload?.values[0].timestamp ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ''\n })`,\n }\n }\n\n protected parseTheme(theme: Theme) {\n const dark = useIsDark()\n return {\n dataSetColorPrimary: theme.vars.palette.primary.light,\n dataSetColorSecondary: theme.vars.palette.secondary.light,\n gridColor: dark ? theme.vars.palette.grey[800] : theme.vars.palette.grey[300],\n }\n }\n\n private generateDataSetForecastData(): ChartDataset<'line'> {\n return {\n borderDash: [5],\n borderDashOffset: 0.5,\n data: this.forecastPayload.values.map(price => ({ x: price.timestamp ?? 0, y: price.value })),\n label: 'Forecast Price',\n ...DataPointStyles(this.themeColors?.dataSetColorPrimary),\n ...DataLineStyles(this.themeColors?.dataSetColorPrimary),\n }\n }\n\n private async generateDataSetSourcePayloads(): Promise<ChartDataset<'line'>> {\n const { sourcePrices } = await SourcePayloads.build('feePerGas.medium')\n return {\n data: sourcePrices,\n label: 'Source Prices',\n ...DataLineStyles(this.themeColors?.dataSetColorSecondary),\n ...DataPointStyles(this.themeColors?.dataSetColorSecondary),\n }\n }\n}\n","import { alphaCss } from '@xylabs/react-theme'\n\nexport const DataLineStyles = (color?: string) => ({\n backgroundColor: color ? alphaCss(color, 0.5) : undefined,\n borderColor: color,\n})\n","export const DataPointStyles = (pointHoverBackgroundColor?: string) => ({\n pointHitRadius: 20,\n pointHoverBackgroundColor,\n pointHoverRadius: 10,\n pointRadius: 5,\n pointStyle: 'circle',\n})\n","export const MockSourcePayloads = () => {\n const tenMin = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: {\n high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25,\n },\n priorityFeePerGas: {\n high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,\n },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: {\n high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25,\n },\n priorityFeePerGas: {\n high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,\n },\n schema: 'network.xyo.blockchain.ethereum.gas',\n timestamp: Date.now(),\n },\n ]\n}\n","import type { Payload } from '@xyo-network/payload-model'\nimport type { Point } from 'chart.js'\n\nimport { MockSourcePayloads } from './MockSourcePayloads.ts'\n\nexport class SourcePayloads {\n sourcePayloads: Payload[]\n sourcePrices: Point[] = []\n\n constructor(sourcePayloads: Payload[]) {\n this.sourcePayloads = sourcePayloads\n }\n\n get payloads() {\n return this.sourcePayloads\n }\n\n static async build(jsonPath: string) {\n const sourcePayloads = await this.fetchSourcePayloads()\n const instance = new this(sourcePayloads)\n\n const paths = jsonPath.split('.')\n instance.sourcePrices = sourcePayloads.map((payload) => {\n return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) }\n })\n return instance\n }\n\n // TODO - fetch from archivist\n static async fetchSourcePayloads() {\n const payloads = await Promise.resolve(MockSourcePayloads())\n return payloads\n }\n\n jsonPathTraverser(obj: Payload, path: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any = obj\n for (const key of path) {\n if (key in result) {\n const foundKey = key as keyof typeof result\n result = result[foundKey]\n } else {\n result = undefined\n break\n }\n }\n\n return result\n }\n}\n","import type { PayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\nimport { createPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\n\nimport { PriceForecastDetailsBox } from './components/index.ts'\n\nexport const PriceForecastRenderPlugin: PayloadRenderPlugin = {\n ...createPayloadRenderPlugin({\n canRender: () => true,\n components: { box: { detailsBox: PriceForecastDetailsBox } },\n name: 'PriceForecast',\n }),\n}\n"],"mappings":"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","names":["data","options"]}
|
|
1
|
+
{"version":3,"sources":["../../src/components/DetailsBox.tsx","../../src/lib/ForecastLineChartConfigBuilder.ts","../../src/lib/DataLineStyles.ts","../../src/lib/DataPointStyles.ts","../../src/lib/MockSourcePayloads.ts","../../src/lib/SourcePayloads.ts","../../src/Plugin.ts"],"sourcesContent":["import 'chartjs-adapter-luxon'\n\nimport { useTheme } from '@mui/material'\nimport { useAsyncEffect } from '@xylabs/react-async-effect'\nimport type { FlexBoxProps } from '@xylabs/react-flexbox'\nimport { FlexCol } from '@xylabs/react-flexbox'\nimport type { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport type { Payload } from '@xyo-network/payload-model'\nimport type {\n ChartData,\n ChartOptions,\n} from 'chart.js'\nimport {\n CategoryScale,\n Chart as ChartJS,\n Legend,\n LinearScale,\n LineElement,\n PointElement,\n TimeScale,\n Title,\n Tooltip,\n} from 'chart.js'\nimport React, { useState } from 'react'\nimport { Line } from 'react-chartjs-2'\n\nimport { ForecastLineChartConfigBuilder } from '../lib/index.ts'\n\nChartJS.register(CategoryScale, TimeScale, PointElement, LineElement, LinearScale, Title, Tooltip, Legend)\n\nexport interface PriceForecastDetailsBoxProps extends FlexBoxProps {\n payload?: Payload\n}\n\nexport const PriceForecastDetailsBox: React.FC<PriceForecastDetailsBoxProps> = ({ payload, ...props }) => {\n const priceForecastPayload = payload as ForecastPayload | undefined\n const theme = useTheme()\n const [data, setData] = useState<ChartData<'line'>>({ datasets: [] })\n const [options, setOptions] = useState<ChartOptions<'line'>>({})\n\n useAsyncEffect(\n\n async (mounted) => {\n const { data, options } = await ForecastLineChartConfigBuilder.create(theme, priceForecastPayload, { fetch: true })\n if (mounted()) {\n setData(data)\n setOptions(options)\n }\n },\n [priceForecastPayload, theme],\n )\n\n return (\n <FlexCol {...props} busy={priceForecastPayload === undefined} minHeight=\"25vh\">\n {priceForecastPayload\n ? <Line options={options} data={data} />\n : null}\n </FlexCol>\n )\n}\n","import type { Theme } from '@mui/material'\nimport { useIsDark } from '@xylabs/react-theme'\nimport type { ForecastPayload } from '@xyo-network/diviner-forecasting-model'\nimport type {\n ChartData, ChartDataset, ChartOptions, LegendOptions, Point, ScaleChartOptions,\n} from 'chart.js'\n\nimport { DataLineStyles } from './DataLineStyles.ts'\nimport { DataPointStyles } from './DataPointStyles.ts'\nimport { SourcePayloads } from './SourcePayloads.ts'\n\ninterface SourcePayloadConfig {\n fetch: boolean\n sampleSize?: number\n}\n\ninterface ThemeColors {\n dataSetColorPrimary: string\n dataSetColorSecondary: string\n gridColor: string\n}\n\nconst defaultOptions: () => ChartOptions<'line'> = () => ({\n plugins: { legend: { position: 'top' as const } },\n responsive: true,\n})\n\nexport class ForecastLineChartConfigBuilder {\n data: ChartData<'line'> = { datasets: [] }\n\n options: ChartOptions<'line'> = defaultOptions()\n themeColors: ThemeColors | undefined\n\n private payload?: ForecastPayload\n\n constructor(\n theme: Theme,\n payload?: ForecastPayload,\n ) {\n this.payload = payload\n this.themeColors = this.parseTheme(theme)\n }\n\n get forecastPayload() {\n if (this.payload) {\n return this.payload\n } else {\n throw new Error('ForecastPayload was not defined')\n }\n }\n\n static async create(theme: Theme, payload?: ForecastPayload, sourcePayloadConfig?: SourcePayloadConfig) {\n const instance = new ForecastLineChartConfigBuilder(theme, payload)\n\n await instance.build(sourcePayloadConfig?.fetch)\n\n instance.refreshValues()\n\n return instance\n }\n\n async build(includeSources?: boolean) {\n this.buildOptions()\n await this.buildData(includeSources)\n return this\n }\n\n async buildData(includeSources?: boolean) {\n const forecastData = this.generateDataSetForecastData()\n\n const datasets: ChartDataset<'line'>[] = [forecastData]\n\n if (includeSources) {\n // build data from sources in forecastPayload\n const sourceData = await this.generateDataSetSourcePayloads()\n datasets.unshift(sourceData)\n\n // add last source point as first item in prediction to connect the lines\n const lastSourceDataItem = sourceData.data.at(-1) as Point\n forecastData.data.unshift(lastSourceDataItem)\n }\n\n this.data = { datasets }\n\n return this\n }\n\n buildOptions() {\n if (this.options.plugins) {\n this.options.plugins.title = this.generateTitle()\n this.options.plugins.legend = this.generateLegend()\n }\n this.options.scales = this.generateScales()\n\n return this\n }\n\n refreshValues() {\n this.data = { ...this.data }\n this.options = { ...this.options }\n }\n\n protected generateLegend() {\n return {\n labels: {\n pointStyle: 'circle',\n usePointStyle: true,\n },\n } as LegendOptions<'line'>\n }\n\n protected generateScales() {\n return {\n x: {\n grid: { color: this.themeColors?.gridColor },\n time: { unit: 'minute' },\n type: 'time',\n },\n y: { grid: { color: this.themeColors?.gridColor } },\n } as unknown as ScaleChartOptions<'line'>['scales']\n }\n\n protected generateTitle() {\n return {\n display: true,\n text: `Gas Price Forecaster (GWEI over time from ${\n this.forecastPayload?.values[0].timestamp ? new Date(this.forecastPayload.values[0].timestamp).toLocaleDateString() : ''\n })`,\n }\n }\n\n protected parseTheme(theme: Theme) {\n const dark = useIsDark()\n return {\n dataSetColorPrimary: theme.vars.palette.primary.light,\n dataSetColorSecondary: theme.vars.palette.secondary.light,\n gridColor: dark ? theme.vars.palette.grey[800] : theme.vars.palette.grey[300],\n }\n }\n\n private generateDataSetForecastData(): ChartDataset<'line'> {\n return {\n borderDash: [5],\n borderDashOffset: 0.5,\n data: this.forecastPayload.values.map(price => ({ x: price.timestamp ?? 0, y: price.value })),\n label: 'Forecast Price',\n ...DataPointStyles(this.themeColors?.dataSetColorPrimary),\n ...DataLineStyles(this.themeColors?.dataSetColorPrimary),\n }\n }\n\n private async generateDataSetSourcePayloads(): Promise<ChartDataset<'line'>> {\n const { sourcePrices } = await SourcePayloads.build('feePerGas.medium')\n return {\n data: sourcePrices,\n label: 'Source Prices',\n ...DataLineStyles(this.themeColors?.dataSetColorSecondary),\n ...DataPointStyles(this.themeColors?.dataSetColorSecondary),\n }\n }\n}\n","import { alphaCss } from '@xylabs/react-theme'\n\nexport const DataLineStyles = (color?: string) => ({\n backgroundColor: color ? alphaCss(color, 0.5) : undefined,\n borderColor: color,\n})\n","export const DataPointStyles = (pointHoverBackgroundColor?: string) => ({\n pointHitRadius: 20,\n pointHoverBackgroundColor,\n pointHoverRadius: 10,\n pointRadius: 5,\n pointStyle: 'circle',\n})\n","import { asSchema } from '@xyo-network/payload-model'\n\nexport const MockSourcePayloads = () => {\n const tenMin = 600_000\n return [\n {\n baseFee: 38.901_553_878_25,\n feePerGas: {\n high: 47.994_586_439_6, low: 39.006_868_093, medium: 39.306_868_093, veryHigh: 44.453_843_805_25,\n },\n priorityFeePerGas: {\n high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,\n },\n schema: asSchema('network.xyo.blockchain.ethereum.gas', true),\n timestamp: Date.now() - tenMin,\n },\n {\n baseFee: 38.901_553_878_25,\n feePerGas: {\n high: 47.994_586_439_6, low: 39.006_868_093, medium: 100, veryHigh: 44.453_843_805_25,\n },\n priorityFeePerGas: {\n high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,\n },\n schema: asSchema('network.xyo.blockchain.ethereum.gas', true),\n timestamp: Date.now(),\n },\n ]\n}\n","import type { Payload } from '@xyo-network/payload-model'\nimport type { Point } from 'chart.js'\n\nimport { MockSourcePayloads } from './MockSourcePayloads.ts'\n\nexport class SourcePayloads {\n sourcePayloads: Payload[]\n sourcePrices: Point[] = []\n\n constructor(sourcePayloads: Payload[]) {\n this.sourcePayloads = sourcePayloads\n }\n\n get payloads() {\n return this.sourcePayloads\n }\n\n static async build(jsonPath: string) {\n const sourcePayloads = await this.fetchSourcePayloads()\n const instance = new this(sourcePayloads)\n\n const paths = jsonPath.split('.')\n instance.sourcePrices = sourcePayloads.map((payload) => {\n return { x: payload.timestamp, y: instance.jsonPathTraverser(payload, paths) }\n })\n return instance\n }\n\n // TODO - fetch from archivist\n static async fetchSourcePayloads() {\n const payloads = await Promise.resolve(MockSourcePayloads())\n return payloads\n }\n\n jsonPathTraverser(obj: Payload, path: string[]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let result: any = obj\n for (const key of path) {\n if (key in result) {\n const foundKey = key as keyof typeof result\n result = result[foundKey]\n } else {\n result = undefined\n break\n }\n }\n\n return result\n }\n}\n","import type { PayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\nimport { createPayloadRenderPlugin } from '@xyo-network/react-payload-plugin'\n\nimport { PriceForecastDetailsBox } from './components/index.ts'\n\nexport const PriceForecastRenderPlugin: PayloadRenderPlugin = {\n ...createPayloadRenderPlugin({\n canRender: () => true,\n components: { box: { detailsBox: PriceForecastDetailsBox } },\n name: 'PriceForecast',\n }),\n}\n"],"mappings":"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","names":["useTheme","useAsyncEffect","FlexCol","CategoryScale","Chart","ChartJS","Legend","LinearScale","LineElement","PointElement","TimeScale","Title","Tooltip","React","useState","Line","useIsDark","alphaCss","DataLineStyles","color","backgroundColor","alphaCss","undefined","borderColor","DataPointStyles","pointHoverBackgroundColor","pointHitRadius","pointHoverRadius","pointRadius","pointStyle","asSchema","MockSourcePayloads","tenMin","baseFee","feePerGas","high","low","medium","veryHigh","priorityFeePerGas","schema","asSchema","timestamp","Date","now","SourcePayloads","sourcePayloads","sourcePrices","payloads","build","jsonPath","fetchSourcePayloads","instance","paths","split","map","payload","x","timestamp","y","jsonPathTraverser","Promise","resolve","MockSourcePayloads","obj","path","result","key","foundKey","undefined","defaultOptions","plugins","legend","position","responsive","ForecastLineChartConfigBuilder","data","datasets","options","themeColors","payload","theme","parseTheme","forecastPayload","Error","create","sourcePayloadConfig","instance","build","fetch","refreshValues","includeSources","buildOptions","buildData","forecastData","generateDataSetForecastData","sourceData","generateDataSetSourcePayloads","unshift","lastSourceDataItem","at","title","generateTitle","generateLegend","scales","generateScales","labels","pointStyle","usePointStyle","x","grid","color","gridColor","time","unit","type","y","display","text","values","timestamp","Date","toLocaleDateString","dark","useIsDark","dataSetColorPrimary","vars","palette","primary","light","dataSetColorSecondary","secondary","grey","borderDash","borderDashOffset","map","price","value","label","DataPointStyles","DataLineStyles","sourcePrices","SourcePayloads","ChartJS","register","CategoryScale","TimeScale","PointElement","LineElement","LinearScale","Title","Tooltip","Legend","PriceForecastDetailsBox","payload","props","priceForecastPayload","theme","useTheme","data","setData","useState","datasets","options","setOptions","useAsyncEffect","mounted","ForecastLineChartConfigBuilder","create","fetch","FlexCol","busy","undefined","minHeight","Line","createPayloadRenderPlugin","PriceForecastRenderPlugin","createPayloadRenderPlugin","canRender","components","box","detailsBox","PriceForecastDetailsBox","name"]}
|
|
@@ -12,7 +12,9 @@ export declare const MockSourcePayloads: () => {
|
|
|
12
12
|
medium: number;
|
|
13
13
|
veryHigh: number;
|
|
14
14
|
};
|
|
15
|
-
schema:
|
|
15
|
+
schema: "network.xyo.blockchain.ethereum.gas" & {
|
|
16
|
+
readonly __schema: true;
|
|
17
|
+
};
|
|
16
18
|
timestamp: number;
|
|
17
19
|
}[];
|
|
18
20
|
//# sourceMappingURL=MockSourcePayloads.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MockSourcePayloads.d.ts","sourceRoot":"","sources":["../../../src/lib/MockSourcePayloads.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"MockSourcePayloads.d.ts","sourceRoot":"","sources":["../../../src/lib/MockSourcePayloads.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;GA0B9B,CAAA"}
|
|
@@ -20,7 +20,9 @@ export declare class SourcePayloads {
|
|
|
20
20
|
medium: number;
|
|
21
21
|
veryHigh: number;
|
|
22
22
|
};
|
|
23
|
-
schema:
|
|
23
|
+
schema: "network.xyo.blockchain.ethereum.gas" & {
|
|
24
|
+
readonly __schema: true;
|
|
25
|
+
};
|
|
24
26
|
timestamp: number;
|
|
25
27
|
}[]>;
|
|
26
28
|
jsonPathTraverser(obj: Payload, path: string[]): any;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SourcePayloads.d.ts","sourceRoot":"","sources":["../../../src/lib/SourcePayloads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAIrC,qBAAa,cAAc;IACzB,cAAc,EAAE,OAAO,EAAE,CAAA;IACzB,YAAY,EAAE,KAAK,EAAE,CAAK;gBAEd,cAAc,EAAE,OAAO,EAAE;IAIrC,IAAI,QAAQ,cAEX;WAEY,KAAK,CAAC,QAAQ,EAAE,MAAM;WAYtB,mBAAmB
|
|
1
|
+
{"version":3,"file":"SourcePayloads.d.ts","sourceRoot":"","sources":["../../../src/lib/SourcePayloads.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAIrC,qBAAa,cAAc;IACzB,cAAc,EAAE,OAAO,EAAE,CAAA;IACzB,YAAY,EAAE,KAAK,EAAE,CAAK;gBAEd,cAAc,EAAE,OAAO,EAAE;IAIrC,IAAI,QAAQ,cAEX;WAEY,KAAK,CAAC,QAAQ,EAAE,MAAM;WAYtB,mBAAmB;;;;;;;;;;;;;;;;;;;IAKhC,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE;CAe/C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/react-price-forecast-plugin",
|
|
3
|
-
"version": "7.
|
|
3
|
+
"version": "7.5.0",
|
|
4
4
|
"description": "Common React library for all XYO projects that use React",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"xyo",
|
|
@@ -43,12 +43,12 @@
|
|
|
43
43
|
"src"
|
|
44
44
|
],
|
|
45
45
|
"dependencies": {
|
|
46
|
-
"@xylabs/react-async-effect": "~7.1.
|
|
47
|
-
"@xylabs/react-flexbox": "~7.1.
|
|
48
|
-
"@xylabs/react-theme": "~7.1.
|
|
49
|
-
"@xyo-network/diviner-forecasting-model": "~5.2
|
|
50
|
-
"@xyo-network/payload-model": "~5.2
|
|
51
|
-
"@xyo-network/react-payload-plugin": "
|
|
46
|
+
"@xylabs/react-async-effect": "~7.1.9",
|
|
47
|
+
"@xylabs/react-flexbox": "~7.1.9",
|
|
48
|
+
"@xylabs/react-theme": "~7.1.9",
|
|
49
|
+
"@xyo-network/diviner-forecasting-model": "~5.3.2",
|
|
50
|
+
"@xyo-network/payload-model": "~5.3.2",
|
|
51
|
+
"@xyo-network/react-payload-plugin": "7.5.0",
|
|
52
52
|
"chart.js": "~4.5.1",
|
|
53
53
|
"chartjs-adapter-luxon": "~1.3.1",
|
|
54
54
|
"react-chartjs-2": "~5.3.1"
|
|
@@ -56,21 +56,21 @@
|
|
|
56
56
|
"devDependencies": {
|
|
57
57
|
"@emotion/react": "~11.14.0",
|
|
58
58
|
"@emotion/styled": "~11.14.1",
|
|
59
|
-
"@mui/icons-material": "~7.3.
|
|
60
|
-
"@mui/material": "~7.3.
|
|
61
|
-
"@storybook/react-vite": "~10.1
|
|
62
|
-
"@types/react": "^19.2.
|
|
63
|
-
"@xylabs/ts-scripts-yarn3": "~7.2
|
|
64
|
-
"@xylabs/tsconfig": "~7.2
|
|
65
|
-
"@xylabs/tsconfig-dom": "~7.2
|
|
66
|
-
"@xylabs/tsconfig-react": "~7.2
|
|
59
|
+
"@mui/icons-material": "~7.3.7",
|
|
60
|
+
"@mui/material": "~7.3.7",
|
|
61
|
+
"@storybook/react-vite": "~10.2.1",
|
|
62
|
+
"@types/react": "^19.2.10",
|
|
63
|
+
"@xylabs/ts-scripts-yarn3": "~7.3.2",
|
|
64
|
+
"@xylabs/tsconfig": "~7.3.2",
|
|
65
|
+
"@xylabs/tsconfig-dom": "~7.3.2",
|
|
66
|
+
"@xylabs/tsconfig-react": "~7.3.2",
|
|
67
67
|
"luxon": "^3.7.2",
|
|
68
|
-
"react": "^19.2.
|
|
69
|
-
"react-dom": "^19.2.
|
|
70
|
-
"react-router-dom": "^7.
|
|
71
|
-
"storybook": "~10.1
|
|
68
|
+
"react": "^19.2.4",
|
|
69
|
+
"react-dom": "^19.2.4",
|
|
70
|
+
"react-router-dom": "^7.13.0",
|
|
71
|
+
"storybook": "~10.2.1",
|
|
72
72
|
"typescript": "^5.9.3",
|
|
73
|
-
"vite": "~7.
|
|
73
|
+
"vite": "~7.3.1"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"@mui/icons-material": ">=6 <8",
|
|
@@ -84,4 +84,4 @@
|
|
|
84
84
|
"access": "public"
|
|
85
85
|
},
|
|
86
86
|
"docs": "dist/docs.json"
|
|
87
|
-
}
|
|
87
|
+
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { asSchema } from '@xyo-network/payload-model'
|
|
2
|
+
|
|
1
3
|
export const MockSourcePayloads = () => {
|
|
2
4
|
const tenMin = 600_000
|
|
3
5
|
return [
|
|
@@ -9,7 +11,7 @@ export const MockSourcePayloads = () => {
|
|
|
9
11
|
priorityFeePerGas: {
|
|
10
12
|
high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,
|
|
11
13
|
},
|
|
12
|
-
schema: 'network.xyo.blockchain.ethereum.gas',
|
|
14
|
+
schema: asSchema('network.xyo.blockchain.ethereum.gas', true),
|
|
13
15
|
timestamp: Date.now() - tenMin,
|
|
14
16
|
},
|
|
15
17
|
{
|
|
@@ -20,7 +22,7 @@ export const MockSourcePayloads = () => {
|
|
|
20
22
|
priorityFeePerGas: {
|
|
21
23
|
high: 1.026_666_666_666_666_6, low: -0.410_000_000_000_000_03, medium: 0.38, veryHigh: 1.390_000_000_000_000_1,
|
|
22
24
|
},
|
|
23
|
-
schema: 'network.xyo.blockchain.ethereum.gas',
|
|
25
|
+
schema: asSchema('network.xyo.blockchain.ethereum.gas', true),
|
|
24
26
|
timestamp: Date.now(),
|
|
25
27
|
},
|
|
26
28
|
]
|