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

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.
@@ -2,11 +2,7 @@
2
2
  var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __getProtoOf = Object.getPrototypeOf;
6
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
7
- var __reflectGet = Reflect.get;
8
- var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
9
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
10
6
  var __export = (target, all) => {
11
7
  for (var name in all)
12
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -20,8 +16,6 @@ var __copyProps = (to, from, except, desc) => {
20
16
  return to;
21
17
  };
22
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
23
- var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
24
- var __superGet = (cls, obj, key) => __reflectGet(__getProtoOf(cls), key, obj);
25
19
 
26
20
  // src/index.ts
27
21
  var src_exports = {};
@@ -47,95 +41,76 @@ var import_payload_builder3 = require("@xyo-network/payload-builder");
47
41
 
48
42
  // src/lib/average.ts
49
43
  var import_exists = require("@xylabs/exists");
50
- var isNumber = /* @__PURE__ */ __name((val) => {
44
+ var isNumber = (val) => {
51
45
  return val !== void 0;
52
- }, "isNumber");
53
- var parseStringifiedNumber = /* @__PURE__ */ __name((value) => {
46
+ };
47
+ var parseStringifiedNumber = (value) => {
54
48
  if (!value) return void 0;
55
49
  const parsed = Number.parseFloat(value);
56
50
  return Number.isNaN(parsed) ? void 0 : parsed;
57
- }, "parseStringifiedNumber");
58
- var averageStringifiedNumbers = /* @__PURE__ */ __name((...prices) => {
51
+ };
52
+ var averageStringifiedNumbers = (...prices) => {
59
53
  const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
60
54
  return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
61
- }, "averageStringifiedNumbers");
62
- var average = /* @__PURE__ */ __name((...input) => {
55
+ };
56
+ var average = (...input) => {
63
57
  const payloads = input.filter(import_exists.exists);
64
58
  const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
65
- const valuations = new Set([
66
- ...tokens
67
- ].flatMap((asset) => {
68
- const assetInfo = payloads.map((p) => {
69
- var _a;
70
- return (_a = p.assets) == null ? void 0 : _a[asset];
71
- }).filter(import_exists.exists);
72
- const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(import_exists.exists));
73
- return [
74
- ...valueBasis
75
- ];
76
- }));
77
- const assets = Object.fromEntries([
78
- ...tokens
79
- ].map((token) => {
80
- const assetInfo = payloads.map((p) => {
81
- var _a;
82
- return (_a = p.assets) == null ? void 0 : _a[token];
83
- }).filter(import_exists.exists);
84
- const value = Object.fromEntries([
85
- ...valuations
86
- ].map((valuation) => {
87
- const assetValuations = assetInfo.map((info) => {
59
+ const valuations = new Set(
60
+ [...tokens].flatMap((asset) => {
61
+ const assetInfo = payloads.map((p) => {
62
+ var _a;
63
+ return (_a = p.assets) == null ? void 0 : _a[asset];
64
+ }).filter(import_exists.exists);
65
+ const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(import_exists.exists));
66
+ return [...valueBasis];
67
+ })
68
+ );
69
+ const assets = Object.fromEntries(
70
+ [...tokens].map((token) => {
71
+ const assetInfo = payloads.map((p) => {
88
72
  var _a;
89
- return (_a = info.value) == null ? void 0 : _a[valuation];
90
- });
91
- const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
92
- return [
93
- valuation,
94
- averageAssetValuation == null ? void 0 : averageAssetValuation.toString()
95
- ];
96
- }));
97
- return [
98
- token,
99
- {
100
- value
101
- }
102
- ];
103
- }));
73
+ return (_a = p.assets) == null ? void 0 : _a[token];
74
+ }).filter(import_exists.exists);
75
+ const value = Object.fromEntries(
76
+ [...valuations].map((valuation) => {
77
+ const assetValuations = assetInfo.map((info) => {
78
+ var _a;
79
+ return (_a = info.value) == null ? void 0 : _a[valuation];
80
+ });
81
+ const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
82
+ return [valuation, averageAssetValuation == null ? void 0 : averageAssetValuation.toString()];
83
+ })
84
+ );
85
+ return [token, { value }];
86
+ })
87
+ );
104
88
  return assets;
105
- }, "average");
89
+ };
106
90
 
