syntax = "proto3";
package types;

// This file is copied from http://github.com/tendermint/abci

//----------------------------------------
// Message types

// Not being used 
// Could be added to request/response
// so we don't have to type switch
// (would be twice as fast, but we're talking about 15ns)
enum MessageType {
  NullMessage = 0x00;

  Echo            = 0x01;
  Flush           = 0x02;
  Info            = 0x03;
  SetOption       = 0x04;
  Exception       = 0x05;
  DeliverTx        = 0x11;
  CheckTx         = 0x12;
  Commit          = 0x13;
  Query           = 0x14;
  InitChain       = 0x15;
  BeginBlock      = 0x16;
  EndBlock        = 0x17;
}

//----------------------------------------
// Code types

enum CodeType {
  OK                    = 0;

  // General response codes, 0 ~ 99
  InternalError         = 1;
  EncodingError         = 2;
  BadNonce              = 3;
  Unauthorized          = 4;
  InsufficientFunds     = 5;
  UnknownRequest        = 6;

  // Reserved for basecoin, 100 ~ 199
  BaseDuplicateAddress  = 101;
  BaseEncodingError     = 102;
  BaseInsufficientFees  = 103;
  BaseInsufficientFunds = 104;
  BaseInsufficientGasPrice = 105;
  BaseInvalidInput      = 106;
  BaseInvalidOutput     = 107;
  BaseInvalidPubKey     = 108;
  BaseInvalidSequence   = 109;
  BaseInvalidSignature  = 110;
  BaseUnknownAddress    = 111;
  BaseUnknownPubKey     = 112;
  BaseUnknownPlugin     = 113;

  // Reserved for governance, 200 ~ 299
  GovUnknownEntity      = 201;
  GovUnknownGroup       = 202;
  GovUnknownProposal    = 203;
  GovDuplicateGroup     = 204;
  GovDuplicateMember    = 205;
  GovDuplicateProposal  = 206;
  GovDuplicateVote      = 207;
  GovInvalidMember      = 208;
  GovInvalidVote        = 209;
  GovInvalidVotingPower = 210;

}

//----------------------------------------
// Request types

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

message RequestEcho {
	string message = 1;
}

message RequestFlush {
}

message RequestInfo {
}

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

message RequestDeliverTx{
	bytes tx	 = 1;
}

message RequestCheckTx{
	bytes tx	 = 1;
}

message RequestQuery{
	bytes query	 = 1;
}

message RequestCommit{
}

message RequestInitChain{
	repeated Validator validators = 1;
}

message RequestBeginBlock{
	bytes hash = 1;
	Header header = 2;
}

message RequestEndBlock{
	uint64 height = 1;
}

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


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

message ResponseException{
	string error = 1;
}

message ResponseEcho {
	string message = 1;
}

message ResponseFlush{
}

message ResponseInfo {
	string data = 1;
	string version = 2;
	uint64 last_block_height = 3;
	bytes last_block_app_hash = 4;
}

message ResponseSetOption{
	string log = 1;
}

message ResponseDeliverTx{
	CodeType          code        = 1;
	bytes             data        = 2;
	string            log         = 3;
}

message ResponseCheckTx{
	CodeType          code        = 1;
	bytes             data        = 2;
	string            log         = 3;
}

message ResponseQuery{
	CodeType          code        = 1;
	bytes             data        = 2;
	string            log         = 3;
}

message ResponseCommit{
	CodeType          code        = 1;
	bytes             data        = 2;
	string            log         = 3;
}


message ResponseInitChain{
}

message ResponseBeginBlock{
}

message ResponseEndBlock{
	repeated Validator diffs = 4;
}

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

message Header {
	string chain_id = 1;
	uint64 height = 2;
	uint64 time = 3;
	uint64 num_txs = 4;
	BlockID last_block_id = 5;
	bytes last_commit_hash = 6;
	bytes data_hash = 7;
	bytes validators_hash = 8;
	bytes app_hash = 9; 
}

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

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

message Validator {
            bytes             pubKey      = 1;
            uint64            power       = 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);
}
