@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.
@@ -1,8 +1,8 @@
1
1
  import { CryptoMarketAssetDiviner } from './Diviner.ts';
2
- export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import("@xylabs/object").BaseParamsFields & {
3
- account?: import("@xyo-network/account-model").AccountInstance | "random";
2
+ export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
3
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
4
4
  addToResolvers?: boolean;
5
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
5
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
6
6
  allowNameResolution?: boolean;
7
7
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
8
8
  schema: "network.xyo.crypto.asset.diviner.config";
@@ -1,8 +1,8 @@
1
1
  import { CryptoMarketAssetDiviner } from './Diviner.ts';
2
- export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import("@xylabs/object").BaseParamsFields & {
3
- account?: import("@xyo-network/account-model").AccountInstance | "random";
2
+ export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
3
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
4
4
  addToResolvers?: boolean;
5
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
5
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
6
6
  allowNameResolution?: boolean;
7
7
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
8
8
  schema: "network.xyo.crypto.asset.diviner.config";
@@ -1,8 +1,8 @@
1
1
  import { CryptoMarketAssetDiviner } from './Diviner.ts';
2
- export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import("@xylabs/object").BaseParamsFields & {
3
- account?: import("@xyo-network/account-model").AccountInstance | "random";
2
+ export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import(".store/@xylabs-object-npm-3.6.12-443b813787/package").BaseParamsFields & {
3
+ account?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance | "random";
4
4
  addToResolvers?: boolean;
5
- additionalSigners?: import("@xyo-network/account-model").AccountInstance[];
5
+ additionalSigners?: import(".store/@xyo-network-account-model-virtual-c593258ccf/package").AccountInstance[];
6
6
  allowNameResolution?: boolean;
7
7
  config: import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & import("@xyo-network/payload-model").SchemaFields & import("@xyo-network/payload-model").PayloadFields & Omit<import("@xyo-network/module-model").ArchivingModuleConfig & import("@xyo-network/module-model").ModuleConfigFields & {
8
8
  schema: "network.xyo.crypto.asset.diviner.config";
@@ -3,7 +3,6 @@ var __defProp = Object.defineProperty;
3
3
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
4
  var __getOwnPropNames = Object.getOwnPropertyNames;
5
5
  var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
7
6
  var __export = (target, all) => {
8
7
  for (var name in all)
9
8
  __defProp(target, name, { get: all[name], enumerable: true });
@@ -42,86 +41,67 @@ var import_payload_builder3 = require("@xyo-network/payload-builder");
42
41
 
43
42
  // src/lib/average.ts
44
43
  var import_exists = require("@xylabs/exists");
45
- var isNumber = /* @__PURE__ */ __name((val) => {
44
+ var isNumber = (val) => {
46
45
  return val !== void 0;
47
- }, "isNumber");
48
- var parseStringifiedNumber = /* @__PURE__ */ __name((value) => {
46
+ };
47
+ var parseStringifiedNumber = (value) => {
49
48
  if (!value) return void 0;
50
49
  const parsed = Number.parseFloat(value);
51
50
  return Number.isNaN(parsed) ? void 0 : parsed;
52
- }, "parseStringifiedNumber");
53
- var averageStringifiedNumbers = /* @__PURE__ */ __name((...prices) => {
51
+ };
52
+ var averageStringifiedNumbers = (...prices) => {
54
53
  const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
55
54
  return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
56
- }, "averageStringifiedNumbers");
57
- var average = /* @__PURE__ */ __name((...input) => {
55
+ };
56
+ var average = (...input) => {
58
57
  const payloads = input.filter(import_exists.exists);
59
58
  const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
60
- const valuations = new Set([
61
- ...tokens
62
- ].flatMap((asset) => {
63
- const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(import_exists.exists);
64
- const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(import_exists.exists));
65
- return [
66
- ...valueBasis
67
- ];
68
- }));
69
- const assets = Object.fromEntries([
70
- ...tokens
71
- ].map((token) => {
72
- const assetInfo = payloads.map((p) => p.assets?.[token]).filter(import_exists.exists);
73
- const value = Object.fromEntries([
74
- ...valuations
75
- ].map((valuation) => {
76
- const assetValuations = assetInfo.map((info) => info.value?.[valuation]);
77
- const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
78
- return [
79
- valuation,
80
- averageAssetValuation?.toString()
81
- ];
82
- }));
83
- return [
84
- token,
85
- {
86
- value
87
- }
88
- ];
89
- }));
59
+ const valuations = new Set(
60
+ [...tokens].flatMap((asset) => {
61
+ const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(import_exists.exists);
62
+ const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(import_exists.exists));
63
+ return [...valueBasis];
64
+ })
65
+ );
66
+ const assets = Object.fromEntries(
67
+ [...tokens].map((token) => {
68
+ const assetInfo = payloads.map((p) => p.assets?.[token]).filter(import_exists.exists);
69
+ const value = Object.fromEntries(
70
+ [...valuations].map((valuation) => {
71
+ const assetValuations = assetInfo.map((info) => info.value?.[valuation]);
72
+ const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
73
+ return [valuation, averageAssetValuation?.toString()];
74
+ })
75
+ );
76
+ return [token, { value }];
77
+ })
78
+ );
90
79
  return assets;
91
- }, "average");
80
+ };
92
81
 
93
82
  // src/lib/divineCoinGeckoPrices.ts
94
83
  var import_crypto_asset_payload_plugin = require("@xyo-network/crypto-asset-payload-plugin");
95
84
  var import_payload_builder = require("@xyo-network/payload-builder");
96
85
  var schema = import_crypto_asset_payload_plugin.CryptoMarketAssetSchema;
97
- var valuationExists = /* @__PURE__ */ __name((value) => {
86
+ var valuationExists = (value) => {
98
87
  return !!value[1];
99
- }, "valuationExists");
100
- var otherValueExists = /* @__PURE__ */ __name((value) => {
88
+ };
89
+ var otherValueExists = (value) => {
101
90
  const possiblyNumber = value[1];
102
91
  return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
103
- }, "otherValueExists");
104
- var divineCoinGeckoPrices = /* @__PURE__ */ __name(async (payload) => {
105
- const assets = payload && payload?.assets ? Object.fromEntries(Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
106
- const value = Object.fromEntries(Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [
107
- symbol.toLowerCase(),
108
- price?.toString()
109
- ]));
110
- return [
111
- asset,
112
- {
113
- value
114
- }
115
- ];
116
- })) : {};
92
+ };
93
+ var divineCoinGeckoPrices = async (payload) => {
94
+ const assets = payload && payload?.assets ? Object.fromEntries(
95
+ Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
96
+ const value = Object.fromEntries(
97
+ Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()])
98
+ );
99
+ return [asset, { value }];
100
+ })
101
+ ) : {};
117
102
  const timestamp = Date.now();