107
91
  // src/lib/divineCoinGeckoPrices.ts
108
92
  var import_crypto_asset_payload_plugin = require("@xyo-network/crypto-asset-payload-plugin");
109
93
  var import_payload_builder = require("@xyo-network/payload-builder");
110
94
  var schema = import_crypto_asset_payload_plugin.CryptoMarketAssetSchema;
111
- var valuationExists = /* @__PURE__ */ __name((value) => {
95
+ var valuationExists = (value) => {
112
96
  return !!value[1];
113
- }, "valuationExists");
114
- var otherValueExists = /* @__PURE__ */ __name((value) => {
97
+ };
98
+ var otherValueExists = (value) => {
115
99
  const possiblyNumber = value[1];
116
100
  return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
117
- }, "otherValueExists");
118
- var divineCoinGeckoPrices = /* @__PURE__ */ __name(async (payload) => {
119
- const assets = payload && (payload == null ? void 0 : payload.assets) ? Object.fromEntries(Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
120
- const value = Object.fromEntries(Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [
121
- symbol.toLowerCase(),
122
- price == null ? void 0 : price.toString()
123
- ]));
124
- return [
125
- asset,
126
- {
127
- value
128
- }
129
- ];
130
- })) : {};
101
+ };
102
+ var divineCoinGeckoPrices = async (payload) => {
103
+ const assets = payload && (payload == null ? void 0 : payload.assets) ? Object.fromEntries(
104
+ Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
105
+ const value = Object.fromEntries(
106
+ Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [symbol.toLowerCase(), price == null ? void 0 : price.toString()])
107
+ );
108
+ return [asset, { value }];
109
+ })
110
+ ) : {};
131
111
  const timestamp = Date.now();
132
- return await new import_payload_builder.PayloadBuilder({
133
- schema
134
- }).fields({
135
- assets,
136
- timestamp
137
- }).build();
138
- }, "divineCoinGeckoPrices");
112
+ return await new import_payload_builder.PayloadBuilder({ schema }).fields({ assets, timestamp }).build();
113
+ };
139
114
 
140
115
  // src/lib/divineUniswapPrices.ts
141
116
  var import_assert = require("@xylabs/assert");
@@ -143,115 +118,84 @@ var import_exists2 = require("@xylabs/exists");
143
118
  var import_crypto_asset_payload_plugin2 = require("@xyo-network/crypto-asset-payload-plugin");
144
119
  var import_payload_builder2 = require("@xyo-network/payload-builder");
145
120
  var schema2 = import_crypto_asset_payload_plugin2.CryptoMarketAssetSchema;
