Este es mi contrato donde estoy creando una lista de miembros que usarán una addVote
función. La allMembersVoted
función siempre parece regresar false
a pesar de que el depurador de Remix muestra que la función regresa true
correctamente. ¿Me pueden ayudar a encontrar lo que falta?
El flujo es así:
Comprobar si todos han votado
struct ListMembers {
bytes32 listOwner;
bytes32[] members;
}
ListMembers public lm;
mapping(bytes32 => bool) public addedMembers;
// Constructor to initialise the ListMembers struct
function Lister(bytes32 listOwner) {
lm.listOwner = listOwner;
lm.members.length = 1;
lm.members[0] = listOwner;
}
function buildList(bytes32[] listMembers) {
lm.members.length = listMembers.length + 1;
for (uint i = 0; i < listMembers.length; i++) {
lm.members[i + 1] = listMembers[i];
}
}
function addVote(bytes32 member, uint256 number) {
if (memberAdded(member) == true) { // Check double votes
return;
} else {
addedMembers[member] = true; // Confirm that vote added
if (memberIsOwner(member) == true) {
// Add vote with weight
} else {
// Add vote without weight
}
}
}
function memberAdded(bytes32 member) returns (bool) {
return addedMembers[member];
}
function allMembersVoted() returns (bool) {
bool voted = true;
for (uint i = 0; i < lm.members.length; i++) {
voted = voted && addedMembers[lm.members[i]];
}
return voted;
}
Aparentemente, el culpable fue la forma en que estaba agregando a las matrices. Cambié la adición a través del índice push()
y las cosas están funcionando ahora. Entonces, lm.members[i + 1] = listMembers[i]
se convirtió en lm.members.push(listMembers[i]))
.