Repository: tendermint/rust-abci (language: rust)

Issue:
Add a changelog?

Unable to compile EmptyApp example! (::protobuf::VERSION_2_8_0)
## Summary of Bug
Unable to compile a simple example due to erros of type:

error[E0425]: cannot find value `VERSION_2_8_0` in module `protobuf`
  --> /.../.cargo/registry/src/github.com-1ecc6299db9ec823/abci-0.6.1/src/messages/abci.rs:27:49
   |
27 | const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_8_0;
   |                                                 ^^^^^^^^^^^^^ help: a constant with a similar name exists: `VERSION_2_8_1`

## Version
github.com-1ecc6299db9ec823/abci-0.6.1

## Steps to Reproduce
Just trying to setup the framework with the example from https://docs.rs/abci/0.6.1/abci/

#### For Admin Use
- [ ] Not duplicate issue
- [ ] Appropriate labels applied
- [ ] Appropriate contributors tagged
- [ ] Contributor assigned/self-assigned


Discussion / hints:
Yes, we absolutely should add a changelog.


Fix patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a30a308..a922aa1 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,15 @@
 # CHANGELOG
 
-January 2, 2020_
+_March 3, 2020_
+
+## v0.7.0
+
+### BREAKING CHANGES:
+
+- [\#116](https://github.com/tendermint/rust-abci/pull/116): Tendermint 0.33.\*'s ABCI compatibility
+
+
+_January 2, 2020_
 
 Special thanks to external contributors on this release: @devashishdxt
 
diff --git a/Cargo.toml b/Cargo.toml
index ffa247b..dd7a49a 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
 [package]
 name = "abci"
-version = "0.6.5"
+version = "0.7.0"
 authors = ["Adrian Brink <adrian@brink-holdings.com>", "Jackson Lewis <st.japa6@gmail.com>", "Dave Bryson", "Tomas Tauber"]
 edition = "2018"
 license = "MIT/Apache-2.0"
@@ -13,7 +13,7 @@ include = ["src/**/*", "Cargo.toml"]
 
 [dependencies]
 bytes = "0.4"
-protobuf = "= 2.10.0"
+protobuf = "= 2.10.2"
 byteorder = "1.3.2"
 integer-encoding = "1.0.5"
 log = "0.4.8"
@@ -22,4 +22,4 @@ tokio = { version = "0.1", default-features = false, features = ["codec", "io",
 futures = "0.3"
 
 [build-dependencies]
-protobuf-codegen-pure = "= 2.10.0"
\ No newline at end of file
+protobuf-codegen-pure = "= 2.10.2"
diff --git a/Makefile b/Makefile
index 52b57c0..6adea77 100644
--- a/Makefile
+++ b/Makefile
@@ -1,17 +1,18 @@
 # Origin
-version_branch = v0.32.8
+version_branch = v0.33.1
 tendermint = https://raw.githubusercontent.com/tendermint/tendermint/$(version_branch)
 
 # Outputs
-tmkv = protobuf/github.com/tendermint/tendermint/libs/common/types.proto
-tmmerkle = protobuf/github.com/tendermint/tendermint/crypto/merkle/merkle.proto
-tmabci = protobuf/github.com/tendermint/tendermint/abci/types/types.proto
+tmkv = protobuf/libs/kv/types.proto
+tmmerkle = protobuf/crypto/merkle/merkle.proto
+tmabci = protobuf/abci/types/types.proto
+third_party = protobuf/third_party/proto/gogoproto/gogo.proto
 
 # You *only* need to run this to rebuild protobufs from the tendermint source
 update-proto:
 	curl $(tendermint)/abci/types/types.proto > $(tmabci)
-	curl $(tendermint)/libs/common/types.proto > $(tmkv)
+	curl $(tendermint)/libs/kv/types.proto > $(tmkv)
 	curl $(tendermint)/crypto/merkle/merkle.proto > $(tmmerkle)
 	sed 's@package types;@package abci;@' $(tmabci) > protobuf/abci.proto
 	curl $(tendermint)/version/version.go | grep -F -eTMCoreSem -eABCISemVer > version.txt
-	
+	curl $(tendermint)/$(third_party) > $(third_party)
diff --git a/README.md b/README.md
index e47d43f..9cab78d 100644
--- a/README.md
+++ b/README.md
@@ -12,8 +12,8 @@ applications for [Tendermint](https://github.com/tendermint/tendermint/).
 
 ## Supported Version
 
-- Tendermint 0.32.7
-- ABCI 0.16.0
+- Tendermint 0.33.1
+- ABCI 0.16.1
 
 ## Installation
 
@@ -33,7 +33,7 @@ To use this library to build your own ABCI apps in Rust you have to include the
 
 ```toml
 [dependencies]
-abci = "0.6.4"
+abci = "0.7.0"
 ```
 
 ### Development
@@ -65,7 +65,8 @@ For a real life example of an ABCI application you can checkout [Cosmos SDK](htt
 
 | Tendermint | Rust-abci |
 | ---------- | :-------: |
-| 0.32.7     |   0.6.4   |
+| 0.33.1     |   0.7.0   |
+| 0.32.9     |   0.6.5   |
 | 0.31.7     |   0.5.4   |
 
 ## Documentation
diff --git a/build.rs b/build.rs
index d0ea35c..16de54a 100644
--- a/build.rs
+++ b/build.rs
@@ -5,8 +5,8 @@ fn main() {
         out_dir: "src/messages",
         input: &[
             "protobuf/abci.proto",
-            "protobuf/github.com/tendermint/tendermint/libs/common/types.proto",
-            "protobuf/github.com/tendermint/tendermint/crypto/merkle/merkle.proto",
+            "protobuf/libs/kv/types.proto",
+            "protobuf/crypto/merkle/merkle.proto",
         ],
         includes: &["protobuf"],
         customize: protobuf_codegen_pure::Customize {
diff --git a/protobuf/abci.proto b/protobuf/abci.proto
index c017b47..0d47ad9 100644
--- a/protobuf/abci.proto
+++ b/protobuf/abci.proto
@@ -1,42 +1,44 @@
 syntax = "proto3";
-package abci;
+package tendermint.abci.types;
+option  go_package = "github.com/tendermint/tendermint/abci/types";
 
 // For more information on gogo.proto, see:
 // https://github.com/gogo/protobuf/blob/master/extensions.md
-import "github.com/gogo/protobuf/gogoproto/gogo.proto";
-import "github.com/tendermint/tendermint/crypto/merkle/merkle.proto";
-import "github.com/tendermint/tendermint/libs/common/types.proto";
+import "third_party/proto/gogoproto/gogo.proto";
+import "crypto/merkle/merkle.proto";
+import "libs/kv/types.proto";
 import "google/protobuf/timestamp.proto";
+import "google/protobuf/duration.proto";
 
 // This file is copied from http://github.com/tendermint/abci
 // NOTE: When using custom types, mind the warnings.
 // https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues
 
-option (gogoproto.marshaler_all) = true;
-option (gogoproto.unmarshaler_all) = true;
-option (gogoproto.sizer_all) = true;
+option (gogoproto.marshaler_all)        = true;
+option (gogoproto.unmarshaler_all)      = true;
+option (gogoproto.sizer_all)            = true;
 option (gogoproto.goproto_registration) = true;
 // Generate tests
 option (gogoproto.populate_all) = true;
-option (gogoproto.equal_all) = true;
-option (gogoproto.testgen_all) = true;
+option (gogoproto.equal_all)    = true;
+option (gogoproto.testgen_all)  = true;
 
 //----------------------------------------
 // Request types
 
 message Request {
   oneof value {
-    RequestEcho echo = 2;
-    RequestFlush flush = 3;
-    RequestInfo info = 4;
-    RequestSetOption set_option = 5;
-    RequestInitChain init_chain = 6;
-    RequestQuery query = 7;
+    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;
+    RequestCheckTx    check_tx    = 9;
+    RequestDeliverTx  deliver_tx  = 19;
+    RequestEndBlock   end_block   = 11;
+    RequestCommit     commit      = 12;
   }
 }
 
@@ -44,50 +46,49 @@ message RequestEcho {
   string message = 1;
 }
 
-message RequestFlush {
-}
+message RequestFlush {}
 
 message RequestInfo {
-  string version = 1;
+  string version       = 1;
   uint64 block_version = 2;
-  uint64 p2p_version = 3;
+  uint64 p2p_version   = 3;
 }
 
 // nondeterministic
 message RequestSetOption {
-  string key = 1;
+  string key   = 1;
   string value = 2;
 }
 
 message RequestInitChain {
-  google.protobuf.Timestamp time = 1  [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
-  string chain_id = 2;
-  ConsensusParams consensus_params = 3;
-  repeated ValidatorUpdate validators = 4  [(gogoproto.nullable)=false];
-  bytes app_state_bytes = 5;
+  google.protobuf.Timestamp time     = 1 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
+  string                    chain_id = 2;
+  ConsensusParams           consensus_params = 3;
+  repeated ValidatorUpdate  validators       = 4 [(gogoproto.nullable) = false];
+  bytes                     app_state_bytes  = 5;
 }
 
 message RequestQuery {
-  bytes data = 1;
-  string path = 2;
-  int64 height = 3;
-  bool prove = 4;
+  bytes  data   = 1;
+  string path   = 2;
+  int64  height = 3;
+  bool   prove  = 4;
 }
 
 message RequestBeginBlock {
-  bytes hash = 1;
-  Header header = 2 [(gogoproto.nullable)=false];
-  LastCommitInfo last_commit_info = 3 [(gogoproto.nullable)=false];
-  repeated Evidence byzantine_validators = 4 [(gogoproto.nullable)=false];
+  bytes             hash                 = 1;
+  Header            header               = 2 [(gogoproto.nullable) = false];
+  LastCommitInfo    last_commit_info     = 3 [(gogoproto.nullable) = false];
+  repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false];
 }
 
 enum CheckTxType {
-  New = 0;
+  New     = 0;
   Recheck = 1;
 }
 
 message RequestCheckTx {
-  bytes tx = 1;
+  bytes       tx   = 1;
   CheckTxType type = 2;
 }
 
@@ -99,26 +100,25 @@ message RequestEndBlock {
   int64 height = 1;
 }
 
-message RequestCommit {
-}
+message RequestCommit {}
 
 //----------------------------------------
 // Response types
 
 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;
+    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;
+    ResponseCheckTx    check_tx    = 9;
+    ResponseDeliverTx  deliver_tx  = 10;
+    ResponseEndBlock   end_block   = 11;
+    ResponseCommit     commit      = 12;
   }
 }
 
@@ -131,16 +131,15 @@ message ResponseEcho {
   string message = 1;
 }
 
-message ResponseFlush {
-}
+message ResponseFlush {}
 
 message ResponseInfo {
   string data = 1;
 
-  string version = 2;
+  string version     = 2;
   uint64 app_version = 3;
 
-  int64 last_block_height = 4;
+  int64 last_block_height   = 4;
   bytes last_block_app_hash = 5;
 }
 
@@ -148,58 +147,62 @@ message ResponseInfo {
 message ResponseSetOption {
   uint32 code = 1;
   // bytes data = 2;
-  string log = 3;
+  string log  = 3;
   string info = 4;
 }
 
 message ResponseInitChain {
-  ConsensusParams consensus_params = 1;
-  repeated ValidatorUpdate validators = 2 [(gogoproto.nullable)=false];
+  ConsensusParams          consensus_params = 1;
+  repeated ValidatorUpdate validators       = 2 [(gogoproto.nullable) = false];
 }
 
 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;
-  merkle.Proof proof = 8;
-  int64 height = 9;
-  string codespace = 10;
+  string                         log       = 3;  // nondeterministic
+  string                         info      = 4;  // nondeterministic
+  int64                          index     = 5;
+  bytes                          key       = 6;
+  bytes                          value     = 7;
+  tendermint.crypto.merkle.Proof proof     = 8;
+  int64                          height    = 9;
+  string                         codespace = 10;
 }
 
 message ResponseBeginBlock {
-  repeated Event events = 1 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
+  repeated Event events = 1
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
 }
 
 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 Event events = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
+  uint32         code       = 1;
+  bytes          data       = 2;
+  string         log        = 3;  // nondeterministic
+  string         info       = 4;  // nondeterministic
+  int64          gas_wanted = 5;
+  int64          gas_used   = 6;
+  repeated Event events     = 7
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
   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 Event events = 7 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
+  uint32         code       = 1;
+  bytes          data       = 2;
+  string         log        = 3;  // nondeterministic
+  string         info       = 4;  // nondeterministic
+  int64          gas_wanted = 5;
+  int64          gas_used   = 6;
+  repeated Event events     = 7
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
   string codespace = 8;
 }
 
 message ResponseEndBlock {
-  repeated ValidatorUpdate validator_updates = 1 [(gogoproto.nullable)=false];
-  ConsensusParams consensus_param_updates = 2;
-  repeated Event events = 3 [(gogoproto.nullable)=false, (gogoproto.jsontag)="events,omitempty"];
+  repeated ValidatorUpdate validator_updates       = 1 [(gogoproto.nullable) = false];
+  ConsensusParams          consensus_param_updates = 2;
+  repeated Event           events                  = 3
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
 }
 
 message ResponseCommit {
@@ -213,8 +216,8 @@ message ResponseCommit {
 // ConsensusParams contains all consensus-relevant parameters
 // that can be adjusted by the abci app
 message ConsensusParams {
-  BlockParams block = 1;
-  EvidenceParams evidence = 2;
+  BlockParams     block     = 1;
+  EvidenceParams  evidence  = 2;
   ValidatorParams validator = 3;
 }
 
@@ -226,10 +229,11 @@ message BlockParams {
   int64 max_gas = 2;
 }
 
-// EvidenceParams contains limits on the evidence.
 message EvidenceParams {
   // Note: must be greater than 0
-  int64 max_age = 1;
+  int64                    max_age_num_blocks = 1;
+  google.protobuf.Duration max_age_duration   = 2
+      [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
 }
 
 // ValidatorParams contains limits on validators.
@@ -238,13 +242,14 @@ message ValidatorParams {
 }
 
 message LastCommitInfo {
-  int32 round = 1;
-  repeated VoteInfo votes = 2 [(gogoproto.nullable)=false];
+  int32             round = 1;
+  repeated VoteInfo votes = 2 [(gogoproto.nullable) = false];
 }
 
 message Event {
-  string type = 1;
-  repeated common.KVPair attributes = 2 [(gogoproto.nullable)=false, (gogoproto.jsontag)="attributes,omitempty"];
+  string   type                               = 1;
+  repeated tendermint.libs.kv.Pair attributes = 2
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes,omitempty"];
 }
 
 //----------------------------------------
@@ -252,65 +257,62 @@ message Event {
 
 message Header {
   // basic block info
-  Version version = 1 [(gogoproto.nullable)=false];
-  string chain_id = 2 [(gogoproto.customname)="ChainID"];
-  int64 height = 3;
-  google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
-  int64 num_txs = 5;
-  int64 total_txs = 6;
+  Version                   version  = 1 [(gogoproto.nullable) = false];
+  string                    chain_id = 2 [(gogoproto.customname) = "ChainID"];
+  int64                     height   = 3;
+  google.protobuf.Timestamp time     = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
 
   // prev block info
-  BlockID last_block_id = 7 [(gogoproto.nullable)=false];
+  BlockID last_block_id = 5 [(gogoproto.nullable) = false];
 
   // hashes of block data
-  bytes last_commit_hash = 8; // commit from validators from the last block
-  bytes data_hash = 9;        // transactions
+  bytes last_commit_hash = 6;  // commit from validators from the last block
+  bytes data_hash        = 7;  // 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
+  bytes validators_hash      = 8;   // validators for the current block
+  bytes next_validators_hash = 9;   // validators for the next block
+  bytes consensus_hash       = 10;  // consensus params for current block
+  bytes app_hash             = 11;  // state after txs from the previous block
+  bytes last_results_hash    = 12;  // 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
+  bytes evidence_hash    = 13;  // evidence included in the block
+  bytes proposer_address = 14;  // original proposer of the block
 }
 
 message Version {
   uint64 Block = 1;
-  uint64 App = 2;
+  uint64 App   = 2;
 }
 
-
 message BlockID {
-  bytes hash = 1;
-  PartSetHeader parts_header = 2 [(gogoproto.nullable)=false];
+  bytes         hash         = 1;
+  PartSetHeader parts_header = 2 [(gogoproto.nullable) = false];
 }
 
 message PartSetHeader {
   int32 total = 1;
-  bytes hash = 2;
+  bytes hash  = 2;
 }
 
 // Validator
 message Validator {
   bytes address = 1;
-  //PubKey pub_key = 2 [(gogoproto.nullable)=false];
+  // PubKey pub_key = 2 [(gogoproto.nullable)=false];
   int64 power = 3;
 }
 
 // ValidatorUpdate
 message ValidatorUpdate {
-  PubKey pub_key = 1 [(gogoproto.nullable)=false];
-  int64 power = 2;
+  PubKey pub_key = 1 [(gogoproto.nullable) = false];
+  int64  power   = 2;
 }
 
 // VoteInfo
 message VoteInfo {
-  Validator validator = 1 [(gogoproto.nullable)=false];
-  bool signed_last_block = 2;
+  Validator validator         = 1 [(gogoproto.nullable) = false];
+  bool      signed_last_block = 2;
 }
 
 message PubKey {
@@ -319,18 +321,18 @@ message PubKey {
 }
 
 message Evidence {
-  string type = 1;
-  Validator validator = 2 [(gogoproto.nullable)=false];
-  int64 height = 3;
-  google.protobuf.Timestamp time = 4 [(gogoproto.nullable)=false, (gogoproto.stdtime)=true];
-  int64 total_voting_power = 5;
+  string                    type      = 1;
+  Validator                 validator = 2 [(gogoproto.nullable) = false];
+  int64                     height    = 3;
+  google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
+  int64                     total_voting_power = 5;
 }
 
 //----------------------------------------
 // Service Definition
 
 service ABCIApplication {
-  rpc Echo(RequestEcho) returns (ResponseEcho) ;
+  rpc Echo(RequestEcho) returns (ResponseEcho);
   rpc Flush(RequestFlush) returns (ResponseFlush);
   rpc Info(RequestInfo) returns (ResponseInfo);
   rpc SetOption(RequestSetOption) returns (ResponseSetOption);
diff --git a/protobuf/abci/types/types.proto b/protobuf/abci/types/types.proto
new file mode 100644
index 0000000..0d47ad9
--- /dev/null
+++ b/protobuf/abci/types/types.proto
@@ -0,0 +1,346 @@
+syntax = "proto3";
+package tendermint.abci.types;
+option  go_package = "github.com/tendermint/tendermint/abci/types";
+
+// For more information on gogo.proto, see:
+// https://github.com/gogo/protobuf/blob/master/extensions.md
+import "third_party/proto/gogoproto/gogo.proto";
+import "crypto/merkle/merkle.proto";
+import "libs/kv/types.proto";
+import "google/protobuf/timestamp.proto";
+import "google/protobuf/duration.proto";
+
+// This file is copied from http://github.com/tendermint/abci
+// NOTE: When using custom types, mind the warnings.
+// https://github.com/gogo/protobuf/blob/master/custom_types.md#warnings-and-issues
+
+option (gogoproto.marshaler_all)        = true;
+option (gogoproto.unmarshaler_all)      = true;
+option (gogoproto.sizer_all)            = true;
+option (gogoproto.goproto_registration) = true;
+// Generate tests
+option (gogoproto.populate_all) = true;
+option (gogoproto.equal_all)    = true;
+option (gogoproto.testgen_all)  = true;
+
+//----------------------------------------
+// Request types
+
+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;
+  }
+}
+
+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 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
+  string                    chain_id = 2;
+  ConsensusParams           consensus_params = 3;
+  repeated ValidatorUpdate  validators       = 4 [(gogoproto.nullable) = false];
+  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 [(gogoproto.nullable) = false];
+  LastCommitInfo    last_commit_info     = 3 [(gogoproto.nullable) = false];
+  repeated Evidence byzantine_validators = 4 [(gogoproto.nullable) = false];
+}
+
+enum CheckTxType {
+  New     = 0;
+  Recheck = 1;
+}
+
+message RequestCheckTx {
+  bytes       tx   = 1;
+  CheckTxType type = 2;
+}
+
+message RequestDeliverTx {
+  bytes tx = 1;
+}
+
+message RequestEndBlock {
+  int64 height = 1;
+}
+
+message RequestCommit {}
+
+//----------------------------------------
+// Response types
+
+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;
+  }
+}
+
+// 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 [(gogoproto.nullable) = false];
+}
+
+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;
+  tendermint.crypto.merkle.Proof proof     = 8;
+  int64                          height    = 9;
+  string                         codespace = 10;
+}
+
+message ResponseBeginBlock {
+  repeated Event events = 1
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
+}
+
+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 Event events     = 7
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
+  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 Event events     = 7
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
+  string codespace = 8;
+}
+
+message ResponseEndBlock {
+  repeated ValidatorUpdate validator_updates       = 1 [(gogoproto.nullable) = false];
+  ConsensusParams          consensus_param_updates = 2;
+  repeated Event           events                  = 3
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "events,omitempty"];
+}
+
+message ResponseCommit {
+  // reserve 1
+  bytes data = 2;
+}
+
+//----------------------------------------
+// Misc.
+
+// 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;
+}
+
+// BlockParams contains limits on the block size.
+message BlockParams {
+  // Note: must be greater than 0
+  int64 max_bytes = 1;
+  // Note: must be greater or equal to -1
+  int64 max_gas = 2;
+}
+
+message EvidenceParams {
+  // Note: must be greater than 0
+  int64                    max_age_num_blocks = 1;
+  google.protobuf.Duration max_age_duration   = 2
+      [(gogoproto.nullable) = false, (gogoproto.stdduration) = true];
+}
+
+// ValidatorParams contains limits on validators.
+message ValidatorParams {
+  repeated string pub_key_types = 1;
+}
+
+message LastCommitInfo {
+  int32             round = 1;
+  repeated VoteInfo votes = 2 [(gogoproto.nullable) = false];
+}
+
+message Event {
+  string   type                               = 1;
+  repeated tendermint.libs.kv.Pair attributes = 2
+      [(gogoproto.nullable) = false, (gogoproto.jsontag) = "attributes,omitempty"];
+}
+
+//----------------------------------------
+// Blockchain Types
+
+message Header {
+  // basic block info
+  Version                   version  = 1 [(gogoproto.nullable) = false];
+  string                    chain_id = 2 [(gogoproto.customname) = "ChainID"];
+  int64                     height   = 3;
+  google.protobuf.Timestamp time     = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
+
+  // prev block info
+  BlockID last_block_id = 5 [(gogoproto.nullable) = false];
+
+  // hashes of block data
+  bytes last_commit_hash = 6;  // commit from validators from the last block
+  bytes data_hash        = 7;  // transactions
+
+  // hashes from the app output from the prev block
+  bytes validators_hash      = 8;   // validators for the current block
+  bytes next_validators_hash = 9;   // validators for the next block
+  bytes consensus_hash       = 10;  // consensus params for current block
+  bytes app_hash             = 11;  // state after txs from the previous block
+  bytes last_results_hash    = 12;  // root hash of all results from the txs from the previous block
+
+  // consensus info
+  bytes evidence_hash    = 13;  // evidence included in the block
+  bytes proposer_address = 14;  // original proposer of the block
+}
+
+message Version {
+  uint64 Block = 1;
+  uint64 App   = 2;
+}
+
+message BlockID {
+  bytes         hash         = 1;
+  PartSetHeader parts_header = 2 [(gogoproto.nullable) = false];
+}
+
+message PartSetHeader {
+  int32 total = 1;
+  bytes hash  = 2;
+}
+
+// Validator
+message Validator {
+  bytes address = 1;
+  // PubKey pub_key = 2 [(gogoproto.nullable)=false];
+  int64 power = 3;
+}
+
+// ValidatorUpdate
+message ValidatorUpdate {
+  PubKey pub_key = 1 [(gogoproto.nullable) = false];
+  int64  power   = 2;
+}
+
+// VoteInfo
+message VoteInfo {
+  Validator validator         = 1 [(gogoproto.nullable) = false];
+  bool      signed_last_block = 2;
+}
+
+message PubKey {
+  string type = 1;
+  bytes  data = 2;
+}
+
+message Evidence {
+  string                    type      = 1;
+  Validator                 validator = 2 [(gogoproto.nullable) = false];
+  int64                     height    = 3;
+  google.protobuf.Timestamp time = 4 [(gogoproto.nullable) = false, (gogoproto.stdtime) = true];
+  int64                     total_voting_power = 5;
+}
+
+//----------------------------------------
+// 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);
+}
diff --git a/protobuf/github.com/tendermint/tendermint/crypto/merkle/merkle.proto b/protobuf/crypto/merkle/merkle.proto
similarity index 59%
rename from protobuf/github.com/tendermint/tendermint/crypto/merkle/merkle.proto
rename to protobuf/crypto/merkle/merkle.proto
index 8a6c467..159fc58 100644
--- a/protobuf/github.com/tendermint/tendermint/crypto/merkle/merkle.proto
+++ b/protobuf/crypto/merkle/merkle.proto
@@ -1,16 +1,17 @@
 syntax = "proto3";