146
- var mapUniswapToken = /* @__PURE__ */ __name((symbol) => {
121
+ var mapUniswapToken = (symbol) => {
147
122
  if (symbol.toLowerCase() === "wbtc") return "btc";
148
123
  if (symbol.toLowerCase() === "weth") return "eth";
149
124
  if (symbol.toLowerCase() === "usdt") return "usd";
150
125
  return symbol.toLowerCase();
151
- }, "mapUniswapToken");
152
- var pairsContainingToken = /* @__PURE__ */ __name((uniswapPayload, token) => {
126
+ };
127
+ var pairsContainingToken = (uniswapPayload, token) => {
153
128
  return uniswapPayload == null ? void 0 : uniswapPayload.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(import_exists2.exists);
154
- }, "pairsContainingToken");
155
- var tokensFromPairs = /* @__PURE__ */ __name((pairs) => {
129
+ };
130
+ var tokensFromPairs = (pairs) => {
156
131
  return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
157
- }, "tokensFromPairs");
158
- var valuesFromTokenPairs = /* @__PURE__ */ __name((tokensPairs, token) => {
159
- return Object.fromEntries(tokensPairs.map((pair) => {
160
- const current = pair.find((p) => p.symbol.toLowerCase() === token);
161
- const other = pair.find((p) => p.symbol.toLowerCase() !== token);
162
- return [
163
- other == null ? void 0 : other.symbol.toLowerCase(),
164
- current == null ? void 0 : current.value.toString()
165
- ];
166
- }).map((x) => [
167
- mapUniswapToken((0, import_assert.assertEx)(x[0], () => "Undefined Token")),
168
- x[1]
169
- ]));
170
- }, "valuesFromTokenPairs");
171
- var divineUniswapPrices = /* @__PURE__ */ __name(async (uniswapPayload) => {
132
+ };
133
+ var valuesFromTokenPairs = (tokensPairs, token) => {
134
+ return Object.fromEntries(
135
+ tokensPairs.map((pair) => {
136
+ const current = pair.find((p) => p.symbol.toLowerCase() === token);
137
+ const other = pair.find((p) => p.symbol.toLowerCase() !== token);
138
+ return [other == null ? void 0 : other.symbol.toLowerCase(), current == null ? void 0 : current.value.toString()];
139
+ }).map((x) => [mapUniswapToken((0, import_assert.assertEx)(x[0], () => "Undefined Token")), x[1]])
140
+ );
141
+ };
142
+ var divineUniswapPrices = async (uniswapPayload) => {
172
143
  let assets = {};
173
144
  if (uniswapPayload) {
174
145
  const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
175
- assets = Object.fromEntries([
176
- ...tokens
177
- ].map((token) => {
178
- const pairs = pairsContainingToken(uniswapPayload, token);
179
- const value = valuesFromTokenPairs(pairs, token);
180
- const assetInfo = {
181
- value
182
- };
183
- return [
184
- token,
185
- assetInfo
186
- ];
187
- }));
146
+ assets = Object.fromEntries(
147
+ [...tokens].map((token) => {
148
+ const pairs = pairsContainingToken(uniswapPayload, token);
149
+ const value = valuesFromTokenPairs(pairs, token);
150
+ const assetInfo = { value };
151
+ return [token, assetInfo];
152
+ })
153
+ );
188
154
  }
189
155
  const timestamp = Date.now();
190
- return await new import_payload_builder2.PayloadBuilder({
191
- schema: schema2
192
- }).fields({
193
- assets,
194
- timestamp
195
- }).build();
196
- }, "divineUniswapPrices");
156
+ return await new import_payload_builder2.PayloadBuilder({ schema: schema2 }).fields({ assets, timestamp }).build();
157
+ };
197
158
 
198
159
  // src/lib/divinePrices.ts
199
160
  var schema3 = import_crypto_asset_payload_plugin3.CryptoMarketAssetSchema;
200
- var divinePrices = /* @__PURE__ */ __name(async (coinGeckoPayload, uniswapPayload) => {
161
+ var divinePrices = async (coinGeckoPayload, uniswapPayload) => {
201
162
  const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload);
202
163
  const uniswapPrices = await divineUniswapPrices(uniswapPayload);
203
- const prices = [
204
- uniswapPayload,
205
- coinGeckoPayload
206
- ].some(import_exists3.exists);
164
+ const prices = [uniswapPayload, coinGeckoPayload].some(import_exists3.exists);
207
165
  const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
208
166
  const timestamp = Date.now();
209
- return await new import_payload_builder3.PayloadBuilder({
210
- schema: schema3
211
- }).fields({
212
- assets,
213
- timestamp
214
- }).build();
215
- }, "divinePrices");
167
+ return await new import_payload_builder3.PayloadBuilder({ schema: schema3 }).fields({ assets, timestamp }).build();
168
+ };
216
169
 
217
170
  // src/Schema.ts
218
171
  var CryptoMarketAssetDivinerQuerySchema = "network.xyo.crypto.asset.diviner.query";
219
172
  var CryptoMarketAssetDivinerConfigSchema = "network.xyo.crypto.asset.diviner.config";
220
173
 
221
174
  // src/Diviner.ts
