DEX: Router
Router Contract
Router Contract Example (Pseudo Solidity Code)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "./Factory.sol";
import "./Pair.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract Router {
address public factory;
constructor(address _factory) {
factory = _factory;
}
// Swap function: Swaps an exact amount of one token for another
function swapExactTokensForTokens(
address tokenA,
address tokenB,
uint amountIn,
uint amountOutMin
) external {
address pairAddress = Factory(factory).getPair(tokenA, tokenB);
require(pairAddress != address(0), "Pair does not exist");
IERC20(tokenA).transferFrom(msg.sender, pairAddress, amountIn);
uint amountOut = Pair(pairAddress).swap(tokenA, tokenB, amountIn);
require(amountOut >= amountOutMin, "Insufficient output amount");
IERC20(tokenB).transfer(msg.sender, amountOut);
}
// Adding liquidity function: Deposits tokens into the liquidity pool
function addLiquidity(
address tokenA,
address tokenB,
uint amountA,
uint amountB
) external {
address pairAddress = Factory(factory).getPair(tokenA, tokenB);
require(pairAddress != address(0), "Pair does not exist");
IERC20(tokenA).transferFrom(msg.sender, pairAddress, amountA);
IERC20(tokenB).transferFrom(msg.sender, pairAddress, amountB);
Pair(pairAddress).mint(msg.sender); // Mint LP tokens for liquidity provider
}
// Removing liquidity function: Withdraws tokens from the liquidity pool
function removeLiquidity(
address tokenA,
address tokenB
) external {
address pairAddress = Factory(factory).getPair(tokenA, tokenB);
require(pairAddress != address(0), "Pair does not exist");
uint liquidity = Pair(pairAddress).balanceOf(msg.sender);
Pair(pairAddress).burn(msg.sender); // Burn LP tokens to remove liquidity
// Transfer tokens back to user
uint amountA = IERC20(tokenA).balanceOf(pairAddress);
uint amountB = IERC20(tokenB).balanceOf(pairAddress);
IERC20(tokenA).transfer(msg.sender, amountA);
IERC20(tokenB).transfer(msg.sender, amountB);
}
}Explanation of Key Functions
Testing the Router Contract
Step 1: Install Dependencies and Set Up Project
Step 2: Configure Your Router Contract and Tests
Step 3: Write Unit Tests for the Router Contract
Explanation of Tests
Running Tests
Additional Test Scenarios
Last updated