jest.mock('ethers', () => { return { Contract: jest.fn().mockImplementation(() => ({ tickSpacing: jest.fn().mockResolvedValue(12), })), }; }); jest.mock('../../src/helpers/ProtocolDetector', () => { return { ProtocolDetector: jest.fn().mockImplementation(() => ({ isAlgebraVault: jest.fn().mockReturnValue(false), isPoolSharkVault: jest.fn().mockReturnValue(false), })), }; }); import { PoolStateQuerier } from '../../src/helpers/PoolStateQuerier'; describe('PoolStateQuerier behavior', () => { it('uses globalState for algebra/poolshark pools', async () => { const querier = new PoolStateQuerier(); const detector = (querier as any).protocolDetector; detector.isAlgebraVault.mockReturnValue(true); const pool = { globalState: jest.fn().mockResolvedValue({ price: 1n }), } as any; await expect(querier.getSlot0('beacon', pool)).resolves.toEqual({ price: 1n, }); }); it('uses slot0 for standard pools', async () => { const querier = new PoolStateQuerier(); const pool = { slot0: jest.fn().mockResolvedValue({ sqrtPriceX96: 2n }), } as any; await expect(querier.getSlot0('beacon', pool)).resolves.toEqual({ sqrtPriceX96: 2n, }); }); it('extracts sqrtPriceX96 for different protocols', () => { const querier = new PoolStateQuerier(); const detector = (querier as any).protocolDetector; detector.isAlgebraVault.mockReturnValue(true); expect(querier.extractSqrtPriceX96('beacon', { price: 5n })).toBe(5n); detector.isAlgebraVault.mockReturnValue(false); detector.isPoolSharkVault.mockReturnValue(true); expect(querier.extractSqrtPriceX96('beacon', { pool: { price: 6n } })).toBe( 6n, ); detector.isPoolSharkVault.mockReturnValue(false); expect(querier.extractSqrtPriceX96('beacon', { sqrtPriceX96: 7n })).toBe( 7n, ); }); it('returns tick spacing when available', async () => { const querier = new PoolStateQuerier(); await expect(querier.getTickSpacing('0xpool', {} as any)).resolves.toBe(12); }); it('returns undefined when tick spacing query fails', async () => { const ethers = require('ethers'); ethers.Contract.mockImplementationOnce(() => ({ tickSpacing: jest.fn().mockRejectedValue(new Error('fail')), })); const querier = new PoolStateQuerier(); await expect( querier.getTickSpacing('0xpool', {} as any), ).resolves.toBeUndefined(); }); });