@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.
- package/dist/browser/Plugin.d.cts +3 -3
- package/dist/browser/Plugin.d.mts +3 -3
- package/dist/browser/Plugin.d.ts +3 -3
- package/dist/browser/index.cjs +83 -135
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.mjs +83 -137
- package/dist/browser/index.mjs.map +1 -1
- package/dist/neutral/Plugin.d.cts +3 -3
- package/dist/neutral/Plugin.d.mts +3 -3
- package/dist/neutral/Plugin.d.ts +3 -3
- package/dist/neutral/index.cjs +83 -135
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.mjs +83 -137
- package/dist/neutral/index.mjs.map +1 -1
- package/dist/node/Plugin.d.cts +3 -3
- package/dist/node/Plugin.d.mts +3 -3
- package/dist/node/Plugin.d.ts +3 -3
- package/dist/node/index.cjs +94 -150
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.mjs +94 -152
- package/dist/node/index.mjs.map +1 -1
- package/package.json +14 -14
package/dist/node/index.cjs
CHANGED
|
@@ -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 =
|
|
44
|
+
var isNumber = (val) => {
|
|
51
45
|
return val !== void 0;
|
|
52
|
-
}
|
|
53
|
-
var parseStringifiedNumber =
|
|
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
|
-
}
|
|
58
|
-
var averageStringifiedNumbers =
|
|
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
|
-
}
|
|
62
|
-
var average =
|
|
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
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
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 =
|
|
90
|
-
});
|
|
91
|
-
const
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
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
|
-
}
|
|
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 =
|
|
95
|
+
var valuationExists = (value) => {
|
|
112
96
|
return !!value[1];
|
|
113
|
-
}
|
|
114
|
-
var otherValueExists =
|
|
97
|
+
};
|
|
98
|
+
var otherValueExists = (value) => {
|
|
115
99
|
const possiblyNumber = value[1];
|
|
116
100
|
return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
|
|
117
|
-
}
|
|
118
|
-
var divineCoinGeckoPrices =
|
|
119
|
-
const assets = payload && (payload == null ? void 0 : payload.assets) ? Object.fromEntries(
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
}
|
|
152
|
-
var pairsContainingToken =
|
|
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
|
-
}
|
|
155
|
-
var tokensFromPairs =
|
|
129
|
+
};
|
|
130
|
+
var tokensFromPairs = (pairs) => {
|
|
156
131
|
return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
|
|
157
|
-
}
|
|
158
|
-
var valuesFromTokenPairs =
|
|
159
|
-
return Object.fromEntries(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
other == null ? void 0 : other.symbol.toLowerCase(),
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
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
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
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
|
-
|
|
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 =
|
|
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
|
-
|
|
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
|
|
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 =
|
|
246
|
-
required: {
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
|
|
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,
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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,MAAAA;AAzBrC;AAyB0CA,qBAAEL,WAAFK,mBAAWF;KAAM,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,MAAAA;AAjCrC;AAiC0CA,qBAAEL,WAAFK,mBAAWI;KAAM,EAAExB,OAAOQ,oBAAAA;AAC9D,UAAMjB,QAAQsB,OAAOU,YACnB;SAAIN;MAAYlB,IAAI,CAAC0B,cAAAA;AACnB,YAAMC,kBAAkBP,UAAUpB,IAAI4B,CAAAA,SAAAA;AApChD;AAoCwDA,0BAAKpC,UAALoC,mBAAaF;OAAU;AACrE,YAAMG,wBAAwBhC,0BAAAA,GAA6B8B,eAAAA;AAC3D,aAAO;QAACD;QAAWG,+DAAuBC;;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,YAAWA,mCAASC,UAClBC,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,+BAAOE;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,iDAAgBE,MACpBC,IAAIC,CAAAA,MAAKA,EAAEC,QACXC,OAAOF,CAAAA,MAAKA,EAAEG,KAAKC,CAAAA,MAAKA,EAAEX,OAAOC,YAAW,MAAOG,KAAAA,GACnDK,OAAOG;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,+BAAOvB,OAAOC;MAAeoB,mCAASG,MAAMC;;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,4BAAN,MAAMA,kCACHC,wCAAAA;EAMR,MAAyBC,cAAcC,UAA0C;AAC/E,UAAMC,mBAAmBD,qCAAUE,KAAKC,CAAAA,aAAWA,mCAASC,YAAWC;AACvE,UAAMC,iBAAiBN,qCAAUE,KAAKC,CAAAA,aAAWA,mCAASC,YAAWG;AACrE,UAAMC,SAAmC,MAAMC,aAAaR,kBAAkBK,cAAAA;AAC9E,WAAO;MAACE;;EACV;AACF;AAZUV;AAER,cAHWD,2BAGca,iBAA0B;KAAI,iEAAMA;EAAeC;;AAC5E,cAJWd,2BAIce,uBAA8BD;AACvD,cALWd,2BAKKgB,gBAAeC;AAL1B,IAAMjB,2BAAN;;;AMdP,IAAAkB,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","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"]}
|