const V2_ROUTER_ABI = [
'function addLiquidity(address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline) returns (uint256 amountA, uint256 amountB, uint256 liquidity)',
'function addLiquidityETH(address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline) payable returns (uint256 amountToken, uint256 amountETH, uint256 liquidity)'
];
const router = new ethers.Contract(V2_ROUTER, V2_ROUTER_ABI, signer);
const deadline = Math.floor(Date.now() / 1000) + 1200; // 20 minutes
// ERC-20 / ERC-20 pair
const tx = await router.addLiquidity(
tokenA.target,
tokenB.target,
amountADesired,
amountBDesired,
amountADesired * 99n / 100n, // 1% slippage
amountBDesired * 99n / 100n,
userAddress,
deadline
);