ethers.js swapExactETHForTokens и swapExactTokensForTokens при обмене блинами

avatar
TheDayIsDone
9 августа 2021 в 00:09
3056
1
2

У меня возникли проблемы со следующим кодом, и я не могу купить по свопу блинов. Я получаю следующие ошибки в зависимости от того, какую функцию я вызываю swapExactETHForTokens или swapExactTokensForTokens: https://bscscan.com/tx/0x18285588819662c93543dba5650d4471e62a504900b9a089f09dea4970698352 https://bscscan.com/tx/0x38ae19f6b677f072a82ac7c5528d445d3fc45288b1004f205d479edffee97b2f

Вот код, который я использую:

const ethers = require('ethers')
require('dotenv').config({ path: __dirname + '/./../../.env' })

const config = {
  wbnb: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',
  safemoon: '0x8076c74c5e3f5852037f31ff0093eeb8c8add8d3',
  pancakeSwapRouter: '0x10ed43c718714eb63d5aa57b78b54704e256024e',
  slippage: 12,
}

const provider = new ethers.providers.WebSocketProvider(
  'wss://bsc-ws-node.nariox.org:443'
)

const wallet = new ethers.Wallet.fromMnemonic(process.env.MNEMONIC)
const account = wallet.connect(provider)

const pancakeswap = new ethers.Contract(
  config.pancakeSwapRouter,
  [
    'function getAmountsOut(uint amountIn, address[] memory path) public view returns (uint[] memory amounts)',
    'function swapExactTokensForTokens(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts)',
    'function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts)',
  ],
  account
)

const wbnb = new ethers.Contract(
  config.wbnb,
  ['function approve(address spender, uint amount) public returns(bool)'],
  account
)

const buyToken = async () => {
  try {
    const deadline = Math.floor(Date.now() / 1000) + 60 * 20
    const tokenIn = config.wbnb
    const tokenOut = config.safemoon
    const amountIn = ethers.utils.parseUnits('0.001', 'ether')

    const amounts = await pancakeswap.getAmountsOut(amountIn, [
      tokenIn,
      tokenOut,
    ])
    const amountOutMin = amounts[1].sub(amounts[1].div(`${config.slippage}`))

    console.log(`
Buying new token
tokenIn: ${amountIn} ${tokenIn} (WBNB)
tokenOut: ${amountOutMin} ${tokenOut}
    `)

    // const tx = await pancakeswap.swapExactTokensForTokens(
    //   amountIn,
    //   amountOutMin,
    //   [tokenIn, tokenOut],
    //   account.address,
    //   deadline,
    //   {
    //     gasPrice: provider.getGasPrice(),
    //     gasLimit: 100000,
    //   }
    // )

    const tx = await pancakeswap.swapExactETHForTokens(
      amountOutMin,
      [tokenIn, tokenOut],
      account.address,
      deadline,
      {
        gasPrice: provider.getGasPrice(),
        gasLimit: 100000,
      }
    )

    const receipt = await tx.wait()
    console.log('buyToken receipt')
    console.log(receipt)
  } catch (error) {
    console.log(error)
  }
}

const approve = async () => {
  const valueToapprove = ethers.utils.parseUnits('0.01', 'ether')
  const tx = await wbnb.approve(pancakeswap.address, valueToapprove, {
    gasPrice: provider.getGasPrice(),
    gasLimit: 100000,
  })
  console.log('Approving...')
  const receipt = await tx.wait()
  console.log('Approve receipt')
  console.log(receipt)
}

const main = async () => {
  await approve()
  await buyToken()
  process.exit()
}

main()

Утверждение работает, но я не могу понять, что происходит с swapExactTokensForTokens или swapExactETHForTokens. Требуется ли подтверждение вызова? Кажется, это не помогает ни в том, ни в другом случае. Спасибо за ваш вклад.

Источник
starkm
19 декабря 2021 в 23:03
0

Привет. У меня такая же проблема. Вы нашли решение?

Ответы (1)

avatar
thegreytangent
5 ноября 2021 в 08:22
1

Просто используйте swapExactETHForTokens и попробуйте добавить value в опции.

        const token = "Your token";
        const amountIn = ethers.utils.parseUnits("0.0001", 'ether');

        await approve(amountIn);


        const amounts = await router.getAmountsOut(amountIn, [
            addresses.WBNB,
            token
            
          ])

          const amountOutMin = amounts[1].sub(amounts[1].div(12))

            const tx = await router.swapExactETHForTokens(
            0,
            [addresses.WBNB, token],
            addresses.recipient,
            Date.now() + 1000 * 60 * 10, 
            {
                gasPrice: provider.getGasPrice(),
                gasLimit: 310000,
                value: amountIn
            }
        );

Если это сработает, не забудьте отметить ответ как принятый. Спасибо (-:

starkm
20 декабря 2021 в 19:37
1

неоплачиваемый метод не может переопределить значение

东方不败
8 февраля 2022 в 20:04
1

Это работает очень хорошо