@xyo-network/crypto-asset-plugin 2.99.3 → 2.99.5

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.
Files changed (82) hide show
  1. package/dist/browser/Diviner.d.cts +1 -1
  2. package/dist/browser/Diviner.d.cts.map +1 -1
  3. package/dist/browser/Diviner.d.mts +1 -1
  4. package/dist/browser/Diviner.d.mts.map +1 -1
  5. package/dist/browser/Diviner.d.ts +1 -1
  6. package/dist/browser/Diviner.d.ts.map +1 -1
  7. package/dist/browser/Plugin.d.cts +2 -2
  8. package/dist/browser/Plugin.d.mts +2 -2
  9. package/dist/browser/Plugin.d.ts +2 -2
  10. package/dist/browser/index.cjs +135 -83
  11. package/dist/browser/index.cjs.map +1 -1
  12. package/dist/browser/index.d.cts +3 -3
  13. package/dist/browser/index.d.mts +3 -3
  14. package/dist/browser/index.d.ts +3 -3
  15. package/dist/browser/index.mjs +221 -0
  16. package/dist/browser/index.mjs.map +1 -0
  17. package/dist/browser/lib/index.d.cts +1 -1
  18. package/dist/browser/lib/index.d.mts +1 -1
  19. package/dist/browser/lib/index.d.ts +1 -1
  20. package/dist/browser/test/index.d.cts +2 -2
  21. package/dist/browser/test/index.d.mts +2 -2
  22. package/dist/browser/test/index.d.ts +2 -2
  23. package/dist/neutral/Diviner.d.cts +1 -1
  24. package/dist/neutral/Diviner.d.cts.map +1 -1
  25. package/dist/neutral/Diviner.d.mts +1 -1
  26. package/dist/neutral/Diviner.d.mts.map +1 -1
  27. package/dist/neutral/Diviner.d.ts +1 -1
  28. package/dist/neutral/Diviner.d.ts.map +1 -1
  29. package/dist/neutral/Plugin.d.cts +2 -2
  30. package/dist/neutral/Plugin.d.mts +2 -2
  31. package/dist/neutral/Plugin.d.ts +2 -2
  32. package/dist/neutral/index.cjs +135 -83
  33. package/dist/neutral/index.cjs.map +1 -1
  34. package/dist/neutral/index.d.cts +3 -3
  35. package/dist/neutral/index.d.mts +3 -3
  36. package/dist/neutral/index.d.ts +3 -3
  37. package/dist/neutral/index.mjs +221 -0
  38. package/dist/neutral/index.mjs.map +1 -0
  39. package/dist/neutral/lib/index.d.cts +1 -1
  40. package/dist/neutral/lib/index.d.mts +1 -1
  41. package/dist/neutral/lib/index.d.ts +1 -1
  42. package/dist/neutral/test/index.d.cts +2 -2
  43. package/dist/neutral/test/index.d.mts +2 -2
  44. package/dist/neutral/test/index.d.ts +2 -2
  45. package/dist/node/Diviner.d.cts +1 -1
  46. package/dist/node/Diviner.d.cts.map +1 -1
  47. package/dist/node/Diviner.d.mts +1 -1
  48. package/dist/node/Diviner.d.mts.map +1 -1
  49. package/dist/node/Diviner.d.ts +1 -1
  50. package/dist/node/Diviner.d.ts.map +1 -1
  51. package/dist/node/Plugin.d.cts +2 -2
  52. package/dist/node/Plugin.d.mts +2 -2
  53. package/dist/node/Plugin.d.ts +2 -2
  54. package/dist/node/index.cjs +150 -94
  55. package/dist/node/index.cjs.map +1 -1
  56. package/dist/node/index.d.cts +3 -3
  57. package/dist/node/index.d.mts +3 -3
  58. package/dist/node/index.d.ts +3 -3
  59. package/dist/node/index.mjs +234 -0
  60. package/dist/node/index.mjs.map +1 -0
  61. package/dist/node/lib/index.d.cts +1 -1
  62. package/dist/node/lib/index.d.mts +1 -1
  63. package/dist/node/lib/index.d.ts +1 -1
  64. package/dist/node/test/index.d.cts +2 -2
  65. package/dist/node/test/index.d.mts +2 -2
  66. package/dist/node/test/index.d.ts +2 -2
  67. package/package.json +18 -19
  68. package/src/Diviner.ts +5 -6
  69. package/src/Plugin.ts +1 -1
  70. package/src/index.ts +3 -3
  71. package/src/lib/average.ts +5 -5
  72. package/src/lib/divineCoinGeckoPrices.ts +4 -4
  73. package/src/lib/divinePrices.ts +3 -3
  74. package/src/lib/divineUniswapPrices.ts +6 -6
  75. package/src/lib/index.ts +1 -1
  76. package/src/test/index.ts +2 -2
  77. package/dist/browser/index.js +0 -167
  78. package/dist/browser/index.js.map +0 -1
  79. package/dist/neutral/index.js +0 -167
  80. package/dist/neutral/index.js.map +0 -1
  81. package/dist/node/index.js +0 -176
  82. package/dist/node/index.js.map +0 -1
