@xyo-network/crypto-asset-plugin 5.3.2 → 5.3.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/dist/neutral/Diviner.d.ts +18 -0
  2. package/dist/neutral/Diviner.d.ts.map +1 -0
  3. package/dist/neutral/Plugin.d.ts +3 -0
  4. package/dist/neutral/Plugin.d.ts.map +1 -0
  5. package/dist/neutral/Schema.d.ts +9 -0
  6. package/dist/neutral/Schema.d.ts.map +1 -0
  7. package/dist/neutral/index.d.ts +4 -0
  8. package/dist/neutral/index.d.ts.map +1 -0
  9. package/dist/neutral/index.mjs +167 -0
  10. package/dist/neutral/index.mjs.map +1 -0
  11. package/dist/neutral/lib/average.d.ts +3 -0
  12. package/dist/neutral/lib/average.d.ts.map +1 -0
  13. package/dist/neutral/lib/divineCoinGeckoPrices.d.ts +4 -0
  14. package/dist/neutral/lib/divineCoinGeckoPrices.d.ts.map +1 -0
  15. package/dist/neutral/lib/divinePrices.d.ts +5 -0
  16. package/dist/neutral/lib/divinePrices.d.ts.map +1 -0
  17. package/dist/neutral/lib/divineUniswapPrices.d.ts +4 -0
  18. package/dist/neutral/lib/divineUniswapPrices.d.ts.map +1 -0
  19. package/dist/neutral/lib/index.d.ts +2 -0
  20. package/dist/neutral/lib/index.d.ts.map +1 -0
  21. package/dist/neutral/test/index.d.ts +3 -0
  22. package/dist/neutral/test/index.d.ts.map +1 -0
  23. package/dist/neutral/test/sampleCoinGecko.d.ts +3 -0
  24. package/dist/neutral/test/sampleCoinGecko.d.ts.map +1 -0
  25. package/dist/neutral/test/sampleUniswap.d.ts +3 -0
  26. package/dist/neutral/test/sampleUniswap.d.ts.map +1 -0
  27. package/package.json +14 -8
  28. package/src/Diviner.ts +0 -33
  29. package/src/Plugin.ts +0 -15
  30. package/src/Schema.ts +0 -7
  31. package/src/index.ts +0 -3
  32. package/src/lib/average.ts +0 -48
  33. package/src/lib/divineCoinGeckoPrices.ts +0 -35
  34. package/src/lib/divinePrices.ts +0 -24
  35. package/src/lib/divineUniswapPrices.ts +0 -61
  36. package/src/lib/index.ts +0 -1
  37. package/src/test/index.ts +0 -2
  38. package/src/test/sampleCoinGecko.ts +0 -75
  39. package/src/test/sampleUniswap.ts +0 -191
