@xyo-network/crypto-asset-plugin 4.1.1 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,26 +1,4 @@
1
- import { AbstractDiviner } from '@xyo-network/diviner-abstract';
2
- import { DivinerParams, DivinerConfig, DivinerModule } from '@xyo-network/diviner-model';
3
- import { AnyConfigSchema, Module } from '@xyo-network/module-model';
4
- import { Schema, Payload } from '@xyo-network/payload-model';
5
- import * as _xyo_network_payloadset_plugin from '@xyo-network/payloadset-plugin';
6
-
7
- type CryptoMarketAssetDivinerQuerySchema = 'network.xyo.crypto.asset.diviner.query';
8
- declare const CryptoMarketAssetDivinerQuerySchema: CryptoMarketAssetDivinerQuerySchema;
9
- type CryptoMarketAssetDivinerConfigSchema = 'network.xyo.crypto.asset.diviner.config';
10
- declare const CryptoMarketAssetDivinerConfigSchema: CryptoMarketAssetDivinerConfigSchema;
11
-
12
- type CryptoMarketAssetDivinerConfig = DivinerConfig<{
13
- schema: CryptoMarketAssetDivinerConfigSchema;
14
- }>;
15
- type CryptoMarketAssetDivinerParams = DivinerParams<AnyConfigSchema<CryptoMarketAssetDivinerConfig>>;
16
- declare class CryptoMarketAssetDiviner<TParams extends CryptoMarketAssetDivinerParams = CryptoMarketAssetDivinerParams> extends AbstractDiviner<TParams> implements DivinerModule, Module {
17
- static readonly configSchemas: Schema[];
18
- static readonly defaultConfigSchema: Schema;
19
- static readonly targetSchema: "network.xyo.crypto.asset";
20
- protected divineHandler(payloads?: Payload[]): Payload[];
21
- }
22
-
23
- declare const CryptoMarketAssetPlugin: () => _xyo_network_payloadset_plugin.PayloadSetDivinerPlugin<CryptoMarketAssetDiviner<CryptoMarketAssetDivinerParams>>;
24
-
25
- export { CryptoMarketAssetDiviner, CryptoMarketAssetDivinerConfigSchema, CryptoMarketAssetDivinerQuerySchema, CryptoMarketAssetPlugin, CryptoMarketAssetPlugin as default };
26
- export type { CryptoMarketAssetDivinerConfig, CryptoMarketAssetDivinerParams };
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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/crypto-asset-plugin",
3
- "version": "4.1.1",
3
+ "version": "5.0.0",
4
4
  "description": "Typescript/Javascript Plugins for XYO Platform",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -28,24 +28,27 @@
28
28
  },
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/neutral/index.d.ts",
31
+ "files": [
32
+ "dist",
33
+ "src"
34
+ ],
31
35
  "dependencies": {
32
- "@xylabs/assert": "^4.13.23",
33
- "@xylabs/exists": "^4.13.23",
34
- "@xyo-network/coingecko-crypto-market-payload-plugin": "^4.1.1",
35
- "@xyo-network/crypto-asset-payload-plugin": "^4.1.1",
36
- "@xyo-network/diviner-abstract": "^4.1.7",
37
- "@xyo-network/diviner-model": "^4.1.7",
38
- "@xyo-network/module-model": "^4.1.7",
39
- "@xyo-network/payload-builder": "^4.1.7",
40
- "@xyo-network/payload-model": "^4.1.7",
41
- "@xyo-network/payloadset-plugin": "^4.1.7",
42
- "@xyo-network/uniswap-crypto-market-payload-plugin": "^4.1.1"
36
+ "@xylabs/assert": "^5.0.0",
37
+ "@xylabs/exists": "^5.0.0",
38
+ "@xyo-network/coingecko-crypto-market-payload-plugin": "^5.0.0",
39
+ "@xyo-network/crypto-asset-payload-plugin": "^5.0.0",
40
+ "@xyo-network/diviner-abstract": "^5.0.0",
41
+ "@xyo-network/diviner-model": "^5.0.0",
42
+ "@xyo-network/module-model": "^5.0.0",
43
+ "@xyo-network/payload-builder": "^5.0.0",
44
+ "@xyo-network/payload-model": "^5.0.0",
45
+ "@xyo-network/payloadset-plugin": "^5.0.0",
46
+ "@xyo-network/uniswap-crypto-market-payload-plugin": "^5.0.0"
43
47
  },
