@xyo-network/crypto-asset-plugin 2.99.4 → 2.99.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Diviner.d.cts +1 -1
- package/dist/browser/Diviner.d.cts.map +1 -1
- package/dist/browser/Diviner.d.mts +1 -1
- package/dist/browser/Diviner.d.mts.map +1 -1
- package/dist/browser/Diviner.d.ts +1 -1
- package/dist/browser/Diviner.d.ts.map +1 -1
- package/dist/browser/Plugin.d.cts +2 -2
- package/dist/browser/Plugin.d.mts +2 -2
- package/dist/browser/Plugin.d.ts +2 -2
- package/dist/browser/index.cjs +135 -83
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +3 -3
- package/dist/browser/index.d.mts +3 -3
- package/dist/browser/index.d.ts +3 -3
- package/dist/browser/index.mjs +221 -0
- package/dist/browser/index.mjs.map +1 -0
- package/dist/browser/lib/index.d.cts +1 -1
- package/dist/browser/lib/index.d.mts +1 -1
- package/dist/browser/lib/index.d.ts +1 -1
- package/dist/browser/test/index.d.cts +2 -2
- package/dist/browser/test/index.d.mts +2 -2
- package/dist/browser/test/index.d.ts +2 -2
- package/dist/neutral/Diviner.d.cts +1 -1
- package/dist/neutral/Diviner.d.cts.map +1 -1
- package/dist/neutral/Diviner.d.mts +1 -1
- package/dist/neutral/Diviner.d.mts.map +1 -1
- package/dist/neutral/Diviner.d.ts +1 -1
- package/dist/neutral/Diviner.d.ts.map +1 -1
- package/dist/neutral/Plugin.d.cts +2 -2
- package/dist/neutral/Plugin.d.mts +2 -2
- package/dist/neutral/Plugin.d.ts +2 -2
- package/dist/neutral/index.cjs +135 -83
- package/dist/neutral/index.cjs.map +1 -1
- package/dist/neutral/index.d.cts +3 -3
- package/dist/neutral/index.d.mts +3 -3
- package/dist/neutral/index.d.ts +3 -3
- package/dist/neutral/index.mjs +221 -0
- package/dist/neutral/index.mjs.map +1 -0
- package/dist/neutral/lib/index.d.cts +1 -1
- package/dist/neutral/lib/index.d.mts +1 -1
- package/dist/neutral/lib/index.d.ts +1 -1
- package/dist/neutral/test/index.d.cts +2 -2
- package/dist/neutral/test/index.d.mts +2 -2
- package/dist/neutral/test/index.d.ts +2 -2
- package/dist/node/Diviner.d.cts +1 -1
- package/dist/node/Diviner.d.cts.map +1 -1
- package/dist/node/Diviner.d.mts +1 -1
- package/dist/node/Diviner.d.mts.map +1 -1
- package/dist/node/Diviner.d.ts +1 -1
- package/dist/node/Diviner.d.ts.map +1 -1
- package/dist/node/Plugin.d.cts +2 -2
- package/dist/node/Plugin.d.mts +2 -2
- package/dist/node/Plugin.d.ts +2 -2
- package/dist/node/index.cjs +150 -94
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +3 -3
- package/dist/node/index.d.mts +3 -3
- package/dist/node/index.d.ts +3 -3
- package/dist/node/index.mjs +234 -0
- package/dist/node/index.mjs.map +1 -0
- package/dist/node/lib/index.d.cts +1 -1
- package/dist/node/lib/index.d.mts +1 -1
- package/dist/node/lib/index.d.ts +1 -1
- package/dist/node/test/index.d.cts +2 -2
- package/dist/node/test/index.d.mts +2 -2
- package/dist/node/test/index.d.ts +2 -2
- package/package.json +18 -18
- package/src/Diviner.ts +5 -6
- package/src/Plugin.ts +1 -1
- package/src/index.ts +3 -3
- package/src/lib/average.ts +5 -5
- package/src/lib/divineCoinGeckoPrices.ts +4 -4
- package/src/lib/divinePrices.ts +3 -3
- package/src/lib/divineUniswapPrices.ts +6 -6
- package/src/lib/index.ts +1 -1
- package/src/test/index.ts +2 -2
- package/dist/browser/index.js +0 -167
- package/dist/browser/index.js.map +0 -1
- package/dist/neutral/index.js +0 -167
- package/dist/neutral/index.js.map +0 -1
- package/dist/node/index.js +0 -176
- package/dist/node/index.js.map +0 -1
package/dist/neutral/index.cjs
CHANGED
|
@@ -3,6 +3,7 @@ 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 });
|
|
6
7
|
var __export = (target, all) => {
|
|
7
8
|
for (var name in all)
|
|
8
9
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -41,67 +42,86 @@ var import_payload_builder3 = require("@xyo-network/payload-builder");
|
|
|
41
42
|
|
|
42
43
|
// src/lib/average.ts
|
|
43
44
|
var import_exists = require("@xylabs/exists");
|
|
44
|
-
var isNumber = (val) => {
|
|
45
|
+
var isNumber = /* @__PURE__ */ __name((val) => {
|
|
45
46
|
return val !== void 0;
|
|
46
|
-
};
|
|
47
|
-
var parseStringifiedNumber = (value) => {
|
|
47
|
+
}, "isNumber");
|
|
48
|
+
var parseStringifiedNumber = /* @__PURE__ */ __name((value) => {
|
|
48
49
|
if (!value) return void 0;
|
|
49
50
|
const parsed = Number.parseFloat(value);
|
|
50
51
|
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
51
|
-
};
|
|
52
|
-
var averageStringifiedNumbers = (...prices) => {
|
|
52
|
+
}, "parseStringifiedNumber");
|
|
53
|
+
var averageStringifiedNumbers = /* @__PURE__ */ __name((...prices) => {
|
|
53
54
|
const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
|
|
54
55
|
return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
|
|
55
|
-
};
|
|
56
|
-
var average = (...input) => {
|
|
56
|
+
}, "averageStringifiedNumbers");
|
|
57
|
+
var average = /* @__PURE__ */ __name((...input) => {
|
|
57
58
|
const payloads = input.filter(import_exists.exists);
|
|
58
59
|
const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
|
|
59
|
-
const valuations = new Set(
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
);
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
+
}));
|
|
79
90
|
return assets;
|
|
80
|
-
};
|
|
91
|
+
}, "average");
|
|
81
92
|
|
|
82
93
|
// src/lib/divineCoinGeckoPrices.ts
|
|
83
94
|
var import_crypto_asset_payload_plugin = require("@xyo-network/crypto-asset-payload-plugin");
|
|
84
95
|
var import_payload_builder = require("@xyo-network/payload-builder");
|
|
85
96
|
var schema = import_crypto_asset_payload_plugin.CryptoMarketAssetSchema;
|
|
86
|
-
var valuationExists = (value) => {
|
|
97
|
+
var valuationExists = /* @__PURE__ */ __name((value) => {
|
|
87
98
|
return !!value[1];
|
|
88
|
-
};
|
|
89
|
-
var otherValueExists = (value) => {
|
|
99
|
+
}, "valuationExists");
|
|
100
|
+
var otherValueExists = /* @__PURE__ */ __name((value) => {
|
|
90
101
|
const possiblyNumber = value[1];
|
|
91
102
|
return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
|
|
92
|
-
};
|
|
93
|
-
var divineCoinGeckoPrices = async (payload) => {
|
|
94
|
-
const assets = payload && payload?.assets ? Object.fromEntries(
|
|
95
|
-
Object.entries(
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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
|
+
})) : {};
|
|
102
117
|
const timestamp = Date.now();
|
|
103
|
-
return await new import_payload_builder.PayloadBuilder({
|
|
104
|
-
|
|
118
|
+
return await new import_payload_builder.PayloadBuilder({
|
|
119
|
+
schema
|
|
120
|
+
}).fields({
|
|
121
|
+
assets,
|
|
122
|
+
timestamp
|
|
123
|
+
}).build();
|
|
124
|
+
}, "divineCoinGeckoPrices");
|
|
105
125
|
|
|
106
126
|
// src/lib/divineUniswapPrices.ts
|
|
107
127
|
var import_assert = require("@xylabs/assert");
|
|
@@ -109,54 +129,76 @@ var import_exists2 = require("@xylabs/exists");
|
|
|
109
129
|
var import_crypto_asset_payload_plugin2 = require("@xyo-network/crypto-asset-payload-plugin");
|
|
110
130
|
var import_payload_builder2 = require("@xyo-network/payload-builder");
|
|
111
131
|
var schema2 = import_crypto_asset_payload_plugin2.CryptoMarketAssetSchema;
|
|
112
|
-
var mapUniswapToken = (symbol) => {
|
|
132
|
+
var mapUniswapToken = /* @__PURE__ */ __name((symbol) => {
|
|
113
133
|
if (symbol.toLowerCase() === "wbtc") return "btc";
|
|
114
134
|
if (symbol.toLowerCase() === "weth") return "eth";
|
|
115
135
|
if (symbol.toLowerCase() === "usdt") return "usd";
|
|
116
136
|
return symbol.toLowerCase();
|
|
117
|
-
};
|
|
118
|
-
var pairsContainingToken = (uniswapPayload, token) => {
|
|
137
|
+
}, "mapUniswapToken");
|
|
138
|
+
var pairsContainingToken = /* @__PURE__ */ __name((uniswapPayload, token) => {
|
|
119
139
|
return uniswapPayload?.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(import_exists2.exists);
|
|
120
|
-
};
|
|
121
|
-
var tokensFromPairs = (pairs) => {
|
|
140
|
+
}, "pairsContainingToken");
|
|
141
|
+
var tokensFromPairs = /* @__PURE__ */ __name((pairs) => {
|
|
122
142
|
return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
|
|
123
|
-
};
|
|
124
|
-
var valuesFromTokenPairs = (tokensPairs, token) => {
|
|
125
|
-
return Object.fromEntries(
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
}
|
|
133
|
-
|
|
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) => {
|
|
134
158
|
let assets = {};
|
|
135
159
|
if (uniswapPayload) {
|
|
136
160
|
const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
|
|
137
|
-
assets = Object.fromEntries(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
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
|
+
}));
|
|
145
174
|
}
|
|
146
175
|
const timestamp = Date.now();
|
|
147
|
-
return await new import_payload_builder2.PayloadBuilder({
|
|
148
|
-
|
|
176
|
+
return await new import_payload_builder2.PayloadBuilder({
|
|
177
|
+
schema: schema2
|
|
178
|
+
}).fields({
|
|
179
|
+
assets,
|
|
180
|
+
timestamp
|
|
181
|
+
}).build();
|
|
182
|
+
}, "divineUniswapPrices");
|
|
149
183
|
|
|
150
184
|
// src/lib/divinePrices.ts
|
|
151
185
|
var schema3 = import_crypto_asset_payload_plugin3.CryptoMarketAssetSchema;
|
|
152
|
-
var divinePrices = async (coinGeckoPayload, uniswapPayload) => {
|
|
186
|
+
var divinePrices = /* @__PURE__ */ __name(async (coinGeckoPayload, uniswapPayload) => {
|
|
153
187
|
const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload);
|
|
154
188
|
const uniswapPrices = await divineUniswapPrices(uniswapPayload);
|
|
155
|
-
const prices = [
|
|
189
|
+
const prices = [
|
|
190
|
+
uniswapPayload,
|
|
191
|
+
coinGeckoPayload
|
|
192
|
+
].some(import_exists3.exists);
|
|
156
193
|
const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
|
|
157
194
|
const timestamp = Date.now();
|
|
158
|
-
return await new import_payload_builder3.PayloadBuilder({
|
|
159
|
-
|
|
195
|
+
return await new import_payload_builder3.PayloadBuilder({
|
|
196
|
+
schema: schema3
|
|
197
|
+
}).fields({
|
|
198
|
+
assets,
|
|
199
|
+
timestamp
|
|
200
|
+
}).build();
|
|
201
|
+
}, "divinePrices");
|
|
160
202
|
|
|
161
203
|
// src/Schema.ts
|
|
162
204
|
var CryptoMarketAssetDivinerQuerySchema = "network.xyo.crypto.asset.diviner.query";
|
|
@@ -164,14 +206,22 @@ var CryptoMarketAssetDivinerConfigSchema = "network.xyo.crypto.asset.diviner.con
|
|
|
164
206
|
|
|
165
207
|
// src/Diviner.ts
|
|
166
208
|
var CryptoMarketAssetDiviner = class extends import_diviner_abstract.AbstractDiviner {
|
|
167
|
-
static
|
|
209
|
+
static {
|
|
210
|
+
__name(this, "CryptoMarketAssetDiviner");
|
|
211
|
+
}
|
|
212
|
+
static configSchemas = [
|
|
213
|
+
...super.configSchemas,
|
|
214
|
+
CryptoMarketAssetDivinerConfigSchema
|
|
215
|
+
];
|
|
168
216
|
static defaultConfigSchema = CryptoMarketAssetDivinerConfigSchema;
|
|
169
217
|
static targetSchema = import_crypto_asset_payload_plugin4.CryptoMarketAssetSchema;
|
|
170
218
|
async divineHandler(payloads) {
|
|
171
219
|
const coinGeckoPayload = payloads?.find((payload) => payload?.schema === import_coingecko_crypto_market_payload_plugin.CoingeckoCryptoMarketSchema);
|
|
172
220
|
const uniswapPayload = payloads?.find((payload) => payload?.schema === import_uniswap_crypto_market_payload_plugin.UniswapCryptoMarketSchema);
|
|
173
221
|
const result = await divinePrices(coinGeckoPayload, uniswapPayload);
|
|
174
|
-
return [
|
|
222
|
+
return [
|
|
223
|
+
result
|
|
224
|
+
];
|
|
175
225
|
}
|
|
176
226
|
};
|
|
177
227
|
|
|
@@ -179,12 +229,14 @@ var CryptoMarketAssetDiviner = class extends import_diviner_abstract.AbstractDiv
|
|
|
179
229
|
var import_crypto_asset_payload_plugin5 = require("@xyo-network/crypto-asset-payload-plugin");
|
|
180
230
|
var import_payload_model = require("@xyo-network/payload-model");
|
|
181
231
|
var import_payloadset_plugin = require("@xyo-network/payloadset-plugin");
|
|
182
|
-
var CryptoMarketAssetPlugin = () => (0, import_payloadset_plugin.createPayloadSetDivinerPlugin)(
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
);
|
|
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");
|
|
190
242
|
//# 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.js'\n// eslint-disable-next-line import/no-default-export\nexport { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.js'\nexport * from './Schema.js'\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.js'\nimport { CryptoMarketAssetDivinerConfigSchema } from './Schema.js'\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{\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.js'\nimport { divineCoinGeckoPrices } from './divineCoinGeckoPrices.js'\nimport { divineUniswapPrices } from './divineUniswapPrices.js'\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.js'\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"]}
|
|
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"]}
|
package/dist/neutral/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Schema.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Schema.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/neutral/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Schema.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Schema.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/neutral/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export * from './Diviner.
|
|
2
|
-
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.
|
|
3
|
-
export * from './Schema.
|
|
1
|
+
export * from './Diviner.ts';
|
|
2
|
+
export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
|
|
3
|
+
export * from './Schema.ts';
|
|
4
4
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
3
|
+
|
|
4
|
+
// src/Diviner.ts
|
|
5
|
+
import { CoingeckoCryptoMarketSchema } from "@xyo-network/coingecko-crypto-market-payload-plugin";
|
|
6
|
+
import { CryptoMarketAssetSchema as CryptoMarketAssetSchema4 } from "@xyo-network/crypto-asset-payload-plugin";
|
|
7
|
+
import { AbstractDiviner } from "@xyo-network/diviner-abstract";
|
|
8
|
+
import { UniswapCryptoMarketSchema } from "@xyo-network/uniswap-crypto-market-payload-plugin";
|
|
9
|
+
|
|
10
|
+
// src/lib/divinePrices.ts
|
|
11
|
+
import { exists as exists3 } from "@xylabs/exists";
|
|
12
|
+
import { CryptoMarketAssetSchema as CryptoMarketAssetSchema3 } from "@xyo-network/crypto-asset-payload-plugin";
|
|
13
|
+
import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/payload-builder";
|
|
14
|
+
|
|
15
|
+
// src/lib/average.ts
|
|
16
|
+
import { exists } from "@xylabs/exists";
|
|
17
|
+
var isNumber = /* @__PURE__ */ __name((val) => {
|
|
18
|
+
return val !== void 0;
|
|
19
|
+
}, "isNumber");
|
|
20
|
+
var parseStringifiedNumber = /* @__PURE__ */ __name((value) => {
|
|
21
|
+
if (!value) return void 0;
|
|
22
|
+
const parsed = Number.parseFloat(value);
|
|
23
|
+
return Number.isNaN(parsed) ? void 0 : parsed;
|
|
24
|
+
}, "parseStringifiedNumber");
|
|
25
|
+
var averageStringifiedNumbers = /* @__PURE__ */ __name((...prices) => {
|
|
26
|
+
const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
|
|
27
|
+
return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
|
|
28
|
+
}, "averageStringifiedNumbers");
|
|
29
|
+
var average = /* @__PURE__ */ __name((...input) => {
|
|
30
|
+
const payloads = input.filter(exists);
|
|
31
|
+
const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
|
|
32
|
+
const valuations = new Set([
|
|
33
|
+
...tokens
|
|
34
|
+
].flatMap((asset) => {
|
|
35
|
+
const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(exists);
|
|
36
|
+
const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(exists));
|
|
37
|
+
return [
|
|
38
|
+
...valueBasis
|
|
39
|
+
];
|
|
40
|
+
}));
|
|
41
|
+
const assets = Object.fromEntries([
|
|
42
|
+
...tokens
|
|
43
|
+
].map((token) => {
|
|
44
|
+
const assetInfo = payloads.map((p) => p.assets?.[token]).filter(exists);
|
|
45
|
+
const value = Object.fromEntries([
|
|
46
|
+
...valuations
|
|
47
|
+
].map((valuation) => {
|
|
48
|
+
const assetValuations = assetInfo.map((info) => info.value?.[valuation]);
|
|
49
|
+
const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
|
|
50
|
+
return [
|
|
51
|
+
valuation,
|
|
52
|
+
averageAssetValuation?.toString()
|
|
53
|
+
];
|
|
54
|
+
}));
|
|
55
|
+
return [
|
|
56
|
+
token,
|
|
57
|
+
{
|
|
58
|
+
value
|
|
59
|
+
}
|
|
60
|
+
];
|
|
61
|
+
}));
|
|
62
|
+
return assets;
|
|
63
|
+
}, "average");
|
|
64
|
+
|
|
65
|
+
// src/lib/divineCoinGeckoPrices.ts
|
|
66
|
+
import { CryptoMarketAssetSchema } from "@xyo-network/crypto-asset-payload-plugin";
|
|
67
|
+
import { PayloadBuilder } from "@xyo-network/payload-builder";
|
|
68
|
+
var schema = CryptoMarketAssetSchema;
|
|
69
|
+
var valuationExists = /* @__PURE__ */ __name((value) => {
|
|
70
|
+
return !!value[1];
|
|
71
|
+
}, "valuationExists");
|
|
72
|
+
var otherValueExists = /* @__PURE__ */ __name((value) => {
|
|
73
|
+
const possiblyNumber = value[1];
|
|
74
|
+
return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
|
|
75
|
+
}, "otherValueExists");
|
|
76
|
+
var divineCoinGeckoPrices = /* @__PURE__ */ __name(async (payload) => {
|
|
77
|
+
const assets = payload && payload?.assets ? Object.fromEntries(Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
|
|
78
|
+
const value = Object.fromEntries(Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [
|
|
79
|
+
symbol.toLowerCase(),
|
|
80
|
+
price?.toString()
|
|
81
|
+
]));
|
|
82
|
+
return [
|
|
83
|
+
asset,
|
|
84
|
+
{
|
|
85
|
+
value
|
|
86
|
+
}
|
|
87
|
+
];
|
|
88
|
+
})) : {};
|
|
89
|
+
const timestamp = Date.now();
|
|
90
|
+
return await new PayloadBuilder({
|
|
91
|
+
schema
|
|
92
|
+
}).fields({
|
|
93
|
+
assets,
|
|
94
|
+
timestamp
|
|
95
|
+
}).build();
|
|
96
|
+
}, "divineCoinGeckoPrices");
|
|
97
|
+
|
|
98
|
+
// src/lib/divineUniswapPrices.ts
|
|
99
|
+
import { assertEx } from "@xylabs/assert";
|
|
100
|
+
import { exists as exists2 } from "@xylabs/exists";
|
|
101
|
+
import { CryptoMarketAssetSchema as CryptoMarketAssetSchema2 } from "@xyo-network/crypto-asset-payload-plugin";
|
|
102
|
+
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload-builder";
|
|
103
|
+
var schema2 = CryptoMarketAssetSchema2;
|
|
104
|
+
var mapUniswapToken = /* @__PURE__ */ __name((symbol) => {
|
|
105
|
+
if (symbol.toLowerCase() === "wbtc") return "btc";
|
|
106
|
+
if (symbol.toLowerCase() === "weth") return "eth";
|
|
107
|
+
if (symbol.toLowerCase() === "usdt") return "usd";
|
|
108
|
+
return symbol.toLowerCase();
|
|
109
|
+
}, "mapUniswapToken");
|
|
110
|
+
var pairsContainingToken = /* @__PURE__ */ __name((uniswapPayload, token) => {
|
|
111
|
+
return uniswapPayload?.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(exists2);
|
|
112
|
+
}, "pairsContainingToken");
|
|
113
|
+
var tokensFromPairs = /* @__PURE__ */ __name((pairs) => {
|
|
114
|
+
return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
|
|
115
|
+
}, "tokensFromPairs");
|
|
116
|
+
var valuesFromTokenPairs = /* @__PURE__ */ __name((tokensPairs, token) => {
|
|
117
|
+
return Object.fromEntries(tokensPairs.map((pair) => {
|
|
118
|
+
const current = pair.find((p) => p.symbol.toLowerCase() === token);
|
|
119
|
+
const other = pair.find((p) => p.symbol.toLowerCase() !== token);
|
|
120
|
+
return [
|
|
121
|
+
other?.symbol.toLowerCase(),
|
|
122
|
+
current?.value.toString()
|
|
123
|
+
];
|
|
124
|
+
}).map((x) => [
|
|
125
|
+
mapUniswapToken(assertEx(x[0], () => "Undefined Token")),
|
|
126
|
+
x[1]
|
|
127
|
+
]));
|
|
128
|
+
}, "valuesFromTokenPairs");
|
|
129
|
+
var divineUniswapPrices = /* @__PURE__ */ __name(async (uniswapPayload) => {
|
|
130
|
+
let assets = {};
|
|
131
|
+
if (uniswapPayload) {
|
|
132
|
+
const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
|
|
133
|
+
assets = Object.fromEntries([
|
|
134
|
+
...tokens
|
|
135
|
+
].map((token) => {
|
|
136
|
+
const pairs = pairsContainingToken(uniswapPayload, token);
|
|
137
|
+
const value = valuesFromTokenPairs(pairs, token);
|
|
138
|
+
const assetInfo = {
|
|
139
|
+
value
|
|
140
|
+
};
|
|
141
|
+
return [
|
|
142
|
+
token,
|
|
143
|
+
assetInfo
|
|
144
|
+
];
|
|
145
|
+
}));
|
|
146
|
+
}
|
|
147
|
+
const timestamp = Date.now();
|
|
148
|
+
return await new PayloadBuilder2({
|
|
149
|
+
schema: schema2
|
|
150
|
+
}).fields({
|
|
151
|
+
assets,
|
|
152
|
+
timestamp
|
|
153
|
+
}).build();
|
|
154
|
+
}, "divineUniswapPrices");
|
|
155
|
+
|
|
156
|
+
// src/lib/divinePrices.ts
|
|
157
|
+
var schema3 = CryptoMarketAssetSchema3;
|
|
158
|
+
var divinePrices = /* @__PURE__ */ __name(async (coinGeckoPayload, uniswapPayload) => {
|
|
159
|
+
const coinGeckoPrices = await divineCoinGeckoPrices(coinGeckoPayload);
|
|
160
|
+
const uniswapPrices = await divineUniswapPrices(uniswapPayload);
|
|
161
|
+
const prices = [
|
|
162
|
+
uniswapPayload,
|
|
163
|
+
coinGeckoPayload
|
|
164
|
+
].some(exists3);
|
|
165
|
+
const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
|
|
166
|
+
const timestamp = Date.now();
|
|
167
|
+
return await new PayloadBuilder3({
|
|
168
|
+
schema: schema3
|
|
169
|
+
}).fields({
|
|
170
|
+
assets,
|
|
171
|
+
timestamp
|
|
172
|
+
}).build();
|
|
173
|
+
}, "divinePrices");
|
|
174
|
+
|
|
175
|
+
// src/Schema.ts
|
|
176
|
+
var CryptoMarketAssetDivinerQuerySchema = "network.xyo.crypto.asset.diviner.query";
|
|
177
|
+
var CryptoMarketAssetDivinerConfigSchema = "network.xyo.crypto.asset.diviner.config";
|
|
178
|
+
|
|
179
|
+
// src/Diviner.ts
|
|
180
|
+
var CryptoMarketAssetDiviner = class extends AbstractDiviner {
|
|
181
|
+
static {
|
|
182
|
+
__name(this, "CryptoMarketAssetDiviner");
|
|
183
|
+
}
|
|
184
|
+
static configSchemas = [
|
|
185
|
+
...super.configSchemas,
|
|
186
|
+
CryptoMarketAssetDivinerConfigSchema
|
|
187
|
+
];
|
|
188
|
+
static defaultConfigSchema = CryptoMarketAssetDivinerConfigSchema;
|
|
189
|
+
static targetSchema = CryptoMarketAssetSchema4;
|
|
190
|
+
async divineHandler(payloads) {
|
|
191
|
+
const coinGeckoPayload = payloads?.find((payload) => payload?.schema === CoingeckoCryptoMarketSchema);
|
|
192
|
+
const uniswapPayload = payloads?.find((payload) => payload?.schema === UniswapCryptoMarketSchema);
|
|
193
|
+
const result = await divinePrices(coinGeckoPayload, uniswapPayload);
|
|
194
|
+
return [
|
|
195
|
+
result
|
|
196
|
+
];
|
|
197
|
+
}
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// src/Plugin.ts
|
|
201
|
+
import { CryptoMarketAssetSchema as CryptoMarketAssetSchema5 } from "@xyo-network/crypto-asset-payload-plugin";
|
|
202
|
+
import { PayloadSetSchema } from "@xyo-network/payload-model";
|
|
203
|
+
import { createPayloadSetDivinerPlugin } from "@xyo-network/payloadset-plugin";
|
|
204
|
+
var CryptoMarketAssetPlugin = /* @__PURE__ */ __name(() => createPayloadSetDivinerPlugin({
|
|
205
|
+
required: {
|
|
206
|
+
[CryptoMarketAssetSchema5]: 1
|
|
207
|
+
},
|
|
208
|
+
schema: PayloadSetSchema
|
|
209
|
+
}, {
|
|
210
|
+
diviner: /* @__PURE__ */ __name(async (params) => {
|
|
211
|
+
return await CryptoMarketAssetDiviner.create(params);
|
|
212
|
+
}, "diviner")
|
|
213
|
+
}), "CryptoMarketAssetPlugin");
|
|
214
|
+
export {
|
|
215
|
+
CryptoMarketAssetDiviner,
|
|
216
|
+
CryptoMarketAssetDivinerConfigSchema,
|
|
217
|
+
CryptoMarketAssetDivinerQuerySchema,
|
|
218
|
+
CryptoMarketAssetPlugin,
|
|
219
|
+
CryptoMarketAssetPlugin as default
|
|
220
|
+
};
|
|
221
|
+
//# sourceMappingURL=index.mjs.map
|