From bb1f1a21bf540dad6b1d39d2c013b5cef59559c0 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Fri, 13 Jul 2018 22:17:53 -0400 Subject: [PATCH 01/30] Fix Cross Compile Build/Ledger Build Tag (#1674) * Merge pull request #1674: Fix Cross Compile Build/Ledger Build Tag * Merge pull request #1674: Fix Cross Compile Build/Ledger Build Tag * Remove incorrect Ledger test --- CHANGELOG.md | 2 + Gopkg.lock | 184 ++++++++++++++++++++++++++++++++---- Gopkg.toml | 2 +- Makefile | 36 +++++--- crypto/keys/keybase.go | 37 ++++---- crypto/ledger.go | 18 ++++ crypto/ledger_common.go | 19 ---- crypto/ledger_secp256k1.go | 185 ++++++++++++++++++++++--------------- crypto/ledger_test.go | 32 +++---- 9 files changed, 356 insertions(+), 159 deletions(-) create mode 100644 crypto/ledger.go delete mode 100644 crypto/ledger_common.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 547ab53459..532e981550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ BUG FIXES * [keys] \#1629 - updating password no longer asks for a new password when the first entered password was incorrect * [lcd] importing an account would create a random account * [server] 'gaiad init' command family now writes provided name as the moniker in `config.toml` +* [build] Added Ledger build support via `LEDGER_ENABLED=true|false` + * True by default except when cross-compiling ## 0.20.0 diff --git a/Gopkg.lock b/Gopkg.lock index ee1b5cf1ee..a1372b1fa8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -3,59 +3,78 @@ [[projects]] branch = "master" + digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] + pruneopts = "UT" revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[projects]] branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] + pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] + digest = "1:1343a2963481a305ca4d051e84bc2abd16b601ee22ed324f8d605de1adb291b0" name = "github.com/bgentry/speakeasy" packages = ["."] + pruneopts = "UT" revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" version = "v0.1.0" [[projects]] branch = "master" + digest = "1:70f6b224a59b2fa453debffa85c77f71063d8754b90c8c4fbad5794e2c382b0f" name = "github.com/brejski/hid" packages = ["."] + pruneopts = "UT" revision = "06112dcfcc50a7e0e4fd06e17f9791e788fdaafc" [[projects]] branch = "master" + digest = "1:6aabc1566d6351115d561d038da82a4c19b46c3b6e17f4a0a2fa60260663dc79" name = "github.com/btcsuite/btcd" packages = ["btcec"] + pruneopts = "UT" revision = "fdfc19097e7ac6b57035062056f5b7b4638b8898" [[projects]] branch = "master" + digest = "1:386de157f7d19259a7f9c81f26ce011223ce0f090353c1152ffdf730d7d10ac2" name = "github.com/btcsuite/btcutil" packages = ["bech32"] + pruneopts = "UT" revision = "ab6388e0c60ae4834a1f57511e20c17b5f78be4b" [[projects]] + digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "UT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:c7644c73a3d23741fdba8a99b1464e021a224b7e205be497271a8003a15ca41b" name = "github.com/ebuchman/fail-test" packages = ["."] + pruneopts = "UT" revision = "95f809107225be108efcf10a3509e4ea6ceef3c4" [[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" name = "github.com/fsnotify/fsnotify" packages = ["."] + pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] + digest = "1:fa30c0652956e159cdb97dcb2ef8b8db63ed668c02a5c3a40961c8f0641252fe" name = "github.com/go-kit/kit" packages = [ "log", @@ -64,24 +83,30 @@ "metrics", "metrics/discard", "metrics/internal/lv", - "metrics/prometheus" + "metrics/prometheus", ] + pruneopts = "UT" revision = "4dc7be5d2d12881735283bcab7352178e190fc71" version = "v0.6.0" [[projects]] + digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" name = "github.com/go-logfmt/logfmt" packages = ["."] + pruneopts = "UT" revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" [[projects]] + digest = "1:c4a2528ccbcabf90f9f3c464a5fc9e302d592861bbfd0b7135a7de8a943d0406" name = "github.com/go-stack/stack" packages = ["."] + pruneopts = "UT" revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc" version = "v1.7.0" [[projects]] + digest = "1:af1306bff89268721ea2550d504413c9487ebfca11e2ff8f39ae79b99a720ff5" name = "github.com/gogo/protobuf" packages = [ "gogoproto", @@ -89,49 +114,61 @@ "proto", "protoc-gen-gogo/descriptor", "sortkeys", - "types" + "types", ] + pruneopts = "UT" revision = "1adfc126b41513cc696b209667c8656ea7aac67c" version = "v1.0.0" [[projects]] + digest = "1:cb22af0ed7c72d495d8be1106233ee553898950f15fd3f5404406d44c2e86888" name = "github.com/golang/protobuf" packages = [ "proto", "ptypes", "ptypes/any", "ptypes/duration", - "ptypes/timestamp" + "ptypes/timestamp", ] + pruneopts = "UT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:4a0c6bb4805508a6287675fac876be2ac1182539ca8a32468d8128882e9d5009" name = "github.com/golang/snappy" packages = ["."] + pruneopts = "UT" revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a" [[projects]] + digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" name = "github.com/gorilla/context" packages = ["."] + pruneopts = "UT" revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" version = "v1.1.1" [[projects]] + digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f" name = "github.com/gorilla/mux" packages = ["."] + pruneopts = "UT" revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" version = "v1.6.2" [[projects]] + digest = "1:43dd08a10854b2056e615d1b1d22ac94559d822e1f8b6fcc92c1a1057e85188e" name = "github.com/gorilla/websocket" packages = ["."] + pruneopts = "UT" revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:8951fe6e358876736d8fa1f3992624fdbb2dec6bc49401c1381d1ef8abbb544f" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -142,162 +179,208 @@ "hcl/token", "json/parser", "json/scanner", - "json/token" + "json/token", ] + pruneopts = "UT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] + pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] branch = "master" + digest = "1:39b27d1381a30421f9813967a5866fba35dc1d4df43a6eefe3b7a5444cb07214" name = "github.com/jmhodges/levigo" packages = ["."] + pruneopts = "UT" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" [[projects]] branch = "master" + digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" name = "github.com/kr/logfmt" packages = ["."] + pruneopts = "UT" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" [[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" name = "github.com/magiconair/properties" packages = ["."] + pruneopts = "UT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] + digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" name = "github.com/mattn/go-isatty" packages = ["."] + pruneopts = "UT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] + pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" + digest = "1:e730597b38a4d56e2361e0b6236cb800e52c73cace2ff91396f4ff35792ddfa7" name = "github.com/mitchellh/mapstructure" packages = ["."] + pruneopts = "UT" revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" [[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" name = "github.com/pelletier/go-toml" packages = ["."] + pruneopts = "UT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] + digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] + pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] + pruneopts = "UT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] branch = "master" + digest = "1:98225904b7abff96c052b669b25788f18225a36673fba022fb93514bb9a2a64e" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp" + "prometheus/promhttp", ] + pruneopts = "UT" revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" + digest = "1:53a76eb11bdc815fcf0c757a9648fda0ab6887da13f07587181ff2223b67956c" name = "github.com/prometheus/client_model" packages = ["go"] + pruneopts = "UT" revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" [[projects]] branch = "master" + digest = "1:4d291d51042ed9de40eef61a3c1b56e969d6e0f8aa5fd3da5e958ec66bee68e4" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model" + "model", ] + pruneopts = "UT" revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" [[projects]] branch = "master" + digest = "1:55d7449d6987dabf272b4e81b2f9c449f05b17415c939b68d1e82f57e3374b7f" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs" + "xfs", ] + pruneopts = "UT" revision = "ae68e2d4c00fed4943b5f6698d504a5fe083da8a" [[projects]] branch = "master" + digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" packages = ["."] + pruneopts = "UT" revision = "e2704e165165ec55d062f5919b4b29494e9fa790" [[projects]] + digest = "1:37ace7f35375adec11634126944bdc45a673415e2fcc07382d03b75ec76ea94c" name = "github.com/spf13/afero" packages = [ ".", - "mem" + "mem", ] + pruneopts = "UT" revision = "787d034dfe70e44075ccc060d346146ef53270ad" version = "v1.1.1" [[projects]] + digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" name = "github.com/spf13/cast" packages = ["."] + pruneopts = "UT" revision = "8965335b8c7107321228e3e3702cab9832751bac" version = "v1.2.0" [[projects]] + digest = "1:627ab2f549a6a55c44f46fa24a4307f4d0da81bfc7934ed0473bf38b24051d26" name = "github.com/spf13/cobra" packages = ["."] + pruneopts = "UT" revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b" version = "v0.0.1" [[projects]] branch = "master" + digest = "1:080e5f630945ad754f4b920e60b4d3095ba0237ebf88dc462eb28002932e3805" name = "github.com/spf13/jwalterweatherman" packages = ["."] + pruneopts = "UT" revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" [[projects]] + digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "UT" revision = "583c0c0531f06d5278b7d917446061adc344b5cd" version = "v1.0.1" [[projects]] + digest = "1:f8e1a678a2571e265f4bf91a3e5e32aa6b1474a55cb0ea849750cc177b664d96" name = "github.com/spf13/viper" packages = ["."] + pruneopts = "UT" revision = "25b30aa063fc18e48662b86996252eabdcf2f0c7" version = "v1.0.0" [[projects]] + digest = "1:73697231b93fb74a73ebd8384b68b9a60c57ea6b13c56d2425414566a72c8e6d" name = "github.com/stretchr/testify" packages = [ "assert", - "require" + "require", ] + pruneopts = "UT" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" version = "v1.2.1" [[projects]] branch = "master" + digest = "1:922191411ad8f61bcd8018ac127589bb489712c1d1a0ab2497aca4b16de417d2" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -311,33 +394,41 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util" + "leveldb/util", ] + pruneopts = "UT" revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] branch = "master" + digest = "1:203b409c21115233a576f99e8f13d8e07ad82b25500491f7e1cca12588fb3232" name = "github.com/tendermint/ed25519" packages = [ ".", "edwards25519", - "extra25519" + "extra25519", ] + pruneopts = "UT" revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057" [[projects]] + digest = "1:e9113641c839c21d8eaeb2c907c7276af1eddeed988df8322168c56b7e06e0e1" name = "github.com/tendermint/go-amino" packages = ["."] + pruneopts = "UT" revision = "2106ca61d91029c931fd54968c2bb02dc96b1412" version = "0.10.1" [[projects]] + digest = "1:d4a15d404afbf591e8be16fcda7f5ac87948d5c7531f9d909fd84cc730ab16e2" name = "github.com/tendermint/iavl" packages = ["."] + pruneopts = "UT" revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9" version = "v0.9.2" [[projects]] + digest = "1:2511fa7bc2725251a1a48a923c8f01cd41de29b00a21224092d448a9e4627c21" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -392,18 +483,22 @@ "state/txindex/kv", "state/txindex/null", "types", - "version" + "version", ] + pruneopts = "UT" revision = "5ff65274b84ea905787a48512cc3124385bddf2f" version = "v0.22.2" [[projects]] + digest = "1:5bd938386bd1f61a581bf8cd6ff2b7b2f79c542929176db4ceb44965440dae07" name = "github.com/zondax/ledger-goclient" packages = ["."] - revision = "065cbf938a16f20335c40cfe180f9cd4955c6a5a" + pruneopts = "UT" + revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [[projects]] branch = "master" + digest = "1:e8206c1653e050116ec8c9a823a86413fc9f9ee3c2f3ae977c96d6a1747f7325" name = "golang.org/x/crypto" packages = [ "blowfish", @@ -416,12 +511,14 @@ "pbkdf2", "poly1305", "ripemd160", - "salsa20/salsa" + "salsa20/salsa", ] + pruneopts = "UT" revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" [[projects]] branch = "master" + digest = "1:04dda8391c3e2397daf254ac68003f30141c069b228d06baec8324a5f81dc1e9" name = "golang.org/x/net" packages = [ "context", @@ -431,17 +528,21 @@ "idna", "internal/timeseries", "netutil", - "trace" + "trace", ] + pruneopts = "UT" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" + digest = "1:d773e525476aefa22ea944a5425a9bfb99819b2e67eeb9b1966454fd57522bbf" name = "golang.org/x/sys" packages = ["unix"] + pruneopts = "UT" revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" [[projects]] + digest = "1:7509ba4347d1f8de6ae9be8818b0cd1abc3deeffe28aeaf4be6d4b6b5178d9ca" name = "golang.org/x/text" packages = [ "collate", @@ -457,18 +558,22 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] + pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] branch = "master" + digest = "1:601e63e7d4577f907118bec825902505291918859d223bce015539e79f1160e3" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] + pruneopts = "UT" revision = "e92b116572682a5b432ddd840aeaba2a559eeff1" [[projects]] + digest = "1:4d7b5d9746840266938cdb21a40f8eba7137d9153c4ed404d6bb2a450d06f690" name = "google.golang.org/grpc" packages = [ ".", @@ -493,20 +598,63 @@ "stats", "status", "tap", - "transport" + "transport", ] + pruneopts = "UT" revision = "d11072e7ca9811b1100b80ca0269ac831f06d024" version = "v1.11.3" [[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" name = "gopkg.in/yaml.v2" packages = ["."] + pruneopts = "UT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "5c3ab73a85af1b3110b5f7ddbb27e77bb9cf42848ee29efcad9d78c0ecc26519" + input-imports = [ + "github.com/bartekn/go-bip39", + "github.com/bgentry/speakeasy", + "github.com/btcsuite/btcd/btcec", + "github.com/golang/protobuf/proto", + "github.com/gorilla/mux", + "github.com/mattn/go-isatty", + "github.com/pkg/errors", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/require", + "github.com/tendermint/go-amino", + "github.com/tendermint/iavl", + "github.com/tendermint/tendermint/abci/server", + "github.com/tendermint/tendermint/abci/types", + "github.com/tendermint/tendermint/cmd/tendermint/commands", + "github.com/tendermint/tendermint/config", + "github.com/tendermint/tendermint/crypto", + "github.com/tendermint/tendermint/crypto/merkle", + "github.com/tendermint/tendermint/crypto/tmhash", + "github.com/tendermint/tendermint/libs/bech32", + "github.com/tendermint/tendermint/libs/cli", + "github.com/tendermint/tendermint/libs/cli/flags", + "github.com/tendermint/tendermint/libs/common", + "github.com/tendermint/tendermint/libs/db", + "github.com/tendermint/tendermint/libs/log", + "github.com/tendermint/tendermint/node", + "github.com/tendermint/tendermint/p2p", + "github.com/tendermint/tendermint/privval", + "github.com/tendermint/tendermint/proxy", + "github.com/tendermint/tendermint/rpc/client", + "github.com/tendermint/tendermint/rpc/core/types", + "github.com/tendermint/tendermint/rpc/lib/client", + "github.com/tendermint/tendermint/rpc/lib/server", + "github.com/tendermint/tendermint/types", + "github.com/zondax/ledger-goclient", + "golang.org/x/crypto/blowfish", + "golang.org/x/crypto/ripemd160", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 0bb13c3e38..da2c8e29ce 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/zondax/ledger-goclient" - revision = "065cbf938a16f20335c40cfe180f9cd4955c6a5a" + revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [prune] go-tests = true diff --git a/Makefile b/Makefile index 4d761ede14..6f440e0200 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') PACKAGES_NOCLITEST=$(shell go list ./... | grep -v '/vendor/' | grep -v github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test) COMMIT_HASH := $(shell git rev-parse --short HEAD) -BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" - +BUILD_TAGS = netgo ledger +BUILD_FLAGS = -tags "${BUILD_TAGS}" -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" +GCC := $(shell command -v gcc 2> /dev/null) +LEDGER_ENABLED ?= true all: get_tools get_vendor_deps install install_examples test_lint test ######################################## @@ -11,10 +13,19 @@ all: get_tools get_vendor_deps install install_examples test_lint test ci: get_tools get_vendor_deps install test_cover test_lint test ######################################## -### Build +### Build/Install -# This can be unified later, here for easy demos -build: +check-ledger: +ifeq ($(LEDGER_ENABLED),true) +ifndef GCC +$(error "gcc not installed for ledger support, please install") +endif +else +TMP_BUILD_TAGS := $(BUILD_TAGS) +BUILD_TAGS = $(filter-out ledger, $(TMP_BUILD_TAGS)) +endif + +build: check-ledger ifeq ($(OS),Windows_NT) go build $(BUILD_FLAGS) -o build/gaiad.exe ./cmd/gaia/cmd/gaiad go build $(BUILD_FLAGS) -o build/gaiacli.exe ./cmd/gaia/cmd/gaiacli @@ -23,6 +34,9 @@ else go build $(BUILD_FLAGS) -o build/gaiacli ./cmd/gaia/cmd/gaiacli endif +build-linux: + LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build + build_examples: ifeq ($(OS),Windows_NT) go build $(BUILD_FLAGS) -o build/basecoind.exe ./examples/basecoin/cmd/basecoind @@ -36,7 +50,7 @@ else go build $(BUILD_FLAGS) -o build/democli ./examples/democoin/cmd/democli endif -install: +install: check-ledger go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiad go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiacli @@ -141,10 +155,6 @@ devdoc_update: ######################################## ### Local validator nodes using docker and docker-compose -# Build linux binary -build-linux: - GOOS=linux GOARCH=amd64 $(MAKE) build - build-docker-gaiadnode: $(MAKE) -C networks/local @@ -181,4 +191,8 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples install_debug dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update build-linux build-docker-gaiadnode localnet-start localnet-stop remotenet-start remotenet-stop remotenet-status format +.PHONY: build build_examples install install_examples install_debug dist \ +check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit \ +test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update \ +build-linux build-docker-gaiadnode localnet-start localnet-stop remotenet-start \ +remotenet-stop remotenet-status format check-ledger diff --git a/crypto/keys/keybase.go b/crypto/keys/keybase.go index ef2c6243a6..d9c1b5f57f 100644 --- a/crypto/keys/keybase.go +++ b/crypto/keys/keybase.go @@ -6,13 +6,12 @@ import ( "os" "strings" - "github.com/pkg/errors" - tcrypto "github.com/tendermint/tendermint/crypto" - dbm "github.com/tendermint/tendermint/libs/db" - "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/bip39" "github.com/cosmos/cosmos-sdk/crypto/keys/hd" + "github.com/pkg/errors" + tmcrypto "github.com/tendermint/tendermint/crypto" + dbm "github.com/tendermint/tendermint/libs/db" ) var _ Keybase = dbKeybase{} @@ -43,10 +42,12 @@ const ( ) var ( - // ErrUnsupportedSigningAlgo is raised when the caller tries to use a different signing scheme than secp256k1. + // ErrUnsupportedSigningAlgo is raised when the caller tries to use a + // different signing scheme than secp256k1. ErrUnsupportedSigningAlgo = errors.New("unsupported signing algo: only secp256k1 is supported") - // ErrUnsupportedLanguage is raised when the caller tries to use a different language than english for creating - // a mnemonic sentence. + + // ErrUnsupportedLanguage is raised when the caller tries to use a + // different language than english for creating a mnemonic sentence. ErrUnsupportedLanguage = errors.New("unsupported language: only english is supported") ) @@ -147,7 +148,7 @@ func (kb dbKeybase) CreateLedger(name string, path crypto.DerivationPath, algo S // CreateOffline creates a new reference to an offline keypair // It returns the created key info -func (kb dbKeybase) CreateOffline(name string, pub tcrypto.PubKey) (Info, error) { +func (kb dbKeybase) CreateOffline(name string, pub tmcrypto.PubKey) (Info, error) { return kb.writeOfflineKey(pub, name), nil } @@ -162,9 +163,9 @@ func (kb *dbKeybase) persistDerivedKey(seed []byte, passwd, name, fullHdPath str // if we have a password, use it to encrypt the private key and store it // else store the public key only if passwd != "" { - info = kb.writeLocalKey(tcrypto.PrivKeySecp256k1(derivedPriv), name, passwd) + info = kb.writeLocalKey(tmcrypto.PrivKeySecp256k1(derivedPriv), name, passwd) } else { - pubk := tcrypto.PrivKeySecp256k1(derivedPriv).PubKey() + pubk := tmcrypto.PrivKeySecp256k1(derivedPriv).PubKey() info = kb.writeOfflineKey(pubk, name) } return @@ -196,12 +197,12 @@ func (kb dbKeybase) Get(name string) (Info, error) { // Sign signs the msg with the named key. // It returns an error if the key doesn't exist or the decryption fails. -func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tcrypto.Signature, pub tcrypto.PubKey, err error) { +func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tmcrypto.Signature, pub tmcrypto.PubKey, err error) { info, err := kb.Get(name) if err != nil { return } - var priv tcrypto.PrivKey + var priv tmcrypto.PrivKey switch info.(type) { case localInfo: linfo := info.(localInfo) @@ -240,12 +241,12 @@ func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tcrypto.Signa return sig, pub, nil } -func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tcrypto.PrivKey, error) { +func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tmcrypto.PrivKey, error) { info, err := kb.Get(name) if err != nil { return nil, err } - var priv tcrypto.PrivKey + var priv tmcrypto.PrivKey switch info.(type) { case localInfo: linfo := info.(localInfo) @@ -313,7 +314,7 @@ func (kb dbKeybase) ImportPubKey(name string, armor string) (err error) { if err != nil { return } - pubKey, err := tcrypto.PubKeyFromBytes(pubBytes) + pubKey, err := tmcrypto.PubKeyFromBytes(pubBytes) if err != nil { return } @@ -380,7 +381,7 @@ func (kb dbKeybase) Update(name, oldpass string, getNewpass func() (string, erro } } -func (kb dbKeybase) writeLocalKey(priv tcrypto.PrivKey, name, passphrase string) Info { +func (kb dbKeybase) writeLocalKey(priv tmcrypto.PrivKey, name, passphrase string) Info { // encrypt private key using passphrase privArmor := encryptArmorPrivKey(priv, passphrase) // make Info @@ -390,13 +391,13 @@ func (kb dbKeybase) writeLocalKey(priv tcrypto.PrivKey, name, passphrase string) return info } -func (kb dbKeybase) writeLedgerKey(pub tcrypto.PubKey, path crypto.DerivationPath, name string) Info { +func (kb dbKeybase) writeLedgerKey(pub tmcrypto.PubKey, path crypto.DerivationPath, name string) Info { info := newLedgerInfo(name, pub, path) kb.writeInfo(info, name) return info } -func (kb dbKeybase) writeOfflineKey(pub tcrypto.PubKey, name string) Info { +func (kb dbKeybase) writeOfflineKey(pub tmcrypto.PubKey, name string) Info { info := newOfflineInfo(name, pub) kb.writeInfo(info, name) return info diff --git a/crypto/ledger.go b/crypto/ledger.go new file mode 100644 index 0000000000..9d446202f7 --- /dev/null +++ b/crypto/ledger.go @@ -0,0 +1,18 @@ +// +build cgo,ledger + +package crypto + +import ( + ledger "github.com/zondax/ledger-goclient" +) + +// If ledger support (build tag) has been enabled, automically attempt to load +// and set the ledger device, ledgerDevice, if it has not already been set. +func init() { + device, err := ledger.FindLedger() + if err != nil { + ledgerDeviceErr = err + } else { + ledgerDevice = device + } +} diff --git a/crypto/ledger_common.go b/crypto/ledger_common.go deleted file mode 100644 index 39f15464a7..0000000000 --- a/crypto/ledger_common.go +++ /dev/null @@ -1,19 +0,0 @@ -package crypto - -import ( - ledger "github.com/zondax/ledger-goclient" -) - -var device *ledger.Ledger - -// Ledger derivation path -type DerivationPath = []uint32 - -// getLedger gets a copy of the device, and caches it -func getLedger() (*ledger.Ledger, error) { - var err error - if device == nil { - device, err = ledger.FindLedger() - } - return device, err -} diff --git a/crypto/ledger_secp256k1.go b/crypto/ledger_secp256k1.go index 1ba36f69df..7a9f10c0dd 100644 --- a/crypto/ledger_secp256k1.go +++ b/crypto/ledger_secp256k1.go @@ -1,126 +1,159 @@ package crypto import ( + "errors" "fmt" secp256k1 "github.com/btcsuite/btcd/btcec" - ledger "github.com/zondax/ledger-goclient" - - tcrypto "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/tendermint/tendermint/crypto" ) -func pubkeyLedgerSecp256k1(device *ledger.Ledger, path DerivationPath) (pub tcrypto.PubKey, err error) { - key, err := device.GetPublicKeySECP256K1(path) - if err != nil { - return nil, fmt.Errorf("error fetching public key: %v", err) +var ( + ledgerDevice LedgerSECP256K1 + ledgerDeviceErr error + + // ErrMissingLedgerDevice is used to reflect that a ledger device load has + // not been attempted. + ErrMissingLedgerDevice = errors.New("missing ledger device") +) + +type ( + // DerivationPath represents a Ledger derivation path. + DerivationPath []uint32 + + // LedgerSECP256K1 reflects an interface a Ledger API must implement for + // the SECP256K1 scheme. + LedgerSECP256K1 interface { + GetPublicKeySECP256K1([]uint32) ([]byte, error) + SignSECP256K1([]uint32, []byte) ([]byte, error) } - var p tcrypto.PubKeySecp256k1 - // Reserialize in the 33-byte compressed format - cmp, err := secp256k1.ParsePubKey(key[:], secp256k1.S256()) - copy(p[:], cmp.SerializeCompressed()) - pub = p - return -} -func signLedgerSecp256k1(device *ledger.Ledger, path DerivationPath, msg []byte) (sig tcrypto.Signature, err error) { - bsig, err := device.SignSECP256K1(path, msg) - if err != nil { - return sig, err + // PrivKeyLedgerSecp256k1 implements PrivKey, calling the ledger nano we + // cache the PubKey from the first call to use it later. + PrivKeyLedgerSecp256k1 struct { + // CachedPubKey should be private, but we want to encode it via + // go-amino so we can view the address later, even without having the + // ledger attached. + CachedPubKey tmcrypto.PubKey + Path DerivationPath + ledger LedgerSECP256K1 } - sig = tcrypto.SignatureSecp256k1FromBytes(bsig) - return -} +) -// PrivKeyLedgerSecp256k1 implements PrivKey, calling the ledger nano -// we cache the PubKey from the first call to use it later -type PrivKeyLedgerSecp256k1 struct { - // PubKey should be private, but we want to encode it via go-amino - // so we can view the address later, even without having the ledger - // attached - CachedPubKey tcrypto.PubKey - Path DerivationPath -} +// NewPrivKeyLedgerSecp256k1 will generate a new key and store the public key +// for later use. +// +// CONTRACT: The ledger device, ledgerDevice, must be loaded and set prior to +// any creation of a PrivKeyLedgerSecp256k1. +func NewPrivKeyLedgerSecp256k1(path DerivationPath) (tmcrypto.PrivKey, error) { + if ledgerDevice == nil { + err := ErrMissingLedgerDevice + if ledgerDeviceErr != nil { + err = ledgerDeviceErr + } + + return nil, fmt.Errorf("failed to create PrivKeyLedgerSecp256k1: %v", err) + } + + pkl := &PrivKeyLedgerSecp256k1{Path: path, ledger: ledgerDevice} -// NewPrivKeyLedgerSecp256k1 will generate a new key and store the -// public key for later use. -func NewPrivKeyLedgerSecp256k1(path DerivationPath) (tcrypto.PrivKey, error) { - var pk PrivKeyLedgerSecp256k1 - pk.Path = path // cache the pubkey for later use - pubKey, err := pk.getPubKey() + pubKey, err := pkl.getPubKey() if err != nil { return nil, err } - pk.CachedPubKey = pubKey - return &pk, err + + pkl.CachedPubKey = pubKey + return pkl, err } -// ValidateKey allows us to verify the sanity of a key -// after loading it from disk -func (pk PrivKeyLedgerSecp256k1) ValidateKey() error { +// PubKey returns the cached public key. +func (pkl PrivKeyLedgerSecp256k1) PubKey() tmcrypto.PubKey { + return pkl.CachedPubKey +} + +// ValidateKey allows us to verify the sanity of a public key after loading it +// from disk. +func (pkl PrivKeyLedgerSecp256k1) ValidateKey() error { // getPubKey will return an error if the ledger is not - pub, err := pk.getPubKey() + pub, err := pkl.getPubKey() if err != nil { return err } + // verify this matches cached address - if !pub.Equals(pk.CachedPubKey) { + if !pub.Equals(pkl.CachedPubKey) { return fmt.Errorf("cached key does not match retrieved key") } + return nil } -// AssertIsPrivKeyInner fulfils PrivKey Interface -func (pk *PrivKeyLedgerSecp256k1) AssertIsPrivKeyInner() {} +// AssertIsPrivKeyInner implements the PrivKey interface. It performs a no-op. +func (pkl *PrivKeyLedgerSecp256k1) AssertIsPrivKeyInner() {} -// Bytes fulfils PrivKey Interface - but it stores the cached pubkey so we can verify -// the same key when we reconnect to a ledger -func (pk PrivKeyLedgerSecp256k1) Bytes() []byte { - return cdc.MustMarshalBinaryBare(pk) +// Bytes implements the PrivKey interface. It stores the cached public key so +// we can verify the same key when we reconnect to a ledger. +func (pkl PrivKeyLedgerSecp256k1) Bytes() []byte { + return cdc.MustMarshalBinaryBare(pkl) } -// Sign calls the ledger and stores the PubKey for future use +// Equals implements the PrivKey interface. It makes sure two private keys +// refer to the same public key. +func (pkl PrivKeyLedgerSecp256k1) Equals(other tmcrypto.PrivKey) bool { + if ledger, ok := other.(*PrivKeyLedgerSecp256k1); ok { + return pkl.CachedPubKey.Equals(ledger.CachedPubKey) + } + + return false +} + +// Sign calls the ledger and stores the PubKey for future use. // -// Communication is checked on NewPrivKeyLedger and PrivKeyFromBytes, -// returning an error, so this should only trigger if the privkey is held -// in memory for a while before use. -func (pk PrivKeyLedgerSecp256k1) Sign(msg []byte) (tcrypto.Signature, error) { - dev, err := getLedger() +// Communication is checked on NewPrivKeyLedger and PrivKeyFromBytes, returning +// an error, so this should only trigger if the private key is held in memory +// for a while before use. +func (pkl PrivKeyLedgerSecp256k1) Sign(msg []byte) (tmcrypto.Signature, error) { + sig, err := pkl.signLedgerSecp256k1(msg) if err != nil { return nil, err } - sig, err := signLedgerSecp256k1(dev, pk.Path, msg) - if err != nil { - return nil, err - } - return sig, nil -} -// PubKey returns the stored PubKey -func (pk PrivKeyLedgerSecp256k1) PubKey() tcrypto.PubKey { - return pk.CachedPubKey + return sig, nil } // getPubKey reads the pubkey the ledger itself // since this involves IO, it may return an error, which is not exposed // in the PubKey interface, so this function allows better error handling -func (pk PrivKeyLedgerSecp256k1) getPubKey() (key tcrypto.PubKey, err error) { - dev, err := getLedger() - if err != nil { - return key, fmt.Errorf("cannot connect to Ledger device - error: %v", err) - } - key, err = pubkeyLedgerSecp256k1(dev, pk.Path) +func (pkl PrivKeyLedgerSecp256k1) getPubKey() (key tmcrypto.PubKey, err error) { + key, err = pkl.pubkeyLedgerSecp256k1() if err != nil { return key, fmt.Errorf("please open Cosmos app on the Ledger device - error: %v", err) } + return key, err } -// Equals fulfils PrivKey Interface - makes sure both keys refer to the -// same -func (pk PrivKeyLedgerSecp256k1) Equals(other tcrypto.PrivKey) bool { - if ledger, ok := other.(*PrivKeyLedgerSecp256k1); ok { - return pk.CachedPubKey.Equals(ledger.CachedPubKey) +func (pkl PrivKeyLedgerSecp256k1) signLedgerSecp256k1(msg []byte) (tmcrypto.Signature, error) { + sigBytes, err := pkl.ledger.SignSECP256K1(pkl.Path, msg) + if err != nil { + return nil, err } - return false + + return tmcrypto.SignatureSecp256k1FromBytes(sigBytes), nil +} + +func (pkl PrivKeyLedgerSecp256k1) pubkeyLedgerSecp256k1() (pub tmcrypto.PubKey, err error) { + key, err := pkl.ledger.GetPublicKeySECP256K1(pkl.Path) + if err != nil { + return nil, fmt.Errorf("error fetching public key: %v", err) + } + + var pk tmcrypto.PubKeySecp256k1 + + // re-serialize in the 33-byte compressed format + cmp, err := secp256k1.ParsePubKey(key[:], secp256k1.S256()) + copy(pk[:], cmp.SerializeCompressed()) + + return pk, nil } diff --git a/crypto/ledger_test.go b/crypto/ledger_test.go index 997dfbc3bc..8e1a2ed654 100644 --- a/crypto/ledger_test.go +++ b/crypto/ledger_test.go @@ -1,25 +1,26 @@ package crypto import ( + "fmt" "os" "testing" "github.com/stretchr/testify/require" - - tcrypto "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/tendermint/tendermint/crypto" ) +var ledgerEnabledEnv = "TEST_WITH_LEDGER" + func TestRealLedgerSecp256k1(t *testing.T) { - - if os.Getenv("WITH_LEDGER") == "" { - t.Skip("Set WITH_LEDGER to run code on real ledger") + if os.Getenv(ledgerEnabledEnv) == "" { + t.Skip(fmt.Sprintf("Set '%s' to run code on a real ledger", ledgerEnabledEnv)) } - msg := []byte("kuhehfeohg") - + msg := []byte("{\"account_number\":\"3\",\"chain_id\":\"1234\",\"fee\":{\"amount\":[{\"amount\":\"150\",\"denom\":\"atom\"}],\"gas\":\"5000\"},\"memo\":\"memo\",\"msgs\":[[\"%s\"]],\"sequence\":\"6\"}") path := DerivationPath{44, 60, 0, 0, 0} priv, err := NewPrivKeyLedgerSecp256k1(path) - require.Nil(t, err, "%+v", err) + require.Nil(t, err, "%s", err) + pub := priv.PubKey() sig, err := priv.Sign(msg) require.Nil(t, err) @@ -27,24 +28,23 @@ func TestRealLedgerSecp256k1(t *testing.T) { valid := pub.VerifyBytes(msg, sig) require.True(t, valid) - // now, let's serialize the key and make sure it still works - bs := priv.Bytes() - priv2, err := tcrypto.PrivKeyFromBytes(bs) + // now, let's serialize the public key and make sure it still works + bs := priv.PubKey().Bytes() + pub2, err := tmcrypto.PubKeyFromBytes(bs) require.Nil(t, err, "%+v", err) // make sure we get the same pubkey when we load from disk - pub2 := priv2.PubKey() require.Equal(t, pub, pub2) // signing with the loaded key should match the original pubkey - sig, err = priv2.Sign(msg) + sig, err = priv.Sign(msg) require.Nil(t, err) valid = pub.VerifyBytes(msg, sig) require.True(t, valid) // make sure pubkeys serialize properly as well bs = pub.Bytes() - bpub, err := tcrypto.PubKeyFromBytes(bs) + bpub, err := tmcrypto.PubKeyFromBytes(bs) require.NoError(t, err) require.Equal(t, pub, bpub) } @@ -52,8 +52,8 @@ func TestRealLedgerSecp256k1(t *testing.T) { // TestRealLedgerErrorHandling calls. These tests assume // the ledger is not plugged in.... func TestRealLedgerErrorHandling(t *testing.T) { - if os.Getenv("WITH_LEDGER") != "" { - t.Skip("Skipping on WITH_LEDGER as it tests unplugged cases") + if os.Getenv(ledgerEnabledEnv) != "" { + t.Skip(fmt.Sprintf("Unset '%s' to run code as if without a real Ledger", ledgerEnabledEnv)) } // first, try to generate a key, must return an error From db7407f96e78ef3f810529bfe2e362b3fd507b97 Mon Sep 17 00:00:00 2001 From: Alexander Bezobchuk Date: Fri, 13 Jul 2018 22:17:53 -0400 Subject: [PATCH 02/30] Fix Cross Compile Build/Ledger Build Tag (#1674) * Merge pull request #1674: Fix Cross Compile Build/Ledger Build Tag * Merge pull request #1674: Fix Cross Compile Build/Ledger Build Tag * Remove incorrect Ledger test --- CHANGELOG.md | 2 + Gopkg.lock | 184 ++++++++++++++++++++++++++++++++---- Gopkg.toml | 2 +- Makefile | 36 +++++--- crypto/keys/keybase.go | 37 ++++---- crypto/ledger.go | 18 ++++ crypto/ledger_common.go | 19 ---- crypto/ledger_secp256k1.go | 185 ++++++++++++++++++++++--------------- crypto/ledger_test.go | 32 +++---- 9 files changed, 356 insertions(+), 159 deletions(-) create mode 100644 crypto/ledger.go delete mode 100644 crypto/ledger_common.go diff --git a/CHANGELOG.md b/CHANGELOG.md index 547ab53459..532e981550 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -24,6 +24,8 @@ BUG FIXES * [keys] \#1629 - updating password no longer asks for a new password when the first entered password was incorrect * [lcd] importing an account would create a random account * [server] 'gaiad init' command family now writes provided name as the moniker in `config.toml` +* [build] Added Ledger build support via `LEDGER_ENABLED=true|false` + * True by default except when cross-compiling ## 0.20.0 diff --git a/Gopkg.lock b/Gopkg.lock index ee1b5cf1ee..a1372b1fa8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -3,59 +3,78 @@ [[projects]] branch = "master" + digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] + pruneopts = "UT" revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[projects]] branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] + pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] + digest = "1:1343a2963481a305ca4d051e84bc2abd16b601ee22ed324f8d605de1adb291b0" name = "github.com/bgentry/speakeasy" packages = ["."] + pruneopts = "UT" revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" version = "v0.1.0" [[projects]] branch = "master" + digest = "1:70f6b224a59b2fa453debffa85c77f71063d8754b90c8c4fbad5794e2c382b0f" name = "github.com/brejski/hid" packages = ["."] + pruneopts = "UT" revision = "06112dcfcc50a7e0e4fd06e17f9791e788fdaafc" [[projects]] branch = "master" + digest = "1:6aabc1566d6351115d561d038da82a4c19b46c3b6e17f4a0a2fa60260663dc79" name = "github.com/btcsuite/btcd" packages = ["btcec"] + pruneopts = "UT" revision = "fdfc19097e7ac6b57035062056f5b7b4638b8898" [[projects]] branch = "master" + digest = "1:386de157f7d19259a7f9c81f26ce011223ce0f090353c1152ffdf730d7d10ac2" name = "github.com/btcsuite/btcutil" packages = ["bech32"] + pruneopts = "UT" revision = "ab6388e0c60ae4834a1f57511e20c17b5f78be4b" [[projects]] + digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "UT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:c7644c73a3d23741fdba8a99b1464e021a224b7e205be497271a8003a15ca41b" name = "github.com/ebuchman/fail-test" packages = ["."] + pruneopts = "UT" revision = "95f809107225be108efcf10a3509e4ea6ceef3c4" [[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" name = "github.com/fsnotify/fsnotify" packages = ["."] + pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] + digest = "1:fa30c0652956e159cdb97dcb2ef8b8db63ed668c02a5c3a40961c8f0641252fe" name = "github.com/go-kit/kit" packages = [ "log", @@ -64,24 +83,30 @@ "metrics", "metrics/discard", "metrics/internal/lv", - "metrics/prometheus" + "metrics/prometheus", ] + pruneopts = "UT" revision = "4dc7be5d2d12881735283bcab7352178e190fc71" version = "v0.6.0" [[projects]] + digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" name = "github.com/go-logfmt/logfmt" packages = ["."] + pruneopts = "UT" revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" [[projects]] + digest = "1:c4a2528ccbcabf90f9f3c464a5fc9e302d592861bbfd0b7135a7de8a943d0406" name = "github.com/go-stack/stack" packages = ["."] + pruneopts = "UT" revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc" version = "v1.7.0" [[projects]] + digest = "1:af1306bff89268721ea2550d504413c9487ebfca11e2ff8f39ae79b99a720ff5" name = "github.com/gogo/protobuf" packages = [ "gogoproto", @@ -89,49 +114,61 @@ "proto", "protoc-gen-gogo/descriptor", "sortkeys", - "types" + "types", ] + pruneopts = "UT" revision = "1adfc126b41513cc696b209667c8656ea7aac67c" version = "v1.0.0" [[projects]] + digest = "1:cb22af0ed7c72d495d8be1106233ee553898950f15fd3f5404406d44c2e86888" name = "github.com/golang/protobuf" packages = [ "proto", "ptypes", "ptypes/any", "ptypes/duration", - "ptypes/timestamp" + "ptypes/timestamp", ] + pruneopts = "UT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:4a0c6bb4805508a6287675fac876be2ac1182539ca8a32468d8128882e9d5009" name = "github.com/golang/snappy" packages = ["."] + pruneopts = "UT" revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a" [[projects]] + digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" name = "github.com/gorilla/context" packages = ["."] + pruneopts = "UT" revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" version = "v1.1.1" [[projects]] + digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f" name = "github.com/gorilla/mux" packages = ["."] + pruneopts = "UT" revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" version = "v1.6.2" [[projects]] + digest = "1:43dd08a10854b2056e615d1b1d22ac94559d822e1f8b6fcc92c1a1057e85188e" name = "github.com/gorilla/websocket" packages = ["."] + pruneopts = "UT" revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:8951fe6e358876736d8fa1f3992624fdbb2dec6bc49401c1381d1ef8abbb544f" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -142,162 +179,208 @@ "hcl/token", "json/parser", "json/scanner", - "json/token" + "json/token", ] + pruneopts = "UT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] + pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] branch = "master" + digest = "1:39b27d1381a30421f9813967a5866fba35dc1d4df43a6eefe3b7a5444cb07214" name = "github.com/jmhodges/levigo" packages = ["."] + pruneopts = "UT" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" [[projects]] branch = "master" + digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" name = "github.com/kr/logfmt" packages = ["."] + pruneopts = "UT" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" [[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" name = "github.com/magiconair/properties" packages = ["."] + pruneopts = "UT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] + digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" name = "github.com/mattn/go-isatty" packages = ["."] + pruneopts = "UT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] + pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" + digest = "1:e730597b38a4d56e2361e0b6236cb800e52c73cace2ff91396f4ff35792ddfa7" name = "github.com/mitchellh/mapstructure" packages = ["."] + pruneopts = "UT" revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" [[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" name = "github.com/pelletier/go-toml" packages = ["."] + pruneopts = "UT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] + digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] + pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] + pruneopts = "UT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] branch = "master" + digest = "1:98225904b7abff96c052b669b25788f18225a36673fba022fb93514bb9a2a64e" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp" + "prometheus/promhttp", ] + pruneopts = "UT" revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" + digest = "1:53a76eb11bdc815fcf0c757a9648fda0ab6887da13f07587181ff2223b67956c" name = "github.com/prometheus/client_model" packages = ["go"] + pruneopts = "UT" revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" [[projects]] branch = "master" + digest = "1:4d291d51042ed9de40eef61a3c1b56e969d6e0f8aa5fd3da5e958ec66bee68e4" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model" + "model", ] + pruneopts = "UT" revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" [[projects]] branch = "master" + digest = "1:55d7449d6987dabf272b4e81b2f9c449f05b17415c939b68d1e82f57e3374b7f" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs" + "xfs", ] + pruneopts = "UT" revision = "ae68e2d4c00fed4943b5f6698d504a5fe083da8a" [[projects]] branch = "master" + digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" packages = ["."] + pruneopts = "UT" revision = "e2704e165165ec55d062f5919b4b29494e9fa790" [[projects]] + digest = "1:37ace7f35375adec11634126944bdc45a673415e2fcc07382d03b75ec76ea94c" name = "github.com/spf13/afero" packages = [ ".", - "mem" + "mem", ] + pruneopts = "UT" revision = "787d034dfe70e44075ccc060d346146ef53270ad" version = "v1.1.1" [[projects]] + digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" name = "github.com/spf13/cast" packages = ["."] + pruneopts = "UT" revision = "8965335b8c7107321228e3e3702cab9832751bac" version = "v1.2.0" [[projects]] + digest = "1:627ab2f549a6a55c44f46fa24a4307f4d0da81bfc7934ed0473bf38b24051d26" name = "github.com/spf13/cobra" packages = ["."] + pruneopts = "UT" revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b" version = "v0.0.1" [[projects]] branch = "master" + digest = "1:080e5f630945ad754f4b920e60b4d3095ba0237ebf88dc462eb28002932e3805" name = "github.com/spf13/jwalterweatherman" packages = ["."] + pruneopts = "UT" revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" [[projects]] + digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "UT" revision = "583c0c0531f06d5278b7d917446061adc344b5cd" version = "v1.0.1" [[projects]] + digest = "1:f8e1a678a2571e265f4bf91a3e5e32aa6b1474a55cb0ea849750cc177b664d96" name = "github.com/spf13/viper" packages = ["."] + pruneopts = "UT" revision = "25b30aa063fc18e48662b86996252eabdcf2f0c7" version = "v1.0.0" [[projects]] + digest = "1:73697231b93fb74a73ebd8384b68b9a60c57ea6b13c56d2425414566a72c8e6d" name = "github.com/stretchr/testify" packages = [ "assert", - "require" + "require", ] + pruneopts = "UT" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" version = "v1.2.1" [[projects]] branch = "master" + digest = "1:922191411ad8f61bcd8018ac127589bb489712c1d1a0ab2497aca4b16de417d2" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -311,33 +394,41 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util" + "leveldb/util", ] + pruneopts = "UT" revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] branch = "master" + digest = "1:203b409c21115233a576f99e8f13d8e07ad82b25500491f7e1cca12588fb3232" name = "github.com/tendermint/ed25519" packages = [ ".", "edwards25519", - "extra25519" + "extra25519", ] + pruneopts = "UT" revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057" [[projects]] + digest = "1:e9113641c839c21d8eaeb2c907c7276af1eddeed988df8322168c56b7e06e0e1" name = "github.com/tendermint/go-amino" packages = ["."] + pruneopts = "UT" revision = "2106ca61d91029c931fd54968c2bb02dc96b1412" version = "0.10.1" [[projects]] + digest = "1:d4a15d404afbf591e8be16fcda7f5ac87948d5c7531f9d909fd84cc730ab16e2" name = "github.com/tendermint/iavl" packages = ["."] + pruneopts = "UT" revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9" version = "v0.9.2" [[projects]] + digest = "1:2511fa7bc2725251a1a48a923c8f01cd41de29b00a21224092d448a9e4627c21" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -392,18 +483,22 @@ "state/txindex/kv", "state/txindex/null", "types", - "version" + "version", ] + pruneopts = "UT" revision = "5ff65274b84ea905787a48512cc3124385bddf2f" version = "v0.22.2" [[projects]] + digest = "1:5bd938386bd1f61a581bf8cd6ff2b7b2f79c542929176db4ceb44965440dae07" name = "github.com/zondax/ledger-goclient" packages = ["."] - revision = "065cbf938a16f20335c40cfe180f9cd4955c6a5a" + pruneopts = "UT" + revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [[projects]] branch = "master" + digest = "1:e8206c1653e050116ec8c9a823a86413fc9f9ee3c2f3ae977c96d6a1747f7325" name = "golang.org/x/crypto" packages = [ "blowfish", @@ -416,12 +511,14 @@ "pbkdf2", "poly1305", "ripemd160", - "salsa20/salsa" + "salsa20/salsa", ] + pruneopts = "UT" revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" [[projects]] branch = "master" + digest = "1:04dda8391c3e2397daf254ac68003f30141c069b228d06baec8324a5f81dc1e9" name = "golang.org/x/net" packages = [ "context", @@ -431,17 +528,21 @@ "idna", "internal/timeseries", "netutil", - "trace" + "trace", ] + pruneopts = "UT" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" + digest = "1:d773e525476aefa22ea944a5425a9bfb99819b2e67eeb9b1966454fd57522bbf" name = "golang.org/x/sys" packages = ["unix"] + pruneopts = "UT" revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" [[projects]] + digest = "1:7509ba4347d1f8de6ae9be8818b0cd1abc3deeffe28aeaf4be6d4b6b5178d9ca" name = "golang.org/x/text" packages = [ "collate", @@ -457,18 +558,22 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] + pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] branch = "master" + digest = "1:601e63e7d4577f907118bec825902505291918859d223bce015539e79f1160e3" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] + pruneopts = "UT" revision = "e92b116572682a5b432ddd840aeaba2a559eeff1" [[projects]] + digest = "1:4d7b5d9746840266938cdb21a40f8eba7137d9153c4ed404d6bb2a450d06f690" name = "google.golang.org/grpc" packages = [ ".", @@ -493,20 +598,63 @@ "stats", "status", "tap", - "transport" + "transport", ] + pruneopts = "UT" revision = "d11072e7ca9811b1100b80ca0269ac831f06d024" version = "v1.11.3" [[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" name = "gopkg.in/yaml.v2" packages = ["."] + pruneopts = "UT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "5c3ab73a85af1b3110b5f7ddbb27e77bb9cf42848ee29efcad9d78c0ecc26519" + input-imports = [ + "github.com/bartekn/go-bip39", + "github.com/bgentry/speakeasy", + "github.com/btcsuite/btcd/btcec", + "github.com/golang/protobuf/proto", + "github.com/gorilla/mux", + "github.com/mattn/go-isatty", + "github.com/pkg/errors", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/require", + "github.com/tendermint/go-amino", + "github.com/tendermint/iavl", + "github.com/tendermint/tendermint/abci/server", + "github.com/tendermint/tendermint/abci/types", + "github.com/tendermint/tendermint/cmd/tendermint/commands", + "github.com/tendermint/tendermint/config", + "github.com/tendermint/tendermint/crypto", + "github.com/tendermint/tendermint/crypto/merkle", + "github.com/tendermint/tendermint/crypto/tmhash", + "github.com/tendermint/tendermint/libs/bech32", + "github.com/tendermint/tendermint/libs/cli", + "github.com/tendermint/tendermint/libs/cli/flags", + "github.com/tendermint/tendermint/libs/common", + "github.com/tendermint/tendermint/libs/db", + "github.com/tendermint/tendermint/libs/log", + "github.com/tendermint/tendermint/node", + "github.com/tendermint/tendermint/p2p", + "github.com/tendermint/tendermint/privval", + "github.com/tendermint/tendermint/proxy", + "github.com/tendermint/tendermint/rpc/client", + "github.com/tendermint/tendermint/rpc/core/types", + "github.com/tendermint/tendermint/rpc/lib/client", + "github.com/tendermint/tendermint/rpc/lib/server", + "github.com/tendermint/tendermint/types", + "github.com/zondax/ledger-goclient", + "golang.org/x/crypto/blowfish", + "golang.org/x/crypto/ripemd160", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index 0bb13c3e38..da2c8e29ce 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -70,7 +70,7 @@ [[constraint]] name = "github.com/zondax/ledger-goclient" - revision = "065cbf938a16f20335c40cfe180f9cd4955c6a5a" + revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [prune] go-tests = true diff --git a/Makefile b/Makefile index 4d761ede14..6f440e0200 100644 --- a/Makefile +++ b/Makefile @@ -1,8 +1,10 @@ PACKAGES=$(shell go list ./... | grep -v '/vendor/') PACKAGES_NOCLITEST=$(shell go list ./... | grep -v '/vendor/' | grep -v github.com/cosmos/cosmos-sdk/cmd/gaia/cli_test) COMMIT_HASH := $(shell git rev-parse --short HEAD) -BUILD_FLAGS = -tags netgo -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" - +BUILD_TAGS = netgo ledger +BUILD_FLAGS = -tags "${BUILD_TAGS}" -ldflags "-X github.com/cosmos/cosmos-sdk/version.GitCommit=${COMMIT_HASH}" +GCC := $(shell command -v gcc 2> /dev/null) +LEDGER_ENABLED ?= true all: get_tools get_vendor_deps install install_examples test_lint test ######################################## @@ -11,10 +13,19 @@ all: get_tools get_vendor_deps install install_examples test_lint test ci: get_tools get_vendor_deps install test_cover test_lint test ######################################## -### Build +### Build/Install -# This can be unified later, here for easy demos -build: +check-ledger: +ifeq ($(LEDGER_ENABLED),true) +ifndef GCC +$(error "gcc not installed for ledger support, please install") +endif +else +TMP_BUILD_TAGS := $(BUILD_TAGS) +BUILD_TAGS = $(filter-out ledger, $(TMP_BUILD_TAGS)) +endif + +build: check-ledger ifeq ($(OS),Windows_NT) go build $(BUILD_FLAGS) -o build/gaiad.exe ./cmd/gaia/cmd/gaiad go build $(BUILD_FLAGS) -o build/gaiacli.exe ./cmd/gaia/cmd/gaiacli @@ -23,6 +34,9 @@ else go build $(BUILD_FLAGS) -o build/gaiacli ./cmd/gaia/cmd/gaiacli endif +build-linux: + LEDGER_ENABLED=false GOOS=linux GOARCH=amd64 $(MAKE) build + build_examples: ifeq ($(OS),Windows_NT) go build $(BUILD_FLAGS) -o build/basecoind.exe ./examples/basecoin/cmd/basecoind @@ -36,7 +50,7 @@ else go build $(BUILD_FLAGS) -o build/democli ./examples/democoin/cmd/democli endif -install: +install: check-ledger go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiad go install $(BUILD_FLAGS) ./cmd/gaia/cmd/gaiacli @@ -141,10 +155,6 @@ devdoc_update: ######################################## ### Local validator nodes using docker and docker-compose -# Build linux binary -build-linux: - GOOS=linux GOARCH=amd64 $(MAKE) build - build-docker-gaiadnode: $(MAKE) -C networks/local @@ -181,4 +191,8 @@ remotenet-status: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: build build_examples install install_examples install_debug dist check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update build-linux build-docker-gaiadnode localnet-start localnet-stop remotenet-start remotenet-stop remotenet-status format +.PHONY: build build_examples install install_examples install_debug dist \ +check_tools get_tools get_vendor_deps draw_deps test test_cli test_unit \ +test_cover test_lint benchmark devdoc_init devdoc devdoc_save devdoc_update \ +build-linux build-docker-gaiadnode localnet-start localnet-stop remotenet-start \ +remotenet-stop remotenet-status format check-ledger diff --git a/crypto/keys/keybase.go b/crypto/keys/keybase.go index ef2c6243a6..d9c1b5f57f 100644 --- a/crypto/keys/keybase.go +++ b/crypto/keys/keybase.go @@ -6,13 +6,12 @@ import ( "os" "strings" - "github.com/pkg/errors" - tcrypto "github.com/tendermint/tendermint/crypto" - dbm "github.com/tendermint/tendermint/libs/db" - "github.com/cosmos/cosmos-sdk/crypto" "github.com/cosmos/cosmos-sdk/crypto/keys/bip39" "github.com/cosmos/cosmos-sdk/crypto/keys/hd" + "github.com/pkg/errors" + tmcrypto "github.com/tendermint/tendermint/crypto" + dbm "github.com/tendermint/tendermint/libs/db" ) var _ Keybase = dbKeybase{} @@ -43,10 +42,12 @@ const ( ) var ( - // ErrUnsupportedSigningAlgo is raised when the caller tries to use a different signing scheme than secp256k1. + // ErrUnsupportedSigningAlgo is raised when the caller tries to use a + // different signing scheme than secp256k1. ErrUnsupportedSigningAlgo = errors.New("unsupported signing algo: only secp256k1 is supported") - // ErrUnsupportedLanguage is raised when the caller tries to use a different language than english for creating - // a mnemonic sentence. + + // ErrUnsupportedLanguage is raised when the caller tries to use a + // different language than english for creating a mnemonic sentence. ErrUnsupportedLanguage = errors.New("unsupported language: only english is supported") ) @@ -147,7 +148,7 @@ func (kb dbKeybase) CreateLedger(name string, path crypto.DerivationPath, algo S // CreateOffline creates a new reference to an offline keypair // It returns the created key info -func (kb dbKeybase) CreateOffline(name string, pub tcrypto.PubKey) (Info, error) { +func (kb dbKeybase) CreateOffline(name string, pub tmcrypto.PubKey) (Info, error) { return kb.writeOfflineKey(pub, name), nil } @@ -162,9 +163,9 @@ func (kb *dbKeybase) persistDerivedKey(seed []byte, passwd, name, fullHdPath str // if we have a password, use it to encrypt the private key and store it // else store the public key only if passwd != "" { - info = kb.writeLocalKey(tcrypto.PrivKeySecp256k1(derivedPriv), name, passwd) + info = kb.writeLocalKey(tmcrypto.PrivKeySecp256k1(derivedPriv), name, passwd) } else { - pubk := tcrypto.PrivKeySecp256k1(derivedPriv).PubKey() + pubk := tmcrypto.PrivKeySecp256k1(derivedPriv).PubKey() info = kb.writeOfflineKey(pubk, name) } return @@ -196,12 +197,12 @@ func (kb dbKeybase) Get(name string) (Info, error) { // Sign signs the msg with the named key. // It returns an error if the key doesn't exist or the decryption fails. -func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tcrypto.Signature, pub tcrypto.PubKey, err error) { +func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tmcrypto.Signature, pub tmcrypto.PubKey, err error) { info, err := kb.Get(name) if err != nil { return } - var priv tcrypto.PrivKey + var priv tmcrypto.PrivKey switch info.(type) { case localInfo: linfo := info.(localInfo) @@ -240,12 +241,12 @@ func (kb dbKeybase) Sign(name, passphrase string, msg []byte) (sig tcrypto.Signa return sig, pub, nil } -func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tcrypto.PrivKey, error) { +func (kb dbKeybase) ExportPrivateKeyObject(name string, passphrase string) (tmcrypto.PrivKey, error) { info, err := kb.Get(name) if err != nil { return nil, err } - var priv tcrypto.PrivKey + var priv tmcrypto.PrivKey switch info.(type) { case localInfo: linfo := info.(localInfo) @@ -313,7 +314,7 @@ func (kb dbKeybase) ImportPubKey(name string, armor string) (err error) { if err != nil { return } - pubKey, err := tcrypto.PubKeyFromBytes(pubBytes) + pubKey, err := tmcrypto.PubKeyFromBytes(pubBytes) if err != nil { return } @@ -380,7 +381,7 @@ func (kb dbKeybase) Update(name, oldpass string, getNewpass func() (string, erro } } -func (kb dbKeybase) writeLocalKey(priv tcrypto.PrivKey, name, passphrase string) Info { +func (kb dbKeybase) writeLocalKey(priv tmcrypto.PrivKey, name, passphrase string) Info { // encrypt private key using passphrase privArmor := encryptArmorPrivKey(priv, passphrase) // make Info @@ -390,13 +391,13 @@ func (kb dbKeybase) writeLocalKey(priv tcrypto.PrivKey, name, passphrase string) return info } -func (kb dbKeybase) writeLedgerKey(pub tcrypto.PubKey, path crypto.DerivationPath, name string) Info { +func (kb dbKeybase) writeLedgerKey(pub tmcrypto.PubKey, path crypto.DerivationPath, name string) Info { info := newLedgerInfo(name, pub, path) kb.writeInfo(info, name) return info } -func (kb dbKeybase) writeOfflineKey(pub tcrypto.PubKey, name string) Info { +func (kb dbKeybase) writeOfflineKey(pub tmcrypto.PubKey, name string) Info { info := newOfflineInfo(name, pub) kb.writeInfo(info, name) return info diff --git a/crypto/ledger.go b/crypto/ledger.go new file mode 100644 index 0000000000..9d446202f7 --- /dev/null +++ b/crypto/ledger.go @@ -0,0 +1,18 @@ +// +build cgo,ledger + +package crypto + +import ( + ledger "github.com/zondax/ledger-goclient" +) + +// If ledger support (build tag) has been enabled, automically attempt to load +// and set the ledger device, ledgerDevice, if it has not already been set. +func init() { + device, err := ledger.FindLedger() + if err != nil { + ledgerDeviceErr = err + } else { + ledgerDevice = device + } +} diff --git a/crypto/ledger_common.go b/crypto/ledger_common.go deleted file mode 100644 index 39f15464a7..0000000000 --- a/crypto/ledger_common.go +++ /dev/null @@ -1,19 +0,0 @@ -package crypto - -import ( - ledger "github.com/zondax/ledger-goclient" -) - -var device *ledger.Ledger - -// Ledger derivation path -type DerivationPath = []uint32 - -// getLedger gets a copy of the device, and caches it -func getLedger() (*ledger.Ledger, error) { - var err error - if device == nil { - device, err = ledger.FindLedger() - } - return device, err -} diff --git a/crypto/ledger_secp256k1.go b/crypto/ledger_secp256k1.go index 1ba36f69df..7a9f10c0dd 100644 --- a/crypto/ledger_secp256k1.go +++ b/crypto/ledger_secp256k1.go @@ -1,126 +1,159 @@ package crypto import ( + "errors" "fmt" secp256k1 "github.com/btcsuite/btcd/btcec" - ledger "github.com/zondax/ledger-goclient" - - tcrypto "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/tendermint/tendermint/crypto" ) -func pubkeyLedgerSecp256k1(device *ledger.Ledger, path DerivationPath) (pub tcrypto.PubKey, err error) { - key, err := device.GetPublicKeySECP256K1(path) - if err != nil { - return nil, fmt.Errorf("error fetching public key: %v", err) +var ( + ledgerDevice LedgerSECP256K1 + ledgerDeviceErr error + + // ErrMissingLedgerDevice is used to reflect that a ledger device load has + // not been attempted. + ErrMissingLedgerDevice = errors.New("missing ledger device") +) + +type ( + // DerivationPath represents a Ledger derivation path. + DerivationPath []uint32 + + // LedgerSECP256K1 reflects an interface a Ledger API must implement for + // the SECP256K1 scheme. + LedgerSECP256K1 interface { + GetPublicKeySECP256K1([]uint32) ([]byte, error) + SignSECP256K1([]uint32, []byte) ([]byte, error) } - var p tcrypto.PubKeySecp256k1 - // Reserialize in the 33-byte compressed format - cmp, err := secp256k1.ParsePubKey(key[:], secp256k1.S256()) - copy(p[:], cmp.SerializeCompressed()) - pub = p - return -} -func signLedgerSecp256k1(device *ledger.Ledger, path DerivationPath, msg []byte) (sig tcrypto.Signature, err error) { - bsig, err := device.SignSECP256K1(path, msg) - if err != nil { - return sig, err + // PrivKeyLedgerSecp256k1 implements PrivKey, calling the ledger nano we + // cache the PubKey from the first call to use it later. + PrivKeyLedgerSecp256k1 struct { + // CachedPubKey should be private, but we want to encode it via + // go-amino so we can view the address later, even without having the + // ledger attached. + CachedPubKey tmcrypto.PubKey + Path DerivationPath + ledger LedgerSECP256K1 } - sig = tcrypto.SignatureSecp256k1FromBytes(bsig) - return -} +) -// PrivKeyLedgerSecp256k1 implements PrivKey, calling the ledger nano -// we cache the PubKey from the first call to use it later -type PrivKeyLedgerSecp256k1 struct { - // PubKey should be private, but we want to encode it via go-amino - // so we can view the address later, even without having the ledger - // attached - CachedPubKey tcrypto.PubKey - Path DerivationPath -} +// NewPrivKeyLedgerSecp256k1 will generate a new key and store the public key +// for later use. +// +// CONTRACT: The ledger device, ledgerDevice, must be loaded and set prior to +// any creation of a PrivKeyLedgerSecp256k1. +func NewPrivKeyLedgerSecp256k1(path DerivationPath) (tmcrypto.PrivKey, error) { + if ledgerDevice == nil { + err := ErrMissingLedgerDevice + if ledgerDeviceErr != nil { + err = ledgerDeviceErr + } + + return nil, fmt.Errorf("failed to create PrivKeyLedgerSecp256k1: %v", err) + } + + pkl := &PrivKeyLedgerSecp256k1{Path: path, ledger: ledgerDevice} -// NewPrivKeyLedgerSecp256k1 will generate a new key and store the -// public key for later use. -func NewPrivKeyLedgerSecp256k1(path DerivationPath) (tcrypto.PrivKey, error) { - var pk PrivKeyLedgerSecp256k1 - pk.Path = path // cache the pubkey for later use - pubKey, err := pk.getPubKey() + pubKey, err := pkl.getPubKey() if err != nil { return nil, err } - pk.CachedPubKey = pubKey - return &pk, err + + pkl.CachedPubKey = pubKey + return pkl, err } -// ValidateKey allows us to verify the sanity of a key -// after loading it from disk -func (pk PrivKeyLedgerSecp256k1) ValidateKey() error { +// PubKey returns the cached public key. +func (pkl PrivKeyLedgerSecp256k1) PubKey() tmcrypto.PubKey { + return pkl.CachedPubKey +} + +// ValidateKey allows us to verify the sanity of a public key after loading it +// from disk. +func (pkl PrivKeyLedgerSecp256k1) ValidateKey() error { // getPubKey will return an error if the ledger is not - pub, err := pk.getPubKey() + pub, err := pkl.getPubKey() if err != nil { return err } + // verify this matches cached address - if !pub.Equals(pk.CachedPubKey) { + if !pub.Equals(pkl.CachedPubKey) { return fmt.Errorf("cached key does not match retrieved key") } + return nil } -// AssertIsPrivKeyInner fulfils PrivKey Interface -func (pk *PrivKeyLedgerSecp256k1) AssertIsPrivKeyInner() {} +// AssertIsPrivKeyInner implements the PrivKey interface. It performs a no-op. +func (pkl *PrivKeyLedgerSecp256k1) AssertIsPrivKeyInner() {} -// Bytes fulfils PrivKey Interface - but it stores the cached pubkey so we can verify -// the same key when we reconnect to a ledger -func (pk PrivKeyLedgerSecp256k1) Bytes() []byte { - return cdc.MustMarshalBinaryBare(pk) +// Bytes implements the PrivKey interface. It stores the cached public key so +// we can verify the same key when we reconnect to a ledger. +func (pkl PrivKeyLedgerSecp256k1) Bytes() []byte { + return cdc.MustMarshalBinaryBare(pkl) } -// Sign calls the ledger and stores the PubKey for future use +// Equals implements the PrivKey interface. It makes sure two private keys +// refer to the same public key. +func (pkl PrivKeyLedgerSecp256k1) Equals(other tmcrypto.PrivKey) bool { + if ledger, ok := other.(*PrivKeyLedgerSecp256k1); ok { + return pkl.CachedPubKey.Equals(ledger.CachedPubKey) + } + + return false +} + +// Sign calls the ledger and stores the PubKey for future use. // -// Communication is checked on NewPrivKeyLedger and PrivKeyFromBytes, -// returning an error, so this should only trigger if the privkey is held -// in memory for a while before use. -func (pk PrivKeyLedgerSecp256k1) Sign(msg []byte) (tcrypto.Signature, error) { - dev, err := getLedger() +// Communication is checked on NewPrivKeyLedger and PrivKeyFromBytes, returning +// an error, so this should only trigger if the private key is held in memory +// for a while before use. +func (pkl PrivKeyLedgerSecp256k1) Sign(msg []byte) (tmcrypto.Signature, error) { + sig, err := pkl.signLedgerSecp256k1(msg) if err != nil { return nil, err } - sig, err := signLedgerSecp256k1(dev, pk.Path, msg) - if err != nil { - return nil, err - } - return sig, nil -} -// PubKey returns the stored PubKey -func (pk PrivKeyLedgerSecp256k1) PubKey() tcrypto.PubKey { - return pk.CachedPubKey + return sig, nil } // getPubKey reads the pubkey the ledger itself // since this involves IO, it may return an error, which is not exposed // in the PubKey interface, so this function allows better error handling -func (pk PrivKeyLedgerSecp256k1) getPubKey() (key tcrypto.PubKey, err error) { - dev, err := getLedger() - if err != nil { - return key, fmt.Errorf("cannot connect to Ledger device - error: %v", err) - } - key, err = pubkeyLedgerSecp256k1(dev, pk.Path) +func (pkl PrivKeyLedgerSecp256k1) getPubKey() (key tmcrypto.PubKey, err error) { + key, err = pkl.pubkeyLedgerSecp256k1() if err != nil { return key, fmt.Errorf("please open Cosmos app on the Ledger device - error: %v", err) } + return key, err } -// Equals fulfils PrivKey Interface - makes sure both keys refer to the -// same -func (pk PrivKeyLedgerSecp256k1) Equals(other tcrypto.PrivKey) bool { - if ledger, ok := other.(*PrivKeyLedgerSecp256k1); ok { - return pk.CachedPubKey.Equals(ledger.CachedPubKey) +func (pkl PrivKeyLedgerSecp256k1) signLedgerSecp256k1(msg []byte) (tmcrypto.Signature, error) { + sigBytes, err := pkl.ledger.SignSECP256K1(pkl.Path, msg) + if err != nil { + return nil, err } - return false + + return tmcrypto.SignatureSecp256k1FromBytes(sigBytes), nil +} + +func (pkl PrivKeyLedgerSecp256k1) pubkeyLedgerSecp256k1() (pub tmcrypto.PubKey, err error) { + key, err := pkl.ledger.GetPublicKeySECP256K1(pkl.Path) + if err != nil { + return nil, fmt.Errorf("error fetching public key: %v", err) + } + + var pk tmcrypto.PubKeySecp256k1 + + // re-serialize in the 33-byte compressed format + cmp, err := secp256k1.ParsePubKey(key[:], secp256k1.S256()) + copy(pk[:], cmp.SerializeCompressed()) + + return pk, nil } diff --git a/crypto/ledger_test.go b/crypto/ledger_test.go index 997dfbc3bc..8e1a2ed654 100644 --- a/crypto/ledger_test.go +++ b/crypto/ledger_test.go @@ -1,25 +1,26 @@ package crypto import ( + "fmt" "os" "testing" "github.com/stretchr/testify/require" - - tcrypto "github.com/tendermint/tendermint/crypto" + tmcrypto "github.com/tendermint/tendermint/crypto" ) +var ledgerEnabledEnv = "TEST_WITH_LEDGER" + func TestRealLedgerSecp256k1(t *testing.T) { - - if os.Getenv("WITH_LEDGER") == "" { - t.Skip("Set WITH_LEDGER to run code on real ledger") + if os.Getenv(ledgerEnabledEnv) == "" { + t.Skip(fmt.Sprintf("Set '%s' to run code on a real ledger", ledgerEnabledEnv)) } - msg := []byte("kuhehfeohg") - + msg := []byte("{\"account_number\":\"3\",\"chain_id\":\"1234\",\"fee\":{\"amount\":[{\"amount\":\"150\",\"denom\":\"atom\"}],\"gas\":\"5000\"},\"memo\":\"memo\",\"msgs\":[[\"%s\"]],\"sequence\":\"6\"}") path := DerivationPath{44, 60, 0, 0, 0} priv, err := NewPrivKeyLedgerSecp256k1(path) - require.Nil(t, err, "%+v", err) + require.Nil(t, err, "%s", err) + pub := priv.PubKey() sig, err := priv.Sign(msg) require.Nil(t, err) @@ -27,24 +28,23 @@ func TestRealLedgerSecp256k1(t *testing.T) { valid := pub.VerifyBytes(msg, sig) require.True(t, valid) - // now, let's serialize the key and make sure it still works - bs := priv.Bytes() - priv2, err := tcrypto.PrivKeyFromBytes(bs) + // now, let's serialize the public key and make sure it still works + bs := priv.PubKey().Bytes() + pub2, err := tmcrypto.PubKeyFromBytes(bs) require.Nil(t, err, "%+v", err) // make sure we get the same pubkey when we load from disk - pub2 := priv2.PubKey() require.Equal(t, pub, pub2) // signing with the loaded key should match the original pubkey - sig, err = priv2.Sign(msg) + sig, err = priv.Sign(msg) require.Nil(t, err) valid = pub.VerifyBytes(msg, sig) require.True(t, valid) // make sure pubkeys serialize properly as well bs = pub.Bytes() - bpub, err := tcrypto.PubKeyFromBytes(bs) + bpub, err := tmcrypto.PubKeyFromBytes(bs) require.NoError(t, err) require.Equal(t, pub, bpub) } @@ -52,8 +52,8 @@ func TestRealLedgerSecp256k1(t *testing.T) { // TestRealLedgerErrorHandling calls. These tests assume // the ledger is not plugged in.... func TestRealLedgerErrorHandling(t *testing.T) { - if os.Getenv("WITH_LEDGER") != "" { - t.Skip("Skipping on WITH_LEDGER as it tests unplugged cases") + if os.Getenv(ledgerEnabledEnv) != "" { + t.Skip(fmt.Sprintf("Unset '%s' to run code as if without a real Ledger", ledgerEnabledEnv)) } // first, try to generate a key, must return an error From 28a1b5ebc0e1c030ebc1fb90413691b967e9a9c2 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Sat, 14 Jul 2018 04:20:14 +0200 Subject: [PATCH 03/30] Version & changelog --- CHANGELOG.md | 10 ++++++++-- version/version.go | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 532e981550..2915450c2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,13 @@ # Changelog +## 0.21.1 + +*July 14th, 2018* + +BUG FIXES +* [build] Added Ledger build support via `LEDGER_ENABLED=true|false` + * True by default except when cross-compiling + ## 0.21.0 *July 13th, 2018* @@ -24,8 +32,6 @@ BUG FIXES * [keys] \#1629 - updating password no longer asks for a new password when the first entered password was incorrect * [lcd] importing an account would create a random account * [server] 'gaiad init' command family now writes provided name as the moniker in `config.toml` -* [build] Added Ledger build support via `LEDGER_ENABLED=true|false` - * True by default except when cross-compiling ## 0.20.0 diff --git a/version/version.go b/version/version.go index 617972e69d..0c1574e484 100644 --- a/version/version.go +++ b/version/version.go @@ -3,9 +3,9 @@ package version const Maj = "0" const Min = "21" -const Fix = "0" +const Fix = "1" -const Version = "0.21.0" +const Version = "0.21.1" // GitCommit set by build flags var GitCommit = "" From f4ee940989e81cb6769cfdc4f2bb8e9f559905fc Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 14 Jul 2018 13:39:10 +0100 Subject: [PATCH 04/30] update to tm0.22.4-rc0 and bring back lcd test --- Gopkg.lock | 196 +------ Gopkg.toml | 2 +- client/lcd/lcd_test.go | 1008 ++++++++++++++++++++++++++++++++++++ client/lcd/test_helpers.go | 2 +- server/export.go | 2 +- server/init.go | 6 +- 6 files changed, 1036 insertions(+), 180 deletions(-) create mode 100644 client/lcd/lcd_test.go diff --git a/Gopkg.lock b/Gopkg.lock index a1372b1fa8..63f53a96f8 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -3,78 +3,57 @@ [[projects]] branch = "master" - digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] - pruneopts = "UT" revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[projects]] branch = "master" - digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] - pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] - digest = "1:1343a2963481a305ca4d051e84bc2abd16b601ee22ed324f8d605de1adb291b0" name = "github.com/bgentry/speakeasy" packages = ["."] - pruneopts = "UT" revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" version = "v0.1.0" [[projects]] branch = "master" - digest = "1:70f6b224a59b2fa453debffa85c77f71063d8754b90c8c4fbad5794e2c382b0f" name = "github.com/brejski/hid" packages = ["."] - pruneopts = "UT" revision = "06112dcfcc50a7e0e4fd06e17f9791e788fdaafc" [[projects]] branch = "master" - digest = "1:6aabc1566d6351115d561d038da82a4c19b46c3b6e17f4a0a2fa60260663dc79" name = "github.com/btcsuite/btcd" packages = ["btcec"] - pruneopts = "UT" revision = "fdfc19097e7ac6b57035062056f5b7b4638b8898" [[projects]] - branch = "master" - digest = "1:386de157f7d19259a7f9c81f26ce011223ce0f090353c1152ffdf730d7d10ac2" name = "github.com/btcsuite/btcutil" packages = ["bech32"] - pruneopts = "UT" - revision = "ab6388e0c60ae4834a1f57511e20c17b5f78be4b" + revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4" [[projects]] - digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] - pruneopts = "UT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] - branch = "master" - digest = "1:c7644c73a3d23741fdba8a99b1464e021a224b7e205be497271a8003a15ca41b" name = "github.com/ebuchman/fail-test" packages = ["."] - pruneopts = "UT" revision = "95f809107225be108efcf10a3509e4ea6ceef3c4" [[projects]] - digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" name = "github.com/fsnotify/fsnotify" packages = ["."] - pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] - digest = "1:fa30c0652956e159cdb97dcb2ef8b8db63ed668c02a5c3a40961c8f0641252fe" name = "github.com/go-kit/kit" packages = [ "log", @@ -83,30 +62,24 @@ "metrics", "metrics/discard", "metrics/internal/lv", - "metrics/prometheus", + "metrics/prometheus" ] - pruneopts = "UT" revision = "4dc7be5d2d12881735283bcab7352178e190fc71" version = "v0.6.0" [[projects]] - digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" name = "github.com/go-logfmt/logfmt" packages = ["."] - pruneopts = "UT" revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" [[projects]] - digest = "1:c4a2528ccbcabf90f9f3c464a5fc9e302d592861bbfd0b7135a7de8a943d0406" name = "github.com/go-stack/stack" packages = ["."] - pruneopts = "UT" revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc" version = "v1.7.0" [[projects]] - digest = "1:af1306bff89268721ea2550d504413c9487ebfca11e2ff8f39ae79b99a720ff5" name = "github.com/gogo/protobuf" packages = [ "gogoproto", @@ -114,273 +87,214 @@ "proto", "protoc-gen-gogo/descriptor", "sortkeys", - "types", + "types" ] - pruneopts = "UT" revision = "1adfc126b41513cc696b209667c8656ea7aac67c" version = "v1.0.0" [[projects]] - digest = "1:cb22af0ed7c72d495d8be1106233ee553898950f15fd3f5404406d44c2e86888" name = "github.com/golang/protobuf" packages = [ "proto", "ptypes", "ptypes/any", "ptypes/duration", - "ptypes/timestamp", + "ptypes/timestamp" ] - pruneopts = "UT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] branch = "master" - digest = "1:4a0c6bb4805508a6287675fac876be2ac1182539ca8a32468d8128882e9d5009" name = "github.com/golang/snappy" packages = ["."] - pruneopts = "UT" revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a" [[projects]] - digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" name = "github.com/gorilla/context" packages = ["."] - pruneopts = "UT" revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" version = "v1.1.1" [[projects]] - digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f" name = "github.com/gorilla/mux" packages = ["."] - pruneopts = "UT" revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" version = "v1.6.2" [[projects]] - digest = "1:43dd08a10854b2056e615d1b1d22ac94559d822e1f8b6fcc92c1a1057e85188e" name = "github.com/gorilla/websocket" packages = ["."] - pruneopts = "UT" revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [[projects]] branch = "master" - digest = "1:8951fe6e358876736d8fa1f3992624fdbb2dec6bc49401c1381d1ef8abbb544f" name = "github.com/hashicorp/hcl" packages = [ ".", "hcl/ast", "hcl/parser", + "hcl/printer", "hcl/scanner", "hcl/strconv", "hcl/token", "json/parser", "json/scanner", - "json/token", + "json/token" ] - pruneopts = "UT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] - digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] - pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] branch = "master" - digest = "1:39b27d1381a30421f9813967a5866fba35dc1d4df43a6eefe3b7a5444cb07214" name = "github.com/jmhodges/levigo" packages = ["."] - pruneopts = "UT" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" [[projects]] branch = "master" - digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" name = "github.com/kr/logfmt" packages = ["."] - pruneopts = "UT" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" [[projects]] - digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" name = "github.com/magiconair/properties" packages = ["."] - pruneopts = "UT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] - digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" name = "github.com/mattn/go-isatty" packages = ["."] - pruneopts = "UT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] - digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] - pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" - digest = "1:e730597b38a4d56e2361e0b6236cb800e52c73cace2ff91396f4ff35792ddfa7" name = "github.com/mitchellh/mapstructure" packages = ["."] - pruneopts = "UT" revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" [[projects]] - digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" name = "github.com/pelletier/go-toml" packages = ["."] - pruneopts = "UT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] - digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] - pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] - digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] - pruneopts = "UT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] - branch = "master" - digest = "1:98225904b7abff96c052b669b25788f18225a36673fba022fb93514bb9a2a64e" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp", + "prometheus/promhttp" ] - pruneopts = "UT" revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" - digest = "1:53a76eb11bdc815fcf0c757a9648fda0ab6887da13f07587181ff2223b67956c" name = "github.com/prometheus/client_model" packages = ["go"] - pruneopts = "UT" - revision = "99fa1f4be8e564e8a6b613da7fa6f46c9edafc6c" + revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" [[projects]] branch = "master" - digest = "1:4d291d51042ed9de40eef61a3c1b56e969d6e0f8aa5fd3da5e958ec66bee68e4" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model", + "model" ] - pruneopts = "UT" revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" [[projects]] branch = "master" - digest = "1:55d7449d6987dabf272b4e81b2f9c449f05b17415c939b68d1e82f57e3374b7f" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs", + "xfs" ] - pruneopts = "UT" revision = "ae68e2d4c00fed4943b5f6698d504a5fe083da8a" [[projects]] - branch = "master" - digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" packages = ["."] - pruneopts = "UT" revision = "e2704e165165ec55d062f5919b4b29494e9fa790" [[projects]] - digest = "1:37ace7f35375adec11634126944bdc45a673415e2fcc07382d03b75ec76ea94c" name = "github.com/spf13/afero" packages = [ ".", - "mem", + "mem" ] - pruneopts = "UT" revision = "787d034dfe70e44075ccc060d346146ef53270ad" version = "v1.1.1" [[projects]] - digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" name = "github.com/spf13/cast" packages = ["."] - pruneopts = "UT" revision = "8965335b8c7107321228e3e3702cab9832751bac" version = "v1.2.0" [[projects]] - digest = "1:627ab2f549a6a55c44f46fa24a4307f4d0da81bfc7934ed0473bf38b24051d26" name = "github.com/spf13/cobra" packages = ["."] - pruneopts = "UT" revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b" version = "v0.0.1" [[projects]] branch = "master" - digest = "1:080e5f630945ad754f4b920e60b4d3095ba0237ebf88dc462eb28002932e3805" name = "github.com/spf13/jwalterweatherman" packages = ["."] - pruneopts = "UT" revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" [[projects]] - digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" name = "github.com/spf13/pflag" packages = ["."] - pruneopts = "UT" revision = "583c0c0531f06d5278b7d917446061adc344b5cd" version = "v1.0.1" [[projects]] - digest = "1:f8e1a678a2571e265f4bf91a3e5e32aa6b1474a55cb0ea849750cc177b664d96" name = "github.com/spf13/viper" packages = ["."] - pruneopts = "UT" revision = "25b30aa063fc18e48662b86996252eabdcf2f0c7" version = "v1.0.0" [[projects]] - digest = "1:73697231b93fb74a73ebd8384b68b9a60c57ea6b13c56d2425414566a72c8e6d" name = "github.com/stretchr/testify" packages = [ "assert", - "require", + "require" ] - pruneopts = "UT" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" version = "v1.2.1" [[projects]] branch = "master" - digest = "1:922191411ad8f61bcd8018ac127589bb489712c1d1a0ab2497aca4b16de417d2" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -394,41 +308,33 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util", + "leveldb/util" ] - pruneopts = "UT" revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] branch = "master" - digest = "1:203b409c21115233a576f99e8f13d8e07ad82b25500491f7e1cca12588fb3232" name = "github.com/tendermint/ed25519" packages = [ ".", "edwards25519", - "extra25519", + "extra25519" ] - pruneopts = "UT" revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057" [[projects]] - digest = "1:e9113641c839c21d8eaeb2c907c7276af1eddeed988df8322168c56b7e06e0e1" name = "github.com/tendermint/go-amino" packages = ["."] - pruneopts = "UT" revision = "2106ca61d91029c931fd54968c2bb02dc96b1412" version = "0.10.1" [[projects]] - digest = "1:d4a15d404afbf591e8be16fcda7f5ac87948d5c7531f9d909fd84cc730ab16e2" name = "github.com/tendermint/iavl" packages = ["."] - pruneopts = "UT" revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9" version = "v0.9.2" [[projects]] - digest = "1:2511fa7bc2725251a1a48a923c8f01cd41de29b00a21224092d448a9e4627c21" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -483,22 +389,18 @@ "state/txindex/kv", "state/txindex/null", "types", - "version", + "version" ] - pruneopts = "UT" - revision = "5ff65274b84ea905787a48512cc3124385bddf2f" - version = "v0.22.2" + revision = "c64a3c74c870d725ba1356f75b4afadf0928c297" + version = "v0.22.4" [[projects]] - digest = "1:5bd938386bd1f61a581bf8cd6ff2b7b2f79c542929176db4ceb44965440dae07" name = "github.com/zondax/ledger-goclient" packages = ["."] - pruneopts = "UT" revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [[projects]] branch = "master" - digest = "1:e8206c1653e050116ec8c9a823a86413fc9f9ee3c2f3ae977c96d6a1747f7325" name = "golang.org/x/crypto" packages = [ "blowfish", @@ -511,14 +413,11 @@ "pbkdf2", "poly1305", "ripemd160", - "salsa20/salsa", + "salsa20/salsa" ] - pruneopts = "UT" revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" [[projects]] - branch = "master" - digest = "1:04dda8391c3e2397daf254ac68003f30141c069b228d06baec8324a5f81dc1e9" name = "golang.org/x/net" packages = [ "context", @@ -528,21 +427,17 @@ "idna", "internal/timeseries", "netutil", - "trace", + "trace" ] - pruneopts = "UT" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" - digest = "1:d773e525476aefa22ea944a5425a9bfb99819b2e67eeb9b1966454fd57522bbf" name = "golang.org/x/sys" packages = ["unix"] - pruneopts = "UT" revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" [[projects]] - digest = "1:7509ba4347d1f8de6ae9be8818b0cd1abc3deeffe28aeaf4be6d4b6b5178d9ca" name = "golang.org/x/text" packages = [ "collate", @@ -558,22 +453,18 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable", + "unicode/rangetable" ] - pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] branch = "master" - digest = "1:601e63e7d4577f907118bec825902505291918859d223bce015539e79f1160e3" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] - pruneopts = "UT" revision = "e92b116572682a5b432ddd840aeaba2a559eeff1" [[projects]] - digest = "1:4d7b5d9746840266938cdb21a40f8eba7137d9153c4ed404d6bb2a450d06f690" name = "google.golang.org/grpc" packages = [ ".", @@ -598,63 +489,20 @@ "stats", "status", "tap", - "transport", + "transport" ] - pruneopts = "UT" revision = "d11072e7ca9811b1100b80ca0269ac831f06d024" version = "v1.11.3" [[projects]] - digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" name = "gopkg.in/yaml.v2" packages = ["."] - pruneopts = "UT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - input-imports = [ - "github.com/bartekn/go-bip39", - "github.com/bgentry/speakeasy", - "github.com/btcsuite/btcd/btcec", - "github.com/golang/protobuf/proto", - "github.com/gorilla/mux", - "github.com/mattn/go-isatty", - "github.com/pkg/errors", - "github.com/spf13/cobra", - "github.com/spf13/pflag", - "github.com/spf13/viper", - "github.com/stretchr/testify/assert", - "github.com/stretchr/testify/require", - "github.com/tendermint/go-amino", - "github.com/tendermint/iavl", - "github.com/tendermint/tendermint/abci/server", - "github.com/tendermint/tendermint/abci/types", - "github.com/tendermint/tendermint/cmd/tendermint/commands", - "github.com/tendermint/tendermint/config", - "github.com/tendermint/tendermint/crypto", - "github.com/tendermint/tendermint/crypto/merkle", - "github.com/tendermint/tendermint/crypto/tmhash", - "github.com/tendermint/tendermint/libs/bech32", - "github.com/tendermint/tendermint/libs/cli", - "github.com/tendermint/tendermint/libs/cli/flags", - "github.com/tendermint/tendermint/libs/common", - "github.com/tendermint/tendermint/libs/db", - "github.com/tendermint/tendermint/libs/log", - "github.com/tendermint/tendermint/node", - "github.com/tendermint/tendermint/p2p", - "github.com/tendermint/tendermint/privval", - "github.com/tendermint/tendermint/proxy", - "github.com/tendermint/tendermint/rpc/client", - "github.com/tendermint/tendermint/rpc/core/types", - "github.com/tendermint/tendermint/rpc/lib/client", - "github.com/tendermint/tendermint/rpc/lib/server", - "github.com/tendermint/tendermint/types", - "github.com/zondax/ledger-goclient", - "golang.org/x/crypto/blowfish", - "golang.org/x/crypto/ripemd160", - ] + inputs-digest = "94abff3ff321fd150a6e4b95d109297296cdc00693c648c9b2a48171b90e36b0" solver-name = "gps-cdcl" solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml index da2c8e29ce..a0ad39c144 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -62,7 +62,7 @@ [[override]] name = "github.com/tendermint/tendermint" - version = "=0.22.2" + version = "=0.22.4" [[constraint]] name = "github.com/bartekn/go-bip39" diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go new file mode 100644 index 0000000000..df437c90c6 --- /dev/null +++ b/client/lcd/lcd_test.go @@ -0,0 +1,1008 @@ +package lcd + +import ( + "encoding/hex" + "fmt" + "net/http" + "regexp" + "testing" + + "github.com/spf13/viper" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + cryptoKeys "github.com/cosmos/cosmos-sdk/crypto/keys" + abci "github.com/tendermint/tendermint/abci/types" + "github.com/tendermint/tendermint/libs/common" + p2p "github.com/tendermint/tendermint/p2p" + ctypes "github.com/tendermint/tendermint/rpc/core/types" + + client "github.com/cosmos/cosmos-sdk/client" + keys "github.com/cosmos/cosmos-sdk/client/keys" + rpc "github.com/cosmos/cosmos-sdk/client/rpc" + tests "github.com/cosmos/cosmos-sdk/tests" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/wire" + "github.com/cosmos/cosmos-sdk/x/auth" + "github.com/cosmos/cosmos-sdk/x/gov" + "github.com/cosmos/cosmos-sdk/x/slashing" + "github.com/cosmos/cosmos-sdk/x/stake" +) + +func init() { + cryptoKeys.BcryptSecurityParameter = 1 +} + +func TestKeys(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // get seed + // TODO Do we really need this endpoint? + res, body := Request(t, port, "GET", "/keys/seed", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + reg, err := regexp.Compile(`([a-z]+ ){12}`) + require.Nil(t, err) + match := reg.MatchString(seed) + require.True(t, match, "Returned seed has wrong format", seed) + + newName := "test_newname" + newPassword := "0987654321" + + // add key + jsonStr := []byte(fmt.Sprintf(`{"name":"%s", "password":"%s", "seed":"%s"}`, newName, newPassword, seed)) + res, body = Request(t, port, "POST", "/keys", jsonStr) + + require.Equal(t, http.StatusOK, res.StatusCode, body) + var resp keys.KeyOutput + err = wire.Cdc.UnmarshalJSON([]byte(body), &resp) + require.Nil(t, err, body) + + addr2Bech32 := resp.Address.String() + _, err = sdk.AccAddressFromBech32(addr2Bech32) + require.NoError(t, err, "Failed to return a correct bech32 address") + + // test if created account is the correct account + expectedInfo, _ := GetKB(t).CreateKey(newName, seed, newPassword) + expectedAccount := sdk.AccAddress(expectedInfo.GetPubKey().Address().Bytes()) + assert.Equal(t, expectedAccount.String(), addr2Bech32) + + // existing keys + res, body = Request(t, port, "GET", "/keys", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var m [2]keys.KeyOutput + err = cdc.UnmarshalJSON([]byte(body), &m) + require.Nil(t, err) + + addrBech32 := addr.String() + + require.Equal(t, name, m[0].Name, "Did not serve keys name correctly") + require.Equal(t, addrBech32, m[0].Address.String(), "Did not serve keys Address correctly") + require.Equal(t, newName, m[1].Name, "Did not serve keys name correctly") + require.Equal(t, addr2Bech32, m[1].Address.String(), "Did not serve keys Address correctly") + + // select key + keyEndpoint := fmt.Sprintf("/keys/%s", newName) + res, body = Request(t, port, "GET", keyEndpoint, nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var m2 keys.KeyOutput + err = cdc.UnmarshalJSON([]byte(body), &m2) + require.Nil(t, err) + + require.Equal(t, newName, m2.Name, "Did not serve keys name correctly") + require.Equal(t, addr2Bech32, m2.Address.String(), "Did not serve keys Address correctly") + + // update key + jsonStr = []byte(fmt.Sprintf(`{ + "old_password":"%s", + "new_password":"12345678901" + }`, newPassword)) + + res, body = Request(t, port, "PUT", keyEndpoint, jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + // here it should say unauthorized as we changed the password before + res, body = Request(t, port, "PUT", keyEndpoint, jsonStr) + require.Equal(t, http.StatusUnauthorized, res.StatusCode, body) + + // delete key + jsonStr = []byte(`{"password":"12345678901"}`) + res, body = Request(t, port, "DELETE", keyEndpoint, jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) +} + +func TestVersion(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{}) + defer cleanup() + + // node info + res, body := Request(t, port, "GET", "/version", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + reg, err := regexp.Compile(`\d+\.\d+\.\d+(-dev)?`) + require.Nil(t, err) + match := reg.MatchString(body) + require.True(t, match, body) + + // node info + res, body = Request(t, port, "GET", "/node_version", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + reg, err = regexp.Compile(`\d+\.\d+\.\d+(-dev)?`) + require.Nil(t, err) + match = reg.MatchString(body) + require.True(t, match, body) +} + +func TestNodeStatus(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{}) + defer cleanup() + + // node info + res, body := Request(t, port, "GET", "/node_info", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var nodeInfo p2p.NodeInfo + err := cdc.UnmarshalJSON([]byte(body), &nodeInfo) + require.Nil(t, err, "Couldn't parse node info") + + require.NotEqual(t, p2p.NodeInfo{}, nodeInfo, "res: %v", res) + + // syncing + res, body = Request(t, port, "GET", "/syncing", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + // we expect that there is no other node running so the syncing state is "false" + require.Equal(t, "false", body) +} + +func TestBlock(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{}) + defer cleanup() + + var resultBlock ctypes.ResultBlock + + res, body := Request(t, port, "GET", "/blocks/latest", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err := cdc.UnmarshalJSON([]byte(body), &resultBlock) + require.Nil(t, err, "Couldn't parse block") + + require.NotEqual(t, ctypes.ResultBlock{}, resultBlock) + + // -- + + res, body = Request(t, port, "GET", "/blocks/1", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = wire.Cdc.UnmarshalJSON([]byte(body), &resultBlock) + require.Nil(t, err, "Couldn't parse block") + + require.NotEqual(t, ctypes.ResultBlock{}, resultBlock) + + // -- + + res, body = Request(t, port, "GET", "/blocks/1000000000", nil) + require.Equal(t, http.StatusNotFound, res.StatusCode, body) +} + +func TestValidators(t *testing.T) { + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{}) + defer cleanup() + + var resultVals rpc.ResultValidatorsOutput + + res, body := Request(t, port, "GET", "/validatorsets/latest", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err := cdc.UnmarshalJSON([]byte(body), &resultVals) + require.Nil(t, err, "Couldn't parse validatorset") + + require.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) + + require.Contains(t, resultVals.Validators[0].Address.String(), "cosmosvaladdr") + require.Contains(t, resultVals.Validators[0].PubKey, "cosmosvalpub") + + // -- + + res, body = Request(t, port, "GET", "/validatorsets/1", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &resultVals) + require.Nil(t, err, "Couldn't parse validatorset") + + require.NotEqual(t, rpc.ResultValidatorsOutput{}, resultVals) + + // -- + + res, body = Request(t, port, "GET", "/validatorsets/1000000000", nil) + require.Equal(t, http.StatusNotFound, res.StatusCode, body) +} + +func TestCoinSend(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + bz, err := hex.DecodeString("8FA6AB57AD6870F6B5B2E57735F38F2F30E73CB6") + require.NoError(t, err) + someFakeAddr := sdk.AccAddress(bz) + + // query empty + res, body := Request(t, port, "GET", fmt.Sprintf("/accounts/%s", someFakeAddr), nil) + require.Equal(t, http.StatusNoContent, res.StatusCode, body) + + acc := getAccount(t, port, addr) + initialBalance := acc.GetCoins() + + // create TX + receiveAddr, resultTx := doSend(t, port, seed, name, password, addr) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // query sender + acc = getAccount(t, port, addr) + coins := acc.GetCoins() + mycoins := coins[0] + + require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) + + // query receiver + acc = getAccount(t, port, receiveAddr) + coins = acc.GetCoins() + mycoins = coins[0] + + require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, int64(1), mycoins.Amount.Int64()) +} + +func TestIBCTransfer(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + acc := getAccount(t, port, addr) + initialBalance := acc.GetCoins() + + // create TX + resultTx := doIBCTransfer(t, port, seed, name, password, addr) + + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // query sender + acc = getAccount(t, port, addr) + coins := acc.GetCoins() + mycoins := coins[0] + + require.Equal(t, "steak", mycoins.Denom) + require.Equal(t, initialBalance[0].Amount.SubRaw(1), mycoins.Amount) + + // TODO: query ibc egress packet state +} + +func TestTxs(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // query wrong + res, body := Request(t, port, "GET", "/txs", nil) + require.Equal(t, http.StatusBadRequest, res.StatusCode, body) + + // query empty + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32='%s'", "cosmosaccaddr1jawd35d9aq4u76sr3fjalmcqc8hqygs9gtnmv3"), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + require.Equal(t, "[]", body) + + // create TX + receiveAddr, resultTx := doSend(t, port, seed, name, password, addr) + + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx is findable + res, body = Request(t, port, "GET", fmt.Sprintf("/txs/%s", resultTx.Hash), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + type txInfo struct { + Hash common.HexBytes `json:"hash"` + Height int64 `json:"height"` + Tx sdk.Tx `json:"tx"` + Result abci.ResponseDeliverTx `json:"result"` + } + var indexedTxs []txInfo + + // check if tx is queryable + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=tx.hash='%s'", resultTx.Hash), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + require.NotEqual(t, "[]", body) + + err := cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + require.Equal(t, 1, len(indexedTxs)) + + // XXX should this move into some other testfile for txs in general? + // test if created TX hash is the correct hash + require.Equal(t, resultTx.Hash, indexedTxs[0].Hash) + + // query sender + // also tests url decoding + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=sender_bech32=%%27%s%%27", addr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + require.Equal(t, 1, len(indexedTxs), "%v", indexedTxs) // there are 2 txs created with doSend + require.Equal(t, resultTx.Height, indexedTxs[0].Height) + + // query recipient + res, body = Request(t, port, "GET", fmt.Sprintf("/txs?tag=recipient_bech32='%s'", receiveAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &indexedTxs) + require.NoError(t, err) + require.Equal(t, 1, len(indexedTxs)) + require.Equal(t, resultTx.Height, indexedTxs[0].Height) +} + +func TestValidatorsQuery(t *testing.T) { + cleanup, pks, port := InitializeTestLCD(t, 2, []sdk.AccAddress{}) + defer cleanup() + require.Equal(t, 2, len(pks)) + + validators := getValidators(t, port) + require.Equal(t, len(validators), 2) + + // make sure all the validators were found (order unknown because sorted by owner addr) + foundVal1, foundVal2 := false, false + pk1Bech := sdk.MustBech32ifyValPub(pks[0]) + pk2Bech := sdk.MustBech32ifyValPub(pks[1]) + if validators[0].PubKey == pk1Bech || validators[1].PubKey == pk1Bech { + foundVal1 = true + } + if validators[0].PubKey == pk2Bech || validators[1].PubKey == pk2Bech { + foundVal2 = true + } + require.True(t, foundVal1, "pk1Bech %v, owner1 %v, owner2 %v", pk1Bech, validators[0].Owner, validators[1].Owner) + require.True(t, foundVal2, "pk2Bech %v, owner1 %v, owner2 %v", pk2Bech, validators[0].Owner, validators[1].Owner) +} + +func TestBonding(t *testing.T) { + name, password, denom := "test", "1234567890", "steak" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, pks, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + validator1Owner := sdk.AccAddress(pks[0].Address()) + + // create bond TX + resultTx := doDelegate(t, port, seed, name, password, addr, validator1Owner) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // query sender + acc := getAccount(t, port, addr) + coins := acc.GetCoins() + + require.Equal(t, int64(40), coins.AmountOf(denom).Int64()) + + // query validator + bond := getDelegation(t, port, addr, validator1Owner) + require.Equal(t, "60/1", bond.Shares.String()) + + ////////////////////// + // testing unbonding + + // create unbond TX + resultTx = doBeginUnbonding(t, port, seed, name, password, addr, validator1Owner) + tests.WaitForHeight(resultTx.Height+1, port) + + // query validator + bond = getDelegation(t, port, addr, validator1Owner) + require.Equal(t, "30/1", bond.Shares.String()) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + // should the sender should have not received any coins as the unbonding has only just begun + // query sender + acc = getAccount(t, port, addr) + coins = acc.GetCoins() + require.Equal(t, int64(40), coins.AmountOf("steak").Int64()) + + // TODO add redelegation, need more complex capabilities such to mock context and +} + +func TestSubmitProposal(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // create SubmitProposal TX + resultTx := doSubmitProposal(t, port, seed, name, password, addr) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + var proposalID int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID) + + // query proposal + proposal := getProposal(t, port, proposalID) + require.Equal(t, "Test", proposal.GetTitle()) +} + +func TestDeposit(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // create SubmitProposal TX + resultTx := doSubmitProposal(t, port, seed, name, password, addr) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + var proposalID int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID) + + // query proposal + proposal := getProposal(t, port, proposalID) + require.Equal(t, "Test", proposal.GetTitle()) + + // create SubmitProposal TX + resultTx = doDeposit(t, port, seed, name, password, addr, proposalID) + tests.WaitForHeight(resultTx.Height+1, port) + + // query proposal + proposal = getProposal(t, port, proposalID) + require.True(t, proposal.GetTotalDeposit().IsEqual(sdk.Coins{sdk.NewCoin("steak", 10)})) + + // query deposit + deposit := getDeposit(t, port, proposalID, addr) + require.True(t, deposit.Amount.IsEqual(sdk.Coins{sdk.NewCoin("steak", 10)})) +} + +func TestVote(t *testing.T) { + name, password := "test", "1234567890" + addr, seed := CreateAddr(t, "test", password, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // create SubmitProposal TX + resultTx := doSubmitProposal(t, port, seed, name, password, addr) + tests.WaitForHeight(resultTx.Height+1, port) + + // check if tx was committed + require.Equal(t, uint32(0), resultTx.CheckTx.Code) + require.Equal(t, uint32(0), resultTx.DeliverTx.Code) + + var proposalID int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID) + + // query proposal + proposal := getProposal(t, port, proposalID) + require.Equal(t, "Test", proposal.GetTitle()) + + // create SubmitProposal TX + resultTx = doDeposit(t, port, seed, name, password, addr, proposalID) + tests.WaitForHeight(resultTx.Height+1, port) + + // query proposal + proposal = getProposal(t, port, proposalID) + require.Equal(t, gov.StatusVotingPeriod, proposal.GetStatus()) + + // create SubmitProposal TX + resultTx = doVote(t, port, seed, name, password, addr, proposalID) + tests.WaitForHeight(resultTx.Height+1, port) + + vote := getVote(t, port, proposalID, addr) + require.Equal(t, proposalID, vote.ProposalID) + require.Equal(t, gov.OptionYes, vote.Option) +} + +func TestUnrevoke(t *testing.T) { + _, password := "test", "1234567890" + addr, _ := CreateAddr(t, "test", password, GetKB(t)) + cleanup, pks, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr}) + defer cleanup() + + // XXX: any less than this and it fails + tests.WaitForHeight(3, port) + + signingInfo := getSigningInfo(t, port, sdk.ValAddress(pks[0].Address())) + tests.WaitForHeight(4, port) + require.Equal(t, true, signingInfo.IndexOffset > 0) + require.Equal(t, int64(0), signingInfo.JailedUntil) + require.Equal(t, true, signingInfo.SignedBlocksCounter > 0) +} + +func TestProposalsQuery(t *testing.T) { + name, password1 := "test", "1234567890" + name2, password2 := "test2", "1234567890" + addr, seed := CreateAddr(t, "test", password1, GetKB(t)) + addr2, seed2 := CreateAddr(t, "test2", password2, GetKB(t)) + cleanup, _, port := InitializeTestLCD(t, 1, []sdk.AccAddress{addr, addr2}) + defer cleanup() + + // Addr1 proposes (and deposits) proposals #1 and #2 + resultTx := doSubmitProposal(t, port, seed, name, password1, addr) + var proposalID1 int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID1) + tests.WaitForHeight(resultTx.Height+1, port) + resultTx = doSubmitProposal(t, port, seed, name, password1, addr) + var proposalID2 int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID2) + tests.WaitForHeight(resultTx.Height+1, port) + + // Addr2 proposes (and deposits) proposals #3 + resultTx = doSubmitProposal(t, port, seed2, name2, password2, addr2) + var proposalID3 int64 + cdc.UnmarshalBinaryBare(resultTx.DeliverTx.GetData(), &proposalID3) + tests.WaitForHeight(resultTx.Height+1, port) + + // Addr2 deposits on proposals #2 & #3 + resultTx = doDeposit(t, port, seed2, name2, password2, addr2, proposalID2) + tests.WaitForHeight(resultTx.Height+1, port) + resultTx = doDeposit(t, port, seed2, name2, password2, addr2, proposalID3) + tests.WaitForHeight(resultTx.Height+1, port) + + // Addr1 votes on proposals #2 & #3 + resultTx = doVote(t, port, seed, name, password1, addr, proposalID2) + tests.WaitForHeight(resultTx.Height+1, port) + resultTx = doVote(t, port, seed, name, password1, addr, proposalID3) + tests.WaitForHeight(resultTx.Height+1, port) + + // Addr2 votes on proposal #3 + resultTx = doVote(t, port, seed2, name2, password2, addr2, proposalID3) + tests.WaitForHeight(resultTx.Height+1, port) + + // Test query all proposals + proposals := getProposalsAll(t, port) + require.Equal(t, proposalID1, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID2, (proposals[1]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[2]).GetProposalID()) + + // Test query deposited by addr1 + proposals = getProposalsFilterDepositer(t, port, addr) + require.Equal(t, proposalID1, (proposals[0]).GetProposalID()) + + // Test query deposited by addr2 + proposals = getProposalsFilterDepositer(t, port, addr2) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[1]).GetProposalID()) + + // Test query voted by addr1 + proposals = getProposalsFilterVoter(t, port, addr) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) + require.Equal(t, proposalID3, (proposals[1]).GetProposalID()) + + // Test query voted by addr2 + proposals = getProposalsFilterVoter(t, port, addr2) + require.Equal(t, proposalID3, (proposals[0]).GetProposalID()) + + // Test query voted and deposited by addr1 + proposals = getProposalsFilterVoterDepositer(t, port, addr, addr) + require.Equal(t, proposalID2, (proposals[0]).GetProposalID()) +} + +//_____________________________________________________________________________ +// get the account to get the sequence +func getAccount(t *testing.T, port string, addr sdk.AccAddress) auth.Account { + res, body := Request(t, port, "GET", fmt.Sprintf("/accounts/%s", addr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var acc auth.Account + err := cdc.UnmarshalJSON([]byte(body), &acc) + require.Nil(t, err) + return acc +} + +func doSend(t *testing.T, port, seed, name, password string, addr sdk.AccAddress) (receiveAddr sdk.AccAddress, resultTx ctypes.ResultBroadcastTxCommit) { + + // create receive address + kb := client.MockKeyBase() + receiveInfo, _, err := kb.CreateMnemonic("receive_address", cryptoKeys.English, "1234567890", cryptoKeys.SigningAlgo("secp256k1")) + require.Nil(t, err) + receiveAddr = sdk.AccAddress(receiveInfo.GetPubKey().Address()) + + acc := getAccount(t, port, addr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + chainID := viper.GetString(client.FlagChainID) + + // send + coinbz, err := cdc.MarshalJSON(sdk.NewCoin("steak", 1)) + if err != nil { + panic(err) + } + + jsonStr := []byte(fmt.Sprintf(`{ + "name":"%s", + "password":"%s", + "account_number":"%d", + "sequence":"%d", + "gas": "10000", + "amount":[%s], + "chain_id":"%s" + }`, name, password, accnum, sequence, coinbz, chainID)) + res, body := Request(t, port, "POST", fmt.Sprintf("/accounts/%s/send", receiveAddr), jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &resultTx) + require.Nil(t, err) + + return receiveAddr, resultTx +} + +func doIBCTransfer(t *testing.T, port, seed, name, password string, addr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { + // create receive address + kb := client.MockKeyBase() + receiveInfo, _, err := kb.CreateMnemonic("receive_address", cryptoKeys.English, "1234567890", cryptoKeys.SigningAlgo("secp256k1")) + require.Nil(t, err) + receiveAddr := sdk.AccAddress(receiveInfo.GetPubKey().Address()) + + chainID := viper.GetString(client.FlagChainID) + + // get the account to get the sequence + acc := getAccount(t, port, addr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name":"%s", + "password": "%s", + "account_number":"%d", + "sequence": "%d", + "gas": "100000", + "chain_id": "%s", + "amount":[ + { + "denom": "%s", + "amount": "1" + } + ] + }`, name, password, accnum, sequence, chainID, "steak")) + res, body := Request(t, port, "POST", fmt.Sprintf("/ibc/testchain/%s/send", receiveAddr), jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + err = cdc.UnmarshalJSON([]byte(body), &resultTx) + require.Nil(t, err) + + return resultTx +} + +func getSigningInfo(t *testing.T, port string, validatorAddr sdk.ValAddress) slashing.ValidatorSigningInfo { + res, body := Request(t, port, "GET", fmt.Sprintf("/slashing/signing_info/%s", validatorAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var signingInfo slashing.ValidatorSigningInfo + err := cdc.UnmarshalJSON([]byte(body), &signingInfo) + require.Nil(t, err) + return signingInfo +} + +func getDelegation(t *testing.T, port string, delegatorAddr, validatorAddr sdk.AccAddress) stake.Delegation { + + // get the account to get the sequence + res, body := Request(t, port, "GET", fmt.Sprintf("/stake/%s/delegation/%s", delegatorAddr, validatorAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var bond stake.Delegation + err := cdc.UnmarshalJSON([]byte(body), &bond) + require.Nil(t, err) + return bond +} + +func doDelegate(t *testing.T, port, seed, name, password string, delegatorAddr, validatorAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, port, delegatorAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "account_number": "%d", + "sequence": "%d", + "gas": "10000", + "chain_id": "%s", + "delegations": [ + { + "delegator_addr": "%s", + "validator_addr": "%s", + "delegation": { "denom": "%s", "amount": "60" } + } + ], + "begin_unbondings": [], + "complete_unbondings": [], + "begin_redelegates": [], + "complete_redelegates": [] + }`, name, password, accnum, sequence, chainID, delegatorAddr, validatorAddr, "steak")) + res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results[0] +} + +func doBeginUnbonding(t *testing.T, port, seed, name, password string, + delegatorAddr, validatorAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { + + // get the account to get the sequence + acc := getAccount(t, port, delegatorAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "account_number": "%d", + "sequence": "%d", + "gas": "10000", + "chain_id": "%s", + "delegations": [], + "begin_unbondings": [ + { + "delegator_addr": "%s", + "validator_addr": "%s", + "shares": "30" + } + ], + "complete_unbondings": [], + "begin_redelegates": [], + "complete_redelegates": [] + }`, name, password, accnum, sequence, chainID, delegatorAddr, validatorAddr)) + res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results[0] +} + +func doBeginRedelegation(t *testing.T, port, seed, name, password string, + delegatorAddr, validatorSrcAddr, validatorDstAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { + + // get the account to get the sequence + acc := getAccount(t, port, delegatorAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // send + jsonStr := []byte(fmt.Sprintf(`{ + "name": "%s", + "password": "%s", + "account_number": "%d", + "sequence": "%d", + "gas": "10000", + "chain_id": "%s", + "delegations": [], + "begin_unbondings": [], + "complete_unbondings": [], + "begin_redelegates": [ + { + "delegator_addr": "%s", + "validator_src_addr": "%s", + "validator_dst_addr": "%s", + "shares": "30" + } + ], + "complete_redelegates": [] + }`, name, password, accnum, sequence, chainID, delegatorAddr, validatorSrcAddr, validatorDstAddr)) + res, body := Request(t, port, "POST", "/stake/delegations", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results []ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results[0] +} + +func getValidators(t *testing.T, port string) []stake.BechValidator { + // get the account to get the sequence + res, body := Request(t, port, "GET", "/stake/validators", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var validators []stake.BechValidator + err := cdc.UnmarshalJSON([]byte(body), &validators) + require.Nil(t, err) + return validators +} + +func getProposal(t *testing.T, port string, proposalID int64) gov.Proposal { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d", proposalID), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var proposal gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposal) + require.Nil(t, err) + return proposal +} + +func getDeposit(t *testing.T, port string, proposalID int64, depositerAddr sdk.AccAddress) gov.Deposit { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/deposits/%s", proposalID, depositerAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var deposit gov.Deposit + err := cdc.UnmarshalJSON([]byte(body), &deposit) + require.Nil(t, err) + return deposit +} + +func getVote(t *testing.T, port string, proposalID int64, voterAddr sdk.AccAddress) gov.Vote { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals/%d/votes/%s", proposalID, voterAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + var vote gov.Vote + err := cdc.UnmarshalJSON([]byte(body), &vote) + require.Nil(t, err) + return vote +} + +func getProposalsAll(t *testing.T, port string) []gov.Proposal { + res, body := Request(t, port, "GET", "/gov/proposals", nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var proposals []gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposals) + require.Nil(t, err) + return proposals +} + +func getProposalsFilterDepositer(t *testing.T, port string, depositerAddr sdk.AccAddress) []gov.Proposal { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?depositer=%s", depositerAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var proposals []gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposals) + require.Nil(t, err) + return proposals +} + +func getProposalsFilterVoter(t *testing.T, port string, voterAddr sdk.AccAddress) []gov.Proposal { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?voter=%s", voterAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var proposals []gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposals) + require.Nil(t, err) + return proposals +} + +func getProposalsFilterVoterDepositer(t *testing.T, port string, voterAddr, depositerAddr sdk.AccAddress) []gov.Proposal { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?depositer=%s&voter=%s", depositerAddr, voterAddr), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var proposals []gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposals) + require.Nil(t, err) + return proposals +} + +func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, port, proposerAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // submitproposal + jsonStr := []byte(fmt.Sprintf(`{ + "title": "Test", + "description": "test", + "proposal_type": "Text", + "proposer": "%s", + "initial_deposit": [{ "denom": "steak", "amount": "5" }], + "base_req": { + "name": "%s", + "password": "%s", + "chain_id": "%s", + "account_number":"%d", + "sequence":"%d", + "gas":"100000" + } + }`, proposerAddr, name, password, chainID, accnum, sequence)) + res, body := Request(t, port, "POST", "/gov/proposals", jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results +} + +func doDeposit(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress, proposalID int64) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, port, proposerAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // deposit on proposal + jsonStr := []byte(fmt.Sprintf(`{ + "depositer": "%s", + "amount": [{ "denom": "steak", "amount": "5" }], + "base_req": { + "name": "%s", + "password": "%s", + "chain_id": "%s", + "account_number":"%d", + "sequence": "%d", + "gas":"100000" + } + }`, proposerAddr, name, password, chainID, accnum, sequence)) + res, body := Request(t, port, "POST", fmt.Sprintf("/gov/proposals/%d/deposits", proposalID), jsonStr) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results +} + +func doVote(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress, proposalID int64) (resultTx ctypes.ResultBroadcastTxCommit) { + // get the account to get the sequence + acc := getAccount(t, port, proposerAddr) + accnum := acc.GetAccountNumber() + sequence := acc.GetSequence() + + chainID := viper.GetString(client.FlagChainID) + + // vote on proposal + jsonStr := []byte(fmt.Sprintf(`{ + "voter": "%s", + "option": "Yes", + "base_req": { + "name": "%s", + "password": "%s", + "chain_id": "%s", + "account_number": "%d", + "sequence": "%d", + "gas":"100000" + } + }`, proposerAddr, name, password, chainID, accnum, sequence)) + res, body := Request(t, port, "POST", fmt.Sprintf("/gov/proposals/%d/votes", proposalID), jsonStr) + fmt.Println(res) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var results ctypes.ResultBroadcastTxCommit + err := cdc.UnmarshalJSON([]byte(body), &results) + require.Nil(t, err) + + return results +} diff --git a/client/lcd/test_helpers.go b/client/lcd/test_helpers.go index 0dfab1a506..e1296ca60a 100644 --- a/client/lcd/test_helpers.go +++ b/client/lcd/test_helpers.go @@ -151,7 +151,7 @@ func InitializeTestLCD(t *testing.T, nValidators int, initAddrs []sdk.AccAddress appState, err := wire.MarshalJSONIndent(cdc, genesisState) require.NoError(t, err) - genDoc.AppStateJSON = appState + genDoc.AppState = appState // LCD listen address var listenAddr string diff --git a/server/export.go b/server/export.go index 5982e7b473..fa1c1907a1 100644 --- a/server/export.go +++ b/server/export.go @@ -30,7 +30,7 @@ func ExportCmd(ctx *Context, cdc *wire.Codec, appExporter AppExporter) *cobra.Co return err } - doc.AppStateJSON = appState + doc.AppState = appState doc.Validators = validators encoded, err := wire.MarshalJSONIndent(cdc, doc) diff --git a/server/init.go b/server/init.go index 7cf857c208..39f3d0b7f8 100644 --- a/server/init.go +++ b/server/init.go @@ -346,9 +346,9 @@ func readOrCreatePrivValidator(tmConfig *cfg.Config) crypto.PubKey { // error is returned if building or writing the configuration to file fails. func writeGenesisFile(cdc *wire.Codec, genesisFile, chainID string, validators []tmtypes.GenesisValidator, appState json.RawMessage) error { genDoc := tmtypes.GenesisDoc{ - ChainID: chainID, - Validators: validators, - AppStateJSON: appState, + ChainID: chainID, + Validators: validators, + AppState: appState, } if err := genDoc.ValidateAndComplete(); err != nil { From e35d06eb2439a5cfd3a34aa67a424288ef22fbf2 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Sat, 14 Jul 2018 14:19:17 +0100 Subject: [PATCH 05/30] client/lcd: add more gas for unbonding tx --- client/lcd/lcd_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index df437c90c6..9180af87a2 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -768,7 +768,7 @@ func doBeginUnbonding(t *testing.T, port, seed, name, password string, "password": "%s", "account_number": "%d", "sequence": "%d", - "gas": "10000", + "gas": "20000", "chain_id": "%s", "delegations": [], "begin_unbondings": [ From a2047c5c81f3f838a182ba544d580d43c9358300 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Sat, 14 Jul 2018 14:48:41 -0700 Subject: [PATCH 06/30] Merge PR #1687: tools: Ensure Gopkg.lock is correct in linting * tools: Ensure Gopkg.lock is correct in linting This adds dep status to the lint process. Also fixes linting errors that existed earlier. (not sure why they didn't show up on CI) Closes #1574 * Update dep, use the lock file new dep version creates --- Gopkg.lock | 1 - Gopkg.toml | 7 +------ Makefile | 2 ++ crypto/ledger_secp256k1.go | 3 +++ x/gov/client/cli/tx.go | 2 +- 5 files changed, 7 insertions(+), 8 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index a1372b1fa8..8a786fc3d3 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,7 +2,6 @@ [[projects]] - branch = "master" digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] diff --git a/Gopkg.toml b/Gopkg.toml index da2c8e29ce..012698c615 100644 --- a/Gopkg.toml +++ b/Gopkg.toml @@ -10,11 +10,6 @@ # name = "github.com/user/project" # version = "1.0.0" # -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# # [[override]] # name = "github.com/x/y" # version = "2.4.0" @@ -66,7 +61,7 @@ [[constraint]] name = "github.com/bartekn/go-bip39" - branch = "master" + revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[constraint]] name = "github.com/zondax/ledger-goclient" diff --git a/Makefile b/Makefile index 6f440e0200..b6b136f517 100644 --- a/Makefile +++ b/Makefile @@ -119,6 +119,8 @@ test_lint: gometalinter.v2 --config=tools/gometalinter.json ./... !(gometalinter.v2 --disable-all --enable='errcheck' --vendor ./... | grep -v "client/") find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -d -s + dep status >> /dev/null + !(grep -n branch Gopkg.toml) format: find . -name '*.go' -type f -not -path "./vendor*" -not -path "*.git*" | xargs gofmt -w -s diff --git a/crypto/ledger_secp256k1.go b/crypto/ledger_secp256k1.go index 7a9f10c0dd..9e8940d7bf 100644 --- a/crypto/ledger_secp256k1.go +++ b/crypto/ledger_secp256k1.go @@ -153,6 +153,9 @@ func (pkl PrivKeyLedgerSecp256k1) pubkeyLedgerSecp256k1() (pub tmcrypto.PubKey, // re-serialize in the 33-byte compressed format cmp, err := secp256k1.ParsePubKey(key[:], secp256k1.S256()) + if err != nil { + return nil, fmt.Errorf("error parsing public key: %v", err) + } copy(pk[:], cmp.SerializeCompressed()) return pk, nil diff --git a/x/gov/client/cli/tx.go b/x/gov/client/cli/tx.go index 8369c99273..88c4b7d170 100644 --- a/x/gov/client/cli/tx.go +++ b/x/gov/client/cli/tx.go @@ -158,7 +158,7 @@ func GetCmdVote(cdc *wire.Codec) *cobra.Command { return err } - fmt.Printf("Vote[Voter:%s,ProposalID:%d,Option:%s]", bechVoter, msg.ProposalID, msg.Option) + fmt.Printf("Vote[Voter:%s,ProposalID:%d,Option:%s]", bechVoter, msg.ProposalID, msg.Option.String()) // build and sign the transaction, then broadcast to Tendermint ctx := context.NewCoreContextFromViper().WithDecoder(authcmd.GetAccountDecoder(cdc)) From 8f453eaa04bc7fe06527a2a60b720d3998a6dc41 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 16 Jul 2018 17:43:10 +0100 Subject: [PATCH 07/30] update params for x/gov and default config --- CHANGELOG.md | 16 ++++++++++++++++ server/util.go | 17 +++++++++++------ x/gov/keeper.go | 6 +++--- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 2915450c2f..3690f5b747 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog +## 0.22.0 + +*July 16th, 2018* + +BREAKING CHANGES +* [x/gov] Increase VotingPeriod, DepositPeriod, and MinDeposit + +IMPROVEMENTS +* [gaiad] Default config updates: + - `timeout_commit=5000` so blocks only made every 5s + - `prof_listen_addr=localhost:6060` so profile server is on by default + - `p2p.send_rate` and `p2p.recv_rate` increases 10x (~5MB/s) + +BUG FIXES +* [server] Fix to actually overwrite default tendermint config + ## 0.21.1 *July 14th, 2018* diff --git a/server/util.go b/server/util.go index 1e6ed06c98..51547d116b 100644 --- a/server/util.go +++ b/server/util.go @@ -77,16 +77,21 @@ func interceptLoadConfig() (conf *cfg.Config, err error) { rootDir := tmpConf.RootDir configFilePath := filepath.Join(rootDir, "config/config.toml") // Intercept only if the file doesn't already exist + if _, err := os.Stat(configFilePath); os.IsNotExist(err) { // the following parse config is needed to create directories - sdkDefaultConfig, _ := tcmd.ParseConfig() - sdkDefaultConfig.ProfListenAddress = "prof_laddr=localhost:6060" - sdkDefaultConfig.P2P.RecvRate = 5120000 - sdkDefaultConfig.P2P.SendRate = 5120000 - cfg.WriteConfigFile(configFilePath, sdkDefaultConfig) + conf, _ = tcmd.ParseConfig() + conf.ProfListenAddress = "localhost:6060" + conf.P2P.RecvRate = 5120000 + conf.P2P.SendRate = 5120000 + conf.Consensus.TimeoutCommit = 5000 + cfg.WriteConfigFile(configFilePath, conf) // Fall through, just so that its parsed into memory. } - conf, err = tcmd.ParseConfig() + + if conf == nil { + conf, err = tcmd.ParseConfig() + } return } diff --git a/x/gov/keeper.go b/x/gov/keeper.go index b60404b8ce..ea3b47b96f 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -131,15 +131,15 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // Gets procedure from store. TODO: move to global param store and allow for updating of this func (keeper Keeper) GetDepositProcedure() DepositProcedure { return DepositProcedure{ - MinDeposit: sdk.Coins{sdk.NewCoin("steak", 10)}, - MaxDepositPeriod: 200, + MinDeposit: sdk.Coins{sdk.NewCoin("steak", 100)}, + MaxDepositPeriod: 10000, } } // Gets procedure from store. TODO: move to global param store and allow for updating of this func (keeper Keeper) GetVotingProcedure() VotingProcedure { return VotingProcedure{ - VotingPeriod: 200, + VotingPeriod: 10000, } } From 2cbe5662d02ddd3395d7aadb05463a6bd2648c7b Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 16 Jul 2018 18:08:22 +0100 Subject: [PATCH 08/30] fix tests --- x/gov/keeper.go | 12 +++++++++--- x/gov/keeper_test.go | 7 +++++++ 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/x/gov/keeper.go b/x/gov/keeper.go index ea3b47b96f..4569743efc 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -128,18 +128,24 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // ===================================================== // Procedures +var ( + defaultMinDeposit int64 = 100 + defaultMaxDepositPeriod int64 = 10000 + defaultVotingPeriod int64 = 10000 +) + // Gets procedure from store. TODO: move to global param store and allow for updating of this func (keeper Keeper) GetDepositProcedure() DepositProcedure { return DepositProcedure{ - MinDeposit: sdk.Coins{sdk.NewCoin("steak", 100)}, - MaxDepositPeriod: 10000, + MinDeposit: sdk.Coins{sdk.NewCoin("steak", defaultMinDeposit)}, + MaxDepositPeriod: defaultMaxDepositPeriod, } } // Gets procedure from store. TODO: move to global param store and allow for updating of this func (keeper Keeper) GetVotingProcedure() VotingProcedure { return VotingProcedure{ - VotingPeriod: 10000, + VotingPeriod: defaultVotingPeriod, } } diff --git a/x/gov/keeper_test.go b/x/gov/keeper_test.go index 786953fd3a..988a8a6a7e 100644 --- a/x/gov/keeper_test.go +++ b/x/gov/keeper_test.go @@ -10,6 +10,13 @@ import ( sdk "github.com/cosmos/cosmos-sdk/types" ) +// overwrite defaults for testing +func init() { + defaultMinDeposit = 10 + defaultMaxDepositPeriod = 200 + defaultVotingPeriod = 200 +} + func TestGetSetProposal(t *testing.T) { mapp, keeper, _, _, _, _ := getMockApp(t, 0) mapp.BeginBlock(abci.RequestBeginBlock{}) From 4e1cbb7d516998be8c2e8585879ccc30fbac387d Mon Sep 17 00:00:00 2001 From: Zach Ramsay Date: Mon, 16 Jul 2018 14:19:11 -0400 Subject: [PATCH 09/30] docs: how they're updated --- docs/DOCS_README.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 docs/DOCS_README.md diff --git a/docs/DOCS_README.md b/docs/DOCS_README.md new file mode 100644 index 0000000000..564a7e9558 --- /dev/null +++ b/docs/DOCS_README.md @@ -0,0 +1,17 @@ +# Documentation Maintenance Overview + +The documentation found in this directory is hosted at: + +- https://cosmos.network/docs/ + +and built using [VuePress](https://vuepress.vuejs.org/) from the Cosmos website repo: + +- https://github.com/cosmos/cosmos.network + +which has a [configuration file](https://github.com/cosmos/cosmos.network/blob/develop/docs/.vuepress/config.js) for displaying +the Table of Contents that lists all the documentation. + +Under the hood, Jenkins listens for changes in ./docs then pushes a `docs-staging` branch to the cosmos.network repo with the latest documentation. That branch must be manually PR'd to `develop` then `master` for staging then production. This process should happen in synchrony with a release. + +The `README.md` in this directory is the landing page for +website documentation. From 566bf8e3bdade8fc3124d27c990e04c14d7da6cc Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Mon, 16 Jul 2018 20:25:20 +0200 Subject: [PATCH 10/30] Governance CLI test fixes --- x/gov/keeper.go | 2 +- x/gov/proposals.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/x/gov/keeper.go b/x/gov/keeper.go index 4569743efc..572c5388eb 100644 --- a/x/gov/keeper.go +++ b/x/gov/keeper.go @@ -129,7 +129,7 @@ func (keeper Keeper) activateVotingPeriod(ctx sdk.Context, proposal Proposal) { // Procedures var ( - defaultMinDeposit int64 = 100 + defaultMinDeposit int64 = 10 defaultMaxDepositPeriod int64 = 10000 defaultVotingPeriod int64 = 10000 ) diff --git a/x/gov/proposals.go b/x/gov/proposals.go index 64ffe6bfa2..bb6b0aed4c 100644 --- a/x/gov/proposals.go +++ b/x/gov/proposals.go @@ -60,7 +60,7 @@ type TextProposal struct { Description string `json:"description"` // Description of the proposal ProposalType ProposalKind `json:"proposal_type"` // Type of proposal. Initial set {PlainTextProposal, SoftwareUpgradeProposal} - Status ProposalStatus `json:"string"` // Status of the Proposal {Pending, Active, Passed, Rejected} + Status ProposalStatus `json:"proposal_status"` // Status of the Proposal {Pending, Active, Passed, Rejected} SubmitBlock int64 `json:"submit_block"` // Height of the block where TxGovSubmitProposal was included TotalDeposit sdk.Coins `json:"total_deposit"` // Current deposit on this proposal. Initial value is set at InitialDeposit @@ -184,7 +184,7 @@ func (pt ProposalKind) Format(s fmt.State, verb rune) { case 's': s.Write([]byte(fmt.Sprintf("%s", pt.String()))) default: - s.Write([]byte(fmt.Sprintf("%v", pt))) + s.Write([]byte(fmt.Sprintf("%v", byte(pt)))) } } @@ -283,6 +283,6 @@ func (status ProposalStatus) Format(s fmt.State, verb rune) { case 's': s.Write([]byte(fmt.Sprintf("%s", status.String()))) default: - s.Write([]byte(fmt.Sprintf("%v", status))) + s.Write([]byte(fmt.Sprintf("%v", byte(status)))) } } From 4b688992bac15e5740be1fa5f784de1cf7aa86a2 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Mon, 16 Jul 2018 11:42:28 -0700 Subject: [PATCH 11/30] Merge pull request #1691: Table driven test indexes * types: Switch table driven test error messages to new format Make table driven tests in /types follow the format described in #1664 * typos / lower case errors * lower case, not sentences * lower case, not sentences --- types/coin_test.go | 44 ++++++++++++++++----------------- types/rational.go | 2 +- types/rational_test.go | 56 ++++++++++++++++++++++-------------------- types/utils_test.go | 4 +-- 4 files changed, 54 insertions(+), 52 deletions(-) diff --git a/types/coin_test.go b/types/coin_test.go index c7ccc5746c..da52b4849b 100644 --- a/types/coin_test.go +++ b/types/coin_test.go @@ -17,9 +17,9 @@ func TestIsPositiveCoin(t *testing.T) { {NewCoin("a", -1), false}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.IsPositive() - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "%s positivity is incorrect, tc #%d", tc.inputOne.String(), tcIndex) } } @@ -33,9 +33,9 @@ func TestIsNotNegativeCoin(t *testing.T) { {NewCoin("a", -1), false}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.IsNotNegative() - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "%s not-negativity is incorrect, tc #%d", tc.inputOne.String(), tcIndex) } } @@ -52,9 +52,9 @@ func TestSameDenomAsCoin(t *testing.T) { {NewCoin("steak", -11), NewCoin("steak", 10), true}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.SameDenomAs(tc.inputTwo) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "coin denominations didn't match, tc #%d", tcIndex) } } @@ -70,9 +70,9 @@ func TestIsGTECoin(t *testing.T) { {NewCoin("a", 1), NewCoin("b", 1), false}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.IsGTE(tc.inputTwo) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "coin GTE relation is incorrect, tc #%d", tcIndex) } } @@ -89,9 +89,9 @@ func TestIsEqualCoin(t *testing.T) { {NewCoin("steak", -11), NewCoin("steak", 10), false}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.IsEqual(tc.inputTwo) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "coin equality relation is incorrect, tc #%d", tcIndex) } } @@ -106,9 +106,9 @@ func TestPlusCoin(t *testing.T) { {NewCoin("asdf", -4), NewCoin("asdf", 5), NewCoin("asdf", 1)}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.Plus(tc.inputTwo) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "sum of coins is incorrect, tc #%d", tcIndex) } tc := struct { @@ -132,9 +132,9 @@ func TestMinusCoin(t *testing.T) { {NewCoin("asdf", 10), NewCoin("asdf", 1), NewCoin("asdf", 9)}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.Minus(tc.inputTwo) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "difference of coins is incorrect, tc #%d", tcIndex) } tc := struct { @@ -212,10 +212,10 @@ func TestPlusCoins(t *testing.T) { {Coins{{"A", negone}, {"B", zero}}, Coins{{"A", zero}, {"B", zero}}, Coins{{"A", negone}}}, } - for _, tc := range cases { + for tcIndex, tc := range cases { res := tc.inputOne.Plus(tc.inputTwo) assert.True(t, res.IsValid()) - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "sum of coins is incorrect, tc #%d", tcIndex) } } @@ -242,12 +242,12 @@ func TestParse(t *testing.T) { {"5foo-bar", false, nil}, // once more, only letters in coin name } - for _, tc := range cases { + for tcIndex, tc := range cases { res, err := ParseCoins(tc.input) if !tc.valid { - require.NotNil(t, err, "%s: %#v", tc.input, res) + require.NotNil(t, err, "%s: %#v. tc #%d", tc.input, res, tcIndex) } else if assert.Nil(t, err, "%s: %+v", tc.input, err) { - require.Equal(t, tc.expected, res) + require.Equal(t, tc.expected, res, "coin parsing was incorrect, tc #%d", tcIndex) } } @@ -296,10 +296,10 @@ func TestSortCoins(t *testing.T) { {dup, false, false}, } - for _, tc := range cases { - require.Equal(t, tc.before, tc.coins.IsValid()) + for tcIndex, tc := range cases { + require.Equal(t, tc.before, tc.coins.IsValid(), "coin validity is incorrect before sorting, tc #%d", tcIndex) tc.coins.Sort() - require.Equal(t, tc.after, tc.coins.IsValid()) + require.Equal(t, tc.after, tc.coins.IsValid(), "coin validity is incorrect after sorting, tc #%d", tcIndex) } } diff --git a/types/rational.go b/types/rational.go index cb07bf5437..89cc76968a 100644 --- a/types/rational.go +++ b/types/rational.go @@ -234,7 +234,7 @@ func (r *Rat) UnmarshalAmino(text string) (err error) { //___________________________________________________________________________________ // helpers -// test if two rat arrays are the equal +// test if two rat arrays are equal func RatsEqual(r1s, r2s []Rat) bool { if len(r1s) != len(r2s) { return false diff --git a/types/rational_test.go b/types/rational_test.go index ecbc09e881..5ca1ac9c6e 100644 --- a/types/rational_test.go +++ b/types/rational_test.go @@ -48,22 +48,22 @@ func TestNewFromDecimal(t *testing.T) { {"0.foobar.", true, Rat{}}, } - for _, tc := range tests { + for tcIndex, tc := range tests { res, err := NewRatFromDecimal(tc.decimalStr, 4) if tc.expErr { - require.NotNil(t, err, tc.decimalStr) + require.NotNil(t, err, tc.decimalStr, "error expected, tc #%d", tcIndex) } else { - require.Nil(t, err, tc.decimalStr) - require.True(t, res.Equal(tc.exp), tc.decimalStr) + require.Nil(t, err, tc.decimalStr, "unexpected error, tc #%d", tcIndex) + require.True(t, res.Equal(tc.exp), tc.decimalStr, "equality was incorrect, tc #%d", tcIndex) } // negative tc res, err = NewRatFromDecimal("-"+tc.decimalStr, 4) if tc.expErr { - require.NotNil(t, err, tc.decimalStr) + require.NotNil(t, err, tc.decimalStr, "error expected (negative case), tc #%d", tcIndex) } else { - require.Nil(t, err, tc.decimalStr) - require.True(t, res.Equal(tc.exp.Mul(NewRat(-1))), tc.decimalStr) + require.Nil(t, err, tc.decimalStr, "unexpected error (negative case), tc #%d", tcIndex) + require.True(t, res.Equal(tc.exp.Mul(NewRat(-1))), tc.decimalStr, "equality was incorrect (negative case), tc #%d", tcIndex) } } } @@ -99,10 +99,10 @@ func TestEqualities(t *testing.T) { {NewRat(-1, 7), NewRat(-3, 7), true, false, false}, } - for _, tc := range tests { - require.Equal(t, tc.gt, tc.r1.GT(tc.r2)) - require.Equal(t, tc.lt, tc.r1.LT(tc.r2)) - require.Equal(t, tc.eq, tc.r1.Equal(tc.r2)) + for tcIndex, tc := range tests { + require.Equal(t, tc.gt, tc.r1.GT(tc.r2), "GT result is incorrect, tc #%d", tcIndex) + require.Equal(t, tc.lt, tc.r1.LT(tc.r2), "LT result is incorrect, tc #%d", tcIndex) + require.Equal(t, tc.eq, tc.r1.Equal(tc.r2), "equality result is incorrect, tc #%d", tcIndex) } } @@ -135,15 +135,15 @@ func TestArithmetic(t *testing.T) { {NewRat(100), NewRat(1, 7), NewRat(100, 7), NewRat(700), NewRat(701, 7), NewRat(699, 7)}, } - for _, tc := range tests { - require.True(t, tc.resMul.Equal(tc.r1.Mul(tc.r2)), "r1 %v, r2 %v", tc.r1.Rat, tc.r2.Rat) - require.True(t, tc.resAdd.Equal(tc.r1.Add(tc.r2)), "r1 %v, r2 %v", tc.r1.Rat, tc.r2.Rat) - require.True(t, tc.resSub.Equal(tc.r1.Sub(tc.r2)), "r1 %v, r2 %v", tc.r1.Rat, tc.r2.Rat) + for tcIndex, tc := range tests { + require.True(t, tc.resMul.Equal(tc.r1.Mul(tc.r2)), "r1 %v, r2 %v. tc #%d", tc.r1.Rat, tc.r2.Rat, tcIndex) + require.True(t, tc.resAdd.Equal(tc.r1.Add(tc.r2)), "r1 %v, r2 %v. tc #%d", tc.r1.Rat, tc.r2.Rat, tcIndex) + require.True(t, tc.resSub.Equal(tc.r1.Sub(tc.r2)), "r1 %v, r2 %v. tc #%d", tc.r1.Rat, tc.r2.Rat, tcIndex) if tc.r2.Num().IsZero() { // panic for divide by zero require.Panics(t, func() { tc.r1.Quo(tc.r2) }) } else { - require.True(t, tc.resDiv.Equal(tc.r1.Quo(tc.r2)), "r1 %v, r2 %v", tc.r1.Rat, tc.r2.Rat) + require.True(t, tc.resDiv.Equal(tc.r1.Quo(tc.r2)), "r1 %v, r2 %v. tc #%d", tc.r1.Rat, tc.r2.Rat, tcIndex) } } } @@ -168,9 +168,9 @@ func TestEvaluate(t *testing.T) { {NewRat(113, 12), 9}, } - for _, tc := range tests { - require.Equal(t, tc.res, tc.r1.RoundInt64(), "%v", tc.r1) - require.Equal(t, tc.res*-1, tc.r1.Mul(NewRat(-1)).RoundInt64(), "%v", tc.r1.Mul(NewRat(-1))) + for tcIndex, tc := range tests { + require.Equal(t, tc.res, tc.r1.RoundInt64(), "%v. tc #%d", tc.r1, tcIndex) + require.Equal(t, tc.res*-1, tc.r1.Mul(NewRat(-1)).RoundInt64(), "%v. tc #%d", tc.r1.Mul(NewRat(-1)), tcIndex) } } @@ -192,10 +192,10 @@ func TestRound(t *testing.T) { {NewRat(1, 2), NewRat(1, 2), 1000}, } - for _, tc := range tests { - require.Equal(t, tc.res, tc.r.Round(tc.precFactor), "%v", tc.r) + for tcIndex, tc := range tests { + require.Equal(t, tc.res, tc.r.Round(tc.precFactor), "%v", tc.r, "incorrect rounding, tc #%d", tcIndex) negR1, negRes := tc.r.Mul(NewRat(-1)), tc.res.Mul(NewRat(-1)) - require.Equal(t, negRes, negR1.Round(tc.precFactor), "%v", negR1) + require.Equal(t, negRes, negR1.Round(tc.precFactor), "%v", negR1, "incorrect rounding (negative case), tc #%d", tcIndex) } } @@ -211,8 +211,8 @@ func TestToLeftPadded(t *testing.T) { {NewRat(1000, 3), 8, "00000333"}, {NewRat(1000, 3), 12, "000000000333"}, } - for _, tc := range tests { - require.Equal(t, tc.res, tc.rat.ToLeftPadded(tc.digits)) + for tcIndex, tc := range tests { + require.Equal(t, tc.res, tc.rat.ToLeftPadded(tc.digits), "incorrect left padding, tc #%d", tcIndex) } } @@ -296,11 +296,13 @@ func TestRatsEqual(t *testing.T) { {[]Rat{NewRat(1), NewRat(0)}, []Rat{NewRat(1), NewRat(0)}, true}, {[]Rat{NewRat(1), NewRat(0)}, []Rat{NewRat(0), NewRat(1)}, false}, {[]Rat{NewRat(1), NewRat(0)}, []Rat{NewRat(1)}, false}, + {[]Rat{NewRat(1), NewRat(2)}, []Rat{NewRat(2), NewRat(4)}, false}, + {[]Rat{NewRat(3), NewRat(18)}, []Rat{NewRat(1), NewRat(6)}, false}, } - for _, tc := range tests { - require.Equal(t, tc.eq, RatsEqual(tc.r1s, tc.r2s)) - require.Equal(t, tc.eq, RatsEqual(tc.r2s, tc.r1s)) + for tcIndex, tc := range tests { + require.Equal(t, tc.eq, RatsEqual(tc.r1s, tc.r2s), "equality of rational arrays is incorrect, tc #%d", tcIndex) + require.Equal(t, tc.eq, RatsEqual(tc.r2s, tc.r1s), "equality of rational arrays is incorrect (converse), tc #%d", tcIndex) } } diff --git a/types/utils_test.go b/types/utils_test.go index 8c84e2ace2..af22f2db6f 100644 --- a/types/utils_test.go +++ b/types/utils_test.go @@ -29,10 +29,10 @@ func TestSortJSON(t *testing.T) { wantErr: false}, } - for _, tc := range cases { + for tcIndex, tc := range cases { got, err := SortJSON([]byte(tc.unsortedJSON)) if tc.wantErr != (err != nil) { - t.Fatalf("got %t, want: %t, err=%s", err != nil, tc.wantErr, err) + t.Fatalf("got %t, want: %t, tc #%d, err=%s", err != nil, tc.wantErr, tcIndex, err) } require.Equal(t, string(got), tc.want) } From 9f2b83cbe9e1b35b350703366b5e7f5806c5547e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 16 Jul 2018 20:01:54 +0100 Subject: [PATCH 12/30] version bump --- version/version.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/version/version.go b/version/version.go index 0c1574e484..c6361dd506 100644 --- a/version/version.go +++ b/version/version.go @@ -2,10 +2,10 @@ package version const Maj = "0" -const Min = "21" -const Fix = "1" +const Min = "22" +const Fix = "0" -const Version = "0.21.1" +const Version = "0.22.0" // GitCommit set by build flags var GitCommit = "" From 1edfb8942385f5afc701829165ac237dbe49fb14 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Mon, 16 Jul 2018 12:30:54 -0700 Subject: [PATCH 13/30] contribution guide: Add guidelines for testing Indicates to use require's and asserts, and to use table driven tests, with error messages as described in #1664. Closes #1664 --- CONTRIBUTING.md | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 0fcf36def0..c04382391c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -67,6 +67,29 @@ tested by circle using `go test -v -race ./...`. If not, they will need a `circle.yml`. Ideally, every repo has a `Makefile` that defines `make test` and includes its continuous integration status using a badge in the `README.md`. +We expect tests to use `require` or `assert` rather than `t.Skip` or `t.Fail`, +unless there is a reason to do otherwise. +We prefer to use [table driven tests](https://github.com/golang/go/wiki/TableDrivenTests) +where applicable. +Error messages should follow the following format +`, tc #, i #`. +`` is an optional short description of whats failing, `tc` is the +index within the table of the testcase that is failing, and `i` is when there +is a loop, exactly which iteration of the loop failed. +The idea is you should be able to see the +error message and figure out exactly what failed. +Here is an example check: + +``` + +for tcIndex, tc := range cases { + + for i := 0; i < tc.numTxsToTest; i++ { + + require.Equal(t, expectedTx[:32], calculatedTx[:32], + "First 32 bytes of the txs differed. tc #%d, i #%d", tcIndex, i) + ``` + ## Branching Model and Release User-facing repos should adhere to the branching model: http://nvie.com/posts/a-successful-git-branching-model/. From 70cbb78202e5ca6d35ba291b806e4bd6fff846d8 Mon Sep 17 00:00:00 2001 From: Jack Zampolin Date: Fri, 13 Jul 2018 17:03:59 -0700 Subject: [PATCH 14/30] Update testnet doc to reflect gaia-7000 --- cmd/gaia/testnets/README.md | 79 +- cmd/gaia/testnets/gaia-7000/genesis.json | 5680 ++++++++++++++++++++++ 2 files changed, 5704 insertions(+), 55 deletions(-) create mode 100644 cmd/gaia/testnets/gaia-7000/genesis.json diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index 86dc62e74f..be86adce28 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -1,13 +1,13 @@ -# Connect to the `gaia-6002` Testnet +# Connect to the `gaia-7000` Testnet -Note: We are aware this documentation is a work in progress. We are actively +_**NOTE:**_ We are aware this documentation is a work in progress. We are actively working to improve the tooling and the documentation to make this process as painless as possible. In the meantime, join the [Validator Chat](https://riot.im/app/#/room/#cosmos_validators:matrix.org) for technical support, and [open issues](https://github.com/cosmos/cosmos-sdk) if you run into any! Thanks very much for your patience and support. :) ## Setting Up a New Node -These instructions are for setting up a brand new full node from scratch. If you ran a full node on a previous testnet, please skip to [Upgrading From Previous Testnet](#upgrading-from-previous-testnet). +These instructions are for setting up a brand new full node from scratch. If you ran a full node on a previous testnet you will need to start from scratch due to some breaking changes in key format. ### Install Go @@ -29,7 +29,7 @@ Next, let's install the testnet's version of the Cosmos SDK. mkdir -p $GOPATH/src/github.com/cosmos cd $GOPATH/src/github.com/cosmos git clone https://github.com/cosmos/cosmos-sdk -cd cosmos-sdk && git checkout v0.19.0 +cd cosmos-sdk && git checkout v0.22.0 make get_tools && make get_vendor_deps && make install ``` @@ -37,10 +37,10 @@ That will install the `gaiad` and `gaiacli` binaries. Verify that everything is ```bash $ gaiad version -0.19.0-c6711810 +0.22.0 $ gaiacli version -0.19.0-c6711810 +0.22.0 ``` ### Node Setup @@ -48,60 +48,29 @@ $ gaiacli version Create the required configuration files, and initialize the node: ```bash -gaiad init --name +gaiad init --name ``` > *NOTE:* Note that only ASCII characters are supported for the `--name`. Using Unicode renders your node unreachable. -You can also edit this `name` in the `~/.gaiad/config/config.toml` file: +You can also edit this `moniker` in the `~/.gaiad/config/config.toml` file: ```toml # A custom human readable name for this node -moniker = "" +moniker = "" ``` -Your full node has been initialized! Please skip to [Genesis & Seeds](#genesis--seeds). - -## Upgrading From Previous Testnet - -These instructions are for full nodes that have ran on previous testnets and would like to upgrade to the latest testnet. - -### Reset Data - -First, remove the outdated files and reset the data. - -```bash -rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json -gaiad unsafe_reset_all -``` - -Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. If you had any sentry nodes or full nodes setup before, -your node will still try to connect to them, but may fail if they haven't also -been upgraded. - -**WARNING:** Make sure that every node has a unique `priv_validator.json`. Do not copy the `priv_validator.json` from an old node to multiple new nodes. Running two nodes with the same `priv_validator.json` will cause you to double sign. - -### Software Upgrade - -Now it is time to upgrade the software: - -```bash -cd $GOPATH/src/github.com/cosmos/cosmos-sdk -git fetch --all && git checkout v0.19.0 -make update_tools && make get_vendor_deps && make install -``` - -Your full node has been cleanly upgraded! +Your full node has been initialized! ## Genesis & Seeds ### Copy the Genesis File -Copy the testnet's `genesis.json` file and place it in `gaiad`'s config directory. +Fetch the testnet's `genesis.json` file and place it in `gaiad`'s config directory. ```bash mkdir -p $HOME/.gaiad/config -cp -a $GOPATH/src/github.com/cosmos/cosmos-sdk/cmd/gaia/testnets/gaia-6002/genesis.json $HOME/.gaiad/config/genesis.json +curl https://gist.githubusercontent.com/cwgoes/00dfd24c104fc3d704692f04adf4fd35/raw/1d5ee526d22e48ff6717b1b514dca02f8b14a932/gaia-7000-final.json > $HOME/.gaiad/config/genesis.json ``` ### Add Seed Nodes @@ -110,7 +79,7 @@ Your node needs to know how to find peers. You'll need to add healthy seed nodes ```toml # Comma separated list of seed nodes to connect to -seeds = "38aa9bec3998f12ae9088b21a2d910d19d565c27@gaia-6002.coinculture.net:46656,1e124dd15bd9955a7ea844ab003b1b47f0998b70@seed.cosmos.cryptium.ch:46656" +seeds = "718145d422a823fd2a4e1e36e91b92bb0c4ddf8e@gaia-7000.coinculture.net:26656,5922bf29b48a18c2300b85cc53f424fce23927ab@67.207.73.206:26656,7c8b8fd03577cd4817f5be1f03d506f879df98d8@gaia-7000-seed1.interblock.io:26656,a28737ff02391a6e00a1d3b79befd57e68e8264c@gaia-7000-seed2.interblock.io:26656,987ffd26640cd03d08ed7e53b24dfaa7956e612d@gaia-7000-seed3.interblock.io:26656" ``` If those seeds aren't working, you can find more seeds and persistent peers on the [Cosmos Explorer](https://explorecosmos.network/nodes). Open the the `Full Nodes` pane and select nodes that do not have private (`10.x.x.x`) or [local IP addresses](https://en.wikipedia.org/wiki/Private_network). The `Persistent Peer` field contains the connection string. For best results use 4-6. @@ -183,7 +152,7 @@ View the validator pubkey for your node by typing: gaiad tendermint show_validator ``` -**WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. +**WARNING:** We strongly recommend NOT using the same passphrase for multiple keys. The Tendermint team and the Interchain Foundation will not be responsible for the loss of funds. This is not as important on the testnets, but is good security practice and should be followed. ## Fund your account @@ -199,7 +168,7 @@ gaiacli account ## Run a Validator Node -[Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#how-can-validators-protect-themselves-from-denial-of-service-attacks) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). +[Validators](https://cosmos.network/validators) are responsible for committing new blocks to the blockchain through voting. A validator's stake is slashed if they become unavailable, double sign a transaction, or don't cast their votes. If you only want to run a full node, a VM in the cloud is fine. However, if you are want to become a validator for the Hub's `mainnet`, you should research hardened setups. Please read [Sentry Node Architecture](https://forum.cosmos.network/t/sentry-node-architecture-overview/454) to protect your node from DDOS and ensure high-availability. Also see the [technical requirements](https://github.com/cosmos/cosmos/blob/master/VALIDATORS_FAQ.md#technical-requirements)). There's also more info on our [website](https://cosmos.network/validators). ### Create Your Validator @@ -219,7 +188,7 @@ gaiacli stake create-validator \ --pubkey=$(gaiad tendermint show_validator) \ --address-validator= --moniker="choose a moniker" \ - --chain-id=gaia-6002 \ + --chain-id=gaia-7000 \ --from= ``` @@ -236,7 +205,7 @@ gaiacli stake edit-validator --website="https://cosmos.network" \ --keybase-sig="6A0D65E29A4CBC8E" --details="To infinity and beyond!" - --chain-id=gaia-6002 \ + --chain-id=gaia-7000 \ --from= ``` @@ -246,7 +215,7 @@ View the validator's information with this command: ```bash gaiacli stake validator \ --address-validator= \ - --chain-id=gaia-6002 + --chain-id=gaia-7000 ``` Your validator is active if the following command returns anything: @@ -261,7 +230,7 @@ You should also be able to see your validator on the [Explorer](https://explorec ### Problem #1: My validator has `voting_power: 0` -Your validator has become auto-unbonded. In `gaia-6002`, we unbond validators if they do not vote on `50` of the last `100` blocks. Since blocks are proposed every ~2 seconds, a validator unresponsive for ~100 seconds will become unbonded. This usually happens when your `gaiad` process crashes. +Your validator has become auto-unbonded. In `gaia-7000`, we unbond validators if they do not vote on `50` of the last `100` blocks. Since blocks are proposed every ~2 seconds, a validator unresponsive for ~100 seconds will become unbonded. This usually happens when your `gaiad` process crashes. Here's how you can return the voting power back to your validator. First, if `gaiad` is not running, start it up again: @@ -272,7 +241,7 @@ gaiad start Wait for your full node to catch up to the latest block. Next, run the following command. Note that `` is the address of your validator account, and `` is the name of the validator account. You can find this info by running `gaiacli keys list`. ```bash -gaiacli stake unrevoke --chain-id=gaia-6002 --from= +gaiacli stake unrevoke --chain-id=gaia-7000 --from= ``` **WARNING:** If you don't wait for `gaiad` to sync before running `unrevoke`, you will receive an error message telling you your validator is still jailed. @@ -322,7 +291,7 @@ gaiacli stake delegate \ --address-delegator= \ --address-validator= \ --from= \ - --chain-id=gaia-6002 + --chain-id=gaia-7000 ``` While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. @@ -339,7 +308,7 @@ gaiacli stake unbond \ --address-validator= \ --shares=MAX \ --from= \ - --chain-id=gaia-6002 + --chain-id=gaia-7000 ``` You can check your balance and your stake delegation to see that the unbonding went through successfully. @@ -350,7 +319,7 @@ gaiacli account gaiacli stake delegation \ --address-delegator= \ --address-validator= \ - --chain-id=gaia-6002 + --chain-id=gaia-7000 ``` ## Governance @@ -444,7 +413,7 @@ gaiacli gov query-vote \ ```bash gaiacli send \ --amount=10faucetToken \ - --chain-id=gaia-6002 \ + --chain-id=gaia-7000 \ --from= \ --to= ``` diff --git a/cmd/gaia/testnets/gaia-7000/genesis.json b/cmd/gaia/testnets/gaia-7000/genesis.json new file mode 100644 index 0000000000..7ada516d49 --- /dev/null +++ b/cmd/gaia/testnets/gaia-7000/genesis.json @@ -0,0 +1,5680 @@ +{ + "genesis_time": "2018-07-16T19:57:28.971479541Z", + "chain_id": "gaia-7000", + "consensus_params": { + "block_size_params": { + "max_bytes": "22020096", + "max_txs": "10000", + "max_gas": "-1" + }, + "tx_size_params": { + "max_bytes": "10240", + "max_gas": "-1" + }, + "block_gossip_params": { + "block_part_size_bytes": "65536" + }, + "evidence_params": { + "max_age": "100000" + } + }, + "validators": [ + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MRCeBDANSjH6IsxO0z6tRe+xqoZvIGhdfl1t+SXGUpM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tOEqjO2t51PEgO9Tv0B7qM0yPmy1n5tMa3Beg0tp3ns=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "S8s6fdAQNQ3bN9SNVAsHB/j8uv1CM1roxeLesL+fh4g=" + }, + "power": "100", + "name": "validatorluigi001" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "k3YLQYEN2QMP6XITRsBmgb+pNGhJ5Jbg0bzUW977kK0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "EREUrXXl1OJqLQag0P4h6vJ2H+8GEwyNAjgn1XEJU+I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "heNintBalqaJwCOjLb9+mX/cQ1ytMlV7ZroPIlkwZqo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nb2oRB12DlEQkFn7KSjSVkj5rDoSTsuBFa09+gmNJ7o=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "bZSEBDNIOr0xJ/PxaAScJIyG6hqFtryBAMNwghAOTTU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8K3clCjVU33BTIpUhdahGmu++WxHj4NUE9krCRkk++s=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RBuRRNEzA9RA1Wrdi9PPFQJ29/n/bqN9O2tQv9Gq248=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RwPRoiY5C0covekqbr3VrQwxWGHioUUIf2+TOq8LIC0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2qtEBT+Tc+SD2wJsdrVMHXrBKfvesxtmtSKDK5fXwA0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gU5mmVLUSzn/fIEMgiiB4LARRoWlqjUGHr3A4SndWO8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xlO2cnii42KisAn8OcstC/3XV5+I0FlcSbWuyy5MVA8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "q5ezDn4DcWFPWvMayPJI35nXr//jjF8fGHsuiHjpDcU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PSqbJOwglJb1yrj3aWebBpXb2ujXcR037s1Cyj2HoW4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A6GzeXUM3vsXaDAEYMSDgSKkqn9AoUYjs8empH46MGY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "81fx09BivOOxeGL7QisF8aKRZjjcARpiSaCOX9mJfY8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UjTvuOew2EaooduJBiYmBWeF5ai0yFJG8uio5YXpJgg=" + }, + "power": "1", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "y7p9JSVZBnRxjAI9v5Pxl37hMtyuHf6B4Ghqzm6+ii0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oG8Q5o+SN4wqMLvlIfVgQPnsQzNEKeH0D/XGM8JlGrY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PxJbo5FKA6mXtgwclRQVNIjOCQK3Q7WkLQrvM9lYbGI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Q/UShqqVDOUSNYBrR1G/1X1s+YXEVXEJzeXmYvfYIr0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "uEWWDBwFW+/BpTCvNCLW7AP98hndBukzSbrwCb7sooo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MZi48DJZOgRbE0ZStR66omv6Ez1Wkjvf2D/41q6Nd0I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Go9GXHI6SCQo2QKMxkAkgYLhfo3XrVjWLR2nE2AvYyk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P9RgE4RMQT/aHap2oICpwpgKeBAwxPUwuU9zIffKFNM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "1+EkFYvTDmz4WQRbK+kznRHoaZVLludtkDrMuM6h++E=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QEMDwUVoyJT7MNfOYKa25xU+Lnsz/ciH8rFUri4diLI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lUMCRAeu47BsOhNvCQTQJQeB68z0/VaElC9j5gDt9y8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VnAr7ZIjvUXpWmzbkt8skHp0oRNc3V89SfvgaZydwfw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u4GEbsk9IEF56V1am5dRtAWXz4iFQkO03FVL87BZXIM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BaaCxmYHKJ6obIzTCdRtjw1cc8d2mUJcMbLWCjf1aLo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "N3K5kDdfcKJurfaa6s2zfKgtYvz1Pagz7VWi9ZfX8yM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "DsTbM0AgHfhSUKvOGkxudDOY3ojYT6bifhpelqHs8+s=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j9be+ddLChInrFz6/820/uYh4WZBzlp61klyJBDy/ZY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xi7nIgj4PqVXrpKLfJhcyxyVY1d3HRo72sKKPDmuU78=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2p8s/pRBZPjYWKKMlR7AOXypDzDmPo762iXlKpCwtco=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nsofE1FmSr1TiDR0gfnxfMDQ8o2pC+1NE7Oa9ceztSg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WvmTBjsCN4ueGpEdySRwsRC5knBRLfY439/e4mG+YAY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "c0i2uKsYBv8fubnI60lZIWA1y4zw1bFgsq5MmWBHKak=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AJR2ex094A1nJEWQsZYjALWsrSl1/huGZ37z2ZsMrpg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LSDd6ab46sHxwJSrg5YLpsPG2o6EcsZ3rDikpHzMNmI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dnFjFoTM9sP/RjQkXBK1YpYn3v5W+j0+g/OfUHS4xu8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "L0I4JoDfktbDWe0fCDL/nQlBPkF5mNgqamnM5JKJ1Uc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dPpZD53AbAMtW6sK+rTnXYe2GGGoSCNWsCtsmArLiIs=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VakMQSPBEuSC9Nwuv8WWhrZVUmH31bUR4+G6pJhkgE8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KI+kCESWD9cB8se4uxRrFVAI5viyNNUXUyMCc903yQc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8Qu1LFMt7qlZNmYQWrsXUA80aIx0rrFPPXs2s6NBdU8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WRsXnLz3gf8o4lYYeCZjAXgPU1cdmOOYPdy7aY63iIA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "R/3f7VruxWpu+2hiHlVpplTwoOou5kfQI1k/6/9H/y8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cLM/HeUFsXlnYnYod695u6NBDS0trMq8sVRdABnF7uc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Epd2FDKZwDybzT38Z7WB0y2jiLn9/2OLzmY3Zu18l6I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ENAVynNXVpj/IdYx9kCPKaPs4bWSxRIHNlmS9QiDuZQ=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j2w5BFOnZTrPN4SFpmQyfRomnUwbEbz1A+kr3z1icjo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "I2ILaY31gonxYQhlIk4PFUIN+Pk7+9dDTK1C/s+Vcb0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "3wRufybSUsTMnUeQkP74uJNDRKeM8jBLAS64T0BRfpY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2gOiMAdnIdND4cA75E7naQdyyIYDAdcjF3uO6OiEZlU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2S8Y/vnLM3W+MYxNCxcUItIBfdZL/T4A8vRg89n0wLg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UBTju7UZfXLVPPYb1a8gPZ69BeCv2Fho7YVo2EUbxKc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0HqB2x6x5HzeozpHatePECw07x1UcDdSz8kQGNznnA8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "H0SIA/BU6Xj8oT5bQkvLpEITN3CqFLbMeBcQ72NZrAE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xnh8TL3BbIs9VTUenmnx6r2UAHpGCj3G9FV0mzc+mU4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "X62YB48gO2SsWGnjYxH+aGfLQcjnP+T0hnErdWZ859g=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8pfpbIxBBiu88hpxS3CeRpv7kClEjl8SwVgckDNBGlE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UuxXNPImsE5Wp+utGfJywZBHuuGE4RmL0CArc6td82w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Sl3NKLaYEgDaovqTkKVZh2ihRFbSmyVjC63wpv3ecdc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SYjCs2AlY04xdfJGPD+gyO9NZ/zQ0Lfb/TLrjgOLS68=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oI1+4FoeI/knjsjDyCJtgZPaeyKON8tCTcM9QX0BHa8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nts1nu73aBgIdSaYye4coIuE1iBNeCuTZZC8LQ37ac8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NQX4yKpOztKrmgBhGIC5WOALOLOq3LTpbzsN4ZLXGec=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BB4a/Xh5z+dkGCRlF+pSGC3iDOoDrFse/xzQAtmxMF4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ydjx2ea+PVuChrny6X2dluJwyXta+BsNQRsgHXp8fXw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pPGLc4NhNaehdoV2antWuyr0GmBVEG1NhD9NiSRrTi0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VBVHOLnWGptY26J0wqXoZI2Dnu96pccMb08zlsaxPCQ=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "aUViYC2znC55sleHfmsIN9hZ45SbYPbDcYA0gVzglsc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "riYrMXBFLavmf4MU/Ly7emDlciVqfB2/zxJoRsBUlfY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F2wCn9rKafNZsYZwoLGkSQIpr3rk86cjYyuhSjsjRaE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ugb3W6W7WL9Vc4KiSBWIaowBfpqJlzbfBSfrIqZW06A=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gJDxhwAE6GeGCKQeVaNZ5is7+7MFHXtOG0UsnguKdoA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "b9RSkt+WmMxVHQExQH0IMPpnR9zDAaJwz/mv1gtyRVY=" + }, + "power": "100", + "name": "smartpesa" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "569Sb+Wpo8VFqXRi4cQhlOD9kS8uBgmJ2rntY3GLtzY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SNwrT1B+A4g6TY7x0QzVrmVbcbl3cHXzXdD1tFHxLNo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K4kLogLtZxqrYSqRVJfrFm9tUG+Tc3QWXWIewnAgI9w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TwzOJ4GcN+ZTswub4R8488SrKeWXjY/PaqCF5neXJig=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JXW8iTiWG28E05ZFJIKvCOBwI2RrH/BOBL/MluTZ6+I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A3zUdVcpj4H+HRZmRW5xixj4dzMgqD7be9GrdXcjdns=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7RhnD9OAZEJ4SV6V3LOZ1gGWubtX25457wCQq+AYYPI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "66j9af4xDJSblMLS+mFbp7d8TaFGu0FOo+0MwEYm2lE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8DScmobjJQmkN44K2xiZkESM/O9MJK/DqlggnIPLpso=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "4JoJuRfaANhdM1x3AWRo1/Cj9DH3VA+fi1SynzknV+w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cCoFsZzKZ9SQZbHe4NueVObIezP6ts0tRTZ/aN96dig=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Zp4tk/ieqplJF8xMeef9HV8bYpHSY+3hJ2sH7PfCX1I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "jj0Y/Fy8JSJR3g+PHU6Ce0ecYwHGUVJ4bVyR7WwcyLI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "XQDVMXja3kFk5Jb47BsqJmzcDsM4lE9+r+f/J3O5Jms=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oL/QCr7LEOivyTqpGrmwVd1r+hYI2WB5+kSVzpDMxx4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "eeImG09hOPo1W7j7lKepN/Lx6I9GGHqVBVEKmznxACc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Abws3eXrUFAH8LeZJIcECakPL945TTmFsBlXONOUeII=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PEg/D54SoiKZ+pic0Z0RzZa/vfYNAAf4kzSc5UKXDYk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "omAzuJps8KX3/iOC1LjwkMPMH3c6tjfLXwCNWXRBdWw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nctikQSpoLRl5kV6KarIS761QvEOZCWw6nvc48xWhic=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NrTRAbZnBqJpW9lRW6LxXxE7EV++y7WiIRV0ifRLovA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "W0rP8sv4Ae/LZOqlBA9evvYARDt79WpFaI26jw/9Tfk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JdfJDlE46456GWp+AkSZhzlkUQI41f8aX7611oiWUSc=" + }, + "power": "100", + "name": "" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "cosmosaccaddr1c2dkaym4teqw6jl9jkq8eu8nf4wzn2lgf4ydyt", + "coins": [ + { + "denom": "faucetToken", + "amount": "1000000" + }, + { + "denom": "steak", + "amount": "10000000" + } + ] + }, + { + "address": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "coins": [ + { + "denom": "jlandrewsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "coins": [ + { + "denom": "jackToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "coins": [ + { + "denom": "luigi001Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "coins": [ + { + "denom": "irisToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "coins": [ + { + "denom": "irisToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "coins": [ + { + "denom": "TropicalMongoXToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "coins": [ + { + "denom": "wingmanToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "coins": [ + { + "denom": "Nemea7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "coins": [ + { + "denom": "infinite-castingToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "coins": [ + { + "denom": "cwgoesToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "coins": [ + { + "denom": "lunamintToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "coins": [ + { + "denom": "skoed-validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "coins": [ + { + "denom": "starfishToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "coins": [ + { + "denom": "jjangg96Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "coins": [ + { + "denom": "iaspirationiToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "coins": [ + { + "denom": "21e800Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "coins": [ + { + "denom": "spptest1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "coins": [ + { + "denom": "windmillToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "coins": [ + { + "denom": "pbostrom/Mythos-1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "coins": [ + { + "denom": "BarytToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "coins": [ + { + "denom": "P2P.ORG ValidatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "coins": [ + { + "denom": "oleary-labsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "coins": [ + { + "denom": "wancloudsentryToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "coins": [ + { + "denom": "space4Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "coins": [ + { + "denom": "colony-finderToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "coins": [ + { + "denom": "sparkpool-validator-02Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "coins": [ + { + "denom": "mining-shipToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "coins": [ + { + "denom": "StakedToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "coins": [ + { + "denom": "nyliraToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "coins": [ + { + "denom": "liangpingToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "coins": [ + { + "denom": "SVNode01Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "coins": [ + { + "denom": "vhxnode1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "coins": [ + { + "denom": "gregToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "coins": [ + { + "denom": "bucksterToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "coins": [ + { + "denom": "grass-fedToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "coins": [ + { + "denom": "ATEAM1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "coins": [ + { + "denom": "BFF-Validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "coins": [ + { + "denom": "redbricks7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "coins": [ + { + "denom": "kittyfishToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "coins": [ + { + "denom": "ForboleToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "coins": [ + { + "denom": "coinoneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "coins": [ + { + "denom": "bmen-companyToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "coins": [ + { + "denom": "2400bpsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "coins": [ + { + "denom": "devToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "coins": [ + { + "denom": "w1m3lToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "coins": [ + { + "denom": "aetherToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "coins": [ + { + "denom": "JColToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "coins": [ + { + "denom": "SaiKrishnaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "coins": [ + { + "denom": "UmbrellaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "coins": [ + { + "denom": "@MarceldeveloperToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "coins": [ + { + "denom": "stereo-watcherToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "coins": [ + { + "denom": "cosmosToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "coins": [ + { + "denom": "stake.zoneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "coins": [ + { + "denom": "firstblock.ioToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "coins": [ + { + "denom": "shensiToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "coins": [ + { + "denom": "figmentToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "coins": [ + { + "denom": "iqlusionToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "coins": [ + { + "denom": "cosmosthecatToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "coins": [ + { + "denom": "snaticoToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "coins": [ + { + "denom": "mpaxeNodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "coins": [ + { + "denom": "joltz-secureware.ioToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "coins": [ + { + "denom": "mwnode1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "coins": [ + { + "denom": "VNode01Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "coins": [ + { + "denom": "7768Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "coins": [ + { + "denom": "block3.communityToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "coins": [ + { + "denom": "4455Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "coins": [ + { + "denom": "dooroomeeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "coins": [ + { + "denom": "sheiudToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "coins": [ + { + "denom": "Staking Facilities ValidatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "coins": [ + { + "denom": "ritter-rammToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "coins": [ + { + "denom": "meteor-discoverToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "coins": [ + { + "denom": "COSMODROMEToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "coins": [ + { + "denom": "broadleaf7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "coins": [ + { + "denom": "ravenclubToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "coins": [ + { + "denom": "dokia-capitalToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "coins": [ + { + "denom": "chainflow08Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "coins": [ + { + "denom": "MiaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "coins": [ + { + "denom": "sikka.techToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "coins": [ + { + "denom": "certus.oneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "coins": [ + { + "denom": "Gold2Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "coins": [ + { + "denom": "idoor7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "coins": [ + { + "denom": "ironforkToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "coins": [ + { + "denom": "sunny-mintorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "coins": [ + { + "denom": "BlissDynamicsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "coins": [ + { + "denom": "smartpesaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "coins": [ + { + "denom": "ianstreamToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "coins": [ + { + "denom": "TruNodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "coins": [ + { + "denom": "abcinToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "coins": [ + { + "denom": "kochacolajToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "coins": [ + { + "denom": "D2R-validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "coins": [ + { + "denom": "juelianshanaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "coins": [ + { + "denom": "lambda-mixerToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "coins": [ + { + "denom": "bkcmToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "coins": [ + { + "denom": "ramihanToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "coins": [ + { + "denom": "davinchcodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "coins": [ + { + "denom": "DoriToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "coins": [ + { + "denom": "daefreecaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "coins": [ + { + "denom": "nuevaxToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "coins": [ + { + "denom": "inschain_validatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "coins": [ + { + "denom": "gruberxToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "coins": [ + { + "denom": "meleatrustToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "coins": [ + { + "denom": "Cosmodator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "coins": [ + { + "denom": "bharvestToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "coins": [ + { + "denom": "cryptiumToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "coins": [ + { + "denom": "finalityToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "coins": [ + { + "denom": "coscloudToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "coins": [ + { + "denom": "xiaochinaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "coins": [ + { + "denom": "gazua1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + } + ], + "stake": { + "pool": { + "loose_tokens": "16200", + "bonded_tokens": "0", + "inflation_last_time": "0", + "inflation": "7/100", + "date_last_commission_reset": "0", + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "unbonding_time": "86400", + "max_validators": 100, + "bond_denom": "steak" + }, + "validators": [ + { + "owner": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MRCeBDANSjH6IsxO0z6tRe+xqoZvIGhdfl1t+SXGUpM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jlandrews", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tOEqjO2t51PEgO9Tv0B7qM0yPmy1n5tMa3Beg0tp3ns=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jack", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "S8s6fdAQNQ3bN9SNVAsHB/j8uv1CM1roxeLesL+fh4g=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "luigi001", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iris", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iris", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "k3YLQYEN2QMP6XITRsBmgb+pNGhJ5Jbg0bzUW977kK0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "TropicalMongoX", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "EREUrXXl1OJqLQag0P4h6vJ2H+8GEwyNAjgn1XEJU+I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "wingman", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "heNintBalqaJwCOjLb9+mX/cQ1ytMlV7ZroPIlkwZqo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Nemea7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nb2oRB12DlEQkFn7KSjSVkj5rDoSTsuBFa09+gmNJ7o=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "infinite-casting", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "bZSEBDNIOr0xJ/PxaAScJIyG6hqFtryBAMNwghAOTTU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8K3clCjVU33BTIpUhdahGmu++WxHj4NUE9krCRkk++s=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "lunamint", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RBuRRNEzA9RA1Wrdi9PPFQJ29/n/bqN9O2tQv9Gq248=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "skoed-validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RwPRoiY5C0covekqbr3VrQwxWGHioUUIf2+TOq8LIC0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "starfish", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2qtEBT+Tc+SD2wJsdrVMHXrBKfvesxtmtSKDK5fXwA0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jjangg96", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gU5mmVLUSzn/fIEMgiiB4LARRoWlqjUGHr3A4SndWO8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iaspirationi", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xlO2cnii42KisAn8OcstC/3XV5+I0FlcSbWuyy5MVA8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "21e800", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "q5ezDn4DcWFPWvMayPJI35nXr//jjF8fGHsuiHjpDcU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "spptest1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PSqbJOwglJb1yrj3aWebBpXb2ujXcR037s1Cyj2HoW4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "windmill", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A6GzeXUM3vsXaDAEYMSDgSKkqn9AoUYjs8empH46MGY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "pbostrom/Mythos-1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "81fx09BivOOxeGL7QisF8aKRZjjcARpiSaCOX9mJfY8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Baryt", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UjTvuOew2EaooduJBiYmBWeF5ai0yFJG8uio5YXpJgg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "P2P.ORG Validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "y7p9JSVZBnRxjAI9v5Pxl37hMtyuHf6B4Ghqzm6+ii0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "oleary-labs", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oG8Q5o+SN4wqMLvlIfVgQPnsQzNEKeH0D/XGM8JlGrY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "wancloudsentry", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PxJbo5FKA6mXtgwclRQVNIjOCQK3Q7WkLQrvM9lYbGI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "space4", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Q/UShqqVDOUSNYBrR1G/1X1s+YXEVXEJzeXmYvfYIr0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "colony-finder", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "uEWWDBwFW+/BpTCvNCLW7AP98hndBukzSbrwCb7sooo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sparkpool-validator-02", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MZi48DJZOgRbE0ZStR66omv6Ez1Wkjvf2D/41q6Nd0I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mining-ship", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Go9GXHI6SCQo2QKMxkAkgYLhfo3XrVjWLR2nE2AvYyk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Staked", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P9RgE4RMQT/aHap2oICpwpgKeBAwxPUwuU9zIffKFNM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "1+EkFYvTDmz4WQRbK+kznRHoaZVLludtkDrMuM6h++E=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "liangping", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QEMDwUVoyJT7MNfOYKa25xU+Lnsz/ciH8rFUri4diLI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "SVNode01", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lUMCRAeu47BsOhNvCQTQJQeB68z0/VaElC9j5gDt9y8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "vhxnode1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VnAr7ZIjvUXpWmzbkt8skHp0oRNc3V89SfvgaZydwfw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "greg", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u4GEbsk9IEF56V1am5dRtAWXz4iFQkO03FVL87BZXIM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "buckster", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BaaCxmYHKJ6obIzTCdRtjw1cc8d2mUJcMbLWCjf1aLo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "grass-fed", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "N3K5kDdfcKJurfaa6s2zfKgtYvz1Pagz7VWi9ZfX8yM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "DsTbM0AgHfhSUKvOGkxudDOY3ojYT6bifhpelqHs8+s=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "BFF-Validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j9be+ddLChInrFz6/820/uYh4WZBzlp61klyJBDy/ZY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "redbricks7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xi7nIgj4PqVXrpKLfJhcyxyVY1d3HRo72sKKPDmuU78=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "kittyfish", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2p8s/pRBZPjYWKKMlR7AOXypDzDmPo762iXlKpCwtco=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Forbole", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nsofE1FmSr1TiDR0gfnxfMDQ8o2pC+1NE7Oa9ceztSg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "coinone", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WvmTBjsCN4ueGpEdySRwsRC5knBRLfY439/e4mG+YAY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bmen-company", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "c0i2uKsYBv8fubnI60lZIWA1y4zw1bFgsq5MmWBHKak=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "2400bps", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AJR2ex094A1nJEWQsZYjALWsrSl1/huGZ37z2ZsMrpg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dev", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LSDd6ab46sHxwJSrg5YLpsPG2o6EcsZ3rDikpHzMNmI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "w1m3l", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dnFjFoTM9sP/RjQkXBK1YpYn3v5W+j0+g/OfUHS4xu8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "aether", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "L0I4JoDfktbDWe0fCDL/nQlBPkF5mNgqamnM5JKJ1Uc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "JCol", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dPpZD53AbAMtW6sK+rTnXYe2GGGoSCNWsCtsmArLiIs=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "SaiKrishna", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VakMQSPBEuSC9Nwuv8WWhrZVUmH31bUR4+G6pJhkgE8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Umbrella", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KI+kCESWD9cB8se4uxRrFVAI5viyNNUXUyMCc903yQc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "@Marceldeveloper", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8Qu1LFMt7qlZNmYQWrsXUA80aIx0rrFPPXs2s6NBdU8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "stereo-watcher", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WRsXnLz3gf8o4lYYeCZjAXgPU1cdmOOYPdy7aY63iIA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cosmos", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "R/3f7VruxWpu+2hiHlVpplTwoOou5kfQI1k/6/9H/y8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "stake.zone", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "firstblock.io", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cLM/HeUFsXlnYnYod695u6NBDS0trMq8sVRdABnF7uc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "shensi", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Epd2FDKZwDybzT38Z7WB0y2jiLn9/2OLzmY3Zu18l6I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "figment", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ENAVynNXVpj/IdYx9kCPKaPs4bWSxRIHNlmS9QiDuZQ=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iqlusion", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j2w5BFOnZTrPN4SFpmQyfRomnUwbEbz1A+kr3z1icjo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cosmosthecat", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "I2ILaY31gonxYQhlIk4PFUIN+Pk7+9dDTK1C/s+Vcb0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "snatico", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "3wRufybSUsTMnUeQkP74uJNDRKeM8jBLAS64T0BRfpY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mpaxeNode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2gOiMAdnIdND4cA75E7naQdyyIYDAdcjF3uO6OiEZlU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "joltz-secureware.io", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2S8Y/vnLM3W+MYxNCxcUItIBfdZL/T4A8vRg89n0wLg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mwnode1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "VNode01", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UBTju7UZfXLVPPYb1a8gPZ69BeCv2Fho7YVo2EUbxKc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "7768", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0HqB2x6x5HzeozpHatePECw07x1UcDdSz8kQGNznnA8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "block3.community", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "H0SIA/BU6Xj8oT5bQkvLpEITN3CqFLbMeBcQ72NZrAE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "4455", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xnh8TL3BbIs9VTUenmnx6r2UAHpGCj3G9FV0mzc+mU4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dooroomee", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "X62YB48gO2SsWGnjYxH+aGfLQcjnP+T0hnErdWZ859g=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sheiud", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8pfpbIxBBiu88hpxS3CeRpv7kClEjl8SwVgckDNBGlE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Staking Facilities Validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UuxXNPImsE5Wp+utGfJywZBHuuGE4RmL0CArc6td82w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ritter-ramm", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Sl3NKLaYEgDaovqTkKVZh2ihRFbSmyVjC63wpv3ecdc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "meteor-discover", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SYjCs2AlY04xdfJGPD+gyO9NZ/zQ0Lfb/TLrjgOLS68=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "COSMODROME", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oI1+4FoeI/knjsjDyCJtgZPaeyKON8tCTcM9QX0BHa8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "broadleaf7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nts1nu73aBgIdSaYye4coIuE1iBNeCuTZZC8LQ37ac8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ravenclub", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NQX4yKpOztKrmgBhGIC5WOALOLOq3LTpbzsN4ZLXGec=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dokia-capital", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BB4a/Xh5z+dkGCRlF+pSGC3iDOoDrFse/xzQAtmxMF4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "chainflow08", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ydjx2ea+PVuChrny6X2dluJwyXta+BsNQRsgHXp8fXw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Mia", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pPGLc4NhNaehdoV2antWuyr0GmBVEG1NhD9NiSRrTi0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sikka.tech", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VBVHOLnWGptY26J0wqXoZI2Dnu96pccMb08zlsaxPCQ=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "certus.one", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "aUViYC2znC55sleHfmsIN9hZ45SbYPbDcYA0gVzglsc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Gold2", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "riYrMXBFLavmf4MU/Ly7emDlciVqfB2/zxJoRsBUlfY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "idoor7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F2wCn9rKafNZsYZwoLGkSQIpr3rk86cjYyuhSjsjRaE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ironfork", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ugb3W6W7WL9Vc4KiSBWIaowBfpqJlzbfBSfrIqZW06A=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sunny-mintor", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gJDxhwAE6GeGCKQeVaNZ5is7+7MFHXtOG0UsnguKdoA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "BlissDynamics", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "b9RSkt+WmMxVHQExQH0IMPpnR9zDAaJwz/mv1gtyRVY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "smartpesa", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "569Sb+Wpo8VFqXRi4cQhlOD9kS8uBgmJ2rntY3GLtzY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ianstream", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SNwrT1B+A4g6TY7x0QzVrmVbcbl3cHXzXdD1tFHxLNo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "TruNode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K4kLogLtZxqrYSqRVJfrFm9tUG+Tc3QWXWIewnAgI9w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "abcin", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TwzOJ4GcN+ZTswub4R8488SrKeWXjY/PaqCF5neXJig=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "kochacolaj", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JXW8iTiWG28E05ZFJIKvCOBwI2RrH/BOBL/MluTZ6+I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "D2R-validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A3zUdVcpj4H+HRZmRW5xixj4dzMgqD7be9GrdXcjdns=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "juelianshana", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7RhnD9OAZEJ4SV6V3LOZ1gGWubtX25457wCQq+AYYPI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "lambda-mixer", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "66j9af4xDJSblMLS+mFbp7d8TaFGu0FOo+0MwEYm2lE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bkcm", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8DScmobjJQmkN44K2xiZkESM/O9MJK/DqlggnIPLpso=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ramihan", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "4JoJuRfaANhdM1x3AWRo1/Cj9DH3VA+fi1SynzknV+w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "davinchcode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cCoFsZzKZ9SQZbHe4NueVObIezP6ts0tRTZ/aN96dig=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Dori", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Zp4tk/ieqplJF8xMeef9HV8bYpHSY+3hJ2sH7PfCX1I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "daefreeca", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "jj0Y/Fy8JSJR3g+PHU6Ce0ecYwHGUVJ4bVyR7WwcyLI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "XQDVMXja3kFk5Jb47BsqJmzcDsM4lE9+r+f/J3O5Jms=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "inschain_validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oL/QCr7LEOivyTqpGrmwVd1r+hYI2WB5+kSVzpDMxx4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "gruberx", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "eeImG09hOPo1W7j7lKepN/Lx6I9GGHqVBVEKmznxACc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "meleatrust", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Abws3eXrUFAH8LeZJIcECakPL945TTmFsBlXONOUeII=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Cosmodator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PEg/D54SoiKZ+pic0Z0RzZa/vfYNAAf4kzSc5UKXDYk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bharvest", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "omAzuJps8KX3/iOC1LjwkMPMH3c6tjfLXwCNWXRBdWw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nctikQSpoLRl5kV6KarIS761QvEOZCWw6nvc48xWhic=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "finality", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NrTRAbZnBqJpW9lRW6LxXxE7EV++y7WiIRV0ifRLovA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "coscloud", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "W0rP8sv4Ae/LZOqlBA9evvYARDt79WpFaI26jw/9Tfk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "xiaochina", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JdfJDlE46456GWp+AkSZhzlkUQI41f8aX7611oiWUSc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "gazua1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + } + ], + "bonds": [ + { + "delegator_addr": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "validator_addr": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "validator_addr": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "validator_addr": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "validator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "validator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "validator_addr": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "validator_addr": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "validator_addr": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "validator_addr": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "validator_addr": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "validator_addr": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "validator_addr": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "validator_addr": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "validator_addr": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "validator_addr": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "validator_addr": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "validator_addr": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "validator_addr": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "validator_addr": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "validator_addr": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "validator_addr": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "validator_addr": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "validator_addr": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "validator_addr": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "validator_addr": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "validator_addr": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "validator_addr": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "validator_addr": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "validator_addr": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "validator_addr": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "validator_addr": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "validator_addr": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "validator_addr": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "validator_addr": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "validator_addr": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "validator_addr": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "validator_addr": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "validator_addr": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "validator_addr": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "validator_addr": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "validator_addr": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "validator_addr": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "validator_addr": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "validator_addr": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "validator_addr": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "validator_addr": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "validator_addr": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "validator_addr": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "validator_addr": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "validator_addr": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "validator_addr": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "validator_addr": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "validator_addr": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "validator_addr": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "validator_addr": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "validator_addr": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "validator_addr": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "validator_addr": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "validator_addr": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "validator_addr": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "validator_addr": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "validator_addr": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "validator_addr": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "validator_addr": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "validator_addr": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "validator_addr": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "validator_addr": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "validator_addr": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "validator_addr": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "validator_addr": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "validator_addr": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "validator_addr": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "validator_addr": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "validator_addr": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "validator_addr": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "validator_addr": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "validator_addr": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "validator_addr": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "validator_addr": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "validator_addr": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "validator_addr": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "validator_addr": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "validator_addr": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "validator_addr": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "validator_addr": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "validator_addr": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "validator_addr": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "validator_addr": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "validator_addr": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "validator_addr": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "validator_addr": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "validator_addr": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "validator_addr": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "validator_addr": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "validator_addr": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "validator_addr": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "validator_addr": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "validator_addr": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "validator_addr": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "validator_addr": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "validator_addr": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "validator_addr": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "validator_addr": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "validator_addr": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "validator_addr": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "validator_addr": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "validator_addr": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "validator_addr": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "shares": "100", + "height": "0" + } + ] + } + } +} \ No newline at end of file From 5c8791743411cac58c502f3b18bfe8a1970e830e Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Mon, 16 Jul 2018 23:00:06 +0100 Subject: [PATCH 15/30] gaia/status: gaia-7000 is up --- cmd/gaia/testnets/STATUS.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 00f7a58607..a4561e104c 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,9 @@ # TESTNET STATUS +## *July 16, 2018, 17:00 EST* - New Testnet Gaia-7000 + +- Gaia-7000 is up! + ## *July 2, 2018, 1:00 EST* - Gaia-6002 slashing failure - Gaia-6002 has been halted due to a slashing issue. From 2b72e3377a4177ed3d1153c0a4ff4120f2ac12c0 Mon Sep 17 00:00:00 2001 From: ValarDragon Date: Mon, 16 Jul 2018 17:24:07 -0700 Subject: [PATCH 16/30] Clarify when to use table driven tests --- CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c04382391c..b18ef2ea95 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -69,9 +69,9 @@ includes its continuous integration status using a badge in the `README.md`. We expect tests to use `require` or `assert` rather than `t.Skip` or `t.Fail`, unless there is a reason to do otherwise. -We prefer to use [table driven tests](https://github.com/golang/go/wiki/TableDrivenTests) -where applicable. -Error messages should follow the following format +When testing a function under a variety of different inputs, we prefer to use +[table driven tests](https://github.com/golang/go/wiki/TableDrivenTests). +Table driven test error messages should follow the following format `, tc #, i #`. `` is an optional short description of whats failing, `tc` is the index within the table of the testcase that is failing, and `i` is when there From d753cf49dfca21edf972bb6fb65ab64143cdc745 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 17 Jul 2018 07:52:12 +0100 Subject: [PATCH 17/30] gaia/status: gaia-7000 making blocks --- cmd/gaia/testnets/STATUS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index a4561e104c..b823466acc 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,8 +1,13 @@ # TESTNET STATUS +## *July 17, 2018, 2:40 EST* - Gaia-7000 is making blocks! + +- Gaia-7000 is live and making blocks! + ## *July 16, 2018, 17:00 EST* - New Testnet Gaia-7000 - Gaia-7000 is up! +- 108 validators in the genesis.json file. ## *July 2, 2018, 1:00 EST* - Gaia-6002 slashing failure From fb24d66bf7f4388264d8073bb10351293710d9ef Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 17 Jul 2018 08:21:27 +0100 Subject: [PATCH 18/30] gaia/status: gaia-7000 consensus failure --- cmd/gaia/testnets/STATUS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index b823466acc..8f624d8507 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,10 @@ # TESTNET STATUS +## *July 17, 2018, 3:00 EST* - Gaia-7000 consensus failure + +- Misconfiguration in the genesis file led to a consensus failure +- New genesis file for gaia-7001 will be up soon + ## *July 17, 2018, 2:40 EST* - Gaia-7000 is making blocks! - Gaia-7000 is live and making blocks! From 01e8749a7883fb814456dc717e270775e0c182c9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 17 Jul 2018 09:07:25 +0100 Subject: [PATCH 19/30] gaia-7001 --- cmd/gaia/testnets/README.md | 32 +- cmd/gaia/testnets/STATUS.md | 5 + cmd/gaia/testnets/gaia-7001/genesis.json | 5628 ++++++++++++++++++++++ 3 files changed, 5649 insertions(+), 16 deletions(-) create mode 100644 cmd/gaia/testnets/gaia-7001/genesis.json diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index be86adce28..d5569add5b 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -1,4 +1,4 @@ -# Connect to the `gaia-7000` Testnet +# Connect to the `gaia-7001` Testnet _**NOTE:**_ We are aware this documentation is a work in progress. We are actively working to improve the tooling and the documentation to make this process as painless as @@ -70,7 +70,7 @@ Fetch the testnet's `genesis.json` file and place it in `gaiad`'s config directo ```bash mkdir -p $HOME/.gaiad/config -curl https://gist.githubusercontent.com/cwgoes/00dfd24c104fc3d704692f04adf4fd35/raw/1d5ee526d22e48ff6717b1b514dca02f8b14a932/gaia-7000-final.json > $HOME/.gaiad/config/genesis.json +curl https://gist.githubusercontent.com/cwgoes/311da6ba05be6e113185a716538a44c3/raw/7b6e784cf29761b5781488006313bd69d164aa6c/chris-final.json > $HOME/.gaiad/config/genesis.json ``` ### Add Seed Nodes @@ -188,7 +188,7 @@ gaiacli stake create-validator \ --pubkey=$(gaiad tendermint show_validator) \ --address-validator= --moniker="choose a moniker" \ - --chain-id=gaia-7000 \ + --chain-id=gaia-7001 \ --from= ``` @@ -205,7 +205,7 @@ gaiacli stake edit-validator --website="https://cosmos.network" \ --keybase-sig="6A0D65E29A4CBC8E" --details="To infinity and beyond!" - --chain-id=gaia-7000 \ + --chain-id=gaia-7001 \ --from= ``` @@ -215,7 +215,7 @@ View the validator's information with this command: ```bash gaiacli stake validator \ --address-validator= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` Your validator is active if the following command returns anything: @@ -230,7 +230,7 @@ You should also be able to see your validator on the [Explorer](https://explorec ### Problem #1: My validator has `voting_power: 0` -Your validator has become auto-unbonded. In `gaia-7000`, we unbond validators if they do not vote on `50` of the last `100` blocks. Since blocks are proposed every ~2 seconds, a validator unresponsive for ~100 seconds will become unbonded. This usually happens when your `gaiad` process crashes. +Your validator has become auto-unbonded. In `gaia-7001`, we unbond validators if they do not vote on `50` of the last `100` blocks. Since blocks are proposed every ~2 seconds, a validator unresponsive for ~100 seconds will become unbonded. This usually happens when your `gaiad` process crashes. Here's how you can return the voting power back to your validator. First, if `gaiad` is not running, start it up again: @@ -241,7 +241,7 @@ gaiad start Wait for your full node to catch up to the latest block. Next, run the following command. Note that `` is the address of your validator account, and `` is the name of the validator account. You can find this info by running `gaiacli keys list`. ```bash -gaiacli stake unrevoke --chain-id=gaia-7000 --from= +gaiacli stake unrevoke --chain-id=gaia-7001 --from= ``` **WARNING:** If you don't wait for `gaiad` to sync before running `unrevoke`, you will receive an error message telling you your validator is still jailed. @@ -291,7 +291,7 @@ gaiacli stake delegate \ --address-delegator= \ --address-validator= \ --from= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. @@ -308,7 +308,7 @@ gaiacli stake unbond \ --address-validator= \ --shares=MAX \ --from= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` You can check your balance and your stake delegation to see that the unbonding went through successfully. @@ -319,7 +319,7 @@ gaiacli account gaiacli stake delegation \ --address-delegator= \ --address-validator= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` ## Governance @@ -353,7 +353,7 @@ gaiacli gov submit-proposal \ --proposer= \ --deposit=<40steak> \ --from= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` @@ -367,7 +367,7 @@ gaiacli gov deposit \ --depositer= \ --deposit=<200steak> \ --from= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` > _NOTE_: Proposals that don't meet this requirement will be deleted after `MaxDepositPeriod` is reached. @@ -379,7 +379,7 @@ Once created, you can now query information of the proposal: ```bash gaiacli gov query-proposal \ --proposalID= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` ### Vote on a proposal @@ -392,7 +392,7 @@ gaiacli gov vote \ --voter= \ --option= \ --from= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` #### Query vote @@ -403,7 +403,7 @@ Check the vote with the option you just submitted: gaiacli gov query-vote \ --proposalID= \ --voter= \ - --chain-id=gaia-7000 + --chain-id=gaia-7001 ``` ## Other Operations @@ -413,7 +413,7 @@ gaiacli gov query-vote \ ```bash gaiacli send \ --amount=10faucetToken \ - --chain-id=gaia-7000 \ + --chain-id=gaia-7001 \ --from= \ --to= ``` diff --git a/cmd/gaia/testnets/STATUS.md b/cmd/gaia/testnets/STATUS.md index 8f624d8507..185df94c60 100644 --- a/cmd/gaia/testnets/STATUS.md +++ b/cmd/gaia/testnets/STATUS.md @@ -1,5 +1,10 @@ # TESTNET STATUS +## *July 17, 2018, 4:00 EST* - New Testnet Gaia-7001 + +- New testnet with fixes for the genesis file +- Increased max validators to 128 + ## *July 17, 2018, 3:00 EST* - Gaia-7000 consensus failure - Misconfiguration in the genesis file led to a consensus failure diff --git a/cmd/gaia/testnets/gaia-7001/genesis.json b/cmd/gaia/testnets/gaia-7001/genesis.json new file mode 100644 index 0000000000..48db5a4edc --- /dev/null +++ b/cmd/gaia/testnets/gaia-7001/genesis.json @@ -0,0 +1,5628 @@ +{ + "genesis_time": "2018-07-17T07:19:26.795692941Z", + "chain_id": "gaia-7001", + "consensus_params": { + "block_size_params": { + "max_bytes": "22020096", + "max_txs": "10000", + "max_gas": "-1" + }, + "tx_size_params": { + "max_bytes": "10240", + "max_gas": "-1" + }, + "block_gossip_params": { + "block_part_size_bytes": "65536" + }, + "evidence_params": { + "max_age": "100000" + } + }, + "validators": [ + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MRCeBDANSjH6IsxO0z6tRe+xqoZvIGhdfl1t+SXGUpM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tOEqjO2t51PEgO9Tv0B7qM0yPmy1n5tMa3Beg0tp3ns=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "S8s6fdAQNQ3bN9SNVAsHB/j8uv1CM1roxeLesL+fh4g=" + }, + "power": "100", + "name": "validatorluigi001" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "k3YLQYEN2QMP6XITRsBmgb+pNGhJ5Jbg0bzUW977kK0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "EREUrXXl1OJqLQag0P4h6vJ2H+8GEwyNAjgn1XEJU+I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "heNintBalqaJwCOjLb9+mX/cQ1ytMlV7ZroPIlkwZqo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nb2oRB12DlEQkFn7KSjSVkj5rDoSTsuBFa09+gmNJ7o=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "bZSEBDNIOr0xJ/PxaAScJIyG6hqFtryBAMNwghAOTTU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8K3clCjVU33BTIpUhdahGmu++WxHj4NUE9krCRkk++s=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RBuRRNEzA9RA1Wrdi9PPFQJ29/n/bqN9O2tQv9Gq248=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RwPRoiY5C0covekqbr3VrQwxWGHioUUIf2+TOq8LIC0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2qtEBT+Tc+SD2wJsdrVMHXrBKfvesxtmtSKDK5fXwA0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gU5mmVLUSzn/fIEMgiiB4LARRoWlqjUGHr3A4SndWO8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xlO2cnii42KisAn8OcstC/3XV5+I0FlcSbWuyy5MVA8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "q5ezDn4DcWFPWvMayPJI35nXr//jjF8fGHsuiHjpDcU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PSqbJOwglJb1yrj3aWebBpXb2ujXcR037s1Cyj2HoW4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A6GzeXUM3vsXaDAEYMSDgSKkqn9AoUYjs8empH46MGY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "81fx09BivOOxeGL7QisF8aKRZjjcARpiSaCOX9mJfY8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UjTvuOew2EaooduJBiYmBWeF5ai0yFJG8uio5YXpJgg=" + }, + "power": "1", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "y7p9JSVZBnRxjAI9v5Pxl37hMtyuHf6B4Ghqzm6+ii0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oG8Q5o+SN4wqMLvlIfVgQPnsQzNEKeH0D/XGM8JlGrY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PxJbo5FKA6mXtgwclRQVNIjOCQK3Q7WkLQrvM9lYbGI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Q/UShqqVDOUSNYBrR1G/1X1s+YXEVXEJzeXmYvfYIr0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "uEWWDBwFW+/BpTCvNCLW7AP98hndBukzSbrwCb7sooo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MZi48DJZOgRbE0ZStR66omv6Ez1Wkjvf2D/41q6Nd0I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Go9GXHI6SCQo2QKMxkAkgYLhfo3XrVjWLR2nE2AvYyk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P9RgE4RMQT/aHap2oICpwpgKeBAwxPUwuU9zIffKFNM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "1+EkFYvTDmz4WQRbK+kznRHoaZVLludtkDrMuM6h++E=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QEMDwUVoyJT7MNfOYKa25xU+Lnsz/ciH8rFUri4diLI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lUMCRAeu47BsOhNvCQTQJQeB68z0/VaElC9j5gDt9y8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VnAr7ZIjvUXpWmzbkt8skHp0oRNc3V89SfvgaZydwfw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u4GEbsk9IEF56V1am5dRtAWXz4iFQkO03FVL87BZXIM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BaaCxmYHKJ6obIzTCdRtjw1cc8d2mUJcMbLWCjf1aLo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "N3K5kDdfcKJurfaa6s2zfKgtYvz1Pagz7VWi9ZfX8yM=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "DsTbM0AgHfhSUKvOGkxudDOY3ojYT6bifhpelqHs8+s=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j9be+ddLChInrFz6/820/uYh4WZBzlp61klyJBDy/ZY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xi7nIgj4PqVXrpKLfJhcyxyVY1d3HRo72sKKPDmuU78=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2p8s/pRBZPjYWKKMlR7AOXypDzDmPo762iXlKpCwtco=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nsofE1FmSr1TiDR0gfnxfMDQ8o2pC+1NE7Oa9ceztSg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WvmTBjsCN4ueGpEdySRwsRC5knBRLfY439/e4mG+YAY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "c0i2uKsYBv8fubnI60lZIWA1y4zw1bFgsq5MmWBHKak=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AJR2ex094A1nJEWQsZYjALWsrSl1/huGZ37z2ZsMrpg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LSDd6ab46sHxwJSrg5YLpsPG2o6EcsZ3rDikpHzMNmI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dnFjFoTM9sP/RjQkXBK1YpYn3v5W+j0+g/OfUHS4xu8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "L0I4JoDfktbDWe0fCDL/nQlBPkF5mNgqamnM5JKJ1Uc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dPpZD53AbAMtW6sK+rTnXYe2GGGoSCNWsCtsmArLiIs=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VakMQSPBEuSC9Nwuv8WWhrZVUmH31bUR4+G6pJhkgE8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KI+kCESWD9cB8se4uxRrFVAI5viyNNUXUyMCc903yQc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8Qu1LFMt7qlZNmYQWrsXUA80aIx0rrFPPXs2s6NBdU8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WRsXnLz3gf8o4lYYeCZjAXgPU1cdmOOYPdy7aY63iIA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "R/3f7VruxWpu+2hiHlVpplTwoOou5kfQI1k/6/9H/y8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cLM/HeUFsXlnYnYod695u6NBDS0trMq8sVRdABnF7uc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Epd2FDKZwDybzT38Z7WB0y2jiLn9/2OLzmY3Zu18l6I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ENAVynNXVpj/IdYx9kCPKaPs4bWSxRIHNlmS9QiDuZQ=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j2w5BFOnZTrPN4SFpmQyfRomnUwbEbz1A+kr3z1icjo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "I2ILaY31gonxYQhlIk4PFUIN+Pk7+9dDTK1C/s+Vcb0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "3wRufybSUsTMnUeQkP74uJNDRKeM8jBLAS64T0BRfpY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2gOiMAdnIdND4cA75E7naQdyyIYDAdcjF3uO6OiEZlU=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2S8Y/vnLM3W+MYxNCxcUItIBfdZL/T4A8vRg89n0wLg=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UBTju7UZfXLVPPYb1a8gPZ69BeCv2Fho7YVo2EUbxKc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0HqB2x6x5HzeozpHatePECw07x1UcDdSz8kQGNznnA8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "H0SIA/BU6Xj8oT5bQkvLpEITN3CqFLbMeBcQ72NZrAE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xnh8TL3BbIs9VTUenmnx6r2UAHpGCj3G9FV0mzc+mU4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "X62YB48gO2SsWGnjYxH+aGfLQcjnP+T0hnErdWZ859g=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8pfpbIxBBiu88hpxS3CeRpv7kClEjl8SwVgckDNBGlE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UuxXNPImsE5Wp+utGfJywZBHuuGE4RmL0CArc6td82w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Sl3NKLaYEgDaovqTkKVZh2ihRFbSmyVjC63wpv3ecdc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SYjCs2AlY04xdfJGPD+gyO9NZ/zQ0Lfb/TLrjgOLS68=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oI1+4FoeI/knjsjDyCJtgZPaeyKON8tCTcM9QX0BHa8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nts1nu73aBgIdSaYye4coIuE1iBNeCuTZZC8LQ37ac8=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NQX4yKpOztKrmgBhGIC5WOALOLOq3LTpbzsN4ZLXGec=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BB4a/Xh5z+dkGCRlF+pSGC3iDOoDrFse/xzQAtmxMF4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ydjx2ea+PVuChrny6X2dluJwyXta+BsNQRsgHXp8fXw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pPGLc4NhNaehdoV2antWuyr0GmBVEG1NhD9NiSRrTi0=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VBVHOLnWGptY26J0wqXoZI2Dnu96pccMb08zlsaxPCQ=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "aUViYC2znC55sleHfmsIN9hZ45SbYPbDcYA0gVzglsc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "riYrMXBFLavmf4MU/Ly7emDlciVqfB2/zxJoRsBUlfY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F2wCn9rKafNZsYZwoLGkSQIpr3rk86cjYyuhSjsjRaE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ugb3W6W7WL9Vc4KiSBWIaowBfpqJlzbfBSfrIqZW06A=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gJDxhwAE6GeGCKQeVaNZ5is7+7MFHXtOG0UsnguKdoA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "b9RSkt+WmMxVHQExQH0IMPpnR9zDAaJwz/mv1gtyRVY=" + }, + "power": "100", + "name": "smartpesa" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "569Sb+Wpo8VFqXRi4cQhlOD9kS8uBgmJ2rntY3GLtzY=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SNwrT1B+A4g6TY7x0QzVrmVbcbl3cHXzXdD1tFHxLNo=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K4kLogLtZxqrYSqRVJfrFm9tUG+Tc3QWXWIewnAgI9w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TwzOJ4GcN+ZTswub4R8488SrKeWXjY/PaqCF5neXJig=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JXW8iTiWG28E05ZFJIKvCOBwI2RrH/BOBL/MluTZ6+I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A3zUdVcpj4H+HRZmRW5xixj4dzMgqD7be9GrdXcjdns=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7RhnD9OAZEJ4SV6V3LOZ1gGWubtX25457wCQq+AYYPI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "66j9af4xDJSblMLS+mFbp7d8TaFGu0FOo+0MwEYm2lE=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8DScmobjJQmkN44K2xiZkESM/O9MJK/DqlggnIPLpso=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "4JoJuRfaANhdM1x3AWRo1/Cj9DH3VA+fi1SynzknV+w=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cCoFsZzKZ9SQZbHe4NueVObIezP6ts0tRTZ/aN96dig=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Zp4tk/ieqplJF8xMeef9HV8bYpHSY+3hJ2sH7PfCX1I=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "jj0Y/Fy8JSJR3g+PHU6Ce0ecYwHGUVJ4bVyR7WwcyLI=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "XQDVMXja3kFk5Jb47BsqJmzcDsM4lE9+r+f/J3O5Jms=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oL/QCr7LEOivyTqpGrmwVd1r+hYI2WB5+kSVzpDMxx4=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "eeImG09hOPo1W7j7lKepN/Lx6I9GGHqVBVEKmznxACc=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Abws3eXrUFAH8LeZJIcECakPL945TTmFsBlXONOUeII=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PEg/D54SoiKZ+pic0Z0RzZa/vfYNAAf4kzSc5UKXDYk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "omAzuJps8KX3/iOC1LjwkMPMH3c6tjfLXwCNWXRBdWw=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nctikQSpoLRl5kV6KarIS761QvEOZCWw6nvc48xWhic=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NrTRAbZnBqJpW9lRW6LxXxE7EV++y7WiIRV0ifRLovA=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "W0rP8sv4Ae/LZOqlBA9evvYARDt79WpFaI26jw/9Tfk=" + }, + "power": "100", + "name": "" + }, + { + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JdfJDlE46456GWp+AkSZhzlkUQI41f8aX7611oiWUSc=" + }, + "power": "100", + "name": "" + } + ], + "app_hash": "", + "app_state": { + "accounts": [ + { + "address": "cosmosaccaddr1c2dkaym4teqw6jl9jkq8eu8nf4wzn2lgf4ydyt", + "coins": [ + { + "denom": "faucetToken", + "amount": "10000000" + }, + { + "denom": "steak", + "amount": "10000000" + } + ] + }, + { + "address": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "coins": [ + { + "denom": "jlandrewsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "coins": [ + { + "denom": "jackToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "coins": [ + { + "denom": "luigi001Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "coins": [ + { + "denom": "irisToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "coins": [ + { + "denom": "TropicalMongoXToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "coins": [ + { + "denom": "wingmanToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "coins": [ + { + "denom": "Nemea7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "coins": [ + { + "denom": "infinite-castingToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "coins": [ + { + "denom": "cwgoesToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "coins": [ + { + "denom": "lunamintToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "coins": [ + { + "denom": "skoed-validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "coins": [ + { + "denom": "starfishToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "coins": [ + { + "denom": "jjangg96Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "coins": [ + { + "denom": "iaspirationiToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "coins": [ + { + "denom": "21e800Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "coins": [ + { + "denom": "spptest1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "coins": [ + { + "denom": "windmillToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "coins": [ + { + "denom": "pbostrom/Mythos-1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "coins": [ + { + "denom": "BarytToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "coins": [ + { + "denom": "P2P.ORG ValidatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "coins": [ + { + "denom": "oleary-labsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "coins": [ + { + "denom": "wancloudsentryToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "coins": [ + { + "denom": "space4Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "coins": [ + { + "denom": "colony-finderToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "coins": [ + { + "denom": "sparkpool-validator-02Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "coins": [ + { + "denom": "mining-shipToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "coins": [ + { + "denom": "StakedToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "coins": [ + { + "denom": "nyliraToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "coins": [ + { + "denom": "liangpingToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "coins": [ + { + "denom": "SVNode01Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "coins": [ + { + "denom": "vhxnode1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "coins": [ + { + "denom": "gregToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "coins": [ + { + "denom": "bucksterToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "coins": [ + { + "denom": "grass-fedToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "coins": [ + { + "denom": "ATEAM1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "coins": [ + { + "denom": "BFF-Validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "coins": [ + { + "denom": "redbricks7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "coins": [ + { + "denom": "kittyfishToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "coins": [ + { + "denom": "ForboleToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "coins": [ + { + "denom": "coinoneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "coins": [ + { + "denom": "bmen-companyToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "coins": [ + { + "denom": "2400bpsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "coins": [ + { + "denom": "devToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "coins": [ + { + "denom": "w1m3lToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "coins": [ + { + "denom": "aetherToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "coins": [ + { + "denom": "JColToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "coins": [ + { + "denom": "SaiKrishnaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "coins": [ + { + "denom": "UmbrellaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "coins": [ + { + "denom": "@MarceldeveloperToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "coins": [ + { + "denom": "stereo-watcherToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "coins": [ + { + "denom": "cosmosToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "coins": [ + { + "denom": "stake.zoneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "coins": [ + { + "denom": "firstblock.ioToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "coins": [ + { + "denom": "shensiToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "coins": [ + { + "denom": "figmentToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "coins": [ + { + "denom": "iqlusionToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "coins": [ + { + "denom": "cosmosthecatToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "coins": [ + { + "denom": "snaticoToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "coins": [ + { + "denom": "mpaxeNodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "coins": [ + { + "denom": "joltz-secureware.ioToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "coins": [ + { + "denom": "mwnode1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "coins": [ + { + "denom": "VNode01Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "coins": [ + { + "denom": "7768Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "coins": [ + { + "denom": "block3.communityToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "coins": [ + { + "denom": "4455Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "coins": [ + { + "denom": "dooroomeeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "coins": [ + { + "denom": "sheiudToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "coins": [ + { + "denom": "Staking Facilities ValidatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "coins": [ + { + "denom": "ritter-rammToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "coins": [ + { + "denom": "meteor-discoverToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "coins": [ + { + "denom": "COSMODROMEToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "coins": [ + { + "denom": "broadleaf7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "coins": [ + { + "denom": "ravenclubToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "coins": [ + { + "denom": "dokia-capitalToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "coins": [ + { + "denom": "chainflow08Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "coins": [ + { + "denom": "MiaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "coins": [ + { + "denom": "sikka.techToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "coins": [ + { + "denom": "certus.oneToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "coins": [ + { + "denom": "Gold2Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "coins": [ + { + "denom": "idoor7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "coins": [ + { + "denom": "ironforkToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "coins": [ + { + "denom": "sunny-mintorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "coins": [ + { + "denom": "BlissDynamicsToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "coins": [ + { + "denom": "smartpesaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "coins": [ + { + "denom": "ianstreamToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "coins": [ + { + "denom": "TruNodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "coins": [ + { + "denom": "abcinToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "coins": [ + { + "denom": "kochacolajToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "coins": [ + { + "denom": "D2R-validator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "coins": [ + { + "denom": "juelianshanaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "coins": [ + { + "denom": "lambda-mixerToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "coins": [ + { + "denom": "bkcmToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "coins": [ + { + "denom": "ramihanToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "coins": [ + { + "denom": "davinchcodeToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "coins": [ + { + "denom": "DoriToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "coins": [ + { + "denom": "daefreecaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "coins": [ + { + "denom": "nuevaxToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "coins": [ + { + "denom": "inschain_validatorToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "coins": [ + { + "denom": "gruberxToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "coins": [ + { + "denom": "meleatrustToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "coins": [ + { + "denom": "Cosmodator-7000Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "coins": [ + { + "denom": "bharvestToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "coins": [ + { + "denom": "cryptiumToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "coins": [ + { + "denom": "finalityToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "coins": [ + { + "denom": "coscloudToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "coins": [ + { + "denom": "xiaochinaToken", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + }, + { + "address": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "coins": [ + { + "denom": "gazua1Token", + "amount": "1000" + }, + { + "denom": "steak", + "amount": "50" + } + ] + } + ], + "stake": { + "pool": { + "loose_tokens": "16050", + "bonded_tokens": "0", + "inflation_last_time": "0", + "inflation": "7/100", + "date_last_commission_reset": "0", + "prev_bonded_shares": "0" + }, + "params": { + "inflation_rate_change": "13/100", + "inflation_max": "1/5", + "inflation_min": "7/100", + "goal_bonded": "67/100", + "unbonding_time": "86400", + "max_validators": 128, + "bond_denom": "steak" + }, + "validators": [ + { + "owner": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MRCeBDANSjH6IsxO0z6tRe+xqoZvIGhdfl1t+SXGUpM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jlandrews", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "tOEqjO2t51PEgO9Tv0B7qM0yPmy1n5tMa3Beg0tp3ns=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jack", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "S8s6fdAQNQ3bN9SNVAsHB/j8uv1CM1roxeLesL+fh4g=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "luigi001", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2JoNf1gavJ1d6XFIumO1Mki5GVMOcg58AioHksU3maE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iris", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "k3YLQYEN2QMP6XITRsBmgb+pNGhJ5Jbg0bzUW977kK0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "TropicalMongoX", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "EREUrXXl1OJqLQag0P4h6vJ2H+8GEwyNAjgn1XEJU+I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "wingman", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "heNintBalqaJwCOjLb9+mX/cQ1ytMlV7ZroPIlkwZqo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Nemea7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nb2oRB12DlEQkFn7KSjSVkj5rDoSTsuBFa09+gmNJ7o=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "infinite-casting", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "bZSEBDNIOr0xJ/PxaAScJIyG6hqFtryBAMNwghAOTTU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cwgoes", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8K3clCjVU33BTIpUhdahGmu++WxHj4NUE9krCRkk++s=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "lunamint", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RBuRRNEzA9RA1Wrdi9PPFQJ29/n/bqN9O2tQv9Gq248=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "skoed-validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "RwPRoiY5C0covekqbr3VrQwxWGHioUUIf2+TOq8LIC0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "starfish", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2qtEBT+Tc+SD2wJsdrVMHXrBKfvesxtmtSKDK5fXwA0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "jjangg96", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gU5mmVLUSzn/fIEMgiiB4LARRoWlqjUGHr3A4SndWO8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iaspirationi", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xlO2cnii42KisAn8OcstC/3XV5+I0FlcSbWuyy5MVA8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "21e800", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "q5ezDn4DcWFPWvMayPJI35nXr//jjF8fGHsuiHjpDcU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "spptest1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PSqbJOwglJb1yrj3aWebBpXb2ujXcR037s1Cyj2HoW4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "windmill", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A6GzeXUM3vsXaDAEYMSDgSKkqn9AoUYjs8empH46MGY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "pbostrom/Mythos-1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "81fx09BivOOxeGL7QisF8aKRZjjcARpiSaCOX9mJfY8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Baryt", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UjTvuOew2EaooduJBiYmBWeF5ai0yFJG8uio5YXpJgg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "P2P.ORG Validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "y7p9JSVZBnRxjAI9v5Pxl37hMtyuHf6B4Ghqzm6+ii0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "oleary-labs", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oG8Q5o+SN4wqMLvlIfVgQPnsQzNEKeH0D/XGM8JlGrY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "wancloudsentry", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PxJbo5FKA6mXtgwclRQVNIjOCQK3Q7WkLQrvM9lYbGI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "space4", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Q/UShqqVDOUSNYBrR1G/1X1s+YXEVXEJzeXmYvfYIr0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "colony-finder", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "uEWWDBwFW+/BpTCvNCLW7AP98hndBukzSbrwCb7sooo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sparkpool-validator-02", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MZi48DJZOgRbE0ZStR66omv6Ez1Wkjvf2D/41q6Nd0I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mining-ship", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Go9GXHI6SCQo2QKMxkAkgYLhfo3XrVjWLR2nE2AvYyk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Staked", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P9RgE4RMQT/aHap2oICpwpgKeBAwxPUwuU9zIffKFNM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "nylira", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "1+EkFYvTDmz4WQRbK+kznRHoaZVLludtkDrMuM6h++E=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "liangping", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QEMDwUVoyJT7MNfOYKa25xU+Lnsz/ciH8rFUri4diLI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "SVNode01", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lUMCRAeu47BsOhNvCQTQJQeB68z0/VaElC9j5gDt9y8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "vhxnode1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VnAr7ZIjvUXpWmzbkt8skHp0oRNc3V89SfvgaZydwfw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "greg", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "u4GEbsk9IEF56V1am5dRtAWXz4iFQkO03FVL87BZXIM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "buckster", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BaaCxmYHKJ6obIzTCdRtjw1cc8d2mUJcMbLWCjf1aLo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "grass-fed", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "N3K5kDdfcKJurfaa6s2zfKgtYvz1Pagz7VWi9ZfX8yM=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ATEAM1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "DsTbM0AgHfhSUKvOGkxudDOY3ojYT6bifhpelqHs8+s=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "BFF-Validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j9be+ddLChInrFz6/820/uYh4WZBzlp61klyJBDy/ZY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "redbricks7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xi7nIgj4PqVXrpKLfJhcyxyVY1d3HRo72sKKPDmuU78=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "kittyfish", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2p8s/pRBZPjYWKKMlR7AOXypDzDmPo762iXlKpCwtco=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Forbole", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nsofE1FmSr1TiDR0gfnxfMDQ8o2pC+1NE7Oa9ceztSg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "coinone", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WvmTBjsCN4ueGpEdySRwsRC5knBRLfY439/e4mG+YAY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bmen-company", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "c0i2uKsYBv8fubnI60lZIWA1y4zw1bFgsq5MmWBHKak=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "2400bps", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AJR2ex094A1nJEWQsZYjALWsrSl1/huGZ37z2ZsMrpg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dev", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "LSDd6ab46sHxwJSrg5YLpsPG2o6EcsZ3rDikpHzMNmI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "w1m3l", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dnFjFoTM9sP/RjQkXBK1YpYn3v5W+j0+g/OfUHS4xu8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "aether", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "L0I4JoDfktbDWe0fCDL/nQlBPkF5mNgqamnM5JKJ1Uc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "JCol", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "dPpZD53AbAMtW6sK+rTnXYe2GGGoSCNWsCtsmArLiIs=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "SaiKrishna", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VakMQSPBEuSC9Nwuv8WWhrZVUmH31bUR4+G6pJhkgE8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Umbrella", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KI+kCESWD9cB8se4uxRrFVAI5viyNNUXUyMCc903yQc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "@Marceldeveloper", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8Qu1LFMt7qlZNmYQWrsXUA80aIx0rrFPPXs2s6NBdU8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "stereo-watcher", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "WRsXnLz3gf8o4lYYeCZjAXgPU1cdmOOYPdy7aY63iIA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cosmos", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "R/3f7VruxWpu+2hiHlVpplTwoOou5kfQI1k/6/9H/y8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "stake.zone", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "firstblock.io", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cLM/HeUFsXlnYnYod695u6NBDS0trMq8sVRdABnF7uc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "shensi", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Epd2FDKZwDybzT38Z7WB0y2jiLn9/2OLzmY3Zu18l6I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "figment", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ENAVynNXVpj/IdYx9kCPKaPs4bWSxRIHNlmS9QiDuZQ=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "iqlusion", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "j2w5BFOnZTrPN4SFpmQyfRomnUwbEbz1A+kr3z1icjo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "cosmosthecat", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "I2ILaY31gonxYQhlIk4PFUIN+Pk7+9dDTK1C/s+Vcb0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "snatico", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "3wRufybSUsTMnUeQkP74uJNDRKeM8jBLAS64T0BRfpY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mpaxeNode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2gOiMAdnIdND4cA75E7naQdyyIYDAdcjF3uO6OiEZlU=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "joltz-secureware.io", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2S8Y/vnLM3W+MYxNCxcUItIBfdZL/T4A8vRg89n0wLg=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "mwnode1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "kol7Gj60Fct4X8T1rHLJQ0z/b14UqqSae8h1e37rLL8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "VNode01", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UBTju7UZfXLVPPYb1a8gPZ69BeCv2Fho7YVo2EUbxKc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "7768", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0HqB2x6x5HzeozpHatePECw07x1UcDdSz8kQGNznnA8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "block3.community", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "H0SIA/BU6Xj8oT5bQkvLpEITN3CqFLbMeBcQ72NZrAE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "4455", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Xnh8TL3BbIs9VTUenmnx6r2UAHpGCj3G9FV0mzc+mU4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dooroomee", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "X62YB48gO2SsWGnjYxH+aGfLQcjnP+T0hnErdWZ859g=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sheiud", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8pfpbIxBBiu88hpxS3CeRpv7kClEjl8SwVgckDNBGlE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Staking Facilities Validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "UuxXNPImsE5Wp+utGfJywZBHuuGE4RmL0CArc6td82w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ritter-ramm", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Sl3NKLaYEgDaovqTkKVZh2ihRFbSmyVjC63wpv3ecdc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "meteor-discover", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SYjCs2AlY04xdfJGPD+gyO9NZ/zQ0Lfb/TLrjgOLS68=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "COSMODROME", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oI1+4FoeI/knjsjDyCJtgZPaeyKON8tCTcM9QX0BHa8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "broadleaf7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nts1nu73aBgIdSaYye4coIuE1iBNeCuTZZC8LQ37ac8=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ravenclub", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NQX4yKpOztKrmgBhGIC5WOALOLOq3LTpbzsN4ZLXGec=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "dokia-capital", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "BB4a/Xh5z+dkGCRlF+pSGC3iDOoDrFse/xzQAtmxMF4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "chainflow08", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ydjx2ea+PVuChrny6X2dluJwyXta+BsNQRsgHXp8fXw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Mia", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pPGLc4NhNaehdoV2antWuyr0GmBVEG1NhD9NiSRrTi0=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sikka.tech", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "VBVHOLnWGptY26J0wqXoZI2Dnu96pccMb08zlsaxPCQ=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "certus.one", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "aUViYC2znC55sleHfmsIN9hZ45SbYPbDcYA0gVzglsc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Gold2", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "riYrMXBFLavmf4MU/Ly7emDlciVqfB2/zxJoRsBUlfY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "idoor7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "F2wCn9rKafNZsYZwoLGkSQIpr3rk86cjYyuhSjsjRaE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ironfork", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ugb3W6W7WL9Vc4KiSBWIaowBfpqJlzbfBSfrIqZW06A=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "sunny-mintor", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "gJDxhwAE6GeGCKQeVaNZ5is7+7MFHXtOG0UsnguKdoA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "BlissDynamics", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "b9RSkt+WmMxVHQExQH0IMPpnR9zDAaJwz/mv1gtyRVY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "smartpesa", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "569Sb+Wpo8VFqXRi4cQhlOD9kS8uBgmJ2rntY3GLtzY=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ianstream", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SNwrT1B+A4g6TY7x0QzVrmVbcbl3cHXzXdD1tFHxLNo=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "TruNode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K4kLogLtZxqrYSqRVJfrFm9tUG+Tc3QWXWIewnAgI9w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "abcin", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TwzOJ4GcN+ZTswub4R8488SrKeWXjY/PaqCF5neXJig=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "kochacolaj", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JXW8iTiWG28E05ZFJIKvCOBwI2RrH/BOBL/MluTZ6+I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "D2R-validator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "A3zUdVcpj4H+HRZmRW5xixj4dzMgqD7be9GrdXcjdns=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "juelianshana", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "7RhnD9OAZEJ4SV6V3LOZ1gGWubtX25457wCQq+AYYPI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "lambda-mixer", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "66j9af4xDJSblMLS+mFbp7d8TaFGu0FOo+0MwEYm2lE=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bkcm", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "8DScmobjJQmkN44K2xiZkESM/O9MJK/DqlggnIPLpso=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "ramihan", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "4JoJuRfaANhdM1x3AWRo1/Cj9DH3VA+fi1SynzknV+w=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "davinchcode", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cCoFsZzKZ9SQZbHe4NueVObIezP6ts0tRTZ/aN96dig=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Dori", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Zp4tk/ieqplJF8xMeef9HV8bYpHSY+3hJ2sH7PfCX1I=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "daefreeca", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "jj0Y/Fy8JSJR3g+PHU6Ce0ecYwHGUVJ4bVyR7WwcyLI=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "nuevax", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "XQDVMXja3kFk5Jb47BsqJmzcDsM4lE9+r+f/J3O5Jms=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "inschain_validator", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oL/QCr7LEOivyTqpGrmwVd1r+hYI2WB5+kSVzpDMxx4=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "gruberx", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "eeImG09hOPo1W7j7lKepN/Lx6I9GGHqVBVEKmznxACc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "meleatrust", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Abws3eXrUFAH8LeZJIcECakPL945TTmFsBlXONOUeII=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Cosmodator-7000", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PEg/D54SoiKZ+pic0Z0RzZa/vfYNAAf4kzSc5UKXDYk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "bharvest", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "omAzuJps8KX3/iOC1LjwkMPMH3c6tjfLXwCNWXRBdWw=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "Adrian Brink - Cryptium Labs", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nctikQSpoLRl5kV6KarIS761QvEOZCWw6nvc48xWhic=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "finality", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "NrTRAbZnBqJpW9lRW6LxXxE7EV++y7WiIRV0ifRLovA=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "coscloud", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "W0rP8sv4Ae/LZOqlBA9evvYARDt79WpFaI26jw/9Tfk=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "xiaochina", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + }, + { + "owner": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "JdfJDlE46456GWp+AkSZhzlkUQI41f8aX7611oiWUSc=" + }, + "revoked": false, + "status": 0, + "tokens": "100", + "delegator_shares": "100", + "description": { + "moniker": "gazua1", + "identity": "", + "website": "", + "details": "" + }, + "bond_height": "0", + "bond_intra_tx_counter": 0, + "proposer_reward_pool": [], + "commission": "0", + "commission_max": "0", + "commission_change_rate": "0", + "commission_change_today": "0", + "prev_bonded_tokens": "0" + } + ], + "bonds": [ + { + "delegator_addr": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "validator_addr": "cosmosaccaddr157mg9hnhchfrqvk3enrvmvj29yhmlwf759xrgw", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "validator_addr": "cosmosaccaddr193vn0gk3nsmjkxwz78gce8e8mkmagmvulpg5jt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "validator_addr": "cosmosaccaddr16rcrnftjyl2mctz78825ng8tx5ss22jf6jcp9l", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "validator_addr": "cosmosaccaddr1shuqhpl273t96yg6nnqvyfeewj3ew3mdcwvcnu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "validator_addr": "cosmosaccaddr1syhzpjwx6vv3erv2myq7txrjhrp95hrhgcl242", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "validator_addr": "cosmosaccaddr1uga4nuresex5u8ajjh2pcr39l0s9hszdkp843j", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "validator_addr": "cosmosaccaddr12wnqvqg79s9jqrul0lva3h72rfmewm7jprrcp5", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "validator_addr": "cosmosaccaddr1lq0mvtgnwe8mp0096un0v8ztcsj8ad92t2cwrq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "validator_addr": "cosmosaccaddr14e774gfzt5l9ka766ehfgu6n5hgy9f3sehzyv8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "validator_addr": "cosmosaccaddr164jntjfk9zs8x29mc27qansfwvjqs60gj6ermu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "validator_addr": "cosmosaccaddr1qkc3tghc3fms7eye7vtu0g0370epr4jkje2ne7", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "validator_addr": "cosmosaccaddr18m09d56pg5p2660de4sjfezpd8ud6jfghndfnt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "validator_addr": "cosmosaccaddr1k9pqxd8fxqlk52uwfxnlsexqj6xnmw5swhss45", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "validator_addr": "cosmosaccaddr13q937pwglh24knwa2v23ml0kkpl9vwzjmfmj3q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "validator_addr": "cosmosaccaddr1xvt4e7xd0j9dwv2w83g50tpcltsl90h5dfnz6h", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "validator_addr": "cosmosaccaddr1nnyel6v0kx8zmfh9edmre3ua4dt9306cfxsxgd", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "validator_addr": "cosmosaccaddr13cds7hwqyq9ja2hsv4sg7glq9arlk43gcl3cek", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "validator_addr": "cosmosaccaddr1y2z20pwqu5qpclque3pqkguruvheum2djtzjw3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "validator_addr": "cosmosaccaddr1anuuffusmq5ng3rhlndhnacy45et30jqygtn67", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "validator_addr": "cosmosaccaddr1wk0t6na230vxhf6ddresw2c40k5y3ayrww0s2m", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "validator_addr": "cosmosaccaddr12pn4p6r5wjpsep9kn655ng7fh59yez7t0rahru", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "validator_addr": "cosmosaccaddr15rrxdflhq4744qt9m5ysstq3zpykhacf908eez", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "validator_addr": "cosmosaccaddr17rqsh3fw6rehnwzarz90jkqtt5fupmh50gy556", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "validator_addr": "cosmosaccaddr1g4q87u438qdh2c8ue4dzdr9ldrqrs77ptm9c70", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "validator_addr": "cosmosaccaddr1dq7jt3pn7mrce2twac907jue7hjd0p0rgt3qnq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "validator_addr": "cosmosaccaddr1gg6natrtt5lf02xwr06ujcczvavl54wgljuaut", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "validator_addr": "cosmosaccaddr1zds6r7jyxyxcpf05r5yyyy3u8q2rvj9kkc6vcv", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "validator_addr": "cosmosaccaddr1l0qw5znfd6e8pshpjvyghjjzyr4l6ymla080lt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "validator_addr": "cosmosaccaddr1rxxcpkmsngd0azkh3n2467m66ls4rwq52yuv27", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "validator_addr": "cosmosaccaddr1jsch8k385shvse6j5dfx20483qym5uhq76xpjf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "validator_addr": "cosmosaccaddr19uhnhct0p45ek6qxp3cjjrjtz4pacwcsgzvpuj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "validator_addr": "cosmosaccaddr1gghhdtx2sceafvgg8dry5sqrvc8srxghm4qqsy", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "validator_addr": "cosmosaccaddr1cyayv35tv47t829mel6jm0vqzmrdhf3jq87tqg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "validator_addr": "cosmosaccaddr126ayk3hse5zvk9gxfmpsjr9565ef72pv9g20yx", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "validator_addr": "cosmosaccaddr1fskmzyt2hr8usr3s65dq3rfur3fy6g2hjp23tm", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "validator_addr": "cosmosaccaddr1lhjta6nt0lewj05m8444tuyhalkrffgpm7njpp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "validator_addr": "cosmosaccaddr1pm0gx3lk46gf8vyj5my9w5tk06cuq66ll77ugj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "validator_addr": "cosmosaccaddr15w2rengajq9js8hu57kjw88dly5vy7gsqedn0n", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "validator_addr": "cosmosaccaddr10505nl7yftsme9jk2glhjhta7w0475uva87paj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "validator_addr": "cosmosaccaddr18z3pnjgdtt337z8g5drfts7r3fm6n9a0896h0r", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "validator_addr": "cosmosaccaddr1vmdgku2g0n5p2ef995r4fugu99ze9e5me9kh4d", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "validator_addr": "cosmosaccaddr1j2frwt2vq2xer7f060wpsu3y3f63uys2w9lx2e", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "validator_addr": "cosmosaccaddr1whxd48da3r56n8eecym8zg0c6xmf35fn2myart", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "validator_addr": "cosmosaccaddr1jkmn6asju47zuuzrf8rjt7sllaj5cx4kueyv8p", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "validator_addr": "cosmosaccaddr120skmenn2a0ra8y6zassrxvnfc5rlme8rqarvs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "validator_addr": "cosmosaccaddr1jtt6al0acr8h0uvq489rt9zx9lnau7rlcu30pt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "validator_addr": "cosmosaccaddr135dz5hdtvk3z8vl0zyy5l223kjanv0gudu4905", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "validator_addr": "cosmosaccaddr182ujqw3r8p5fffjqkf0rxzj29pg5q96nxd2khq", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "validator_addr": "cosmosaccaddr1qrc3ed8tnz6vc24ftmnht8efs5ufhjmrjkds4x", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "validator_addr": "cosmosaccaddr1swydkj5u3jd4jwe7uygu4479zgs4qg6v4ds3c9", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "validator_addr": "cosmosaccaddr1l9jt8xgejkcm4sulhwj8c83ftprz5p9lyq4605", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "validator_addr": "cosmosaccaddr128ty3kzhcepjacu4q0xjgq60qa3zz8na3jl793", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "validator_addr": "cosmosaccaddr1e3qm8jd9357zhdemwnaafmf0wy3f4yqmd307c2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "validator_addr": "cosmosaccaddr18wfz5vj26y079surms5sm6avjtezzspfvqs6g4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "validator_addr": "cosmosaccaddr1vrc7zpg5teawwuzkfh6t7c6sy353sukhlarxpa", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "validator_addr": "cosmosaccaddr1umaajfgap5ef6yxvk5706kwk8j08l7wh6h9fp2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "validator_addr": "cosmosaccaddr1670l5up6e5fddvlc027yvvlvedrzyx0mmsl622", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "validator_addr": "cosmosaccaddr1wx33m9dvglryga0saey0pr99ja0klhcfrwaw7l", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "validator_addr": "cosmosaccaddr15u9ve7fz8fqaf7r2u3p4f9ru4ze47pau5cxgcg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "validator_addr": "cosmosaccaddr1h4q0xkdg30cl9vw0u8ejm0rs337dszy98gnd4a", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "validator_addr": "cosmosaccaddr12zpkulxv7kn59sgf0tpf24qhqzxsvf3gamkl7g", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "validator_addr": "cosmosaccaddr1g6sc5t9t68vmcj3alk7dfqr54tvastpxac28k6", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "validator_addr": "cosmosaccaddr1jck6gp4mqy33sk6a0fr5c8maq53hf4245v3mgg", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "validator_addr": "cosmosaccaddr1jh3grawl62juvx5p8fz5xsy9hpw8w3mngqafe4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "validator_addr": "cosmosaccaddr17nlusdvrk34fq65jemy3umfjfwaxfzv4asyl60", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "validator_addr": "cosmosaccaddr18u2sqnuetfnkugp59e9pgyv2dpuvkkxmmsc7m8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "validator_addr": "cosmosaccaddr1xdp4pls4ryvchq2n8v0cpmtwsprvyh8wvg563q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "validator_addr": "cosmosaccaddr1pmntq5en2rgtr5rzr4e304efrve4lr43z32y5s", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "validator_addr": "cosmosaccaddr197p65z7ge5g55r68thvw4l5e43gnm70jhu5g75", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "validator_addr": "cosmosaccaddr15klp8pypkd8htppzt6pguej57yyvp5p442khcu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "validator_addr": "cosmosaccaddr1jsvgewy7h62v3q43m0l347wlcwyhd4un5q8aa3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "validator_addr": "cosmosaccaddr192yhf7f7f9304cy6cu6np3r8a3m9yqzqfeu9je", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "validator_addr": "cosmosaccaddr1pag7xgpl8njlaksvp2ur5un3htg85vcrxcp5rs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "validator_addr": "cosmosaccaddr1p56gv748xfd74qek5e637vhcr6tyjd9ukqfecc", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "validator_addr": "cosmosaccaddr1kwftgznylzerft2ksgkzvvfn5rfpy4nk2ye8na", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "validator_addr": "cosmosaccaddr1rj74vaqm0xkxl5cjjam63mayh4x6at3m379ulv", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "validator_addr": "cosmosaccaddr1zpx36km7tk5cksyzxgvcp6g552p3uhwx84r53q", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "validator_addr": "cosmosaccaddr1gq0qecxs8xdaarrqxxazwavwxm7qz5jzs5anvt", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "validator_addr": "cosmosaccaddr1cypmdvszcd9kd3jenmqxd03cpceql8rtuvxftp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "validator_addr": "cosmosaccaddr1klslzz2n2nqvdaa6gwflwpka7gc60vvmh3k450", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "validator_addr": "cosmosaccaddr1qkllv8f6qakkw3hk9dqvytys090lk6twsyv8vf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "validator_addr": "cosmosaccaddr1wf9nug554ugpw4t0wnlppxc6crl2n02qr8v3cd", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "validator_addr": "cosmosaccaddr1t3afuz2kt99jz4pe5k4vjvkdmldn2x0lqzv83w", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "validator_addr": "cosmosaccaddr14zfph0h8rexsca6gg6jkwqup3sgl6mwj6eu4e6", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "validator_addr": "cosmosaccaddr1998p0xkdwvul952ydavnx88tmwkhlfa0vhrngj", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "validator_addr": "cosmosaccaddr1jw554408yw2h438q200jyuqgln76xh4ax0q4s0", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "validator_addr": "cosmosaccaddr1mwmcpq5nhaen8zyy86mrrept2gmp0z5peapkhu", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "validator_addr": "cosmosaccaddr1emaa7mwgpnpmc7yptm728ytp9quamsvu9rk4hp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "validator_addr": "cosmosaccaddr1tq0zwzyc88l2enrlhtzw0he8rm24xfd5s9aeer", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "validator_addr": "cosmosaccaddr1n9qsfp3x09rhhxptzrgmdlucqhg2ce95fm3fw8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "validator_addr": "cosmosaccaddr1sqec04r28jfevkzfkdj4ql2qzr2zwrmg78qzj8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "validator_addr": "cosmosaccaddr1hfygmryre7r8m9pfqmc85y7kw7ejphmp59k2x8", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "validator_addr": "cosmosaccaddr1jvh448tvk368k4md83ys7auledclek0vfpckz2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "validator_addr": "cosmosaccaddr1fhfcs5npydv8s96wrk9p5ychctslu92t4n5qd4", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "validator_addr": "cosmosaccaddr1eg88jsn38mrael6cqu7d2u8j6dynya7fv2p2tl", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "validator_addr": "cosmosaccaddr1ukcuqpqw3eq505wkqd2adgn8ugewxr6jtakngs", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "validator_addr": "cosmosaccaddr1na3wr7ujdp3qdej6l5y0k4znzrkaz77t2yjaqf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "validator_addr": "cosmosaccaddr1xupfqk73y7rmc6qdgv7rtjy8wsngvt2g2t59t3", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "validator_addr": "cosmosaccaddr17gvlvfpsfl6hffn5u2hahk22un4ynpykc44tat", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "validator_addr": "cosmosaccaddr1yfseqtj5sjhzz2q2ym09jym4h4nc4yevae0jp2", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "validator_addr": "cosmosaccaddr1yd0rklq45zg89fywr89ccutlcwp9kehhh0z03k", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "validator_addr": "cosmosaccaddr1arlpxs2ftf5hgetqxxkvd7mqdc28mmaqclyv4y", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "validator_addr": "cosmosaccaddr12ceualfg92x7du73mtcv0zya4nxvq3tl2m52uz", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "validator_addr": "cosmosaccaddr1wxf0ck9h2e8p2wmecxtep6cefhexsp4kzc8fxy", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "validator_addr": "cosmosaccaddr1pzlud6lg8w9phcwetc5aqp24eflshtv4xlxthf", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "validator_addr": "cosmosaccaddr10qp8kqwm2cuql0hw2az5mngpmw5xm9ee32exlp", + "shares": "100", + "height": "0" + }, + { + "delegator_addr": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "validator_addr": "cosmosaccaddr14dwnmm6n7tjdpeylpwsdsatdl0umm75dfkqcpa", + "shares": "100", + "height": "0" + } + ] + } + } +} \ No newline at end of file From a959a57da8096c05c02aadcc3af81243b943f7d9 Mon Sep 17 00:00:00 2001 From: Ethan Buchman Date: Tue, 17 Jul 2018 09:26:01 +0100 Subject: [PATCH 20/30] gaia/testnets: add upgrade section --- cmd/gaia/testnets/README.md | 41 +++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index d5569add5b..a76d01921b 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -62,6 +62,47 @@ moniker = "" Your full node has been initialized! +## Upgrading From Previous Testnet + +These instructions are for full nodes that have ran on previous testnets and +would like to upgrade to the latest testnet. + +### Reset Data + +First, remove the outdated files and reset the data. + +```bash +rm $HOME/.gaiad/config/addrbook.json $HOME/.gaiad/config/genesis.json +gaiad unsafe_reset_all +``` + +Your node is now in a pristine state while keeping the original `priv_validator.json` and `config.toml`. +If you had any sentry nodes or full nodes setup before, your node will still try to connect to them, +but may fail if they haven't also been upgraded. + +**WARNING:** Make sure that every node has a unique `priv_validator.json`. +Do not copy the `priv_validator.json` from an old node to multiple new nodes. +Running two nodes with the same `priv_validator.json` will cause you to double sign. + +NOTE: key formats changed between gaia-6002 and gaia-7000. If you're trying to upgrade from gaia-6002, +you will also need to delete your `priv_validator.json`: + +``` +rm $HOME/.gaiad/config/priv_validator.json +``` + +### Software Upgrade + +Now it is time to upgrade the software: + +```bash +cd $GOPATH/src/github.com/cosmos/cosmos-sdk +git fetch --all && git checkout v0.22.0 +make update_tools && make get_vendor_deps && make install +``` + +Your full node has been cleanly upgraded! + ## Genesis & Seeds ### Copy the Genesis File From d6969c1d221387a7640b741873bfe9161299ee9a Mon Sep 17 00:00:00 2001 From: Sunny Aggarwal Date: Tue, 17 Jul 2018 13:59:06 -0700 Subject: [PATCH 21/30] Merge PR #1697: Proposal Query filter by status --- CHANGELOG.md | 11 +++++++++++ Gopkg.lock | 4 +--- client/lcd/lcd_test.go | 22 +++++++++++++++++++++- x/gov/client/rest/rest.go | 28 ++++++++++++++++++++++++---- x/slashing/params.go | 2 +- x/slashing/test_common.go | 2 +- x/stake/types/msg.go | 2 +- 7 files changed, 60 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 29d753a6dc..81b65ed376 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,16 @@ # Changelog +## TBD + +BREAKING CHANGES + +FEATURES +* [lcd] Can now query governance proposals by ProposalStatus + +IMPROVEMENTS + +BUG FIXES + ## 0.22.0 *July 16th, 2018* diff --git a/Gopkg.lock b/Gopkg.lock index 63f53a96f8..66f6c04925 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,7 +2,6 @@ [[projects]] - branch = "master" name = "github.com/bartekn/go-bip39" packages = ["."] revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" @@ -135,7 +134,6 @@ ".", "hcl/ast", "hcl/parser", - "hcl/printer", "hcl/scanner", "hcl/strconv", "hcl/token", @@ -503,6 +501,6 @@ [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "94abff3ff321fd150a6e4b95d109297296cdc00693c648c9b2a48171b90e36b0" + inputs-digest = "71e86b1f1e9ec71901c20d8532dc8477df66eff37a407322379f6a8b03e5d91b" solver-name = "gps-cdcl" solver-version = 1 diff --git a/client/lcd/lcd_test.go b/client/lcd/lcd_test.go index 9180af87a2..f5b2d263ee 100644 --- a/client/lcd/lcd_test.go +++ b/client/lcd/lcd_test.go @@ -569,6 +569,16 @@ func TestProposalsQuery(t *testing.T) { resultTx = doDeposit(t, port, seed2, name2, password2, addr2, proposalID3) tests.WaitForHeight(resultTx.Height+1, port) + // Only proposals #1 should be in Deposit Period + proposals := getProposalsFilterStatus(t, port, gov.StatusDepositPeriod) + require.Len(t, proposals, 1) + require.Equal(t, proposalID1, proposals[0].GetProposalID()) + // Only proposals #2 and #3 should be in Voting Period + proposals = getProposalsFilterStatus(t, port, gov.StatusVotingPeriod) + require.Len(t, proposals, 2) + require.Equal(t, proposalID2, proposals[0].GetProposalID()) + require.Equal(t, proposalID3, proposals[1].GetProposalID()) + // Addr1 votes on proposals #2 & #3 resultTx = doVote(t, port, seed, name, password1, addr, proposalID2) tests.WaitForHeight(resultTx.Height+1, port) @@ -580,7 +590,7 @@ func TestProposalsQuery(t *testing.T) { tests.WaitForHeight(resultTx.Height+1, port) // Test query all proposals - proposals := getProposalsAll(t, port) + proposals = getProposalsAll(t, port) require.Equal(t, proposalID1, (proposals[0]).GetProposalID()) require.Equal(t, proposalID2, (proposals[1]).GetProposalID()) require.Equal(t, proposalID3, (proposals[2]).GetProposalID()) @@ -910,6 +920,16 @@ func getProposalsFilterVoterDepositer(t *testing.T, port string, voterAddr, depo return proposals } +func getProposalsFilterStatus(t *testing.T, port string, status gov.ProposalStatus) []gov.Proposal { + res, body := Request(t, port, "GET", fmt.Sprintf("/gov/proposals?status=%s", status), nil) + require.Equal(t, http.StatusOK, res.StatusCode, body) + + var proposals []gov.Proposal + err := cdc.UnmarshalJSON([]byte(body), &proposals) + require.Nil(t, err) + return proposals +} + func doSubmitProposal(t *testing.T, port, seed, name, password string, proposerAddr sdk.AccAddress) (resultTx ctypes.ResultBroadcastTxCommit) { // get the account to get the sequence acc := getAccount(t, port, proposerAddr) diff --git a/x/gov/client/rest/rest.go b/x/gov/client/rest/rest.go index 1473045871..ffaf427492 100644 --- a/x/gov/client/rest/rest.go +++ b/x/gov/client/rest/rest.go @@ -16,10 +16,11 @@ import ( // REST Variable names // nolint const ( - RestProposalID = "proposalID" - RestDepositer = "depositer" - RestVoter = "voter" - storeName = "gov" + RestProposalID = "proposalID" + RestDepositer = "depositer" + RestVoter = "voter" + RestProposalStatus = "status" + storeName = "gov" ) // RegisterRoutes - Central function to define routes that get registered by the main application @@ -340,10 +341,12 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc { return func(w http.ResponseWriter, r *http.Request) { bechVoterAddr := r.URL.Query().Get(RestVoter) bechDepositerAddr := r.URL.Query().Get(RestDepositer) + strProposalStatus := r.URL.Query().Get(RestProposalStatus) var err error var voterAddr sdk.AccAddress var depositerAddr sdk.AccAddress + var proposalStatus gov.ProposalStatus if len(bechVoterAddr) != 0 { voterAddr, err = sdk.AccAddressFromBech32(bechVoterAddr) @@ -365,6 +368,16 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc { } } + if len(strProposalStatus) != 0 { + proposalStatus, err = gov.ProposalStatusFromString(strProposalStatus) + if err != nil { + w.WriteHeader(http.StatusBadRequest) + err := errors.Errorf("'%s' is not a valid Proposal Status", strProposalStatus) + w.Write([]byte(err.Error())) + return + } + } + ctx := context.NewCoreContextFromViper() res, err := ctx.QueryStore(gov.KeyNextProposalID, storeName) @@ -397,9 +410,16 @@ func queryProposalsWithParameterFn(cdc *wire.Codec) http.HandlerFunc { if err != nil || len(res) == 0 { continue } + var proposal gov.Proposal cdc.MustUnmarshalBinary(res, &proposal) + if len(strProposalStatus) != 0 { + if proposal.GetStatus() != proposalStatus { + continue + } + } + matchingProposals = append(matchingProposals, proposal) } diff --git a/x/slashing/params.go b/x/slashing/params.go index b0c85698ca..45d2833ce8 100644 --- a/x/slashing/params.go +++ b/x/slashing/params.go @@ -70,7 +70,7 @@ var ( // TODO Temporarily set to 10 minutes for testnets defaultDowntimeUnbondDuration int64 = 60 * 10 - defaultMinSignedPerWindow sdk.Rat = sdk.NewRat(1, 2) + defaultMinSignedPerWindow = sdk.NewRat(1, 2) defaultSlashFractionDoubleSign = sdk.NewRat(1).Quo(sdk.NewRat(20)) diff --git a/x/slashing/test_common.go b/x/slashing/test_common.go index 5cec7ce788..1909329950 100644 --- a/x/slashing/test_common.go +++ b/x/slashing/test_common.go @@ -34,7 +34,7 @@ var ( sdk.AccAddress(pks[1].Address()), sdk.AccAddress(pks[2].Address()), } - initCoins sdk.Int = sdk.NewInt(200) + initCoins = sdk.NewInt(200) ) func createTestCodec() *wire.Codec { diff --git a/x/stake/types/msg.go b/x/stake/types/msg.go index 08fd80128c..27edad5dd2 100644 --- a/x/stake/types/msg.go +++ b/x/stake/types/msg.go @@ -21,7 +21,7 @@ var _, _ sdk.Msg = &MsgBeginUnbonding{}, &MsgCompleteUnbonding{} var _, _ sdk.Msg = &MsgBeginRedelegate{}, &MsgCompleteRedelegate{} // Initialize Int for the denominator -var maximumBondingRationalDenominator sdk.Int = sdk.NewInt(int64(math.Pow10(MaxBondDenominatorPrecision))) +var maximumBondingRationalDenominator = sdk.NewInt(int64(math.Pow10(MaxBondDenominatorPrecision))) //______________________________________________________________________ From f88d64499dba0f2e57cc52d10ab22ce0aef5247e Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Tue, 17 Jul 2018 14:11:34 -0700 Subject: [PATCH 22/30] Merge PR #1705: baseapp: Allow alphanumerics in routes Previously only alphabetic characters were allowed. --- CHANGELOG.md | 3 ++- baseapp/baseapp_test.go | 2 +- baseapp/router.go | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 81b65ed376..ef203bbd07 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## TBD +## PENDING BREAKING CHANGES @@ -8,6 +8,7 @@ FEATURES * [lcd] Can now query governance proposals by ProposalStatus IMPROVEMENTS +* [baseapp] Allow any alphanumeric character in route BUG FIXES diff --git a/baseapp/baseapp_test.go b/baseapp/baseapp_test.go index 00897392ec..b2e0760eab 100644 --- a/baseapp/baseapp_test.go +++ b/baseapp/baseapp_test.go @@ -290,7 +290,7 @@ func (tx txTest) GetMsgs() []sdk.Msg { return tx.Msgs } const ( typeMsgCounter = "msgCounter" - typeMsgCounter2 = "msgCounterTwo" // NOTE: no numerics (?) + typeMsgCounter2 = "msgCounter2" ) // ValidateBasic() fails on negative counters. diff --git a/baseapp/router.go b/baseapp/router.go index abbbf9e121..4be3aec74a 100644 --- a/baseapp/router.go +++ b/baseapp/router.go @@ -31,12 +31,12 @@ func NewRouter() *router { } } -var isAlpha = regexp.MustCompile(`^[a-zA-Z]+$`).MatchString +var isAlphaNumeric = regexp.MustCompile(`^[a-zA-Z0-9]+$`).MatchString // AddRoute - TODO add description func (rtr *router) AddRoute(r string, h sdk.Handler) Router { - if !isAlpha(r) { - panic("route expressions can only contain alphabet characters") + if !isAlphaNumeric(r) { + panic("route expressions can only contain alphanumeric characters") } rtr.routes = append(rtr.routes, route{r, h}) From 6cfef643826a896728220f2c884a1367b2c3f769 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Wed, 18 Jul 2018 01:20:24 -0700 Subject: [PATCH 23/30] Merge PR #1732: tools: add make {get, update, check}_dev_tools This is so that validators can have a more minimal install, but we can still install linters for developers. (And any other future dev tools) --- .circleci/config.yml | 2 +- CONTRIBUTING.md | 2 +- Makefile | 10 ++++++++-- tools/Makefile | 11 ++++++++++- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index a8d42872e4..7a77d8d217 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -62,7 +62,7 @@ jobs: name: Get metalinter command: | export PATH="$GOBIN:$PATH" - make get_tools + make get_dev_tools - run: name: Lint source command: | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b18ef2ea95..de349501c3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,6 +1,6 @@ # Contributing -Thank you for considering making contributions to Cosmos-SDK and related repositories! Start by taking a look at this [coding repo](https://github.com/tendermint/coding) for overall information on repository workflow and standards. +Thank you for considering making contributions to Cosmos-SDK and related repositories! Start by taking a look at this [coding repo](https://github.com/tendermint/coding) for overall information on repository workflow and standards. Note, we use `make get_dev_tools` and `make update_dev_tools` for installing the linting tools. Please follow standard github best practices: fork the repo, branch from the tip of develop, make some commits, and submit a pull request to develop. See the [open issues](https://github.com/cosmos/cosmos-sdk/issues) for things we need help with! diff --git a/Makefile b/Makefile index b6b136f517..74c25e461e 100644 --- a/Makefile +++ b/Makefile @@ -73,11 +73,17 @@ dist: check_tools: cd tools && $(MAKE) check_tools +check_dev_tools: + cd tools && $(MAKE) check_dev_tools + update_tools: cd tools && $(MAKE) update_tools -get_tools: - cd tools && $(MAKE) get_tools +update_dev_tools: + cd tools && $(MAKE) update_dev_tools + +get_dev_tools: + cd tools && $(MAKE) get_dev_tools get_vendor_deps: @rm -rf vendor/ diff --git a/tools/Makefile b/tools/Makefile index d58f52d1b1..66ad10f6e0 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -30,6 +30,9 @@ ifndef DEP_CHECK else @echo "Found dep in path." endif + +check_dev_tools: + $(MAKE) check_tools ifndef GOLINT_CHECK @echo "No golint in path. Install with 'make get_tools'." else @@ -78,6 +81,9 @@ else @echo "Installing dep" go get -v $(DEP) endif + +get_dev_tools: + $(MAKE) get_tools ifdef GOLINT_CHECK @echo "Golint is already installed. Run 'make update_tools' to update." else @@ -130,6 +136,9 @@ endif update_tools: @echo "Updating dep" go get -u -v $(DEP) + +update_dev_tools: + $(MAKE) update_tools @echo "Updating tendermint/golint" go get -u -v $(GOLINT) @echo "Updating gometalinter.v2" @@ -150,4 +159,4 @@ update_tools: # To avoid unintended conflicts with file names, always add to .PHONY # unless there is a reason not to. # https://www.gnu.org/software/make/manual/html_node/Phony-Targets.html -.PHONY: check_tools get_tools update_tools +.PHONY: check_tools get_tools update_tools check_dev_tools get_dev_tools update_dev_tools From 2c81f4973f2f7fa1b1d41e312213b801bcfe66e3 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Wed, 18 Jul 2018 01:21:52 -0700 Subject: [PATCH 24/30] Merge PR #1731: tools: remove `rm -rf vendor/` from `make get_vendor_deps` We now ensure that the Gopkg.lock is correct, and that the toml doesn't depend on any branches, so this is no longer necessary. --- CHANGELOG.md | 1 + Makefile | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ef203bbd07..a4f9942dd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ FEATURES IMPROVEMENTS * [baseapp] Allow any alphanumeric character in route +* [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` BUG FIXES diff --git a/Makefile b/Makefile index 74c25e461e..a606a0acea 100644 --- a/Makefile +++ b/Makefile @@ -86,7 +86,6 @@ get_dev_tools: cd tools && $(MAKE) get_dev_tools get_vendor_deps: - @rm -rf vendor/ @echo "--> Running dep ensure" @dep ensure -v From b97ebef85eb0a9e6ba1e13c281e8e06832fc9221 Mon Sep 17 00:00:00 2001 From: Hendrik Hofstadt Date: Wed, 18 Jul 2018 13:12:49 +0200 Subject: [PATCH 25/30] Fix inflation calculation period check --- x/stake/handler.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x/stake/handler.go b/x/stake/handler.go index b39298edeb..14fb4f7bff 100644 --- a/x/stake/handler.go +++ b/x/stake/handler.go @@ -39,7 +39,7 @@ func EndBlocker(ctx sdk.Context, k keeper.Keeper) (ValidatorUpdates []abci.Valid // Process types.Validator Provisions blockTime := ctx.BlockHeader().Time - if pool.InflationLastTime+blockTime >= 3600 { + if blockTime-pool.InflationLastTime >= 3600 { pool.InflationLastTime = blockTime pool = pool.ProcessProvisions(params) } From c01a3d218f2544b00b817942e996e171c397b2a4 Mon Sep 17 00:00:00 2001 From: Hendrik Hofstadt Date: Wed, 18 Jul 2018 13:27:16 +0200 Subject: [PATCH 26/30] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index a4f9942dd7..e4324e73ce 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ## PENDING BREAKING CHANGES +* [x/stake] Fixed the period check for the inflation calculation FEATURES * [lcd] Can now query governance proposals by ProposalStatus From 9bc994b780da7ba89ffbeaf62a8d20435e53b9bd Mon Sep 17 00:00:00 2001 From: gamarin2 Date: Wed, 18 Jul 2018 14:16:10 +0200 Subject: [PATCH 27/30] Update faucet link in gaia-7001 README --- cmd/gaia/testnets/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/gaia/testnets/README.md b/cmd/gaia/testnets/README.md index a76d01921b..241cf4928f 100644 --- a/cmd/gaia/testnets/README.md +++ b/cmd/gaia/testnets/README.md @@ -337,7 +337,7 @@ gaiacli stake delegate \ While tokens are bonded, they are pooled with all the other bonded tokens in the network. Validators and delegators obtain a percentage of shares that equal their stake in this pool. -> _*NOTE:*_ Don't use more `steak` thank you have! You can always get more by using the [Faucet](https://faucetcosmos.network/)! +> _*NOTE:*_ Don't use more `steak` thank you have! You can always get more by using the [Faucet](https://gaia.faucetcosmos.network/)! ### Unbond Tokens From 95191f5a51333dcf8873a0a213122075cb4ffd75 Mon Sep 17 00:00:00 2001 From: Dev Ojha Date: Wed, 18 Jul 2018 11:25:55 -0700 Subject: [PATCH 28/30] Merge PR #1730: client: On any tx that broadcasts a tx, check that acct exists This subverts the really hard to decipher ABCI error message, with a nice user friendly error message. --- CHANGELOG.md | 1 + Gopkg.lock | 182 ++++++++++++++++++++++++++++++++++---- client/context/helpers.go | 5 ++ client/context/viper.go | 34 +++++++ 4 files changed, 205 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e4324e73ce..f8fc927c9a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ FEATURES IMPROVEMENTS * [baseapp] Allow any alphanumeric character in route +* [cli] Improve error messages for all txs when the account doesn't exist * [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` BUG FIXES diff --git a/Gopkg.lock b/Gopkg.lock index 66f6c04925..cf5c97909d 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -2,57 +2,76 @@ [[projects]] + digest = "1:09a7f74eb6bb3c0f14d8926610c87f569c5cff68e978d30e9a3540aeb626fdf0" name = "github.com/bartekn/go-bip39" packages = ["."] + pruneopts = "UT" revision = "a05967ea095d81c8fe4833776774cfaff8e5036c" [[projects]] branch = "master" + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" name = "github.com/beorn7/perks" packages = ["quantile"] + pruneopts = "UT" revision = "3a771d992973f24aa725d07868b467d1ddfceafb" [[projects]] + digest = "1:1343a2963481a305ca4d051e84bc2abd16b601ee22ed324f8d605de1adb291b0" name = "github.com/bgentry/speakeasy" packages = ["."] + pruneopts = "UT" revision = "4aabc24848ce5fd31929f7d1e4ea74d3709c14cd" version = "v0.1.0" [[projects]] branch = "master" + digest = "1:70f6b224a59b2fa453debffa85c77f71063d8754b90c8c4fbad5794e2c382b0f" name = "github.com/brejski/hid" packages = ["."] + pruneopts = "UT" revision = "06112dcfcc50a7e0e4fd06e17f9791e788fdaafc" [[projects]] branch = "master" + digest = "1:6aabc1566d6351115d561d038da82a4c19b46c3b6e17f4a0a2fa60260663dc79" name = "github.com/btcsuite/btcd" packages = ["btcec"] + pruneopts = "UT" revision = "fdfc19097e7ac6b57035062056f5b7b4638b8898" [[projects]] + digest = "1:386de157f7d19259a7f9c81f26ce011223ce0f090353c1152ffdf730d7d10ac2" name = "github.com/btcsuite/btcutil" packages = ["bech32"] + pruneopts = "UT" revision = "d4cc87b860166d00d6b5b9e0d3b3d71d6088d4d4" [[projects]] + digest = "1:a2c1d0e43bd3baaa071d1b9ed72c27d78169b2b269f71c105ac4ba34b1be4a39" name = "github.com/davecgh/go-spew" packages = ["spew"] + pruneopts = "UT" revision = "346938d642f2ec3594ed81d874461961cd0faa76" version = "v1.1.0" [[projects]] + digest = "1:c7644c73a3d23741fdba8a99b1464e021a224b7e205be497271a8003a15ca41b" name = "github.com/ebuchman/fail-test" packages = ["."] + pruneopts = "UT" revision = "95f809107225be108efcf10a3509e4ea6ceef3c4" [[projects]] + digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" name = "github.com/fsnotify/fsnotify" packages = ["."] + pruneopts = "UT" revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" version = "v1.4.7" [[projects]] + digest = "1:fa30c0652956e159cdb97dcb2ef8b8db63ed668c02a5c3a40961c8f0641252fe" name = "github.com/go-kit/kit" packages = [ "log", @@ -61,24 +80,30 @@ "metrics", "metrics/discard", "metrics/internal/lv", - "metrics/prometheus" + "metrics/prometheus", ] + pruneopts = "UT" revision = "4dc7be5d2d12881735283bcab7352178e190fc71" version = "v0.6.0" [[projects]] + digest = "1:31a18dae27a29aa074515e43a443abfd2ba6deb6d69309d8d7ce789c45f34659" name = "github.com/go-logfmt/logfmt" packages = ["."] + pruneopts = "UT" revision = "390ab7935ee28ec6b286364bba9b4dd6410cb3d5" version = "v0.3.0" [[projects]] + digest = "1:c4a2528ccbcabf90f9f3c464a5fc9e302d592861bbfd0b7135a7de8a943d0406" name = "github.com/go-stack/stack" packages = ["."] + pruneopts = "UT" revision = "259ab82a6cad3992b4e21ff5cac294ccb06474bc" version = "v1.7.0" [[projects]] + digest = "1:af1306bff89268721ea2550d504413c9487ebfca11e2ff8f39ae79b99a720ff5" name = "github.com/gogo/protobuf" packages = [ "gogoproto", @@ -86,49 +111,61 @@ "proto", "protoc-gen-gogo/descriptor", "sortkeys", - "types" + "types", ] + pruneopts = "UT" revision = "1adfc126b41513cc696b209667c8656ea7aac67c" version = "v1.0.0" [[projects]] + digest = "1:cb22af0ed7c72d495d8be1106233ee553898950f15fd3f5404406d44c2e86888" name = "github.com/golang/protobuf" packages = [ "proto", "ptypes", "ptypes/any", "ptypes/duration", - "ptypes/timestamp" + "ptypes/timestamp", ] + pruneopts = "UT" revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" version = "v1.1.0" [[projects]] branch = "master" + digest = "1:4a0c6bb4805508a6287675fac876be2ac1182539ca8a32468d8128882e9d5009" name = "github.com/golang/snappy" packages = ["."] + pruneopts = "UT" revision = "2e65f85255dbc3072edf28d6b5b8efc472979f5a" [[projects]] + digest = "1:c79fb010be38a59d657c48c6ba1d003a8aa651fa56b579d959d74573b7dff8e1" name = "github.com/gorilla/context" packages = ["."] + pruneopts = "UT" revision = "08b5f424b9271eedf6f9f0ce86cb9396ed337a42" version = "v1.1.1" [[projects]] + digest = "1:e73f5b0152105f18bc131fba127d9949305c8693f8a762588a82a48f61756f5f" name = "github.com/gorilla/mux" packages = ["."] + pruneopts = "UT" revision = "e3702bed27f0d39777b0b37b664b6280e8ef8fbf" version = "v1.6.2" [[projects]] + digest = "1:43dd08a10854b2056e615d1b1d22ac94559d822e1f8b6fcc92c1a1057e85188e" name = "github.com/gorilla/websocket" packages = ["."] + pruneopts = "UT" revision = "ea4d1f681babbce9545c9c5f3d5194a789c89f5b" version = "v1.2.0" [[projects]] branch = "master" + digest = "1:8951fe6e358876736d8fa1f3992624fdbb2dec6bc49401c1381d1ef8abbb544f" name = "github.com/hashicorp/hcl" packages = [ ".", @@ -139,160 +176,206 @@ "hcl/token", "json/parser", "json/scanner", - "json/token" + "json/token", ] + pruneopts = "UT" revision = "ef8a98b0bbce4a65b5aa4c368430a80ddc533168" [[projects]] + digest = "1:870d441fe217b8e689d7949fef6e43efbc787e50f200cb1e70dbca9204a1d6be" name = "github.com/inconshreveable/mousetrap" packages = ["."] + pruneopts = "UT" revision = "76626ae9c91c4f2a10f34cad8ce83ea42c93bb75" version = "v1.0" [[projects]] branch = "master" + digest = "1:39b27d1381a30421f9813967a5866fba35dc1d4df43a6eefe3b7a5444cb07214" name = "github.com/jmhodges/levigo" packages = ["."] + pruneopts = "UT" revision = "c42d9e0ca023e2198120196f842701bb4c55d7b9" [[projects]] branch = "master" + digest = "1:a64e323dc06b73892e5bb5d040ced475c4645d456038333883f58934abbf6f72" name = "github.com/kr/logfmt" packages = ["."] + pruneopts = "UT" revision = "b84e30acd515aadc4b783ad4ff83aff3299bdfe0" [[projects]] + digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" name = "github.com/magiconair/properties" packages = ["."] + pruneopts = "UT" revision = "c2353362d570a7bfa228149c62842019201cfb71" version = "v1.8.0" [[projects]] + digest = "1:d4d17353dbd05cb52a2a52b7fe1771883b682806f68db442b436294926bbfafb" name = "github.com/mattn/go-isatty" packages = ["."] + pruneopts = "UT" revision = "0360b2af4f38e8d38c7fce2a9f4e702702d73a39" version = "v0.0.3" [[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" name = "github.com/matttproud/golang_protobuf_extensions" packages = ["pbutil"] + pruneopts = "UT" revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" version = "v1.0.1" [[projects]] branch = "master" + digest = "1:e730597b38a4d56e2361e0b6236cb800e52c73cace2ff91396f4ff35792ddfa7" name = "github.com/mitchellh/mapstructure" packages = ["."] + pruneopts = "UT" revision = "bb74f1db0675b241733089d5a1faa5dd8b0ef57b" [[projects]] + digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" name = "github.com/pelletier/go-toml" packages = ["."] + pruneopts = "UT" revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" version = "v1.2.0" [[projects]] + digest = "1:40e195917a951a8bf867cd05de2a46aaf1806c50cf92eebf4c16f78cd196f747" name = "github.com/pkg/errors" packages = ["."] + pruneopts = "UT" revision = "645ef00459ed84a119197bfb8d8205042c6df63d" version = "v0.8.0" [[projects]] + digest = "1:0028cb19b2e4c3112225cd871870f2d9cf49b9b4276531f03438a88e94be86fe" name = "github.com/pmezard/go-difflib" packages = ["difflib"] + pruneopts = "UT" revision = "792786c7400a136282c1664665ae0a8db921c6c2" version = "v1.0.0" [[projects]] + digest = "1:98225904b7abff96c052b669b25788f18225a36673fba022fb93514bb9a2a64e" name = "github.com/prometheus/client_golang" packages = [ "prometheus", - "prometheus/promhttp" + "prometheus/promhttp", ] + pruneopts = "UT" revision = "ae27198cdd90bf12cd134ad79d1366a6cf49f632" [[projects]] branch = "master" + digest = "1:0f37e09b3e92aaeda5991581311f8dbf38944b36a3edec61cc2d1991f527554a" name = "github.com/prometheus/client_model" packages = ["go"] + pruneopts = "UT" revision = "5c3871d89910bfb32f5fcab2aa4b9ec68e65a99f" [[projects]] branch = "master" + digest = "1:4d291d51042ed9de40eef61a3c1b56e969d6e0f8aa5fd3da5e958ec66bee68e4" name = "github.com/prometheus/common" packages = [ "expfmt", "internal/bitbucket.org/ww/goautoneg", - "model" + "model", ] + pruneopts = "UT" revision = "7600349dcfe1abd18d72d3a1770870d9800a7801" [[projects]] branch = "master" + digest = "1:55d7449d6987dabf272b4e81b2f9c449f05b17415c939b68d1e82f57e3374b7f" name = "github.com/prometheus/procfs" packages = [ ".", "internal/util", "nfs", - "xfs" + "xfs", ] + pruneopts = "UT" revision = "ae68e2d4c00fed4943b5f6698d504a5fe083da8a" [[projects]] + digest = "1:c4556a44e350b50a490544d9b06e9fba9c286c21d6c0e47f54f3a9214597298c" name = "github.com/rcrowley/go-metrics" packages = ["."] + pruneopts = "UT" revision = "e2704e165165ec55d062f5919b4b29494e9fa790" [[projects]] + digest = "1:37ace7f35375adec11634126944bdc45a673415e2fcc07382d03b75ec76ea94c" name = "github.com/spf13/afero" packages = [ ".", - "mem" + "mem", ] + pruneopts = "UT" revision = "787d034dfe70e44075ccc060d346146ef53270ad" version = "v1.1.1" [[projects]] + digest = "1:516e71bed754268937f57d4ecb190e01958452336fa73dbac880894164e91c1f" name = "github.com/spf13/cast" packages = ["."] + pruneopts = "UT" revision = "8965335b8c7107321228e3e3702cab9832751bac" version = "v1.2.0" [[projects]] + digest = "1:627ab2f549a6a55c44f46fa24a4307f4d0da81bfc7934ed0473bf38b24051d26" name = "github.com/spf13/cobra" packages = ["."] + pruneopts = "UT" revision = "7b2c5ac9fc04fc5efafb60700713d4fa609b777b" version = "v0.0.1" [[projects]] branch = "master" + digest = "1:080e5f630945ad754f4b920e60b4d3095ba0237ebf88dc462eb28002932e3805" name = "github.com/spf13/jwalterweatherman" packages = ["."] + pruneopts = "UT" revision = "7c0cea34c8ece3fbeb2b27ab9b59511d360fb394" [[projects]] + digest = "1:9424f440bba8f7508b69414634aef3b2b3a877e522d8a4624692412805407bb7" name = "github.com/spf13/pflag" packages = ["."] + pruneopts = "UT" revision = "583c0c0531f06d5278b7d917446061adc344b5cd" version = "v1.0.1" [[projects]] + digest = "1:f8e1a678a2571e265f4bf91a3e5e32aa6b1474a55cb0ea849750cc177b664d96" name = "github.com/spf13/viper" packages = ["."] + pruneopts = "UT" revision = "25b30aa063fc18e48662b86996252eabdcf2f0c7" version = "v1.0.0" [[projects]] + digest = "1:73697231b93fb74a73ebd8384b68b9a60c57ea6b13c56d2425414566a72c8e6d" name = "github.com/stretchr/testify" packages = [ "assert", - "require" + "require", ] + pruneopts = "UT" revision = "12b6f73e6084dad08a7c6e575284b177ecafbc71" version = "v1.2.1" [[projects]] branch = "master" + digest = "1:922191411ad8f61bcd8018ac127589bb489712c1d1a0ab2497aca4b16de417d2" name = "github.com/syndtr/goleveldb" packages = [ "leveldb", @@ -306,33 +389,41 @@ "leveldb/opt", "leveldb/storage", "leveldb/table", - "leveldb/util" + "leveldb/util", ] + pruneopts = "UT" revision = "c4c61651e9e37fa117f53c5a906d3b63090d8445" [[projects]] branch = "master" + digest = "1:203b409c21115233a576f99e8f13d8e07ad82b25500491f7e1cca12588fb3232" name = "github.com/tendermint/ed25519" packages = [ ".", "edwards25519", - "extra25519" + "extra25519", ] + pruneopts = "UT" revision = "d8387025d2b9d158cf4efb07e7ebf814bcce2057" [[projects]] + digest = "1:e9113641c839c21d8eaeb2c907c7276af1eddeed988df8322168c56b7e06e0e1" name = "github.com/tendermint/go-amino" packages = ["."] + pruneopts = "UT" revision = "2106ca61d91029c931fd54968c2bb02dc96b1412" version = "0.10.1" [[projects]] + digest = "1:d4a15d404afbf591e8be16fcda7f5ac87948d5c7531f9d909fd84cc730ab16e2" name = "github.com/tendermint/iavl" packages = ["."] + pruneopts = "UT" revision = "35f66e53d9b01e83b30de68b931f54b2477a94c9" version = "v0.9.2" [[projects]] + digest = "1:5f41a7655812fa5901c71735dc8845f33184e94a2020c770f60a1a80ed228cb3" name = "github.com/tendermint/tendermint" packages = [ "abci/client", @@ -387,18 +478,22 @@ "state/txindex/kv", "state/txindex/null", "types", - "version" + "version", ] + pruneopts = "UT" revision = "c64a3c74c870d725ba1356f75b4afadf0928c297" version = "v0.22.4" [[projects]] + digest = "1:5bd938386bd1f61a581bf8cd6ff2b7b2f79c542929176db4ceb44965440dae07" name = "github.com/zondax/ledger-goclient" packages = ["."] + pruneopts = "UT" revision = "39ba4728c137c75718a21f9b4b3280fa31b9139b" [[projects]] branch = "master" + digest = "1:e8206c1653e050116ec8c9a823a86413fc9f9ee3c2f3ae977c96d6a1747f7325" name = "golang.org/x/crypto" packages = [ "blowfish", @@ -411,11 +506,13 @@ "pbkdf2", "poly1305", "ripemd160", - "salsa20/salsa" + "salsa20/salsa", ] + pruneopts = "UT" revision = "a49355c7e3f8fe157a85be2f77e6e269a0f89602" [[projects]] + digest = "1:04dda8391c3e2397daf254ac68003f30141c069b228d06baec8324a5f81dc1e9" name = "golang.org/x/net" packages = [ "context", @@ -425,17 +522,21 @@ "idna", "internal/timeseries", "netutil", - "trace" + "trace", ] + pruneopts = "UT" revision = "292b43bbf7cb8d35ddf40f8d5100ef3837cced3f" [[projects]] branch = "master" + digest = "1:d773e525476aefa22ea944a5425a9bfb99819b2e67eeb9b1966454fd57522bbf" name = "golang.org/x/sys" packages = ["unix"] + pruneopts = "UT" revision = "1b2967e3c290b7c545b3db0deeda16e9be4f98a2" [[projects]] + digest = "1:7509ba4347d1f8de6ae9be8818b0cd1abc3deeffe28aeaf4be6d4b6b5178d9ca" name = "golang.org/x/text" packages = [ "collate", @@ -451,18 +552,22 @@ "unicode/bidi", "unicode/cldr", "unicode/norm", - "unicode/rangetable" + "unicode/rangetable", ] + pruneopts = "UT" revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" version = "v0.3.0" [[projects]] branch = "master" + digest = "1:601e63e7d4577f907118bec825902505291918859d223bce015539e79f1160e3" name = "google.golang.org/genproto" packages = ["googleapis/rpc/status"] + pruneopts = "UT" revision = "e92b116572682a5b432ddd840aeaba2a559eeff1" [[projects]] + digest = "1:4d7b5d9746840266938cdb21a40f8eba7137d9153c4ed404d6bb2a450d06f690" name = "google.golang.org/grpc" packages = [ ".", @@ -487,20 +592,63 @@ "stats", "status", "tap", - "transport" + "transport", ] + pruneopts = "UT" revision = "d11072e7ca9811b1100b80ca0269ac831f06d024" version = "v1.11.3" [[projects]] + digest = "1:342378ac4dcb378a5448dd723f0784ae519383532f5e70ade24132c4c8693202" name = "gopkg.in/yaml.v2" packages = ["."] + pruneopts = "UT" revision = "5420a8b6744d3b0345ab293f6fcba19c978f1183" version = "v2.2.1" [solve-meta] analyzer-name = "dep" analyzer-version = 1 - inputs-digest = "71e86b1f1e9ec71901c20d8532dc8477df66eff37a407322379f6a8b03e5d91b" + input-imports = [ + "github.com/bartekn/go-bip39", + "github.com/bgentry/speakeasy", + "github.com/btcsuite/btcd/btcec", + "github.com/golang/protobuf/proto", + "github.com/gorilla/mux", + "github.com/mattn/go-isatty", + "github.com/pkg/errors", + "github.com/spf13/cobra", + "github.com/spf13/pflag", + "github.com/spf13/viper", + "github.com/stretchr/testify/assert", + "github.com/stretchr/testify/require", + "github.com/tendermint/go-amino", + "github.com/tendermint/iavl", + "github.com/tendermint/tendermint/abci/server", + "github.com/tendermint/tendermint/abci/types", + "github.com/tendermint/tendermint/cmd/tendermint/commands", + "github.com/tendermint/tendermint/config", + "github.com/tendermint/tendermint/crypto", + "github.com/tendermint/tendermint/crypto/merkle", + "github.com/tendermint/tendermint/crypto/tmhash", + "github.com/tendermint/tendermint/libs/bech32", + "github.com/tendermint/tendermint/libs/cli", + "github.com/tendermint/tendermint/libs/cli/flags", + "github.com/tendermint/tendermint/libs/common", + "github.com/tendermint/tendermint/libs/db", + "github.com/tendermint/tendermint/libs/log", + "github.com/tendermint/tendermint/node", + "github.com/tendermint/tendermint/p2p", + "github.com/tendermint/tendermint/privval", + "github.com/tendermint/tendermint/proxy", + "github.com/tendermint/tendermint/rpc/client", + "github.com/tendermint/tendermint/rpc/core/types", + "github.com/tendermint/tendermint/rpc/lib/client", + "github.com/tendermint/tendermint/rpc/lib/server", + "github.com/tendermint/tendermint/types", + "github.com/zondax/ledger-goclient", + "golang.org/x/crypto/blowfish", + "golang.org/x/crypto/ripemd160", + ] solver-name = "gps-cdcl" solver-version = 1 diff --git a/client/context/helpers.go b/client/context/helpers.go index 00ff8a81c7..7742dfe03a 100644 --- a/client/context/helpers.go +++ b/client/context/helpers.go @@ -186,6 +186,11 @@ func (ctx CoreContext) SignAndBuild(name, passphrase string, msgs []sdk.Msg, cdc // sign and build the transaction from the msg func (ctx CoreContext) ensureSignBuild(name string, msgs []sdk.Msg, cdc *wire.Codec) (tyBytes []byte, err error) { + err = EnsureAccountExists(ctx, name) + if err != nil { + return nil, err + } + ctx, err = EnsureAccountNumber(ctx) if err != nil { return nil, err diff --git a/client/context/viper.go b/client/context/viper.go index 611ad1b92f..6c7646079e 100644 --- a/client/context/viper.go +++ b/client/context/viper.go @@ -3,6 +3,7 @@ package context import ( "fmt" + "github.com/pkg/errors" "github.com/spf13/viper" tcmd "github.com/tendermint/tendermint/cmd/tendermint/commands" @@ -10,6 +11,9 @@ import ( tmtypes "github.com/tendermint/tendermint/types" "github.com/cosmos/cosmos-sdk/client" + "github.com/cosmos/cosmos-sdk/client/keys" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/x/auth" ) // NewCoreContextFromViper - return a new context with parameters from the command line @@ -68,6 +72,36 @@ func defaultChainID() (string, error) { return doc.ChainID, nil } +// EnsureAccountExists - Make sure account exists +func EnsureAccountExists(ctx CoreContext, name string) error { + keybase, err := keys.GetKeyBase() + if err != nil { + return err + } + + if name == "" { + return errors.Errorf("must provide a from address name") + } + + info, err := keybase.Get(name) + if err != nil { + return errors.Errorf("no key for: %s", name) + } + + accAddr := sdk.AccAddress(info.GetPubKey().Address()) + + Acc, err := ctx.QueryStore(auth.AddressStoreKey(accAddr), ctx.AccountStore) + if err != nil { + return err + } + + // Check if account was found + if Acc == nil { + return errors.Errorf("No account with address %s was found in the state.\nAre you sure there has been a transaction involving it?", accAddr) + } + return nil +} + // EnsureAccount - automatically set account number if none provided func EnsureAccountNumber(ctx CoreContext) (CoreContext, error) { // Should be viper.IsSet, but this does not work - https://github.com/spf13/viper/pull/331 From cfe78027f22fdc9b96e43b8671af07a2e11e0f31 Mon Sep 17 00:00:00 2001 From: Rigel Date: Wed, 18 Jul 2018 16:09:40 -0400 Subject: [PATCH 29/30] Merge PR #1724: R4R: Add Stake Genesis Intra-Tx Counter * add revoked to human-readable validator * changelog * added failing test * add intra-tx counter to the genesis validators * changelog --- CHANGELOG.md | 2 ++ x/stake/genesis.go | 4 ++- x/stake/genesis_test.go | 16 +++++++++-- x/stake/types/validator.go | 55 +++++++++++++++++++------------------- 4 files changed, 47 insertions(+), 30 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index f8fc927c9a..fc69ff9d41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,10 +10,12 @@ FEATURES IMPROVEMENTS * [baseapp] Allow any alphanumeric character in route +* [x/stake] Add revoked to human-readable validator * [cli] Improve error messages for all txs when the account doesn't exist * [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` BUG FIXES +* \#1666 Add intra-tx counter to the genesis validators ## 0.22.0 diff --git a/x/stake/genesis.go b/x/stake/genesis.go index e54517fa5f..b4ed80e514 100644 --- a/x/stake/genesis.go +++ b/x/stake/genesis.go @@ -17,7 +17,7 @@ func InitGenesis(ctx sdk.Context, keeper Keeper, data types.GenesisState) error keeper.SetNewParams(ctx, data.Params) keeper.InitIntraTxCounter(ctx) - for _, validator := range data.Validators { + for i, validator := range data.Validators { keeper.SetValidator(ctx, validator) if validator.Tokens.IsZero() { @@ -29,6 +29,8 @@ func InitGenesis(ctx sdk.Context, keeper Keeper, data types.GenesisState) error // Manually set indexes for the first time keeper.SetValidatorByPubKeyIndex(ctx, validator) + + validator.BondIntraTxCounter = int16(i) // set the intra-tx counter to the order the validators are presented keeper.SetValidatorByPowerIndex(ctx, validator, data.Pool) if validator.Status == sdk.Bonded { diff --git a/x/stake/genesis_test.go b/x/stake/genesis_test.go index 2faff5bc02..e27c7fed2c 100644 --- a/x/stake/genesis_test.go +++ b/x/stake/genesis_test.go @@ -14,23 +14,35 @@ func TestInitGenesis(t *testing.T) { ctx, _, keeper := keep.CreateTestInput(t, false, 1000) pool := keeper.GetPool(ctx) - pool.LooseTokens = sdk.OneRat() + pool.LooseTokens = sdk.NewRat(2) params := keeper.GetParams(ctx) var delegations []Delegation validators := []Validator{ NewValidator(keep.Addrs[0], keep.PKs[0], Description{Moniker: "hoop"}), + NewValidator(keep.Addrs[1], keep.PKs[1], Description{Moniker: "bloop"}), } - genesisState := types.NewGenesisState(pool, params, validators, delegations) err := InitGenesis(ctx, keeper, genesisState) require.Error(t, err) + // initialize the validators validators[0].Tokens = sdk.OneRat() validators[0].DelegatorShares = sdk.OneRat() + validators[1].Tokens = sdk.OneRat() + validators[1].DelegatorShares = sdk.OneRat() genesisState = types.NewGenesisState(pool, params, validators, delegations) err = InitGenesis(ctx, keeper, genesisState) require.NoError(t, err) + + // now make sure the validators are bonded + resVal, found := keeper.GetValidator(ctx, keep.Addrs[0]) + require.True(t, found) + require.Equal(t, sdk.Bonded, resVal.Status) + + resVal, found = keeper.GetValidator(ctx, keep.Addrs[1]) + require.True(t, found) + require.Equal(t, sdk.Bonded, resVal.Status) } diff --git a/x/stake/types/validator.go b/x/stake/types/validator.go index ed109830f0..f177c123d0 100644 --- a/x/stake/types/validator.go +++ b/x/stake/types/validator.go @@ -147,6 +147,34 @@ func UnmarshalValidator(cdc *wire.Codec, ownerAddr, value []byte) (validator Val }, nil } +// HumanReadableString returns a human readable string representation of a +// validator. An error is returned if the owner or the owner's public key +// cannot be converted to Bech32 format. +func (v Validator) HumanReadableString() (string, error) { + bechVal, err := sdk.Bech32ifyValPub(v.PubKey) + if err != nil { + return "", err + } + + resp := "Validator \n" + resp += fmt.Sprintf("Owner: %s\n", v.Owner) + resp += fmt.Sprintf("Validator: %s\n", bechVal) + resp += fmt.Sprintf("Revoked: %v\n", v.Revoked) + resp += fmt.Sprintf("Status: %s\n", sdk.BondStatusToString(v.Status)) + resp += fmt.Sprintf("Tokens: %s\n", v.Tokens.FloatString()) + resp += fmt.Sprintf("Delegator Shares: %s\n", v.DelegatorShares.FloatString()) + resp += fmt.Sprintf("Description: %s\n", v.Description) + resp += fmt.Sprintf("Bond Height: %d\n", v.BondHeight) + resp += fmt.Sprintf("Proposer Reward Pool: %s\n", v.ProposerRewardPool.String()) + resp += fmt.Sprintf("Commission: %s\n", v.Commission.String()) + resp += fmt.Sprintf("Max Commission Rate: %s\n", v.CommissionMax.String()) + resp += fmt.Sprintf("Commission Change Rate: %s\n", v.CommissionChangeRate.String()) + resp += fmt.Sprintf("Commission Change Today: %s\n", v.CommissionChangeToday.String()) + resp += fmt.Sprintf("Previous Bonded Tokens: %s\n", v.LastBondedTokens.String()) + + return resp, nil +} + //___________________________________________________________________ // validator struct for bech output @@ -408,30 +436,3 @@ func (v Validator) GetPubKey() crypto.PubKey { return v.PubKey } func (v Validator) GetPower() sdk.Rat { return v.BondedTokens() } func (v Validator) GetDelegatorShares() sdk.Rat { return v.DelegatorShares } func (v Validator) GetBondHeight() int64 { return v.BondHeight } - -// HumanReadableString returns a human readable string representation of a -// validator. An error is returned if the owner or the owner's public key -// cannot be converted to Bech32 format. -func (v Validator) HumanReadableString() (string, error) { - bechVal, err := sdk.Bech32ifyValPub(v.PubKey) - if err != nil { - return "", err - } - - resp := "Validator \n" - resp += fmt.Sprintf("Owner: %s\n", v.Owner) - resp += fmt.Sprintf("Validator: %s\n", bechVal) - resp += fmt.Sprintf("Status: %s\n", sdk.BondStatusToString(v.Status)) - resp += fmt.Sprintf("Tokens: %s\n", v.Tokens.FloatString()) - resp += fmt.Sprintf("Delegator Shares: %s\n", v.DelegatorShares.FloatString()) - resp += fmt.Sprintf("Description: %s\n", v.Description) - resp += fmt.Sprintf("Bond Height: %d\n", v.BondHeight) - resp += fmt.Sprintf("Proposer Reward Pool: %s\n", v.ProposerRewardPool.String()) - resp += fmt.Sprintf("Commission: %s\n", v.Commission.String()) - resp += fmt.Sprintf("Max Commission Rate: %s\n", v.CommissionMax.String()) - resp += fmt.Sprintf("Commission Change Rate: %s\n", v.CommissionChangeRate.String()) - resp += fmt.Sprintf("Commission Change Today: %s\n", v.CommissionChangeToday.String()) - resp += fmt.Sprintf("Previous Bonded Tokens: %s\n", v.LastBondedTokens.String()) - - return resp, nil -} From cbf432d34cbd0f6e7271286e782f6bade3de78f9 Mon Sep 17 00:00:00 2001 From: Christopher Goes Date: Thu, 19 Jul 2018 02:42:19 +0200 Subject: [PATCH 30/30] Merge PR #1746: Remove ctx.IsCheckTx * Remove ctx.IsCheckTx * Changelog to Pending * Typo * Simulate instead of Check in SignCheckDeliver * Add descriptive comment * Change to 'CheckTx implements ABCI' * Alphabetize changelog --- CHANGELOG.md | 17 ----------------- PENDING.md | 17 +++++++++++++++++ baseapp/baseapp.go | 25 ++++++++++++++----------- examples/democoin/x/cool/handler.go | 4 ---- examples/democoin/x/pow/handler.go | 8 -------- types/context.go | 8 -------- x/mock/test_utils.go | 3 ++- x/slashing/app_test.go | 2 +- x/slashing/handler.go | 4 ---- 9 files changed, 34 insertions(+), 54 deletions(-) create mode 100644 PENDING.md diff --git a/CHANGELOG.md b/CHANGELOG.md index fc69ff9d41..29d753a6dc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,22 +1,5 @@ # Changelog -## PENDING - -BREAKING CHANGES -* [x/stake] Fixed the period check for the inflation calculation - -FEATURES -* [lcd] Can now query governance proposals by ProposalStatus - -IMPROVEMENTS -* [baseapp] Allow any alphanumeric character in route -* [x/stake] Add revoked to human-readable validator -* [cli] Improve error messages for all txs when the account doesn't exist -* [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` - -BUG FIXES -* \#1666 Add intra-tx counter to the genesis validators - ## 0.22.0 *July 16th, 2018* diff --git a/PENDING.md b/PENDING.md new file mode 100644 index 0000000000..3d6d0d92de --- /dev/null +++ b/PENDING.md @@ -0,0 +1,17 @@ +## PENDING + +BREAKING CHANGES +* [baseapp] Msgs are no longer run on CheckTx, removed `ctx.IsCheckTx()` +* [x/stake] Fixed the period check for the inflation calculation + +FEATURES +* [lcd] Can now query governance proposals by ProposalStatus + +IMPROVEMENTS +* [baseapp] Allow any alphanumeric character in route +* [cli] Improve error messages for all txs when the account doesn't exist +* [tools] Remove `rm -rf vendor/` from `make get_vendor_deps` +* [x/stake] Add revoked to human-readable validator + +BUG FIXES +* \#1666 Add intra-tx counter to the genesis validators diff --git a/baseapp/baseapp.go b/baseapp/baseapp.go index 40b3c2bc17..da75591a2c 100644 --- a/baseapp/baseapp.go +++ b/baseapp/baseapp.go @@ -436,7 +436,11 @@ func (app *BaseApp) BeginBlock(req abci.RequestBeginBlock) (res abci.ResponseBeg return } -// Implements ABCI +// CheckTx implements ABCI +// CheckTx runs the "basic checks" to see whether or not a transaction can possibly be executed, +// first decoding, then the ante handler (which checks signatures/fees/ValidateBasic), +// then finally the route match to see whether a handler exists. CheckTx does not run the actual +// Msg handler function(s). func (app *BaseApp) CheckTx(txBytes []byte) (res abci.ResponseCheckTx) { // Decode the Tx. var result sdk.Result @@ -514,16 +518,11 @@ func (app *BaseApp) getContextForAnte(mode runTxMode, txBytes []byte) (ctx sdk.C ctx = ctx.WithSigningValidators(app.signedValidators) } - // Simulate a DeliverTx for gas calculation - if mode == runTxModeSimulate { - ctx = ctx.WithIsCheckTx(false) - } - return } // Iterates through msgs and executes them -func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg) (result sdk.Result) { +func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg, mode runTxMode) (result sdk.Result) { // accumulate results logs := make([]string, 0, len(msgs)) var data []byte // NOTE: we just append them all (?!) @@ -537,7 +536,11 @@ func (app *BaseApp) runMsgs(ctx sdk.Context, msgs []sdk.Msg) (result sdk.Result) return sdk.ErrUnknownRequest("Unrecognized Msg type: " + msgType).Result() } - msgResult := handler(ctx, msg) + var msgResult sdk.Result + // Skip actual execution for CheckTx + if mode != runTxModeCheck { + msgResult = handler(ctx, msg) + } // NOTE: GasWanted is determined by ante handler and // GasUsed by the GasMeter @@ -615,9 +618,9 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk // run the ante handler if app.anteHandler != nil { - newCtx, anteResult, abort := app.anteHandler(ctx, tx) + newCtx, result, abort := app.anteHandler(ctx, tx) if abort { - return anteResult + return result } if !newCtx.IsZero() { ctx = newCtx @@ -636,7 +639,7 @@ func (app *BaseApp) runTx(mode runTxMode, txBytes []byte, tx sdk.Tx) (result sdk } ctx = ctx.WithMultiStore(msCache) - result = app.runMsgs(ctx, msgs) + result = app.runMsgs(ctx, msgs, mode) result.GasWanted = gasWanted // only update state if all messages pass and we're not in a simulation diff --git a/examples/democoin/x/cool/handler.go b/examples/democoin/x/cool/handler.go index 82247677cb..f8c32be81d 100644 --- a/examples/democoin/x/cool/handler.go +++ b/examples/democoin/x/cool/handler.go @@ -47,10 +47,6 @@ func handleMsgQuiz(ctx sdk.Context, k Keeper, msg MsgQuiz) sdk.Result { return ErrIncorrectCoolAnswer(k.codespace, msg.CoolAnswer).Result() } - if ctx.IsCheckTx() { - return sdk.Result{} // TODO - } - bonusCoins := sdk.Coins{sdk.NewCoin(msg.CoolAnswer, 69)} _, _, err := k.ck.AddCoins(ctx, msg.Sender, bonusCoins) diff --git a/examples/democoin/x/pow/handler.go b/examples/democoin/x/pow/handler.go index 2dd549bde7..e4fa39d1da 100644 --- a/examples/democoin/x/pow/handler.go +++ b/examples/democoin/x/pow/handler.go @@ -26,14 +26,6 @@ func handleMsgMine(ctx sdk.Context, pk Keeper, msg MsgMine) sdk.Result { return err.Result() } - // commented for now, makes testing difficult - // TODO figure out a better test method that allows early CheckTx return - /* - if ctx.IsCheckTx() { - return sdk.Result{} // TODO - } - */ - err = pk.ApplyValid(ctx, msg.Sender, newDiff, newCount) if err != nil { return err.Result() diff --git a/types/context.go b/types/context.go index e55eff1ab0..064625028e 100644 --- a/types/context.go +++ b/types/context.go @@ -41,7 +41,6 @@ func NewContext(ms MultiStore, header abci.Header, isCheckTx bool, logger log.Lo c = c.WithBlockHeader(header) c = c.WithBlockHeight(header.Height) c = c.WithChainID(header.ChainID) - c = c.WithIsCheckTx(isCheckTx) c = c.WithTxBytes(nil) c = c.WithLogger(logger) c = c.WithSigningValidators(nil) @@ -127,7 +126,6 @@ const ( contextKeyBlockHeader contextKeyBlockHeight contextKeyChainID - contextKeyIsCheckTx contextKeyTxBytes contextKeyLogger contextKeySigningValidators @@ -151,9 +149,6 @@ func (c Context) BlockHeight() int64 { func (c Context) ChainID() string { return c.Value(contextKeyChainID).(string) } -func (c Context) IsCheckTx() bool { - return c.Value(contextKeyIsCheckTx).(bool) -} func (c Context) TxBytes() []byte { return c.Value(contextKeyTxBytes).([]byte) } @@ -179,9 +174,6 @@ func (c Context) WithBlockHeight(height int64) Context { func (c Context) WithChainID(chainID string) Context { return c.withValue(contextKeyChainID, chainID) } -func (c Context) WithIsCheckTx(isCheckTx bool) Context { - return c.withValue(contextKeyIsCheckTx, isCheckTx) -} func (c Context) WithTxBytes(txBytes []byte) Context { return c.withValue(contextKeyTxBytes, txBytes) } diff --git a/x/mock/test_utils.go b/x/mock/test_utils.go index f9e1e8f5e9..c3179849d7 100644 --- a/x/mock/test_utils.go +++ b/x/mock/test_utils.go @@ -46,7 +46,8 @@ func SignCheckDeliver( seq []int64, expPass bool, priv ...crypto.PrivKey, ) sdk.Result { tx := GenTx(msgs, accNums, seq, priv...) - res := app.Check(tx) + // Must simulate now as CheckTx doesn't run Msgs anymore + res := app.Simulate(tx) if expPass { require.Equal(t, sdk.ABCICodeOK, res.Code, res.Log) diff --git a/x/slashing/app_test.go b/x/slashing/app_test.go index 4531c3882c..f5f8c98f8c 100644 --- a/x/slashing/app_test.go +++ b/x/slashing/app_test.go @@ -113,6 +113,6 @@ func TestSlashingMsgs(t *testing.T) { checkValidatorSigningInfo(t, mapp, keeper, sdk.ValAddress(addr1), false) // unrevoke should fail with unknown validator - res := mock.CheckGenTx(t, mapp.BaseApp, []sdk.Msg{unrevokeMsg}, []int64{0}, []int64{1}, false, priv1) + res := mock.SignCheckDeliver(t, mapp.BaseApp, []sdk.Msg{unrevokeMsg}, []int64{0}, []int64{1}, false, priv1) require.Equal(t, sdk.ToABCICode(DefaultCodespace, CodeValidatorNotRevoked), res.Code) } diff --git a/x/slashing/handler.go b/x/slashing/handler.go index 3991bc2229..19a48b448e 100644 --- a/x/slashing/handler.go +++ b/x/slashing/handler.go @@ -43,10 +43,6 @@ func handleMsgUnrevoke(ctx sdk.Context, msg MsgUnrevoke, k Keeper) sdk.Result { return ErrValidatorJailed(k.codespace).Result() } - if ctx.IsCheckTx() { - return sdk.Result{} - } - // Update the starting height (so the validator can't be immediately revoked again) info.StartHeight = ctx.BlockHeight() k.setValidatorSigningInfo(ctx, addr, info)