function approveUsers(address[] users) onlyOwner {
for(uint i=0; i<users.length; i++) {
approvedUsers[users[i]] = true; //Mapping {address: bool}
ApproveUserForPreSale(users[i], approvedUsers[users[i]]); //Event
}
}
Я получаю массив нулевой длины с этим фрагментом. И если я возьму пользователей как статический массив (адрес [10] пользователей), я получу правильную длину, но содержимое будет 0 (0x0..).
edit Это работает в Remix Studio, как и ожидалось, но не в кошельке Ethereum.
Здесь происходит несколько вещей.
Главная проблема
Ваша функция ничего не возвращает. Похоже, он устанавливает бит в mapping
значение true, и я ожидаю, что это, вероятно, работает, насколько это возможно.
** Другая проблема №1 **
Использование динамического массива в сигнатуре функции означает, что в настоящее время эта функция не сможет взаимодействовать с другими контрактами. Рассмотрите подход с подписью фиксированной длины, например, ``` function AppAppUser(адрес пользователя) onlyOwner return(bool Success) { ApprovedUsers[user] = true; // событие ... вернуть true; }
** Другая проблема №2 **
for i<0; i<unlimited ...
— это антипаттерн, который перестанет работать, когда стоимость газа превысит блок gasLimit. Подход с фиксированной длиной, который имеет дело с одним пользователем за раз, решит эту проблему.
Приведенные здесь шаблоны могут сэкономить вам время: существуют ли хорошо решенные и простые шаблоны хранения для Solidity?
Надеюсь, поможет.
Исмаэль
approveUsers
? Это из javascript или из другого контракта на солидность?Девашиш Пури