# CompetentSwap Самой популярной и крупной DEX (децентрализованной биржей) на данный момент является Uniswap V3. Её исходный код хотя и открыт, лицензией запрещено использовать его до 2023 года. Именно поэтому практически каждый новый блокчейн форкает и использует предыдущую версию Uniswap V2, у которой таких ограничений нет. Хоть эта версия полностью работоспособна, её код уже немного успел устареть и требует обновления. Поэтому вам предлагается сделать что-то вроде Uniswap V2.5 -- механику и математику оставить прежней, но обновить и оптимизировать код с учётом текущих технологических реалий. Что можно обновить в кодовой базе Uniswap V2? - перенести на актуальную версию Solidity, используя возможности, которые появились в языке с тех пор (пользовательские ошибки, `immutable`); - LP-токены имеют одинаковое название "_Uniswap V2_" и символ "_UNI-V2_", поэтому их очень сложно отличить друг от друга, например, в кошельке. Нужно придумать (подсмотреть в Uniswap V3) способ задавать имя и символ в зависимости от токенов пары (например, имя -- "_CompetentSwap LINK/USDT LP Token_", символ -- "_LINK/USDT_"). Важно не забыть, что адрес контракта пары (LP-токена) в Uniswap __должен__ быть детерминирован, то есть зависеть только от адресов токенов пары. Идею, как это сделать, можно подсмотреть, опять же, в [Uniswap V3](https://github.com/Uniswap/v3-core/blob/main/contracts/UniswapV3PoolDeployer.sol). А ещё очень важно не забыть, что не все токены досконально реализуют стандарт [ERC-20](https://eips.ethereum.org/EIPS/eip-20) ([тут читаем подробней](https://github.com/d-xo/weird-erc20)), в частности, в области метаданных. Поэтому нужно будет предусмотреть все варианты -- например, что у какого-то токена из пары не будет имени, или символ будет в `bytes32`, а не `string`, как того требует стандарт. Реализовать работу с такими токенами можно в виде библиотеки (подсмотреть можно [тут](https://github.com/Uniswap/solidity-lib/blob/master/contracts/libraries/SafeERC20Namer.sol)). Кроме этого, Uniswap очень тесно связан с токеном [Wrapped Ether (WETH)](https://etherscan.io/address/0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2#code), который, опять-таки, успел сильно устареть. Что можно улучшить? - у контракта есть такая функция -- на его адрес можно отправить Эфир и получить токен WETH 1 к 1. Удобно, но обратная операция не работает, как ни странно, и из-за этого новички часто теряют большие деньги ![](https://storage.googleapis.com/primary-web3/entryImages/resized/losteth_500.webp); - WETH не поддерживает стандарт [EIP-2612](https://eips.ethereum.org/EIPS/eip-2612) (использование токенов по подписи владельца) и [EIP-1271](https://eips.ethereum.org/EIPS/eip-1271) (использование токенов по подписи контракта); - WETH не поддерживает стандарт [EIP-1363](https://eips.ethereum.org/EIPS/eip-1363). ## Ссылки - [Uniswap Smart Contract Breakdown](https://betterprogramming.pub/uniswap-smart-contract-breakdown-ea20edf1a0ff);