From 770fd0821344a754520f57339d4e20a4e6b4e4af Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 07:36:17 -0500 Subject: [PATCH 01/20] Add known tokens/pools --- .../src/lib/v4/UniswapV4TokenContracts.ts | 50 +++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts new file mode 100644 index 000000000..5fb31e222 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts @@ -0,0 +1,50 @@ +import { Token } from "@uniswap/sdk-core"; +import { ZeroAddress } from "ethers"; + +type ChainId = 1; + +type TokenRegistryEntry = { + address: string, + chainId: ChainId, + decimals: number, + symbol: string, + name?: string, +} + +export const TokenRegistry: Record = { + USDT: { + address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + chainId: 1, + decimals: 6, + symbol: 'USDT', + }, + XYO: { + address: '0x55296f69f40ea6d20e478533c15a6b08b654e758', + chainId: 1, + decimals: 18, + symbol: 'XYO', + }, +} as const; + +type TokenRegistryKey = keyof typeof TokenRegistry; +type TokenRegistryValue = typeof TokenRegistry[TokenRegistryKey]; + +export const tokenRegistryValueToToken = (value: TokenRegistryValue): Token => { + const { address, chainId, decimals, symbol, name } = value; + return new Token(chainId, address, decimals, symbol, name); +} + +export type PoolIdType = { + fee: number, + hookAddress: string, + tickSpacing: number, + tokens: [TokenRegistryValue, TokenRegistryValue], +} +export const UniswapV4PoolIds: Record = { + '0x3e5277df3d16847ee14eb9ffcde298c3d7b807d78626f88b03dfdd4b7c1aa734': { + fee: 0, + hookAddress: ZeroAddress, + tickSpacing: 60, + tokens: [TokenRegistry.XYO, TokenRegistry.USDT], + } +} as const \ No newline at end of file From 23c027b9c72091bec365223f471d8a04de14e8a0 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 07:44:03 -0500 Subject: [PATCH 02/20] Make method singular --- .../packages/market/packages/uniswap/src/lib/v4/index.ts | 2 +- .../lib/v4/{pricesFromUniswap4.ts => priceFromUniswap4.ts} | 2 +- .../{pricesFromUniswap4.spec.ts => priceFromUniswap4.spec.ts} | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/{pricesFromUniswap4.ts => priceFromUniswap4.ts} (85%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/{pricesFromUniswap4.spec.ts => priceFromUniswap4.spec.ts} (84%) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts index ae00149b2..1b232a516 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts @@ -1 +1 @@ -export * from './pricesFromUniswap4.ts' \ No newline at end of file +export * from './priceFromUniswap4.ts' \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswap4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts similarity index 85% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswap4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts index 68203efa7..575fa228a 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswap4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts @@ -3,7 +3,7 @@ import { getExchangeRate } from './getExchangeRate.ts' import { UniswapV4TokenContractIdentifier } from './UniswapV4TokenContractIdentifier.ts' import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' -export const pricesFromUniswap4 = async (contract: UniswapV4TokenContractIdentifier, provider: Provider): Promise => { +export const priceFromUniswap4 = async (contract: UniswapV4TokenContractIdentifier, provider: Provider): Promise => { const { tokenA, tokenB, fee, hookAddress = ZeroAddress } = contract const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/pricesFromUniswap4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts similarity index 84% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/pricesFromUniswap4.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts index b8de0cade..0fad8a2bc 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/pricesFromUniswap4.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts @@ -4,7 +4,7 @@ import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' import { describe, expect, test, } from 'vitest' -import { pricesFromUniswap4 } from '../pricesFromUniswap4.ts' +import { priceFromUniswap4 } from '../priceFromUniswap4.ts' import { Token } from '@uniswap/sdk-core' describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('pricesFromUniswap4', () => { @@ -13,7 +13,7 @@ describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SE const tokenA = new Token(1, "0x55296f69f40ea6d20e478533c15a6b08b654e758", 18, 'xyo') const tokenB = new Token(1, "0xdac17f958d2ee523a2206206994597c13d831ec7", 6, 'usdt') const tokenContractIdentifier = { tokenA, tokenB, fee: 3000 } - const pairs = await pricesFromUniswap4(tokenContractIdentifier, provider) + const pairs = await priceFromUniswap4(tokenContractIdentifier, provider) expect(pairs).toBeDefined() // console.dir(pairs, { depth: null }) }) From 5b65678e9aaebcafba4c7ce66c9fe355e37aafbb Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:06:17 -0500 Subject: [PATCH 03/20] Use contracts & helpers --- .../v4/UniswapV4TokenContractIdentifier.ts | 8 ------ .../src/lib/v4/UniswapV4TokenContracts.ts | 25 ++++++++++--------- .../uniswap/src/lib/v4/getExchangeRate.ts | 1 + .../uniswap/src/lib/v4/priceFromUniswap4.ts | 9 ++++--- .../src/lib/v4/spec/priceFromUniswap4.spec.ts | 14 +++++------ 5 files changed, 25 insertions(+), 32 deletions(-) delete mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContractIdentifier.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContractIdentifier.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContractIdentifier.ts deleted file mode 100644 index 72b14baf3..000000000 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContractIdentifier.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Token } from "@uniswap/sdk-core"; - -export interface UniswapV4TokenContractIdentifier { - tokenA: Token, - tokenB: Token, - fee: number, - hookAddress?: string, -} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts index 5fb31e222..8b34d993a 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts @@ -1,7 +1,7 @@ -import { Token } from "@uniswap/sdk-core"; -import { ZeroAddress } from "ethers"; +import { Token } from "@uniswap/sdk-core" +import { getAddress, ZeroAddress } from "ethers" -type ChainId = 1; +type ChainId = 1 type TokenRegistryEntry = { address: string, @@ -13,7 +13,7 @@ type TokenRegistryEntry = { export const TokenRegistry: Record = { USDT: { - address: '0xdAC17F958D2ee523a2206206994597C13D831ec7', + address: '0xdac17f958d2ee523a2206206994597c13d831ec7', chainId: 1, decimals: 6, symbol: 'USDT', @@ -24,14 +24,15 @@ export const TokenRegistry: Record = { decimals: 18, symbol: 'XYO', }, -} as const; +} as const -type TokenRegistryKey = keyof typeof TokenRegistry; -type TokenRegistryValue = typeof TokenRegistry[TokenRegistryKey]; +type TokenRegistryKey = keyof typeof TokenRegistry +type TokenRegistryValue = typeof TokenRegistry[TokenRegistryKey] export const tokenRegistryValueToToken = (value: TokenRegistryValue): Token => { - const { address, chainId, decimals, symbol, name } = value; - return new Token(chainId, address, decimals, symbol, name); + const { address, chainId, decimals, symbol, name } = value + const normalizedAddress = getAddress(address.toLowerCase()) + return new Token(chainId, normalizedAddress, decimals, symbol, name) } export type PoolIdType = { @@ -40,9 +41,9 @@ export type PoolIdType = { tickSpacing: number, tokens: [TokenRegistryValue, TokenRegistryValue], } -export const UniswapV4PoolIds: Record = { - '0x3e5277df3d16847ee14eb9ffcde298c3d7b807d78626f88b03dfdd4b7c1aa734': { - fee: 0, +export const UniswapV4Pools: Record = { + 'XYO:USDT': { + fee: 3000, hookAddress: ZeroAddress, tickSpacing: 60, tokens: [TokenRegistry.XYO, TokenRegistry.USDT], diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts index 8c3a77632..60fa47c53 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts @@ -28,6 +28,7 @@ export const getExchangeRate = async ( ? [tokenA, tokenB] : [tokenB, tokenA] const poolId: string = getPoolId(token0, token1, fee, 60, hooks) + console.log("poolId", poolId) if (poolId === ZeroAddress) throw new Error("Invalid poolId") const response = await stateView.getSlot0(poolId) const price = getPriceFromSqrtX96(response.sqrtPriceX96, token1.decimals, token0.decimals) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts index 575fa228a..7ac926903 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts @@ -1,12 +1,13 @@ import { Provider, ZeroAddress } from 'ethers' import { getExchangeRate } from './getExchangeRate.ts' -import { UniswapV4TokenContractIdentifier } from './UniswapV4TokenContractIdentifier.ts' import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { PoolIdType, tokenRegistryValueToToken } from './UniswapV4TokenContracts.ts' -export const priceFromUniswap4 = async (contract: UniswapV4TokenContractIdentifier, provider: Provider): Promise => { - const { tokenA, tokenB, fee, hookAddress = ZeroAddress } = contract +export const priceFromUniswap4 = async (poolId: PoolIdType, provider: Provider): Promise => { + const { tokens, fee, hookAddress = ZeroAddress } = poolId + const tokenA = tokenRegistryValueToToken(tokens[0]) + const tokenB = tokenRegistryValueToToken(tokens[1]) const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider) - const token0: UniswapCryptoToken = { address: tokenA.address, symbol: tokenA.symbol || '', diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts index 0fad8a2bc..dfa7b9632 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts @@ -5,16 +5,14 @@ import { describe, expect, test, } from 'vitest' import { priceFromUniswap4 } from '../priceFromUniswap4.ts' -import { Token } from '@uniswap/sdk-core' +import { UniswapV4Pools } from '../UniswapV4TokenContracts.ts' -describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('pricesFromUniswap4', () => { - test('pricesFromUniswap4', async () => { +describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('priceFromUniswap4', () => { + test('priceFromUniswap4', async () => { const provider = getProviderFromEnv() - const tokenA = new Token(1, "0x55296f69f40ea6d20e478533c15a6b08b654e758", 18, 'xyo') - const tokenB = new Token(1, "0xdac17f958d2ee523a2206206994597c13d831ec7", 6, 'usdt') - const tokenContractIdentifier = { tokenA, tokenB, fee: 3000 } - const pairs = await priceFromUniswap4(tokenContractIdentifier, provider) + const poolId = UniswapV4Pools['XYO:USDT'] + const pairs = await priceFromUniswap4(poolId, provider) expect(pairs).toBeDefined() - // console.dir(pairs, { depth: null }) + console.dir(pairs, { depth: null }) }) }) From 9b2d1f6287442a42d122abf29275d8657d0c7d2b Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:06:30 -0500 Subject: [PATCH 04/20] Update spelling dict --- cspell.json | 1 + 1 file changed, 1 insertion(+) diff --git a/cspell.json b/cspell.json index 5a77b09c2..35c5bc405 100644 --- a/cspell.json +++ b/cspell.json @@ -30,6 +30,7 @@ "dotenv", "emittery", "etherchain", + "ethersproject", "ethgasstation", "Evaluable", "geomines", From c8f852242d64479caf98c0937c3476bf3dec0bc1 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:07:29 -0500 Subject: [PATCH 05/20] Rename to V4 --- .../packages/uniswap/src/lib/v4/index.ts | 2 +- .../uniswap/src/lib/v4/priceFromUniswapV4.ts | 25 +++++++++++++++++++ ...FromUniswap4.ts => pricesFromUniswapV4.ts} | 0 ...ap4.spec.ts => priceFromUniswapV4.spec.ts} | 8 +++--- 4 files changed, 30 insertions(+), 5 deletions(-) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/{priceFromUniswap4.ts => pricesFromUniswapV4.ts} (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/{priceFromUniswap4.spec.ts => priceFromUniswapV4.spec.ts} (67%) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts index 1b232a516..15244c755 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts @@ -1 +1 @@ -export * from './priceFromUniswap4.ts' \ No newline at end of file +export * from './priceFromUniswapV4.ts' \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts new file mode 100644 index 000000000..7fb8ca64e --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts @@ -0,0 +1,25 @@ +import { Provider, ZeroAddress } from 'ethers' +import { getExchangeRate } from './getExchangeRate.ts' +import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { PoolIdType, tokenRegistryValueToToken } from './UniswapV4TokenContracts.ts' + +export const priceFromUniswapV4 = async (poolId: PoolIdType, provider: Provider): Promise => { + const { tokens, fee, hookAddress = ZeroAddress } = poolId + const tokenA = tokenRegistryValueToToken(tokens[0]) + const tokenB = tokenRegistryValueToToken(tokens[1]) + const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider) + const token0: UniswapCryptoToken = { + address: tokenA.address, + symbol: tokenA.symbol || '', + value: rate > 0 ? rate : 0, + } + const token1: UniswapCryptoToken = { + address: tokenB.address, + symbol: tokenB.symbol || '', + value: rate > 0 ? Number((1 / rate).toPrecision(6)) : 0, + } + const pair: UniswapCryptoPair = { + tokens: [ token0, token1 ] + } + return pair +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswap4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswapV4.spec.ts similarity index 67% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswapV4.spec.ts index dfa7b9632..303178a96 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswap4.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswapV4.spec.ts @@ -4,14 +4,14 @@ import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' import { describe, expect, test, } from 'vitest' -import { priceFromUniswap4 } from '../priceFromUniswap4.ts' +import { priceFromUniswapV4 } from '../priceFromUniswapV4.ts' import { UniswapV4Pools } from '../UniswapV4TokenContracts.ts' -describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('priceFromUniswap4', () => { - test('priceFromUniswap4', async () => { +describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('priceFromUniswapV4', () => { + test('priceFromUniswapV4', async () => { const provider = getProviderFromEnv() const poolId = UniswapV4Pools['XYO:USDT'] - const pairs = await priceFromUniswap4(poolId, provider) + const pairs = await priceFromUniswapV4(poolId, provider) expect(pairs).toBeDefined() console.dir(pairs, { depth: null }) }) From d5f9329ecfb1403b30b392cc3bdf2662e9bd6dcc Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:09:25 -0500 Subject: [PATCH 06/20] Single/array price helpers --- .../packages/uniswap/src/lib/v4/index.ts | 3 +- .../uniswap/src/lib/v4/pricesFromUniswapV4.ts | 29 ++++--------------- 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts index 15244c755..a2aa5a076 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts @@ -1 +1,2 @@ -export * from './priceFromUniswapV4.ts' \ No newline at end of file +export * from './priceFromUniswapV4.ts' +export * from './pricesFromUniswapV4.ts' \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts index 7ac926903..a15d82bf2 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts @@ -1,25 +1,8 @@ -import { Provider, ZeroAddress } from 'ethers' -import { getExchangeRate } from './getExchangeRate.ts' -import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' -import { PoolIdType, tokenRegistryValueToToken } from './UniswapV4TokenContracts.ts' +import { Provider } from 'ethers' +import { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { PoolIdType } from './UniswapV4TokenContracts.ts' +import { priceFromUniswapV4 } from './priceFromUniswapV4.ts' -export const priceFromUniswap4 = async (poolId: PoolIdType, provider: Provider): Promise => { - const { tokens, fee, hookAddress = ZeroAddress } = poolId - const tokenA = tokenRegistryValueToToken(tokens[0]) - const tokenB = tokenRegistryValueToToken(tokens[1]) - const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider) - const token0: UniswapCryptoToken = { - address: tokenA.address, - symbol: tokenA.symbol || '', - value: rate > 0 ? rate : 0, - } - const token1: UniswapCryptoToken = { - address: tokenB.address, - symbol: tokenB.symbol || '', - value: rate > 0 ? Number((1 / rate).toPrecision(6)) : 0, - } - const pair: UniswapCryptoPair = { - tokens: [ token0, token1 ] - } - return pair +export const pricesFromUniswapV4 = async (poolId: PoolIdType[], provider: Provider): Promise => { + return await Promise.all(poolId.map(async (pool) => priceFromUniswapV4(pool, provider))) } From f00193bd230930bb98ff133e357e5babed87fcd6 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:13:34 -0500 Subject: [PATCH 07/20] Lexigraphical token sort helper --- .../packages/uniswap/src/lib/v4/sortTokens.ts | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts new file mode 100644 index 000000000..10ef6ce56 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts @@ -0,0 +1,25 @@ +import { Token } from "@uniswap/sdk-core"; + +/** + * Sorts two tokens in ascending order by address to ensure consistent ordering. + * + * In Uniswap v2, v3, and v4, pool addresses are deterministically derived using + * `CREATE2` with a hash of the pool's initialization parameters. One critical + * part of this hash is the `token0` and `token1` addresses. To ensure uniqueness + * and prevent duplicate pools (e.g., USDC/WETH and WETH/USDC being treated as different), + * Uniswap requires that token pairs be ordered **lexicographically by address**. + * + * This method ensures that tokens are sorted according to that rule. + * + * This is required any time you: + * - Derive a pool address + * - Generate a pool ID + * - Call a function that expects a PoolKey or token pair in sorted order + * + * @param tokenA - The first token to compare + * @param tokenB - The second token to compare + * @returns A tuple `[token0, token1]` sorted by address in ascending order + */ +export const sortTokens = (tokenA: Token, tokenB: Token): [Token, Token] => { + return tokenA.sortsBefore(tokenB) ? [tokenA, tokenB] : [tokenB, tokenA] +} \ No newline at end of file From ebd8248ec2f567445d3e9db6a659f85ffe944de8 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:15:13 -0500 Subject: [PATCH 08/20] Use token sort --- .../packages/uniswap/src/lib/v4/getExchangeRate.ts | 6 ++---- .../market/packages/uniswap/src/lib/v4/getPoolId.ts | 9 +++++---- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts index 60fa47c53..5b69ede78 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts @@ -5,6 +5,7 @@ import { getPoolId } from "./getPoolId.ts" import { getPriceFromSqrtX96 } from "./getPriceFromSqrtX96.ts" import { IStateView__factory } from "@xyo-network/uniswap-typechain/v4-periphery" import { UniswapV4ContractAddresses } from "./UniswapV4ContractAddresses.ts" +import { sortTokens } from "./sortTokens.ts" /** * Returns the price of the token pair in the Uniswap V4 pool. @@ -24,11 +25,8 @@ export const getExchangeRate = async ( ): Promise => { const hooks = hookAddress || ZeroAddress const stateView = IStateView__factory.connect(UniswapV4ContractAddresses.Ethereum.StateView, provider) - const [token0, token1] = tokenA.sortsBefore(tokenB) - ? [tokenA, tokenB] - : [tokenB, tokenA] + const [token0, token1] = sortTokens(tokenA, tokenB) const poolId: string = getPoolId(token0, token1, fee, 60, hooks) - console.log("poolId", poolId) if (poolId === ZeroAddress) throw new Error("Invalid poolId") const response = await stateView.getSlot0(poolId) const price = getPriceFromSqrtX96(response.sqrtPriceX96, token1.decimals, token0.decimals) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts index 48eb7b615..82ed9c817 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts @@ -2,19 +2,20 @@ import { Token } from "@uniswap/sdk-core" import { AbiCoder } from "ethers/abi" import { ZeroAddress } from "ethers/constants" import { keccak256 } from "ethers/crypto" +import { sortTokens } from "./sortTokens.ts" /** * Computes the pool address for a given pair of tokens, fee, tick spacing, and hooks which * is used to identify the pool on the Uniswap V4 protocol. - * @param currencyA - The first token in the pair. - * @param currencyB - The second token in the pair. + * @param tokenA - The first token in the pair. + * @param tokenB - The second token in the pair. * @param fee - The fee tier for the pool. * @param tickSpacing - The tick spacing for the pool. * @param hooks - The hooks associated with the pool. * @returns The computed pool address as a string. */ -export const getPoolId = (currencyA: Token, currencyB: Token, fee: number, tickSpacing: number, hooks: string): string => { - const [currency0, currency1] = currencyA.sortsBefore(currencyB) ? [currencyA, currencyB] : [currencyB, currencyA] +export const getPoolId = (tokenA: Token, tokenB: Token, fee: number, tickSpacing: number, hooks: string): string => { + const [currency0, currency1] = sortTokens(tokenA, tokenB) const currency0Addr = currency0.isNative ? ZeroAddress : currency0.wrapped.address const currency1Addr = currency1.isNative ? ZeroAddress : currency1.wrapped.address return keccak256( From 82536b46edf0964db3c7f655b1a5850a9a0cbbf2 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:18:08 -0500 Subject: [PATCH 09/20] Move to V4 lib --- .../uniswap/src/{lib/v4 => v4/lib}/UniswapV4ContractAddresses.ts | 0 .../uniswap/src/{lib/v4 => v4/lib}/UniswapV4TokenContracts.ts | 0 .../uniswap/src/{lib/v4 => v4/lib}/UniswapV4TokenIdentifier.ts | 0 .../packages/uniswap/src/{lib/v4 => v4/lib}/getExchangeRate.ts | 0 .../market/packages/uniswap/src/{lib/v4 => v4/lib}/getPoolId.ts | 0 .../uniswap/src/{lib/v4 => v4/lib}/getPriceFromSqrtX96.ts | 0 .../market/packages/uniswap/src/{lib/v4 => v4/lib}/index.ts | 0 .../packages/uniswap/src/{lib/v4 => v4/lib}/priceFromUniswapV4.ts | 0 .../uniswap/src/{lib/v4 => v4/lib}/pricesFromUniswapV4.ts | 0 .../market/packages/uniswap/src/{lib/v4 => v4/lib}/sortTokens.ts | 0 .../src/{lib/v4 => v4/lib}/spec/priceFromUniswapV4.spec.ts | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/UniswapV4ContractAddresses.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/UniswapV4TokenContracts.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/UniswapV4TokenIdentifier.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/getExchangeRate.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/getPoolId.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/getPriceFromSqrtX96.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/index.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/priceFromUniswapV4.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/pricesFromUniswapV4.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/sortTokens.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/{lib/v4 => v4/lib}/spec/priceFromUniswapV4.spec.ts (100%) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4ContractAddresses.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4ContractAddresses.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4ContractAddresses.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4ContractAddresses.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenContracts.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenIdentifier.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenIdentifier.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenIdentifier.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenIdentifier.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getExchangeRate.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getExchangeRate.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPoolId.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPoolId.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPriceFromSqrtX96.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPriceFromSqrtX96.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPriceFromSqrtX96.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPriceFromSqrtX96.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/index.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/index.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/priceFromUniswapV4.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/priceFromUniswapV4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/priceFromUniswapV4.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/pricesFromUniswapV4.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswapV4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/pricesFromUniswapV4.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/sortTokens.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/sortTokens.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/sortTokens.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswapV4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/spec/priceFromUniswapV4.spec.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/priceFromUniswapV4.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/spec/priceFromUniswapV4.spec.ts From 0d8b532b3a3750608cc5c258abed60e4dbb441af Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:38:30 -0500 Subject: [PATCH 10/20] Separate projects for v3/v4 Uniswap --- .../market/packages/uniswap/package.json | 19 +- .../packages/uniswap/packages/v3/.depcheckrc | 4 + .../packages/uniswap/packages/v3/.npmignore | 20 +++ .../packages/uniswap/packages/v3/LICENSE | 165 ++++++++++++++++++ .../packages/uniswap/packages/v3/README.md | 13 ++ .../packages/uniswap/packages/v3/package.json | 60 +++++++ .../uniswap/{ => packages/v3}/src/Config.ts | 0 .../uniswap/{ => packages/v3}/src/Plugin.ts | 0 .../uniswap/{ => packages/v3}/src/Witness.ts | 0 .../packages/uniswap/packages/v3/src/index.ts | 4 + .../v3/src/lib}/UniSwap3Pair.ts | 2 +- .../v3/src/lib}/Uniswap3PoolSlot0Wrapper.ts | 0 .../v3/src/lib}/UniswapPoolContracts.ts | 0 .../v3/src/lib}/UniswapV3Slot0Fields.ts | 0 .../v3/src/lib}/createUniswapPoolContracts.ts | 2 +- .../lib/v3 => packages/v3/src/lib}/index.ts | 2 +- .../{ => packages/v3}/src/lib/logErrors.ts | 0 .../v3/src/lib}/pricesFromUniswap3.ts | 2 +- .../src/lib}/spec/pricesFromUniswap3.spec.ts | 0 .../{ => packages/v3}/src/spec/Plugin.spec.ts | 0 .../v3}/src/spec/Witness.spec.ts | 0 .../uniswap/packages/v3/tsconfig.json | 5 + .../uniswap/packages/v3/tsconfig.typedoc.json | 5 + .../packages/uniswap/packages/v3/typedoc.json | 5 + .../packages/uniswap/packages/v3/xy.config.ts | 10 ++ .../packages/uniswap/packages/v4/.depcheckrc | 4 + .../packages/uniswap/packages/v4/.npmignore | 20 +++ .../packages/uniswap/packages/v4/LICENSE | 165 ++++++++++++++++++ .../packages/uniswap/packages/v4/README.md | 13 ++ .../packages/uniswap/packages/v4/package.json | 60 +++++++ .../uniswap/packages/v4/src/Config.ts | 7 + .../uniswap/packages/v4/src/Plugin.ts | 16 ++ .../uniswap/packages/v4/src/Witness.ts | 39 +++++ .../packages/uniswap/packages/v4/src/index.ts | 4 + .../v4/src}/lib/UniswapV4ContractAddresses.ts | 0 .../v4/src}/lib/UniswapV4TokenContracts.ts | 0 .../v4/src}/lib/UniswapV4TokenIdentifier.ts | 0 .../v4/src}/lib/getExchangeRate.ts | 0 .../v4 => packages/v4/src}/lib/getPoolId.ts | 0 .../v4/src}/lib/getPriceFromSqrtX96.ts | 0 .../{src/v4 => packages/v4/src}/lib/index.ts | 0 .../v4/src}/lib/priceFromUniswapV4.ts | 0 .../v4/src}/lib/pricesFromUniswapV4.ts | 0 .../v4 => packages/v4/src}/lib/sortTokens.ts | 0 .../src}/lib/spec/priceFromUniswapV4.spec.ts | 0 .../packages/v4/src/spec/Plugin.spec.ts | 16 ++ .../packages/v4/src/spec/Witness.spec.ts | 59 +++++++ .../uniswap/packages/v4/tsconfig.json | 5 + .../uniswap/packages/v4/tsconfig.typedoc.json | 5 + .../packages/uniswap/packages/v4/typedoc.json | 5 + .../packages/uniswap/packages/v4/xy.config.ts | 10 ++ .../market/packages/uniswap/src/index.ts | 6 +- .../market/packages/uniswap/src/lib/index.ts | 2 - yarn.lock | 55 +++++- 54 files changed, 776 insertions(+), 33 deletions(-) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.depcheckrc create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.npmignore create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/LICENSE create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/README.md create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/package.json rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/Config.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/Plugin.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/Witness.ts (100%) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/index.ts rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/UniSwap3Pair.ts (98%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/Uniswap3PoolSlot0Wrapper.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/UniswapPoolContracts.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/UniswapV3Slot0Fields.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/createUniswapPoolContracts.ts (87%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/index.ts (83%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/lib/logErrors.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/pricesFromUniswap3.ts (92%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/lib/v3 => packages/v3/src/lib}/spec/pricesFromUniswap3.spec.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/spec/Plugin.spec.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{ => packages/v3}/src/spec/Witness.spec.ts (100%) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.typedoc.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/typedoc.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/xy.config.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.depcheckrc create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.npmignore create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/LICENSE create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/README.md create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/package.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Plugin.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/index.ts rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/UniswapV4ContractAddresses.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/UniswapV4TokenContracts.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/UniswapV4TokenIdentifier.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/getExchangeRate.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/getPoolId.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/getPriceFromSqrtX96.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/index.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/priceFromUniswapV4.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/pricesFromUniswapV4.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/sortTokens.ts (100%) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/{src/v4 => packages/v4/src}/lib/spec/priceFromUniswapV4.spec.ts (100%) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.typedoc.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/typedoc.json create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/xy.config.ts delete mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/index.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json index 172aa288b..e7ecf92ec 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json @@ -29,28 +29,13 @@ "module": "dist/neutral/index.mjs", "types": "dist/types/index.d.ts", "dependencies": { - "@uniswap/sdk-core": "^7.7.2", - "@uniswap/v3-sdk": "^3.25.2", - "@xylabs/assert": "^4.8.7", - "@xylabs/delay": "^4.8.7", - "@xylabs/enum": "^4.8.7", - "@xylabs/promise": "^4.8.7", - "@xyo-network/abstract-witness": "^3.13.0", - "@xyo-network/module-model": "^3.13.0", - "@xyo-network/open-zeppelin-typechain": "^3.5.2", - "@xyo-network/payload-model": "^3.13.0", - "@xyo-network/payloadset-plugin": "^3.13.0", - "@xyo-network/uniswap-crypto-market-payload-plugin": "workspace:^", - "@xyo-network/uniswap-typechain": "^3.5.2", - "@xyo-network/witness-model": "^3.13.0", - "ethers": "^6.13.6" + "@xyo-network/uniswap-v3-crypto-market-plugin": "workspace:^", + "@xyo-network/uniswap-v4-crypto-market-plugin": "workspace:^" }, "devDependencies": { "@xylabs/ts-scripts-yarn3": "^6.3.1", "@xylabs/tsconfig": "^6.3.1", "@xylabs/vitest-extended": "^4.8.7", - "@xyo-network/payload-wrapper": "^3.13.0", - "@xyo-network/witness-blockchain-abstract": "^3.13.0", "typescript": "^5.8.3", "vitest": "^3.1.1" }, diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.depcheckrc b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.depcheckrc new file mode 100644 index 000000000..06e527fad --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.depcheckrc @@ -0,0 +1,4 @@ +ignores: + [ + "ethers" + ] diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.npmignore b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.npmignore new file mode 100644 index 000000000..a20bcd35c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/.npmignore @@ -0,0 +1,20 @@ +.* +.env +.eslintcache +.example.env +tsconfig* +rollup.config.ts +yarn.lock +**/*.spec.ts +**/*.snap + +.github +docs +.pnp.* +.vscode +.yarn/* +coverage +cspell.json +node_modules +swagger.json +packages \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/LICENSE b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/LICENSE new file mode 100644 index 000000000..0a041280b --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/README.md b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/README.md new file mode 100644 index 000000000..04d7c668c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/README.md @@ -0,0 +1,13 @@ +[![logo][]](https://xyo.network) + +Part of [sdk-xyo-client-js](https://www.npmjs.com/package/@xyo-network/sdk-xyo-client-js) + +## License + +> See the [LICENSE](LICENSE) file for license details + +## Credits + +[Made with 🔥 and ❄️ by XYO](https://xyo.network) + +[logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/package.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/package.json new file mode 100644 index 000000000..25c96491e --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/package.json @@ -0,0 +1,60 @@ +{ + "name": "@xyo-network/uniswap-v3-crypto-market-plugin", + "version": "3.5.1", + "description": "Typescript/Javascript Plugins for XYO Platform", + "homepage": "https://xyo.network", + "bugs": { + "url": "git+https://github.com/XYOracleNetwork/plugins/issues", + "email": "support@xyo.network" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/XYOracleNetwork/plugins.git" + }, + "license": "LGPL-3.0-only", + "author": { + "name": "XYO Development Team", + "email": "support@xyo.network", + "url": "https://xyo.network" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "default": "./dist/neutral/index.mjs" + }, + "./package.json": "./package.json" + }, + "module": "dist/neutral/index.mjs", + "types": "dist/types/index.d.ts", + "dependencies": { + "@uniswap/sdk-core": "^7.7.2", + "@uniswap/v3-sdk": "^3.25.2", + "@xylabs/assert": "^4.8.7", + "@xylabs/delay": "^4.8.7", + "@xylabs/enum": "^4.8.7", + "@xylabs/promise": "^4.8.7", + "@xyo-network/abstract-witness": "^3.13.0", + "@xyo-network/module-model": "^3.13.0", + "@xyo-network/open-zeppelin-typechain": "^3.5.2", + "@xyo-network/payload-model": "^3.13.0", + "@xyo-network/payloadset-plugin": "^3.13.0", + "@xyo-network/uniswap-crypto-market-payload-plugin": "workspace:^", + "@xyo-network/uniswap-typechain": "^3.5.2", + "@xyo-network/witness-model": "^3.13.0", + "ethers": "^6.13.6" + }, + "devDependencies": { + "@xylabs/ts-scripts-yarn3": "^6.3.1", + "@xylabs/tsconfig": "^6.3.1", + "@xylabs/vitest-extended": "^4.8.7", + "@xyo-network/payload-wrapper": "^3.13.0", + "@xyo-network/witness-blockchain-abstract": "^3.13.0", + "typescript": "^5.8.3", + "vitest": "^3.1.1" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Config.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Config.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Config.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Plugin.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Plugin.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Plugin.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Plugin.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Witness.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/Witness.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/index.ts new file mode 100644 index 000000000..25e04e79e --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/index.ts @@ -0,0 +1,4 @@ +export * from './Config.ts' +export * from './lib/index.ts' +export { UniswapCryptoMarketPlugin as default, UniswapCryptoMarketPlugin } from './Plugin.ts' +export * from './Witness.ts' diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniSwap3Pair.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniSwap3Pair.ts similarity index 98% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniSwap3Pair.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniSwap3Pair.ts index 5c4495e81..b846436f9 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniSwap3Pair.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniSwap3Pair.ts @@ -10,7 +10,7 @@ import type { IUniswapV3Pool } from '@xyo-network/uniswap-typechain' import { IUniswapV3Pool__factory } from '@xyo-network/uniswap-typechain' import type { Provider } from 'ethers' -import { logErrors, logErrorsAsync } from '../logErrors.ts' +import { logErrors, logErrorsAsync } from './logErrors.ts' import { EthersUniswap3PoolSlot0Wrapper } from './Uniswap3PoolSlot0Wrapper.ts' export const ChainId = Enum({ diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/Uniswap3PoolSlot0Wrapper.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/Uniswap3PoolSlot0Wrapper.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/Uniswap3PoolSlot0Wrapper.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/Uniswap3PoolSlot0Wrapper.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapPoolContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniswapPoolContracts.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapPoolContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniswapPoolContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapV3Slot0Fields.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniswapV3Slot0Fields.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapV3Slot0Fields.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/UniswapV3Slot0Fields.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/createUniswapPoolContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/createUniswapPoolContracts.ts similarity index 87% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/createUniswapPoolContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/createUniswapPoolContracts.ts index cd81b4e46..00736503e 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/createUniswapPoolContracts.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/createUniswapPoolContracts.ts @@ -1,6 +1,6 @@ import type { Provider } from 'ethers' -import { logErrors } from '../logErrors.ts' +import { logErrors } from './logErrors.ts' import { EthersUniSwap3Pair } from './UniSwap3Pair.ts' export const createUniswapPoolContracts = (provider: Provider, contracts: string[]) => { diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/index.ts similarity index 83% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/index.ts index 1ebb0a978..88eb57b63 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/index.ts @@ -3,4 +3,4 @@ export * from './pricesFromUniswap3.ts' export * from './UniSwap3Pair.ts' export * from './Uniswap3PoolSlot0Wrapper.ts' export * from './UniswapPoolContracts.ts' -export * from './UniswapV3Slot0Fields.ts' +export * from './UniswapV3Slot0Fields.ts' \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/logErrors.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/logErrors.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/logErrors.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/logErrors.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/pricesFromUniswap3.ts similarity index 92% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/pricesFromUniswap3.ts index f6c02e332..ffe46094a 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/pricesFromUniswap3.ts @@ -2,7 +2,7 @@ import { fulfilled } from '@xylabs/promise' import type { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { EthersUniSwap3Pair } from './index.ts' -import { logErrorsAsync } from '../logErrors.ts' +import { logErrorsAsync } from './logErrors.ts' export const pricesFromUniswap3 = async (pools: EthersUniSwap3Pair[]): Promise => { return await logErrorsAsync(async () => { diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/spec/pricesFromUniswap3.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/spec/pricesFromUniswap3.spec.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/spec/pricesFromUniswap3.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/lib/spec/pricesFromUniswap3.spec.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Plugin.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/spec/Plugin.spec.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Plugin.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/spec/Plugin.spec.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Witness.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/spec/Witness.spec.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Witness.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/src/spec/Witness.spec.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.json new file mode 100644 index 000000000..5225af9e1 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.json @@ -0,0 +1,5 @@ +{ + "exclude": ["dist", "docs", "packages", "node_modules"], + "extends": "@xylabs/tsconfig" +} + diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.typedoc.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.typedoc.json new file mode 100644 index 000000000..0919ecb67 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/tsconfig.typedoc.json @@ -0,0 +1,5 @@ +{ + "exclude": ["**/spec/*", "**/*.spec.*", "**/packages/*", "dist"], + "extends": "./tsconfig.json" +} + diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/typedoc.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/typedoc.json new file mode 100644 index 000000000..a1ff9f91c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/typedoc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["./src/index.ts"], + "tsconfig": "./tsconfig.typedoc.json" +} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/xy.config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/xy.config.ts new file mode 100644 index 000000000..2952c5f9a --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3/xy.config.ts @@ -0,0 +1,10 @@ +import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3' +const config: XyTsupConfig = { + compile: { + browser: {}, + node: {}, + neutral: { src: true }, + }, +} + +export default config diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.depcheckrc b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.depcheckrc new file mode 100644 index 000000000..06e527fad --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.depcheckrc @@ -0,0 +1,4 @@ +ignores: + [ + "ethers" + ] diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.npmignore b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.npmignore new file mode 100644 index 000000000..a20bcd35c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/.npmignore @@ -0,0 +1,20 @@ +.* +.env +.eslintcache +.example.env +tsconfig* +rollup.config.ts +yarn.lock +**/*.spec.ts +**/*.snap + +.github +docs +.pnp.* +.vscode +.yarn/* +coverage +cspell.json +node_modules +swagger.json +packages \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/LICENSE b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/LICENSE new file mode 100644 index 000000000..0a041280b --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/README.md b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/README.md new file mode 100644 index 000000000..04d7c668c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/README.md @@ -0,0 +1,13 @@ +[![logo][]](https://xyo.network) + +Part of [sdk-xyo-client-js](https://www.npmjs.com/package/@xyo-network/sdk-xyo-client-js) + +## License + +> See the [LICENSE](LICENSE) file for license details + +## Credits + +[Made with 🔥 and ❄️ by XYO](https://xyo.network) + +[logo]: https://cdn.xy.company/img/brand/XYO_full_colored.png \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/package.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/package.json new file mode 100644 index 000000000..5fb0c2ff0 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/package.json @@ -0,0 +1,60 @@ +{ + "name": "@xyo-network/uniswap-v4-crypto-market-plugin", + "version": "3.5.1", + "description": "Typescript/Javascript Plugins for XYO Platform", + "homepage": "https://xyo.network", + "bugs": { + "url": "git+https://github.com/XYOracleNetwork/plugins/issues", + "email": "support@xyo.network" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/XYOracleNetwork/plugins.git" + }, + "license": "LGPL-3.0-only", + "author": { + "name": "XYO Development Team", + "email": "support@xyo.network", + "url": "https://xyo.network" + }, + "sideEffects": false, + "type": "module", + "exports": { + ".": { + "types": "./dist/types/index.d.ts", + "default": "./dist/neutral/index.mjs" + }, + "./package.json": "./package.json" + }, + "module": "dist/neutral/index.mjs", + "types": "dist/types/index.d.ts", + "dependencies": { + "@uniswap/sdk-core": "^7.7.2", + "@uniswap/v3-sdk": "^3.25.2", + "@xylabs/assert": "^4.8.7", + "@xylabs/delay": "^4.8.7", + "@xylabs/enum": "^4.8.7", + "@xylabs/promise": "^4.8.7", + "@xyo-network/abstract-witness": "^3.13.0", + "@xyo-network/module-model": "^3.13.0", + "@xyo-network/open-zeppelin-typechain": "^3.5.2", + "@xyo-network/payload-model": "^3.13.0", + "@xyo-network/payloadset-plugin": "^3.13.0", + "@xyo-network/uniswap-crypto-market-payload-plugin": "workspace:^", + "@xyo-network/uniswap-typechain": "^3.5.2", + "@xyo-network/witness-model": "^3.13.0", + "ethers": "^6.13.6" + }, + "devDependencies": { + "@xylabs/ts-scripts-yarn3": "^6.3.1", + "@xylabs/tsconfig": "^6.3.1", + "@xylabs/vitest-extended": "^4.8.7", + "@xyo-network/payload-wrapper": "^3.13.0", + "@xyo-network/witness-blockchain-abstract": "^3.13.0", + "typescript": "^5.8.3", + "vitest": "^3.1.1" + }, + "publishConfig": { + "access": "public" + } +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts new file mode 100644 index 000000000..c9a711643 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -0,0 +1,7 @@ +import type { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import type { WitnessConfig } from '@xyo-network/witness-model' + +export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ + pools?: string[] + schema: UniswapCryptoMarketWitnessConfigSchema +}> diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Plugin.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Plugin.ts new file mode 100644 index 000000000..b600f76f8 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Plugin.ts @@ -0,0 +1,16 @@ +import { PayloadSetSchema } from '@xyo-network/payload-model' +import { createPayloadSetWitnessPlugin } from '@xyo-network/payloadset-plugin' +import { UniswapCryptoMarketSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' + +import { UniswapV4CryptoMarketWitness } from './Witness.ts' + +export const UniswapV4CryptoMarketPlugin = () => + createPayloadSetWitnessPlugin( + { required: { [UniswapCryptoMarketSchema]: 1 }, schema: PayloadSetSchema }, + { + witness: async (params) => { + const result = await UniswapV4CryptoMarketWitness.create(params) + return result + }, + }, + ) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts new file mode 100644 index 000000000..baff8a537 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts @@ -0,0 +1,39 @@ +import { assertEx } from '@xylabs/assert' +import { AbstractWitness } from '@xyo-network/abstract-witness' +import type { AnyConfigSchema } from '@xyo-network/module-model' +import type { Payload, Schema } from '@xyo-network/payload-model' +import { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import type { WitnessParams } from '@xyo-network/witness-model' +import type { Provider } from 'ethers' + +import type { UniswapV4CryptoMarketWitnessConfig } from './Config.ts' + +export type UniswapV4CryptoMarketWitnessParams = WitnessParams< + AnyConfigSchema, + { + provider?: Provider + } +> + +export class UniswapV4CryptoMarketWitness< + TParams extends UniswapV4CryptoMarketWitnessParams = UniswapV4CryptoMarketWitnessParams, +> extends AbstractWitness { + static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapCryptoMarketWitnessConfigSchema] + static override readonly defaultConfigSchema: Schema = UniswapCryptoMarketWitnessConfigSchema + + protected get provider() { + return this.params.provider + } + + protected override async observeHandler(): Promise { + await this.started('throw') + // TODO: witness + return[] + } + + protected override async startHandler() { + await super.startHandler() + // TODO: bootstrap + return true + } +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/index.ts new file mode 100644 index 000000000..729fb6de5 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/index.ts @@ -0,0 +1,4 @@ +export * from './Config.ts' +export * from './lib/index.ts' +export { UniswapV4CryptoMarketPlugin as default, UniswapV4CryptoMarketPlugin } from './Plugin.ts' +export * from './Witness.ts' diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4ContractAddresses.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4ContractAddresses.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4ContractAddresses.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4ContractAddresses.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenIdentifier.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenIdentifier.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/UniswapV4TokenIdentifier.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenIdentifier.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getExchangeRate.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getExchangeRate.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getExchangeRate.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getExchangeRate.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPoolId.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getPoolId.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPoolId.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getPoolId.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPriceFromSqrtX96.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getPriceFromSqrtX96.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/getPriceFromSqrtX96.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/getPriceFromSqrtX96.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/index.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/priceFromUniswapV4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/pricesFromUniswapV4.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/sortTokens.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/sortTokens.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/sortTokens.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/sortTokens.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/spec/priceFromUniswapV4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/v4/lib/spec/priceFromUniswapV4.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts new file mode 100644 index 000000000..4838a6b06 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts @@ -0,0 +1,16 @@ +import '@xylabs/vitest-extended' + +import { PayloadSetPluginResolver } from '@xyo-network/payloadset-plugin' +import { + describe, expect, test, +} from 'vitest' + +import { UniswapV4CryptoMarketPlugin } from '../Plugin.ts' + +describe('CryptoMarketUniswapPlugin', () => { + test('Add to Resolver', async () => { + const plugin = UniswapV4CryptoMarketPlugin() + const resolver = await new PayloadSetPluginResolver().register(plugin) + expect(resolver.resolve(plugin.set)).toBeDefined() + }) +}) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts new file mode 100644 index 000000000..232e121a1 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts @@ -0,0 +1,59 @@ +// import '@xylabs/vitest-extended' + +// import { PayloadWrapper } from '@xyo-network/payload-wrapper' +// import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin' +// import { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +// import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' +// import { +// describe, expect, +// test, +// } from 'vitest' + +// import { UniswapPoolContracts } from '../lib/index.ts' +// import { UniswapCryptoMarketWitness } from '../Witness.ts' + +// describe('UniswapCryptoMarketWitness', () => { +// test('observe', async () => { +// const provider = getProviderFromEnv() +// const witness = await UniswapCryptoMarketWitness.create({ +// account: 'random', +// config: { +// pools: UniswapPoolContracts, +// schema: UniswapCryptoMarketWitnessConfigSchema, +// }, +// provider, +// }) +// const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] +// expect(observation.pairs.length).toBeGreaterThan(1) + +// const answerWrapper = PayloadWrapper.wrap(observation) +// expect(await answerWrapper.getValid()).toBe(true) +// }) +// test('observe [no config]', async () => { +// const provider = getProviderFromEnv() +// const witness = await UniswapCryptoMarketWitness.create({ +// account: 'random', +// config: { +// pools: UniswapPoolContracts, +// schema: UniswapCryptoMarketWitnessConfigSchema, +// }, +// provider, +// }) +// const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] +// expect(observation.pairs.length).toBeGreaterThan(1) + +// const answerWrapper = PayloadWrapper.wrap(observation) +// expect(await answerWrapper.getValid()).toBe(true) +// }) +// test('observe [no params]', async () => { +// const didThrow = async () => { +// try { +// await UniswapCryptoMarketWitness.create({ account: 'random' }) +// return false +// } catch { +// return true +// } +// } +// expect(await didThrow()).toBe(true) +// }) +// }) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.json new file mode 100644 index 000000000..5225af9e1 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.json @@ -0,0 +1,5 @@ +{ + "exclude": ["dist", "docs", "packages", "node_modules"], + "extends": "@xylabs/tsconfig" +} + diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.typedoc.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.typedoc.json new file mode 100644 index 000000000..0919ecb67 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/tsconfig.typedoc.json @@ -0,0 +1,5 @@ +{ + "exclude": ["**/spec/*", "**/*.spec.*", "**/packages/*", "dist"], + "extends": "./tsconfig.json" +} + diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/typedoc.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/typedoc.json new file mode 100644 index 000000000..a1ff9f91c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/typedoc.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://typedoc.org/schema.json", + "entryPoints": ["./src/index.ts"], + "tsconfig": "./tsconfig.typedoc.json" +} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/xy.config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/xy.config.ts new file mode 100644 index 000000000..2952c5f9a --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/xy.config.ts @@ -0,0 +1,10 @@ +import type { XyTsupConfig } from '@xylabs/ts-scripts-yarn3' +const config: XyTsupConfig = { + compile: { + browser: {}, + node: {}, + neutral: { src: true }, + }, +} + +export default config diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/index.ts index 25e04e79e..d9e8e55cc 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/index.ts @@ -1,4 +1,2 @@ -export * from './Config.ts' -export * from './lib/index.ts' -export { UniswapCryptoMarketPlugin as default, UniswapCryptoMarketPlugin } from './Plugin.ts' -export * from './Witness.ts' +export * from "@xyo-network/uniswap-v3-crypto-market-plugin" +export * from "@xyo-network/uniswap-v3-crypto-market-plugin" \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/index.ts deleted file mode 100644 index 2eb019569..000000000 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './v3/index.ts' -export * from './v4/index.ts' diff --git a/yarn.lock b/yarn.lock index 03d0b395a..cbad5b63b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7045,6 +7045,29 @@ __metadata: "@xyo-network/uniswap-crypto-market-plugin@workspace:^, @xyo-network/uniswap-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap": version: 0.0.0-use.local resolution: "@xyo-network/uniswap-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap" + dependencies: + "@xylabs/ts-scripts-yarn3": "npm:^6.3.1" + "@xylabs/tsconfig": "npm:^6.3.1" + "@xylabs/vitest-extended": "npm:^4.8.7" + "@xyo-network/uniswap-v3-crypto-market-plugin": "workspace:^" + "@xyo-network/uniswap-v4-crypto-market-plugin": "workspace:^" + typescript: "npm:^5.8.3" + vitest: "npm:^3.1.1" + languageName: unknown + linkType: soft + +"@xyo-network/uniswap-typechain@npm:^3.5.2": + version: 3.5.2 + resolution: "@xyo-network/uniswap-typechain@npm:3.5.2" + dependencies: + ethers: "npm:^6.13.6" + checksum: 10/a42c1b9190af90481d0dee80e2652bcc3afe97250178dfc3ccbf35e5ba38831b97876a11bf9d775103232c147d14c3781585bc4f272495c12ad9bd1647fad80e + languageName: node + linkType: hard + +"@xyo-network/uniswap-v3-crypto-market-plugin@workspace:^, @xyo-network/uniswap-v3-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3": + version: 0.0.0-use.local + resolution: "@xyo-network/uniswap-v3-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v3" dependencies: "@uniswap/sdk-core": "npm:^7.7.2" "@uniswap/v3-sdk": "npm:^3.25.2" @@ -7071,14 +7094,34 @@ __metadata: languageName: unknown linkType: soft -"@xyo-network/uniswap-typechain@npm:^3.5.2": - version: 3.5.2 - resolution: "@xyo-network/uniswap-typechain@npm:3.5.2" +"@xyo-network/uniswap-v4-crypto-market-plugin@workspace:^, @xyo-network/uniswap-v4-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4": + version: 0.0.0-use.local + resolution: "@xyo-network/uniswap-v4-crypto-market-plugin@workspace:packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4" dependencies: + "@uniswap/sdk-core": "npm:^7.7.2" + "@uniswap/v3-sdk": "npm:^3.25.2" + "@xylabs/assert": "npm:^4.8.7" + "@xylabs/delay": "npm:^4.8.7" + "@xylabs/enum": "npm:^4.8.7" + "@xylabs/promise": "npm:^4.8.7" + "@xylabs/ts-scripts-yarn3": "npm:^6.3.1" + "@xylabs/tsconfig": "npm:^6.3.1" + "@xylabs/vitest-extended": "npm:^4.8.7" + "@xyo-network/abstract-witness": "npm:^3.13.0" + "@xyo-network/module-model": "npm:^3.13.0" + "@xyo-network/open-zeppelin-typechain": "npm:^3.5.2" + "@xyo-network/payload-model": "npm:^3.13.0" + "@xyo-network/payload-wrapper": "npm:^3.13.0" + "@xyo-network/payloadset-plugin": "npm:^3.13.0" + "@xyo-network/uniswap-crypto-market-payload-plugin": "workspace:^" + "@xyo-network/uniswap-typechain": "npm:^3.5.2" + "@xyo-network/witness-blockchain-abstract": "npm:^3.13.0" + "@xyo-network/witness-model": "npm:^3.13.0" ethers: "npm:^6.13.6" - checksum: 10/a42c1b9190af90481d0dee80e2652bcc3afe97250178dfc3ccbf35e5ba38831b97876a11bf9d775103232c147d14c3781585bc4f272495c12ad9bd1647fad80e - languageName: node - linkType: hard + typescript: "npm:^5.8.3" + vitest: "npm:^3.1.1" + languageName: unknown + linkType: soft "@xyo-network/url-payload-plugin@workspace:^, @xyo-network/url-payload-plugin@workspace:packages/payload/packages/url": version: 0.0.0-use.local From 1b96c4bdf4d81b954adbf477f3ff0afced1253de Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:41:29 -0500 Subject: [PATCH 11/20] Add missing deps --- .../packages/nft/packages/nft/packages/witness/package.json | 1 + yarn.lock | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/payloadset/packages/crypto/packages/nft/packages/nft/packages/witness/package.json b/packages/payloadset/packages/crypto/packages/nft/packages/nft/packages/witness/package.json index 163f8833a..b5de9177c 100644 --- a/packages/payloadset/packages/crypto/packages/nft/packages/nft/packages/witness/package.json +++ b/packages/payloadset/packages/crypto/packages/nft/packages/nft/packages/witness/package.json @@ -33,6 +33,7 @@ "@xylabs/axios": "^4.8.7", "@xylabs/eth-address": "^4.8.7", "@xylabs/hex": "^4.8.7", + "@xyo-network/crypto-nft-collection-payload-plugin": "workspace:^", "@xyo-network/crypto-nft-payload-plugin": "workspace:^", "@xyo-network/erc1822-witness": "workspace:^", "@xyo-network/erc1967-witness": "workspace:^", diff --git a/yarn.lock b/yarn.lock index cbad5b63b..b0ffcbfdc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4563,6 +4563,7 @@ __metadata: "@xyo-network/archivist-model": "npm:^3.13.0" "@xyo-network/boundwitness-builder": "npm:^3.13.0" "@xyo-network/boundwitness-model": "npm:^3.13.0" + "@xyo-network/crypto-nft-collection-payload-plugin": "workspace:^" "@xyo-network/crypto-nft-payload-plugin": "workspace:^" "@xyo-network/diviner-boundwitness-memory": "npm:^3.13.0" "@xyo-network/diviner-model": "npm:^3.13.0" From f7e8c5f9fd7effb06963cc4ad01e7b2d096d9103 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:50:44 -0500 Subject: [PATCH 12/20] Extract types --- .../uniswap/packages/v4/src/Config.ts | 3 ++- .../v4/src/lib/UniswapV4TokenContracts.ts | 27 ++----------------- .../uniswap/packages/v4/src/lib/index.ts | 3 ++- .../packages/v4/src/lib/priceFromUniswapV4.ts | 3 ++- .../v4/src/lib/pricesFromUniswapV4.ts | 2 +- .../v4/src/lib/tokenRegistryValueToToken.ts | 9 +++++++ .../packages/v4/src/spec/Plugin.spec.ts | 2 +- .../packages/v4/src/types/PoolIdType.ts | 8 ++++++ .../v4/src/types/TokenRegistryEntry.ts | 7 +++++ .../uniswap/packages/v4/src/types/index.ts | 2 ++ 10 files changed, 36 insertions(+), 30 deletions(-) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts index c9a711643..5176f049a 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -1,7 +1,8 @@ import type { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessConfig } from '@xyo-network/witness-model' +import { PoolIdType } from './types/index.ts' export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ - pools?: string[] + pools?: Record schema: UniswapCryptoMarketWitnessConfigSchema }> diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts index 8b34d993a..f007c3d1b 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts @@ -1,15 +1,5 @@ -import { Token } from "@uniswap/sdk-core" -import { getAddress, ZeroAddress } from "ethers" - -type ChainId = 1 - -type TokenRegistryEntry = { - address: string, - chainId: ChainId, - decimals: number, - symbol: string, - name?: string, -} +import { ZeroAddress } from "ethers" +import { PoolIdType, TokenRegistryEntry } from "../types/index.ts" export const TokenRegistry: Record = { USDT: { @@ -26,21 +16,8 @@ export const TokenRegistry: Record = { }, } as const -type TokenRegistryKey = keyof typeof TokenRegistry -type TokenRegistryValue = typeof TokenRegistry[TokenRegistryKey] -export const tokenRegistryValueToToken = (value: TokenRegistryValue): Token => { - const { address, chainId, decimals, symbol, name } = value - const normalizedAddress = getAddress(address.toLowerCase()) - return new Token(chainId, normalizedAddress, decimals, symbol, name) -} -export type PoolIdType = { - fee: number, - hookAddress: string, - tickSpacing: number, - tokens: [TokenRegistryValue, TokenRegistryValue], -} export const UniswapV4Pools: Record = { 'XYO:USDT': { fee: 3000, diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts index a2aa5a076..f73b33457 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts @@ -1,2 +1,3 @@ export * from './priceFromUniswapV4.ts' -export * from './pricesFromUniswapV4.ts' \ No newline at end of file +export * from './pricesFromUniswapV4.ts' +export * from './tokenRegistryValueToToken.ts' \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts index 7fb8ca64e..59a1c73ad 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts @@ -1,7 +1,8 @@ import { Provider, ZeroAddress } from 'ethers' import { getExchangeRate } from './getExchangeRate.ts' import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' -import { PoolIdType, tokenRegistryValueToToken } from './UniswapV4TokenContracts.ts' +import { tokenRegistryValueToToken } from './tokenRegistryValueToToken.ts' +import { PoolIdType } from '../types/index.ts' export const priceFromUniswapV4 = async (poolId: PoolIdType, provider: Provider): Promise => { const { tokens, fee, hookAddress = ZeroAddress } = poolId diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts index a15d82bf2..b92dba4a0 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts @@ -1,7 +1,7 @@ import { Provider } from 'ethers' import { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' -import { PoolIdType } from './UniswapV4TokenContracts.ts' import { priceFromUniswapV4 } from './priceFromUniswapV4.ts' +import { PoolIdType } from '../types/index.ts' export const pricesFromUniswapV4 = async (poolId: PoolIdType[], provider: Provider): Promise => { return await Promise.all(poolId.map(async (pool) => priceFromUniswapV4(pool, provider))) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts new file mode 100644 index 000000000..ee10c1a88 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts @@ -0,0 +1,9 @@ +import { Token } from "@uniswap/sdk-core" +import { getAddress } from "ethers/address" +import { TokenRegistryEntry } from "../types/index.ts" + +export const tokenRegistryValueToToken = (value: TokenRegistryEntry): Token => { + const { address, chainId, decimals, symbol, name } = value + const normalizedAddress = getAddress(address.toLowerCase()) + return new Token(chainId, normalizedAddress, decimals, symbol, name) +} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts index 4838a6b06..cf5daefb5 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Plugin.spec.ts @@ -7,7 +7,7 @@ import { import { UniswapV4CryptoMarketPlugin } from '../Plugin.ts' -describe('CryptoMarketUniswapPlugin', () => { +describe('UniswapV4CryptoMarketPlugin', () => { test('Add to Resolver', async () => { const plugin = UniswapV4CryptoMarketPlugin() const resolver = await new PayloadSetPluginResolver().register(plugin) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts new file mode 100644 index 000000000..4b5eeb0c9 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts @@ -0,0 +1,8 @@ +import { TokenRegistryEntry } from "./TokenRegistryEntry.ts"; + +export type PoolIdType = { + fee: number, + hookAddress: string, + tickSpacing: number, + tokens: [TokenRegistryEntry, TokenRegistryEntry], +} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts new file mode 100644 index 000000000..120133eb2 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts @@ -0,0 +1,7 @@ +export type TokenRegistryEntry = { + address: string, + chainId: number, + decimals: number, + symbol: string, + name?: string, +} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts new file mode 100644 index 000000000..47439125d --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts @@ -0,0 +1,2 @@ +export * from './TokenRegistryEntry.ts' +export * from './PoolIdType.ts' \ No newline at end of file From 7b69bac933678092e553d471f711f87f2272e8ee Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 08:59:06 -0500 Subject: [PATCH 13/20] Update type names --- .../uniswap/packages/v4/src/Config.ts | 4 ++-- ...nContracts.ts => UniswapV4DefaultPools.ts} | 8 +++----- .../packages/v4/src/lib/priceFromUniswapV4.ts | 4 ++-- .../v4/src/lib/pricesFromUniswapV4.ts | 4 ++-- .../src/lib/spec/priceFromUniswapV4.spec.ts | 4 ++-- .../v4/src/lib/tokenRegistryValueToToken.ts | 4 ++-- .../packages/v4/src/types/HydratedPoolKey.ts | 19 +++++++++++++++++++ .../packages/v4/src/types/PoolIdType.ts | 8 -------- ...kenRegistryEntry.ts => TokenParameters.ts} | 2 +- .../uniswap/packages/v4/src/types/index.ts | 4 ++-- 10 files changed, 35 insertions(+), 26 deletions(-) rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/{UniswapV4TokenContracts.ts => UniswapV4DefaultPools.ts} (68%) create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts delete mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts rename packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/{TokenRegistryEntry.ts => TokenParameters.ts} (72%) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts index 5176f049a..3d65b524f 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -1,8 +1,8 @@ import type { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessConfig } from '@xyo-network/witness-model' -import { PoolIdType } from './types/index.ts' +import { HydratedPoolKey } from './types/index.ts' export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ - pools?: Record + pools?: Record schema: UniswapCryptoMarketWitnessConfigSchema }> diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts similarity index 68% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts index f007c3d1b..4bd7df5f6 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4TokenContracts.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts @@ -1,7 +1,7 @@ import { ZeroAddress } from "ethers" -import { PoolIdType, TokenRegistryEntry } from "../types/index.ts" +import { HydratedPoolKey, TokenParameters } from "../types/index.ts" -export const TokenRegistry: Record = { +export const TokenRegistry: Record = { USDT: { address: '0xdac17f958d2ee523a2206206994597c13d831ec7', chainId: 1, @@ -16,9 +16,7 @@ export const TokenRegistry: Record = { }, } as const - - -export const UniswapV4Pools: Record = { +export const UniswapV4DefaultPools: Record = { 'XYO:USDT': { fee: 3000, hookAddress: ZeroAddress, diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts index 59a1c73ad..c52754883 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts @@ -2,9 +2,9 @@ import { Provider, ZeroAddress } from 'ethers' import { getExchangeRate } from './getExchangeRate.ts' import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' import { tokenRegistryValueToToken } from './tokenRegistryValueToToken.ts' -import { PoolIdType } from '../types/index.ts' +import { HydratedPoolKey } from '../types/index.ts' -export const priceFromUniswapV4 = async (poolId: PoolIdType, provider: Provider): Promise => { +export const priceFromUniswapV4 = async (poolId: HydratedPoolKey, provider: Provider): Promise => { const { tokens, fee, hookAddress = ZeroAddress } = poolId const tokenA = tokenRegistryValueToToken(tokens[0]) const tokenB = tokenRegistryValueToToken(tokens[1]) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts index b92dba4a0..245b31adb 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts @@ -1,8 +1,8 @@ import { Provider } from 'ethers' import { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' import { priceFromUniswapV4 } from './priceFromUniswapV4.ts' -import { PoolIdType } from '../types/index.ts' +import { HydratedPoolKey } from '../types/index.ts' -export const pricesFromUniswapV4 = async (poolId: PoolIdType[], provider: Provider): Promise => { +export const pricesFromUniswapV4 = async (poolId: HydratedPoolKey[], provider: Provider): Promise => { return await Promise.all(poolId.map(async (pool) => priceFromUniswapV4(pool, provider))) } diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts index 303178a96..52c898196 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/spec/priceFromUniswapV4.spec.ts @@ -5,12 +5,12 @@ import { describe, expect, test, } from 'vitest' import { priceFromUniswapV4 } from '../priceFromUniswapV4.ts' -import { UniswapV4Pools } from '../UniswapV4TokenContracts.ts' +import { UniswapV4DefaultPools } from '../UniswapV4DefaultPools.ts' describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('priceFromUniswapV4', () => { test('priceFromUniswapV4', async () => { const provider = getProviderFromEnv() - const poolId = UniswapV4Pools['XYO:USDT'] + const poolId = UniswapV4DefaultPools['XYO:USDT'] const pairs = await priceFromUniswapV4(poolId, provider) expect(pairs).toBeDefined() console.dir(pairs, { depth: null }) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts index ee10c1a88..3350af66f 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/tokenRegistryValueToToken.ts @@ -1,8 +1,8 @@ import { Token } from "@uniswap/sdk-core" import { getAddress } from "ethers/address" -import { TokenRegistryEntry } from "../types/index.ts" +import { TokenParameters } from "../types/index.ts" -export const tokenRegistryValueToToken = (value: TokenRegistryEntry): Token => { +export const tokenRegistryValueToToken = (value: TokenParameters): Token => { const { address, chainId, decimals, symbol, name } = value const normalizedAddress = getAddress(address.toLowerCase()) return new Token(chainId, normalizedAddress, decimals, symbol, name) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts new file mode 100644 index 000000000..d4099e66c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts @@ -0,0 +1,19 @@ +import { TokenParameters } from "./TokenParameters.ts"; + +// NOTE: Would import this from @uniswap/v4-core, but +// they are currently hardcoded the ethers5 which +// causes issues +// export type PoolKey = { +// currency0: string +// currency1: string +// fee: number +// tickSpacing: number +// hooks: string +// } + +export type HydratedPoolKey = { + fee: number, + hookAddress: string, + tickSpacing: number, + tokens: [TokenParameters, TokenParameters], +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts deleted file mode 100644 index 4b5eeb0c9..000000000 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/PoolIdType.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { TokenRegistryEntry } from "./TokenRegistryEntry.ts"; - -export type PoolIdType = { - fee: number, - hookAddress: string, - tickSpacing: number, - tokens: [TokenRegistryEntry, TokenRegistryEntry], -} \ No newline at end of file diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts similarity index 72% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts index 120133eb2..5feef144b 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenRegistryEntry.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts @@ -1,4 +1,4 @@ -export type TokenRegistryEntry = { +export type TokenParameters = { address: string, chainId: number, decimals: number, diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts index 47439125d..07fef7ffe 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts @@ -1,2 +1,2 @@ -export * from './TokenRegistryEntry.ts' -export * from './PoolIdType.ts' \ No newline at end of file +export * from './TokenParameters.ts' +export * from './HydratedPoolKey.ts' \ No newline at end of file From 58d48df1e053d0000d93e18e1ec3ecd189084fe9 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:04:32 -0500 Subject: [PATCH 14/20] Rename to differentiate from Uniswap types --- .../uniswap/packages/v4/src/Config.ts | 4 ++-- .../v4/src/lib/UniswapV4DefaultPools.ts | 4 ++-- .../packages/v4/src/lib/priceFromUniswapV4.ts | 4 ++-- .../v4/src/lib/pricesFromUniswapV4.ts | 4 ++-- .../packages/v4/src/types/HydratedPoolKey.ts | 19 ----------------- .../packages/v4/src/types/TokenPairPoolKey.ts | 21 +++++++++++++++++++ .../uniswap/packages/v4/src/types/index.ts | 2 +- 7 files changed, 30 insertions(+), 28 deletions(-) delete mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts create mode 100644 packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenPairPoolKey.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts index 3d65b524f..d17c13b71 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -1,8 +1,8 @@ import type { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessConfig } from '@xyo-network/witness-model' -import { HydratedPoolKey } from './types/index.ts' +import { TokenPairPoolKey } from './types/index.ts' export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ - pools?: Record + pools?: Record schema: UniswapCryptoMarketWitnessConfigSchema }> diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts index 4bd7df5f6..874477353 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/UniswapV4DefaultPools.ts @@ -1,5 +1,5 @@ import { ZeroAddress } from "ethers" -import { HydratedPoolKey, TokenParameters } from "../types/index.ts" +import { TokenPairPoolKey, TokenParameters } from "../types/index.ts" export const TokenRegistry: Record = { USDT: { @@ -16,7 +16,7 @@ export const TokenRegistry: Record = { }, } as const -export const UniswapV4DefaultPools: Record = { +export const UniswapV4DefaultPools: Record = { 'XYO:USDT': { fee: 3000, hookAddress: ZeroAddress, diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts index c52754883..1eb91091e 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/priceFromUniswapV4.ts @@ -2,9 +2,9 @@ import { Provider, ZeroAddress } from 'ethers' import { getExchangeRate } from './getExchangeRate.ts' import { UniswapCryptoPair, UniswapCryptoToken } from '@xyo-network/uniswap-crypto-market-payload-plugin' import { tokenRegistryValueToToken } from './tokenRegistryValueToToken.ts' -import { HydratedPoolKey } from '../types/index.ts' +import { TokenPairPoolKey } from '../types/index.ts' -export const priceFromUniswapV4 = async (poolId: HydratedPoolKey, provider: Provider): Promise => { +export const priceFromUniswapV4 = async (poolId: TokenPairPoolKey, provider: Provider): Promise => { const { tokens, fee, hookAddress = ZeroAddress } = poolId const tokenA = tokenRegistryValueToToken(tokens[0]) const tokenB = tokenRegistryValueToToken(tokens[1]) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts index 245b31adb..b58b03c86 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/pricesFromUniswapV4.ts @@ -1,8 +1,8 @@ import { Provider } from 'ethers' import { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' import { priceFromUniswapV4 } from './priceFromUniswapV4.ts' -import { HydratedPoolKey } from '../types/index.ts' +import { TokenPairPoolKey } from '../types/index.ts' -export const pricesFromUniswapV4 = async (poolId: HydratedPoolKey[], provider: Provider): Promise => { +export const pricesFromUniswapV4 = async (poolId: TokenPairPoolKey[], provider: Provider): Promise => { return await Promise.all(poolId.map(async (pool) => priceFromUniswapV4(pool, provider))) } diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts deleted file mode 100644 index d4099e66c..000000000 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/HydratedPoolKey.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { TokenParameters } from "./TokenParameters.ts"; - -// NOTE: Would import this from @uniswap/v4-core, but -// they are currently hardcoded the ethers5 which -// causes issues -// export type PoolKey = { -// currency0: string -// currency1: string -// fee: number -// tickSpacing: number -// hooks: string -// } - -export type HydratedPoolKey = { - fee: number, - hookAddress: string, - tickSpacing: number, - tokens: [TokenParameters, TokenParameters], -} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenPairPoolKey.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenPairPoolKey.ts new file mode 100644 index 000000000..8ca5deb5c --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenPairPoolKey.ts @@ -0,0 +1,21 @@ +import { TokenParameters } from "./TokenParameters.ts"; + +// NOTE: We could import this type from @uniswap/v4-core, but +// they are currently hardcoded the ethers v5 which +// causes many issues since we are using ethers v6. Moreover, +// we would have to hit the ERC20 contract to get the decimals +// and name of the token, which is not ideal as it never changes. +// export type PoolKey = { +// currency0: string +// currency1: string +// fee: number +// tickSpacing: number +// hooks: string +// } + +export type TokenPairPoolKey = { + fee: number, + hookAddress: string, + tickSpacing: number, + tokens: [TokenParameters, TokenParameters], +} diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts index 07fef7ffe..394199c71 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/index.ts @@ -1,2 +1,2 @@ export * from './TokenParameters.ts' -export * from './HydratedPoolKey.ts' \ No newline at end of file +export * from './TokenPairPoolKey.ts' \ No newline at end of file From 0f9460a70b34428a55a8764d57cfed405b391014 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:05:18 -0500 Subject: [PATCH 15/20] Documentation --- .../packages/v4/src/types/TokenParameters.ts | 42 ++++++++++++++++--- 1 file changed, 37 insertions(+), 5 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts index 5feef144b..fca1eb4de 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/types/TokenParameters.ts @@ -1,7 +1,39 @@ +/** + * Represents the minimal metadata required to define an ERC-20 token + * in the context of Uniswap pool interactions, token registries, or + * off-chain utilities. + * + * This structure is designed to be lightweight but expressive enough + * to support pool ID generation, token sorting, and on-chain lookups. + */ export type TokenParameters = { - address: string, - chainId: number, - decimals: number, - symbol: string, - name?: string, + /** + * The Ethereum address of the token contract. + */ + address: string + + /** + * The chain ID where this token is deployed. + * This enables multi-chain compatibility and avoids collisions between + * tokens with the same address on different networks (e.g. mainnet vs testnet). + */ + chainId: number + + /** + * The number of decimals used by the token. + * This is required for correct price calculations and amount formatting. + */ + decimals: number + + /** + * A short uppercase identifier for the token (e.g. 'USDT', 'WETH'). + * Used for display, logging, and lookup convenience. + */ + symbol: string + + /** + * (Optional) The full human-readable name of the token (e.g. 'Tether USD'). + * Useful for UIs or token metadata enrichment. + */ + name?: string } \ No newline at end of file From 0479d367bde737c698a0ac06d361e83d249099bd Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:11:36 -0500 Subject: [PATCH 16/20] Uniswap V4 Witness implementation --- .../packages/uniswap/packages/v4/src/Config.ts | 2 +- .../packages/uniswap/packages/v4/src/Witness.ts | 17 ++++++++++++----- .../uniswap/packages/v4/src/lib/index.ts | 3 ++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts index d17c13b71..f224433f9 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -3,6 +3,6 @@ import type { WitnessConfig } from '@xyo-network/witness-model' import { TokenPairPoolKey } from './types/index.ts' export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ - pools?: Record + poolKeys?: TokenPairPoolKey[] schema: UniswapCryptoMarketWitnessConfigSchema }> diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts index baff8a537..3deb4cdff 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts @@ -2,11 +2,13 @@ import { assertEx } from '@xylabs/assert' import { AbstractWitness } from '@xyo-network/abstract-witness' import type { AnyConfigSchema } from '@xyo-network/module-model' import type { Payload, Schema } from '@xyo-network/payload-model' -import { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { UniswapCryptoMarketPayload, UniswapCryptoMarketSchema, UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessParams } from '@xyo-network/witness-model' import type { Provider } from 'ethers' import type { UniswapV4CryptoMarketWitnessConfig } from './Config.ts' +import { pricesFromUniswapV4, UniswapV4DefaultPools } from './lib/index.ts' +import { TokenPairPoolKey } from './types/index.ts' export type UniswapV4CryptoMarketWitnessParams = WitnessParams< AnyConfigSchema, @@ -21,19 +23,24 @@ export class UniswapV4CryptoMarketWitness< static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapCryptoMarketWitnessConfigSchema] static override readonly defaultConfigSchema: Schema = UniswapCryptoMarketWitnessConfigSchema + protected get pools(): TokenPairPoolKey[] { + return this.config?.poolKeys ?? Object.values(UniswapV4DefaultPools) + } + protected get provider() { - return this.params.provider + return assertEx(this.params.provider, () => 'Provider Required') } protected override async observeHandler(): Promise { await this.started('throw') - // TODO: witness - return[] + const pairs = await pricesFromUniswapV4(this.pools, this.provider) + const timestamp = Date.now() + const payload: UniswapCryptoMarketPayload = { pairs, schema: UniswapCryptoMarketSchema, timestamp } + return [payload] } protected override async startHandler() { await super.startHandler() - // TODO: bootstrap return true } } diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts index f73b33457..31ab28a29 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/lib/index.ts @@ -1,3 +1,4 @@ export * from './priceFromUniswapV4.ts' export * from './pricesFromUniswapV4.ts' -export * from './tokenRegistryValueToToken.ts' \ No newline at end of file +export * from './tokenRegistryValueToToken.ts' +export * from './UniswapV4DefaultPools.ts' \ No newline at end of file From 686ba3a4d0b55d26f94f941072c8f6a56cda3177 Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:13:58 -0500 Subject: [PATCH 17/20] Add UniswapV4CryptoMarketWitnessConfigSchema --- .../crypto/packages/market/packages/uniswap/src/Schema.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/payload/packages/crypto/packages/market/packages/uniswap/src/Schema.ts b/packages/payload/packages/crypto/packages/market/packages/uniswap/src/Schema.ts index 41fa80dce..6ad2319b3 100644 --- a/packages/payload/packages/crypto/packages/market/packages/uniswap/src/Schema.ts +++ b/packages/payload/packages/crypto/packages/market/packages/uniswap/src/Schema.ts @@ -1,5 +1,8 @@ export type UniswapCryptoMarketWitnessConfigSchema = 'network.xyo.crypto.market.uniswap.witness.config' export const UniswapCryptoMarketWitnessConfigSchema: UniswapCryptoMarketWitnessConfigSchema = 'network.xyo.crypto.market.uniswap.witness.config' +export type UniswapV4CryptoMarketWitnessConfigSchema = 'network.xyo.crypto.market.uniswap.v4.witness.config' +export const UniswapV4CryptoMarketWitnessConfigSchema: UniswapV4CryptoMarketWitnessConfigSchema = 'network.xyo.crypto.market.uniswap.v4.witness.config' + export type UniswapCryptoMarketSchema = 'network.xyo.crypto.market.uniswap' export const UniswapCryptoMarketSchema: UniswapCryptoMarketSchema = 'network.xyo.crypto.market.uniswap' From ed603a85b2b44649f0c9989bd880adad67b45f6b Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:17:11 -0500 Subject: [PATCH 18/20] Use v4 schema --- .../market/packages/uniswap/packages/v4/src/Config.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts index f224433f9..92b883b9c 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Config.ts @@ -1,8 +1,8 @@ -import type { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import type { UniswapV4CryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessConfig } from '@xyo-network/witness-model' import { TokenPairPoolKey } from './types/index.ts' export type UniswapV4CryptoMarketWitnessConfig = WitnessConfig<{ poolKeys?: TokenPairPoolKey[] - schema: UniswapCryptoMarketWitnessConfigSchema + schema: UniswapV4CryptoMarketWitnessConfigSchema }> From ac7de8ed73fce2ffe1d8001f677180e5f51a6c3c Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:17:50 -0500 Subject: [PATCH 19/20] Remove unused packages for barrel --- .../crypto/packages/market/packages/uniswap/package.json | 4 +--- yarn.lock | 2 -- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json index e7ecf92ec..f09e069c6 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/package.json @@ -35,9 +35,7 @@ "devDependencies": { "@xylabs/ts-scripts-yarn3": "^6.3.1", "@xylabs/tsconfig": "^6.3.1", - "@xylabs/vitest-extended": "^4.8.7", - "typescript": "^5.8.3", - "vitest": "^3.1.1" + "typescript": "^5.8.3" }, "publishConfig": { "access": "public" diff --git a/yarn.lock b/yarn.lock index b0ffcbfdc..87563de56 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7049,11 +7049,9 @@ __metadata: dependencies: "@xylabs/ts-scripts-yarn3": "npm:^6.3.1" "@xylabs/tsconfig": "npm:^6.3.1" - "@xylabs/vitest-extended": "npm:^4.8.7" "@xyo-network/uniswap-v3-crypto-market-plugin": "workspace:^" "@xyo-network/uniswap-v4-crypto-market-plugin": "workspace:^" typescript: "npm:^5.8.3" - vitest: "npm:^3.1.1" languageName: unknown linkType: soft From e342b91b85b17cec5fc1897b6ec7806a20dc69ea Mon Sep 17 00:00:00 2001 From: Joel Carter Date: Wed, 23 Apr 2025 09:21:41 -0500 Subject: [PATCH 20/20] Witness tests --- .../uniswap/packages/v4/src/Witness.ts | 6 +- .../packages/v4/src/spec/Witness.spec.ts | 96 ++++++++----------- 2 files changed, 45 insertions(+), 57 deletions(-) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts index 3deb4cdff..d7751bd50 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/Witness.ts @@ -2,7 +2,7 @@ import { assertEx } from '@xylabs/assert' import { AbstractWitness } from '@xyo-network/abstract-witness' import type { AnyConfigSchema } from '@xyo-network/module-model' import type { Payload, Schema } from '@xyo-network/payload-model' -import { UniswapCryptoMarketPayload, UniswapCryptoMarketSchema, UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { UniswapCryptoMarketPayload, UniswapCryptoMarketSchema, UniswapV4CryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessParams } from '@xyo-network/witness-model' import type { Provider } from 'ethers' @@ -20,8 +20,8 @@ export type UniswapV4CryptoMarketWitnessParams = WitnessParams< export class UniswapV4CryptoMarketWitness< TParams extends UniswapV4CryptoMarketWitnessParams = UniswapV4CryptoMarketWitnessParams, > extends AbstractWitness { - static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapCryptoMarketWitnessConfigSchema] - static override readonly defaultConfigSchema: Schema = UniswapCryptoMarketWitnessConfigSchema + static override readonly configSchemas: Schema[] = [...super.configSchemas, UniswapV4CryptoMarketWitnessConfigSchema] + static override readonly defaultConfigSchema: Schema = UniswapV4CryptoMarketWitnessConfigSchema protected get pools(): TokenPairPoolKey[] { return this.config?.poolKeys ?? Object.values(UniswapV4DefaultPools) diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts index 232e121a1..eb5230f70 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/packages/v4/src/spec/Witness.spec.ts @@ -1,59 +1,47 @@ -// import '@xylabs/vitest-extended' +import '@xylabs/vitest-extended' -// import { PayloadWrapper } from '@xyo-network/payload-wrapper' -// import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin' -// import { UniswapCryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' -// import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' -// import { -// describe, expect, -// test, -// } from 'vitest' +import { PayloadWrapper } from '@xyo-network/payload-wrapper' +import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { UniswapV4CryptoMarketWitnessConfigSchema } from '@xyo-network/uniswap-crypto-market-payload-plugin' +import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' +import { + describe, expect, + test, +} from 'vitest' -// import { UniswapPoolContracts } from '../lib/index.ts' -// import { UniswapCryptoMarketWitness } from '../Witness.ts' +import { UniswapV4DefaultPools } from '../lib/index.ts' +import { UniswapV4CryptoMarketWitness } from '../Witness.ts' -// describe('UniswapCryptoMarketWitness', () => { -// test('observe', async () => { -// const provider = getProviderFromEnv() -// const witness = await UniswapCryptoMarketWitness.create({ -// account: 'random', -// config: { -// pools: UniswapPoolContracts, -// schema: UniswapCryptoMarketWitnessConfigSchema, -// }, -// provider, -// }) -// const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] -// expect(observation.pairs.length).toBeGreaterThan(1) +describe('UniswapV4CryptoMarketWitness', () => { + test('observe', async () => { + const provider = getProviderFromEnv() + const witness = await UniswapV4CryptoMarketWitness.create({ + account: 'random', + config: { + poolKeys: Object.values(UniswapV4DefaultPools), + schema: UniswapV4CryptoMarketWitnessConfigSchema, + }, + provider, + }) + const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] + expect(observation.pairs.length).toBeGreaterThan(0) -// const answerWrapper = PayloadWrapper.wrap(observation) -// expect(await answerWrapper.getValid()).toBe(true) -// }) -// test('observe [no config]', async () => { -// const provider = getProviderFromEnv() -// const witness = await UniswapCryptoMarketWitness.create({ -// account: 'random', -// config: { -// pools: UniswapPoolContracts, -// schema: UniswapCryptoMarketWitnessConfigSchema, -// }, -// provider, -// }) -// const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] -// expect(observation.pairs.length).toBeGreaterThan(1) + const answerWrapper = PayloadWrapper.wrap(observation) + expect(await answerWrapper.getValid()).toBe(true) + }) + test('observe [no config]', async () => { + const provider = getProviderFromEnv() + const witness = await UniswapV4CryptoMarketWitness.create({ + account: 'random', + config: { + schema: UniswapV4CryptoMarketWitnessConfigSchema, + }, + provider, + }) + const [observation] = (await witness.observe()) as UniswapCryptoMarketPayload[] + expect(observation.pairs.length).toBeGreaterThan(0) -// const answerWrapper = PayloadWrapper.wrap(observation) -// expect(await answerWrapper.getValid()).toBe(true) -// }) -// test('observe [no params]', async () => { -// const didThrow = async () => { -// try { -// await UniswapCryptoMarketWitness.create({ account: 'random' }) -// return false -// } catch { -// return true -// } -// } -// expect(await didThrow()).toBe(true) -// }) -// }) + const answerWrapper = PayloadWrapper.wrap(observation) + expect(await answerWrapper.getValid()).toBe(true) + }) +})