如何在 nodejs 中创建一个函数,自动交换多钱包,从 BNB 到一些特殊的代币

问题描述 投票:0回答:0

我正在编写一个 nodejs 程序,自动交换多个钱包,从 BNB 到一些特殊的代币。 但是程序在发送第一笔交易时卡住了,请帮助我

async function autoSwapToToken(wallets = [], Router, Token, AmountETH = "all", TimeWait = 0.001) {
    let WBNBAddress = await Router.methods.WETH().call()
    async function _autoSwapToToken(wallets = [], Router, Token, AmountETH = "all", index = 0) {
        if (index < wallets.length) {
            let FromAddress = wallets[index].address
            // nếu chưa approve thì aprove
            await Token.methods.allowance(FromAddress, Router.options.address).call({ from: FromAddress })
                .then(r => {
                    if (r <= 0) {
                        logWaning("approveTokentoContract:")
                        return approveTokentoContract(Router.options.address, Token, FromAddress);
                    }
                })

            let _AmountETH = AmountETH * 1e18
            let Balance = await web3.eth.getBalance(FromAddress);
            logWaning(index, '_autoSwapToCoin: 0x..', FromAddress.slice(-4), AmountETH, "ETH", Balance)

            if (Balance == 0) {
                logError(FromAddress, Balance, "BNB")
                return _autoSwapToToken(wallets, Router, Token, AmountETH, index + 1)
            }
            if (AmountETH == "all") {
                _AmountETH = Balance - (Settings.GasPrice * 1e9 * Settings.GasLimit);
            }

            let transaction = {
                from: FromAddress,
                value: _AmountETH,
                gasPrice: Settings.GasPrice * 1e9
            }

            let path = [WBNBAddress, Token.options.address]
            // console.log(Object.keys(Router.methods).filter(v => !v.startsWith("0x") )) //&& v.startsWith("get")
            // let AmountsOut = (await Router.methods.getAmountsOut(_AmountETH.toString(), path).call())[1]

            try {
                transaction.gas = await Router.methods.swapExactETHForTokens(
                    0,
                    path,
                    FromAddress,
                    moment().add(1, "minutes").valueOf()).estimateGas(transaction);

                console.log(Balance / 1e18, _AmountETH / 1e18, (transaction.gasPrice * transaction.gas) / 1e18);

                Router.methods.swapExactETHForTokens(
                    0,
                    path,
                    FromAddress,
                    moment().add(1, "minutes").valueOf())
                    .send(transaction)
                    .on("receipt", receipt => {
                        logSuccess(FromAddress + ' Đã swap -> ' + "- Token:" + amountToken + "- hash:" + receipt.transactionHash)
                        let file = DataDir + "autoSwapToToken.txt";
                        fs.writeFileSync(file, receipt.transactionHash + "\n", {
                            encoding: "utf8",
                            flag: "a+",
                        });
                    })

            } catch (err) {
                logError(FromAddress, err.message)
                let file = DataDir + "autoSwapToTokenErrors.txt";
                fs.writeFileSync(file, FromAddress + "-" + AmountETH + "-" + err.message + "\n", "utf8", {
                    encoding: "utf8",
                    flag: "a+",
                });
            }

            setTimeout(() => {
                _autoSwapToToken(wallets, Router, Token, AmountETH, index + 1)
            }, TimeWait * 60 * 1000);
        } else { return true }
    }
    return _autoSwapToToken(wallets, Router, Token, AmountETH);
}

wallets = [{address:"0x00..", privateKey:"..."}, {address:"0x00..", privateKey:"..."}, ...]

Router
是实例合约 Pancake Router v2

Token
是特殊Token

的实例合约

AmountETH
是单位以太中的 ETH 数量,或者“全部”是交换所有余额

当我调用函数

autoSwapToToken
,程序卡住

请帮我在 nodejs 中写一个函数,自动将多个钱包从 BNB 转换为特殊 Token

node.js swap binance-smart-chain web3 pancakeswap
© www.soinside.com 2019 - 2024. All rights reserved.