我正在编写一个 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