@@ -1,4 +1,4 @@
1
- export * from './Diviner.js';
2
- export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.js';
3
- export * from './Schema.js';
1
+ export * from './Diviner.ts';
2
+ export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
3
+ export * from './Schema.ts';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1,4 +1,4 @@
1
- export * from './Diviner.js';
2
- export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.js';
3
- export * from './Schema.js';
1
+ export * from './Diviner.ts';
2
+ export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
3
+ export * from './Schema.ts';
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,234 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getProtoOf = Object.getPrototypeOf;
3
+ var __reflectGet = Reflect.get;
4
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
6
+ var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
7
+ var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
8
+
9
+ // src/Diviner.ts
10
+ import { CoingeckoCryptoMarketSchema } from "@xyo-network/coingecko-crypto-market-payload-plugin";
11
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema4 } from "@xyo-network/crypto-asset-payload-plugin";
12
+ import { AbstractDiviner } from "@xyo-network/diviner-abstract";
13
+ import { UniswapCryptoMarketSchema } from "@xyo-network/uniswap-crypto-market-payload-plugin";
14
+
15
+ // src/lib/divinePrices.ts
16
+ import { exists as exists3 } from "@xylabs/exists";
17
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema3 } from "@xyo-network/crypto-asset-payload-plugin";
18
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
19
+
20
+ // src/lib/average.ts
21
+ import { exists } from "@xylabs/exists";
22
+ var isNumber = /* @__PURE__ */ __name((val) => {
23
+ return val !== void 0;
24
+ }, "isNumber");
25
+ var parseStringifiedNumber = /* @__PURE__ */ __name((value) => {
26
+ if (!value) return void 0;
27
+ const parsed = Number.parseFloat(value);
28
+ return Number.isNaN(parsed) ? void 0 : parsed;
29
+ }, "parseStringifiedNumber");
30
+ var averageStringifiedNumbers = /* @__PURE__ */ __name((...prices) => {
31
+ const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
32
+ return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
33
+ }, "averageStringifiedNumbers");
34
+ var average = /* @__PURE__ */ __name((...input) => {
35
+ const payloads = input.filter(exists);
36
+ const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
37
+ const valuations = new Set([
38
+ ...tokens
39
+ ].flatMap((asset) => {
40
+ const assetInfo = payloads.map((p) => {
41
+ var _a;
42
+ return (_a = p.assets) == null ? void 0 : _a[asset];
43
+ }).filter(exists);
44
+ const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(exists));
45
+ return [
46
+ ...valueBasis
47
+ ];
48
+ }));
49
+ const assets = Object.fromEntries([
50
+ ...tokens
51
+ ].map((token) => {
52
+ const assetInfo = payloads.map((p) => {
53
+ var _a;
54
+ return (_a = p.assets) == null ? void 0 : _a[token];
55
+ }).filter(exists);
56
+ const value = Object.fromEntries([
57
+ ...valuations
58
+ ].map((valuation) => {
59
+ const assetValuations = assetInfo.map((info) => {
60
+ var _a;
61
+ return (_a = info.value) == null ? void 0 : _a[valuation];
62
+ });
63
+ const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
64
+ return [
65
+ valuation,
66
+ averageAssetValuation == null ? void 0 : averageAssetValuation.toString()
67
+ ];
68
+ }));
69
+ return [
70
+ token,
71
+ {
72
+ value
73
+ }
74
+ ];
75
+ }));
76
+ return assets;
77
+ }, "average");
78
+
79
+ // src/lib/divineCoinGeckoPrices.ts
80
+ import { CryptoMarketAssetSchema } from "@xyo-network/crypto-asset-payload-plugin";
81
+ import { PayloadBuilder } from "@xyo-network/payload-builder";
82
+ var schema = CryptoMarketAssetSchema;
83
+ var valuationExists = /* @__PURE__ */ __name((value) => {
84
+ return !!value[1];
85
+ }, "valuationExists");
86
+ var otherValueExists = /* @__PURE__ */ __name((value) => {
87
+ const possiblyNumber = value[1];
88
+ return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
89
+ }, "otherValueExists");
90
+ var divineCoinGeckoPrices = /* @__PURE__ */ __name(async (payload) => {
91
+ const assets = payload && (payload == null ? void 0 : payload.assets) ? Object.fromEntries(Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
92
+ const value = Object.fromEntries(Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [
93
+ symbol.toLowerCase(),
94
+ price == null ? void 0 : price.toString()
95
+ ]));
96
+ return [
97
+ asset,
98
+ {
99
+ value
100
+ }
101
+ ];
102
+ })) : {};
103
+ const timestamp = Date.now();
104
+ return await new PayloadBuilder({
105
+ schema
106
+ }).fields({
107
+ assets,
108
+ timestamp
109
+ }).build();
110
+ }, "divineCoinGeckoPrices");
111
+
112
+ // src/lib/divineUniswapPrices.ts
113
+ import { assertEx } from "@xylabs/assert";
114
+ import { exists as exists2 } from "@xylabs/exists";
115
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema2 } from "@xyo-network/crypto-asset-payload-plugin";
116
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
117
+ var schema2 = CryptoMarketAssetSchema2;
118
+ var mapUniswapToken = /* @__PURE__ */ __name((symbol) => {
119
+ if (symbol.toLowerCase() === "wbtc") return "btc";
120
+ if (symbol.toLowerCase() === "weth") return "eth";
121
+ if (symbol.toLowerCase() === "usdt") return "usd";
122
+ return symbol.toLowerCase();
123
+ }, "mapUniswapToken");
124
+ var pairsContainingToken = /* @__PURE__ */ __name((uniswapPayload, token) => {
125
+ return uniswapPayload == null ? void 0 : uniswapPayload.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(exists2);
126
+ }, "pairsContainingToken");
127
+ var tokensFromPairs = /* @__PURE__ */ __name((pairs) => {
128
+ return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
129
+ }, "tokensFromPairs");
130
+ var valuesFromTokenPairs = /* @__PURE__ */ __name((tokensPairs, token) => {
131
+ return Object.fromEntries(tokensPairs.map((pair) => {
132
+ const current = pair.find((p) => p.symbol.toLowerCase() === token);
133
+ const other = pair.find((p) => p.symbol.toLowerCase() !== token);
134
+ return [
135
+ other == null ? void 0 : other.symbol.toLowerCase(),
136
+ current == null ? void 0 : current.value.toString()
137
+ ];
138
+ }).map((x) => [
139
+ mapUniswapToken(assertEx(x[0], () => "Undefined Token")),
140
+ x[1]
141
+ ]));
142
+ }, "valuesFromTokenPairs");
143
+ var divineUniswapPrices = /* @__PURE__ */ __name(async (uniswapPayload) => {
144
+ let assets = {};
145
+ if (uniswapPayload) {
146
+ const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
147
+ assets = Object.fromEntries([
148
+ ...tokens
149
+ ].map((token) => {
150
+ const pairs = pairsContainingToken(uniswapPayload, token);
151
+ const value = valuesFromTokenPairs(pairs, token);
152
+ const assetInfo = {
153
+ value
154
+ };
155
+ return [
156
+ token,
157
+ assetInfo
158
+ ];
159
+ }));
160
+ }
161
+ const timestamp = Date.now();
162
+ return await new PayloadBuilder2({
163
+ schema: schema2
164
+ }).fields({
165
+ assets,
166
+ timestamp
167
+ }).build();
168
+ }, "divineUniswapPrices");
169
+
170
+ // src/lib/divinePrices.ts
171
+ var schema3 = CryptoMarketAssetSchema3;
172
+ var divinePrices = /* @__PURE__ */ __name(async (coinGeckoPayload, uniswapPayload) => {
173
+ const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload);
174
+ const uniswapPrices = await divineUniswapPrices(uniswapPayload);
175
+ const prices = [
176
+ uniswapPayload,
177
+ coinGeckoPayload
178
+ ].some(exists3);
179
+ const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
180
+ const timestamp = Date.now();
181
+ return await new PayloadBuilder3({
182
+ schema: schema3
183
+ }).fields({
184
+ assets,
185
+ timestamp
186
+ }).build();
187
+ }, "divinePrices");
188
+
189
+ // src/Schema.ts
190
+ var CryptoMarketAssetDivinerQuerySchema = "network.xyo.crypto.asset.diviner.query";
191
+ var CryptoMarketAssetDivinerConfigSchema = "network.xyo.crypto.asset.diviner.config";
192
+
193
+ // src/Diviner.ts
194
+ var _CryptoMarketAssetDiviner = class _CryptoMarketAssetDiviner extends AbstractDiviner {
195
+ async divineHandler(payloads) {
196
+ const coinGeckoPayload = payloads == null ? void 0 : payloads.find((payload) => (payload == null ? void 0 : payload.schema) === CoingeckoCryptoMarketSchema);
197
+ const uniswapPayload = payloads == null ? void 0 : payloads.find((payload) => (payload == null ? void 0 : payload.schema) === UniswapCryptoMarketSchema);
198
+ const result = await divinePrices(coinGeckoPayload, uniswapPayload);
199
+ return [
200
+ result
201
+ ];
202
+ }
203
+ };
204
+ __name(_CryptoMarketAssetDiviner, "CryptoMarketAssetDiviner");
205
+ __publicField(_CryptoMarketAssetDiviner, "configSchemas", [
206
+ ...__superGet(_CryptoMarketAssetDiviner, _CryptoMarketAssetDiviner, "configSchemas"),
207
+ CryptoMarketAssetDivinerConfigSchema
208
+ ]);
209
+ __publicField(_CryptoMarketAssetDiviner, "defaultConfigSchema", CryptoMarketAssetDivinerConfigSchema);
210
+ __publicField(_CryptoMarketAssetDiviner, "targetSchema", CryptoMarketAssetSchema4);
211
+ var CryptoMarketAssetDiviner = _CryptoMarketAssetDiviner;
212
+
213
+ // src/Plugin.ts
214
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema5 } from "@xyo-network/crypto-asset-payload-plugin";
215
+ import { PayloadSetSchema } from "@xyo-network/payload-model";
216
+ import { createPayloadSetDivinerPlugin } from "@xyo-network/payloadset-plugin";
217
+ var CryptoMarketAssetPlugin = /* @__PURE__ */ __name(() => createPayloadSetDivinerPlugin({
218
+ required: {
219
+ [CryptoMarketAssetSchema5]: 1
220
+ },
221
+ schema: PayloadSetSchema
222
+ }, {
223
+ diviner: /* @__PURE__ */ __name(async (params) => {
224
+ return await CryptoMarketAssetDiviner.create(params);
225
+ }, "diviner")
226
+ }), "CryptoMarketAssetPlugin");
227
+ export {
228
+ CryptoMarketAssetDiviner,
229
+ CryptoMarketAssetDivinerConfigSchema,
230
+ CryptoMarketAssetDivinerQuerySchema,
231
+ CryptoMarketAssetPlugin,
232
+ CryptoMarketAssetPlugin as default
233
+ };
234
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Diviner.ts","../../src/lib/divinePrices.ts","../../src/lib/average.ts","../../src/lib/divineCoinGeckoPrices.ts","../../src/lib/divineUniswapPrices.ts","../../src/Schema.ts","../../src/Plugin.ts"],"sourcesContent":["import { CoingeckoCryptoMarketPayload, CoingeckoCryptoMarketSchema } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport { CryptoMarketAssetPayload, CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport { DivinerConfig, DivinerModule, DivinerParams } from '@xyo-network/diviner-model'\nimport { AnyConfigSchema, Module } from '@xyo-network/module-model'\nimport { Payload, Schema } from '@xyo-network/payload-model'\nimport { UniswapCryptoMarketPayload, UniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'\n\nimport { divinePrices } from './lib/index.ts'\nimport { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts'\n\nexport type CryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: CryptoMarketAssetDivinerConfigSchema }>\nexport type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>\n\nexport class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams>\n extends AbstractDiviner<TParams>\n implements DivinerModule, Module {\n static override readonly configSchemas: Schema[] = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema]\n static override readonly defaultConfigSchema: Schema = CryptoMarketAssetDivinerConfigSchema\n static override targetSchema = CryptoMarketAssetSchema\n\n protected override async divineHandler(payloads?: Payload[]): Promise<Payload[]> {\n const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload\n const uniswapPayload = payloads?.find(payload => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload\n const result: CryptoMarketAssetPayload = await divinePrices(coinGeckoPayload, uniswapPayload)\n return [result]\n }\n}\n","import { exists } from '@xylabs/exists'\nimport { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport { CryptoMarketAssetPayload, CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'\n\nimport { average } from './average.ts'\nimport { divineCoinGeckoPrices } from './divineCoinGeckoPrices.ts'\nimport { divineUniswapPrices } from './divineUniswapPrices.ts'\n\nconst schema = CryptoMarketAssetSchema\n\nexport const divinePrices = async (\n coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined,\n uniswapPayload: UniswapCryptoMarketPayload | undefined,\n): Promise<CryptoMarketAssetPayload> => {\n const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload)\n const uniswapPrices = await divineUniswapPrices(uniswapPayload)\n const prices = [uniswapPayload, coinGeckoPayload].some(exists)\n const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}\n const timestamp = Date.now()\n return await new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","import { exists } from '@xylabs/exists'\nimport { AssetInfo, CryptoMarketAssetPayload, Currency, Token } from '@xyo-network/crypto-asset-payload-plugin'\n\nconst isNumber = (val: number | undefined): val is number => {\n return val !== undefined\n}\n\nconst parseStringifiedNumber = (value: string | undefined): number | undefined => {\n if (!value) return undefined\n const parsed = Number.parseFloat(value)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nconst averageStringifiedNumbers = (...prices: (string | undefined)[]): number | undefined => {\n const numbers = prices.map(parseStringifiedNumber).filter(isNumber)\n return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : undefined\n}\n\nexport const average = (...input: (CryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {\n // Get all the assets represented\n const payloads = input.filter(exists)\n const tokens = new Set<Token>(payloads.flatMap(payload => Object.keys(payload.assets).map<Token>(t => t as Token)))\n // Get all the valuations used\n const valuations = new Set<Token | Currency>(\n [...tokens].flatMap((asset) => {\n const assetInfo = payloads.map(p => p.assets?.[asset]).filter(exists)\n const valueBasis = new Set<Currency | Token>(assetInfo.flatMap(v => Object.keys(v.value) as unknown as Currency | Token).filter(exists))\n return [...valueBasis]\n }),\n )\n // For each of the tokens, calculate the average valuation for each of valuation bases\n const assets: Record<string, AssetInfo> = Object.fromEntries(\n [...tokens].map((token) => {\n const assetInfo = payloads.map(p => p.assets?.[token]).filter(exists)\n const value = Object.fromEntries(\n [...valuations].map((valuation) => {\n const assetValuations = assetInfo.map(info => info.value?.[valuation])\n const averageAssetValuation = averageStringifiedNumbers(...assetValuations)\n return [valuation, averageAssetValuation?.toString()]\n }),\n )\n return [token, { value }]\n }),\n )\n return assets\n}\n","import { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport { AssetInfo, CryptoMarketAssetPayload, CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\n\nconst schema = CryptoMarketAssetSchema\n\nconst valuationExists = (value: [string, Partial<Record<string, number>> | undefined]): value is [string, Partial<Record<string, number>>] => {\n return !!value[1]\n}\n\nconst otherValueExists = (value: [string, number | undefined]): value is [string, number] => {\n const possiblyNumber = value[1]\n return typeof possiblyNumber === 'number' && !Number.isNaN(possiblyNumber)\n}\n\nexport const divineCoinGeckoPrices = async (payload: CoingeckoCryptoMarketPayload | undefined): Promise<CryptoMarketAssetPayload> => {\n const assets: Record<string, AssetInfo>\n = payload && payload?.assets\n ? Object.fromEntries(\n Object.entries(payload.assets)\n .filter(valuationExists)\n .map(([asset, valuation]) => {\n const value = Object.fromEntries(\n Object.entries(valuation)\n .filter(otherValueExists)\n .map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()]),\n )\n return [asset, { value }]\n }),\n )\n : {}\n const timestamp = Date.now()\n return await new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport { AssetInfo, CryptoMarketAssetPayload, CryptoMarketAssetSchema, Currency, Token, ValueBasis } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/payload-builder'\nimport { UniswapCryptoMarketPayload, UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin'\n\nconst schema = CryptoMarketAssetSchema\n\nconst mapUniswapToken = (symbol: string): Token | Currency => {\n // TODO: Actually calculate the value of the token/stablecoin based on others\n // to weed out individual fluctuations in price\n if (symbol.toLowerCase() === 'wbtc') return 'btc'\n if (symbol.toLowerCase() === 'weth') return 'eth'\n if (symbol.toLowerCase() === 'usdt') return 'usd'\n return symbol.toLowerCase() as Token\n}\n\nconst pairsContainingToken = (uniswapPayload: UniswapCryptoMarketPayload, token: Token) => {\n return uniswapPayload?.pairs\n .map(p => p.tokens)\n .filter(p => p.some(x => x.symbol.toLowerCase() === token))\n .filter(exists)\n}\n\nconst tokensFromPairs = (pairs: UniswapCryptoPair[]) => {\n return pairs.flatMap(p => p.tokens).map(t => t.symbol.toLowerCase() as Token)\n}\n\nconst valuesFromTokenPairs = (tokensPairs: UniswapCryptoToken[][], token: Token): ValueBasis => {\n return Object.fromEntries(\n tokensPairs\n .map((pair) => {\n const current = pair.find(p => p.symbol.toLowerCase() === token)\n const other = pair.find(p => p.symbol.toLowerCase() !== token)\n return [other?.symbol.toLowerCase(), current?.value.toString()]\n })\n .map(x => [mapUniswapToken(assertEx(x[0], () => 'Undefined Token')), x[1]]),\n )\n}\n\nexport const divineUniswapPrices = async (uniswapPayload: UniswapCryptoMarketPayload | undefined): Promise<CryptoMarketAssetPayload> => {\n let assets: Partial<Record<Token, AssetInfo | undefined>> = {}\n if (uniswapPayload) {\n const tokens: Set<Token> = new Set(tokensFromPairs(uniswapPayload.pairs))\n assets = Object.fromEntries(\n [...tokens].map((token) => {\n const pairs = pairsContainingToken(uniswapPayload, token)\n const value: ValueBasis = valuesFromTokenPairs(pairs, token)\n const assetInfo: AssetInfo = { value }\n return [token, assetInfo]\n }),\n )\n }\n const timestamp = Date.now()\n return await new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","export type CryptoMarketAssetDivinerQuerySchema = 'network.xyo.crypto.asset.diviner.query'\nexport const CryptoMarketAssetDivinerQuerySchema: CryptoMarketAssetDivinerQuerySchema = 'network.xyo.crypto.asset.diviner.query'\n\nexport type CryptoMarketAssetDivinerConfigSchema = 'network.xyo.crypto.asset.diviner.config'\nexport const CryptoMarketAssetDivinerConfigSchema: CryptoMarketAssetDivinerConfigSchema = 'network.xyo.crypto.asset.diviner.config'\n","import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadSetSchema } from '@xyo-network/payload-model'\nimport { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'\n\nimport { CryptoMarketAssetDiviner } from './Diviner.ts'\n\nexport const CryptoMarketAssetPlugin = () =>\n createPayloadSetDivinerPlugin<CryptoMarketAssetDiviner>(\n { required: { [CryptoMarketAssetSchema]: 1 }, schema: PayloadSetSchema },\n {\n diviner: async (params) => {\n return (await CryptoMarketAssetDiviner.create(params)) as CryptoMarketAssetDiviner\n },\n },\n )\n"],"mappings":"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","names":["CoingeckoCryptoMarketSchema","CryptoMarketAssetSchema","AbstractDiviner","UniswapCryptoMarketSchema","exists","CryptoMarketAssetSchema","PayloadBuilder","exists","isNumber","val","undefined","parseStringifiedNumber","value","parsed","Number","parseFloat","isNaN","averageStringifiedNumbers","prices","numbers","map","filter","length","reduce","sum","n","average","input","payloads","exists","tokens","Set","flatMap","payload","Object","keys","assets","t","valuations","asset","assetInfo","p","valueBasis","v","fromEntries","token","valuation","assetValuations","info","averageAssetValuation","toString","CryptoMarketAssetSchema","PayloadBuilder","schema","CryptoMarketAssetSchema","valuationExists","value","otherValueExists","possiblyNumber","Number","isNaN","divineCoinGeckoPrices","payload","assets","Object","fromEntries","entries","filter","map","asset","valuation","symbol","price","toLowerCase","toString","timestamp","Date","now","PayloadBuilder","fields","build","assertEx","exists","CryptoMarketAssetSchema","PayloadBuilder","schema","CryptoMarketAssetSchema","mapUniswapToken","symbol","toLowerCase","pairsContainingToken","uniswapPayload","token","pairs","map","p","tokens","filter","some","x","exists","tokensFromPairs","flatMap","t","valuesFromTokenPairs","tokensPairs","Object","fromEntries","pair","current","find","other","value","toString","assertEx","divineUniswapPrices","assets","Set","assetInfo","timestamp","Date","now","PayloadBuilder","fields","build","schema","CryptoMarketAssetSchema","divinePrices","coinGeckoPayload","uniswapPayload","coinGeckoPrices","divineCoinGeckoPrices","uniswapPrices","divineUniswapPrices","prices","some","exists","assets","average","timestamp","Date","now","PayloadBuilder","fields","build","CryptoMarketAssetDivinerQuerySchema","CryptoMarketAssetDivinerConfigSchema","CryptoMarketAssetDiviner","AbstractDiviner","divineHandler","payloads","coinGeckoPayload","find","payload","schema","CoingeckoCryptoMarketSchema","uniswapPayload","UniswapCryptoMarketSchema","result","divinePrices","configSchemas","CryptoMarketAssetDivinerConfigSchema","defaultConfigSchema","targetSchema","CryptoMarketAssetSchema","CryptoMarketAssetSchema","PayloadSetSchema","createPayloadSetDivinerPlugin","CryptoMarketAssetPlugin","createPayloadSetDivinerPlugin","required","CryptoMarketAssetSchema","schema","PayloadSetSchema","diviner","params","CryptoMarketAssetDiviner","create"]}
@@ -1,2 +1,2 @@
1
- export * from './divinePrices.js';
1
+ export * from './divinePrices.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export * from './divinePrices.js';
1
+ export * from './divinePrices.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,2 +1,2 @@
1
- export * from './divinePrices.js';
1
+ export * from './divinePrices.ts';
2
2
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from './sampleCoinGecko.js';
2
- export * from './sampleUniswap.js';
1
+ export * from './sampleCoinGecko.ts';
2
+ export * from './sampleUniswap.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from './sampleCoinGecko.js';
2
- export * from './sampleUniswap.js';
1
+ export * from './sampleCoinGecko.ts';
2
+ export * from './sampleUniswap.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
@@ -1,3 +1,3 @@
1
- export * from './sampleCoinGecko.js';
2
- export * from './sampleUniswap.js';
1
+ export * from './sampleCoinGecko.ts';
2
+ export * from './sampleUniswap.ts';
3
3
  //# sourceMappingURL=index.d.ts.map
package/package.json CHANGED
@@ -10,23 +10,22 @@
10
10
  "url": "https://github.com/XYOracleNetwork/plugins/issues"
11
11
  },
12
12
  "dependencies": {
13
- "@xylabs/assert": "^3.6.1",
14
- "@xylabs/exists": "^3.6.1",
15
- "@xyo-network/coingecko-crypto-market-payload-plugin": "^2.99.3",
16
- "@xyo-network/crypto-asset-payload-plugin": "^2.99.3",
17
- "@xyo-network/diviner-abstract": "^2.110.6",
18
- "@xyo-network/diviner-model": "^2.110.6",
19
- "@xyo-network/module-model": "^2.110.6",
20
- "@xyo-network/payload-builder": "^2.110.6",
21
- "@xyo-network/payload-model": "^2.110.6",
22
- "@xyo-network/payloadset-plugin": "^2.110.6",
23
- "@xyo-network/uniswap-crypto-market-payload-plugin": "^2.99.3"
13
+ "@xylabs/assert": "^3.6.8",
14
+ "@xylabs/exists": "^3.6.8",
15
+ "@xyo-network/coingecko-crypto-market-payload-plugin": "^2.99.5",
16
+ "@xyo-network/crypto-asset-payload-plugin": "^2.99.5",
17
+ "@xyo-network/diviner-abstract": "^2.111.2",
18
+ "@xyo-network/diviner-model": "^2.111.2",
19
+ "@xyo-network/module-model": "^2.111.2",
20
+ "@xyo-network/payload-builder": "^2.111.2",
21
+ "@xyo-network/payload-model": "^2.111.2",
22
+ "@xyo-network/payloadset-plugin": "^2.111.2",
23
+ "@xyo-network/uniswap-crypto-market-payload-plugin": "^2.99.5"
24
24
  },
25
25
  "devDependencies": {
26
- "@xylabs/ts-scripts-yarn3": "^3.12.2",
27
- "@xylabs/tsconfig": "^3.12.2",
28
- "@xyo-network/account": "^2.110.6",
29
- "typescript": "^5.5.3"
26
+ "@xylabs/ts-scripts-yarn3": "^3.15.13",
27
+ "@xylabs/tsconfig": "^3.15.13",
28
+ "typescript": "^5.5.4"
30
29
  },
31
30
  "description": "Typescript/Javascript Plugins for XYO Platform",
32
31
  "types": "dist/node/index.d.ts",
@@ -39,7 +38,7 @@
39
38
  },
40
39
  "import": {
41
40
  "types": "./dist/browser/index.d.mts",
42
- "default": "./dist/browser/index.js"
41
+ "default": "./dist/browser/index.mjs"
43
42
  }
44
43
  },
45
44
  "node": {
@@ -49,14 +48,14 @@
49
48
  },
50
49
  "import": {
51
50
  "types": "./dist/node/index.d.mts",
52
- "default": "./dist/node/index.js"
51
+ "default": "./dist/node/index.mjs"
53
52
  }
54
53
  }
