RocketDAONodeTrustedAction - ambiguous event emitted in actionChallengeDecide
`actionChallengeDecide` succeeds and emits `challengeSuccess=False` in case the challenged node defeats the challenge. It also emits the same event if another node calls `actionChallengeDecided` before the refute window passed. This ambiguity may make a defeated challenge indistinguishable from a challenge that was attempted to be decided too early (unless the component listening for the event also checks the refute window).\\n```\\n    // Allow the challenged member to refute the challenge at anytime. If the window has passed and the challenge node does not run this method, any member can decide the challenge and eject the absent member\\n    // Is it the node being challenged?\\n    if(\\_nodeAddress == msg.sender) {\\n        // Challenge is defeated, node has responded\\n        deleteUint(keccak256(abi.encodePacked(daoNameSpace, "member.challenged.block", \\_nodeAddress)));\\n    }else{\\n        // The challenge refute window has passed, the member can be ejected now\\n        if(getUint(keccak256(abi.encodePacked(daoNameSpace, "member.challenged.block", \\_nodeAddress))).add(rocketDAONodeTrustedSettingsMembers.getChallengeWindow()) < block.number) {\\n            // Node has been challenged and failed to respond in the given window, remove them as a member and their bond is burned\\n            \\_memberRemove(\\_nodeAddress);\\n            // Challenge was successful\\n            challengeSuccess = true;\\n        }\\n    }\\n    // Log it\\n    emit ActionChallengeDecided(\\_nodeAddress, msg.sender, challengeSuccess, block.timestamp);\\n}\\n```\\n
Avoid ambiguities when emitting events. Consider throwing an exception in the else branch if the refute window has not passed yet (minimal gas savings; it's clear that the call failed; other components can rely on the event only being emitted if there was a decision.
```\\n    // Allow the challenged member to refute the challenge at anytime. If the window has passed and the challenge node does not run this method, any member can decide the challenge and eject the absent member\\n    // Is it the node being challenged?\\n    if(\\_nodeAddress == msg.sender) {\\n        // Challenge is defeated, node has responded\\n        deleteUint(keccak256(abi.encodePacked(daoNameSpace, "member.challenged.block", \\_nodeAddress)));\\n    }else{\\n        // The challenge refute window has passed, the member can be ejected now\\n        if(getUint(keccak256(abi.encodePacked(daoNameSpace, "member.challenged.block", \\_nodeAddress))).add(rocketDAONodeTrustedSettingsMembers.getChallengeWindow()) < block.number) {\\n            // Node has been challenged and failed to respond in the given window, remove them as a member and their bond is burned\\n            \\_memberRemove(\\_nodeAddress);\\n            // Challenge was successful\\n            challengeSuccess = true;\\n        }\\n    }\\n    // Log it\\n    emit ActionChallengeDecided(\\_nodeAddress, msg.sender, challengeSuccess, block.timestamp);\\n}\\n```\\n