diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts index 2aacf42d3..63e60662c 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/Witness.ts @@ -4,8 +4,7 @@ import type { AnyConfigSchema } from '@xyo-network/module-model' import type { Payload, Schema } from '@xyo-network/payload-model' import type { UniswapCryptoMarketPayload } from '@xyo-network/uniswap-crypto-market-payload-plugin' import { - UniswapCryptoMarketSchema, - UniswapCryptoMarketWitnessConfigSchema, + UniswapCryptoMarketSchema,UniswapCryptoMarketWitnessConfigSchema, } from '@xyo-network/uniswap-crypto-market-payload-plugin' import type { WitnessParams } from '@xyo-network/witness-model' import type { Provider } from 'ethers' @@ -13,8 +12,7 @@ import type { Provider } from 'ethers' import type { UniswapCryptoMarketWitnessConfig } from './Config.ts' import type { EthersUniSwap3Pair } from './lib/index.ts' import { - createUniswapPoolContracts, - pricesFromUniswap3, UniswapPoolContracts, + createUniswapPoolContracts,pricesFromUniswap3, UniswapPoolContracts, } from './lib/index.ts' export type UniswapCryptoMarketWitnessParams = WitnessParams< diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/UniswapV3Slot0Fields.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/UniswapV3Slot0Fields.ts deleted file mode 100644 index 853c6e132..000000000 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/UniswapV3Slot0Fields.ts +++ /dev/null @@ -1 +0,0 @@ -export type UniswapV3Slot0Fields = [bigint, number, number, number, number, number, boolean] 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 index 2c241dcee..2eb019569 100644 --- 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 @@ -1,3 +1,2 @@ -export * from './Ethers/index.ts' -export * from './pricesFromUniswap3.ts' -export * from './UniswapPoolContracts.ts' +export * from './v3/index.ts' +export * from './v4/index.ts' diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/UniSwap3Pair.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniSwap3Pair.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/UniSwap3Pair.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniSwap3Pair.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/Uniswap3PoolSlot0Wrapper.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/Uniswap3PoolSlot0Wrapper.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/Uniswap3PoolSlot0Wrapper.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/Uniswap3PoolSlot0Wrapper.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/UniswapPoolContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapPoolContracts.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/UniswapPoolContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapPoolContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/UniswapV3Slot0Fields.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapV3Slot0Fields.ts similarity index 51% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/UniswapV3Slot0Fields.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapV3Slot0Fields.ts index d734550ac..67de47c72 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/UniswapV3Slot0Fields.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/UniswapV3Slot0Fields.ts @@ -1 +1,2 @@ export type EthersUniswapV3Slot0Fields = [bigint, bigint, bigint, bigint, bigint, bigint, boolean] +export type UniswapV3Slot0Fields = [bigint, number, number, number, number, number, boolean] diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/createUniswapPoolContracts.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/createUniswapPoolContracts.ts similarity index 100% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/createUniswapPoolContracts.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/createUniswapPoolContracts.ts diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/index.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts similarity index 67% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/index.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts index b18313833..1ebb0a978 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/Ethers/index.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/index.ts @@ -1,4 +1,6 @@ export * from './createUniswapPoolContracts.ts' +export * from './pricesFromUniswap3.ts' export * from './UniSwap3Pair.ts' export * from './Uniswap3PoolSlot0Wrapper.ts' +export * from './UniswapPoolContracts.ts' export * from './UniswapV3Slot0Fields.ts' diff --git a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/pricesFromUniswap3.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts similarity index 83% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/pricesFromUniswap3.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts index 4cd83c8fe..f6c02e332 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/pricesFromUniswap3.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/pricesFromUniswap3.ts @@ -1,8 +1,8 @@ import { fulfilled } from '@xylabs/promise' import type { UniswapCryptoPair } from '@xyo-network/uniswap-crypto-market-payload-plugin' -import type { EthersUniSwap3Pair } from './Ethers/index.ts' -import { logErrorsAsync } from './logErrors.ts' +import type { EthersUniSwap3Pair } from './index.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/spec/pricesFromUniswap3.spec.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/spec/pricesFromUniswap3.spec.ts similarity index 85% rename from packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/spec/pricesFromUniswap3.spec.ts rename to packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/spec/pricesFromUniswap3.spec.ts index ce52bb2c5..d93723879 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/spec/pricesFromUniswap3.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v3/spec/pricesFromUniswap3.spec.ts @@ -2,12 +2,11 @@ import '@xylabs/vitest-extended' import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' import { - describe, expect, - test, + describe, expect, test, } from 'vitest' -import { createUniswapPoolContracts } from '../Ethers/index.ts' import { pricesFromUniswap3 } from '../pricesFromUniswap3.ts' +import { createUniswapPoolContracts } from '../createUniswapPoolContracts.ts' import { UniswapPoolContracts } from '../UniswapPoolContracts.ts' describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('pricesFromUniswap3', () => { 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 new file mode 100644 index 000000000..72b14baf3 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenContractIdentifier.ts @@ -0,0 +1,8 @@ +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/UniswapV4TokenIdentifier.ts b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenIdentifier.ts new file mode 100644 index 000000000..f3c79b979 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/UniswapV4TokenIdentifier.ts @@ -0,0 +1,7 @@ +export interface UniswapV4TokenIdentifier { + chainId: number, + address: string, + decimals: number, + symbol?: string, + name?: string +} \ No newline at end of file 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 new file mode 100644 index 000000000..92b6067d1 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getExchangeRate.ts @@ -0,0 +1,40 @@ +import { Token } from "@uniswap/sdk-core" +import { ZeroAddress } from "ethers/constants" +import { Contract } from "ethers/contract" +import { Provider } from "ethers/providers" +import { getPoolId } from "./getPoolId.ts" +import { getPriceFromSqrtX96 } from "./getPriceFromSqrtX96.ts" + +const STATE_VIEW_ADDRESS = "0x7ffe42c4a5deea5b0fec41c94c136cf115597227" // State view contract address + +const STATE_VIEW_ABI = [{"inputs":[{"internalType":"contract IPoolManager","name":"_poolManager","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"getFeeGrowthGlobals","outputs":[{"internalType":"uint256","name":"feeGrowthGlobal0","type":"uint256"},{"internalType":"uint256","name":"feeGrowthGlobal1","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"}],"name":"getFeeGrowthInside","outputs":[{"internalType":"uint256","name":"feeGrowthInside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1X128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"getLiquidity","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"bytes32","name":"positionId","type":"bytes32"}],"name":"getPositionInfo","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"feeGrowthInside0LastX128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1LastX128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"int24","name":"tickLower","type":"int24"},{"internalType":"int24","name":"tickUpper","type":"int24"},{"internalType":"bytes32","name":"salt","type":"bytes32"}],"name":"getPositionInfo","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"feeGrowthInside0LastX128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthInside1LastX128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"bytes32","name":"positionId","type":"bytes32"}],"name":"getPositionLiquidity","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"}],"name":"getSlot0","outputs":[{"internalType":"uint160","name":"sqrtPriceX96","type":"uint160"},{"internalType":"int24","name":"tick","type":"int24"},{"internalType":"uint24","name":"protocolFee","type":"uint24"},{"internalType":"uint24","name":"lpFee","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int16","name":"tick","type":"int16"}],"name":"getTickBitmap","outputs":[{"internalType":"uint256","name":"tickBitmap","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int24","name":"tick","type":"int24"}],"name":"getTickFeeGrowthOutside","outputs":[{"internalType":"uint256","name":"feeGrowthOutside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthOutside1X128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int24","name":"tick","type":"int24"}],"name":"getTickInfo","outputs":[{"internalType":"uint128","name":"liquidityGross","type":"uint128"},{"internalType":"int128","name":"liquidityNet","type":"int128"},{"internalType":"uint256","name":"feeGrowthOutside0X128","type":"uint256"},{"internalType":"uint256","name":"feeGrowthOutside1X128","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"PoolId","name":"poolId","type":"bytes32"},{"internalType":"int24","name":"tick","type":"int24"}],"name":"getTickLiquidity","outputs":[{"internalType":"uint128","name":"liquidityGross","type":"uint128"},{"internalType":"int128","name":"liquidityNet","type":"int128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolManager","outputs":[{"internalType":"contract IPoolManager","name":"","type":"address"}],"stateMutability":"view","type":"function"}] + +/** + * Returns the price of the token pair in the Uniswap V4 pool. + * @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 hookAddress The address of the hook contract. Default is ZeroAddress. + * @param provider The EVM provider to use for the transaction. + * @returns The price of the token pair. + */ +export const getExchangeRate = async ( + tokenA: Token, + tokenB: Token, + fee: number, + hookAddress: string | undefined, + provider: Provider +): Promise => { + const hooks = hookAddress || ZeroAddress + const stateView = new Contract(STATE_VIEW_ADDRESS, STATE_VIEW_ABI, provider) + const [token0, token1] = tokenA.sortsBefore(tokenB) + ? [tokenA, tokenB] + : [tokenB, tokenA] + + const poolId: string = getPoolId(token0, token1, fee, 60, hooks) + if (poolId === ZeroAddress) throw new Error("Invalid poolId") + const response = await stateView.getSlot0(poolId) + const sqrtPriceX96 = response[0] + const price = getPriceFromSqrtX96(sqrtPriceX96, token1.decimals, token0.decimals) + return price +} 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 new file mode 100644 index 000000000..48eb7b615 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPoolId.ts @@ -0,0 +1,26 @@ +import { Token } from "@uniswap/sdk-core" +import { AbiCoder } from "ethers/abi" +import { ZeroAddress } from "ethers/constants" +import { keccak256 } from "ethers/crypto" + +/** + * 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 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] + const currency0Addr = currency0.isNative ? ZeroAddress : currency0.wrapped.address + const currency1Addr = currency1.isNative ? ZeroAddress : currency1.wrapped.address + return keccak256( + AbiCoder.defaultAbiCoder().encode( + ['address', 'address', 'uint24', 'int24', 'address'], + [currency0Addr, currency1Addr, fee, tickSpacing, hooks] + ), + ) +} \ No newline at end of file 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/lib/v4/getPriceFromSqrtX96.ts new file mode 100644 index 000000000..54ff3e743 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/getPriceFromSqrtX96.ts @@ -0,0 +1,26 @@ +/** + * Calculates the price from the square root price in Q96 format. + * @param sqrtPriceX96 The square root price in Q96 format. + * @param decimalsA The number of decimals for the first token. + * @param decimalsB The number of decimals for the second token. + * @returns The price as a number. + */ +export const getPriceFromSqrtX96 = (sqrtPriceX96: bigint, decimalsA: number, decimalsB: number): number => { + const Q96 = 2n ** 96n + + // Scale to avoid floating point math by using a 1e18 factor + const numerator = sqrtPriceX96 * sqrtPriceX96 * 10n ** 18n + const denominator = Q96 * Q96 + + let price = numerator / denominator + + // Adjust for decimal differences + const decimalAdjustment = decimalsB - decimalsA + if (decimalAdjustment > 0) { + price *= 10n ** BigInt(decimalAdjustment) + } else if (decimalAdjustment < 0) { + price /= 10n ** BigInt(-decimalAdjustment) + } + + return Number(price) / 1e18 +} 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 new file mode 100644 index 000000000..ae00149b2 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/index.ts @@ -0,0 +1 @@ +export * from './pricesFromUniswap4.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/pricesFromUniswap4.ts new file mode 100644 index 000000000..06570ce11 --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/pricesFromUniswap4.ts @@ -0,0 +1,9 @@ +import { Provider, ZeroAddress } from 'ethers' +import { getExchangeRate } from './getExchangeRate.ts' +import { UniswapV4TokenContractIdentifier } from './UniswapV4TokenContractIdentifier.ts' + +export const pricesFromUniswap4 = async (contract: UniswapV4TokenContractIdentifier, provider: Provider) => { + const { tokenA, tokenB, fee, hookAddress = ZeroAddress } = contract + const rate = await getExchangeRate(tokenA, tokenB, fee, hookAddress, provider) + return rate +} 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/pricesFromUniswap4.spec.ts new file mode 100644 index 000000000..0f391954f --- /dev/null +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/lib/v4/spec/pricesFromUniswap4.spec.ts @@ -0,0 +1,19 @@ +import '@xylabs/vitest-extended' + +import { getProviderFromEnv } from '@xyo-network/witness-blockchain-abstract' +import { + describe, expect, test, +} from 'vitest' +import { pricesFromUniswap4 } from '../pricesFromUniswap4.ts' +import { Token } from '@uniswap/sdk-core' + +describe.skipIf(!(process.env.INFURA_PROJECT_ID && process.env.INFURA_PROJECT_SECRET))('pricesFromUniswap4', () => { + test('pricesFromUniswap4', 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 value = await pricesFromUniswap4(tokenContractIdentifier, provider) + expect(value).toBeDefined() + }) +}) 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/src/spec/Plugin.spec.ts index 4d1e8002d..aef83fed3 100644 --- a/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Plugin.spec.ts +++ b/packages/payloadset/packages/crypto/packages/market/packages/uniswap/src/spec/Plugin.spec.ts @@ -2,8 +2,7 @@ import '@xylabs/vitest-extended' import { PayloadSetPluginResolver } from '@xyo-network/payloadset-plugin' import { - describe, expect, - test, + describe, expect, test, } from 'vitest' import { UniswapCryptoMarketPlugin } from '../Plugin.ts'