118
- return await new import_payload_builder.PayloadBuilder({
119
- schema
120
- }).fields({
121
- assets,
122
- timestamp
123
- }).build();
124
- }, "divineCoinGeckoPrices");
103
+ return await new import_payload_builder.PayloadBuilder({ schema }).fields({ assets, timestamp }).build();
104
+ };
125
105
 
126
106
  // src/lib/divineUniswapPrices.ts
127
107
  var import_assert = require("@xylabs/assert");
@@ -129,76 +109,54 @@ var import_exists2 = require("@xylabs/exists");
129
109
  var import_crypto_asset_payload_plugin2 = require("@xyo-network/crypto-asset-payload-plugin");
130
110
  var import_payload_builder2 = require("@xyo-network/payload-builder");
131
111
  var schema2 = import_crypto_asset_payload_plugin2.CryptoMarketAssetSchema;
132
- var mapUniswapToken = /* @__PURE__ */ __name((symbol) => {
112
+ var mapUniswapToken = (symbol) => {
133
113
  if (symbol.toLowerCase() === "wbtc") return "btc";
134
114
  if (symbol.toLowerCase() === "weth") return "eth";
135
115
  if (symbol.toLowerCase() === "usdt") return "usd";
136
116
  return symbol.toLowerCase();
137
- }, "mapUniswapToken");
138
- var pairsContainingToken = /* @__PURE__ */ __name((uniswapPayload, token) => {
117
+ };
118
+ var pairsContainingToken = (uniswapPayload, token) => {
139
119
  return uniswapPayload?.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(import_exists2.exists);
140
- }, "pairsContainingToken");
141
- var tokensFromPairs = /* @__PURE__ */ __name((pairs) => {
120
+ };
121
+ var tokensFromPairs = (pairs) => {
142
122
  return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
143
- }, "tokensFromPairs");
144
- var valuesFromTokenPairs = /* @__PURE__ */ __name((tokensPairs, token) => {
145
- return Object.fromEntries(tokensPairs.map((pair) => {
146
- const current = pair.find((p) => p.symbol.toLowerCase() === token);
147
- const other = pair.find((p) => p.symbol.toLowerCase() !== token);
148
- return [
149
- other?.symbol.toLowerCase(),
150
- current?.value.toString()
151
- ];
152
- }).map((x) => [
153
- mapUniswapToken((0, import_assert.assertEx)(x[0], () => "Undefined Token")),
154
- x[1]
155
- ]));
156
- }, "valuesFromTokenPairs");
157
- var divineUniswapPrices = /* @__PURE__ */ __name(async (uniswapPayload) => {
123
+ };
124
+ var valuesFromTokenPairs = (tokensPairs, token) => {
125
+ return Object.fromEntries(
126
+ tokensPairs.map((pair) => {
127
+ const current = pair.find((p) => p.symbol.toLowerCase() === token);
128
+ const other = pair.find((p) => p.symbol.toLowerCase() !== token);
129
+ return [other?.symbol.toLowerCase(), current?.value.toString()];
130
+ }).map((x) => [mapUniswapToken((0, import_assert.assertEx)(x[0], () => "Undefined Token")), x[1]])
131
+ );
132
+ };
133
+ var divineUniswapPrices = async (uniswapPayload) => {
158
134
  let assets = {};
159
135
  if (uniswapPayload) {
160
136
  const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
161
- assets = Object.fromEntries([
162
- ...tokens
163
- ].map((token) => {
164
- const pairs = pairsContainingToken(uniswapPayload, token);
165
- const value = valuesFromTokenPairs(pairs, token);
166
- const assetInfo = {
167
- value
168
- };
169
- return [
170
- token,
171
- assetInfo
172
- ];
173
- }));
137
+ assets = Object.fromEntries(
138
+ [...tokens].map((token) => {
139
+ const pairs = pairsContainingToken(uniswapPayload, token);
140
+ const value = valuesFromTokenPairs(pairs, token);
141
+ const assetInfo = { value };
142
+ return [token, assetInfo];
143
+ })
144
+ );
174
145
  }
175
146
  const timestamp = Date.now();
176
- return await new import_payload_builder2.PayloadBuilder({
177
- schema: schema2
178
- }).fields({
179
- assets,
180
- timestamp
181
- }).build();
182
- }, "divineUniswapPrices");
147
+ return await new import_payload_builder2.PayloadBuilder({ schema: schema2 }).fields({ assets, timestamp }).build();
148
+ };
183
149
 