@@ -0,0 +1,18 @@
1
+ import { AbstractDiviner } from '@xyo-network/diviner-abstract';
2
+ import type { DivinerConfig, DivinerModule, DivinerParams } from '@xyo-network/diviner-model';
3
+ import type { AnyConfigSchema, Module } from '@xyo-network/module-model';
4
+ import type { Payload, Schema } from '@xyo-network/payload-model';
5
+ import { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts';
6
+ export type CryptoMarketAssetDivinerConfig = DivinerConfig<{
7
+ schema: CryptoMarketAssetDivinerConfigSchema;
8
+ }>;
9
+ export type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>;
10
+ export declare class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams> extends AbstractDiviner<TParams> implements DivinerModule, Module {
11
+ static readonly configSchemas: Schema[];
12
+ static readonly defaultConfigSchema: Schema;
13
+ static readonly targetSchema: "network.xyo.crypto.asset" & {
14
+ readonly __schema: true;
15
+ };
16
+ protected divineHandler(payloads?: Payload[]): Payload[];
17
+ }
18
+ //# sourceMappingURL=Diviner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Diviner.d.ts","sourceRoot":"","sources":["../../src/Diviner.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAA;AAC/D,OAAO,KAAK,EACV,aAAa,EAAE,aAAa,EAAE,aAAa,EAC5C,MAAM,4BAA4B,CAAA;AACnC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,2BAA2B,CAAA;AACxE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,4BAA4B,CAAA;AAKjE,OAAO,EAAE,oCAAoC,EAAE,MAAM,aAAa,CAAA;AAElE,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC;IAAE,MAAM,EAAE,oCAAoC,CAAA;CAAE,CAAC,CAAA;AAC5G,MAAM,MAAM,8BAA8B,GAAG,aAAa,CAAC,eAAe,CAAC,8BAA8B,CAAC,CAAC,CAAA;AAE3G,qBAAa,wBAAwB,CAAC,OAAO,SAAS,8BAA8B,GAAG,8BAA8B,CACnH,SAAQ,eAAe,CAAC,OAAO,CAC/B,YAAW,aAAa,EAAE,MAAM;IAChC,gBAAyB,aAAa,EAAE,MAAM,EAAE,CAAiE;IACjH,gBAAyB,mBAAmB,EAAE,MAAM,CAAuC;IAC3F,gBAAyB,YAAY;;MAA0B;cAE5C,aAAa,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE;CAMlE"}
@@ -0,0 +1,3 @@
1
+ import { CryptoMarketAssetDiviner } from './Diviner.ts';
2
+ export declare const CryptoMarketAssetPlugin: () => import("@xyo-network/payloadset-plugin").PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<import("./Diviner.ts").CryptoMarketAssetDivinerParams>>;
3
+ //# sourceMappingURL=Plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Plugin.d.ts","sourceRoot":"","sources":["../../src/Plugin.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,wBAAwB,EAAE,MAAM,cAAc,CAAA;AAEvD,eAAO,MAAM,uBAAuB,yJAQjC,CAAA"}
@@ -0,0 +1,9 @@
1
+ export type CryptoMarketAssetDivinerQuerySchema = typeof CryptoMarketAssetDivinerQuerySchema;
2
+ export declare const CryptoMarketAssetDivinerQuerySchema: "network.xyo.crypto.asset.diviner.query" & {
3
+ readonly __schema: true;
4
+ };
5
+ export type CryptoMarketAssetDivinerConfigSchema = typeof CryptoMarketAssetDivinerConfigSchema;
6
+ export declare const CryptoMarketAssetDivinerConfigSchema: "network.xyo.crypto.asset.diviner.config" & {
7
+ readonly __schema: true;
8
+ };
9
+ //# sourceMappingURL=Schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Schema.d.ts","sourceRoot":"","sources":["../../src/Schema.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,mCAAmC,GAAG,OAAO,mCAAmC,CAAA;AAC5F,eAAO,MAAM,mCAAmC;;CAA2D,CAAA;AAE3G,MAAM,MAAM,oCAAoC,GAAG,OAAO,oCAAoC,CAAA;AAC9F,eAAO,MAAM,oCAAoC;;CAA4D,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './Diviner.ts';
2
+ export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts';
3
+ export * from './Schema.ts';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,OAAO,EAAE,uBAAuB,EAAE,uBAAuB,IAAI,OAAO,EAAE,MAAM,aAAa,CAAA;AACzF,cAAc,aAAa,CAAA"}
@@ -0,0 +1,167 @@
1
+ // src/Diviner.ts
2
+ import { CoingeckoCryptoMarketSchema } from "@xyo-network/coingecko-crypto-market-payload-plugin";
3
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema4 } from "@xyo-network/crypto-asset-payload-plugin";
4
+ import { AbstractDiviner } from "@xyo-network/diviner-abstract";
5
+ import { UniswapCryptoMarketSchema } from "@xyo-network/uniswap-crypto-market-payload-plugin";
6
+
7
+ // src/lib/divinePrices.ts
8
+ import { exists as exists3 } from "@xylabs/sdk-js";
9
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema3 } from "@xyo-network/crypto-asset-payload-plugin";
10
+ import { PayloadBuilder as PayloadBuilder3 } from "@xyo-network/sdk-js";
11
+
12
+ // src/lib/average.ts
13
+ import { exists } from "@xylabs/sdk-js";
14
+ var isNumber = (val) => {
15
+ return val !== void 0;
16
+ };
17
+ var parseStringifiedNumber = (value) => {
18
+ if (!value) return void 0;
19
+ const parsed = Number.parseFloat(value);
20
+ return Number.isNaN(parsed) ? void 0 : parsed;
21
+ };
22
+ var averageStringifiedNumbers = (...prices) => {
23
+ const numbers = prices.map(parseStringifiedNumber).filter(isNumber);
24
+ return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : void 0;
25
+ };
26
+ var average = (...input) => {
27
+ const payloads = input.filter(exists);
28
+ const tokens = new Set(payloads.flatMap((payload) => Object.keys(payload.assets).map((t) => t)));
29
+ const valuations = new Set(
30
+ [...tokens].flatMap((asset) => {
31
+ const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(exists);
32
+ const valueBasis = new Set(assetInfo.flatMap((v) => Object.keys(v.value)).filter(exists));
33
+ return [...valueBasis];
34
+ })
35
+ );
36
+ const assets = Object.fromEntries(
37
+ [...tokens].map((token) => {
38
+ const assetInfo = payloads.map((p) => p.assets?.[token]).filter(exists);
39
+ const value = Object.fromEntries(
40
+ [...valuations].map((valuation) => {
41
+ const assetValuations = assetInfo.map((info) => info.value?.[valuation]);
42
+ const averageAssetValuation = averageStringifiedNumbers(...assetValuations);
43
+ return [valuation, averageAssetValuation?.toString()];
44
+ })
45
+ );
46
+ return [token, { value }];
47
+ })
48
+ );
49
+ return assets;
50
+ };
51
+
52
+ // src/lib/divineCoinGeckoPrices.ts
53
+ import { CryptoMarketAssetSchema } from "@xyo-network/crypto-asset-payload-plugin";
54
+ import { PayloadBuilder } from "@xyo-network/sdk-js";
55
+ var schema = CryptoMarketAssetSchema;
56
+ var valuationExists = (value) => {
57
+ return !!value[1];
58
+ };
59
+ var otherValueExists = (value) => {
60
+ const possiblyNumber = value[1];
61
+ return typeof possiblyNumber === "number" && !Number.isNaN(possiblyNumber);
62
+ };
63
+ var divineCoinGeckoPrices = (payload) => {
64
+ const assets = payload && payload?.assets ? Object.fromEntries(
65
+ Object.entries(payload.assets).filter(valuationExists).map(([asset, valuation]) => {
66
+ const value = Object.fromEntries(
67
+ Object.entries(valuation).filter(otherValueExists).map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()])
68
+ );
69
+ return [asset, { value }];
70
+ })
71
+ ) : {};
72
+ const timestamp = Date.now();
73
+ return new PayloadBuilder({ schema }).fields({ assets, timestamp }).build();
74
+ };
75
+
76
+ // src/lib/divineUniswapPrices.ts
77
+ import { assertEx, exists as exists2 } from "@xylabs/sdk-js";
78
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema2 } from "@xyo-network/crypto-asset-payload-plugin";
79
+ import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/sdk-js";
80
+ var schema2 = CryptoMarketAssetSchema2;
81
+ var mapUniswapToken = (symbol) => {
82
+ if (symbol.toLowerCase() === "wbtc") return "btc";
83
+ if (symbol.toLowerCase() === "weth") return "eth";
84
+ if (symbol.toLowerCase() === "usdt") return "usd";
85
+ return symbol.toLowerCase();
86
+ };
87
+ var pairsContainingToken = (uniswapPayload, token) => {
88
+ return uniswapPayload?.pairs.map((p) => p.tokens).filter((p) => p.some((x) => x.symbol.toLowerCase() === token)).filter(exists2);
89
+ };
90
+ var tokensFromPairs = (pairs) => {
91
+ return pairs.flatMap((p) => p.tokens).map((t) => t.symbol.toLowerCase());
92
+ };
93
+ var valuesFromTokenPairs = (tokensPairs, token) => {
94
+ return Object.fromEntries(
95
+ tokensPairs.map((pair) => {
96
+ const current = pair.find((p) => p.symbol.toLowerCase() === token);
97
+ const other = pair.find((p) => p.symbol.toLowerCase() !== token);
98
+ return [other?.symbol.toLowerCase(), current?.value.toString()];
99
+ }).map((x) => [mapUniswapToken(assertEx(x[0], () => "Undefined Token")), x[1]])
100
+ );
101
+ };
102
+ var divineUniswapPrices = (uniswapPayload) => {
103
+ let assets = {};
104
+ if (uniswapPayload) {
105
+ const tokens = new Set(tokensFromPairs(uniswapPayload.pairs));
106
+ assets = Object.fromEntries(
107
+ [...tokens].map((token) => {
108
+ const pairs = pairsContainingToken(uniswapPayload, token);
109
+ const value = valuesFromTokenPairs(pairs, token);
110
+ const assetInfo = { value };
111
+ return [token, assetInfo];
112
+ })
113
+ );
114
+ }
115
+ const timestamp = Date.now();
116
+ return new PayloadBuilder2({ schema: schema2 }).fields({ assets, timestamp }).build();
117
+ };
118
+
119
+ // src/lib/divinePrices.ts
120
+ var schema3 = CryptoMarketAssetSchema3;
121
+ var divinePrices = (coinGeckoPayload, uniswapPayload) => {
122
+ const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload);
123
+ const uniswapPrices = divineUniswapPrices(uniswapPayload);
124
+ const prices = [uniswapPayload, coinGeckoPayload].some(exists3);
125
+ const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {};
126
+ const timestamp = Date.now();
127
+ return new PayloadBuilder3({ schema: schema3 }).fields({ assets, timestamp }).build();
128
+ };
129
+
130
+ // src/Schema.ts
131
+ import { asSchema } from "@xyo-network/payload-model";
132
+ var CryptoMarketAssetDivinerQuerySchema = asSchema("network.xyo.crypto.asset.diviner.query", true);
133
+ var CryptoMarketAssetDivinerConfigSchema = asSchema("network.xyo.crypto.asset.diviner.config", true);
134
+
135
+ // src/Diviner.ts
136
+ var CryptoMarketAssetDiviner = class extends AbstractDiviner {
137
+ static configSchemas = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema];
138
+ static defaultConfigSchema = CryptoMarketAssetDivinerConfigSchema;
139
+ static targetSchema = CryptoMarketAssetSchema4;
140
+ divineHandler(payloads) {
141
+ const coinGeckoPayload = payloads?.find((payload) => payload?.schema === CoingeckoCryptoMarketSchema);
142
+ const uniswapPayload = payloads?.find((payload) => payload?.schema === UniswapCryptoMarketSchema);
143
+ const result = divinePrices(coinGeckoPayload, uniswapPayload);
144
+ return [result];
145
+ }
146
+ };
147
+
148
+ // src/Plugin.ts
149
+ import { CryptoMarketAssetSchema as CryptoMarketAssetSchema5 } from "@xyo-network/crypto-asset-payload-plugin";
150
+ import { PayloadSetSchema } from "@xyo-network/payload-model";
151
+ import { createPayloadSetDivinerPlugin } from "@xyo-network/payloadset-plugin";
152
+ var CryptoMarketAssetPlugin = () => createPayloadSetDivinerPlugin(
153
+ { required: { [CryptoMarketAssetSchema5]: 1 }, schema: PayloadSetSchema },
154
+ {
155
+ diviner: async (params) => {
156
+ return await CryptoMarketAssetDiviner.create(params);
157
+ }
158
+ }
159
+ );
160
+ export {
161
+ CryptoMarketAssetDiviner,
162
+ CryptoMarketAssetDivinerConfigSchema,
163
+ CryptoMarketAssetDivinerQuerySchema,
164
+ CryptoMarketAssetPlugin,
165
+ CryptoMarketAssetPlugin as default
166
+ };
167
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/Diviner.ts","../../src/lib/divinePrices.ts","../../src/lib/average.ts","../../src/lib/divineCoinGeckoPrices.ts","../../src/lib/divineUniswapPrices.ts","../../src/Schema.ts","../../src/Plugin.ts"],"sourcesContent":["import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport { CoingeckoCryptoMarketSchema } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'\nimport { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { AbstractDiviner } from '@xyo-network/diviner-abstract'\nimport type {\n DivinerConfig, DivinerModule, DivinerParams,\n} from '@xyo-network/diviner-model'\nimport type { AnyConfigSchema, Module } from '@xyo-network/module-model'\nimport type { Payload, Schema } from '@xyo-network/payload-model'\nimport type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'\nimport { 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 readonly targetSchema = CryptoMarketAssetSchema\n\n protected override divineHandler(payloads?: Payload[]): Payload[] {\n const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload | undefined\n const uniswapPayload = payloads?.find(payload => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload | undefined\n const result: CryptoMarketAssetPayload = divinePrices(coinGeckoPayload, uniswapPayload)\n return [result]\n }\n}\n","import { exists } from '@xylabs/sdk-js'\nimport type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'\nimport { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type { 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 = (\n coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined,\n uniswapPayload: UniswapCryptoMarketPayload | undefined,\n): CryptoMarketAssetPayload => {\n const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload)\n const uniswapPrices = divineUniswapPrices(uniswapPayload)\n const prices = [uniswapPayload, coinGeckoPayload].some(exists)\n const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}\n const timestamp = Date.now()\n return new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","import { exists } from '@xylabs/sdk-js'\nimport type {\n AssetInfo, CryptoMarketAssetPayload, Currency, Token,\n} 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 type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'\nimport type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'\nimport { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\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 = (payload: CoingeckoCryptoMarketPayload | undefined): 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 new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","import { assertEx, exists } from '@xylabs/sdk-js'\nimport type {\n AssetInfo, CryptoMarketAssetPayload,\n Currency, Token, ValueBasis,\n} from '@xyo-network/crypto-asset-payload-plugin'\nimport { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'\nimport { PayloadBuilder } from '@xyo-network/sdk-js'\nimport type {\n UniswapCryptoMarketPayload, UniswapCryptoPair, UniswapCryptoToken,\n} 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 = (uniswapPayload: UniswapCryptoMarketPayload | undefined): 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 new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()\n}\n","import { asSchema } from '@xyo-network/payload-model'\n\nexport type CryptoMarketAssetDivinerQuerySchema = typeof CryptoMarketAssetDivinerQuerySchema\nexport const CryptoMarketAssetDivinerQuerySchema = asSchema('network.xyo.crypto.asset.diviner.query', true)\n\nexport type CryptoMarketAssetDivinerConfigSchema = typeof CryptoMarketAssetDivinerConfigSchema\nexport const CryptoMarketAssetDivinerConfigSchema = asSchema('network.xyo.crypto.asset.diviner.config', true)\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":["CryptoMarketAssetSchema","exists","CryptoMarketAssetSchema","PayloadBuilder","exists","CryptoMarketAssetSchema","PayloadBuilder","schema","schema","CryptoMarketAssetSchema","exists","PayloadBuilder","CryptoMarketAssetSchema","CryptoMarketAssetSchema","CryptoMarketAssetSchema"]}
@@ -0,0 +1,3 @@
1
+ import type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin';
2
+ export declare const average: (...input: (CryptoMarketAssetPayload | undefined)[]) => Record<string, AssetInfo>;
3
+ //# sourceMappingURL=average.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"average.d.ts","sourceRoot":"","sources":["../../../src/lib/average.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,SAAS,EAAE,wBAAwB,EACpC,MAAM,0CAA0C,CAAA;AAiBjD,eAAO,MAAM,OAAO,GAAI,GAAG,OAAO,CAAC,wBAAwB,GAAG,SAAS,CAAC,EAAE,KAAG,MAAM,CAAC,MAAM,EAAE,SAAS,CA2BpG,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin';
2
+ import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin';
3
+ export declare const divineCoinGeckoPrices: (payload: CoingeckoCryptoMarketPayload | undefined) => CryptoMarketAssetPayload;
4
+ //# sourceMappingURL=divineCoinGeckoPrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divineCoinGeckoPrices.d.ts","sourceRoot":"","sources":["../../../src/lib/divineCoinGeckoPrices.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAA;AACvG,OAAO,KAAK,EAAa,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AAenG,eAAO,MAAM,qBAAqB,GAAI,SAAS,4BAA4B,GAAG,SAAS,KAAG,wBAkBzF,CAAA"}
@@ -0,0 +1,5 @@
1
+ import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin';
2
+ import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin';
3
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin';
4
+ export declare const divinePrices: (coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined, uniswapPayload: UniswapCryptoMarketPayload | undefined) => CryptoMarketAssetPayload;
5
+ //# sourceMappingURL=divinePrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divinePrices.d.ts","sourceRoot":"","sources":["../../../src/lib/divinePrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAA;AACvG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAA;AAGxF,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mDAAmD,CAAA;AAQnG,eAAO,MAAM,YAAY,GACvB,kBAAkB,4BAA4B,GAAG,SAAS,EAC1D,gBAAgB,0BAA0B,GAAG,SAAS,KACrD,wBAOF,CAAA"}
@@ -0,0 +1,4 @@
1
+ import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin';
2
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin';
3
+ export declare const divineUniswapPrices: (uniswapPayload: UniswapCryptoMarketPayload | undefined) => CryptoMarketAssetPayload;
4
+ //# sourceMappingURL=divineUniswapPrices.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"divineUniswapPrices.d.ts","sourceRoot":"","sources":["../../../src/lib/divineUniswapPrices.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACC,wBAAwB,EAEpC,MAAM,0CAA0C,CAAA;AAGjD,OAAO,KAAK,EACV,0BAA0B,EAC3B,MAAM,mDAAmD,CAAA;AAoC1D,eAAO,MAAM,mBAAmB,GAAI,gBAAgB,0BAA0B,GAAG,SAAS,KAAG,wBAe5F,CAAA"}
@@ -0,0 +1,2 @@
1
+ export * from './divinePrices.ts';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,3 @@
1
+ export * from './sampleCoinGecko.ts';
2
+ export * from './sampleUniswap.ts';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/test/index.ts"],"names":[],"mappings":"AAAA,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin';
2
+ export declare const sampleCoinGeckoPayload: CoingeckoCryptoMarketPayload;
3
+ //# sourceMappingURL=sampleCoinGecko.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleCoinGecko.d.ts","sourceRoot":"","sources":["../../../src/test/sampleCoinGecko.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAA;AAGvG,eAAO,MAAM,sBAAsB,EAAE,4BAuEpC,CAAA"}
@@ -0,0 +1,3 @@
1
+ import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin';
2
+ export declare const sampleUniswapPayload: UniswapCryptoMarketPayload;
3
+ //# sourceMappingURL=sampleUniswap.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleUniswap.d.ts","sourceRoot":"","sources":["../../../src/test/sampleUniswap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mDAAmD,CAAA;AAGnG,eAAO,MAAM,oBAAoB,EAAE,0BA2LlC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-asset-plugin",
3
- "version": "5.3.2",
3
+ "version": "5.3.4",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -30,31 +30,37 @@
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
- "src",
34
- "!**/*.bench.*",
35
- "!**/*.spec.*",
36
- "!**/*.test.*"
33
+ "README.md"
37
34
  ],