55
54
  },
56
55
  "./package.json": "./package.json"
57
56
  },
58
57
  "main": "dist/node/index.cjs",
59
- "module": "dist/node/index.js",
58
+ "module": "dist/node/index.mjs",
60
59
  "homepage": "https://xyo.network",
61
60
  "license": "LGPL-3.0-only",
62
61
  "publishConfig": {
@@ -67,6 +66,6 @@
67
66
  "url": "https://github.com/XYOracleNetwork/plugins.git"
68
67
  },
69
68
  "sideEffects": false,
70
- "version": "2.99.3",
69
+ "version": "2.99.5",
71
70
  "type": "module"
72
71
  }
package/src/Diviner.ts CHANGED
@@ -6,23 +6,22 @@ import { AnyConfigSchema, Module } from '@xyo-network/module-model'
6
6
  import { Payload, Schema } from '@xyo-network/payload-model'
7
7
  import { UniswapCryptoMarketPayload, UniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
8
8
 
9
- import { divinePrices } from './lib/index.js'
10
- import { CryptoMarketAssetDivinerConfigSchema } from './Schema.js'
9
+ import { divinePrices } from './lib/index.ts'
10
+ import { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts'
11
11
 
12
12
  export type CryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: CryptoMarketAssetDivinerConfigSchema }>
13
13
  export type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>
14
14
 
15
15
  export class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams>
16
16
  extends AbstractDiviner<TParams>
17
- implements DivinerModule, Module
18
- {
17
+ implements DivinerModule, Module {
19
18
  static override readonly configSchemas: Schema[] = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema]
20
19
  static override readonly defaultConfigSchema: Schema = CryptoMarketAssetDivinerConfigSchema
21
20
  static override targetSchema = CryptoMarketAssetSchema
22
21
 
23
22
  protected override async divineHandler(payloads?: Payload[]): Promise<Payload[]> {
24
- const coinGeckoPayload = payloads?.find((payload) => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload
25
- const uniswapPayload = payloads?.find((payload) => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload
23
+ const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload
24
+ const uniswapPayload = payloads?.find(payload => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload
26
25
  const result: CryptoMarketAssetPayload = await divinePrices(coinGeckoPayload, uniswapPayload)
27
26
  return [result]
28
27
  }
package/src/Plugin.ts CHANGED
@@ -2,7 +2,7 @@ import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugi
2
2
  import { PayloadSetSchema } from '@xyo-network/payload-model'
3
3
  import { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'
4
4
 
5
- import { CryptoMarketAssetDiviner } from './Diviner.js'
5
+ import { CryptoMarketAssetDiviner } from './Diviner.ts'
6
6
 
7
7
  export const CryptoMarketAssetPlugin = () =>
8
8
  createPayloadSetDivinerPlugin<CryptoMarketAssetDiviner>(
package/src/index.ts CHANGED
@@ -1,4 +1,4 @@
1
- export * from './Diviner.js'
1
+ export * from './Diviner.ts'
2
2
  // eslint-disable-next-line import/no-default-export
3
- export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.js'
4
- export * from './Schema.js'
3
+ export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts'
4
+ export * from './Schema.ts'
@@ -19,22 +19,22 @@ const averageStringifiedNumbers = (...prices: (string | undefined)[]): number |
19
19
  export const average = (...input: (CryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {
20
20
  // Get all the assets represented
21
21
  const payloads = input.filter(exists)
22
- const tokens = new Set<Token>(payloads.flatMap((payload) => Object.keys(payload.assets).map<Token>((t) => t as Token)))
22
+ const tokens = new Set<Token>(payloads.flatMap(payload => Object.keys(payload.assets).map<Token>(t => t as Token)))
23
23
  // Get all the valuations used
24
24
  const valuations = new Set<Token | Currency>(
25
25
  [...tokens].flatMap((asset) => {
26
- const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(exists)
27
- const valueBasis = new Set<Currency | Token>(assetInfo.flatMap((v) => Object.keys(v.value) as unknown as Currency | Token).filter(exists))
26
+ const assetInfo = payloads.map(p => p.assets?.[asset]).filter(exists)
27
+ const valueBasis = new Set<Currency | Token>(assetInfo.flatMap(v => Object.keys(v.value) as unknown as Currency | Token).filter(exists))
28
28
  return [...valueBasis]
29
29
  }),
30
30
  )
31
31
  // For each of the tokens, calculate the average valuation for each of valuation bases
32
32
  const assets: Record<string, AssetInfo> = Object.fromEntries(
33
33
  [...tokens].map((token) => {
34
- const assetInfo = payloads.map((p) => p.assets?.[token]).filter(exists)
34
+ const assetInfo = payloads.map(p => p.assets?.[token]).filter(exists)
35
35
  const value = Object.fromEntries(
36
36
  [...valuations].map((valuation) => {
37
- const assetValuations = assetInfo.map((info) => info.value?.[valuation])
37
+ const assetValuations = assetInfo.map(info => info.value?.[valuation])
38
38
  const averageAssetValuation = averageStringifiedNumbers(...assetValuations)
39
39
  return [valuation, averageAssetValuation?.toString()]
40
40
  }),
@@ -14,9 +14,9 @@ const otherValueExists = (value: [string, number | undefined]): value is [string
14
14
  }
15
15
 
16
16
  export const divineCoinGeckoPrices = async (payload: CoingeckoCryptoMarketPayload | undefined): Promise<CryptoMarketAssetPayload> => {
17
- const assets: Record<string, AssetInfo> =
18
- payload && payload?.assets ?
19
- Object.fromEntries(
17
+ const assets: Record<string, AssetInfo>
18
+ = payload && payload?.assets
19
+ ? Object.fromEntries(
20
20
  Object.entries(payload.assets)
21
21
  .filter(valuationExists)
22
22
  .map(([asset, valuation]) => {
@@ -28,7 +28,7 @@ export const divineCoinGeckoPrices = async (payload: CoingeckoCryptoMarketPayloa
28
28
  return [asset, { value }]
29
29
  }),
30
30
  )
31
- : {}
31
+ : {}
32
32
  const timestamp = Date.now()
33
33
  return await new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
34
34
  }
@@ -4,9 +4,9 @@ import { CryptoMarketAssetPayload, CryptoMarketAssetSchema } from '@xyo-network/
4
4
  import { PayloadBuilder } from '@xyo-network/payload-builder'
5
5
  import { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'
6
6
 
7
- import { average } from './average.js'
8
- import { divineCoinGeckoPrices } from './divineCoinGeckoPrices.js'
9
- import { divineUniswapPrices } from './divineUniswapPrices.js'
7
+ import { average } from './average.ts'
8
+ import { divineCoinGeckoPrices } from './divineCoinGeckoPrices.ts'
9
+ import { divineUniswapPrices } from './divineUniswapPrices.ts'
10
10
 
11
11
  const schema = CryptoMarketAssetSchema
12
12
 
@@ -17,24 +17,24 @@ const mapUniswapToken = (symbol: string): Token | Currency => {
17
17
 
18
18
  const pairsContainingToken = (uniswapPayload: UniswapCryptoMarketPayload, token: Token) => {
19
19
  return uniswapPayload?.pairs
20
- .map((p) => p.tokens)
21
- .filter((p) => p.some((x) => x.symbol.toLowerCase() === token))
20
+ .map(p => p.tokens)
21
+ .filter(p => p.some(x => x.symbol.toLowerCase() === token))
22
22
  .filter(exists)
23
23
  }
24
24
 
25
25
  const tokensFromPairs = (pairs: UniswapCryptoPair[]) => {
26
- return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase() as Token)
26
+ return pairs.flatMap(p => p.tokens).map(t => t.symbol.toLowerCase() as Token)
27
27
  }
28
28
 
29
29
  const valuesFromTokenPairs = (tokensPairs: UniswapCryptoToken[][], token: Token): ValueBasis => {
30
30
  return Object.fromEntries(
31
31
  tokensPairs
32
32
  .map((pair) => {
33
- const current = pair.find((p) => p.symbol.toLowerCase() === token)
34
- const other = pair.find((p) => p.symbol.toLowerCase() !== token)
33
+ const current = pair.find(p => p.symbol.toLowerCase() === token)
34
+ const other = pair.find(p => p.symbol.toLowerCase() !== token)
35
35
  return [other?.symbol.toLowerCase(), current?.value.toString()]
36
36
  })
37
- .map((x) => [mapUniswapToken(assertEx(x[0], () => 'Undefined Token')), x[1]]),
37
+ .map(x => [mapUniswapToken(assertEx(x[0], () => 'Undefined Token')), x[1]]),
38
38
  )
39
39
  }
40
40
 
package/src/lib/index.ts CHANGED
@@ -1 +1 @@
1
- export * from './divinePrices.js'
1
+ export * from './divinePrices.ts'
package/src/test/index.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from './sampleCoinGecko.js'
2
- export * from './sampleUniswap.js'
1
+ export * from './sampleCoinGecko.ts'
2
+ export * from './sampleUniswap.ts'