Поле отправки транзакций "от" должно быть определено!

Я пытаюсь вызвать функцию контракта, который был развернут в Ganache. Я пытаюсь вызвать функцию, которая делает выплаты на несколько адресов и может быть вызвана только владельцем. Когда я вызываю функцию, я получаю эту ошибку:

 The send transactions "from" field must be defined!

Я не понимаю проблемы. Все, что делает этот контракт, это то, что он переводит баланс контракта на несколько адресов. Это не подлежит оплате. Итак, как мне решить эту ошибку?

Функция контракта:

function distributePrizes() public _ownerOnly{
    uint numberWinner = generateNumber();
    address[100] memory winners; // We have to create a temporary in memory array with fixed size
      uint256 count = 0; // This is the count for the array of winners
      for(uint256 i = 0; i < players.length; i++){
         address playerAddress = players[i];
         if(playerInfo[playerAddress].numberSelected == numberWinner){
            winners[count] = playerAddress;
            count++;
         }
         delete playerInfo[playerAddress]; // Delete all the players
      }
      winnerArray = winners;
      players.length = 0; // Delete all the players array
      uint256 winnerEtherAmount = totalBet / winners.length; // How much each winner gets
      for(uint256 j = 0; j < count; j++){
         if(winners[j] != address(0)) // Check that the address in this fixed array is not empty
         winners[j].transfer(winnerEtherAmount);
      }

    }

Функция React, в которой вызывается функция контракта:

selectWinner = async (e) =>{
    const { accounts, contract, web3 } = this.state;
    const balance = await web3.eth.getBalance(contract.address);
    //console.log('Winners selected')
    await contract.distributePrizes();
    const newBalance = await web3.eth.getBalance(contract.address);
    const winners = await contract.winnerArray;
    this.setState({winnerAddress: winners, totalBet: newBalance})
  }
Как насчет того, чтобы поделиться кодом здесь?
Я поделился некоторым кодом

Ответы (1)

Если вы используете accounts[0]учетную запись по умолчанию, измените эту строку:

await contract.distributePrizes();

к:

await contract.distributePrizes({from: accounts[0]});

Или когда вы создаете свой web3объект:

let accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0]

Другой вариант: если у вас есть gethили truffleустановлен, откройте консоль, например, выполнив:

geth attach http://127.0.0.1:8545илиtruffle console

а потом:

eth.defaultAccount = eth.accounts[0](для geth) или

let accounts = await web3.eth.getAccounts();
web3.eth.defaultAccount = accounts[0]

дляtruffle

Если вы хотите accounts[0]быть учетной записью по умолчанию, конечно.

Примечание: web3.eth.accountsустарело. Используйте web3.eth.getAccounts()вместо этого