35
+ "dependencies": {
36
+ "@xyo-network/coingecko-crypto-market-payload-plugin": "~5.3.4",
37
+ "@xyo-network/crypto-asset-payload-plugin": "~5.3.4",
38
+ "@xyo-network/uniswap-crypto-market-payload-plugin": "~5.3.4"
39
+ },
38
40
  "devDependencies": {
39
41
  "@xylabs/sdk-js": "^5.0.90",
42
+ "@xylabs/ts-scripts-common": "~7.5.10",
40
43
  "@xylabs/ts-scripts-yarn3": "~7.5.10",
41
44
  "@xylabs/tsconfig": "~7.5.10",
42
45
  "@xylabs/vitest-extended": "~5.0.90",
43
- "@xyo-network/coingecko-crypto-market-payload-plugin": "~5.3.2",
44
- "@xyo-network/crypto-asset-payload-plugin": "~5.3.2",
45
46
  "@xyo-network/diviner-abstract": "~5.3.5",
46
47
  "@xyo-network/diviner-model": "~5.3.5",
47
48
  "@xyo-network/module-model": "~5.3.5",
48
49
  "@xyo-network/payload-model": "~5.3.5",
49
50
  "@xyo-network/payloadset-plugin": "~5.3.5",
50
51
  "@xyo-network/sdk-js": "~5.3.5",
51
- "@xyo-network/uniswap-crypto-market-payload-plugin": "~5.3.2",
52
52
  "typescript": "~5.9.3",
53
53
  "vitest": "~4.1.2",
54
54
  "zod": "^4.3.6"
55
55
  },
