syntax = "proto3";
package tendermint.types;

option go_package = "github.com/tendermint/tendermint/proto/tendermint/types";

import "gogoproto/gogo.proto";
import "google/protobuf/timestamp.proto";
import "tendermint/types/types.proto";
import "tendermint/types/validator.proto";

message Evidence {
  oneof sum {
    DuplicateVoteEvidence     duplicate_vote_evidence      = 1;
    LightClientAttackEvidence light_client_attack_evidence = 2;
  }
}

// DuplicateVoteEvidence contains evidence of a validator signed two conflicting votes.
message DuplicateVoteEvidence {
  tendermint.types.Vote       vote_a = 1;
  tendermint.types.Vote       vote_b = 2;
  int64                       total_voting_power = 3;
  int64                       validator_power = 4;
  google.protobuf.Timestamp   timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
}

// LightClientAttackEvidence contains evidence of a set of validators attempting to mislead a light client.
message LightClientAttackEvidence {
  tendermint.types.LightBlock         conflicting_block = 1;
  int64                               common_height     = 2;
  repeated tendermint.types.Validator byzantine_validators = 3;
  int64                               total_voting_power = 4;
  google.protobuf.Timestamp           timestamp = 5 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
}

message EvidenceList {
  repeated Evidence evidence = 1 [(gogoproto.nullable) = false];
}
