import { Fraction } from '@uniswap/sdk-core'; import { UniswapCustomRouterV2 } from '../../src/routers/uniswap/uniswap-v4-router'; jest.mock('../../src/routers/base/base-router', () => { return { BaseRouter: jest.fn().mockImplementation(() => ({ getSwapAmount: jest .fn() .mockResolvedValue({ amountToSwap: 4n, zeroForOne: false }), })), }; }); const makeQuoter = () => ({}); describe('UniswapCustomRouterV2', () => { const positions = [{ lowerTick: -60, upperTick: 60, weight: 1 }]; it('calls base router with normalized defaults', async () => { const logger = { info: jest.fn() } as any; const router = new UniswapCustomRouterV2(makeQuoter() as any, logger); const result = await router.getSwapAmount( {} as any, positions as any, 10n, 20n, '0x1', '0x2', 3000, 5, ); expect(result).toEqual({ amountToSwap: 4n, zeroForOne: false }); const baseRouterModule = require('../../src/routers/base/base-router'); const baseRouterInstance = baseRouterModule.BaseRouter.mock.results[0].value; const args = baseRouterInstance.getSwapAmount.mock.calls[0][0]; expect(args.maxIterations).toBe(50); expect(args.ratioErrorTolerance).toEqual(new Fraction(40, 10000)); expect(args.searchMode).toBe('input'); expect(args.clampMode).toBe('tick'); }); it('passes through custom options', async () => { const logger = { info: jest.fn() } as any; const router = new UniswapCustomRouterV2(makeQuoter() as any, logger); await router.getSwapAmount( {} as any, positions as any, 10n, 20n, '0x1', '0x2', 3000, 5, undefined, 50, 'parallel', 'price', { tickSpacing: 10 }, ); const baseRouterModule = require('../../src/routers/base/base-router'); const baseRouterInstance = baseRouterModule.BaseRouter.mock.results[1].value; const args = baseRouterInstance.getSwapAmount.mock.calls[0][0]; expect(args.maxPriceImpactBps).toBe(50); expect(args.searchMode).toBe('parallel'); expect(args.clampMode).toBe('price'); expect(args.engineExtras).toEqual({ tickSpacing: 10 }); }); it('throws when base router fails', async () => { const baseRouterModule = require('../../src/routers/base/base-router'); baseRouterModule.BaseRouter.mockImplementationOnce(() => ({ getSwapAmount: jest.fn().mockRejectedValue(new Error('base failed')), })); const logger = { info: jest.fn() } as any; const router = new UniswapCustomRouterV2(makeQuoter() as any, logger); await expect( router.getSwapAmount( {} as any, positions as any, 10n, 20n, '0x1', '0x2', 3000, 5, ), ).rejects.toThrow('base failed'); }); it('supports legacy signature', async () => { const logger = { info: jest.fn() } as any; const router = new UniswapCustomRouterV2(makeQuoter() as any, logger); const result = await router.getSwapAmountLegacy( {} as any, positions as any, 10n, 20n, '0x1', '0x2', 3000, 5, ); expect(result.amountToSwap).toBe(4n); }); });