Как вызвать метод контракта и отправить значение с его помощью в web3Provider?

#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