Документация содержит хорошие подробные туториалы,ниже представлен перевод Проведение операций обмена(свопы) —  самое распростроненное использование Uniswap. В данном примере рассмотрим, как имплементировать  single-path swap в смарт-контрактах. Контракт будет использовать две функции,которые мы поэтапно создадим. swapExactInputSingle(...) swapExactOutputSingle(...) swapExactInputSingle —  обменивает фиксированное количество одного токена на максимально возможное количество другого токена.( fix one → max another  ) Эта функция задействует структуру ExactInputSingleParams и функцию exactInputSingle(...)из интерфейса ISwapRouter swapExactOutputSingle — обменивает минимально возможное количество одного токена на фиксированное количество другого токена. ( Min one → fix another ) Эта функция задействует структуру  ExactOutputSingleParams и функцию exactOutputSingle(...) из интерфейса ISwapRouter. Для упрощения примера,адреса контрактов токенов (тут DAI и WETH9) захардкодили. Очевидно,что контракт можно модифицировать так, чтобы изменять пулы и токены для каждой транзакции.  abicoder v2, позволяет кодировать и декодировать произвольные вложенные массивы и структуры в calldata. Импортируем необходимые пакетики (через npm или yarn) Cсоздаем контракт SwapExamples, и объявляем immutable public переменную swapRouter типа ISwapRouter. Это позволит нам использовать функции в интерфейсе ISwapRouter. Для упрощения примера хардкодим адреса контрактов токенов и уровни комиссий пула.  Вызывающий(условный пользователь) должен утвердить контракт на снятие токенов со счета вызывающего адреса для выполнения свопа. "Утвердить" означает вызвать на нем функцию approvе.Помните, поскольку наш контракт это сам по себе контракт, а не расширение вызывающей стороны(нас) то, мы также должны одобрить(утвердить) контракт Uniswap protocol routerдля использования токенов, которыми будет владеть наш контракт после того, как они будут сняты с вызывающего адреса (нас). Немного сложновато,но при вдумчивом прочтении все становится на свои места. В заключение, переводим amount of DAI с адреса вызывающего на адрес нашего контракта.Значение amount должно быть передано во второй approve. В коде все перечисленное выглядит проще: Что бы выполнить функцию свопа нам необходимо снабдить  структуру ExactInputSingleParamsнеобходимой для свопа информацией. tokenIn адрес контракта входящего токена tokenOutадрес контракта исходящего токена feeУровень комиссии пула, используется для определения правильности контракта пула, в котором выполняется своп.  recipient адрес назначения исходящего токена(или адресс получателя) deadline время unix, по истечении которого своп не будет выполнен,используется для защиты от долго ожидающих транзакций и резких колебаний цен amountOutMinimumмы устанавливаем на ноль,но в продакшене это дает определенный риск. Для реального проекта, это значение должно быть рассчитано с использованием нашего SDK или оракула цен в сети — это помогает защититься от получения нехарактерно плохих цен для сделки ,которые могут являться следствием работы фронта или любого другого типа манипулирования ценой. sqrtPriceLimitX96Мы 	устанавливаем в 0 — это делает этот парамент неактивным.В продакшене, это значение можно использовать для установки предела цены, по которой своп будет проходить в пуле.  Exact Output обменивает минимально возможное количество входного токена на фиксированное количество исходящего токена. Это менее распространенный стиль обмена, но он может быть полезен . Поскольку в этом примере происходит передача входящего токена в ожидании операции обмена, возможно, что часть этого входящего токена останется после выполнения свопа, поэтому мы возвращаем его вызывающему адресу в конце операции. https://github.com/Uniswap/v3-core https://github.com/Uniswap/v3-periphery Контракты, импортируемые пакетными менеджерами, содержат старые версии солидити.Если вы пишете свои контракты с solidity ^0.8.0,то нужно импортировать ветку 0.8 в офицальном гитхабе Uniswap (по ссылочкам выше,заходим в ветки и выбираем 0.8.0).Это обязательно!!!!!! В противном случае вы словите конфликт с заиморченым контрактом ERC721 openzeppelin. команда для импорта ветки под Linux выглядит так :  npm install "https://github.com/Uniswap/v3-core.git#0.8" --save После этого в package.json должны появиться такие строчки: