Меняйте местами несколько токенов одновременно

#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);