@@ -3,12 +3,13 @@ pragma solidity 0.8;
33
44import {IERC20 } from "@openzeppelin/contracts/token/ERC20/IERC20.sol " ;
55import {Pair} from "./Pair.sol " ;
6+ import {Factory} from "./Factory.sol " ;
67
78contract Router {
8- address public immutable i_pair ;
9+ Factory public factory ;
910
10- constructor (address _pair ) {
11- i_pair = _pair ;
11+ constructor (address _factory ) {
12+ factory = Factory (factory) ;
1213 }
1314
1415 function sortToken (address tokenA , address tokenB ) public pure returns (address , address ) {
@@ -20,18 +21,27 @@ contract Router {
2021 }
2122
2223 function addLiquidity (address tokenA , address tokenB , uint256 amountA , uint256 amountB ) external {
24+ address pair = factory.getPair (tokenA, tokenB);
25+
26+ if (pair == address (0 )) {
27+ factory.createPair (tokenA, tokenB);
28+ pair = factory.getPair (tokenA, tokenB);
29+ }
2330 IERC20 (tokenA).transferFrom (msg .sender , address (this ), amountA);
2431 IERC20 (tokenB).transferFrom (msg .sender , address (this ), amountB);
2532
26- IERC20 (tokenA).approve (i_pair , amountA);
27- IERC20 (tokenB).approve (i_pair , amountB);
33+ IERC20 (tokenA).approve (pair , amountA);
34+ IERC20 (tokenB).approve (pair , amountB);
2835
29- Pair (i_pair ).addLiquidity (amountA, amountB);
36+ Pair (pair ).addLiquidity (amountA, amountB, msg . sender );
3037 }
3138
32- function swapExactToken (address tokenIn , uint256 amountIn ) external {
39+ function swapExactToken (address tokenIn , address tokenOut , uint256 amountIn ) external {
40+ address pair = factory.getPair (tokenIn, tokenOut);
41+ require (pair != address (0 ), "Pair doesnt exist " );
42+
3343 IERC20 (tokenIn).transferFrom (msg .sender , address (this ), amountIn);
34- IERC20 (tokenIn).approve (i_pair , amountIn);
35- Pair (i_pair ).swap (tokenIn, amountIn, msg .sender );
44+ IERC20 (tokenIn).approve (pair , amountIn);
45+ Pair (pair ).swap (tokenIn, amountIn, msg .sender );
3646 }
3747}
0 commit comments