@xyo-network/uniswap-crypto-market-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 (133) hide show
  1. package/LICENSE +165 -0
  2. package/README.md +81 -0
  3. package/dist/cjs/Config.d.ts +7 -0
  4. package/dist/cjs/Config.d.ts.map +1 -0
  5. package/dist/cjs/Config.js +3 -0
  6. package/dist/cjs/Config.js.map +1 -0
  7. package/dist/cjs/Plugin.d.ts +4 -0
  8. package/dist/cjs/Plugin.d.ts.map +1 -0
  9. package/dist/cjs/Plugin.js +16 -0
  10. package/dist/cjs/Plugin.js.map +1 -0
  11. package/dist/cjs/Witness.d.ts +19 -0
  12. package/dist/cjs/Witness.d.ts.map +1 -0
  13. package/dist/cjs/Witness.js +51 -0
  14. package/dist/cjs/Witness.js.map +1 -0
  15. package/dist/cjs/index.d.ts +7 -0
  16. package/dist/cjs/index.d.ts.map +1 -0
  17. package/dist/cjs/index.js +12 -0
  18. package/dist/cjs/index.js.map +1 -0
  19. package/dist/cjs/lib/Ethers/UniSwap3Pair.d.ts +29 -0
  20. package/dist/cjs/lib/Ethers/UniSwap3Pair.d.ts.map +1 -0
  21. package/dist/cjs/lib/Ethers/UniSwap3Pair.js +103 -0
  22. package/dist/cjs/lib/Ethers/UniSwap3Pair.js.map +1 -0
  23. package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts +13 -0
  24. package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts.map +1 -0
  25. package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.js +31 -0
  26. package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.js.map +1 -0
  27. package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.d.ts +3 -0
  28. package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.d.ts.map +1 -0
  29. package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.js +3 -0
  30. package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.js.map +1 -0
  31. package/dist/cjs/lib/Ethers/createUniswapPoolContracts.d.ts +4 -0
  32. package/dist/cjs/lib/Ethers/createUniswapPoolContracts.d.ts.map +1 -0
  33. package/dist/cjs/lib/Ethers/createUniswapPoolContracts.js +12 -0
  34. package/dist/cjs/lib/Ethers/createUniswapPoolContracts.js.map +1 -0
  35. package/dist/cjs/lib/Ethers/index.d.ts +5 -0
  36. package/dist/cjs/lib/Ethers/index.d.ts.map +1 -0
  37. package/dist/cjs/lib/Ethers/index.js +8 -0
  38. package/dist/cjs/lib/Ethers/index.js.map +1 -0
  39. package/dist/cjs/lib/UniswapPoolContracts.d.ts +2 -0
  40. package/dist/cjs/lib/UniswapPoolContracts.d.ts.map +1 -0
  41. package/dist/cjs/lib/UniswapPoolContracts.js +19 -0
  42. package/dist/cjs/lib/UniswapPoolContracts.js.map +1 -0
  43. package/dist/cjs/lib/UniswapV3Slot0Fields.d.ts +3 -0
  44. package/dist/cjs/lib/UniswapV3Slot0Fields.d.ts.map +1 -0
  45. package/dist/cjs/lib/UniswapV3Slot0Fields.js +3 -0
  46. package/dist/cjs/lib/UniswapV3Slot0Fields.js.map +1 -0
  47. package/dist/cjs/lib/index.d.ts +4 -0
  48. package/dist/cjs/lib/index.d.ts.map +1 -0
  49. package/dist/cjs/lib/index.js +7 -0
  50. package/dist/cjs/lib/index.js.map +1 -0
  51. package/dist/cjs/lib/logErrors.d.ts +3 -0
  52. package/dist/cjs/lib/logErrors.d.ts.map +1 -0
  53. package/dist/cjs/lib/logErrors.js +25 -0
  54. package/dist/cjs/lib/logErrors.js.map +1 -0
  55. package/dist/cjs/lib/pricesFromUniswap3.d.ts +4 -0
  56. package/dist/cjs/lib/pricesFromUniswap3.d.ts.map +1 -0
  57. package/dist/cjs/lib/pricesFromUniswap3.js +16 -0
  58. package/dist/cjs/lib/pricesFromUniswap3.js.map +1 -0
  59. package/dist/docs.json +5480 -0
  60. package/dist/esm/Config.d.ts +7 -0
  61. package/dist/esm/Config.d.ts.map +1 -0
  62. package/dist/esm/Config.js +2 -0
  63. package/dist/esm/Config.js.map +1 -0
  64. package/dist/esm/Plugin.d.ts +4 -0
  65. package/dist/esm/Plugin.d.ts.map +1 -0
  66. package/dist/esm/Plugin.js +11 -0
  67. package/dist/esm/Plugin.js.map +1 -0
  68. package/dist/esm/Witness.d.ts +19 -0
  69. package/dist/esm/Witness.d.ts.map +1 -0
  70. package/dist/esm/Witness.js +32 -0
  71. package/dist/esm/Witness.js.map +1 -0
  72. package/dist/esm/index.d.ts +7 -0
  73. package/dist/esm/index.d.ts.map +1 -0
  74. package/dist/esm/index.js +8 -0
  75. package/dist/esm/index.js.map +1 -0
  76. package/dist/esm/lib/Ethers/UniSwap3Pair.d.ts +29 -0
  77. package/dist/esm/lib/Ethers/UniSwap3Pair.d.ts.map +1 -0
  78. package/dist/esm/lib/Ethers/UniSwap3Pair.js +91 -0
  79. package/dist/esm/lib/Ethers/UniSwap3Pair.js.map +1 -0
  80. package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts +13 -0
  81. package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts.map +1 -0
  82. package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.js +28 -0
  83. package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.js.map +1 -0
  84. package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.d.ts +3 -0
  85. package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.d.ts.map +1 -0
  86. package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.js +2 -0
  87. package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.js.map +1 -0
  88. package/dist/esm/lib/Ethers/createUniswapPoolContracts.d.ts +4 -0
  89. package/dist/esm/lib/Ethers/createUniswapPoolContracts.d.ts.map +1 -0
  90. package/dist/esm/lib/Ethers/createUniswapPoolContracts.js +8 -0
  91. package/dist/esm/lib/Ethers/createUniswapPoolContracts.js.map +1 -0
  92. package/dist/esm/lib/Ethers/index.d.ts +5 -0
  93. package/dist/esm/lib/Ethers/index.d.ts.map +1 -0
  94. package/dist/esm/lib/Ethers/index.js +5 -0
  95. package/dist/esm/lib/Ethers/index.js.map +1 -0
  96. package/dist/esm/lib/UniswapPoolContracts.d.ts +2 -0
  97. package/dist/esm/lib/UniswapPoolContracts.d.ts.map +1 -0
  98. package/dist/esm/lib/UniswapPoolContracts.js +16 -0
  99. package/dist/esm/lib/UniswapPoolContracts.js.map +1 -0
  100. package/dist/esm/lib/UniswapV3Slot0Fields.d.ts +3 -0
  101. package/dist/esm/lib/UniswapV3Slot0Fields.d.ts.map +1 -0
  102. package/dist/esm/lib/UniswapV3Slot0Fields.js +2 -0
  103. package/dist/esm/lib/UniswapV3Slot0Fields.js.map +1 -0
  104. package/dist/esm/lib/index.d.ts +4 -0
  105. package/dist/esm/lib/index.d.ts.map +1 -0
  106. package/dist/esm/lib/index.js +4 -0
  107. package/dist/esm/lib/index.js.map +1 -0
  108. package/dist/esm/lib/logErrors.d.ts +3 -0
  109. package/dist/esm/lib/logErrors.d.ts.map +1 -0
  110. package/dist/esm/lib/logErrors.js +19 -0
  111. package/dist/esm/lib/logErrors.js.map +1 -0
  112. package/dist/esm/lib/pricesFromUniswap3.d.ts +4 -0
  113. package/dist/esm/lib/pricesFromUniswap3.d.ts.map +1 -0
  114. package/dist/esm/lib/pricesFromUniswap3.js +11 -0
  115. package/dist/esm/lib/pricesFromUniswap3.js.map +1 -0
  116. package/package.json +77 -0
  117. package/src/Config.ts +7 -0
  118. package/src/Plugin.spec.ts +11 -0
  119. package/src/Plugin.ts +16 -0
  120. package/src/Witness.spec.ts +56 -0
  121. package/src/Witness.ts +51 -0
  122. package/src/index.ts +10 -0
  123. package/src/lib/Ethers/UniSwap3Pair.ts +109 -0
  124. package/src/lib/Ethers/Uniswap3PoolSlot0Wrapper.ts +36 -0
  125. package/src/lib/Ethers/UniswapV3Slot0Fields.ts +3 -0
  126. package/src/lib/Ethers/createUniswapPoolContracts.ts +10 -0
  127. package/src/lib/Ethers/index.ts +4 -0
  128. package/src/lib/UniswapPoolContracts.ts +15 -0
  129. package/src/lib/UniswapV3Slot0Fields.ts +4 -0
  130. package/src/lib/index.ts +3 -0
  131. package/src/lib/logErrors.ts +17 -0
  132. package/src/lib/pricesFromUniswap3.spec.ts +13 -0
  133. package/src/lib/pricesFromUniswap3.ts +19 -0
