syntax = "proto3";
package abci_vendor;

import "google/protobuf/timestamp.proto";

// NOTE: this file is an merge with the following content from vendors folder

// ================================================================
// import "github.com/tendermint/tendermint/libs/common/proto";
// ================================================================
message KVPair {
  bytes key = 1;
  bytes value = 2;
}

// ================================================================
// import "github.com/tendermint/tendermint/crypto/merkle/merkle.proto";
// ================================================================
// ProofOp defines an operation used for calculating Merkle root
// The data could be arbitrary format, providing nessecary data
// for example neighbouring node hash
message ProofOp {
  string type = 1;
  bytes key = 2;
  bytes data = 3;
}

// Proof is Merkle proof defined by the list of ProofOps
message Proof { repeated ProofOp ops = 1; }

//----------------------------------------
// Misc.

// BlockParams contains limits on the block size and timestamp.
message BlockParams {
  // Note: must be greater than 0
  int64 max_bytes = 1;
  // Note: must be greater or equal to -1
  int64 max_gas = 2;
}

// EvidenceParams contains limits on the evidence.
message EvidenceParams {
  // Note: must be greater than 0
  int64 max_age = 1;
}

// ValidatorParams contains limits on validators.
message ValidatorParams {
  repeated string pub_key_types = 1;
}

// ConsensusParams contains all consensus-relevant parameters
// that can be adjusted by the abci app
message ConsensusParams {
  BlockParams block = 1;
  EvidenceParams evidence = 2;
  ValidatorParams validator = 3;
}

message LastCommitInfo {
  int32 round = 1;
  repeated VoteInfo votes = 2;
}

//----------------------------------------
// Blockchain Types

message Version {
  uint64 Block = 1;
  uint64 App = 2;
}

message BlockID {
  bytes hash = 1;
  PartSetHeader parts_header = 2;
}

message PartSetHeader {
  int32 total = 1;
  bytes hash = 2;
}

// Validator
message Validator {
  bytes address = 1;
  //PubKey pub_key = 2;
  int64 power = 3;
}

// ValidatorUpdate
message ValidatorUpdate {
  PubKey pub_key = 1;
  int64 power = 2;
}

// VoteInfo
message VoteInfo {
  Validator validator = 1;
  bool signed_last_block = 2;
}

message PubKey {
  string type = 1;
  bytes  data = 2;
}

message Evidence {
  string type = 1;
  Validator validator = 2;
  int64 height = 3;
  google.protobuf.Timestamp time = 4;
  int64 total_voting_power = 5;
}

message Header {
  // basic block info
  Version version = 1;
  string chain_id = 2;
  int64 height = 3;
  google.protobuf.Timestamp time = 4;
  int64 num_txs = 5;
  int64 total_txs = 6;

  // prev block info
  BlockID last_block_id = 7;

  // hashes of block data
  bytes last_commit_hash = 8; // commit from validators from the last block
  bytes data_hash = 9;        // transactions

  // hashes from the app output from the prev block
  bytes validators_hash = 10;   // validators for the current block
  bytes next_validators_hash = 11;   // validators for the next block
  bytes consensus_hash = 12;   // consensus params for current block
  bytes app_hash = 13;         // state after txs from the previous block
  bytes last_results_hash = 14;// root hash of all results from the txs from the previous block

  // consensus info
  bytes evidence_hash = 15;    // evidence included in the block
  bytes proposer_address = 16; // original proposer of the block
}


// ================================================================
// import "github.com/tendermint/tendermint/abci/types/proto";
// NOTE: gogoproto related attributes on each field is removed, since we are
// using elixir
// ================================================================
//----------------------------------------
// Request types

message RequestEcho { string message = 1; }

message RequestFlush {}

message RequestInfo {
  string version = 1;
  uint64 block_version = 2;
  uint64 p2p_version = 3;
}

// nondeterministic
message RequestSetOption {
  string key = 1;
  string value = 2;
}

message RequestInitChain {
  google.protobuf.Timestamp time = 1;
  string chain_id = 2;
  ConsensusParams consensus_params = 3;
  repeated ValidatorUpdate validators = 4;
  bytes app_state_bytes = 5;
}

message RequestQuery {
  bytes data = 1;
  string path = 2;
  int64 height = 3;
  bool prove = 4;
}

message RequestBeginBlock {
  bytes hash = 1;
  Header header = 2;
  LastCommitInfo last_commit_info = 3;
  repeated Evidence byzantine_validators = 4;
}

