diff --git a/nucypher/blockchain/eth/sol/source/contracts/MiningAdjudicator.sol b/nucypher/blockchain/eth/sol/source/contracts/MiningAdjudicator.sol index 1210fec46..bf5b7fda3 100644 --- a/nucypher/blockchain/eth/sol/source/contracts/MiningAdjudicator.sol +++ b/nucypher/blockchain/eth/sol/source/contracts/MiningAdjudicator.sol @@ -17,13 +17,19 @@ contract MiningAdjudicator is Upgradeable { using UmbralDeserializer for bytes; using SafeMath for uint256; + event CFragEvaluated( + bytes32 indexed evaluationHash, + address indexed miner, + address indexed investigator, + bool correctness + ); + uint8 public constant UMBRAL_PARAMETER_U_SIGN = 0x02; uint256 public constant UMBRAL_PARAMETER_U_XCOORD = 0x03c98795773ff1c241fc0b1cced85e80f8366581dda5c9452175ebd41385fa1f; uint256 public constant UMBRAL_PARAMETER_U_YCOORD = 0x7880ed56962d7c0ae44d6f14bb53b5fe64b31ea44a41d0316f3a598778f0f936; // used only for upgrading bytes32 constant RESERVED_CAPSULE_AND_CFRAG_BYTES = bytes32(0); address constant RESERVED_ADDRESS = 0x0; - // TODO events MinersEscrow public escrow; SignatureVerifier.HashAlgorithm public hashAlgorithm; @@ -120,6 +126,9 @@ contract MiningAdjudicator is Upgradeable { if (!isCapsuleFragCorrect(_capsuleBytes, _cFragBytes, _preComputedData)) { (uint256 penalty, uint256 reward) = calculatePenaltyAndReward(miner, minerValue); escrow.slashMiner(miner, penalty, msg.sender, reward); + emit CFragEvaluated(evaluationHash, miner, msg.sender, false); + } else { + emit CFragEvaluated(evaluationHash, miner, msg.sender, true); } } diff --git a/tests/blockchain/eth/contracts/main/mining_adjudicator/test_mining_adjudicator.py b/tests/blockchain/eth/contracts/main/mining_adjudicator/test_mining_adjudicator.py index 1383aa85d..279c196f6 100644 --- a/tests/blockchain/eth/contracts/main/mining_adjudicator/test_mining_adjudicator.py +++ b/tests/blockchain/eth/contracts/main/mining_adjudicator/test_mining_adjudicator.py @@ -89,6 +89,7 @@ def fragments(metadata): @pytest.mark.slow def test_evaluate_cfrag(testerchain, escrow, adjudicator_contract): creator, miner, wrong_miner, *everyone_else = testerchain.interface.w3.eth.accounts + evaluation_log = adjudicator_contract.events.CFragEvaluated.createFilter(fromBlock='latest') # TODO: Move this to an integration test? umbral_params = default_params() @@ -171,6 +172,14 @@ def test_evaluate_cfrag(testerchain, escrow, adjudicator_contract): assert adjudicator_contract.functions.evaluatedCFrags(data_hash).call() assert 1000 == escrow.functions.minerInfo(miner).call()[0] + events = evaluation_log.get_all_entries() + assert 1 == len(events) + event_args = events[0]['args'] + assert data_hash == event_args['evaluationHash'] + assert miner == event_args['miner'] + assert creator == event_args['investigator'] + assert event_args['correctness'] + # Can't evaluate miner with data that already was checked with pytest.raises((TransactionFailed, ValueError)): tx = adjudicator_contract.functions.evaluateCFrag(*args).transact() @@ -291,6 +300,7 @@ def test_evaluate_cfrag(testerchain, escrow, adjudicator_contract): # assert adjudicator_contract.functions.evaluatedCFrags(data_hash).call() # assert 800 == escrow.functions.minerInfo(miner).call()[0] # TODO tests for penalty/reward calculation + # TODO tests for events @pytest.mark.slow