Недопустимое количество аргументов для функции-получателя без переданных аргументов

Я получаю эту ошибку при попытке вызвать getUsersфункцию получения из контракта ниже: Invalid number of arguments to Solidity function. Запуск на Truffle в режиме разработки.

mapping (address => User) Users;
address[] usersByAddress;

struct User {
    string handle;
    bytes32 city;
    bytes32 state;
    bytes32 country;
}

function registerNewUser(string handle, bytes32 city, bytes32 state, bytes32 country) returns (bool success) {
    address thisNewAddress = msg.sender;
    if(bytes(Users[msg.sender].handle).length == 0 && bytes(handle).length != 0){
        Users[thisNewAddress].handle = handle;
        Users[thisNewAddress].city = city;
        Users[thisNewAddress].state = state;
        Users[thisNewAddress].country = country;
        usersByAddress.push(thisNewAddress);  
        return true;
    } else {
        return false;       
    }
  }

//getters
function getUsers() view returns (address[]) { return usersByAddress; }

function getUser(address userAddress) view returns (string, bytes32, bytes32, bytes32) {
    return (Users[userAddress].handle, Users[userAddress].city, Users[userAddress].state, Users[userAddress].country);
}

Допустим, вы развернули этот контракт в тестовой сети Truffle development и получили экземпляр объекта x. Я могу создать пользователя, отправив транзакцию x.registerNewUser("Bob123","Orlando","FL","USA"). Затем я запускаю x.getUser(web3.eth.accounts[0])и получаю следующий массив:

['BOB123', '0x4F726C616E646F00000000000000000000000000000000000000000000000000', '0x464C000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f00000000000000f00000000000000f0000000000000000000000f00000000000000f0000000000000000000000f000000000000000000f00000000000000f00000000000000000000f000000000000000000000000f0000000000000000f00000000000000000000f0000000000000000000000000000та000000000000000000000000ff что

Это ожидается, поскольку последние 3 элемента в массиве имеют тип bytes32. Я ожидаю, x.getUsersчто или x.getUsers.call()вернут массив из одного адреса (мой адрес в web3.eth.accounts[0]), но вместо этого получаю invalid Solidity argumentsсообщение об ошибке, даже если в getUsers.

Пожалуйста, предоставьте код, где вы вызываете getUser
Я отредактировал вопрос с помощью кода, который я использую для регистрации пользователя и вызова функций getUserи getUsers.
Это определенно проблема Truffle — ваш код прекрасно работает в Remix. На Truffle и web3.js GitHub есть некоторые проблемы с предлагаемыми решениями — стоит попробовать. Дайте нам знать, если это поможет.
Спасибо @benjaminion за эти ссылки, удаление артефактов в /build предотвращает появление ошибки.

Ответы (1)

Попробуй это:

x.getUser.call(web3.eth.accounts[0],{from: 'YOUR ADDRESS'}, function (error, result) {
    console.log('error ' + error);
    console.log('result ' + result);
});
Проблем с запуском функции нет getUser(). Как указано в моем вопросе, это файл getUsers(). Единственный способ, с помощью которого я мог заставить его работать, заключался в том, что @benjaminion предложил удалить артефакты в /build, migrate --reset, и новые артефакты будут записаны в /build, что затем предотвращает появление ошибок при вызове getUsers().