Я пытаюсь вызвать функцию контракта, который был развернут в 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})
}
Если вы используете 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()
вместо этого
хорошая вибрация
Рохан Дхар