// Функція для додавання ліквідності, в параметрах вказується кількість токенів для додавання // створюється екземпляр інтерфейса токена, // викликається переведення токенів від ініціатора транзакції на адрес контракта function addLiquidity(uint256 _tokenAmount) public payable returns (uint) { // Перевірка на наявність активів в цьому пулі if(getReserve() == 0) { // Створюється екземпляр інтерфейса токена IERC20 token = IERC20(tokenAddress); // Виконується переведення токенів від відправника на адрес контракту token.transferFrom(msg.sender, address(this), _tokenAmount); // Обраховуємо ліквідність uint liquidity = address(this).balance; // Мінт токенів ліквідності _mint(msg.sender, liquidity); return liquidity; } else { // Обраховуємо резерви ETH uint ethReserve = address(this).balance - msg.value; // Отримуємо резерви токену uint tokenReserve = getReserve(); // Визначаємо скільки токенів треба додати в пул uint tokenAmount = (msg.value * tokenReserve) / ethReserve; // Перевіряємо чи користувач вказав правильно число require(_tokenAmount >= tokenAmount, "insufficient token amount"); // Створюємо екземпляр інтерфейсу токена IERC20 token = IERC20(tokenAddress); // Переводимо токени від користувача на контракт token.transferFrom(msg.sender, address(this), tokenAmount); // Обраховуємо нове значення ліквідності uint liquidity = (totalSupply() * msg.value) / ethReserve; _mint(msg.sender, liquidity); return liquidity; } }
0.7.1