## Balancer Smart Router
#### Thuật toán
- Gọi `totalAmount` là số lượng cần swap
- Với mỗi pool, config số lượng token tối đa có thể swap qua pool đó. (Cái này có thể dựa vào slippage của người dùng đặt để tính toán)
- Tìm các routes có thể đi từ A --> B (các routes sẽ đi qua tối đa 3 pool, nếu nhiều pool hơn thì họ hardcode midpool trong config). Số tiền swap tối đa của route sẽ là số tiền tối thiểu của pool trong route đó
- Sắp xếp các route theo `swapLimit` giảm dần.
- Tiến hành quá trình lựa chọn routes như sau:
- Chia `totalAmount` thành `i` phần dựa trên `swapLimit` của mỗi route. Ban đầu có:
- `swapAmount[i]= swapLimit[i]`
- `Sum(swapAmount[i]) = totalAmount`.
- Với mỗi route `j` chưa xét, giả sử sẽ sẽ swap một lượng là `swapAmount[j] = totalAmount/j` qua pool đó. Khi đó số lượng swap ở các route trước đó là:
<p style="text-align: center;">swapAmount[i] = swapAmount[i] * (1 - swapAmount[j]/totalAmount)</p>
- Optimize phân chia `swapAmount[i]` vào các route. Và lưu lại cách chia tối ưu nhất
#### Đánh giá
- Nhanh (do số lượng candidates route ít)
- Khả năng tối ưu phụ thuộc vào config số lượng swapLimit của từng pool
- Chưa xét đến trường hợp các routes sử dụng trùng pool, dẫn đến ảnh hưởng đến kết quả (Trường hợp này ít khi xảy ra)
## Uniswap Smart Router
#### Thuật toán
- Gọi totalAmount là số lượng cần swap
- `DFS` tìm tất cả các routes từ A --> B
- Chia totalAmount thành các phần 5%,10%,15%,..100%. Với mỗi routes, tính toán số output của routes đó với từng phần trên.
- Sử dụng `BFS` để xét tất cả các cách kết hợp các routes trên. Trong quá trình kết hợp, các routes được chọn không được sử dụng chung pool
#### Đánh giá:
- Đơn giản hơn Balancer Smart Router
- Chậm hơn do sử dụng vét cạn các trường hợp có thể xảy ra. Tuy nhiên kết quả đem lại sẽ tốt hơn (phụ thuộc vào mức độ chia nhỏ)