184
150
  // src/lib/divinePrices.ts
185
151
  var schema3 = import_crypto_asset_payload_plugin3.CryptoMarketAssetSchema;
186
- var divinePrices = /* @__PURE__ */ __name(async (coinGeckoPayload, uniswapPayload) => {
152
+ var divinePrices = async (coinGeckoPayload, uniswapPayload) => {
187
153
  const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload);
188
154
  const uniswapPrices = await divineUniswapPrices(uniswapPayload);
189
- const prices = [
190
- uniswapPayload,
191
- coinGeckoPayload
192
- ].some(import_exists3.exists);
155
+ const prices = [uniswapPayload, coinGeckoPayload].some(import_exists3.exists);
193
156
  const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
194
157
  const timestamp = Date.now();
195
- return await new import_payload_builder3.PayloadBuilder({
196
- schema: schema3
197
- }).fields({
198
- assets,
199
- timestamp
200
- }).build();
201
- }, "divinePrices");
158
+ return await new import_payload_builder3.PayloadBuilder({ schema: schema3 }).fields({ assets, timestamp }).build();
159
+ };
202
160
 
203
161
  // src/Schema.ts
204
162
  var CryptoMarketAssetDivinerQuerySchema = "network.xyo.crypto.asset.diviner.query";
@@ -206,22 +164,14 @@ var CryptoMarketAssetDivinerConfigSchema = "network.xyo.crypto.asset.diviner.con
206
164
 
