@xyo-network/crypto-asset-plugin 2.42.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.
Files changed (118) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +81 -0
  3. package/dist/cjs/Diviner.d.ts +16 -0
  4. package/dist/cjs/Diviner.d.ts.map +1 -0
  5. package/dist/cjs/Diviner.js +33 -0
  6. package/dist/cjs/Diviner.js.map +1 -0
  7. package/dist/cjs/Plugin.d.ts +13 -0
  8. package/dist/cjs/Plugin.d.ts.map +1 -0
  9. package/dist/cjs/Plugin.js +15 -0
  10. package/dist/cjs/Plugin.js.map +1 -0
  11. package/dist/cjs/Schema.d.ts +5 -0
  12. package/dist/cjs/Schema.d.ts.map +1 -0
  13. package/dist/cjs/Schema.js +6 -0
  14. package/dist/cjs/Schema.js.map +1 -0
  15. package/dist/cjs/index.d.ts +6 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +11 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/lib/average.d.ts +3 -0
  20. package/dist/cjs/lib/average.d.ts.map +1 -0
  21. package/dist/cjs/lib/average.js +46 -0
  22. package/dist/cjs/lib/average.js.map +1 -0
  23. package/dist/cjs/lib/divineCoinGeckoPrices.d.ts +4 -0
  24. package/dist/cjs/lib/divineCoinGeckoPrices.d.ts.map +1 -0
  25. package/dist/cjs/lib/divineCoinGeckoPrices.js +29 -0
  26. package/dist/cjs/lib/divineCoinGeckoPrices.js.map +1 -0
  27. package/dist/cjs/lib/divinePrices.d.ts +5 -0
  28. package/dist/cjs/lib/divinePrices.d.ts.map +1 -0
  29. package/dist/cjs/lib/divinePrices.js +20 -0
  30. package/dist/cjs/lib/divinePrices.js.map +1 -0
  31. package/dist/cjs/lib/divineUniswapPrices.d.ts +4 -0
  32. package/dist/cjs/lib/divineUniswapPrices.d.ts.map +1 -0
  33. package/dist/cjs/lib/divineUniswapPrices.js +53 -0
  34. package/dist/cjs/lib/divineUniswapPrices.js.map +1 -0
  35. package/dist/cjs/lib/index.d.ts +2 -0
  36. package/dist/cjs/lib/index.d.ts.map +1 -0
  37. package/dist/cjs/lib/index.js +5 -0
  38. package/dist/cjs/lib/index.js.map +1 -0
  39. package/dist/cjs/test/index.d.ts +3 -0
  40. package/dist/cjs/test/index.d.ts.map +1 -0
  41. package/dist/cjs/test/index.js +6 -0
  42. package/dist/cjs/test/index.js.map +1 -0
  43. package/dist/cjs/test/sampleCoinGecko.d.ts +3 -0
  44. package/dist/cjs/test/sampleCoinGecko.d.ts.map +1 -0
  45. package/dist/cjs/test/sampleCoinGecko.js +77 -0
  46. package/dist/cjs/test/sampleCoinGecko.js.map +1 -0
  47. package/dist/cjs/test/sampleUniswap.d.ts +3 -0
  48. package/dist/cjs/test/sampleUniswap.d.ts.map +1 -0
  49. package/dist/cjs/test/sampleUniswap.js +193 -0
  50. package/dist/cjs/test/sampleUniswap.js.map +1 -0
  51. package/dist/docs.json +4536 -0
  52. package/dist/esm/Diviner.d.ts +16 -0
  53. package/dist/esm/Diviner.d.ts.map +1 -0
  54. package/dist/esm/Diviner.js +23 -0
  55. package/dist/esm/Diviner.js.map +1 -0
  56. package/dist/esm/Plugin.d.ts +13 -0
  57. package/dist/esm/Plugin.d.ts.map +1 -0
  58. package/dist/esm/Plugin.js +10 -0
  59. package/dist/esm/Plugin.js.map +1 -0
  60. package/dist/esm/Schema.d.ts +5 -0
  61. package/dist/esm/Schema.d.ts.map +1 -0
  62. package/dist/esm/Schema.js +3 -0
  63. package/dist/esm/Schema.js.map +1 -0
  64. package/dist/esm/index.d.ts +6 -0
  65. package/dist/esm/index.d.ts.map +1 -0
  66. package/dist/esm/index.js +7 -0
  67. package/dist/esm/index.js.map +1 -0
  68. package/dist/esm/lib/average.d.ts +3 -0
  69. package/dist/esm/lib/average.d.ts.map +1 -0
  70. package/dist/esm/lib/average.js +42 -0
  71. package/dist/esm/lib/average.js.map +1 -0
  72. package/dist/esm/lib/divineCoinGeckoPrices.d.ts +4 -0
  73. package/dist/esm/lib/divineCoinGeckoPrices.d.ts.map +1 -0
  74. package/dist/esm/lib/divineCoinGeckoPrices.js +25 -0
  75. package/dist/esm/lib/divineCoinGeckoPrices.js.map +1 -0
  76. package/dist/esm/lib/divinePrices.d.ts +5 -0
  77. package/dist/esm/lib/divinePrices.d.ts.map +1 -0
  78. package/dist/esm/lib/divinePrices.js +16 -0
  79. package/dist/esm/lib/divinePrices.js.map +1 -0
  80. package/dist/esm/lib/divineUniswapPrices.d.ts +4 -0
  81. package/dist/esm/lib/divineUniswapPrices.d.ts.map +1 -0
  82. package/dist/esm/lib/divineUniswapPrices.js +51 -0
  83. package/dist/esm/lib/divineUniswapPrices.js.map +1 -0
  84. package/dist/esm/lib/index.d.ts +2 -0
  85. package/dist/esm/lib/index.d.ts.map +1 -0
  86. package/dist/esm/lib/index.js +2 -0
  87. package/dist/esm/lib/index.js.map +1 -0
  88. package/dist/esm/test/index.d.ts +3 -0
  89. package/dist/esm/test/index.d.ts.map +1 -0
  90. package/dist/esm/test/index.js +3 -0
  91. package/dist/esm/test/index.js.map +1 -0
  92. package/dist/esm/test/sampleCoinGecko.d.ts +3 -0
  93. package/dist/esm/test/sampleCoinGecko.d.ts.map +1 -0
  94. package/dist/esm/test/sampleCoinGecko.js +74 -0
  95. package/dist/esm/test/sampleCoinGecko.js.map +1 -0
  96. package/dist/esm/test/sampleUniswap.d.ts +3 -0
  97. package/dist/esm/test/sampleUniswap.d.ts.map +1 -0
  98. package/dist/esm/test/sampleUniswap.js +190 -0
  99. package/dist/esm/test/sampleUniswap.js.map +1 -0
  100. package/package.json +82 -0
  101. package/src/Diviner.spec.ts +28 -0
  102. package/src/Diviner.ts +32 -0
  103. package/src/Plugin.spec.ts +11 -0
  104. package/src/Plugin.ts +16 -0
  105. package/src/Schema.ts +5 -0
  106. package/src/index.ts +9 -0
  107. package/src/lib/averaege.spec.ts +30 -0
  108. package/src/lib/average.ts +53 -0
  109. package/src/lib/divineCoinGeckoPrices.spec.ts +29 -0
  110. package/src/lib/divineCoinGeckoPrices.ts +34 -0
  111. package/src/lib/divinePrices.spec.ts +14 -0
  112. package/src/lib/divinePrices.ts +23 -0
  113. package/src/lib/divineUniswapPrices.spec.ts +13 -0
  114. package/src/lib/divineUniswapPrices.ts +65 -0
  115. package/src/lib/index.ts +1 -0
  116. package/src/test/index.ts +2 -0
  117. package/src/test/sampleCoinGecko.ts +74 -0
  118. package/src/test/sampleUniswap.ts +190 -0