56
56
  "peerDependencies": {
57
57
  "@xylabs/sdk-js": "^5",
58
+ "@xyo-network/diviner-abstract": "^5",
59
+ "@xyo-network/diviner-model": "^5",
60
+ "@xyo-network/module-model": "^5",
61
+ "@xyo-network/payload-model": "^5",
62
+ "@xyo-network/payloadset-plugin": "^5",
63
+ "@xyo-network/sdk-js": "^5",
58
64
  "zod": "^4"
59
65
  },
60
66
  "publishConfig": {
package/src/Diviner.ts DELETED
@@ -1,33 +0,0 @@
1
- import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
2
- import { CoingeckoCryptoMarketSchema } from '@xyo-network/coingecko-crypto-market-payload-plugin'
3
- import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
4
- import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
5
- import { AbstractDiviner } from '@xyo-network/diviner-abstract'
6
- import type {
7
- DivinerConfig, DivinerModule, DivinerParams,
8
- } from '@xyo-network/diviner-model'
9
- import type { AnyConfigSchema, Module } from '@xyo-network/module-model'
10
- import type { Payload, Schema } from '@xyo-network/payload-model'
11
- import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'
12
- import { UniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
13
-
14
- import { divinePrices } from './lib/index.ts'
15
- import { CryptoMarketAssetDivinerConfigSchema } from './Schema.ts'
16
-
17
- export type CryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: CryptoMarketAssetDivinerConfigSchema }>
18
- export type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>
19
-
20
- export class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams>
21
- extends AbstractDiviner<TParams>
22
- implements DivinerModule, Module {
23
- static override readonly configSchemas: Schema[] = [...super.configSchemas, CryptoMarketAssetDivinerConfigSchema]
24
- static override readonly defaultConfigSchema: Schema = CryptoMarketAssetDivinerConfigSchema
25
- static override readonly targetSchema = CryptoMarketAssetSchema
26
-
27
- protected override divineHandler(payloads?: Payload[]): Payload[] {
28
- const coinGeckoPayload = payloads?.find(payload => payload?.schema === CoingeckoCryptoMarketSchema) as CoingeckoCryptoMarketPayload | undefined
29
- const uniswapPayload = payloads?.find(payload => payload?.schema === UniswapCryptoMarketSchema) as UniswapCryptoMarketPayload | undefined
30
- const result: CryptoMarketAssetPayload = divinePrices(coinGeckoPayload, uniswapPayload)
31
- return [result]
32
- }
33
- }
package/src/Plugin.ts DELETED
@@ -1,15 +0,0 @@
1
- import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
2
- import { PayloadSetSchema } from '@xyo-network/payload-model'
3
- import { createPayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'
4
-
5
- import { CryptoMarketAssetDiviner } from './Diviner.ts'
6
-
7
- export const CryptoMarketAssetPlugin = () =>
8
- createPayloadSetDivinerPlugin<CryptoMarketAssetDiviner>(
9
- { required: { [CryptoMarketAssetSchema]: 1 }, schema: PayloadSetSchema },
10
- {
11
- diviner: async (params) => {
12
- return (await CryptoMarketAssetDiviner.create(params)) as CryptoMarketAssetDiviner
13
- },
14
- },
15
- )
package/src/Schema.ts DELETED
@@ -1,7 +0,0 @@
1
- import { asSchema } from '@xyo-network/payload-model'
2
-
3
- export type CryptoMarketAssetDivinerQuerySchema = typeof CryptoMarketAssetDivinerQuerySchema
4
- export const CryptoMarketAssetDivinerQuerySchema = asSchema('network.xyo.crypto.asset.diviner.query', true)
5
-
6
- export type CryptoMarketAssetDivinerConfigSchema = typeof CryptoMarketAssetDivinerConfigSchema
7
- export const CryptoMarketAssetDivinerConfigSchema = asSchema('network.xyo.crypto.asset.diviner.config', true)
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './Diviner.ts'
2
- export { CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default } from './Plugin.ts'
3
- export * from './Schema.ts'
@@ -1,48 +0,0 @@
1
- import { exists } from '@xylabs/sdk-js'
2
- import type {
3
- AssetInfo, CryptoMarketAssetPayload, Currency, Token,
4
- } from '@xyo-network/crypto-asset-payload-plugin'
5
-
6
- const isNumber = (val: number | undefined): val is number => {
7
- return val !== undefined
8
- }
9
-
10
- const parseStringifiedNumber = (value: string | undefined): number | undefined => {
11
- if (!value) return undefined
12
- const parsed = Number.parseFloat(value)
13
- return Number.isNaN(parsed) ? undefined : parsed
14
- }
15
-
16
- const averageStringifiedNumbers = (...prices: (string | undefined)[]): number | undefined => {
17
- const numbers = prices.map(parseStringifiedNumber).filter(isNumber)
18
- return numbers.length > 0 ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : undefined
19
- }
20
-
21
- export const average = (...input: (CryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {
22
- // Get all the assets represented
23
- const payloads = input.filter(exists)
24
- const tokens = new Set<Token>(payloads.flatMap(payload => Object.keys(payload.assets).map<Token>(t => t as Token)))
25
- // Get all the valuations used
26
- const valuations = new Set<Token | Currency>(
27
- [...tokens].flatMap((asset) => {
28
- const assetInfo = payloads.map(p => p.assets?.[asset]).filter(exists)
29
- const valueBasis = new Set<Currency | Token>(assetInfo.flatMap(v => Object.keys(v.value) as unknown as Currency | Token).filter(exists))
30
- return [...valueBasis]
31
- }),
32
- )
33
- // For each of the tokens, calculate the average valuation for each of valuation bases
34
- const assets: Record<string, AssetInfo> = Object.fromEntries(
35
- [...tokens].map((token) => {
36
- const assetInfo = payloads.map(p => p.assets?.[token]).filter(exists)
37
- const value = Object.fromEntries(
38
- [...valuations].map((valuation) => {
39
- const assetValuations = assetInfo.map(info => info.value?.[valuation])
40
- const averageAssetValuation = averageStringifiedNumbers(...assetValuations)
41
- return [valuation, averageAssetValuation?.toString()]
42
- }),
43
- )
44
- return [token, { value }]
45
- }),
46
- )
47
- return assets
48
- }
@@ -1,35 +0,0 @@
1
- import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
2
- import type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
3
- import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
4
- import { PayloadBuilder } from '@xyo-network/sdk-js'
5
-
6
- const schema = CryptoMarketAssetSchema
7
-
8
- const valuationExists = (value: [string, Partial<Record<string, number>> | undefined]): value is [string, Partial<Record<string, number>>] => {
9
- return !!value[1]
10
- }
11
-
12
- const otherValueExists = (value: [string, number | undefined]): value is [string, number] => {
13
- const possiblyNumber = value[1]
14
- return typeof possiblyNumber === 'number' && !Number.isNaN(possiblyNumber)
15
- }
16
-
17
- export const divineCoinGeckoPrices = (payload: CoingeckoCryptoMarketPayload | undefined): CryptoMarketAssetPayload => {
18
- const assets: Record<string, AssetInfo>
19
- = payload && payload?.assets
20
- ? Object.fromEntries(
21
- Object.entries(payload.assets)
22
- .filter(valuationExists)
23
- .map(([asset, valuation]) => {
24
- const value = Object.fromEntries(
25
- Object.entries(valuation)
26
- .filter(otherValueExists)
27
- .map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()]),
28
- )
29
- return [asset, { value }]
30
- }),
31
- )
32
- : {}
33
- const timestamp = Date.now()
34
- return new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
35
- }
@@ -1,24 +0,0 @@
1
- import { exists } from '@xylabs/sdk-js'
2
- import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
3
- import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
4
- import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
5
- import { PayloadBuilder } from '@xyo-network/sdk-js'
6
- import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'
7
-
8
- import { average } from './average.ts'
9
- import { divineCoinGeckoPrices } from './divineCoinGeckoPrices.ts'
10
- import { divineUniswapPrices } from './divineUniswapPrices.ts'
11
-
12
- const schema = CryptoMarketAssetSchema
13
-
14
- export const divinePrices = (
15
- coinGeckoPayload: CoingeckoCryptoMarketPayload | undefined,
16
- uniswapPayload: UniswapCryptoMarketPayload | undefined,
17
- ): CryptoMarketAssetPayload => {
18
- const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload)
19
- const uniswapPrices = divineUniswapPrices(uniswapPayload)
20
- const prices = [uniswapPayload, coinGeckoPayload].some(exists)
21
- const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}
22
- const timestamp = Date.now()
23
- return new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
24
- }
@@ -1,61 +0,0 @@
1
- import { assertEx, exists } from '@xylabs/sdk-js'
2
- import type {
3
- AssetInfo, CryptoMarketAssetPayload,
4
- Currency, Token, ValueBasis,
5
- } from '@xyo-network/crypto-asset-payload-plugin'
6
- import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
7
- import { PayloadBuilder } from '@xyo-network/sdk-js'
8
- import type {
9
- UniswapCryptoMarketPayload, UniswapCryptoPair, UniswapCryptoToken,
10
- } from '@xyo-network/uniswap-crypto-market-payload-plugin'
11
-
12
- const schema = CryptoMarketAssetSchema
13
-
14
- const mapUniswapToken = (symbol: string): Token | Currency => {
15
- // TODO: Actually calculate the value of the token/stablecoin based on others
16
- // to weed out individual fluctuations in price
17
- if (symbol.toLowerCase() === 'wbtc') return 'btc'
18
- if (symbol.toLowerCase() === 'weth') return 'eth'
19
- if (symbol.toLowerCase() === 'usdt') return 'usd'
20
- return symbol.toLowerCase() as Token
21
- }
22
-
23
- const pairsContainingToken = (uniswapPayload: UniswapCryptoMarketPayload, token: Token) => {
24
- return uniswapPayload?.pairs
25
- .map(p => p.tokens)
26
- .filter(p => p.some(x => x.symbol.toLowerCase() === token))
27
- .filter(exists)
28
- }
29
-
30
- const tokensFromPairs = (pairs: UniswapCryptoPair[]) => {
31
- return pairs.flatMap(p => p.tokens).map(t => t.symbol.toLowerCase() as Token)
32
- }
33
-
34
- const valuesFromTokenPairs = (tokensPairs: UniswapCryptoToken[][], token: Token): ValueBasis => {
35
- return Object.fromEntries(
36
- tokensPairs
37
- .map((pair) => {
38
- const current = pair.find(p => p.symbol.toLowerCase() === token)
39
- const other = pair.find(p => p.symbol.toLowerCase() !== token)
40
- return [other?.symbol.toLowerCase(), current?.value.toString()]
41
- })
42
- .map(x => [mapUniswapToken(assertEx(x[0], () => 'Undefined Token')), x[1]]),
43
- )
44
- }
45
-
46
- export const divineUniswapPrices = (uniswapPayload: UniswapCryptoMarketPayload | undefined): CryptoMarketAssetPayload => {
47
- let assets: Partial<Record<Token, AssetInfo | undefined>> = {}
48
- if (uniswapPayload) {
49
- const tokens: Set<Token> = new Set(tokensFromPairs(uniswapPayload.pairs))
50
- assets = Object.fromEntries(
51
- [...tokens].map((token) => {
52
- const pairs = pairsContainingToken(uniswapPayload, token)
53
- const value: ValueBasis = valuesFromTokenPairs(pairs, token)
54
- const assetInfo: AssetInfo = { value }
55
- return [token, assetInfo]
56
- }),
57
- )
58
- }
59
- const timestamp = Date.now()
60
- return new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
61
- }
package/src/lib/index.ts DELETED
@@ -1 +0,0 @@
1
- export * from './divinePrices.ts'
package/src/test/index.ts DELETED
@@ -1,2 +0,0 @@
1
- export * from './sampleCoinGecko.ts'
2
- export * from './sampleUniswap.ts'
@@ -1,75 +0,0 @@
1
- import type { CoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
2
- import { CoingeckoCryptoMarketSchema } from '@xyo-network/coingecko-crypto-market-payload-plugin'
3
-
4
- export const sampleCoinGeckoPayload: CoingeckoCryptoMarketPayload = {
5
- assets: {
6
- ada: {
7
- btc: 0.000_021_63,
8
- eth: 0.000_304_72,
9
- eur: 0.488_106,
10
- usd: 0.495_442,
11
- },
12
- btc: {
13
- btc: 1,
14
- eth: 14.068_021,
15
- eur: 22_545,
16
- usd: 22_884,
17
- },
18
- busd: {
19
- btc: 0.000_043_42,
20
- eth: 0.000_611_45,
21
- eur: 0.979_882,
22
- usd: 0.994_609,
23
- },
24
- doge: {
25
- btc: 0.000_002_88,
26
- eth: 0.000_040_62,
27
- eur: 0.065_066,
28
- usd: 0.066_044,
29
- },
30
- dot: {
31
- btc: 0.000_330_67,
32
- eth: 0.004_657_02,
33
- eur: 7.46,
34
- usd: 7.58,
35
- },
36
- eth: {
37
- btc: 0.070_992_16,
38
- eth: 1,
39
- eur: 1602.25,
40
- usd: 1626.33,
41
- },
42
- sol: {
43
- btc: 0.001_734_17,
44
- eth: 0.024_423_15,
45
- eur: 39.14,
46
- usd: 39.73,
47
- },
48
- usdc: {
49
- btc: 0.000_043_71,
50
- eth: 0.000_615_56,
51
- eur: 0.986_471,
52
- usd: 1.001,
53
- },
54
- usdt: {
55
- btc: 0.000_043_7,
56
- eth: 0.000_615_48,
57
- eur: 0.986_332,
58
- usd: 1.001,
59
- },
60
- wbtc: {
61
- btc: 1.000_635,
62
- eth: 14.092_397,
63
- eur: 22_584,
64
- usd: 22_923,
65
- },
66
- xyo: {
67
- btc: 6.282_82e-7,
68
- eth: 0.000_008_85,
69
- eur: 0.014_179_95,
70
- usd: 0.014_393_07,
71
- },
72
- },
73
- schema: CoingeckoCryptoMarketSchema,
74
- timestamp: 1_659_012_060_785,
75
- }
@@ -1,191 +0,0 @@
1
- import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'
2
- import { UniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
3
-
4
- export const sampleUniswapPayload: UniswapCryptoMarketPayload = {
5
- pairs: [
6
- {
7
- tokens: [
8
- {
9
- address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
10
- symbol: 'xyo',
11
- value: 0.000_008_967_73,
12
- },
13
- {
14
- address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
15
- symbol: 'weth',
16
- value: 111_511,
17
- },
18
- ],
19
- },
20
- {
21
- tokens: [
22
- {
23
- address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
24
- symbol: 'xyo',
25
- value: 0.014_878_2,
26
- },
27
- {
28
- address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
29
- symbol: 'usdt',
30
- value: 67.2123,
31
- },
32
- ],
33
- },
34
- {
35
- tokens: [
36
- {
37
- address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
38
- symbol: 'xyo',
39
- value: 0.014_039,
40
- },
41
- {
42
- address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
43
- symbol: 'dai',
44
- value: 71.2301,
45
- },
46
- ],
47
- },
48
- {
49
- tokens: [
50
- {
51
- address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
52
- symbol: 'wbtc',
53
- value: 1_527_240,
54
- },
55
- {
56
- address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
57
- symbol: 'xyo',
58
- value: 6.547_77e-7,
59
- },
60
- ],
61
- },
62
- {
63
- tokens: [
64
- {
65
- address: '0x514910771AF9Ca656af840dff83E8264EcF986CA',
66
- symbol: 'link',
67
- value: 453.816,
68
- },
69
- {
70
- address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
71
- symbol: 'xyo',
72
- value: 0.002_203_54,
73
- },
74
- ],
75
- },
76
- {
77
- tokens: [
78
- {
79
- address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
80
- symbol: 'wbtc',
81
- value: 14.0836,
82
- },
83
- {
84
- address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
85
- symbol: 'weth',
86
- value: 0.071_004_8,
87
- },
88
- ],
89
- },
90
- {
91
- tokens: [
92
- {
93
- address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
94
- symbol: 'dai',
95
- value: 1.000_04,
96
- },
97
- {
98
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
99
- symbol: 'usdc',
100
- value: 0.999_959,
101
- },
102
- ],
103
- },
104
- {
105
- tokens: [
106
- {
107
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
108
- symbol: 'usdc',
109
- value: 0.000_616_944,
110
- },
111
- {
112
- address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
113
- symbol: 'weth',
114
- value: 1620.89,
115
- },
116
- ],
117
- },
118
- {
119
- tokens: [
120
- {
121
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
122
- symbol: 'usdc',
123
- value: 0.000_617_196,
124
- },
125
- {
126
- address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
127
- symbol: 'weth',
128
- value: 1620.23,
129
- },
130
- ],
131
- },
132
- {
133
- tokens: [
134
- {
135
- address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
136
- symbol: 'dai',
137
- value: 1.000_02,
138
- },
139
- {
140
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
141
- symbol: 'usdc',
142
- value: 0.999_983,
143
- },
144
- ],
145
- },
146
- {
147
- tokens: [
148
- {
149
- address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',
150
- symbol: 'frax',
151
- value: 0.999_762,
152
- },
153
- {
154
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
155
- symbol: 'usdc',
156
- value: 1.000_24,
157
- },
158
- ],
159
- },
160
- {
161
- tokens: [
162
- {
163
- address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
164
- symbol: 'wbtc',
165
- value: 22_826.3,
166
- },
167
- {
168
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
169
- symbol: 'usdc',
170
- value: 0.000_043_809,
171
- },
172
- ],
173
- },
174
- {
175
- tokens: [
176
- {
177
- address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
178
- symbol: 'usdc',
179
- value: 0.999_853,
180
- },
181
- {
182
- address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
183
- symbol: 'usdt',
184
- value: 1.000_15,
185
- },
186
- ],
187
- },
188
- ],
189
- schema: UniswapCryptoMarketSchema,
190
- timestamp: 1_659_012_011_418,
191
- }