### Question:
CliqueBlockHashing { public static Address recoverProposerAddress( final BlockHeader header, final CliqueExtraData cliqueExtraData) { if (!cliqueExtraData.getProposerSeal().isPresent()) { if (header.getNumber() == BlockHeader.GENESIS_BLOCK_NUMBER) { return Address.ZERO; } throw new IllegalArgumentException( "Supplied cliqueExtraData does not include a proposer " + "seal"); } final Hash proposerHash = calculateDataHashForProposerSeal(header, cliqueExtraData); return Util.signatureToAddress(cliqueExtraData.getProposerSeal().get(), proposerHash); }  static Hash calculateDataHashForProposerSeal(
      final BlockHeader header, final CliqueExtraData cliqueExtraData); static Address recoverProposerAddress(
      final BlockHeader header, final CliqueExtraData cliqueExtraData);  }### Answer:
@Test public void recoverProposerAddressFromSeal() { final CliqueExtraData cliqueExtraData = CliqueExtraData.decode(expectedHeader); final Address proposerAddress = CliqueBlockHashing.recoverProposerAddress(expectedHeader, cliqueExtraData); assertThat(VALIDATORS_IN_HEADER.contains(proposerAddress)).isTrue(); }
@Test public void recoverProposerAddressForGenesisBlockReturnsAddressZero() { final BlockHeader genesisBlockHeader = createGenesisBlock(); final CliqueExtraData cliqueExtraData = CliqueExtraData.decode(genesisBlockHeader); final Address proposerAddress = CliqueBlockHashing.recoverProposerAddress(genesisBlockHeader, cliqueExtraData); assertThat(proposerAddress).isEqualTo(Address.ZERO); }