#ethereum #solidity #binance-smart-chain
Вопрос:
У меня есть следующий код, который обменивает ETH (или BNB в мае в тестовой сети BSC) на определенный токен:
pragma solidity 0.7.1; import "https://github.com/pancakeswap/pancake-swap-periphery/blob/master/contracts/interfaces/IPancakeRouter02.sol"; contract UniswapExample { address internal constant UNISWAP_ROUTER_ADDRESS = 0x9Ac64Cc6e4415144C455BD8E4837Fea55603e5c3 ; //Router for pancake IPancakeRouter02 public uniswapRouter; //Store addresses //address[] tokens = new address[](2); //address private usdt = 0x7ef95a0FEE0Dd31b22626fA2e10Ee6A223F8a684; //address private busd = 0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7; //address private dai = 0x8a9424745056Eb399FD19a0EC26A14316684e274; address private crypto1 = 0x7ef95a0FEE0Dd31b22626fA2e10Ee6A223F8a684; address private crypto2 = 0x78867BbEeF44f2326bF8DDd1941a4439382EF2A7; address private crypto3 = 0x8a9424745056Eb399FD19a0EC26A14316684e274; //uint totalSum; constructor() { uniswapRouter = IPancakeRouter02(UNISWAP_ROUTER_ADDRESS); } function convertEthToCrypto(uint cryptoAmount) public payable { uint deadline = block.timestamp 15; // using 'now' for convenience, for mainnet pass deadline from frontend! uniswapRouter.swapETHForExactTokens{ value: msg.value }(cryptoAmount, getPathForETH(crypto1), address(this), deadline); // refund leftover ETH to user (bool success,) = msg.sender.call{ value: address(this).balance }(""); require(success, "refund failed"); } function getPathForETH(address crypto) public view returns (address[] memory) { address[] memory path = new address[](2); path[0] = uniswapRouter.WETH(); path[1] = crypto; return path; } function getETH() public view returns(address) { return uniswapRouter.WETH(); } // important to receive ETH receive() payable external {} }
Здесь convertEthToCrypto
обменивается один токен и является платной функцией. Поэтому в Remix я ввожу определенное количество WEI, и функция меняет токен местами.
Но как мне удается обменять несколько токенов одновременно?
Комментарии:
1. Попытался протестировать ваш код, но у меня ничего не вышло. В «cryptoAmount» я поставил 0,001, но я получаю ошибку: transact в UniswapExample.convertEthToCrypto ошибка: Аргументы кодировки ошибки: Ошибка: недопустимая строка с номером BigNumber (аргумент=»значение» значение=»0,001″ код=НЕДОПУСТИМАЯ версия документа=bignumber/5.5.0). Помогите, пожалуйста
Ответ №1:
На вашем месте я бы использовал swapExactTokensForTokens и называл его столько, сколько вы хотите. вы даже можете создать цикл для управления, если у вас много криптографий для обмена или если они всегда одни и те же, жестко закодируйте вызовы. вот краткий пример с DAI и USDT. вы можете заменить тикеры переменными и использовать цикл, если хотите.
address[] memory path = new address[](2); path[0] = address(DAI); path[1] = address(USDT); UniswapV2Router02.swapExactTokensForTokens(amountIn, amountOutMin, path, msg.sender, block.timestamp);