-package merkle;
+package tendermint.crypto.merkle;
+option  go_package = "github.com/tendermint/tendermint/crypto/merkle";
 
 // For more information on gogo.proto, see:
 // https://github.com/gogo/protobuf/blob/master/extensions.md
-import "github.com/gogo/protobuf/gogoproto/gogo.proto";
+import "third_party/proto/gogoproto/gogo.proto";
 
-option (gogoproto.marshaler_all) = true;
+option (gogoproto.marshaler_all)   = true;
 option (gogoproto.unmarshaler_all) = true;
-option (gogoproto.sizer_all) = true;
+option (gogoproto.sizer_all)       = true;
 
 option (gogoproto.populate_all) = true;
-option (gogoproto.equal_all) = true;
+option (gogoproto.equal_all)    = true;
 
 //----------------------------------------
 // Message types
@@ -20,11 +21,11 @@ option (gogoproto.equal_all) = true;
 // for example neighbouring node hash
 message ProofOp {
   string type = 1;
-  bytes key = 2;
-  bytes data = 3;
+  bytes  key  = 2;
+  bytes  data = 3;
 }
 
 // Proof is Merkle proof defined by the list of ProofOps
 message Proof {
-  repeated ProofOp ops = 1 [(gogoproto.nullable)=false];
+  repeated ProofOp ops = 1 [(gogoproto.nullable) = false];
 }