207
165
  // src/Diviner.ts
208
166
  var CryptoMarketAssetDiviner = class extends import_diviner_abstract.AbstractDiviner {
209
- static {
210
- __name(this, "CryptoMarketAssetDiviner");
211
- }
212
- static configSchemas = [
213
- ...super.configSchemas,
214
- CryptoMarketAssetDivinerConfigSchema
215
- ];
167
+ static configSchemas = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema];
216
168
  static defaultConfigSchema = CryptoMarketAssetDivinerConfigSchema;
217
169
  static targetSchema = import_crypto_asset_payload_plugin4.CryptoMarketAssetSchema;
218
170
  async divineHandler(payloads) {
219
171
  const coinGeckoPayload = payloads?.find((payload) => payload?.schema === import_coingecko_crypto_market_payload_plugin.CoingeckoCryptoMarketSchema);
220
172
  const uniswapPayload = payloads?.find((payload) => payload?.schema === import_uniswap_crypto_market_payload_plugin.UniswapCryptoMarketSchema);
221
173
  const result = await divinePrices(coinGeckoPayload, uniswapPayload);
222
- return [
223
- result
224
- ];
174
+ return [result];
225
175
  }
226
176
  };
227
177
 
@@ -229,14 +179,12 @@ var CryptoMarketAssetDiviner = class extends import_diviner_abstract.AbstractDiv
229
179
  var import_crypto_asset_payload_plugin5 = require("@xyo-network/crypto-asset-payload-plugin");
230
180
  var import_payload_model = require("@xyo-network/payload-model");
231
181
  var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
232
- var CryptoMarketAssetPlugin = /* @__PURE__ */ __name(() => (0, import_payloadset_plugin.createPayloadSetDivinerPlugin)({
233
- required: {
234
- [import_crypto_asset_payload_plugin5.CryptoMarketAssetSchema]: 1
235
- },
236
- schema: import_payload_model.PayloadSetSchema
237
- }, {
238
- diviner: /* @__PURE__ */ __name(async (params) => {
239
- return await CryptoMarketAssetDiviner.create(params);
240
- }, "diviner")
241
- }), "CryptoMarketAssetPlugin");
182
+ var CryptoMarketAssetPlugin = () => (0, import_payloadset_plugin.createPayloadSetDivinerPlugin)(
183
+ { required: { [import_crypto_asset_payload_plugin5.CryptoMarketAssetSchema]: 1 }, schema: import_payload_model.PayloadSetSchema },
184
+ {
185
+ diviner: async (params) => {
186
+ return await CryptoMarketAssetDiviner.create(params);
187
+ }
188
+ }
189
+ );
242
190
  //# sourceMappingURL=index.cjs.map
