#ethereum #solidity #web3 #web3js #ethers.js
Вопрос:
Я использую walletconnect/metamask в качестве кошельков, а web3Provider-в качестве поставщика для моей функции «купить токены».
Я пытаюсь использовать populateTransaction.ИМЯ МЕТОДА для совершения транзакции с моего кошелька на метод контрактов (с переводом BNB).
Я так не уверен, что делаю не так, и я возился уже более 6 часов и не могу понять это. :/
Я пытаюсь перенести некоторые BNB в контракт, вызвав функцию контрактов «BuyTokensForBnb» (например, мы можем сделать это с помощью Remix IDE). Но я продолжаю сталкиваться с ошибками :/
const purchaseTokens2 = async () => {
const HODLER = await new ethers.Contract(address, abi, web3providerState);
const tx = [{
nonce: "0x00", // ignored by MetaMask
to: HODLER.address, // Required except during contract publications. (LINK CONTRACT ADDRESS MAINNET/TESTNET)
value: "0xde0b6b3a7640000", // Only required to send ether to the recipient from the initiating external account.
data: '',
// Optional, but used for defining smart contract creation and interaction.
chainId: "0x61" // Used to prevent transaction reuse across blockchains. Auto filled by MetaMask.
}];
let resp = HODLER.populateTransaction.buyTokensForBnb(0, tx)
const signer = await web3providerState.getSigner();
console.log("Non signer", web3providerState);
console.log("Signer, ", signer);
console.log("Account:", await signer.getAddress());
let tx2 = await signer.sendTransaction(tx);
let signature = await signer.signMessage("Hello world");
console.log(tx2, signature);
}
Функция BuyTokensForBnb
function buyTokensForBnb() public payable {
require(msg.value > minbuy, "MINIMUM PURCHASE IS 0.01 BNB");
require(msg.value <= maxbuy, "MAX BUY IS 10 BNB");
require(getPresaleState() == 5 || getPresaleState() == 4, "PRESALE IS NOT RUNNING(COULD BE CANCELLED OR ENDED, OR FINALIZED)");
if(block.timestamp > endDate || block.timestamp < startDate) {
revert("You can't buy this token yet or Presale had already ended, tokens cannot be purchased any longer.");
} else {
if(getPresaleState() == 4) {
//WHITELISTED PRESALE
PresaleWallet storage presaleWallet = presaleWallets[msg.sender];
if(presaleWallet.whitelisted == false) {
if(block.timestamp >= whitelistedEndDate) {
presaleState = PresaleState.LIVE;
generateReceiptAndUserPurchasedTokens(msg.sender, msg.value);
} else {
revert('REFUNDED, YOUR WALLET IS NOT WHITELISTED');
}
} else {
//make purchase, update tokens.
generateReceiptAndUserPurchasedTokens(msg.sender, msg.value);
}
} else if(getPresaleState() == 5) {
generateReceiptAndUserPurchasedTokens(msg.sender, msg.value);
} else {
revert('REFUNDED, PRESALE IS NOT LIVE OR IN WHITELISTED MODE');
}
}
}
Любая помощь будет очень признательна!!
С уважением, Даниэль 🙂
Комментарии:
1. Можете ли вы показать
buyTokensForBnb()
определение функции солидности? Из сообщения об ошибке следует, что оно принимает 0 аргументов, а не 2, которые вы передаете… Кроме того,populateTransaction
его следует использовать вsigner
экземпляре, а не вcontract
instane.2. Конечно, приятель, я добавил код солидности 🙂 Кстати, спасибо за быстрый ответ @PetrHejda