@@ -0,0 +1,190 @@
1
+ import { XyoUniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin';
2
+ export const sampleUniswapPayload = {
3
+ pairs: [
4
+ {
5
+ tokens: [
6
+ {
7
+ address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
8
+ symbol: 'xyo',
9
+ value: 0.00000896773,
10
+ },
11
+ {
12
+ address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
13
+ symbol: 'weth',
14
+ value: 111511,
15
+ },
16
+ ],
17
+ },
18
+ {
19
+ tokens: [
20
+ {
21
+ address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
22
+ symbol: 'xyo',
23
+ value: 0.0148782,
24
+ },
25
+ {
26
+ address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
27
+ symbol: 'usdt',
28
+ value: 67.2123,
29
+ },
30
+ ],
31
+ },
32
+ {
33
+ tokens: [
34
+ {
35
+ address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
36
+ symbol: 'xyo',
37
+ value: 0.014039,
38
+ },
39
+ {
40
+ address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
41
+ symbol: 'dai',
42
+ value: 71.2301,
43
+ },
44
+ ],
45
+ },
46
+ {
47
+ tokens: [
48
+ {
49
+ address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
50
+ symbol: 'wbtc',
51
+ value: 1527240,
52
+ },
53
+ {
54
+ address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
55
+ symbol: 'xyo',
56
+ value: 6.54777e-7,
57
+ },
58
+ ],
59
+ },
60
+ {
61
+ tokens: [
62
+ {
63
+ address: '0x514910771AF9Ca656af840dff83E8264EcF986CA',
64
+ symbol: 'link',
65
+ value: 453.816,
66
+ },
67
+ {
68
+ address: '0x55296f69f40Ea6d20E478533C15A6B08B654E758',
69
+ symbol: 'xyo',
70
+ value: 0.00220354,
71
+ },
72
+ ],
73
+ },
74
+ {
75
+ tokens: [
76
+ {
77
+ address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
78
+ symbol: 'wbtc',
79
+ value: 14.0836,
80
+ },
81
+ {
82
+ address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
83
+ symbol: 'weth',
84
+ value: 0.0710048,
85
+ },
86
+ ],
87
+ },
88
+ {
89
+ tokens: [
90
+ {
91
+ address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
92
+ symbol: 'dai',
93
+ value: 1.00004,
94
+ },
95
+ {
96
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
97
+ symbol: 'usdc',
98
+ value: 0.999959,
99
+ },
100
+ ],
101
+ },
102
+ {
103
+ tokens: [
104
+ {
105
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
106
+ symbol: 'usdc',
107
+ value: 0.000616944,
108
+ },
109
+ {
110
+ address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
111
+ symbol: 'weth',
112
+ value: 1620.89,
113
+ },
114
+ ],
115
+ },
116
+ {
117
+ tokens: [
118
+ {
119
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
120
+ symbol: 'usdc',
121
+ value: 0.000617196,
122
+ },
123
+ {
124
+ address: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
125
+ symbol: 'weth',
126
+ value: 1620.23,
127
+ },
128
+ ],
129
+ },
130
+ {
131
+ tokens: [
132
+ {
133
+ address: '0x6B175474E89094C44Da98b954EedeAC495271d0F',
134
+ symbol: 'dai',
135
+ value: 1.00002,
136
+ },
137
+ {
138
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
139
+ symbol: 'usdc',
140
+ value: 0.999983,
141
+ },
142
+ ],
143
+ },
144
+ {
145
+ tokens: [
146
+ {
147
+ address: '0x853d955aCEf822Db058eb8505911ED77F175b99e',
148
+ symbol: 'frax',
149
+ value: 0.999762,
150
+ },
151
+ {
152
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
153
+ symbol: 'usdc',
154
+ value: 1.00024,
155
+ },
156
+ ],
157
+ },
158
+ {
159
+ tokens: [
160
+ {
161
+ address: '0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599',
162
+ symbol: 'wbtc',
163
+ value: 22826.3,
164
+ },
165
+ {
166
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
167
+ symbol: 'usdc',
168
+ value: 0.000043809,
169
+ },
170
+ ],
171
+ },
172
+ {
173
+ tokens: [
174
+ {
175
+ address: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
176
+ symbol: 'usdc',
177
+ value: 0.999853,
178
+ },
179
+ {
180
+ address: '0xdAC17F958D2ee523a2206206994597C13D831ec7',
181
+ symbol: 'usdt',
182
+ value: 1.00015,
183
+ },
184
+ ],
185
+ },
186
+ ],
187
+ schema: XyoUniswapCryptoMarketSchema,
188
+ timestamp: 1659012011418,
189
+ };
190
+ //# sourceMappingURL=sampleUniswap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sampleUniswap.js","sourceRoot":"","sources":["../../../src/test/sampleUniswap.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,82 @@
1
+ {
2
+ "name": "@xyo-network/crypto-asset-plugin",
3
+ "author": {
4
+ "email": "support@xyo.network",
5
+ "name": "XYO Development Team",
6
+ "url": "https://xyo.network"
7
+ },
8
+ "bugs": {
9
+ "email": "support@xyo.network",
10
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
11
+ },
12
+ "dependencies": {
13
+ "@xylabs/exists": "^2.6.9",
14
+ "@xyo-network/coingecko-crypto-market-payload-plugin": "^2.42.0",
15
+ "@xyo-network/crypto-asset-payload-plugin": "^2.42.0",
16
+ "@xyo-network/diviner": "^2.42.0",
17
+ "@xyo-network/module": "^2.42.0",
18
+ "@xyo-network/payload": "^2.42.0",
19
+ "@xyo-network/payloadset-plugin": "^2.42.0",
20
+ "@xyo-network/promise": "^2.42.0",
21
+ "@xyo-network/uniswap-crypto-market-payload-plugin": "^2.42.0",
22
+ "tslib": "^2.4.1"
23
+ },
24
+ "devDependencies": {
25
+ "@ethersproject/address": "^5.7.0",
26
+ "@ethersproject/contracts": "^5.7.0",
27
+ "@ethersproject/networks": "^5.7.1",
28
+ "@ethersproject/providers": "^5.7.2",
29
+ "@ethersproject/solidity": "^5.7.0",
30
+ "@uniswap/sdk": "^3.0.3",
31
+ "@uniswap/sdk-core": "^3.1.0",
32
+ "@uniswap/v3-sdk": "^3.9.0",
33
+ "@xyo-network/typechain": "^2.0.4",
34
+ "@xyo-network/uniswap-typechain": "^2.0.4"
35
+ },
36
+ "peerDependencies": {
37
+ "@ethersproject/address": "^5.7.0",
38
+ "@ethersproject/contracts": "^5.7.0",
39
+ "@ethersproject/networks": "^5.7.0",
40
+ "@ethersproject/providers": "^5.7.0",
41
+ "@ethersproject/solidity": "^5.7.0",
42
+ "@uniswap/sdk": "^3.0.3",
43
+ "@uniswap/sdk-core": "^3.1.0",
44
+ "@uniswap/v3-sdk": "^3.9.0",
45
+ "@xyo-network/typechain": "^2.0.3",
46
+ "@xyo-network/uniswap-typechain": "^2.0.3"
47
+ },
48
+ "description": "Primary SDK for using XYO Protocol 2.0",
49
+ "browser": "dist/esm/index.js",
50
+ "docs": "dist/docs.json",
51
+ "exports": {
52
+ ".": {
53
+ "node": {
54
+ "import": "./dist/esm/index.js",
55
+ "require": "./dist/cjs/index.js"
56
+ },
57
+ "browser": {
58
+ "import": "./dist/esm/index.js",
59
+ "require": "./dist/cjs/index.js"
60
+ },
61
+ "default": "./dist/esm/index.js"
62
+ },
63
+ "./dist/docs.json": {
64
+ "default": "./dist/docs.json"
65
+ },
66
+ "./package.json": "./package.json"
67
+ },
68
+ "main": "dist/cjs/index.js",
69
+ "module": "dist/esm/index.js",
70
+ "homepage": "https://xyo.network",
71
+ "license": "LGPL-3.0-only",
72
+ "publishConfig": {
73
+ "access": "public"
74
+ },
75
+ "repository": {
76
+ "type": "git",
77
+ "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
78
+ },
79
+ "sideEffects": false,
80
+ "types": "dist/esm/index.d.ts",
81
+ "version": "2.42.0"
82
+ }
@@ -0,0 +1,28 @@
1
+ import { XyoCryptoMarketAssetPayload, XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
2
+ import { DivinerWrapper } from '@xyo-network/diviner'
3
+
4
+ import { XyoCryptoMarketAssetDiviner } from './Diviner'
5
+ import { sampleCoinGeckoPayload, sampleUniswapPayload } from './test'
6
+
7
+ const coinGeckoPayload = sampleCoinGeckoPayload
8
+ const uniswapPayload = sampleUniswapPayload
9
+
10
+ describe('Diviner', () => {
11
+ test('returns observation', async () => {
12
+ const module = await XyoCryptoMarketAssetDiviner.create()
13
+ const wrapper = new DivinerWrapper(module)
14
+
15
+ const payloads = await wrapper.divine([coinGeckoPayload, uniswapPayload])
16
+ expect(payloads).toBeArray()
17
+ expect(payloads.length).toBe(1)
18
+ payloads.map((payload) => {
19
+ if (payload?.schema === XyoCryptoMarketAssetSchema) {
20
+ const assetPayload = payload as XyoCryptoMarketAssetPayload
21
+ expect(assetPayload).toBeObject()
22
+ expect(assetPayload?.assets).toBeObject()
23
+ expect(assetPayload?.schema).toBe(XyoCryptoMarketAssetSchema)
24
+ expect(assetPayload?.timestamp).toBeNumber()
25
+ }
26
+ })
27
+ })
28
+ })
package/src/Diviner.ts ADDED
@@ -0,0 +1,32 @@
1
+ import { XyoCoingeckoCryptoMarketPayload, XyoCoingeckoCryptoMarketSchema } from '@xyo-network/coingecko-crypto-market-payload-plugin'
2
+ import { XyoCryptoMarketAssetPayload, XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
3
+ import { AbstractDiviner, DivinerConfig, XyoDivinerDivineQuerySchema } from '@xyo-network/diviner'
4
+ import { XyoModuleParams } from '@xyo-network/module'
5
+ import { XyoPayloads } from '@xyo-network/payload'
6
+ import { Promisable } from '@xyo-network/promise'
7
+ import { XyoUniswapCryptoMarketPayload, XyoUniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
8
+
9
+ import { divinePrices } from './lib'
10
+ import { XyoCryptoMarketAssetDivinerConfigSchema } from './Schema'
11
+
12
+ export type XyoCryptoMarketAssetDivinerConfig = DivinerConfig<{ schema: XyoCryptoMarketAssetDivinerConfigSchema }>
13
+
14
+ export class XyoCryptoMarketAssetDiviner extends AbstractDiviner {
15
+ static override configSchema = XyoCryptoMarketAssetDivinerConfigSchema
16
+ static override targetSchema = XyoCryptoMarketAssetSchema
17
+
18
+ static override async create(params?: XyoModuleParams<XyoCryptoMarketAssetDivinerConfig>) {
19
+ return (await super.create(params)) as XyoCryptoMarketAssetDiviner
20
+ }
21
+
22
+ public override divine(payloads?: XyoPayloads): Promisable<XyoPayloads> {
23
+ const coinGeckoPayload = payloads?.find((payload) => payload?.schema === XyoCoingeckoCryptoMarketSchema) as XyoCoingeckoCryptoMarketPayload
24
+ const uniswapPayload = payloads?.find((payload) => payload?.schema === XyoUniswapCryptoMarketSchema) as XyoUniswapCryptoMarketPayload
25
+ const result: XyoCryptoMarketAssetPayload = divinePrices(coinGeckoPayload, uniswapPayload)
26
+ return [result]
27
+ }
28
+
29
+ override queries() {
30
+ return [XyoDivinerDivineQuerySchema, ...super.queries()]
31
+ }
32
+ }
@@ -0,0 +1,11 @@
1
+ import { PayloadSetPluginResolver } from '@xyo-network/payloadset-plugin'
2
+
3
+ import { XyoCryptoMarketAssetPlugin } from './Plugin'
4
+
5
+ describe('XyoCryptoMarketCoinGeckoPlugin', () => {
6
+ test('Add to Resolver', () => {
7
+ const plugin = XyoCryptoMarketAssetPlugin()
8
+ const resolver = new PayloadSetPluginResolver().register(plugin)
9
+ expect(resolver.resolve(plugin.set)).toBeDefined()
10
+ })
11
+ })
package/src/Plugin.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
2
+ import { XyoModuleParams } from '@xyo-network/module'
3
+ import { PayloadSetSchema } from '@xyo-network/payload'
4
+ import { createPayloadSetPlugin, PayloadSetDivinerPlugin } from '@xyo-network/payloadset-plugin'
5
+
6
+ import { XyoCryptoMarketAssetDiviner, XyoCryptoMarketAssetDivinerConfig } from './Diviner'
7
+
8
+ export const XyoCryptoMarketAssetPlugin = () =>
9
+ createPayloadSetPlugin<PayloadSetDivinerPlugin<XyoModuleParams<XyoCryptoMarketAssetDivinerConfig>>>(
10
+ { required: { [XyoCryptoMarketAssetSchema]: 1 }, schema: PayloadSetSchema },
11
+ {
12
+ diviner: async (params) => {
13
+ return await XyoCryptoMarketAssetDiviner.create(params)
14
+ },
15
+ },
16
+ )
package/src/Schema.ts ADDED
@@ -0,0 +1,5 @@
1
+ export type XyoCryptoMarketAssetDivinerQuerySchema = 'network.xyo.crypto.asset.diviner.query'
2
+ export const XyoCryptoMarketAssetDivinerQuerySchema: XyoCryptoMarketAssetDivinerQuerySchema = 'network.xyo.crypto.asset.diviner.query'
3
+
4
+ export type XyoCryptoMarketAssetDivinerConfigSchema = 'network.xyo.crypto.asset.diviner.config'
5
+ export const XyoCryptoMarketAssetDivinerConfigSchema: XyoCryptoMarketAssetDivinerConfigSchema = 'network.xyo.crypto.asset.diviner.config'
package/src/index.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { XyoCryptoMarketAssetPlugin } from './Plugin'
2
+
3
+ export * from './Diviner'
4
+ export * from './Schema'
5
+
6
+ export { XyoCryptoMarketAssetPlugin }
7
+
8
+ // eslint-disable-next-line import/no-default-export
9
+ export default XyoCryptoMarketAssetPlugin
@@ -0,0 +1,30 @@
1
+ import { AssetInfo, XyoCryptoMarketAssetPayload, XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
2
+ import { XyoPayloadBuilder } from '@xyo-network/payload'
3
+
4
+ import { average } from './average'
5
+
6
+ const schema = XyoCryptoMarketAssetSchema
7
+
8
+ const getPayloadWithPrice = (price: number): XyoCryptoMarketAssetPayload => {
9
+ const assets: Record<string, AssetInfo> = { xyo: { value: { usd: price.toString() } } }
10
+ const timestamp = Date.now()
11
+ return new XyoPayloadBuilder<XyoCryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
12
+ }
13
+
14
+ describe('average', () => {
15
+ it('averages numbers', () => {
16
+ const payloads = [getPayloadWithPrice(1), getPayloadWithPrice(2), getPayloadWithPrice(3)]
17
+ expect(average(...payloads)?.xyo?.value?.usd).toBe('2')
18
+ })
19
+ it('handles single value', () => {
20
+ const payloads = [getPayloadWithPrice(1)]
21
+ expect(average(...payloads)?.xyo?.value?.usd).toBe('1')
22
+ })
23
+ it('handles no values', () => {
24
+ expect(average()?.xyo?.value?.usd).toBeUndefined()
25
+ })
26
+ it('handles undefined values', () => {
27
+ const payloads = [getPayloadWithPrice(1), undefined, getPayloadWithPrice(3)]
28
+ expect(average(...payloads)?.xyo?.value?.usd).toBe('2')
29
+ })
30
+ })
@@ -0,0 +1,53 @@
1
+ import { exists } from '@xylabs/exists'
2
+ import { AssetInfo, Currency, Token, XyoCryptoMarketAssetPayload } from '@xyo-network/crypto-asset-payload-plugin'
3
+
4
+ const isNumber = (val: number | undefined): val is number => {
5
+ return val !== undefined
6
+ }
7
+
8
+ const parseStringifiedNumber = (value: string | undefined): number | undefined => {
9
+ if (!value) return undefined
10
+ const parsed = parseFloat(value)
11
+ return isNaN(parsed) ? undefined : parsed
12
+ }
13
+
14
+ const averageStringifiedNumbers = (...prices: (string | undefined)[]): number | undefined => {
15
+ const numbers = prices.map(parseStringifiedNumber).filter(isNumber)
16
+ return numbers.length ? numbers.reduce((sum, n) => sum + n, 0) / numbers.length : undefined
17
+ }
18
+
19
+ export const average = (...input: (XyoCryptoMarketAssetPayload | undefined)[]): Record<string, AssetInfo> => {
20
+ // Get all the assets represented
21
+ const payloads = input.filter(exists)
22
+ const tokens = new Set<Token>(payloads.map((payload) => Object.keys(payload.assets).map<Token>((t) => t as Token)).flatMap((t) => t))
23
+ // Get all the valuations used
24
+ const valuations = new Set<Token | Currency>(
25
+ [...tokens]
26
+ .map((asset) => {
27
+ const assetInfo = payloads.map((p) => p.assets?.[asset]).filter(exists)
28
+ const valueBasis = new Set<Currency | Token>(
29
+ assetInfo
30
+ .map((v) => Object.keys(v.value) as unknown as Currency | Token)
31
+ .flatMap((v) => v)
32
+ .filter(exists),
33
+ )
34
+ return [...valueBasis]
35
+ })
36
+ .flatMap((v) => v),
37
+ )
38
+ // For each of the tokens, calculate the average valuation for each of valuation bases
39
+ const assets: Record<string, AssetInfo> = Object.fromEntries(
40
+ [...tokens].map((token) => {
41
+ const assetInfo = payloads.map((p) => p.assets?.[token]).filter(exists)
42
+ const value = Object.fromEntries(
43
+ [...valuations].map((valuation) => {
44
+ const assetValuations = assetInfo.map((info) => info.value?.[valuation])
45
+ const averageAssetValuation = averageStringifiedNumbers(...assetValuations)
46
+ return [valuation, averageAssetValuation?.toString()]
47
+ }),
48
+ )
49
+ return [token, { value }]
50
+ }),
51
+ )
52
+ return assets
53
+ }
@@ -0,0 +1,29 @@
1
+ import { assertEx } from '@xylabs/assert'
2
+
3
+ import { sampleCoinGeckoPayload } from '../test'
4
+ import { divineCoinGeckoPrices } from './divineCoinGeckoPrices'
5
+
6
+ describe('divineCoinGeckoPrices', () => {
7
+ it('divines prices from CoinGecko', () => {
8
+ const result = divineCoinGeckoPrices(sampleCoinGeckoPayload)
9
+ expect(result.assets).toBeObject()
10
+ const assets = assertEx(result.assets)
11
+ Object.entries(assets).map(([token, assetInfo]) => {
12
+ expect(token).toBeString()
13
+ expect(assetInfo).toBeObject()
14
+ const value = assertEx(assetInfo?.value)
15
+ expect(value).toBeObject()
16
+ Object.entries(value).map(([symbol, price]) => {
17
+ expect(symbol).toBeString()
18
+ expect(price).toBeString()
19
+ const parsed = parseFloat(price)
20
+ expect(parsed).toBeNumber()
21
+ expect(isNaN(parsed)).toBeFalse()
22
+ })
23
+ })
24
+ expect(result?.assets?.xyo?.value?.btc).toBe('6.28282e-7')
25
+ expect(result?.assets?.xyo?.value?.eth).toBe('0.00000885')
26
+ expect(result?.assets?.xyo?.value?.eur).toBe('0.01417995')
27
+ expect(result?.assets?.xyo?.value?.usd).toBe('0.01439307')
28
+ })
29
+ })
@@ -0,0 +1,34 @@
1
+ import { XyoCoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
2
+ import { AssetInfo, XyoCryptoMarketAssetPayload, XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
3
+ import { XyoPayloadBuilder } from '@xyo-network/payload'
4
+
5
+ const schema = XyoCryptoMarketAssetSchema
6
+
7
+ const valuationExists = (value: [string, Partial<Record<string, number>> | undefined]): value is [string, Partial<Record<string, number>>] => {
8
+ return !!value[1]
9
+ }
10
+
11
+ const otherValueExists = (value: [string, number | undefined]): value is [string, number] => {
12
+ const possiblyNumber = value[1]
13
+ return typeof possiblyNumber === 'number' && !isNaN(possiblyNumber)
14
+ }
15
+
16
+ export const divineCoinGeckoPrices = (payload: XyoCoingeckoCryptoMarketPayload | undefined): XyoCryptoMarketAssetPayload => {
17
+ const assets: Record<string, AssetInfo> =
18
+ payload && payload?.assets
19
+ ? Object.fromEntries(
20
+ Object.entries(payload.assets)
21
+ .filter(valuationExists)
22
+ .map(([asset, valuation]) => {
23
+ const value = Object.fromEntries(
24
+ Object.entries(valuation)
25
+ .filter(otherValueExists)
26
+ .map(([symbol, price]) => [symbol.toLowerCase(), price?.toString()]),
27
+ )
28
+ return [asset, { value }]
29
+ }),
30
+ )
31
+ : {}
32
+ const timestamp = Date.now()
33
+ return new XyoPayloadBuilder<XyoCryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
34
+ }
@@ -0,0 +1,14 @@
1
+ import { sampleCoinGeckoPayload, sampleUniswapPayload } from '../test'
2
+ import { divinePrices } from './divinePrices'
3
+
4
+ describe('divinePrices', () => {
5
+ it('divines prices', () => {
6
+ const result = divinePrices(sampleCoinGeckoPayload, sampleUniswapPayload)
7
+ expect(result).toBeObject()
8
+ expect(result.timestamp).toBeNumber()
9
+ expect(result.assets.xyo?.value.btc).toBe('6.415295e-7')
10
+ expect(result.assets.xyo?.value.eth).toBe('0.000008908865')
11
+ expect(result.assets.xyo?.value.eur).toBe('0.01417995')
12
+ expect(result.assets.xyo?.value.usd).toBe('0.014635635000000001')
13
+ })
14
+ })
@@ -0,0 +1,23 @@
1
+ import { exists } from '@xylabs/exists'
2
+ import { XyoCoingeckoCryptoMarketPayload } from '@xyo-network/coingecko-crypto-market-payload-plugin'
3
+ import { XyoCryptoMarketAssetPayload, XyoCryptoMarketAssetSchema } from '@xyo-network/crypto-asset-payload-plugin'
4
+ import { XyoPayloadBuilder } from '@xyo-network/payload'
5
+ import { XyoUniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin'
6
+
7
+ import { average } from './average'
8
+ import { divineCoinGeckoPrices } from './divineCoinGeckoPrices'
9
+ import { divineUniswapPrices } from './divineUniswapPrices'
10
+
11
+ const schema = XyoCryptoMarketAssetSchema
12
+
13
+ export const divinePrices = (
14
+ coinGeckoPayload: XyoCoingeckoCryptoMarketPayload | undefined,
15
+ uniswapPayload: XyoUniswapCryptoMarketPayload | undefined,
16
+ ): XyoCryptoMarketAssetPayload => {
17
+ const coinGeckoPrices = divineCoinGeckoPrices(coinGeckoPayload)
18
+ const uniswapPrices = divineUniswapPrices(uniswapPayload)
19
+ const prices = [uniswapPayload, coinGeckoPayload].some(exists)
20
+ const assets = prices ? average(coinGeckoPrices, uniswapPrices) : {}
21
+ const timestamp = Date.now()
22
+ return new XyoPayloadBuilder<XyoCryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
23
+ }
@@ -0,0 +1,13 @@
1
+ import { sampleUniswapPayload } from '../test'
2
+ import { divineUniswapPrices } from './divineUniswapPrices'
3
+
4
+ describe('divineUniswapPrices', () => {
5
+ it('divines prices from Uniswap', () => {
6
+ const result = divineUniswapPrices(sampleUniswapPayload)
7
+ expect(result).toBeObject()
8
+ expect(result?.assets?.xyo?.value?.btc).toBe('6.54777e-7')
9
+ expect(result?.assets?.xyo?.value?.eth).toBe('0.00000896773')
10
+ expect(result?.assets?.xyo?.value?.eur).toBe(undefined)
11
+ expect(result?.assets?.xyo?.value?.usd).toBe('0.0148782')
12
+ })
13
+ })
@@ -0,0 +1,65 @@
1
+ import { exists } from '@xylabs/exists'
2
+ import {
3
+ AssetInfo,
4
+ Currency,
5
+ Token,
6
+ ValueBasis,
7
+ XyoCryptoMarketAssetPayload,
8
+ XyoCryptoMarketAssetSchema,
9
+ } from '@xyo-network/crypto-asset-payload-plugin'
10
+ import { XyoPayloadBuilder } from '@xyo-network/payload'
11
+ import { XyoUniswapCryptoMarketPayload, XyoUniswapCryptoPair, XyoUniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin'
12
+
13
+ const schema = XyoCryptoMarketAssetSchema
14
+
15
+ const mapUniswapToken = (symbol: string): Token | Currency => {
16
+ // TODO: Actually calculate the value of the token/stablecoin based on others
17
+ // to weed out individual fluctuations in price
18
+ if (symbol.toLowerCase() === 'wbtc') return 'btc'
19
+ if (symbol.toLowerCase() === 'weth') return 'eth'
20
+ if (symbol.toLowerCase() === 'usdt') return 'usd'
21
+ return symbol.toLowerCase() as Token
22
+ }
23
+
24
+ const pairsContainingToken = (uniswapPayload: XyoUniswapCryptoMarketPayload, token: Token) => {
25
+ return uniswapPayload?.pairs
26
+ .map((p) => p.tokens)
27
+ .filter((p) => p.some((x) => x.symbol.toLowerCase() === token))
28
+ .filter(exists)
29
+ }
30
+
31
+ const tokensFromPairs = (pairs: XyoUniswapCryptoPair[]) => {
32
+ return pairs
33
+ .map((p) => p.tokens)
34
+ .flatMap((t) => t)
35
+ .map((t) => t.symbol.toLowerCase() as Token)
36
+ }
37
+
38
+ const valuesFromTokenPairs = (tokensPairs: XyoUniswapCryptoToken[][], token: Token): ValueBasis => {
39
+ return Object.fromEntries(
40
+ tokensPairs
41
+ .map((pair) => {
42
+ const current = pair.filter((p) => p.symbol.toLowerCase() === token)?.[0]
43
+ const other = pair.filter((p) => p.symbol.toLowerCase() !== token)?.[0]
44
+ return [other.symbol.toLowerCase(), current.value.toString()]
45
+ })
46
+ .map((x) => [mapUniswapToken(x[0]), x[1]]),
47
+ )
48
+ }
49
+
50
+ export const divineUniswapPrices = (uniswapPayload: XyoUniswapCryptoMarketPayload | undefined): XyoCryptoMarketAssetPayload => {
51
+ let assets: Partial<Record<Token, AssetInfo | undefined>> = {}
52
+ if (uniswapPayload) {
53
+ const tokens: Set<Token> = new Set(tokensFromPairs(uniswapPayload.pairs))
54
+ assets = Object.fromEntries(
55
+ [...tokens].map((token) => {
56
+ const pairs = pairsContainingToken(uniswapPayload, token)
57
+ const value: ValueBasis = valuesFromTokenPairs(pairs, token)
58
+ const assetInfo: AssetInfo = { value }
59
+ return [token, assetInfo]
60
+ }),
61
+ )
62
+ }
63
+ const timestamp = Date.now()
64
+ return new XyoPayloadBuilder<XyoCryptoMarketAssetPayload>({ schema }).fields({ assets, timestamp }).build()
65
+ }
@@ -0,0 +1 @@
1
+ export * from './divinePrices'
@@ -0,0 +1,2 @@
1
+ export * from './sampleCoinGecko'
2
+ export * from './sampleUniswap'