diff --git a/protobuf/github.com/gogo/protobuf/gogoproto/gogo.proto b/protobuf/github.com/gogo/protobuf/gogoproto/gogo.proto
deleted file mode 100644
index b80c856..0000000
--- a/protobuf/github.com/gogo/protobuf/gogoproto/gogo.proto
+++ /dev/null
@@ -1,144 +0,0 @@
-// Protocol Buffers for Go with Gadgets
-//
-// Copyright (c) 2013, The GoGo Authors. All rights reserved.
-// http://github.com/gogo/protobuf
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-syntax = "proto2";
-package gogoproto;
-
-import "google/protobuf/descriptor.proto";
-
-option java_package = "com.google.protobuf";
-option java_outer_classname = "GoGoProtos";
-option go_package = "github.com/gogo/protobuf/gogoproto";
-
-extend google.protobuf.EnumOptions {
-	optional bool goproto_enum_prefix = 62001;
-	optional bool goproto_enum_stringer = 62021;
-	optional bool enum_stringer = 62022;
-	optional string enum_customname = 62023;
-	optional bool enumdecl = 62024;
-}
-
-extend google.protobuf.EnumValueOptions {
-	optional string enumvalue_customname = 66001;
-}
-
-extend google.protobuf.FileOptions {
-	optional bool goproto_getters_all = 63001;
-	optional bool goproto_enum_prefix_all = 63002;
-	optional bool goproto_stringer_all = 63003;
-	optional bool verbose_equal_all = 63004;
-	optional bool face_all = 63005;
-	optional bool gostring_all = 63006;
-	optional bool populate_all = 63007;
-	optional bool stringer_all = 63008;
-	optional bool onlyone_all = 63009;
-
-	optional bool equal_all = 63013;
-	optional bool description_all = 63014;
-	optional bool testgen_all = 63015;
-	optional bool benchgen_all = 63016;
-	optional bool marshaler_all = 63017;
-	optional bool unmarshaler_all = 63018;
-	optional bool stable_marshaler_all = 63019;
-
-	optional bool sizer_all = 63020;
-
-	optional bool goproto_enum_stringer_all = 63021;
-	optional bool enum_stringer_all = 63022;
-
-	optional bool unsafe_marshaler_all = 63023;
-	optional bool unsafe_unmarshaler_all = 63024;
-
-	optional bool goproto_extensions_map_all = 63025;
-	optional bool goproto_unrecognized_all = 63026;
-	optional bool gogoproto_import = 63027;
-	optional bool protosizer_all = 63028;
-	optional bool compare_all = 63029;
-    optional bool typedecl_all = 63030;
-    optional bool enumdecl_all = 63031;
-
-	optional bool goproto_registration = 63032;
-	optional bool messagename_all = 63033;
-
-	optional bool goproto_sizecache_all = 63034;
-	optional bool goproto_unkeyed_all = 63035;
-}
-
-extend google.protobuf.MessageOptions {
-	optional bool goproto_getters = 64001;
-	optional bool goproto_stringer = 64003;
-	optional bool verbose_equal = 64004;
-	optional bool face = 64005;
-	optional bool gostring = 64006;
-	optional bool populate = 64007;
-	optional bool stringer = 67008;
-	optional bool onlyone = 64009;
-
-	optional bool equal = 64013;
-	optional bool description = 64014;
-	optional bool testgen = 64015;
-	optional bool benchgen = 64016;
-	optional bool marshaler = 64017;
-	optional bool unmarshaler = 64018;
-	optional bool stable_marshaler = 64019;
-
-	optional bool sizer = 64020;
-
-	optional bool unsafe_marshaler = 64023;
-	optional bool unsafe_unmarshaler = 64024;
-
-	optional bool goproto_extensions_map = 64025;
-	optional bool goproto_unrecognized = 64026;
-
-	optional bool protosizer = 64028;
-	optional bool compare = 64029;
-
-	optional bool typedecl = 64030;
-
-	optional bool messagename = 64033;
-
-	optional bool goproto_sizecache = 64034;
-	optional bool goproto_unkeyed = 64035;
-}
-
-extend google.protobuf.FieldOptions {
-	optional bool nullable = 65001;
-	optional bool embed = 65002;
-	optional string customtype = 65003;
-	optional string customname = 65004;
-	optional string jsontag = 65005;
-	optional string moretags = 65006;
-	optional string casttype = 65007;
-	optional string castkey = 65008;
-	optional string castvalue = 65009;
-
-	optional bool stdtime = 65010;
-	optional bool stdduration = 65011;
-	optional bool wktpointer = 65012;
-
-}
diff --git a/protobuf/github.com/tendermint/tendermint/libs/common/types.proto b/protobuf/github.com/tendermint/tendermint/libs/common/types.proto
deleted file mode 100644
index 518e7ca..0000000
--- a/protobuf/github.com/tendermint/tendermint/libs/common/types.proto
+++ /dev/null
@@ -1,28 +0,0 @@
-syntax = "proto3";
-package common;
-
-import "github.com/gogo/protobuf/gogoproto/gogo.proto";
-
-option (gogoproto.marshaler_all) = true;
-option (gogoproto.unmarshaler_all) = true;
-option (gogoproto.sizer_all) = true;
-option (gogoproto.goproto_registration) = true;
-// Generate tests
-option (gogoproto.populate_all) = true;
-option (gogoproto.equal_all) = true;
-option (gogoproto.testgen_all) = true;
-
-//----------------------------------------
-// Abstract types
-
-// Define these here for compatibility but use tmlibs/common.KVPair.
-message KVPair {
-  bytes key = 1;
-  bytes value = 2;
-}
-
-// Define these here for compatibility but use tmlibs/common.KI64Pair.
-message KI64Pair {
-  bytes key = 1;
-  int64 value = 2;
-}
diff --git a/protobuf/google/protobuf/duration.proto b/protobuf/google/protobuf/duration.proto
new file mode 100644
index 0000000..216d48d
--- /dev/null
+++ b/protobuf/google/protobuf/duration.proto
@@ -0,0 +1,116 @@
+// Protocol Buffers - Google's data interchange format
+// Copyright 2008 Google Inc.  All rights reserved.
+// https://developers.google.com/protocol-buffers/
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//     * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto3";
+
+package google.protobuf;
+
+option csharp_namespace = "Google.Protobuf.WellKnownTypes";
+option cc_enable_arenas = true;
+option go_package = "github.com/golang/protobuf/ptypes/duration";
+option java_package = "com.google.protobuf";
+option java_outer_classname = "DurationProto";
+option java_multiple_files = true;
+option objc_class_prefix = "GPB";
+
+// A Duration represents a signed, fixed-length span of time represented
+// as a count of seconds and fractions of seconds at nanosecond
+// resolution. It is independent of any calendar and concepts like "day"
+// or "month". It is related to Timestamp in that the difference between
+// two Timestamp values is a Duration and it can be added or subtracted
+// from a Timestamp. Range is approximately +-10,000 years.
+//
+// # Examples
+//
+// Example 1: Compute Duration from two Timestamps in pseudo code.
+//
+//     Timestamp start = ...;
+//     Timestamp end = ...;
+//     Duration duration = ...;
+//
+//     duration.seconds = end.seconds - start.seconds;
+//     duration.nanos = end.nanos - start.nanos;
+//
+//     if (duration.seconds < 0 && duration.nanos > 0) {
+//       duration.seconds += 1;
+//       duration.nanos -= 1000000000;
+//     } else if (duration.seconds > 0 && duration.nanos < 0) {
+//       duration.seconds -= 1;
+//       duration.nanos += 1000000000;
+//     }
+//
+// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code.
+//
+//     Timestamp start = ...;
+//     Duration duration = ...;
+//     Timestamp end = ...;
+//
+//     end.seconds = start.seconds + duration.seconds;
+//     end.nanos = start.nanos + duration.nanos;
+//
+//     if (end.nanos < 0) {
+//       end.seconds -= 1;
+//       end.nanos += 1000000000;
+//     } else if (end.nanos >= 1000000000) {
+//       end.seconds += 1;
+//       end.nanos -= 1000000000;
+//     }
+//
+// Example 3: Compute Duration from datetime.timedelta in Python.
+//
+//     td = datetime.timedelta(days=3, minutes=10)
+//     duration = Duration()
+//     duration.FromTimedelta(td)
+//
+// # JSON Mapping
+//
+// In JSON format, the Duration type is encoded as a string rather than an
+// object, where the string ends in the suffix "s" (indicating seconds) and
+// is preceded by the number of seconds, with nanoseconds expressed as
+// fractional seconds. For example, 3 seconds with 0 nanoseconds should be
+// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should
+// be expressed in JSON format as "3.000000001s", and 3 seconds and 1
+// microsecond should be expressed in JSON format as "3.000001s".
+//
+//
+message Duration {
+  // Signed seconds of the span of time. Must be from -315,576,000,000
+  // to +315,576,000,000 inclusive. Note: these bounds are computed from:
+  // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years
+  int64 seconds = 1;
+
+  // Signed fractions of a second at nanosecond resolution of the span
+  // of time. Durations less than one second are represented with a 0
+  // `seconds` field and a positive or negative `nanos` field. For durations
+  // of one second or more, a non-zero value for the `nanos` field must be
+  // of the same sign as the `seconds` field. Must be from -999,999,999
+  // to +999,999,999 inclusive.
+  int32 nanos = 2;
+}
\ No newline at end of file
diff --git a/protobuf/libs/kv/types.proto b/protobuf/libs/kv/types.proto
new file mode 100644
index 0000000..7e1375c
--- /dev/null
+++ b/protobuf/libs/kv/types.proto
@@ -0,0 +1,29 @@
+syntax = "proto3";
+package tendermint.libs.kv;
+option  go_package = "github.com/tendermint/tendermint/libs/kv";
+
+import "third_party/proto/gogoproto/gogo.proto";
+
+option (gogoproto.marshaler_all)        = true;
+option (gogoproto.unmarshaler_all)      = true;
+option (gogoproto.sizer_all)            = true;
+option (gogoproto.goproto_registration) = true;
+// Generate tests
+option (gogoproto.populate_all) = true;
+option (gogoproto.equal_all)    = true;
+option (gogoproto.testgen_all)  = true;
+
+//----------------------------------------
+// Abstract types
+
+// Define these here for compatibility but use tmlibs/kv.Pair.
+message Pair {
+  bytes key   = 1;
+  bytes value = 2;
+}
+
+// Define these here for compatibility but use tmlibs/kv.KI64Pair.
+message KI64Pair {
+  bytes key   = 1;
+  int64 value = 2;
+}
diff --git a/protobuf/third_party/proto/gogoproto/gogo.proto b/protobuf/third_party/proto/gogoproto/gogo.proto
new file mode 100644
index 0000000..806efa3
--- /dev/null
+++ b/protobuf/third_party/proto/gogoproto/gogo.proto
@@ -0,0 +1,147 @@
+// Protocol Buffers for Go with Gadgets
+//
+// Copied from https://github.com/gogo/protobuf/blob/master/gogoproto/gogo.proto
+//
+// Copyright (c) 2013, The GoGo Authors. All rights reserved.
+// http://github.com/gogo/protobuf
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+//     * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+//     * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+syntax = "proto2";
+package gogoproto;
+
+import "google/protobuf/descriptor.proto";
+
+option java_package         = "com.google.protobuf";
+option java_outer_classname = "GoGoProtos";
+option go_package           = "github.com/gogo/protobuf/gogoproto";
+
+extend google.protobuf.EnumOptions {
+  optional bool   goproto_enum_prefix   = 62001;
+  optional bool   goproto_enum_stringer = 62021;
+  optional bool   enum_stringer         = 62022;
+  optional string enum_customname       = 62023;
+  optional bool   enumdecl              = 62024;
+}
+
+extend google.protobuf.EnumValueOptions {
+  optional string enumvalue_customname = 66001;
+}
+
+extend google.protobuf.FileOptions {
+  optional bool goproto_getters_all     = 63001;
+  optional bool goproto_enum_prefix_all = 63002;
+  optional bool goproto_stringer_all    = 63003;
+  optional bool verbose_equal_all       = 63004;
+  optional bool face_all                = 63005;
+  optional bool gostring_all            = 63006;
+  optional bool populate_all            = 63007;
+  optional bool stringer_all            = 63008;
+  optional bool onlyone_all             = 63009;
+
+  optional bool equal_all            = 63013;
+  optional bool description_all      = 63014;
+  optional bool testgen_all          = 63015;
+  optional bool benchgen_all         = 63016;
+  optional bool marshaler_all        = 63017;
+  optional bool unmarshaler_all      = 63018;
+  optional bool stable_marshaler_all = 63019;
+
+  optional bool sizer_all = 63020;
+
+  optional bool goproto_enum_stringer_all = 63021;
+  optional bool enum_stringer_all         = 63022;
+
+  optional bool unsafe_marshaler_all   = 63023;
+  optional bool unsafe_unmarshaler_all = 63024;
+
+  optional bool goproto_extensions_map_all = 63025;
+  optional bool goproto_unrecognized_all   = 63026;
+  optional bool gogoproto_import           = 63027;
+  optional bool protosizer_all             = 63028;
+  optional bool compare_all                = 63029;
+  optional bool typedecl_all               = 63030;
+  optional bool enumdecl_all               = 63031;
+
+  optional bool goproto_registration = 63032;
+  optional bool messagename_all      = 63033;
+
+  optional bool goproto_sizecache_all = 63034;
+  optional bool goproto_unkeyed_all   = 63035;
+}
+
+extend google.protobuf.MessageOptions {
+  optional bool goproto_getters  = 64001;
+  optional bool goproto_stringer = 64003;
+  optional bool verbose_equal    = 64004;
+  optional bool face             = 64005;
+  optional bool gostring         = 64006;
+  optional bool populate         = 64007;
+  optional bool stringer         = 67008;
+  optional bool onlyone          = 64009;
+
+  optional bool equal            = 64013;
+  optional bool description      = 64014;
+  optional bool testgen          = 64015;
+  optional bool benchgen         = 64016;
+  optional bool marshaler        = 64017;
+  optional bool unmarshaler      = 64018;
+  optional bool stable_marshaler = 64019;
+
+  optional bool sizer = 64020;
+
+  optional bool unsafe_marshaler   = 64023;
+  optional bool unsafe_unmarshaler = 64024;
+
+  optional bool goproto_extensions_map = 64025;
+  optional bool goproto_unrecognized   = 64026;
+
+  optional bool protosizer = 64028;
+  optional bool compare    = 64029;
+
+  optional bool typedecl = 64030;
+
+  optional bool messagename = 64033;
+
+  optional bool goproto_sizecache = 64034;
+  optional bool goproto_unkeyed   = 64035;
+}
+
+extend google.protobuf.FieldOptions {
+  optional bool   nullable   = 65001;
+  optional bool   embed      = 65002;
+  optional string customtype = 65003;
+  optional string customname = 65004;
+  optional string jsontag    = 65005;
+  optional string moretags   = 65006;
+  optional string casttype   = 65007;
+  optional string castkey    = 65008;
+  optional string castvalue  = 65009;
+
+  optional bool stdtime     = 65010;
+  optional bool stdduration = 65011;
+  optional bool wktpointer  = 65012;
+
+  optional string castrepeated = 65013;
+}
diff --git a/src/messages/abci.rs b/src/messages/abci.rs
index 01e03ca..538ae19 100644
--- a/src/messages/abci.rs
+++ b/src/messages/abci.rs
@@ -1,7 +1,7 @@
-// This file is generated by rust-protobuf 2.10.0. Do not edit
+// This file is generated by rust-protobuf 2.10.2. Do not edit
 // @generated
 
