@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.
- package/LICENSE +165 -0
- package/README.md +81 -0
- package/dist/cjs/Config.d.ts +7 -0
- package/dist/cjs/Config.d.ts.map +1 -0
- package/dist/cjs/Config.js +3 -0
- package/dist/cjs/Config.js.map +1 -0
- package/dist/cjs/Plugin.d.ts +4 -0
- package/dist/cjs/Plugin.d.ts.map +1 -0
- package/dist/cjs/Plugin.js +16 -0
- package/dist/cjs/Plugin.js.map +1 -0
- package/dist/cjs/Witness.d.ts +19 -0
- package/dist/cjs/Witness.d.ts.map +1 -0
- package/dist/cjs/Witness.js +51 -0
- package/dist/cjs/Witness.js.map +1 -0
- package/dist/cjs/index.d.ts +7 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +12 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/lib/Ethers/UniSwap3Pair.d.ts +29 -0
- package/dist/cjs/lib/Ethers/UniSwap3Pair.d.ts.map +1 -0
- package/dist/cjs/lib/Ethers/UniSwap3Pair.js +103 -0
- package/dist/cjs/lib/Ethers/UniSwap3Pair.js.map +1 -0
- package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts +13 -0
- package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts.map +1 -0
- package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.js +31 -0
- package/dist/cjs/lib/Ethers/Uniswap3PoolSlot0Wrapper.js.map +1 -0
- package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.d.ts +3 -0
- package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.d.ts.map +1 -0
- package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.js +3 -0
- package/dist/cjs/lib/Ethers/UniswapV3Slot0Fields.js.map +1 -0
- package/dist/cjs/lib/Ethers/createUniswapPoolContracts.d.ts +4 -0
- package/dist/cjs/lib/Ethers/createUniswapPoolContracts.d.ts.map +1 -0
- package/dist/cjs/lib/Ethers/createUniswapPoolContracts.js +12 -0
- package/dist/cjs/lib/Ethers/createUniswapPoolContracts.js.map +1 -0
- package/dist/cjs/lib/Ethers/index.d.ts +5 -0
- package/dist/cjs/lib/Ethers/index.d.ts.map +1 -0
- package/dist/cjs/lib/Ethers/index.js +8 -0
- package/dist/cjs/lib/Ethers/index.js.map +1 -0
- package/dist/cjs/lib/UniswapPoolContracts.d.ts +2 -0
- package/dist/cjs/lib/UniswapPoolContracts.d.ts.map +1 -0
- package/dist/cjs/lib/UniswapPoolContracts.js +19 -0
- package/dist/cjs/lib/UniswapPoolContracts.js.map +1 -0
- package/dist/cjs/lib/UniswapV3Slot0Fields.d.ts +3 -0
- package/dist/cjs/lib/UniswapV3Slot0Fields.d.ts.map +1 -0
- package/dist/cjs/lib/UniswapV3Slot0Fields.js +3 -0
- package/dist/cjs/lib/UniswapV3Slot0Fields.js.map +1 -0
- package/dist/cjs/lib/index.d.ts +4 -0
- package/dist/cjs/lib/index.d.ts.map +1 -0
- package/dist/cjs/lib/index.js +7 -0
- package/dist/cjs/lib/index.js.map +1 -0
- package/dist/cjs/lib/logErrors.d.ts +3 -0
- package/dist/cjs/lib/logErrors.d.ts.map +1 -0
- package/dist/cjs/lib/logErrors.js +25 -0
- package/dist/cjs/lib/logErrors.js.map +1 -0
- package/dist/cjs/lib/pricesFromUniswap3.d.ts +4 -0
- package/dist/cjs/lib/pricesFromUniswap3.d.ts.map +1 -0
- package/dist/cjs/lib/pricesFromUniswap3.js +16 -0
- package/dist/cjs/lib/pricesFromUniswap3.js.map +1 -0
- package/dist/docs.json +5480 -0
- package/dist/esm/Config.d.ts +7 -0
- package/dist/esm/Config.d.ts.map +1 -0
- package/dist/esm/Config.js +2 -0
- package/dist/esm/Config.js.map +1 -0
- package/dist/esm/Plugin.d.ts +4 -0
- package/dist/esm/Plugin.d.ts.map +1 -0
- package/dist/esm/Plugin.js +11 -0
- package/dist/esm/Plugin.js.map +1 -0
- package/dist/esm/Witness.d.ts +19 -0
- package/dist/esm/Witness.d.ts.map +1 -0
- package/dist/esm/Witness.js +32 -0
- package/dist/esm/Witness.js.map +1 -0
- package/dist/esm/index.d.ts +7 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +8 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/lib/Ethers/UniSwap3Pair.d.ts +29 -0
- package/dist/esm/lib/Ethers/UniSwap3Pair.d.ts.map +1 -0
- package/dist/esm/lib/Ethers/UniSwap3Pair.js +91 -0
- package/dist/esm/lib/Ethers/UniSwap3Pair.js.map +1 -0
- package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts +13 -0
- package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.d.ts.map +1 -0
- package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.js +28 -0
- package/dist/esm/lib/Ethers/Uniswap3PoolSlot0Wrapper.js.map +1 -0
- package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.d.ts +3 -0
- package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.d.ts.map +1 -0
- package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.js +2 -0
- package/dist/esm/lib/Ethers/UniswapV3Slot0Fields.js.map +1 -0
- package/dist/esm/lib/Ethers/createUniswapPoolContracts.d.ts +4 -0
- package/dist/esm/lib/Ethers/createUniswapPoolContracts.d.ts.map +1 -0
- package/dist/esm/lib/Ethers/createUniswapPoolContracts.js +8 -0
- package/dist/esm/lib/Ethers/createUniswapPoolContracts.js.map +1 -0
- package/dist/esm/lib/Ethers/index.d.ts +5 -0
- package/dist/esm/lib/Ethers/index.d.ts.map +1 -0
- package/dist/esm/lib/Ethers/index.js +5 -0
- package/dist/esm/lib/Ethers/index.js.map +1 -0
- package/dist/esm/lib/UniswapPoolContracts.d.ts +2 -0
- package/dist/esm/lib/UniswapPoolContracts.d.ts.map +1 -0
- package/dist/esm/lib/UniswapPoolContracts.js +16 -0
- package/dist/esm/lib/UniswapPoolContracts.js.map +1 -0
- package/dist/esm/lib/UniswapV3Slot0Fields.d.ts +3 -0
- package/dist/esm/lib/UniswapV3Slot0Fields.d.ts.map +1 -0
- package/dist/esm/lib/UniswapV3Slot0Fields.js +2 -0
- package/dist/esm/lib/UniswapV3Slot0Fields.js.map +1 -0
- package/dist/esm/lib/index.d.ts +4 -0
- package/dist/esm/lib/index.d.ts.map +1 -0
- package/dist/esm/lib/index.js +4 -0
- package/dist/esm/lib/index.js.map +1 -0
- package/dist/esm/lib/logErrors.d.ts +3 -0
- package/dist/esm/lib/logErrors.d.ts.map +1 -0
- package/dist/esm/lib/logErrors.js +19 -0
- package/dist/esm/lib/logErrors.js.map +1 -0
- package/dist/esm/lib/pricesFromUniswap3.d.ts +4 -0
- package/dist/esm/lib/pricesFromUniswap3.d.ts.map +1 -0
- package/dist/esm/lib/pricesFromUniswap3.js +11 -0
- package/dist/esm/lib/pricesFromUniswap3.js.map +1 -0
- package/package.json +77 -0
- package/src/Config.ts +7 -0
- package/src/Plugin.spec.ts +11 -0
- package/src/Plugin.ts +16 -0
- package/src/Witness.spec.ts +56 -0
- package/src/Witness.ts +51 -0
- package/src/index.ts +10 -0
- package/src/lib/Ethers/UniSwap3Pair.ts +109 -0
- package/src/lib/Ethers/Uniswap3PoolSlot0Wrapper.ts +36 -0
- package/src/lib/Ethers/UniswapV3Slot0Fields.ts +3 -0
- package/src/lib/Ethers/createUniswapPoolContracts.ts +10 -0
- package/src/lib/Ethers/index.ts +4 -0
- package/src/lib/UniswapPoolContracts.ts +15 -0
- package/src/lib/UniswapV3Slot0Fields.ts +4 -0
- package/src/lib/index.ts +3 -0
- package/src/lib/logErrors.ts +17 -0
- package/src/lib/pricesFromUniswap3.spec.ts +13 -0
- 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,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,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
|
+
]
|
package/src/lib/index.ts
ADDED
|
@@ -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
|
+
}
|