message RequestCheckTx { bytes tx = 1; }

message RequestDeliverTx { bytes tx = 1; }

message RequestEndBlock { int64 height = 1; }

message RequestCommit {}

message Request {
  oneof value {
    RequestEcho echo = 2;
    RequestFlush flush = 3;
    RequestInfo info = 4;
    RequestSetOption set_option = 5;
    RequestInitChain init_chain = 6;
    RequestQuery query = 7;
    RequestBeginBlock begin_block = 8;
    RequestCheckTx check_tx = 9;
    RequestDeliverTx deliver_tx = 19;
    RequestEndBlock end_block = 11;
    RequestCommit commit = 12;
  }
}
//----------------------------------------
// Response types

// nondeterministic
message ResponseException { string error = 1; }

message ResponseEcho { string message = 1; }

message ResponseFlush {}

message ResponseInfo {
  string data = 1;

  string version = 2;
  uint64 app_version = 3;

  int64 last_block_height = 4;
  bytes last_block_app_hash = 5;
}

// nondeterministic
message ResponseSetOption {
  uint32 code = 1;
  // bytes data = 2;
  string log = 3;
  string info = 4;
}

message ResponseInitChain {
  ConsensusParams consensus_params = 1;
  repeated ValidatorUpdate validators = 2;
}

message ResponseQuery {
  uint32 code = 1;
  // bytes data = 2; // use "value" instead.
  string log = 3;  // nondeterministic
  string info = 4; // nondeterministic
  int64 index = 5;
  bytes key = 6;
  bytes value = 7;
  Proof proof = 8;
  int64 height = 9;
  string codespace = 10;
}

message ResponseBeginBlock { repeated KVPair tags = 1; }

message ResponseCheckTx {
  uint32 code = 1;
  bytes data = 2;
  string log = 3;  // nondeterministic
  string info = 4; // nondeterministic
  int64 gas_wanted = 5;
  int64 gas_used = 6;
  repeated KVPair tags = 7;
  string codespace = 8;
}

message ResponseDeliverTx {
  uint32 code = 1;
  bytes data = 2;
  string log = 3;  // nondeterministic
  string info = 4; // nondeterministic
  int64 gas_wanted = 5;
  int64 gas_used = 6;
  repeated KVPair tags = 7;
  string codespace = 8;
}

message ResponseEndBlock {
  repeated ValidatorUpdate validator_updates = 1;
  ConsensusParams consensus_param_updates = 2;
  repeated KVPair tags = 3;
}

message ResponseCommit {
  // reserve 1
  bytes data = 2;
}

message Response {
  oneof value {
    ResponseException exception = 1;
    ResponseEcho echo = 2;
    ResponseFlush flush = 3;
    ResponseInfo info = 4;
    ResponseSetOption set_option = 5;
    ResponseInitChain init_chain = 6;
    ResponseQuery query = 7;
    ResponseBeginBlock begin_block = 8;
    ResponseCheckTx check_tx = 9;
    ResponseDeliverTx deliver_tx = 10;
    ResponseEndBlock end_block = 11;
    ResponseCommit commit = 12;
  }
}

// ================================================================
// import "github.com/tendermint/tendermint/rpc/grpc/proto";
// NOTE: gogoproto related attributes on each field is removed, since we are
// using elixir
// ================================================================
message RequestPing {}

message RequestBroadcastTx { bytes tx = 1; }

//----------------------------------------
// Response types

message ResponsePing {}

message ResponseBroadcastTx {
  ResponseCheckTx check_tx = 1;
  ResponseDeliverTx deliver_tx = 2;
}

//----------------------------------------
// Service Definition

service ABCIApplication {
  rpc Echo(RequestEcho) returns (ResponseEcho);
  rpc Flush(RequestFlush) returns (ResponseFlush);
  rpc Info(RequestInfo) returns (ResponseInfo);
  rpc SetOption(RequestSetOption) returns (ResponseSetOption);
  rpc DeliverTx(RequestDeliverTx) returns (ResponseDeliverTx);
  rpc CheckTx(RequestCheckTx) returns (ResponseCheckTx);
  rpc Query(RequestQuery) returns (ResponseQuery);
  rpc Commit(RequestCommit) returns (ResponseCommit);
  rpc InitChain(RequestInitChain) returns (ResponseInitChain);
  rpc BeginBlock(RequestBeginBlock) returns (ResponseBeginBlock);
  rpc EndBlock(RequestEndBlock) returns (ResponseEndBlock);
}