44
48
  "devDependencies": {
45
- "@xylabs/ts-scripts-yarn3": "^7.0.0-rc.24",
46
- "@xylabs/tsconfig": "^7.0.0-rc.24",
47
- "@xylabs/vitest-extended": "^4.13.23",
48
- "knip": "^5.62.0",
49
+ "@xylabs/ts-scripts-yarn3": "^7.0.2",
50
+ "@xylabs/tsconfig": "^7.0.2",
51
+ "@xylabs/vitest-extended": "^5.0.0",
49
52
  "typescript": "^5.8.3",
50
53
  "vitest": "^3.2.4"
51
54
  },
@@ -0,0 +1,37 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import type { AssetInfo, CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
4
+ import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
5
+ import { PayloadBuilder } from '@xyo-network/payload-builder'
6
+ import {
7
+ describe, expect,
8
+ it,
9
+ } from 'vitest'
10
+
11
+ import { average } from '../average.ts'
12
+
13
+ const schema = CryptoMarketAssetSchema
14
+
15
+ const getPayloadWithPrice = (price: number): CryptoMarketAssetPayload => {
16
+ const assets: Record<string, AssetInfo> = { xyo: { value: { usd: price.toString() } } }
17
+ const timestamp = Date.now()
18
+ return new PayloadBuilder<CryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
19
+ }
20
+
21
+ describe('average', () => {
22
+ it('averages numbers', async () => {
23
+ const payloads = await Promise.all([getPayloadWithPrice(1), getPayloadWithPrice(2), getPayloadWithPrice(3)])
24
+ expect(average(...payloads)?.xyo?.value?.usd).toBe('2')
25
+ })
26
+ it('handles single value', () => {
27
+ const payloads = getPayloadWithPrice(1)
28
+ expect(average(payloads)?.xyo?.value?.usd).toBe('1')
29
+ })
30
+ it('handles no values', () => {
31
+ expect(average()?.xyo?.value?.usd).toBeUndefined()
32
+ })
33
+ it('handles undefined values', async () => {
34
+ const payloads = await Promise.all([getPayloadWithPrice(1), undefined, getPayloadWithPrice(3)])
35
+ expect(average(...payloads)?.xyo?.value?.usd).toBe('2')
36
+ })
37
+ })
@@ -0,0 +1,36 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { assertEx } from '@xylabs/assert'
4
+ import {
5
+ describe, expect,
6
+ it,
7
+ } from 'vitest'
8
+
9
+ import { sampleCoinGeckoPayload } from '../../test/index.ts'
10
+ import { divineCoinGeckoPrices } from '../divineCoinGeckoPrices.ts'
11
+
12
+ describe('divineCoinGeckoPrices', () => {
13
+ // eslint-disable-next-line complexity
14
+ it('divines prices from CoinGecko', () => {
15
+ const result = divineCoinGeckoPrices(sampleCoinGeckoPayload)
16
+ expect(result.assets).toBeObject()
17
+ const assets = assertEx(result.assets)
18
+ for (let [token, assetInfo] of Object.entries(assets)) {
19
+ expect(token).toBeString()
20
+ expect(assetInfo).toBeObject()
21
+ const value = assertEx(assetInfo?.value)
22
+ expect(value).toBeObject()
23
+ for (let [symbol, price] of Object.entries(value)) {
24
+ expect(symbol).toBeString()
25
+ expect(price).toBeString()
26
+ const parsed = Number.parseFloat(price)
27
+ expect(parsed).toBeNumber()
28
+ expect(Number.isNaN(parsed)).toBeFalse()
29
+ }
30
+ }
31
+ expect(result?.assets?.xyo?.value?.btc).toBe('6.28282e-7')
32
+ expect(result?.assets?.xyo?.value?.eth).toBe('0.00000885')
33
+ expect(result?.assets?.xyo?.value?.eur).toBe('0.01417995')
34
+ expect(result?.assets?.xyo?.value?.usd).toBe('0.01439307')
35
+ })
36
+ })
@@ -0,0 +1,21 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import {
4
+ describe, expect,
5
+ it,
6
+ } from 'vitest'
7
+
8
+ import { sampleCoinGeckoPayload, sampleUniswapPayload } from '../../test/index.ts'
9
+ import { divinePrices } from '../divinePrices.ts'
10
+
11
+ describe('divinePrices', () => {
12
+ it('divines prices', () => {
13
+ const result = divinePrices(sampleCoinGeckoPayload, sampleUniswapPayload)
14
+ expect(result).toBeObject()
15
+ expect(result.timestamp).toBeNumber()
16
+ expect(result.assets.xyo?.value.btc).toBe('6.415295e-7')
17
+ expect(result.assets.xyo?.value.eth).toBe('0.000008908865')
18
+ expect(result.assets.xyo?.value.eur).toBe('0.01417995')
19
+ expect(result.assets.xyo?.value.usd).toBe('0.014635635000000001')
20
+ })
21
+ })
@@ -0,0 +1,20 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import {
4
+ describe, expect,
5
+ it,
6
+ } from 'vitest'
7
+
8
+ import { sampleUniswapPayload } from '../../test/index.ts'
9
+ import { divineUniswapPrices } from '../divineUniswapPrices.ts'
10
+
11
+ describe('divineUniswapPrices', () => {
12
+ it('divines prices from Uniswap', () => {
13
+ const result = divineUniswapPrices(sampleUniswapPayload)
14
+ expect(result).toBeObject()
15
+ expect(result?.assets?.xyo?.value?.btc).toBe('6.54777e-7')
16
+ expect(result?.assets?.xyo?.value?.eth).toBe('0.00000896773')
17
+ expect(result?.assets?.xyo?.value?.eur).toBe(undefined)
18
+ expect(result?.assets?.xyo?.value?.usd).toBe('0.0148782')
19
+ })
20
+ })
@@ -0,0 +1,39 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import type { CryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
4
+ import { CryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
5
+ import type { Payload } from '@xyo-network/payload-model'
6
+ import {
7
+ describe, expect,
8
+ test,
9
+ } from 'vitest'
10
+
11
+ import { CryptoMarketAssetDiviner } from '../Diviner.ts'
12
+ import { sampleCoinGeckoPayload, sampleUniswapPayload } from '../test/index.ts'
13
+
14
+ const coinGeckoPayload = sampleCoinGeckoPayload
15
+ const uniswapPayload = sampleUniswapPayload
16
+
17
+ describe('Diviner', () => {
18
+ const cases: [input: string, expected: string, data: Payload[]][] = [
19
+ ['only CoinGecko Payload', 'observation', [coinGeckoPayload]],
20
+ ['only Uniswap Payload', 'observation', [uniswapPayload]],
21
+ ['CoinGecko & Uniswap Payload', 'observation', [coinGeckoPayload, uniswapPayload]],
22
+ ['no inputs', 'empty observation', []],
23
+ ]
24
+ test.each(cases)('with %s returns %s', async (_input: string, _expected: string, data: Payload[]) => {
25
+ const diviner = await CryptoMarketAssetDiviner.create({ account: 'random' })
26
+ const payloads = await diviner.divine(data)
27
+ expect(payloads).toBeArray()
28
+ expect(payloads.length).toBe(1)
29
+ for (let payload of payloads) {
30
+ if (payload?.schema === CryptoMarketAssetSchema) {
31
+ const assetPayload = payload as CryptoMarketAssetPayload
32
+ expect(assetPayload).toBeObject()
33
+ expect(assetPayload?.assets).toBeObject()
34
+ expect(assetPayload?.schema).toBe(CryptoMarketAssetSchema)
35
+ expect(assetPayload?.timestamp).toBeNumber()
36
+ }
37
+ }
38
+ })
39
+ })
@@ -0,0 +1,17 @@
1
+ import '@xylabs/vitest-extended'
2
+
3
+ import { PayloadSetPluginResolver } from '@xyo-network/payloadset-plugin'
4
+ import {
5
+ describe, expect,
6
+ test,
7
+ } from 'vitest'
8
+
9
+ import { CryptoMarketAssetPlugin } from '../Plugin.ts'
10
+
11
+ describe('CryptoMarketCoinGeckoPlugin', () => {
12
+ test('Add to Resolver', async () => {
13
+ const plugin = CryptoMarketAssetPlugin()
14
+ const resolver = await new PayloadSetPluginResolver().register(plugin)
15
+ expect(resolver.resolve(plugin.set)).toBeDefined()
16
+ })
17
+ })
package/typedoc.json DELETED
@@ -1,5 +0,0 @@
1
- {
2
- "$schema": "https://typedoc.org/schema.json",
3
- "entryPoints": ["./src/index.ts"],
4
- "tsconfig": "./tsconfig.typedoc.json"
5
- }
package/xy.config.ts DELETED
@@ -1,10 +0,0 @@
1
- import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
- const config: XyTsupConfig = {
3
- compile: {
4
- browser: {},
5
- node: {},
6
- neutral: { src: true },
7
- },
8
- }
9
-
10
- export default config