@@ -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":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;ACAA,oDAA0E;AAC1E,IAAAA,sCAAkE;AAClE,8BAAgC;AAIhC,kDAAsE;;;ACNtE,IAAAC,iBAAuB;AAEvB,IAAAC,sCAAkE;AAClE,IAAAC,0BAA+B;;;ACH/B,oBAAuB;AAGvB,IAAMC,WAAW,wBAACC,QAAAA;AAChB,SAAOA,QAAQC;AACjB,GAFiB;AAIjB,IAAMC,yBAAyB,wBAACC,UAAAA;AAC9B,MAAI,CAACA,MAAO,QAAOF;AACnB,QAAMG,SAASC,OAAOC,WAAWH,KAAAA;AACjC,SAAOE,OAAOE,MAAMH,MAAAA,IAAUH,SAAYG;AAC5C,GAJ+B;AAM/B,IAAMI,4BAA4B,2BAAIC,WAAAA;AACpC,QAAMC,UAAUD,OAAOE,IAAIT,sBAAAA,EAAwBU,OAAOb,QAAAA;AAC1D,SAAOW,QAAQG,SAAS,IAAIH,QAAQI,OAAO,CAACC,KAAKC,MAAMD,MAAMC,GAAG,CAAA,IAAKN,QAAQG,SAASZ;AACxF,GAHkC;AAK3B,IAAMgB,UAAU,2BAAIC,UAAAA;AAEzB,QAAMC,WAAWD,MAAMN,OAAOQ,oBAAAA;AAC9B,QAAMC,SAAS,IAAIC,IAAWH,SAASI,QAAQC,CAAAA,YAAWC,OAAOC,KAAKF,QAAQG,MAAM,EAAEhB,IAAWiB,CAAAA,MAAKA,CAAAA,CAAAA,CAAAA;AAEtG,QAAMC,aAAa,IAAIP,IACrB;OAAID;IAAQE,QAAQ,CAACO,UAAAA;AACnB,UAAMC,YAAYZ,SAASR,IAAIqB,CAAAA,MAAKA,EAAEL,SAASG,KAAAA,CAAM,EAAElB,OAAOQ,oBAAAA;AAC9D,UAAMa,aAAa,IAAIX,IAAsBS,UAAUR,QAAQW,CAAAA,MAAKT,OAAOC,KAAKQ,EAAE/B,KAAK,CAAA,EAAkCS,OAAOQ,oBAAAA,CAAAA;AAChI,WAAO;SAAIa;;EACb,CAAA,CAAA;AAGF,QAAMN,SAAoCF,OAAOU,YAC/C;OAAId;IAAQV,IAAI,CAACyB,UAAAA;AACf,UAAML,YAAYZ,SAASR,IAAIqB,CAAAA,MAAKA,EAAEL,SAASS,KAAAA,CAAM,EAAExB,OAAOQ,oBAAAA;AAC9D,UAAMjB,QAAQsB,OAAOU,YACnB;SAAIN;MAAYlB,IAAI,CAAC0B,cAAAA;AACnB,YAAMC,kBAAkBP,UAAUpB,IAAI4B,CAAAA,SAAQA,KAAKpC,QAAQkC,SAAAA,CAAU;AACrE,YAAMG,wBAAwBhC,0BAAAA,GAA6B8B,eAAAA;AAC3D,aAAO;QAACD;QAAWG,uBAAuBC,SAAAA;;IAC5C,CAAA,CAAA;AAEF,WAAO;MAACL;MAAO;QAAEjC;MAAM;;EACzB,CAAA,CAAA;AAEF,SAAOwB;AACT,GA3BuB;;;ACjBvB,yCAA6E;AAC7E,6BAA+B;AAE/B,IAAMe,SAASC;AAEf,IAAMC,kBAAkB,wBAACC,UAAAA;AACvB,SAAO,CAAC,CAACA,MAAM,CAAA;AACjB,GAFwB;AAIxB,IAAMC,mBAAmB,wBAACD,UAAAA;AACxB,QAAME,iBAAiBF,MAAM,CAAA;AAC7B,SAAO,OAAOE,mBAAmB,YAAY,CAACC,OAAOC,MAAMF,cAAAA;AAC7D,GAHyB;AAKlB,IAAMG,wBAAwB,8BAAOC,YAAAA;AAC1C,QAAMC,SACFD,WAAWA,SAASC,SAClBC,OAAOC,YACPD,OAAOE,QAAQJ,QAAQC,MAAM,EAC1BI,OAAOZ,eAAAA,EACPa,IAAI,CAAC,CAACC,OAAOC,SAAAA,MAAU;AACtB,UAAMd,QAAQQ,OAAOC,YACnBD,OAAOE,QAAQI,SAAAA,EACZH,OAAOV,gBAAAA,EACPW,IAAI,CAAC,CAACG,QAAQC,KAAAA,MAAW;MAACD,OAAOE,YAAW;MAAID,OAAOE,SAAAA;KAAW,CAAA;AAEvE,WAAO;MAACL;MAAO;QAAEb;MAAM;;EACzB,CAAA,CAAA,IAEF,CAAC;AACP,QAAMmB,YAAYC,KAAKC,IAAG;AAC1B,SAAO,MAAM,IAAIC,sCAAyC;IAAEzB;EAAO,CAAA,EAAG0B,OAAO;IAAEhB;IAAQY;EAAU,CAAA,EAAGK,MAAK;AAC3G,GAlBqC;;;ACfrC,oBAAyB;AACzB,IAAAC,iBAAuB;AACvB,IAAAC,sCAA0G;AAC1G,IAAAC,0BAA+B;AAG/B,IAAMC,UAASC;AAEf,IAAMC,kBAAkB,wBAACC,WAAAA;AAGvB,MAAIA,OAAOC,YAAW,MAAO,OAAQ,QAAO;AAC5C,MAAID,OAAOC,YAAW,MAAO,OAAQ,QAAO;AAC5C,MAAID,OAAOC,YAAW,MAAO,OAAQ,QAAO;AAC5C,SAAOD,OAAOC,YAAW;AAC3B,GAPwB;AASxB,IAAMC,uBAAuB,wBAACC,gBAA4CC,UAAAA;AACxE,SAAOD,gBAAgBE,MACpBC,IAAIC,CAAAA,MAAKA,EAAEC,MAAM,EACjBC,OAAOF,CAAAA,MAAKA,EAAEG,KAAKC,CAAAA,MAAKA,EAAEX,OAAOC,YAAW,MAAOG,KAAAA,CAAAA,EACnDK,OAAOG,qBAAAA;AACZ,GAL6B;AAO7B,IAAMC,kBAAkB,wBAACR,UAAAA;AACvB,SAAOA,MAAMS,QAAQP,CAAAA,MAAKA,EAAEC,MAAM,EAAEF,IAAIS,CAAAA,MAAKA,EAAEf,OAAOC,YAAW,CAAA;AACnE,GAFwB;AAIxB,IAAMe,uBAAuB,wBAACC,aAAqCb,UAAAA;AACjE,SAAOc,OAAOC,YACZF,YACGX,IAAI,CAACc,SAAAA;AACJ,UAAMC,UAAUD,KAAKE,KAAKf,CAAAA,MAAKA,EAAEP,OAAOC,YAAW,MAAOG,KAAAA;AAC1D,UAAMmB,QAAQH,KAAKE,KAAKf,CAAAA,MAAKA,EAAEP,OAAOC,YAAW,MAAOG,KAAAA;AACxD,WAAO;MAACmB,OAAOvB,OAAOC,YAAAA;MAAeoB,SAASG,MAAMC,SAAAA;;EACtD,CAAA,EACCnB,IAAIK,CAAAA,MAAK;IAACZ,oBAAgB2B,wBAASf,EAAE,CAAA,GAAI,MAAM,iBAAA,CAAA;IAAqBA,EAAE,CAAA;GAAG,CAAA;AAEhF,GAV6B;AAYtB,IAAMgB,sBAAsB,8BAAOxB,mBAAAA;AACxC,MAAIyB,SAAwD,CAAC;AAC7D,MAAIzB,gBAAgB;AAClB,UAAMK,SAAqB,IAAIqB,IAAIhB,gBAAgBV,eAAeE,KAAK,CAAA;AACvEuB,aAASV,OAAOC,YACd;SAAIX;MAAQF,IAAI,CAACF,UAAAA;AACf,YAAMC,QAAQH,qBAAqBC,gBAAgBC,KAAAA;AACnD,YAAMoB,QAAoBR,qBAAqBX,OAAOD,KAAAA;AACtD,YAAM0B,YAAuB;QAAEN;MAAM;AACrC,aAAO;QAACpB;QAAO0B;;IACjB,CAAA,CAAA;EAEJ;AACA,QAAMC,YAAYC,KAAKC,IAAG;AAC1B,SAAO,MAAM,IAAIC,uCAAyC;IAAErC,QAAAA;EAAO,CAAA,EAAGsC,OAAO;IAAEP;IAAQG;EAAU,CAAA,EAAGK,MAAK;AAC3G,GAfmC;;;AH9BnC,IAAMC,UAASC;AAER,IAAMC,eAAe,8BAC1BC,kBACAC,mBAAAA;AAEA,QAAMC,kBAAkB,MAAMC,sBAAsBH,gBAAAA;AACpD,QAAMI,gBAAgB,MAAMC,oBAAoBJ,cAAAA;AAChD,QAAMK,SAAS;IAACL;IAAgBD;IAAkBO,KAAKC,qBAAAA;AACvD,QAAMC,SAASH,SAASI,QAAQR,iBAAiBE,aAAAA,IAAiB,CAAC;AACnE,QAAMO,YAAYC,KAAKC,IAAG;AAC1B,SAAO,MAAM,IAAIC,uCAAyC;IAAEjB,QAAAA;EAAO,CAAA,EAAGkB,OAAO;IAAEN;IAAQE;EAAU,CAAA,EAAGK,MAAK;AAC3G,GAV4B;;;AIXrB,IAAMC,sCAA2E;AAGjF,IAAMC,uCAA6E;;;ALUnF,IAAMC,2BAAN,cACGC,wCAAAA;EAfV,OAeUA;;;EAER,OAAyBC,gBAA0B;OAAI,MAAMA;IAAeC;;EAC5E,OAAyBC,sBAA8BD;EACvD,OAAgBE,eAAeC;EAE/B,MAAyBC,cAAcC,UAA0C;AAC/E,UAAMC,mBAAmBD,UAAUE,KAAKC,CAAAA,YAAWA,SAASC,WAAWC,yEAAAA;AACvE,UAAMC,iBAAiBN,UAAUE,KAAKC,CAAAA,YAAWA,SAASC,WAAWG,qEAAAA;AACrE,UAAMC,SAAmC,MAAMC,aAAaR,kBAAkBK,cAAAA;AAC9E,WAAO;MAACE;;EACV;AACF;;;AM3BA,IAAAE,sCAAwC;AACxC,2BAAiC;AACjC,+BAA8C;AAIvC,IAAMC,0BAA0B,iCACrCC,wDACE;EAAEC,UAAU;IAAE,CAACC,2DAAAA,GAA0B;EAAE;EAAGC,QAAQC;AAAiB,GACvE;EACEC,SAAS,8BAAOC,WAAAA;AACd,WAAQ,MAAMC,yBAAyBC,OAAOF,MAAAA;EAChD,GAFS;AAGX,CAAA,GAPmC;","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","configSchemas","CryptoMarketAssetDivinerConfigSchema","defaultConfigSchema","targetSchema","CryptoMarketAssetSchema","divineHandler","payloads","coinGeckoPayload","find","payload","schema","CoingeckoCryptoMarketSchema","uniswapPayload","UniswapCryptoMarketSchema","result","divinePrices","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"]}