-// https://github.com/Manishearth/rust-clippy/issues/702
+// https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
@@ -24,7 +24,7 @@ use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_0;
+// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_2;
 
 #[derive(PartialEq,Clone,Default)]
 pub struct Request {
@@ -61,7 +61,7 @@ impl Request {
         ::std::default::Default::default()
     }
 
-    // .abci.RequestEcho echo = 2;
+    // .tendermint.abci.types.RequestEcho echo = 2;
 
 
     pub fn get_echo(&self) -> &RequestEcho {
@@ -110,7 +110,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestFlush flush = 3;
+    // .tendermint.abci.types.RequestFlush flush = 3;
 
 
     pub fn get_flush(&self) -> &RequestFlush {
@@ -159,7 +159,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestInfo info = 4;
+    // .tendermint.abci.types.RequestInfo info = 4;
 
 
     pub fn get_info(&self) -> &RequestInfo {
@@ -208,7 +208,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestSetOption set_option = 5;
+    // .tendermint.abci.types.RequestSetOption set_option = 5;
 
 
     pub fn get_set_option(&self) -> &RequestSetOption {
@@ -257,7 +257,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestInitChain init_chain = 6;
+    // .tendermint.abci.types.RequestInitChain init_chain = 6;
 
 
     pub fn get_init_chain(&self) -> &RequestInitChain {
@@ -306,7 +306,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestQuery query = 7;
+    // .tendermint.abci.types.RequestQuery query = 7;
 
 
     pub fn get_query(&self) -> &RequestQuery {
@@ -355,7 +355,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestBeginBlock begin_block = 8;
+    // .tendermint.abci.types.RequestBeginBlock begin_block = 8;
 
 
     pub fn get_begin_block(&self) -> &RequestBeginBlock {
@@ -404,7 +404,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestCheckTx check_tx = 9;
+    // .tendermint.abci.types.RequestCheckTx check_tx = 9;
 
 
     pub fn get_check_tx(&self) -> &RequestCheckTx {
@@ -453,7 +453,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestDeliverTx deliver_tx = 19;
+    // .tendermint.abci.types.RequestDeliverTx deliver_tx = 19;
 
 
     pub fn get_deliver_tx(&self) -> &RequestDeliverTx {
@@ -502,7 +502,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestEndBlock end_block = 11;
+    // .tendermint.abci.types.RequestEndBlock end_block = 11;
 
 
     pub fn get_end_block(&self) -> &RequestEndBlock {
@@ -551,7 +551,7 @@ impl Request {
         }
     }
 
-    // .abci.RequestCommit commit = 12;
+    // .tendermint.abci.types.RequestCommit commit = 12;
 
 
     pub fn get_commit(&self) -> &RequestCommit {
@@ -1830,7 +1830,7 @@ impl RequestInitChain {
         ::std::mem::replace(&mut self.chain_id, ::std::string::String::new())
     }
 
-    // .abci.ConsensusParams consensus_params = 3;
+    // .tendermint.abci.types.ConsensusParams consensus_params = 3;
 
 
     pub fn get_consensus_params(&self) -> &ConsensusParams {
@@ -1863,7 +1863,7 @@ impl RequestInitChain {
         self.consensus_params.take().unwrap_or_else(|| ConsensusParams::new())
     }
 
-    // repeated .abci.ValidatorUpdate validators = 4;
+    // repeated .tendermint.abci.types.ValidatorUpdate validators = 4;
 
 
     pub fn get_validators(&self) -> &[ValidatorUpdate] {
@@ -2451,7 +2451,7 @@ impl RequestBeginBlock {
         ::std::mem::replace(&mut self.hash, ::std::vec::Vec::new())
     }
 
-    // .abci.Header header = 2;
+    // .tendermint.abci.types.Header header = 2;
 
 
     pub fn get_header(&self) -> &Header {
@@ -2484,7 +2484,7 @@ impl RequestBeginBlock {
         self.header.take().unwrap_or_else(|| Header::new())
     }
 
-    // .abci.LastCommitInfo last_commit_info = 3;
+    // .tendermint.abci.types.LastCommitInfo last_commit_info = 3;
 
 
     pub fn get_last_commit_info(&self) -> &LastCommitInfo {
@@ -2517,7 +2517,7 @@ impl RequestBeginBlock {
         self.last_commit_info.take().unwrap_or_else(|| LastCommitInfo::new())
     }
 
-    // repeated .abci.Evidence byzantine_validators = 4;
+    // repeated .tendermint.abci.types.Evidence byzantine_validators = 4;
 
 
     pub fn get_byzantine_validators(&self) -> &[Evidence] {
@@ -2781,7 +2781,7 @@ impl RequestCheckTx {
         ::std::mem::replace(&mut self.tx, ::std::vec::Vec::new())
     }
 
-    // .abci.CheckTxType type = 2;
+    // .tendermint.abci.types.CheckTxType type = 2;
 
 
     pub fn get_field_type(&self) -> CheckTxType {
@@ -3427,7 +3427,7 @@ impl Response {
         ::std::default::Default::default()
     }
 
-    // .abci.ResponseException exception = 1;
+    // .tendermint.abci.types.ResponseException exception = 1;
 
 
     pub fn get_exception(&self) -> &ResponseException {
@@ -3476,7 +3476,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseEcho echo = 2;
+    // .tendermint.abci.types.ResponseEcho echo = 2;
 
 
     pub fn get_echo(&self) -> &ResponseEcho {
@@ -3525,7 +3525,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseFlush flush = 3;
+    // .tendermint.abci.types.ResponseFlush flush = 3;
 
 
     pub fn get_flush(&self) -> &ResponseFlush {
@@ -3574,7 +3574,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseInfo info = 4;
+    // .tendermint.abci.types.ResponseInfo info = 4;
 
 
     pub fn get_info(&self) -> &ResponseInfo {
@@ -3623,7 +3623,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseSetOption set_option = 5;
+    // .tendermint.abci.types.ResponseSetOption set_option = 5;
 
 
     pub fn get_set_option(&self) -> &ResponseSetOption {
@@ -3672,7 +3672,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseInitChain init_chain = 6;
+    // .tendermint.abci.types.ResponseInitChain init_chain = 6;
 
 
     pub fn get_init_chain(&self) -> &ResponseInitChain {
@@ -3721,7 +3721,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseQuery query = 7;
+    // .tendermint.abci.types.ResponseQuery query = 7;
 
 
     pub fn get_query(&self) -> &ResponseQuery {
@@ -3770,7 +3770,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseBeginBlock begin_block = 8;
+    // .tendermint.abci.types.ResponseBeginBlock begin_block = 8;
 
 
     pub fn get_begin_block(&self) -> &ResponseBeginBlock {
@@ -3819,7 +3819,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseCheckTx check_tx = 9;
+    // .tendermint.abci.types.ResponseCheckTx check_tx = 9;
 
 
     pub fn get_check_tx(&self) -> &ResponseCheckTx {
@@ -3868,7 +3868,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseDeliverTx deliver_tx = 10;
+    // .tendermint.abci.types.ResponseDeliverTx deliver_tx = 10;
 
 
     pub fn get_deliver_tx(&self) -> &ResponseDeliverTx {
@@ -3917,7 +3917,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseEndBlock end_block = 11;
+    // .tendermint.abci.types.ResponseEndBlock end_block = 11;
 
 
     pub fn get_end_block(&self) -> &ResponseEndBlock {
@@ -3966,7 +3966,7 @@ impl Response {
         }
     }
 
-    // .abci.ResponseCommit commit = 12;
+    // .tendermint.abci.types.ResponseCommit commit = 12;
 
 
     pub fn get_commit(&self) -> &ResponseCommit {
@@ -5497,7 +5497,7 @@ impl ResponseInitChain {
         ::std::default::Default::default()
     }
 
-    // .abci.ConsensusParams consensus_params = 1;
+    // .tendermint.abci.types.ConsensusParams consensus_params = 1;
 
 
     pub fn get_consensus_params(&self) -> &ConsensusParams {
@@ -5530,7 +5530,7 @@ impl ResponseInitChain {
         self.consensus_params.take().unwrap_or_else(|| ConsensusParams::new())
     }
 
-    // repeated .abci.ValidatorUpdate validators = 2;
+    // repeated .tendermint.abci.types.ValidatorUpdate validators = 2;
 
 
     pub fn get_validators(&self) -> &[ValidatorUpdate] {
@@ -5871,7 +5871,7 @@ impl ResponseQuery {
         ::std::mem::replace(&mut self.value, ::std::vec::Vec::new())
     }
 
-    // .merkle.Proof proof = 8;
+    // .tendermint.crypto.merkle.Proof proof = 8;
 
 
     pub fn get_proof(&self) -> &super::merkle::Proof {
@@ -6228,7 +6228,7 @@ impl ResponseBeginBlock {
         ::std::default::Default::default()
     }
 
-    // repeated .abci.Event events = 1;
+    // repeated .tendermint.abci.types.Event events = 1;
 
 
     pub fn get_events(&self) -> &[Event] {
@@ -6534,7 +6534,7 @@ impl ResponseCheckTx {
         self.gas_used = v;
     }
 
-    // repeated .abci.Event events = 7;
+    // repeated .tendermint.abci.types.Event events = 7;
 
 
     pub fn get_events(&self) -> &[Event] {
@@ -6983,7 +6983,7 @@ impl ResponseDeliverTx {
         self.gas_used = v;
     }
 
-    // repeated .abci.Event events = 7;
+    // repeated .tendermint.abci.types.Event events = 7;
 
 
     pub fn get_events(&self) -> &[Event] {
@@ -7304,7 +7304,7 @@ impl ResponseEndBlock {
         ::std::default::Default::default()
     }
 
-    // repeated .abci.ValidatorUpdate validator_updates = 1;
+    // repeated .tendermint.abci.types.ValidatorUpdate validator_updates = 1;
 
 
     pub fn get_validator_updates(&self) -> &[ValidatorUpdate] {
@@ -7329,7 +7329,7 @@ impl ResponseEndBlock {
         ::std::mem::replace(&mut self.validator_updates, ::protobuf::RepeatedField::new())
     }
 
-    // .abci.ConsensusParams consensus_param_updates = 2;
+    // .tendermint.abci.types.ConsensusParams consensus_param_updates = 2;
 
 
     pub fn get_consensus_param_updates(&self) -> &ConsensusParams {
@@ -7362,7 +7362,7 @@ impl ResponseEndBlock {
         self.consensus_param_updates.take().unwrap_or_else(|| ConsensusParams::new())
     }
 
-    // repeated .abci.Event events = 3;
+    // repeated .tendermint.abci.types.Event events = 3;
 
 
     pub fn get_events(&self) -> &[Event] {
@@ -7755,7 +7755,7 @@ impl ConsensusParams {
         ::std::default::Default::default()
     }
 
-    // .abci.BlockParams block = 1;
+    // .tendermint.abci.types.BlockParams block = 1;
 
 
     pub fn get_block(&self) -> &BlockParams {
@@ -7788,7 +7788,7 @@ impl ConsensusParams {
         self.block.take().unwrap_or_else(|| BlockParams::new())
     }
 
-    // .abci.EvidenceParams evidence = 2;
+    // .tendermint.abci.types.EvidenceParams evidence = 2;
 
 
     pub fn get_evidence(&self) -> &EvidenceParams {
@@ -7821,7 +7821,7 @@ impl ConsensusParams {
         self.evidence.take().unwrap_or_else(|| EvidenceParams::new())
     }
 
-    // .abci.ValidatorParams validator = 3;
+    // .tendermint.abci.types.ValidatorParams validator = 3;
 
 
     pub fn get_validator(&self) -> &ValidatorParams {
@@ -8231,7 +8231,8 @@ impl ::protobuf::reflect::ProtobufValue for BlockParams {
 #[derive(PartialEq,Clone,Default)]
 pub struct EvidenceParams {
     // message fields
-    pub max_age: i64,
+    pub max_age_num_blocks: i64,
+    pub max_age_duration: ::protobuf::SingularPtrField<::protobuf::well_known_types::Duration>,
     // special fields
     pub unknown_fields: ::protobuf::UnknownFields,
     pub cached_size: ::protobuf::CachedSize,
@@ -8248,24 +8249,62 @@ impl EvidenceParams {
         ::std::default::Default::default()
     }
 
-    // int64 max_age = 1;
+    // int64 max_age_num_blocks = 1;
 
 
-    pub fn get_max_age(&self) -> i64 {
-        self.max_age
+    pub fn get_max_age_num_blocks(&self) -> i64 {
+        self.max_age_num_blocks
     }
-    pub fn clear_max_age(&mut self) {
-        self.max_age = 0;
+    pub fn clear_max_age_num_blocks(&mut self) {
+        self.max_age_num_blocks = 0;
     }
 
     // Param is passed by value, moved
-    pub fn set_max_age(&mut self, v: i64) {
-        self.max_age = v;
+    pub fn set_max_age_num_blocks(&mut self, v: i64) {
+        self.max_age_num_blocks = v;
+    }
+
+    // .google.protobuf.Duration max_age_duration = 2;
+
+
+    pub fn get_max_age_duration(&self) -> &::protobuf::well_known_types::Duration {
+        self.max_age_duration.as_ref().unwrap_or_else(|| ::protobuf::well_known_types::Duration::default_instance())
+    }
+    pub fn clear_max_age_duration(&mut self) {
+        self.max_age_duration.clear();
+    }
+
+    pub fn has_max_age_duration(&self) -> bool {
+        self.max_age_duration.is_some()
+    }
+
+    // Param is passed by value, moved
+    pub fn set_max_age_duration(&mut self, v: ::protobuf::well_known_types::Duration) {
+        self.max_age_duration = ::protobuf::SingularPtrField::some(v);
+    }
+
+    // Mutable pointer to the field.
+    // If field is not initialized, it is initialized with default value first.
+    pub fn mut_max_age_duration(&mut self) -> &mut ::protobuf::well_known_types::Duration {
+        if self.max_age_duration.is_none() {
+            self.max_age_duration.set_default();
+        }
+        self.max_age_duration.as_mut().unwrap()
+    }
+
+    // Take field
+    pub fn take_max_age_duration(&mut self) -> ::protobuf::well_known_types::Duration {
+        self.max_age_duration.take().unwrap_or_else(|| ::protobuf::well_known_types::Duration::new())
     }
 }
 
 impl ::protobuf::Message for EvidenceParams {
     fn is_initialized(&self) -> bool {
+        for v in &self.max_age_duration {
+            if !v.is_initialized() {
+                return false;
+            }
+        };
         true
     }
 
@@ -8278,7 +8317,10 @@ impl ::protobuf::Message for EvidenceParams {
                         return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
                     }
                     let tmp = is.read_int64()?;
-                    self.max_age = tmp;
+                    self.max_age_num_blocks = tmp;
+                },
+                2 => {
+                    ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.max_age_duration)?;
                 },
                 _ => {
                     ::protobuf::rt::read_unknown_or_skip_group(field_number, wire_type, is, self.mut_unknown_fields())?;
@@ -8292,8 +8334,12 @@ impl ::protobuf::Message for EvidenceParams {
     #[allow(unused_variables)]
     fn compute_size(&self) -> u32 {
         let mut my_size = 0;
-        if self.max_age != 0 {
-            my_size += ::protobuf::rt::value_size(1, self.max_age, ::protobuf::wire_format::WireTypeVarint);
+        if self.max_age_num_blocks != 0 {
+            my_size += ::protobuf::rt::value_size(1, self.max_age_num_blocks, ::protobuf::wire_format::WireTypeVarint);
+        }
+        if let Some(ref v) = self.max_age_duration.as_ref() {
+            let len = v.compute_size();
+            my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
         }
         my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
         self.cached_size.set(my_size);
@@ -8301,8 +8347,13 @@ impl ::protobuf::Message for EvidenceParams {
     }
 
     fn write_to_with_cached_sizes(&self, os: &mut ::protobuf::CodedOutputStream<'_>) -> ::protobuf::ProtobufResult<()> {
-        if self.max_age != 0 {
-            os.write_int64(1, self.max_age)?;
+        if self.max_age_num_blocks != 0 {
+            os.write_int64(1, self.max_age_num_blocks)?;
+        }
+        if let Some(ref v) = self.max_age_duration.as_ref() {
+            os.write_tag(2, ::protobuf::wire_format::WireTypeLengthDelimited)?;
+            os.write_raw_varint32(v.get_cached_size())?;
+            v.write_to_with_cached_sizes(os)?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -8347,9 +8398,14 @@ impl ::protobuf::Message for EvidenceParams {
             descriptor.get(|| {
                 let mut fields = ::std::vec::Vec::new();
                 fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "max_age",
-                    |m: &EvidenceParams| { &m.max_age },
-                    |m: &mut EvidenceParams| { &mut m.max_age },
+                    "max_age_num_blocks",
+                    |m: &EvidenceParams| { &m.max_age_num_blocks },
+                    |m: &mut EvidenceParams| { &mut m.max_age_num_blocks },
+                ));
+                fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<::protobuf::well_known_types::Duration>>(
+                    "max_age_duration",
+                    |m: &EvidenceParams| { &m.max_age_duration },
+                    |m: &mut EvidenceParams| { &mut m.max_age_duration },
                 ));
                 ::protobuf::reflect::MessageDescriptor::new::<EvidenceParams>(
                     "EvidenceParams",
@@ -8373,7 +8429,8 @@ impl ::protobuf::Message for EvidenceParams {
 
 impl ::protobuf::Clear for EvidenceParams {
     fn clear(&mut self) {
-        self.max_age = 0;
+        self.max_age_num_blocks = 0;
+        self.max_age_duration.clear();
         self.unknown_fields.clear();
     }
 }
@@ -8594,7 +8651,7 @@ impl LastCommitInfo {
         self.round = v;
     }
 
-    // repeated .abci.VoteInfo votes = 2;
+    // repeated .tendermint.abci.types.VoteInfo votes = 2;
 
 
     pub fn get_votes(&self) -> &[VoteInfo] {
@@ -8773,7 +8830,7 @@ impl ::protobuf::reflect::ProtobufValue for LastCommitInfo {
 pub struct Event {
     // message fields
     pub field_type: ::std::string::String,
-    pub attributes: ::protobuf::RepeatedField<super::types::KVPair>,
+    pub attributes: ::protobuf::RepeatedField<super::types::Pair>,
     // special fields
     pub unknown_fields: ::protobuf::UnknownFields,
     pub cached_size: ::protobuf::CachedSize,
@@ -8816,10 +8873,10 @@ impl Event {
         ::std::mem::replace(&mut self.field_type, ::std::string::String::new())
     }
 
-    // repeated .common.KVPair attributes = 2;
+    // repeated .tendermint.libs.kv.Pair attributes = 2;
 
 
-    pub fn get_attributes(&self) -> &[super::types::KVPair] {
+    pub fn get_attributes(&self) -> &[super::types::Pair] {
         &self.attributes
     }
     pub fn clear_attributes(&mut self) {
@@ -8827,17 +8884,17 @@ impl Event {
     }
 
     // Param is passed by value, moved
-    pub fn set_attributes(&mut self, v: ::protobuf::RepeatedField<super::types::KVPair>) {
+    pub fn set_attributes(&mut self, v: ::protobuf::RepeatedField<super::types::Pair>) {
         self.attributes = v;
     }
 
     // Mutable pointer to the field.
-    pub fn mut_attributes(&mut self) -> &mut ::protobuf::RepeatedField<super::types::KVPair> {
+    pub fn mut_attributes(&mut self) -> &mut ::protobuf::RepeatedField<super::types::Pair> {
         &mut self.attributes
     }
 
     // Take field
-    pub fn take_attributes(&mut self) -> ::protobuf::RepeatedField<super::types::KVPair> {
+    pub fn take_attributes(&mut self) -> ::protobuf::RepeatedField<super::types::Pair> {
         ::std::mem::replace(&mut self.attributes, ::protobuf::RepeatedField::new())
     }
 }
@@ -8942,7 +8999,7 @@ impl ::protobuf::Message for Event {
                     |m: &Event| { &m.field_type },
                     |m: &mut Event| { &mut m.field_type },
                 ));
-                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<super::types::KVPair>>(
+                fields.push(::protobuf::reflect::accessor::make_repeated_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<super::types::Pair>>(
                     "attributes",
                     |m: &Event| { &m.attributes },
                     |m: &mut Event| { &mut m.attributes },
@@ -8994,8 +9051,6 @@ pub struct Header {
     pub chain_id: ::std::string::String,
     pub height: i64,
     pub time: ::protobuf::SingularPtrField<::protobuf::well_known_types::Timestamp>,
-    pub num_txs: i64,
-    pub total_txs: i64,
     pub last_block_id: ::protobuf::SingularPtrField<BlockID>,
     pub last_commit_hash: ::std::vec::Vec<u8>,
     pub data_hash: ::std::vec::Vec<u8>,
@@ -9022,7 +9077,7 @@ impl Header {
         ::std::default::Default::default()
     }
 
-    // .abci.Version version = 1;
+    // .tendermint.abci.types.Version version = 1;
 
 
     pub fn get_version(&self) -> &Version {
@@ -9129,37 +9184,7 @@ impl Header {
         self.time.take().unwrap_or_else(|| ::protobuf::well_known_types::Timestamp::new())
     }
 
-    // int64 num_txs = 5;
-
-
-    pub fn get_num_txs(&self) -> i64 {
-        self.num_txs
-    }
-    pub fn clear_num_txs(&mut self) {
-        self.num_txs = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_num_txs(&mut self, v: i64) {
-        self.num_txs = v;
-    }
-
-    // int64 total_txs = 6;
-
-
-    pub fn get_total_txs(&self) -> i64 {
-        self.total_txs
-    }
-    pub fn clear_total_txs(&mut self) {
-        self.total_txs = 0;
-    }
-
-    // Param is passed by value, moved
-    pub fn set_total_txs(&mut self, v: i64) {
-        self.total_txs = v;
-    }
-
-    // .abci.BlockID last_block_id = 7;
+    // .tendermint.abci.types.BlockID last_block_id = 5;
 
 
     pub fn get_last_block_id(&self) -> &BlockID {
@@ -9192,7 +9217,7 @@ impl Header {
         self.last_block_id.take().unwrap_or_else(|| BlockID::new())
     }
 
-    // bytes last_commit_hash = 8;
+    // bytes last_commit_hash = 6;
 
 
     pub fn get_last_commit_hash(&self) -> &[u8] {
@@ -9218,7 +9243,7 @@ impl Header {
         ::std::mem::replace(&mut self.last_commit_hash, ::std::vec::Vec::new())
     }
 
-    // bytes data_hash = 9;
+    // bytes data_hash = 7;
 
 
     pub fn get_data_hash(&self) -> &[u8] {
@@ -9244,7 +9269,7 @@ impl Header {
         ::std::mem::replace(&mut self.data_hash, ::std::vec::Vec::new())
     }
 
-    // bytes validators_hash = 10;
+    // bytes validators_hash = 8;
 
 
     pub fn get_validators_hash(&self) -> &[u8] {
@@ -9270,7 +9295,7 @@ impl Header {
         ::std::mem::replace(&mut self.validators_hash, ::std::vec::Vec::new())
     }
 
-    // bytes next_validators_hash = 11;
+    // bytes next_validators_hash = 9;
 
 
     pub fn get_next_validators_hash(&self) -> &[u8] {
@@ -9296,7 +9321,7 @@ impl Header {
         ::std::mem::replace(&mut self.next_validators_hash, ::std::vec::Vec::new())
     }
 
-    // bytes consensus_hash = 12;
+    // bytes consensus_hash = 10;
 
 
     pub fn get_consensus_hash(&self) -> &[u8] {
@@ -9322,7 +9347,7 @@ impl Header {
         ::std::mem::replace(&mut self.consensus_hash, ::std::vec::Vec::new())
     }
 
-    // bytes app_hash = 13;
+    // bytes app_hash = 11;
 
 
     pub fn get_app_hash(&self) -> &[u8] {
@@ -9348,7 +9373,7 @@ impl Header {
         ::std::mem::replace(&mut self.app_hash, ::std::vec::Vec::new())
     }
 
-    // bytes last_results_hash = 14;
+    // bytes last_results_hash = 12;
 
 
     pub fn get_last_results_hash(&self) -> &[u8] {
@@ -9374,7 +9399,7 @@ impl Header {
         ::std::mem::replace(&mut self.last_results_hash, ::std::vec::Vec::new())
     }
 
-    // bytes evidence_hash = 15;
+    // bytes evidence_hash = 13;
 
 
     pub fn get_evidence_hash(&self) -> &[u8] {
@@ -9400,7 +9425,7 @@ impl Header {
         ::std::mem::replace(&mut self.evidence_hash, ::std::vec::Vec::new())
     }
 
-    // bytes proposer_address = 16;
+    // bytes proposer_address = 14;
 
 
     pub fn get_proposer_address(&self) -> &[u8] {
@@ -9468,47 +9493,33 @@ impl ::protobuf::Message for Header {
                     ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.time)?;
                 },
                 5 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.num_txs = tmp;
-                },
-                6 => {
-                    if wire_type != ::protobuf::wire_format::WireTypeVarint {
-                        return ::std::result::Result::Err(::protobuf::rt::unexpected_wire_type(wire_type));
-                    }
-                    let tmp = is.read_int64()?;
-                    self.total_txs = tmp;
-                },
-                7 => {
                     ::protobuf::rt::read_singular_message_into(wire_type, is, &mut self.last_block_id)?;
                 },
-                8 => {
+                6 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.last_commit_hash)?;
                 },
-                9 => {
+                7 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.data_hash)?;
                 },
-                10 => {
+                8 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.validators_hash)?;
                 },
-                11 => {
+                9 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.next_validators_hash)?;
                 },
-                12 => {
+                10 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.consensus_hash)?;
                 },
-                13 => {
+                11 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.app_hash)?;
                 },
-                14 => {
+                12 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.last_results_hash)?;
                 },
-                15 => {
+                13 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.evidence_hash)?;
                 },
-                16 => {
+                14 => {
                     ::protobuf::rt::read_singular_proto3_bytes_into(wire_type, is, &mut self.proposer_address)?;
                 },
                 _ => {
@@ -9537,42 +9548,36 @@ impl ::protobuf::Message for Header {
             let len = v.compute_size();
             my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
         }
-        if self.num_txs != 0 {
-            my_size += ::protobuf::rt::value_size(5, self.num_txs, ::protobuf::wire_format::WireTypeVarint);
-        }
-        if self.total_txs != 0 {
-            my_size += ::protobuf::rt::value_size(6, self.total_txs, ::protobuf::wire_format::WireTypeVarint);
-        }
         if let Some(ref v) = self.last_block_id.as_ref() {
             let len = v.compute_size();
             my_size += 1 + ::protobuf::rt::compute_raw_varint32_size(len) + len;
         }
         if !self.last_commit_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(8, &self.last_commit_hash);
+            my_size += ::protobuf::rt::bytes_size(6, &self.last_commit_hash);
         }
         if !self.data_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(9, &self.data_hash);
+            my_size += ::protobuf::rt::bytes_size(7, &self.data_hash);
         }
         if !self.validators_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(10, &self.validators_hash);
+            my_size += ::protobuf::rt::bytes_size(8, &self.validators_hash);
         }
         if !self.next_validators_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(11, &self.next_validators_hash);
+            my_size += ::protobuf::rt::bytes_size(9, &self.next_validators_hash);
         }
         if !self.consensus_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(12, &self.consensus_hash);
+            my_size += ::protobuf::rt::bytes_size(10, &self.consensus_hash);
         }
         if !self.app_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(13, &self.app_hash);
+            my_size += ::protobuf::rt::bytes_size(11, &self.app_hash);
         }
         if !self.last_results_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(14, &self.last_results_hash);
+            my_size += ::protobuf::rt::bytes_size(12, &self.last_results_hash);
         }
         if !self.evidence_hash.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(15, &self.evidence_hash);
+            my_size += ::protobuf::rt::bytes_size(13, &self.evidence_hash);
         }
         if !self.proposer_address.is_empty() {
-            my_size += ::protobuf::rt::bytes_size(16, &self.proposer_address);
+            my_size += ::protobuf::rt::bytes_size(14, &self.proposer_address);
         }
         my_size += ::protobuf::rt::unknown_fields_size(self.get_unknown_fields());
         self.cached_size.set(my_size);
@@ -9596,43 +9601,37 @@ impl ::protobuf::Message for Header {
             os.write_raw_varint32(v.get_cached_size())?;
             v.write_to_with_cached_sizes(os)?;
         }
-        if self.num_txs != 0 {
-            os.write_int64(5, self.num_txs)?;
-        }
-        if self.total_txs != 0 {
-            os.write_int64(6, self.total_txs)?;
-        }
         if let Some(ref v) = self.last_block_id.as_ref() {
-            os.write_tag(7, ::protobuf::wire_format::WireTypeLengthDelimited)?;
+            os.write_tag(5, ::protobuf::wire_format::WireTypeLengthDelimited)?;
             os.write_raw_varint32(v.get_cached_size())?;
             v.write_to_with_cached_sizes(os)?;
         }
         if !self.last_commit_hash.is_empty() {
-            os.write_bytes(8, &self.last_commit_hash)?;
+            os.write_bytes(6, &self.last_commit_hash)?;
         }
         if !self.data_hash.is_empty() {
-            os.write_bytes(9, &self.data_hash)?;
+            os.write_bytes(7, &self.data_hash)?;
         }
         if !self.validators_hash.is_empty() {
-            os.write_bytes(10, &self.validators_hash)?;
+            os.write_bytes(8, &self.validators_hash)?;
         }
         if !self.next_validators_hash.is_empty() {
-            os.write_bytes(11, &self.next_validators_hash)?;
+            os.write_bytes(9, &self.next_validators_hash)?;
         }
         if !self.consensus_hash.is_empty() {
-            os.write_bytes(12, &self.consensus_hash)?;
+            os.write_bytes(10, &self.consensus_hash)?;
         }
         if !self.app_hash.is_empty() {
-            os.write_bytes(13, &self.app_hash)?;
+            os.write_bytes(11, &self.app_hash)?;
         }
         if !self.last_results_hash.is_empty() {
-            os.write_bytes(14, &self.last_results_hash)?;
+            os.write_bytes(12, &self.last_results_hash)?;
         }
         if !self.evidence_hash.is_empty() {
-            os.write_bytes(15, &self.evidence_hash)?;
+            os.write_bytes(13, &self.evidence_hash)?;
         }
         if !self.proposer_address.is_empty() {
-            os.write_bytes(16, &self.proposer_address)?;
+            os.write_bytes(14, &self.proposer_address)?;
         }
         os.write_unknown_fields(self.get_unknown_fields())?;
         ::std::result::Result::Ok(())
@@ -9696,16 +9695,6 @@ impl ::protobuf::Message for Header {
                     |m: &Header| { &m.time },
                     |m: &mut Header| { &mut m.time },
                 ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "num_txs",
-                    |m: &Header| { &m.num_txs },
-                    |m: &mut Header| { &mut m.num_txs },
-                ));
-                fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeInt64>(
-                    "total_txs",
-                    |m: &Header| { &m.total_txs },
-                    |m: &mut Header| { &mut m.total_txs },
-                ));
                 fields.push(::protobuf::reflect::accessor::make_singular_ptr_field_accessor::<_, ::protobuf::types::ProtobufTypeMessage<BlockID>>(
                     "last_block_id",
                     |m: &Header| { &m.last_block_id },
@@ -9782,8 +9771,6 @@ impl ::protobuf::Clear for Header {
         self.chain_id.clear();
         self.height = 0;
         self.time.clear();
-        self.num_txs = 0;
-        self.total_txs = 0;
         self.last_block_id.clear();
         self.last_commit_hash.clear();
         self.data_hash.clear();
@@ -10054,7 +10041,7 @@ impl BlockID {
         ::std::mem::replace(&mut self.hash, ::std::vec::Vec::new())
     }
 
-    // .abci.PartSetHeader parts_header = 2;
+    // .tendermint.abci.types.PartSetHeader parts_header = 2;
 
 
     pub fn get_parts_header(&self) -> &PartSetHeader {
@@ -10662,7 +10649,7 @@ impl ValidatorUpdate {
         ::std::default::Default::default()
     }
 
-    // .abci.PubKey pub_key = 1;
+    // .tendermint.abci.types.PubKey pub_key = 1;
 
 
     pub fn get_pub_key(&self) -> &PubKey {
@@ -10881,7 +10868,7 @@ impl VoteInfo {
         ::std::default::Default::default()
     }
 
-    // .abci.Validator validator = 1;
+    // .tendermint.abci.types.Validator validator = 1;
 
 
     pub fn get_validator(&self) -> &Validator {
@@ -11340,7 +11327,7 @@ impl Evidence {
         ::std::mem::replace(&mut self.field_type, ::std::string::String::new())
     }
 
-    // .abci.Validator validator = 2;
+    // .tendermint.abci.types.Validator validator = 2;
 
 
     pub fn get_validator(&self) -> &Validator {
@@ -11699,53 +11686,59 @@ impl ::protobuf::reflect::ProtobufValue for CheckTxType {
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n\nabci.proto\x12\x04abci\"\xf1\x03\n\x07Request\x12#\n\x04echo\x18\x02\
-    \x20\x01(\x0b2\x11.abci.RequestEchoH\0B\0\x12%\n\x05flush\x18\x03\x20\
-    \x01(\x0b2\x12.abci.RequestFlushH\0B\0\x12#\n\x04info\x18\x04\x20\x01(\
-    \x0b2\x11.abci.RequestInfoH\0B\0\x12.\n\nset_option\x18\x05\x20\x01(\x0b\
-    2\x16.abci.RequestSetOptionH\0B\0\x12.\n\ninit_chain\x18\x06\x20\x01(\
-    \x0b2\x16.abci.RequestInitChainH\0B\0\x12%\n\x05query\x18\x07\x20\x01(\
-    \x0b2\x12.abci.RequestQueryH\0B\0\x120\n\x0bbegin_block\x18\x08\x20\x01(\
-    \x0b2\x17.abci.RequestBeginBlockH\0B\0\x12*\n\x08check_tx\x18\t\x20\x01(\
-    \x0b2\x14.abci.RequestCheckTxH\0B\0\x12.\n\ndeliver_tx\x18\x13\x20\x01(\
-    \x0b2\x16.abci.RequestDeliverTxH\0B\0\x12,\n\tend_block\x18\x0b\x20\x01(\
-    \x0b2\x15.abci.RequestEndBlockH\0B\0\x12'\n\x06commit\x18\x0c\x20\x01(\
-    \x0b2\x13.abci.RequestCommitH\0B\0B\x07\n\x05value:\0\"\"\n\x0bRequestEc\
-    ho\x12\x11\n\x07message\x18\x01\x20\x01(\tB\0:\0\"\x10\n\x0cRequestFlush\
-    :\0\"R\n\x0bRequestInfo\x12\x11\n\x07version\x18\x01\x20\x01(\tB\0\x12\
-    \x17\n\rblock_version\x18\x02\x20\x01(\x04B\0\x12\x15\n\x0bp2p_version\
-    \x18\x03\x20\x01(\x04B\0:\0\"4\n\x10RequestSetOption\x12\r\n\x03key\x18\
-    \x01\x20\x01(\tB\0\x12\x0f\n\x05value\x18\x02\x20\x01(\tB\0:\0\"\xdb\x01\
-    \n\x10RequestInitChain\x122\n\x04time\x18\x01\x20\x01(\x0b2\x1a.google.p\
-    rotobuf.TimestampB\x08\xc8\xde\x1f\0\x90\xdf\x1f\x01\x12\x12\n\x08chain_\
-    id\x18\x02\x20\x01(\tB\0\x121\n\x10consensus_params\x18\x03\x20\x01(\x0b\
-    2\x15.abci.ConsensusParamsB\0\x12/\n\nvalidators\x18\x04\x20\x03(\x0b2\
-    \x15.abci.ValidatorUpdateB\x04\xc8\xde\x1f\0\x12\x19\n\x0fapp_state_byte\
-    s\x18\x05\x20\x01(\x0cB\0:\0\"S\n\x0cRequestQuery\x12\x0e\n\x04data\x18\
-    \x01\x20\x01(\x0cB\0\x12\x0e\n\x04path\x18\x02\x20\x01(\tB\0\x12\x10\n\
-    \x06height\x18\x03\x20\x01(\x03B\0\x12\x0f\n\x05prove\x18\x04\x20\x01(\
-    \x08B\0:\0\"\xb3\x01\n\x11RequestBeginBlock\x12\x0e\n\x04hash\x18\x01\
-    \x20\x01(\x0cB\0\x12\"\n\x06header\x18\x02\x20\x01(\x0b2\x0c.abci.Header\
-    B\x04\xc8\xde\x1f\0\x124\n\x10last_commit_info\x18\x03\x20\x01(\x0b2\x14\
-    .abci.LastCommitInfoB\x04\xc8\xde\x1f\0\x122\n\x14byzantine_validators\
-    \x18\x04\x20\x03(\x0b2\x0e.abci.EvidenceB\x04\xc8\xde\x1f\0:\0\"C\n\x0eR\
-    equestCheckTx\x12\x0c\n\x02tx\x18\x01\x20\x01(\x0cB\0\x12!\n\x04type\x18\
-    \x02\x20\x01(\x0e2\x11.abci.CheckTxTypeB\0:\0\"\"\n\x10RequestDeliverTx\
-    \x12\x0c\n\x02tx\x18\x01\x20\x01(\x0cB\0:\0\"%\n\x0fRequestEndBlock\x12\
-    \x10\n\x06height\x18\x01\x20\x01(\x03B\0:\0\"\x11\n\rRequestCommit:\0\"\
-    \xad\x04\n\x08Response\x12.\n\texception\x18\x01\x20\x01(\x0b2\x17.abci.\
-    ResponseExceptionH\0B\0\x12$\n\x04echo\x18\x02\x20\x01(\x0b2\x12.abci.Re\
-    sponseEchoH\0B\0\x12&\n\x05flush\x18\x03\x20\x01(\x0b2\x13.abci.Response\
-    FlushH\0B\0\x12$\n\x04info\x18\x04\x20\x01(\x0b2\x12.abci.ResponseInfoH\
-    \0B\0\x12/\n\nset_option\x18\x05\x20\x01(\x0b2\x17.abci.ResponseSetOptio\
-    nH\0B\0\x12/\n\ninit_chain\x18\x06\x20\x01(\x0b2\x17.abci.ResponseInitCh\
-    ainH\0B\0\x12&\n\x05query\x18\x07\x20\x01(\x0b2\x13.abci.ResponseQueryH\
-    \0B\0\x121\n\x0bbegin_block\x18\x08\x20\x01(\x0b2\x18.abci.ResponseBegin\
-    BlockH\0B\0\x12+\n\x08check_tx\x18\t\x20\x01(\x0b2\x15.abci.ResponseChec\
-    kTxH\0B\0\x12/\n\ndeliver_tx\x18\n\x20\x01(\x0b2\x17.abci.ResponseDelive\
-    rTxH\0B\0\x12-\n\tend_block\x18\x0b\x20\x01(\x0b2\x16.abci.ResponseEndBl\
-    ockH\0B\0\x12(\n\x06commit\x18\x0c\x20\x01(\x0b2\x14.abci.ResponseCommit\
-    H\0B\0B\x07\n\x05value:\0\"&\n\x11ResponseException\x12\x0f\n\x05error\
+    \n\nabci.proto\x12\x15tendermint.abci.types\"\xac\x05\n\x07Request\x124\
+    \n\x04echo\x18\x02\x20\x01(\x0b2\".tendermint.abci.types.RequestEchoH\0B\
+    \0\x126\n\x05flush\x18\x03\x20\x01(\x0b2#.tendermint.abci.types.RequestF\
+    lushH\0B\0\x124\n\x04info\x18\x04\x20\x01(\x0b2\".tendermint.abci.types.\
+    RequestInfoH\0B\0\x12?\n\nset_option\x18\x05\x20\x01(\x0b2'.tendermint.a\
+    bci.types.RequestSetOptionH\0B\0\x12?\n\ninit_chain\x18\x06\x20\x01(\x0b\
+    2'.tendermint.abci.types.RequestInitChainH\0B\0\x126\n\x05query\x18\x07\
+    \x20\x01(\x0b2#.tendermint.abci.types.RequestQueryH\0B\0\x12A\n\x0bbegin\
+    _block\x18\x08\x20\x01(\x0b2(.tendermint.abci.types.RequestBeginBlockH\0\
+    B\0\x12;\n\x08check_tx\x18\t\x20\x01(\x0b2%.tendermint.abci.types.Reques\
+    tCheckTxH\0B\0\x12?\n\ndeliver_tx\x18\x13\x20\x01(\x0b2'.tendermint.abci\
+    .types.RequestDeliverTxH\0B\0\x12=\n\tend_block\x18\x0b\x20\x01(\x0b2&.t\
+    endermint.abci.types.RequestEndBlockH\0B\0\x128\n\x06commit\x18\x0c\x20\
+    \x01(\x0b2$.tendermint.abci.types.RequestCommitH\0B\0B\x07\n\x05value:\0\
+    \"\"\n\x0bRequestEcho\x12\x11\n\x07message\x18\x01\x20\x01(\tB\0:\0\"\
+    \x10\n\x0cRequestFlush:\0\"R\n\x0bRequestInfo\x12\x11\n\x07version\x18\
+    \x01\x20\x01(\tB\0\x12\x17\n\rblock_version\x18\x02\x20\x01(\x04B\0\x12\
+    \x15\n\x0bp2p_version\x18\x03\x20\x01(\x04B\0:\0\"4\n\x10RequestSetOptio\
+    n\x12\r\n\x03key\x18\x01\x20\x01(\tB\0\x12\x0f\n\x05value\x18\x02\x20\
+    \x01(\tB\0:\0\"\xfd\x01\n\x10RequestInitChain\x122\n\x04time\x18\x01\x20\
+    \x01(\x0b2\x1a.google.protobuf.TimestampB\x08\x90\xdf\x1f\x01\xc8\xde\
+    \x1f\0\x12\x12\n\x08chain_id\x18\x02\x20\x01(\tB\0\x12B\n\x10consensus_p\
+    arams\x18\x03\x20\x01(\x0b2&.tendermint.abci.types.ConsensusParamsB\0\
+    \x12@\n\nvalidators\x18\x04\x20\x03(\x0b2&.tendermint.abci.types.Validat\
+    orUpdateB\x04\xc8\xde\x1f\0\x12\x19\n\x0fapp_state_bytes\x18\x05\x20\x01\
+    (\x0cB\0:\0\"S\n\x0cRequestQuery\x12\x0e\n\x04data\x18\x01\x20\x01(\x0cB\
+    \0\x12\x0e\n\x04path\x18\x02\x20\x01(\tB\0\x12\x10\n\x06height\x18\x03\
+    \x20\x01(\x03B\0\x12\x0f\n\x05prove\x18\x04\x20\x01(\x08B\0:\0\"\xe6\x01\
+    \n\x11RequestBeginBlock\x12\x0e\n\x04hash\x18\x01\x20\x01(\x0cB\0\x123\n\
+    \x06header\x18\x02\x20\x01(\x0b2\x1d.tendermint.abci.types.HeaderB\x04\
+    \xc8\xde\x1f\0\x12E\n\x10last_commit_info\x18\x03\x20\x01(\x0b2%.tenderm\
+    int.abci.types.LastCommitInfoB\x04\xc8\xde\x1f\0\x12C\n\x14byzantine_val\
+    idators\x18\x04\x20\x03(\x0b2\x1f.tendermint.abci.types.EvidenceB\x04\
+    \xc8\xde\x1f\0:\0\"T\n\x0eRequestCheckTx\x12\x0c\n\x02tx\x18\x01\x20\x01\
+    (\x0cB\0\x122\n\x04type\x18\x02\x20\x01(\x0e2\".tendermint.abci.types.Ch\
+    eckTxTypeB\0:\0\"\"\n\x10RequestDeliverTx\x12\x0c\n\x02tx\x18\x01\x20\
+    \x01(\x0cB\0:\0\"%\n\x0fRequestEndBlock\x12\x10\n\x06height\x18\x01\x20\
+    \x01(\x03B\0:\0\"\x11\n\rRequestCommit:\0\"\xf9\x05\n\x08Response\x12?\n\
+    \texception\x18\x01\x20\x01(\x0b2(.tendermint.abci.types.ResponseExcepti\
+    onH\0B\0\x125\n\x04echo\x18\x02\x20\x01(\x0b2#.tendermint.abci.types.Res\
+    ponseEchoH\0B\0\x127\n\x05flush\x18\x03\x20\x01(\x0b2$.tendermint.abci.t\
+    ypes.ResponseFlushH\0B\0\x125\n\x04info\x18\x04\x20\x01(\x0b2#.tendermin\
+    t.abci.types.ResponseInfoH\0B\0\x12@\n\nset_option\x18\x05\x20\x01(\x0b2\
+    (.tendermint.abci.types.ResponseSetOptionH\0B\0\x12@\n\ninit_chain\x18\
+    \x06\x20\x01(\x0b2(.tendermint.abci.types.ResponseInitChainH\0B\0\x127\n\
+    \x05query\x18\x07\x20\x01(\x0b2$.tendermint.abci.types.ResponseQueryH\0B\
+    \0\x12B\n\x0bbegin_block\x18\x08\x20\x01(\x0b2).tendermint.abci.types.Re\
+    sponseBeginBlockH\0B\0\x12<\n\x08check_tx\x18\t\x20\x01(\x0b2&.tendermin\
+    t.abci.types.ResponseCheckTxH\0B\0\x12@\n\ndeliver_tx\x18\n\x20\x01(\x0b\
+    2(.tendermint.abci.types.ResponseDeliverTxH\0B\0\x12>\n\tend_block\x18\
+    \x0b\x20\x01(\x0b2'.tendermint.abci.types.ResponseEndBlockH\0B\0\x129\n\
+    \x06commit\x18\x0c\x20\x01(\x0b2%.tendermint.abci.types.ResponseCommitH\
+    \0B\0B\x07\n\x05value:\0\"&\n\x11ResponseException\x12\x0f\n\x05error\
     \x18\x01\x20\x01(\tB\0:\0\"#\n\x0cResponseEcho\x12\x11\n\x07message\x18\
     \x01\x20\x01(\tB\0:\0\"\x11\n\rResponseFlush:\0\"\x86\x01\n\x0cResponseI\
     nfo\x12\x0e\n\x04data\x18\x01\x20\x01(\tB\0\x12\x11\n\x07version\x18\x02\
@@ -11753,80 +11746,84 @@ static file_descriptor_proto_data: &'static [u8] = b"\
     \n\x11last_block_height\x18\x04\x20\x01(\x03B\0\x12\x1d\n\x13last_block_\
     app_hash\x18\x05\x20\x01(\x0cB\0:\0\"D\n\x11ResponseSetOption\x12\x0e\n\
     \x04code\x18\x01\x20\x01(\rB\0\x12\r\n\x03log\x18\x03\x20\x01(\tB\0\x12\
-    \x0e\n\x04info\x18\x04\x20\x01(\tB\0:\0\"y\n\x11ResponseInitChain\x121\n\
-    \x10consensus_params\x18\x01\x20\x01(\x0b2\x15.abci.ConsensusParamsB\0\
-    \x12/\n\nvalidators\x18\x02\x20\x03(\x0b2\x15.abci.ValidatorUpdateB\x04\
-    \xc8\xde\x1f\0:\0\"\xb8\x01\n\rResponseQuery\x12\x0e\n\x04code\x18\x01\
-    \x20\x01(\rB\0\x12\r\n\x03log\x18\x03\x20\x01(\tB\0\x12\x0e\n\x04info\
-    \x18\x04\x20\x01(\tB\0\x12\x0f\n\x05index\x18\x05\x20\x01(\x03B\0\x12\r\
-    \n\x03key\x18\x06\x20\x01(\x0cB\0\x12\x0f\n\x05value\x18\x07\x20\x01(\
-    \x0cB\0\x12\x1e\n\x05proof\x18\x08\x20\x01(\x0b2\r.merkle.ProofB\0\x12\
-    \x10\n\x06height\x18\t\x20\x01(\x03B\0\x12\x13\n\tcodespace\x18\n\x20\
-    \x01(\tB\0:\0\"M\n\x12ResponseBeginBlock\x125\n\x06events\x18\x01\x20\
-    \x03(\x0b2\x0b.abci.EventB\x18\xea\xde\x1f\x10events,omitempty\xc8\xde\
-    \x1f\0:\0\"\xc8\x01\n\x0fResponseCheckTx\x12\x0e\n\x04code\x18\x01\x20\
-    \x01(\rB\0\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0\x12\r\n\x03log\x18\
-    \x03\x20\x01(\tB\0\x12\x0e\n\x04info\x18\x04\x20\x01(\tB\0\x12\x14\n\nga\
-    s_wanted\x18\x05\x20\x01(\x03B\0\x12\x12\n\x08gas_used\x18\x06\x20\x01(\
-    \x03B\0\x125\n\x06events\x18\x07\x20\x03(\x0b2\x0b.abci.EventB\x18\xc8\
-    \xde\x1f\0\xea\xde\x1f\x10events,omitempty\x12\x13\n\tcodespace\x18\x08\
-    \x20\x01(\tB\0:\0\"\xca\x01\n\x11ResponseDeliverTx\x12\x0e\n\x04code\x18\
-    \x01\x20\x01(\rB\0\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0\x12\r\n\x03\
-    log\x18\x03\x20\x01(\tB\0\x12\x0e\n\x04info\x18\x04\x20\x01(\tB\0\x12\
-    \x14\n\ngas_wanted\x18\x05\x20\x01(\x03B\0\x12\x12\n\x08gas_used\x18\x06\
-    \x20\x01(\x03B\0\x125\n\x06events\x18\x07\x20\x03(\x0b2\x0b.abci.EventB\
-    \x18\xc8\xde\x1f\0\xea\xde\x1f\x10events,omitempty\x12\x13\n\tcodespace\
-    \x18\x08\x20\x01(\tB\0:\0\"\xbd\x01\n\x10ResponseEndBlock\x126\n\x11vali\
-    dator_updates\x18\x01\x20\x03(\x0b2\x15.abci.ValidatorUpdateB\x04\xc8\
-    \xde\x1f\0\x128\n\x17consensus_param_updates\x18\x02\x20\x01(\x0b2\x15.a\
-    bci.ConsensusParamsB\0\x125\n\x06events\x18\x03\x20\x03(\x0b2\x0b.abci.E\
-    ventB\x18\xea\xde\x1f\x10events,omitempty\xc8\xde\x1f\0:\0\"\"\n\x0eResp\
-    onseCommit\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0:\0\"\x8d\x01\n\x0fC\
-    onsensusParams\x12\"\n\x05block\x18\x01\x20\x01(\x0b2\x11.abci.BlockPara\
-    msB\0\x12(\n\x08evidence\x18\x02\x20\x01(\x0b2\x14.abci.EvidenceParamsB\
-    \0\x12*\n\tvalidator\x18\x03\x20\x01(\x0b2\x15.abci.ValidatorParamsB\0:\
-    \0\"7\n\x0bBlockParams\x12\x13\n\tmax_bytes\x18\x01\x20\x01(\x03B\0\x12\
-    \x11\n\x07max_gas\x18\x02\x20\x01(\x03B\0:\0\"%\n\x0eEvidenceParams\x12\
-    \x11\n\x07max_age\x18\x01\x20\x01(\x03B\0:\0\",\n\x0fValidatorParams\x12\
-    \x17\n\rpub_key_types\x18\x01\x20\x03(\tB\0:\0\"H\n\x0eLastCommitInfo\
-    \x12\x0f\n\x05round\x18\x01\x20\x01(\x05B\0\x12#\n\x05votes\x18\x02\x20\
-    \x03(\x0b2\x0e.abci.VoteInfoB\x04\xc8\xde\x1f\0:\0\"[\n\x05Event\x12\x0e\
-    \n\x04type\x18\x01\x20\x01(\tB\0\x12@\n\nattributes\x18\x02\x20\x03(\x0b\
-    2\x0e.common.KVPairB\x1c\xc8\xde\x1f\0\xea\xde\x1f\x14attributes,omitemp\
-    ty:\0\"\xd5\x03\n\x06Header\x12$\n\x07version\x18\x01\x20\x01(\x0b2\r.ab\
-    ci.VersionB\x04\xc8\xde\x1f\0\x12\x1d\n\x08chain_id\x18\x02\x20\x01(\tB\
-    \x0b\xe2\xde\x1f\x07ChainID\x12\x10\n\x06height\x18\x03\x20\x01(\x03B\0\
-    \x122\n\x04time\x18\x04\x20\x01(\x0b2\x1a.google.protobuf.TimestampB\x08\
-    \xc8\xde\x1f\0\x90\xdf\x1f\x01\x12\x11\n\x07num_txs\x18\x05\x20\x01(\x03\
-    B\0\x12\x13\n\ttotal_txs\x18\x06\x20\x01(\x03B\0\x12*\n\rlast_block_id\
-    \x18\x07\x20\x01(\x0b2\r.abci.BlockIDB\x04\xc8\xde\x1f\0\x12\x1a\n\x10la\
-    st_commit_hash\x18\x08\x20\x01(\x0cB\0\x12\x13\n\tdata_hash\x18\t\x20\
-    \x01(\x0cB\0\x12\x19\n\x0fvalidators_hash\x18\n\x20\x01(\x0cB\0\x12\x1e\
-    \n\x14next_validators_hash\x18\x0b\x20\x01(\x0cB\0\x12\x18\n\x0econsensu\
-    s_hash\x18\x0c\x20\x01(\x0cB\0\x12\x12\n\x08app_hash\x18\r\x20\x01(\x0cB\
-    \0\x12\x1b\n\x11last_results_hash\x18\x0e\x20\x01(\x0cB\0\x12\x17\n\revi\
-    dence_hash\x18\x0f\x20\x01(\x0cB\0\x12\x1a\n\x10proposer_address\x18\x10\
-    \x20\x01(\x0cB\0:\0\"+\n\x07Version\x12\x0f\n\x05Block\x18\x01\x20\x01(\
-    \x04B\0\x12\r\n\x03App\x18\x02\x20\x01(\x04B\0:\0\"L\n\x07BlockID\x12\
-    \x0e\n\x04hash\x18\x01\x20\x01(\x0cB\0\x12/\n\x0cparts_header\x18\x02\
-    \x20\x01(\x0b2\x13.abci.PartSetHeaderB\x04\xc8\xde\x1f\0:\0\"2\n\rPartSe\
-    tHeader\x12\x0f\n\x05total\x18\x01\x20\x01(\x05B\0\x12\x0e\n\x04hash\x18\
-    \x02\x20\x01(\x0cB\0:\0\"1\n\tValidator\x12\x11\n\x07address\x18\x01\x20\
-    \x01(\x0cB\0\x12\x0f\n\x05power\x18\x03\x20\x01(\x03B\0:\0\"I\n\x0fValid\
-    atorUpdate\x12#\n\x07pub_key\x18\x01\x20\x01(\x0b2\x0c.abci.PubKeyB\x04\
-    \xc8\xde\x1f\0\x12\x0f\n\x05power\x18\x02\x20\x01(\x03B\0:\0\"S\n\x08Vot\
-    eInfo\x12(\n\tvalidator\x18\x01\x20\x01(\x0b2\x0f.abci.ValidatorB\x04\
-    \xc8\xde\x1f\0\x12\x1b\n\x11signed_last_block\x18\x02\x20\x01(\x08B\0:\0\
-    \"*\n\x06PubKey\x12\x0e\n\x04type\x18\x01\x20\x01(\tB\0\x12\x0e\n\x04dat\
-    a\x18\x02\x20\x01(\x0cB\0:\0\"\xaa\x01\n\x08Evidence\x12\x0e\n\x04type\
-    \x18\x01\x20\x01(\tB\0\x12(\n\tvalidator\x18\x02\x20\x01(\x0b2\x0f.abci.\
-    ValidatorB\x04\xc8\xde\x1f\0\x12\x10\n\x06height\x18\x03\x20\x01(\x03B\0\
-    \x122\n\x04time\x18\x04\x20\x01(\x0b2\x1a.google.protobuf.TimestampB\x08\
-    \x90\xdf\x1f\x01\xc8\xde\x1f\0\x12\x1c\n\x12total_voting_power\x18\x05\
-    \x20\x01(\x03B\0:\0*%\n\x0bCheckTxType\x12\x07\n\x03New\x10\0\x12\x0b\n\
-    \x07Recheck\x10\x01\x1a\0B\x1c\xc8\xe2\x1e\x01\xe0\xe2\x1e\x01\xf8\xe1\
-    \x1e\x01\xc0\xe3\x1e\x01\xa8\xe2\x1e\x01\xb8\xe2\x1e\x01\xd0\xe2\x1e\x01\
-    b\x06proto3\
+    \x0e\n\x04info\x18\x04\x20\x01(\tB\0:\0\"\x9b\x01\n\x11ResponseInitChain\
+    \x12B\n\x10consensus_params\x18\x01\x20\x01(\x0b2&.tendermint.abci.types\
+    .ConsensusParamsB\0\x12@\n\nvalidators\x18\x02\x20\x03(\x0b2&.tendermint\
+    .abci.types.ValidatorUpdateB\x04\xc8\xde\x1f\0:\0\"\xca\x01\n\rResponseQ\
+    uery\x12\x0e\n\x04code\x18\x01\x20\x01(\rB\0\x12\r\n\x03log\x18\x03\x20\
+    \x01(\tB\0\x12\x0e\n\x04info\x18\x04\x20\x01(\tB\0\x12\x0f\n\x05index\
+    \x18\x05\x20\x01(\x03B\0\x12\r\n\x03key\x18\x06\x20\x01(\x0cB\0\x12\x0f\
+    \n\x05value\x18\x07\x20\x01(\x0cB\0\x120\n\x05proof\x18\x08\x20\x01(\x0b\
+    2\x1f.tendermint.crypto.merkle.ProofB\0\x12\x10\n\x06height\x18\t\x20\
+    \x01(\x03B\0\x12\x13\n\tcodespace\x18\n\x20\x01(\tB\0:\0\"^\n\x12Respons\
+    eBeginBlock\x12F\n\x06events\x18\x01\x20\x03(\x0b2\x1c.tendermint.abci.t\
+    ypes.EventB\x18\xea\xde\x1f\x10events,omitempty\xc8\xde\x1f\0:\0\"\xd9\
+    \x01\n\x0fResponseCheckTx\x12\x0e\n\x04code\x18\x01\x20\x01(\rB\0\x12\
+    \x0e\n\x04data\x18\x02\x20\x01(\x0cB\0\x12\r\n\x03log\x18\x03\x20\x01(\t\
+    B\0\x12\x0e\n\x04info\x18\x04\x20\x01(\tB\0\x12\x14\n\ngas_wanted\x18\
+    \x05\x20\x01(\x03B\0\x12\x12\n\x08gas_used\x18\x06\x20\x01(\x03B\0\x12F\
+    \n\x06events\x18\x07\x20\x03(\x0b2\x1c.tendermint.abci.types.EventB\x18\
+    \xea\xde\x1f\x10events,omitempty\xc8\xde\x1f\0\x12\x13\n\tcodespace\x18\
+    \x08\x20\x01(\tB\0:\0\"\xdb\x01\n\x11ResponseDeliverTx\x12\x0e\n\x04code\
+    \x18\x01\x20\x01(\rB\0\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0\x12\r\n\
+    \x03log\x18\x03\x20\x01(\tB\0\x12\x0e\n\x04info\x18\x04\x20\x01(\tB\0\
+    \x12\x14\n\ngas_wanted\x18\x05\x20\x01(\x03B\0\x12\x12\n\x08gas_used\x18\
+    \x06\x20\x01(\x03B\0\x12F\n\x06events\x18\x07\x20\x03(\x0b2\x1c.tendermi\
+    nt.abci.types.EventB\x18\xc8\xde\x1f\0\xea\xde\x1f\x10events,omitempty\
+    \x12\x13\n\tcodespace\x18\x08\x20\x01(\tB\0:\0\"\xf0\x01\n\x10ResponseEn\
+    dBlock\x12G\n\x11validator_updates\x18\x01\x20\x03(\x0b2&.tendermint.abc\
+    i.types.ValidatorUpdateB\x04\xc8\xde\x1f\0\x12I\n\x17consensus_param_upd\
+    ates\x18\x02\x20\x01(\x0b2&.tendermint.abci.types.ConsensusParamsB\0\x12\
+    F\n\x06events\x18\x03\x20\x03(\x0b2\x1c.tendermint.abci.types.EventB\x18\
+    \xc8\xde\x1f\0\xea\xde\x1f\x10events,omitempty:\0\"\"\n\x0eResponseCommi\
+    t\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0:\0\"\xc0\x01\n\x0fConsensusP\
+    arams\x123\n\x05block\x18\x01\x20\x01(\x0b2\".tendermint.abci.types.Bloc\
+    kParamsB\0\x129\n\x08evidence\x18\x02\x20\x01(\x0b2%.tendermint.abci.typ\
+    es.EvidenceParamsB\0\x12;\n\tvalidator\x18\x03\x20\x01(\x0b2&.tendermint\
+    .abci.types.ValidatorParamsB\0:\0\"7\n\x0bBlockParams\x12\x13\n\tmax_byt\
+    es\x18\x01\x20\x01(\x03B\0\x12\x11\n\x07max_gas\x18\x02\x20\x01(\x03B\0:\
+    \0\"o\n\x0eEvidenceParams\x12\x1c\n\x12max_age_num_blocks\x18\x01\x20\
+    \x01(\x03B\0\x12=\n\x10max_age_duration\x18\x02\x20\x01(\x0b2\x19.google\
+    .protobuf.DurationB\x08\x98\xdf\x1f\x01\xc8\xde\x1f\0:\0\",\n\x0fValidat\
+    orParams\x12\x17\n\rpub_key_types\x18\x01\x20\x03(\tB\0:\0\"Y\n\x0eLastC\
+    ommitInfo\x12\x0f\n\x05round\x18\x01\x20\x01(\x05B\0\x124\n\x05votes\x18\
+    \x02\x20\x03(\x0b2\x1f.tendermint.abci.types.VoteInfoB\x04\xc8\xde\x1f\0\
+    :\0\"e\n\x05Event\x12\x0e\n\x04type\x18\x01\x20\x01(\tB\0\x12J\n\nattrib\
+    utes\x18\x02\x20\x03(\x0b2\x18.tendermint.libs.kv.PairB\x1c\xea\xde\x1f\
+    \x14attributes,omitempty\xc8\xde\x1f\0:\0\"\xcf\x03\n\x06Header\x125\n\
+    \x07version\x18\x01\x20\x01(\x0b2\x1e.tendermint.abci.types.VersionB\x04\
+    \xc8\xde\x1f\0\x12\x1d\n\x08chain_id\x18\x02\x20\x01(\tB\x0b\xe2\xde\x1f\
+    \x07ChainID\x12\x10\n\x06height\x18\x03\x20\x01(\x03B\0\x122\n\x04time\
+    \x18\x04\x20\x01(\x0b2\x1a.google.protobuf.TimestampB\x08\xc8\xde\x1f\0\
+    \x90\xdf\x1f\x01\x12;\n\rlast_block_id\x18\x05\x20\x01(\x0b2\x1e.tenderm\
+    int.abci.types.BlockIDB\x04\xc8\xde\x1f\0\x12\x1a\n\x10last_commit_hash\
+    \x18\x06\x20\x01(\x0cB\0\x12\x13\n\tdata_hash\x18\x07\x20\x01(\x0cB\0\
+    \x12\x19\n\x0fvalidators_hash\x18\x08\x20\x01(\x0cB\0\x12\x1e\n\x14next_\
+    validators_hash\x18\t\x20\x01(\x0cB\0\x12\x18\n\x0econsensus_hash\x18\n\
+    \x20\x01(\x0cB\0\x12\x12\n\x08app_hash\x18\x0b\x20\x01(\x0cB\0\x12\x1b\n\
+    \x11last_results_hash\x18\x0c\x20\x01(\x0cB\0\x12\x17\n\revidence_hash\
+    \x18\r\x20\x01(\x0cB\0\x12\x1a\n\x10proposer_address\x18\x0e\x20\x01(\
+    \x0cB\0:\0\"+\n\x07Version\x12\x0f\n\x05Block\x18\x01\x20\x01(\x04B\0\
+    \x12\r\n\x03App\x18\x02\x20\x01(\x04B\0:\0\"]\n\x07BlockID\x12\x0e\n\x04\
+    hash\x18\x01\x20\x01(\x0cB\0\x12@\n\x0cparts_header\x18\x02\x20\x01(\x0b\
+    2$.tendermint.abci.types.PartSetHeaderB\x04\xc8\xde\x1f\0:\0\"2\n\rPartS\
+    etHeader\x12\x0f\n\x05total\x18\x01\x20\x01(\x05B\0\x12\x0e\n\x04hash\
+    \x18\x02\x20\x01(\x0cB\0:\0\"1\n\tValidator\x12\x11\n\x07address\x18\x01\
+    \x20\x01(\x0cB\0\x12\x0f\n\x05power\x18\x03\x20\x01(\x03B\0:\0\"Z\n\x0fV\
+    alidatorUpdate\x124\n\x07pub_key\x18\x01\x20\x01(\x0b2\x1d.tendermint.ab\
+    ci.types.PubKeyB\x04\xc8\xde\x1f\0\x12\x0f\n\x05power\x18\x02\x20\x01(\
+    \x03B\0:\0\"d\n\x08VoteInfo\x129\n\tvalidator\x18\x01\x20\x01(\x0b2\x20.\
+    tendermint.abci.types.ValidatorB\x04\xc8\xde\x1f\0\x12\x1b\n\x11signed_l\
+    ast_block\x18\x02\x20\x01(\x08B\0:\0\"*\n\x06PubKey\x12\x0e\n\x04type\
+    \x18\x01\x20\x01(\tB\0\x12\x0e\n\x04data\x18\x02\x20\x01(\x0cB\0:\0\"\
+    \xbb\x01\n\x08Evidence\x12\x0e\n\x04type\x18\x01\x20\x01(\tB\0\x129\n\tv\
+    alidator\x18\x02\x20\x01(\x0b2\x20.tendermint.abci.types.ValidatorB\x04\
+    \xc8\xde\x1f\0\x12\x10\n\x06height\x18\x03\x20\x01(\x03B\0\x122\n\x04tim\
+    e\x18\x04\x20\x01(\x0b2\x1a.google.protobuf.TimestampB\x08\x90\xdf\x1f\
+    \x01\xc8\xde\x1f\0\x12\x1c\n\x12total_voting_power\x18\x05\x20\x01(\x03B\
+    \0:\0*%\n\x0bCheckTxType\x12\x07\n\x03New\x10\0\x12\x0b\n\x07Recheck\x10\
+    \x01\x1a\0B\x1c\xb8\xe2\x1e\x01\xc0\xe3\x1e\x01\xc8\xe2\x1e\x01\xe0\xe2\
+    \x1e\x01\xf8\xe1\x1e\x01\xd0\xe2\x1e\x01\xa8\xe2\x1e\x01b\x06proto3\
 ";
 
 static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy {
diff --git a/src/messages/merkle.rs b/src/messages/merkle.rs
index 3d16e8f..0d4da96 100644
--- a/src/messages/merkle.rs
+++ b/src/messages/merkle.rs
@@ -1,7 +1,7 @@
-// This file is generated by rust-protobuf 2.10.0. Do not edit
+// This file is generated by rust-protobuf 2.10.2. Do not edit
 // @generated
 
-// https://github.com/Manishearth/rust-clippy/issues/702
+// https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
@@ -17,14 +17,14 @@
 #![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
-//! Generated file from `github.com/tendermint/tendermint/crypto/merkle/merkle.proto`
+//! Generated file from `crypto/merkle/merkle.proto`
 
 use protobuf::Message as Message_imported_for_functions;
 use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_0;
+// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_2;
 
 #[derive(PartialEq,Clone,Default)]
 pub struct ProofOp {
@@ -299,7 +299,7 @@ impl Proof {
         ::std::default::Default::default()
     }
 
-    // repeated .merkle.ProofOp ops = 1;
+    // repeated .tendermint.crypto.merkle.ProofOp ops = 1;
 
 
     pub fn get_ops(&self) -> &[ProofOp] {
@@ -456,12 +456,12 @@ impl ::protobuf::reflect::ProtobufValue for Proof {
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n;github.com/tendermint/tendermint/crypto/merkle/merkle.proto\x12\x06me\
-    rkle\":\n\x07ProofOp\x12\x0e\n\x04type\x18\x01\x20\x01(\tB\0\x12\r\n\x03\
-    key\x18\x02\x20\x01(\x0cB\0\x12\x0e\n\x04data\x18\x03\x20\x01(\x0cB\0:\0\
-    \"-\n\x05Proof\x12\"\n\x03ops\x18\x01\x20\x03(\x0b2\x0f.merkle.ProofOpB\
-    \x04\xc8\xde\x1f\0:\0B\x14\xf8\xe1\x1e\x01\xe0\xe2\x1e\x01\xa8\xe2\x1e\
-    \x01\xd0\xe2\x1e\x01\xc8\xe2\x1e\x01b\x06proto3\
+    \n\x1acrypto/merkle/merkle.proto\x12\x18tendermint.crypto.merkle\":\n\
+    \x07ProofOp\x12\x0e\n\x04type\x18\x01\x20\x01(\tB\0\x12\r\n\x03key\x18\
+    \x02\x20\x01(\x0cB\0\x12\x0e\n\x04data\x18\x03\x20\x01(\x0cB\0:\0\"?\n\
+    \x05Proof\x124\n\x03ops\x18\x01\x20\x03(\x0b2!.tendermint.crypto.merkle.\
+    ProofOpB\x04\xc8\xde\x1f\0:\0B\x14\xc8\xe2\x1e\x01\xd0\xe2\x1e\x01\xf8\
+    \xe1\x1e\x01\xa8\xe2\x1e\x01\xe0\xe2\x1e\x01b\x06proto3\
 ";
 
 static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy {
diff --git a/src/messages/types.rs b/src/messages/types.rs
index a7a8980..72c4195 100644
--- a/src/messages/types.rs
+++ b/src/messages/types.rs
@@ -1,7 +1,7 @@
-// This file is generated by rust-protobuf 2.10.0. Do not edit
+// This file is generated by rust-protobuf 2.10.2. Do not edit
 // @generated
 
-// https://github.com/Manishearth/rust-clippy/issues/702
+// https://github.com/rust-lang/rust-clippy/issues/702
 #![allow(unknown_lints)]
 #![allow(clippy::all)]
 
@@ -17,17 +17,17 @@
 #![allow(unsafe_code)]
 #![allow(unused_imports)]
 #![allow(unused_results)]
-//! Generated file from `github.com/tendermint/tendermint/libs/common/types.proto`
+//! Generated file from `libs/kv/types.proto`
 
 use protobuf::Message as Message_imported_for_functions;
 use protobuf::ProtobufEnum as ProtobufEnum_imported_for_functions;
 
 /// Generated files are compatible only with the same version
 /// of protobuf runtime.
-const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_0;
+// const _PROTOBUF_VERSION_CHECK: () = ::protobuf::VERSION_2_10_2;
 
 #[derive(PartialEq,Clone,Default)]
-pub struct KVPair {
+pub struct Pair {
     // message fields
     pub key: ::std::vec::Vec<u8>,
     pub value: ::std::vec::Vec<u8>,
@@ -36,14 +36,14 @@ pub struct KVPair {
     pub cached_size: ::protobuf::CachedSize,
 }
 
-impl<'a> ::std::default::Default for &'a KVPair {
-    fn default() -> &'a KVPair {
-        <KVPair as ::protobuf::Message>::default_instance()
+impl<'a> ::std::default::Default for &'a Pair {
+    fn default() -> &'a Pair {
+        <Pair as ::protobuf::Message>::default_instance()
     }
 }
 
-impl KVPair {
-    pub fn new() -> KVPair {
+impl Pair {
+    pub fn new() -> Pair {
         ::std::default::Default::default()
     }
 
@@ -100,7 +100,7 @@ impl KVPair {
     }
 }
 
-impl ::protobuf::Message for KVPair {
+impl ::protobuf::Message for Pair {
     fn is_initialized(&self) -> bool {
         true
     }
@@ -175,8 +175,8 @@ impl ::protobuf::Message for KVPair {
         Self::descriptor_static()
     }
 
-    fn new() -> KVPair {
-        KVPair::new()
+    fn new() -> Pair {
+        Pair::new()
     }
 
     fn descriptor_static() -> &'static ::protobuf::reflect::MessageDescriptor {
@@ -189,16 +189,16 @@ impl ::protobuf::Message for KVPair {
                 let mut fields = ::std::vec::Vec::new();
                 fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
                     "key",
-                    |m: &KVPair| { &m.key },
-                    |m: &mut KVPair| { &mut m.key },
+                    |m: &Pair| { &m.key },
+                    |m: &mut Pair| { &mut m.key },
                 ));
                 fields.push(::protobuf::reflect::accessor::make_simple_field_accessor::<_, ::protobuf::types::ProtobufTypeBytes>(
                     "value",
-                    |m: &KVPair| { &m.value },
-                    |m: &mut KVPair| { &mut m.value },
+                    |m: &Pair| { &m.value },
+                    |m: &mut Pair| { &mut m.value },
                 ));
-                ::protobuf::reflect::MessageDescriptor::new::<KVPair>(
-                    "KVPair",
+                ::protobuf::reflect::MessageDescriptor::new::<Pair>(
+                    "Pair",
                     fields,
                     file_descriptor_proto()
                 )
@@ -206,18 +206,18 @@ impl ::protobuf::Message for KVPair {
         }
     }
 
-    fn default_instance() -> &'static KVPair {
-        static mut instance: ::protobuf::lazy::Lazy<KVPair> = ::protobuf::lazy::Lazy {
+    fn default_instance() -> &'static Pair {
+        static mut instance: ::protobuf::lazy::Lazy<Pair> = ::protobuf::lazy::Lazy {
             lock: ::protobuf::lazy::ONCE_INIT,
-            ptr: 0 as *const KVPair,
+            ptr: 0 as *const Pair,
         };
         unsafe {
-            instance.get(KVPair::new)
+            instance.get(Pair::new)
         }
     }
 }
 
-impl ::protobuf::Clear for KVPair {
+impl ::protobuf::Clear for Pair {
     fn clear(&mut self) {
         self.key.clear();
         self.value.clear();
@@ -225,13 +225,13 @@ impl ::protobuf::Clear for KVPair {
     }
 }
 
-impl ::std::fmt::Debug for KVPair {
+impl ::std::fmt::Debug for Pair {
     fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
         ::protobuf::text_format::fmt(self, f)
     }
 }
 
-impl ::protobuf::reflect::ProtobufValue for KVPair {
+impl ::protobuf::reflect::ProtobufValue for Pair {
     fn as_ref(&self) -> ::protobuf::reflect::ProtobufValueRef {
         ::protobuf::reflect::ProtobufValueRef::Message(self)
     }
@@ -442,12 +442,12 @@ impl ::protobuf::reflect::ProtobufValue for KI64Pair {
 }
 
 static file_descriptor_proto_data: &'static [u8] = b"\
-    \n8github.com/tendermint/tendermint/libs/common/types.proto\x12\x06commo\
-    n\"*\n\x06KVPair\x12\r\n\x03key\x18\x01\x20\x01(\x0cB\0\x12\x0f\n\x05val\
-    ue\x18\x02\x20\x01(\x0cB\0:\0\",\n\x08KI64Pair\x12\r\n\x03key\x18\x01\
-    \x20\x01(\x0cB\0\x12\x0f\n\x05value\x18\x02\x20\x01(\x03B\0:\0B\x1c\xd0\
-    \xe2\x1e\x01\xa8\xe2\x1e\x01\xc8\xe2\x1e\x01\xb8\xe2\x1e\x01\xf8\xe1\x1e\
-    \x01\xe0\xe2\x1e\x01\xc0\xe3\x1e\x01b\x06proto3\
+    \n\x13libs/kv/types.proto\x12\x12tendermint.libs.kv\"(\n\x04Pair\x12\r\n\
+    \x03key\x18\x01\x20\x01(\x0cB\0\x12\x0f\n\x05value\x18\x02\x20\x01(\x0cB\
+    \0:\0\",\n\x08KI64Pair\x12\r\n\x03key\x18\x01\x20\x01(\x0cB\0\x12\x0f\n\
+    \x05value\x18\x02\x20\x01(\x03B\0:\0B\x1c\xe0\xe2\x1e\x01\xc0\xe3\x1e\
+    \x01\xb8\xe2\x1e\x01\xd0\xe2\x1e\x01\xc8\xe2\x1e\x01\xf8\xe1\x1e\x01\xa8\
+    \xe2\x1e\x01b\x06proto3\
 ";
 
 static mut file_descriptor_proto_lazy: ::protobuf::lazy::Lazy<::protobuf::descriptor::FileDescriptorProto> = ::protobuf::lazy::Lazy {
diff --git a/version.txt b/version.txt
index c9130e6..09ebf5d 100644
--- a/version.txt
+++ b/version.txt
@@ -1,6 +1,6 @@
-	Version string = TMCoreSemVer
+	Version = TMCoreSemVer
 	// TMCoreSemVer is the current version of Tendermint Core.
-	TMCoreSemVer = "0.32.8"
+	TMCoreSemVer = "0.33.1"
 	// ABCISemVer is the semantic version of the ABCI library
 	ABCISemVer  = "0.16.1"
 	ABCIVersion = ABCISemVer


Test patch: