Files
strategic/tests/unit/adapters/uniswapV3.test.ts
2026-02-09 21:51:54 -08:00

105 lines
3.0 KiB
TypeScript

import { describe, it, expect, vi, beforeEach } from "vitest";
import { UniswapV3Adapter } from "../../../src/adapters/uniswapV3.js";
describe("Uniswap V3 Adapter", () => {
let adapter: UniswapV3Adapter;
let mockProvider: any;
beforeEach(() => {
mockProvider = {
getNetwork: vi.fn().mockResolvedValue({ chainId: 1n }),
call: vi.fn(),
};
vi.spyOn(require("ethers"), "JsonRpcProvider").mockImplementation(() => mockProvider);
vi.spyOn(require("ethers"), "Contract").mockImplementation(() => ({
exactInputSingle: vi.fn(),
exactOutputSingle: vi.fn(),
quoteExactInputSingle: vi.fn(),
interface: {
encodeFunctionData: vi.fn(),
},
}));
});
it("should encode exact input swap", async () => {
adapter = new UniswapV3Adapter("mainnet");
const params = {
tokenIn: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
tokenOut: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
fee: 3000,
amountIn: 1000000n,
amountOutMinimum: 990000n,
recipient: "0x123",
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
};
const data = await adapter.swapExactInput(params);
expect(data).toBeDefined();
expect(data.to).toBeDefined();
expect(data.data).toBeDefined();
});
it("should encode exact output swap", async () => {
adapter = new UniswapV3Adapter("mainnet");
const params = {
tokenIn: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
tokenOut: "0xdAC17F958D2ee523a2206206994597C13D831ec7",
fee: 3000,
amountOut: 1000000n,
amountInMaximum: 1010000n,
recipient: "0x123",
deadline: Math.floor(Date.now() / 1000) + 60 * 20,
};
const data = await adapter.swapExactOutput(params);
expect(data).toBeDefined();
expect(data.to).toBeDefined();
expect(data.data).toBeDefined();
});
it("should encode path correctly", () => {
adapter = new UniswapV3Adapter("mainnet");
const path = adapter.encodePath(
["0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", "0xdAC17F958D2ee523a2206206994597C13D831ec7"],
[3000]
);
expect(path).toBeDefined();
expect(path.length).toBeGreaterThan(0);
});
it("should get quote for exact input", async () => {
adapter = new UniswapV3Adapter("mainnet");
// Mock quoter response
mockProvider.call = vi.fn().mockResolvedValue(
"0x00000000000000000000000000000000000000000000000000000000000f4240" // 1000000
);
const quote = await adapter.quoteExactInput(
"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
"0xdAC17F958D2ee523a2206206994597C13D831ec7",
3000,
1000000n
);
expect(quote).toBeGreaterThan(0n);
});
it("should validate fee tiers", () => {
adapter = new UniswapV3Adapter("mainnet");
const validFees = [100, 500, 3000, 10000];
validFees.forEach(fee => {
expect(adapter.isValidFee(fee)).toBe(true);
});
expect(adapter.isValidFee(999)).toBe(false);
});
});