222
- var _CryptoMarketAssetDiviner = class _CryptoMarketAssetDiviner extends import_diviner_abstract.AbstractDiviner {
175
+ var CryptoMarketAssetDiviner = class extends import_diviner_abstract.AbstractDiviner {
176
+ static configSchemas = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema];
177
+ static defaultConfigSchema = CryptoMarketAssetDivinerConfigSchema;
178
+ static targetSchema = import_crypto_asset_payload_plugin4.CryptoMarketAssetSchema;
223
179
  async divineHandler(payloads) {
224
180
  const coinGeckoPayload = payloads == null ? void 0 : payloads.find((payload) => (payload == null ? void 0 : payload.schema) === import_coingecko_crypto_market_payload_plugin.CoingeckoCryptoMarketSchema);
225
181
  const uniswapPayload = payloads == null ? void 0 : payloads.find((payload) => (payload == null ? void 0 : payload.schema) === import_uniswap_crypto_market_payload_plugin.UniswapCryptoMarketSchema);
226
182
  const result = await divinePrices(coinGeckoPayload, uniswapPayload);
227
- return [
228
- result
229
- ];
183
+ return [result];
230
184
  }
231
185
  };
232
- __name(_CryptoMarketAssetDiviner, "CryptoMarketAssetDiviner");
233
- __publicField(_CryptoMarketAssetDiviner, "configSchemas", [
234
- ...__superGet(_CryptoMarketAssetDiviner, _CryptoMarketAssetDiviner, "configSchemas"),
235
- CryptoMarketAssetDivinerConfigSchema
236
- ]);
237
- __publicField(_CryptoMarketAssetDiviner, "defaultConfigSchema", CryptoMarketAssetDivinerConfigSchema);
238
- __publicField(_CryptoMarketAssetDiviner, "targetSchema", import_crypto_asset_payload_plugin4.CryptoMarketAssetSchema);
239
- var CryptoMarketAssetDiviner = _CryptoMarketAssetDiviner;
240
186
 
241
187
  // src/Plugin.ts
242
188
  var import_crypto_asset_payload_plugin5 = require("@xyo-network/crypto-asset-payload-plugin");
243
189
  var import_payload_model = require("@xyo-network/payload-model");
244
190
  var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
245
- var CryptoMarketAssetPlugin = /* @__PURE__ */ __name(() => (0, import_payloadset_plugin.createPayloadSetDivinerPlugin)({
246
- required: {
247
- [import_crypto_asset_payload_plugin5.CryptoMarketAssetSchema]: 1
248
- },
249
- schema: import_payload_model.PayloadSetSchema
250
- }, {
251
- diviner: /* @__PURE__ */ __name(async (params) => {
252
- return await CryptoMarketAssetDiviner.create(params);
253
- }, "diviner")
254
- }), "CryptoMarketAssetPlugin");
191
+ var CryptoMarketAssetPlugin = () => (0, import_payloadset_plugin.createPayloadSetDivinerPlugin)(
192
+ { required: { [import_crypto_asset_payload_plugin5.CryptoMarketAssetSchema]: 1 }, schema: import_payload_model.PayloadSetSchema },
193
+ {
194
+ diviner: async (params) => {
195
+ return await CryptoMarketAssetDiviner.create(params);
196
+ }
197
+ }
198
+ );
255
199
  // Annotate the CommonJS export names for ESM import in node:
256
200
  0 && (module.exports = {
257
201
  CryptoMarketAssetDiviner,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner.ts'\n// eslint-disable-next-line import/no-default-export\nexport { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts'\nexport * from './Schema.ts'\n","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":["import_crypto_asset_payload_plugin","import_exists","import_crypto_asset_payload_plugin","import_payload_builder","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","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","import_exists","import_crypto_asset_payload_plugin","import_payload_builder","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","import_crypto_asset_payload_plugin","CryptoMarketAssetPlugin","createPayloadSetDivinerPlugin","required","CryptoMarketAssetSchema","schema","PayloadSetSchema","diviner","params","CryptoMarketAssetDiviner","create"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../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":["export * from './Diviner.ts'\n// eslint-disable-next-line import/no-default-export\nexport { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts'\nexport * from './Schema.ts'\n","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":["import_crypto_asset_payload_plugin","import_exists","import_crypto_asset_payload_plugin","import_payload_builder","import_exists","import_crypto_asset_payload_plugin","import_payload_builder","schema","schema","import_crypto_asset_payload_plugin"]}