package/src/Plugin.ts ADDED
@@ -0,0 +1,16 @@
1
+ import { PayloadSetSchema } from '@xyo-network/payload'
2
+ import { createPayloadSetPlugin, PayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin'
3
+ import { XyoUniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
4
+
5
+ import { XyoUniswapCryptoMarketWitness, XyoUniswapCryptoMarketWitnessParams } from './Witness'
6
+
7
+ export const XyoUniswapCryptoMarketPlugin = () =>
8
+ createPayloadSetPlugin<PayloadSetWitnessPlugin<XyoUniswapCryptoMarketWitnessParams>>(
9
+ { required: { [XyoUniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema },
10
+ {
11
+ witness: async (params) => {
12
+ const result = await XyoUniswapCryptoMarketWitness.create(params)
13
+ return result
14
+ },
15
+ },
16
+ )
@@ -0,0 +1,56 @@
1
+ // Mock Date.now
2
+ const now = new Date()
3
+ jest.useFakeTimers().setSystemTime(now)
4
+
5
+ import { InfuraProvider } from '@ethersproject/providers'
6
+ import { PayloadWrapper } from '@xyo-network/payload'
7
+ import { XyoUniswapCryptoMarketPayload, XyoUniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin'
8
+
9
+ import { UniswapPoolContracts } from './lib'
10
+ import { XyoUniswapCryptoMarketWitness } from './Witness'
11
+
12
+ describe('XyoUniswapCryptoMarketWitness', () => {
13
+ test('observe', async () => {
14
+ const provider = new InfuraProvider('homestead', { projectId: process.env.INFURA_PROJECT_ID, projectSecret: process.env.INFURA_PROJECT_SECRET })
15
+ const witness = await XyoUniswapCryptoMarketWitness.create({
16
+ config: {
17
+ pools: UniswapPoolContracts,
18
+ schema: XyoUniswapCryptoMarketWitnessConfigSchema,
19
+ },
20
+ provider,
21
+ })
22
+ const [observation] = (await witness.observe()) as XyoUniswapCryptoMarketPayload[]
23
+ expect(observation.pairs.length).toBeGreaterThan(1)
24
+ expect(observation.timestamp).toBe(+now)
25
+
26
+ const answerWrapper = new PayloadWrapper(observation)
27
+ expect(answerWrapper.valid).toBe(true)
28
+ })
29
+ test('observe [no config]', async () => {
30
+ const provider = new InfuraProvider('homestead', { projectId: process.env.INFURA_PROJECT_ID, projectSecret: process.env.INFURA_PROJECT_SECRET })
31
+ const witness = await XyoUniswapCryptoMarketWitness.create({
32
+ config: {
33
+ pools: UniswapPoolContracts,
34
+ schema: XyoUniswapCryptoMarketWitnessConfigSchema,
35
+ },
36
+ provider,
37
+ })
38
+ const [observation] = (await witness.observe()) as XyoUniswapCryptoMarketPayload[]
39
+ expect(observation.pairs.length).toBeGreaterThan(1)
40
+ expect(observation.timestamp).toBe(+now)
41
+
42
+ const answerWrapper = new PayloadWrapper(observation)
43
+ expect(answerWrapper.valid).toBe(true)
44
+ })
45
+ test('observe [no params]', async () => {
46
+ const didThrow = async () => {
47
+ try {
48
+ await XyoUniswapCryptoMarketWitness.create()
49
+ return false
50
+ } catch {
51
+ return true
52
+ }
53
+ }
54
+ expect(await didThrow()).toBe(true)
55
+ })
56
+ })
package/src/Witness.ts ADDED
@@ -0,0 +1,51 @@
1
+ import { Provider } from '@ethersproject/providers'
2
+ import { assertEx } from '@xylabs/assert'
3
+ import { XyoModuleParams } from '@xyo-network/module'
4
+ import { XyoPayload } from '@xyo-network/payload'
5
+ import {
6
+ XyoUniswapCryptoMarketPayload,
7
+ XyoUniswapCryptoMarketSchema,
8
+ XyoUniswapCryptoMarketWitnessConfigSchema,
9
+ } from '@xyo-network/uniswap-crypto-market-payload-plugin'
10
+ import { AbstractWitness } from '@xyo-network/witness'
11
+
12
+ import { XyoUniswapCryptoMarketWitnessConfig } from './Config'
13
+ import { createUniswapPoolContracts, EthersUniSwap3Pair, pricesFromUniswap3, UniswapPoolContracts } from './lib'
14
+
15
+ export interface XyoUniswapCryptoMarketWitnessParams extends XyoModuleParams<XyoUniswapCryptoMarketWitnessConfig> {
16
+ provider: Provider
17
+ }
18
+
19
+ export class XyoUniswapCryptoMarketWitness extends AbstractWitness<XyoUniswapCryptoMarketWitnessConfig> {
20
+ static override configSchema = XyoUniswapCryptoMarketWitnessConfigSchema
21
+
22
+ protected pairs?: EthersUniSwap3Pair[]
23
+ protected provider?: Provider
24
+ protected constructor(params: XyoUniswapCryptoMarketWitnessParams) {
25
+ super(params)
26
+ this.provider = params?.provider
27
+ }
28
+
29
+ static override async create(params?: XyoUniswapCryptoMarketWitnessParams): Promise<XyoUniswapCryptoMarketWitness> {
30
+ return (await super.create(params)) as XyoUniswapCryptoMarketWitness
31
+ }
32
+
33
+ override async observe(): Promise<XyoPayload[]> {
34
+ this.started('throw')
35
+ const pairs = await pricesFromUniswap3(assertEx(this.pairs))
36
+ const timestamp = Date.now()
37
+
38
+ const payload: XyoUniswapCryptoMarketPayload = {
39
+ pairs,
40
+ schema: XyoUniswapCryptoMarketSchema,
41
+ timestamp,
42
+ }
43
+
44
+ return super.observe([payload])
45
+ }
46
+
47
+ override async start() {
48
+ this.pairs = createUniswapPoolContracts(assertEx(this.provider, 'Provider Required'), this.config?.pools ?? UniswapPoolContracts)
49
+ return await super.start()
50
+ }
51
+ }
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ import { XyoUniswapCryptoMarketPlugin } from './Plugin'
2
+
3
+ export * from './Config'
4
+ export * from './lib'
5
+ export * from './Witness'
6
+
7
+ export { XyoUniswapCryptoMarketPlugin }
8
+
9
+ // eslint-disable-next-line import/no-default-export
10
+ export default XyoUniswapCryptoMarketPlugin
@@ -0,0 +1,109 @@
1
+ import { Provider } from '@ethersproject/providers'
2
+ import { ChainId } from '@uniswap/sdk'
3
+ import { Token } from '@uniswap/sdk-core'
4
+ import { Pool } from '@uniswap/v3-sdk'
5
+ import { assertEx } from '@xylabs/assert'
6
+ import { delay } from '@xylabs/delay'
7
+ import { IERC20Metadata, IERC20Metadata__factory } from '@xyo-network/typechain'
8
+ import { IUniswapV3Pool, IUniswapV3Pool__factory } from '@xyo-network/uniswap-typechain'
9
+
10
+ import { logErrors, logErrorsAsync } from '../logErrors'
11
+ import { EthersUniswap3PoolSlot0Wrapper } from './Uniswap3PoolSlot0Wrapper'
12
+
13
+ //null is used as 'in-progress'
14
+ const waitNotNull = async (closure: () => unknown) => {
15
+ while (closure() === null) {
16
+ await delay(10)
17
+ }
18
+ }
19
+
20
+ export class EthersUniSwap3Pair {
21
+ protected address: string
22
+ protected provider: Provider
23
+
24
+ private _pool?: Pool | null
25
+ private _poolContract?: IUniswapV3Pool
26
+ private _slot0?: EthersUniswap3PoolSlot0Wrapper | null
27
+ private _tokenContracts: (IERC20Metadata | null | undefined)[] = [undefined, undefined]
28
+ private _tokens: (Token | null | undefined)[] = [undefined, undefined]
29
+
30
+ constructor(address: string, provider: Provider) {
31
+ this.address = address
32
+ this.provider = provider
33
+ }
34
+
35
+ public async pool(): Promise<Pool> {
36
+ return await logErrorsAsync(async () => {
37
+ await waitNotNull(() => this._pool)
38
+ this._pool = this._pool || null
39
+ const slot0 = await this.slot0()
40
+ this._pool =
41
+ this._pool ??
42
+ new Pool(
43
+ await this.token(0),
44
+ await this.token(1),
45
+ slot0.feeProtocol,
46
+ slot0.sqrtPriceX96.toHexString(),
47
+ (await this.poolContract().liquidity()).toHexString(),
48
+ slot0.tick,
49
+ )
50
+ return assertEx(this._pool)
51
+ })
52
+ }
53
+
54
+ public poolContract(): IUniswapV3Pool {
55
+ return logErrors(() => {
56
+ this._poolContract = this._poolContract ?? IUniswapV3Pool__factory.connect(this.address, this.provider)
57
+ return assertEx(this._poolContract)
58
+ })
59
+ }
60
+
61
+ public async price() {
62
+ return await logErrorsAsync(async () => {
63
+ const tokenIndexes: (0 | 1)[] = [0, 1]
64
+ const pool = await this.pool()
65
+ const tokens = await Promise.all(tokenIndexes.map((value) => this.token(value)))
66
+ const tokenContracts = await Promise.all(tokenIndexes.map((value) => this.tokenContract(value)))
67
+ const tokenPrices = tokens.map((token) => parseFloat(pool.priceOf(token).toSignificant()))
68
+ const tokenSymbols = tokens.map((token, index) => assertEx(token.symbol, `Token[${index}] Missing Symbols`).toLowerCase())
69
+ const result = {
70
+ tokens: tokenIndexes.map((value) => {
71
+ return { address: tokenContracts[value].address, symbol: tokenSymbols[value], value: tokenPrices[value] }
72
+ }),
73
+ }
74
+ return result
75
+ })
76
+ }
77
+
78
+ public async slot0(): Promise<EthersUniswap3PoolSlot0Wrapper> {
79
+ return await logErrorsAsync(async () => {
80
+ await waitNotNull(() => this._slot0)
81
+ this._slot0 = this._slot0 || null
82
+ this._slot0 = this._slot0 ?? new EthersUniswap3PoolSlot0Wrapper(await this.poolContract().slot0())
83
+ return assertEx(this._slot0)
84
+ })
85
+ }
86
+
87
+ public async token(index: 0 | 1): Promise<Token> {
88
+ return await logErrorsAsync(async () => {
89
+ await waitNotNull(() => this._tokens[index])
90
+ this._tokens[index] = this._tokens[index] || null
91
+ const tokenContract = await this.tokenContract(index)
92
+ this._tokens[index] =
93
+ this._tokens[index] ??
94
+ new Token(ChainId.MAINNET, tokenContract.address, await tokenContract.decimals(), await tokenContract.symbol(), await tokenContract.name())
95
+ return assertEx(this._tokens[index])
96
+ })
97
+ }
98
+
99
+ public async tokenContract(index: 0 | 1): Promise<IERC20Metadata> {
100
+ return await logErrorsAsync(async () => {
101
+ await waitNotNull(() => this._tokenContracts[index])
102
+ this._tokenContracts[index] = this._tokenContracts[index] || null
103
+ this._tokenContracts[index] =
104
+ this._tokenContracts[index] ??
105
+ IERC20Metadata__factory.connect(await (index === 0 ? this.poolContract().token0() : this.poolContract().token1()), this.provider)
106
+ return assertEx(this._tokenContracts[index])
107
+ })
108
+ }
109
+ }
@@ -0,0 +1,36 @@
1
+ import { EthersUniswapV3Slot0Fields } from './UniswapV3Slot0Fields'
2
+
3
+ export class EthersUniswap3PoolSlot0Wrapper {
4
+ protected values: EthersUniswapV3Slot0Fields
5
+ constructor(values: EthersUniswapV3Slot0Fields) {
6
+ this.values = values
7
+ }
8
+
9
+ get feeProtocol() {
10
+ return this.values[5]
11
+ }
12
+
13
+ get observationCardinality() {
14
+ return this.values[3]
15
+ }
16
+
17
+ get observationCardinalityNext() {
18
+ return this.values[4]
19
+ }
20
+
21
+ get observationIndex() {
22
+ return this.values[2]
23
+ }
24
+
25
+ get sqrtPriceX96() {
26
+ return this.values[0]
27
+ }
28
+
29
+ get tick() {
30
+ return this.values[1]
31
+ }
32
+
33
+ get unlocked() {
34
+ return this.values[6]
35
+ }
36
+ }
@@ -0,0 +1,3 @@
1
+ import { BigNumber } from '@ethersproject/bignumber'
2
+
3
+ export type EthersUniswapV3Slot0Fields = [BigNumber, number, number, number, number, number, boolean]
@@ -0,0 +1,10 @@
1
+ import { Provider } from '@ethersproject/providers'
2
+
3
+ import { logErrors } from '../logErrors'
4
+ import { EthersUniSwap3Pair } from './UniSwap3Pair'
5
+
6
+ export const createUniswapPoolContracts = (provider: Provider, contracts: string[]) => {
7
+ return logErrors(() => {
8
+ return contracts.map((contract) => new EthersUniSwap3Pair(contract, provider))
9
+ })
10
+ }
@@ -0,0 +1,4 @@
1
+ export * from './createUniswapPoolContracts'
2
+ export * from './UniSwap3Pair'
3
+ export * from './Uniswap3PoolSlot0Wrapper'
4
+ export * from './UniswapV3Slot0Fields'
@@ -0,0 +1,15 @@
1
+ export const UniswapPoolContracts = [
2
+ /*xyo/weth*/ '0xE331DE28cd81B768C19A366b0e4e4675c45eC2dA',
3
+ /*xyo/usdt*/ '0xd0AF1981f52146a6939385451dAeA0726e13a484',
4
+ /*xyo/dai*/ '0x9D7e5647CE3c7C2d835F2F5e82C8fDb36B0BB0fe',
5
+ /*wbtc/xyo*/ '0x0cF7494c9dE661467403aBeE8454b3BBf0179a84',
6
+ /*link/xyo*/ '0x4693456599a8a4975862A0E720C5de7E1D09A1e4',
7
+ /*wbtc/weth*/ '0xCBCdF9626bC03E24f779434178A73a0B4bad62eD',
8
+ /*dai/usdc*/ '0x5777d92f208679DB4b9778590Fa3CAB3aC9e2168',
9
+ /*usdc/weth*/ '0x8ad599c3A0ff1De082011EFDDc58f1908eb6e6D8',
10
+ /*usdc/weth*/ '0x88e6A0c2dDD26FEEb64F039a2c41296FcB3f5640',
11
+ /*dai/usdc*/ '0x6c6Bc977E13Df9b0de53b251522280BB72383700',
12
+ /*frax/usdc*/ '0xc63B0708E2F7e69CB8A1df0e1389A98C35A76D52',
13
+ /*wbtc/usdc*/ '0x99ac8cA7087fA4A2A1FB6357269965A2014ABc35',
14
+ /*usdc/usdt*/ '0x3416cF6C708Da44DB2624D63ea0AAef7113527C6',
15
+ ]
@@ -0,0 +1,4 @@
1
+ import { BigNumber } from '@xylabs/bignumber'
2
+
3
+ //we do not export any EthersBigNumber fields
4
+ export type UniswapV3Slot0Fields = [BigNumber, number, number, number, number, number, boolean]
@@ -0,0 +1,3 @@
1
+ export * from './Ethers'
2
+ export * from './pricesFromUniswap3'
3
+ export * from './UniswapPoolContracts'
@@ -0,0 +1,17 @@
1
+ export const logErrors = <T>(func: () => T) => {
2
+ try {
3
+ return func()
4
+ } catch (ex) {
5
+ console.error(ex)
6
+ throw ex
7
+ }
8
+ }
9
+
10
+ export const logErrorsAsync = async <T>(func: () => Promise<T>) => {
11
+ try {
12
+ return await func()
13
+ } catch (ex) {
14
+ console.error(ex)
15
+ throw ex
16
+ }
17
+ }
@@ -0,0 +1,13 @@
1
+ import { InfuraProvider } from '@ethersproject/providers'
2
+
3
+ import { createUniswapPoolContracts } from './Ethers'
4
+ import { pricesFromUniswap3 } from './pricesFromUniswap3'
5
+ import { UniswapPoolContracts } from './UniswapPoolContracts'
6
+
7
+ describe('pricesFromUniswap3', () => {
8
+ test('observe', async () => {
9
+ const provider = new InfuraProvider('homestead', { projectId: process.env.INFURA_PROJECT_ID, projectSecret: process.env.INFURA_PROJECT_SECRET })
10
+ const pairs = await pricesFromUniswap3(createUniswapPoolContracts(provider, UniswapPoolContracts))
11
+ expect(pairs.length).toBeGreaterThan(1)
12
+ })
13
+ })
@@ -0,0 +1,19 @@
1
+ import { XyoUniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin'
2
+
3
+ import { EthersUniSwap3Pair } from './Ethers'
4
+ import { logErrorsAsync } from './logErrors'
5
+
6
+ export const pricesFromUniswap3 = async (pools: EthersUniSwap3Pair[]): Promise<XyoUniswapCryptoPair[]> => {
7
+ return await logErrorsAsync(async () => {
8
+ const promiseResults = await Promise.allSettled(
9
+ pools.map(async (pool): Promise<XyoUniswapCryptoPair> => {
10
+ const result = await pool.price()
11
+ return result
12
+ }),
13
+ )
14
+
15
+ return (promiseResults.filter((result) => result.status === 'fulfilled') as PromiseFulfilledResult<XyoUniswapCryptoPair>[]).map(
16
+ (result) => result.value,
17
+ )
18
+ })
19
+ }