diff --git a/tendermint-rs/src/lib.rs b/tendermint-rs/src/lib.rs index d1f93db..4a587dd 100644 --- a/tendermint-rs/src/lib.rs +++ b/tendermint-rs/src/lib.rs @@ -52,7 +52,9 @@ mod serializers; pub mod signature; pub mod timestamp; pub mod transaction; +pub mod validator; mod version; +pub mod vote; #[cfg(feature = "rpc")] pub use crate::genesis::Genesis; diff --git a/tendermint-rs/src/rpc/endpoint.rs b/tendermint-rs/src/rpc/endpoint.rs index 874f92c..3bb3cce 100644 --- a/tendermint-rs/src/rpc/endpoint.rs +++ b/tendermint-rs/src/rpc/endpoint.rs @@ -4,3 +4,4 @@ pub mod block; pub mod genesis; pub mod net_info; pub mod status; +pub mod validators; diff --git a/tendermint-rs/src/rpc/endpoint/block.rs b/tendermint-rs/src/rpc/endpoint/block.rs index ac904d7..96ba1a3 100644 --- a/tendermint-rs/src/rpc/endpoint/block.rs +++ b/tendermint-rs/src/rpc/endpoint/block.rs @@ -13,7 +13,7 @@ pub struct Request { impl Request { /// Create a new request for information about a particular block - pub fn new(height: block::Height) -> Self { + pub fn new(height: block::Height) -> Self { Self { height } } } diff --git a/tendermint-rs/src/rpc/endpoint/status.rs b/tendermint-rs/src/rpc/endpoint/status.rs index 17a6bea..8e23c9b 100644 --- a/tendermint-rs/src/rpc/endpoint/status.rs +++ b/tendermint-rs/src/rpc/endpoint/status.rs @@ -1,7 +1,7 @@ //! `/status` endpoint JSONRPC wrapper -use crate::{account, block, node, rpc, Hash, PublicKey, Timestamp}; -use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize, Serializer}; +use crate::{block, node, rpc, validator, Hash, Timestamp}; +use serde::{Deserialize, Serialize}; /// Node status request #[derive(Debug, Default)] @@ -25,7 +25,7 @@ pub struct Response { pub sync_info: SyncInfo, /// Validator information - pub validator_info: ValidatorInfo, + pub validator_info: validator::Info, } impl rpc::Response for Response {} @@ -48,54 +48,3 @@ pub struct SyncInfo { /// Are we catching up? pub catching_up: bool, } - -/// Validator information -#[derive(Clone, Debug, Deserialize, Serialize)] -pub struct ValidatorInfo { - /// Validator account address - pub address: account::Id, - - /// Validator public key - pub pub_key: PublicKey, - - /// Validator voting power - pub voting_power: VotingPower, -} - -/// Voting power -#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] -pub struct VotingPower(u64); - -impl VotingPower { - /// Get the current voting power - pub fn value(self) -> u64 { - self.0 - } - - /// Is the current voting power zero? - pub fn is_zero(self) -> bool { - self.0 == 0 - } -} - -impl From for u64 { - fn from(power: VotingPower) -> u64 { - power.0 - } -} - -impl<'de> Deserialize<'de> for VotingPower { - fn deserialize>(deserializer: D) -> Result { - Ok(VotingPower( - String::deserialize(deserializer)? - .parse() - .map_err(|e| D::Error::custom(format!("{}", e)))?, - )) - } -} - -impl Serialize for VotingPower { - fn serialize(&self, serializer: S) -> Result { - self.0.to_string().serialize(serializer) - } -} diff --git a/tendermint-rs/src/rpc/endpoint/validators.rs b/tendermint-rs/src/rpc/endpoint/validators.rs new file mode 100644 index 0000000..244ea4f --- /dev/null +++ b/tendermint-rs/src/rpc/endpoint/validators.rs @@ -0,0 +1,39 @@ +//! `/validators` endpoint JSONRPC wrapper + +use crate::{block, rpc, validator}; +use serde::{Deserialize, Serialize}; + +/// List validators for a specific block +pub struct Request { + height: block::Height, +} + +impl Request { + /// List validators for a specific block + pub fn new(height: block::Height) -> Self { + Self { height } + } +} + +impl rpc::Request for Request { + type Response = Response; + + fn path(&self) -> rpc::request::Path { + // TODO(tarcieri): use a `uri` crate to construct this? + format!("/validators?height={}", self.height) + .parse() + .unwrap() + } +} + +/// Validator responses +#[derive(Clone, Debug, Deserialize, Serialize)] +pub struct Response { + /// Block height + pub block_height: block::Height, + + /// Validator list + pub validators: Vec, +} + +impl rpc::Response for Response {} diff --git a/tendermint-rs/src/validator.rs b/tendermint-rs/src/validator.rs new file mode 100644 index 0000000..5301400 --- /dev/null +++ b/tendermint-rs/src/validator.rs @@ -0,0 +1,57 @@ +//! Tendermint validators + +use crate::{account, vote, PublicKey}; +#[cfg(feature = "serde")] +use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize, Serializer}; + +/// Validator information +#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] +#[derive(Clone, Debug)] +pub struct Info { + /// Validator account address + pub address: account::Id, + + /// Validator public key + pub pub_key: PublicKey, + + /// Validator voting power + pub voting_power: vote::Power, + + /// Validator proposer priority + pub proposer_priority: Option, +} + +/// Proposer priority +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +pub struct ProposerPriority(i64); + +impl ProposerPriority { + /// Get the current voting power + pub fn value(self) -> i64 { + self.0 + } +} + +impl From for i64 { + fn from(priority: ProposerPriority) -> i64 { + priority.value() + } +} + +#[cfg(feature = "serde")] +impl<'de> Deserialize<'de> for ProposerPriority { + fn deserialize>(deserializer: D) -> Result { + Ok(ProposerPriority( + String::deserialize(deserializer)? + .parse() + .map_err(|e| D::Error::custom(format!("{}", e)))?, + )) + } +} + +#[cfg(feature = "serde")] +impl Serialize for ProposerPriority { + fn serialize(&self, serializer: S) -> Result { + self.0.to_string().serialize(serializer) + } +} diff --git a/tendermint-rs/src/vote.rs b/tendermint-rs/src/vote.rs new file mode 100644 index 0000000..3e0fae2 --- /dev/null +++ b/tendermint-rs/src/vote.rs @@ -0,0 +1,44 @@ +//! Votes + +#[cfg(feature = "serde")] +pub use serde::{de::Error as DeError, Deserialize, Deserializer, Serialize, Serializer}; + +/// Voting power +#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)] +pub struct Power(u64); + +impl Power { + /// Get the current voting power + pub fn value(self) -> u64 { + self.0 + } + + /// Is the current voting power zero? + pub fn is_zero(self) -> bool { + self.0 == 0 + } +} + +impl From for u64 { + fn from(power: Power) -> u64 { + power.0 + } +} + +#[cfg(feature = "serde")] +impl<'de> Deserialize<'de> for Power { + fn deserialize>(deserializer: D) -> Result { + Ok(Power( + String::deserialize(deserializer)? + .parse() + .map_err(|e| D::Error::custom(format!("{}", e)))?, + )) + } +} + +#[cfg(feature = "serde")] +impl Serialize for Power { + fn serialize(&self, serializer: S) -> Result { + self.0.to_string().serialize(serializer) + } +} diff --git a/tendermint-rs/tests/rpc.rs b/tendermint-rs/tests/rpc.rs index 60dc46d..23ed019 100644 --- a/tendermint-rs/tests/rpc.rs +++ b/tendermint-rs/tests/rpc.rs @@ -6,7 +6,7 @@ mod endpoints { use tendermint::rpc::{endpoint, Response}; fn read_json_fixture(name: &str) -> String { - fs::read_to_string(PathBuf::from("./tests/support/").join(name.to_owned() + ".json")) + fs::read_to_string(PathBuf::from("./tests/support/rpc/").join(name.to_owned() + ".json")) .unwrap() } @@ -71,4 +71,13 @@ mod endpoints { ); assert_eq!(status_response.validator_info.voting_power.value(), 0); } + + #[test] + fn validators() { + let validators_json = read_json_fixture("validators"); + let validators_response = + endpoint::validators::Response::from_json(&validators_json).unwrap(); + + println!("validators: {:?}", validators_response); + } } diff --git a/tendermint-rs/tests/support/block.json b/tendermint-rs/tests/support/rpc/block.json similarity index 100% rename from tendermint-rs/tests/support/block.json rename to tendermint-rs/tests/support/rpc/block.json diff --git a/tendermint-rs/tests/support/genesis.json b/tendermint-rs/tests/support/rpc/genesis.json similarity index 100% rename from tendermint-rs/tests/support/genesis.json rename to tendermint-rs/tests/support/rpc/genesis.json diff --git a/tendermint-rs/tests/support/net_info.json b/tendermint-rs/tests/support/rpc/net_info.json similarity index 100% rename from tendermint-rs/tests/support/net_info.json rename to tendermint-rs/tests/support/rpc/net_info.json diff --git a/tendermint-rs/tests/support/status.json b/tendermint-rs/tests/support/rpc/status.json similarity index 100% rename from tendermint-rs/tests/support/status.json rename to tendermint-rs/tests/support/rpc/status.json diff --git a/tendermint-rs/tests/support/rpc/validators.json b/tendermint-rs/tests/support/rpc/validators.json new file mode 100644 index 0000000..056ddd3 --- /dev/null +++ b/tendermint-rs/tests/support/rpc/validators.json @@ -0,0 +1,594 @@ +{ + "jsonrpc": "2.0", + "id": "", + "result": { + "block_height": "42", + "validators": [ + { + "address": "000001E443FD237E4B616E2FA69DF4EE3D49A94F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "9tK9IT+FPdf2qm+5c2qaxi10sWP+3erWTKgftn2PaQM=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "000AA5ABF590A815EBCBDAE070AFF50BE571EB8B", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "yWPYIfSf5yi/MlBzEZx2yMhOJ/daXRx8Eg3NOso8V7c=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "02A248C86C78ED6A824D510A8B7AA4C1D290D2DC", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "by0WjAY1EHgpi2fCIvggfrmvZdOjl+GpyGLnlySbIVE=" + }, + "voting_power": "100000", + "proposer_priority": "-987557" + }, + { + "address": "064CF05857B556FED63AC32821FF904312D0F2C8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "zXKJLZjLusy5tRs5bNoafLPTB5LLP6tZGHSeG4TIRGE=" + }, + "voting_power": "100000", + "proposer_priority": "-987557" + }, + { + "address": "099E2B09583331AFDE35E5FA96673D2CA7DEA316", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "e3BehnEIlGUAnJYn9V8gBXuMh4tXO8xxlxyXD1APGyk=" + }, + "voting_power": "30000", + "proposer_priority": "-2116475" + }, + { + "address": "18C78D135C9D81D74F6234DBD268C47F0F89E844", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "FrxZm4ptkt0QtyLA5iVCqTmWD6AlrbVXVeornQlePeI=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "1E9CE94FD0BA5CFEB901F90BC658D64D85B134D2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TwzOJ4GcN+ZTswub4R8488SrKeWXjY/PaqCF5neXJig=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "2199EAE894CA391FA82F01C2C614BFEB103D056C", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "C+VWc34ZF6n/QoIAXo4191OwKxQWpbFnrGKCqcNbe1E=" + }, + "voting_power": "100000", + "proposer_priority": "-987557" + }, + { + "address": "2B19594437F1920B5AF6461FAB81AEC99790FEB1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Sj+idSMfzPh20CuVPqQr3H7NsE5rr7ZAGzV/rEwJn6E=" + }, + "voting_power": "200000", + "proposer_priority": "212443" + }, + { + "address": "2C9CCC317FB283D54AC748838A64F29106039E51", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ZOvaws6Rz4Pl8mThEEh3IR7rsnx213jY9smYC1GcC6o=" + }, + "voting_power": "500", + "proposer_priority": "20500" + }, + { + "address": "31920F9BC3A39B66876CC7D6D5E589E10393BF0E", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lh/p8UTp1kF8+4noOeInUG3PuWpFzk6Mnopj0updt4I=" + }, + "voting_power": "4500", + "proposer_priority": "184500" + }, + { + "address": "3363E8F97B02ECC00289E72173D827543047ACDA", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "mPnu910hOOa1tAQ7pbOLFDxvllbQUmrbtGjqQrYg1nM=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "42D6705E716616B4A5442BDAA050B7C6E9FDDE43", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K7PFMeLp0twwz3RDAvlWoz0N6vTsCg6KeKx8xwUm5Hw=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "4906F2A5334D906A4C63F9E9D61527A9F593C4EF", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "1o6K5D3m5LNGg7R5gSp/37/hcy6y32FxaC3v09Cikbc=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "49BBFB1BA1A75052E3226E8E1E0EFEB33918B8B2", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "fjKz5EcrpVII/MzwTF/d+3FHEIMJtSZfU9WMaH+b/Ok=" + }, + "voting_power": "100000", + "proposer_priority": "-1097557" + }, + { + "address": "4C92230FAC162303D981C06DD22663A4FC7622BC", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QahmjM81l/oM+Yu8yUVFSi8UzyE/boMd6vTbSdpGFwE=" + }, + "voting_power": "10000", + "proposer_priority": "410000" + }, + { + "address": "4E9CB39F4B1FA617339744A5600B62802652D69C", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "nO6jz/KlIYiooQzvgbzG9bmCsnAMWhdhR3Nvcy5Y9JM=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "51DB2566204EE266427EA8A6CB719835AB170BE9", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ovdfH/edW89+uiB0lHC5OnCbQfKtkn8G1RHZiOP4sYQ=" + }, + "voting_power": "511", + "proposer_priority": "20951" + }, + { + "address": "57FEB2461AA77EC70036C636890B8F47CB4FCB0D", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SC5O3o35vzC4Z4RbtfltO6kOIewKd7na5XcITeOXvQQ=" + }, + "voting_power": "21", + "proposer_priority": "861" + }, + { + "address": "5AB353B748D45F20DFCE19D73BA89F26E1C34CF7", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "P4WJpPDdcu7iXUg5JOWLOO7pUBYvHLNXKTlwvgNzbbI=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "671460930CCDC9B06C5D055E4D550EB8DAF2291E", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2k346W3w8NFAQh21j1hBp+Mvur+ZhHFuEQk8DEOlN+c=" + }, + "voting_power": "5020", + "proposer_priority": "205260" + }, + { + "address": "679B89785973BE94D4FDF8B66F84A929932E91C5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Roh99RlsnDKHUFYUcQVHk2S84NeZfZdpc+CBb6NREhM=" + }, + "voting_power": "20", + "proposer_priority": "820" + }, + { + "address": "696ABC95186FD65A07050C28AB00C9358A315030", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "GghJGDl/JZSZ07B2ARdvvJ8SPKtoi/dh8PbYSui359I=" + }, + "voting_power": "1", + "proposer_priority": "41" + }, + { + "address": "6F5F44F6FD7CD1642FFB8B12215BAE814A1BE08C", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "4FAoNAp3t+9epiDWRwjH38E5F9zDWet3ufHdQPjdaBM=" + }, + "voting_power": "20000", + "proposer_priority": "820000" + }, + { + "address": "70C5B4E6779C59A24CFD9146581E27021C2AEC26", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "aek+Unn7MEILEBjeTqP3ONLJ6wwoQxC+6NuXY90xx0Q=" + }, + "voting_power": "6500", + "proposer_priority": "266500" + }, + { + "address": "732CEEF54C374DDC6ADECBFD707AEFD07FEDC143", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + }, + "voting_power": "3000", + "proposer_priority": "123000" + }, + { + "address": "77064757FCC7828F98B33525B4599DB0FD08DC37", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cLeIVsGGVkt5M/YExv5I67pYj1uYmYcsvY60PIVIxB4=" + }, + "voting_power": "42", + "proposer_priority": "1722" + }, + { + "address": "7B3A2EFE5B3FCDF819FCF52607314CEFE4754BB6", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "11pGwt6bot1EC5xeug8mulFNBBWsHV+X7XrxLUmTNF8=" + }, + "voting_power": "4500", + "proposer_priority": "184500" + }, + { + "address": "7F225CB9ACF7D34C993807A7F9CB3B2851386DE1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "v6sR0bx6aRF0QxLbyIpKW4MTk9ndKf33PDN/uffH6NA=" + }, + "voting_power": "100", + "proposer_priority": "4100" + }, + { + "address": "808D6B054A0B6D3FF5F5EAF0A65CFC64C543F833", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "486fL5jJ7HOtGXXdkei2Sy1OijidPiiw4b/OhnCzNw4=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "81965FE8A15FA8078C9202F32E4CFA72F85F2A22", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "PflSgb+lC1GI22wc6N/54cNzD7KSYQyCWR5LuQxjYVY=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "8328647F309C8AA148CDA5595145E13E455CA704", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AmPqEmF5YNmlv2vu8lEcDeQ3hyR+lymnqx2VixdMEzA=" + }, + "voting_power": "12680", + "proposer_priority": "519880" + }, + { + "address": "91C823A744DE50F91C17A46B624EDF8F7150A7DD", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "/VS/bgueXBoNDsrzxxaX64RIL//2wHb9VZ0Jd67+AqQ=" + }, + "voting_power": "595150", + "proposer_priority": "-474858" + }, + { + "address": "95E060D07713070FE9822F6C50BD76BCCBF9F17A", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ahgQzIOmCh5+A9iGXJRh8AKNlk4NCcOiPebzZEuIN3A=" + }, + "voting_power": "1117675", + "proposer_priority": "324236" + }, + { + "address": "991B742CC8660B40321F77873644C195195D4178", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "2HcS9L0H/gGduyui5z4BeyKmMDcG0GWp6Qu8WpekvcE=" + }, + "voting_power": "20000", + "proposer_priority": "820000" + }, + { + "address": "9C17C94F7313BB4D6E064287BEEDE5D3888E8855", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Mvh+7UDaXgmj4Fst0ZUdx++MJmoq4B9M6mdgNc8H2pM=" + }, + "voting_power": "100000", + "proposer_priority": "-1097557" + }, + { + "address": "9D07B301D23C547266D55D1B6C5A78CA473383A1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "oVap7iG9La5g76ufP2SaLz55rzlTSV833KRAqp+NOpU=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "9EE94DBB86F72337192BF291B0E767FD2729F00A", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "hATVIEvJ1NEt5g9i59iH+a8oaEFtErP227Qw7kgpWTc=" + }, + "voting_power": "14750", + "proposer_priority": "604750" + }, + { + "address": "AC2D56057CD84765E6FBE318979093E8E44AA18F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "0kNlxBMpm+5WtfHIG1xsWatOXTKPLtmSqn3EiEIDZeI=" + }, + "voting_power": "19000", + "proposer_priority": "779000" + }, + { + "address": "B00A6323737F321EB0B8D59C6FD497A14B60938A", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "cOQZvh/h9ZioSeUMZB/1Vy1Xo5x2sjrVjlE/qHnYifM=" + }, + "voting_power": "397062", + "proposer_priority": "1874734" + }, + { + "address": "B0155252D73B7EEB74D2A8CC814397E66970A839", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "w3rKE+tQoLK8G+XPmjn+NszCk07iQ0sWaBbN5hQZcBY=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "B0765A2F6FCC11D8AC46275FAC06DD35F54217C1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "inTpwtq2gc0g86M+Sovdk7wCxe68QG0Kxr2XO9S/q+0=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "B34591DA79AAD0213534E2E915F50DE5CDBDF250", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "m0thJvdnGUsrANKJx+aM9Em4IN17v5mXHilLzDkeujQ=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "B4E1085F1C9EBB0EA994452CB1B8124BA89BED1A", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "+LbXwDMu37jkBRBLFtXazRfEd2ytSAkIncZ/Ng+6jVI=" + }, + "voting_power": "20000", + "proposer_priority": "820000" + }, + { + "address": "B543A7DF48780AEFEF593A003CD060B593C4E6B5", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KjPuAGkJQWb0ImqKuS3DAFat7LvIVmiWhEGRur1twck=" + }, + "voting_power": "1495", + "proposer_priority": "61295" + }, + { + "address": "B6C5D0EEBE1ABB66039A90B80820C10A9CBCA95C", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "AQJie+dfWUVPM0GPmCUqvFnjr6AMogDjiCPHaOc+LA0=" + }, + "voting_power": "100", + "proposer_priority": "4100" + }, + { + "address": "BAC33F340F3497751F124868F049EC2E8930AC2F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "9KA7fKlALPdKPb7SM4UGlpnbSU4U9U1A4c3u8V2KdTs=" + }, + "voting_power": "131140", + "proposer_priority": "-93897" + }, + { + "address": "BF4CB4D59D19D451CF5E7BC49349DF4AA222D78B", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "eInQcvrB2bkkSV1jwBPpVmUgywzgVCGuFqv4QRzQAos=" + }, + "voting_power": "1490", + "proposer_priority": "61090" + }, + { + "address": "C2356622B495725961B5B201A382DD57CD3305EC", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pZBzfgX8aJXz9tqGvz75NnJB0wAFsMrfxY6FTnYMZ0Q=" + }, + "voting_power": "100000", + "proposer_priority": "-1197557" + }, + { + "address": "C52ACDB32057F5C731BBDD48460B93C3500DD324", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lgJcii0W2QanDlXpb/9gZJAJ3X9l+tqArhYAmNUJ1lw=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "C6D8D6D4DD2A41D2D1B53982196519FA314E7CB4", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "QWI1AcmT2WF8+2DewC5iVywd18elt9doqkegXVXV2yM=" + }, + "voting_power": "20000", + "proposer_priority": "820000" + }, + { + "address": "CA6696F5FE66A480BF21460319BE979930852DD0", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "xQim88WOJcW/E9M8u4Ym+wN0Itoa1Nu4ubS/2jl236c=" + }, + "voting_power": "13000", + "proposer_priority": "533000" + }, + { + "address": "CC05882978FC5FDD6A7721687E14C0299AE004B8", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "fUj2rJ8mWqSdo8FX47dhWni++/oxOSduCBgymD4GCiU=" + }, + "voting_power": "50000", + "proposer_priority": "-152660" + }, + { + "address": "CEB8DB4286061B32209D33E2ADF6756ACDD7E005", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "pDgRB4ZUupIx+gOU2bXpFC7VZnvPSiz2xc74pK6Dgec=" + }, + "voting_power": "1000", + "proposer_priority": "41000" + }, + { + "address": "D14A542E8756C3A942D9FD8873DC2E9A7798A17F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "Zvd+ILfG9q1jPnZfOOYdZOuNLThLdCRPkvRV+HrXkCs=" + }, + "voting_power": "1500", + "proposer_priority": "61500" + }, + { + "address": "D3DB7197312CD60A71E291A66D430B20D197CF41", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "K9Sxg6Dc+9JR161k2R/yCoGeIQcenTp1OzCcEZFPo14=" + }, + "voting_power": "100000", + "proposer_priority": "-1197567" + }, + { + "address": "D4C63291134A25AB7E0AF43C08039341D733733B", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "MN4/P8vTZE2djhgiWXuVXHEoG1br+vP3LipBc92Uekg=" + }, + "voting_power": "1000", + "proposer_priority": "41000" + }, + { + "address": "D9F8A41B782AA6A66ADC81F953923C7DCE7B6001", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "n9bW9hmvwSwm/AnJtDwZNGA+2RSoQsfoMFsc2Rrb0vY=" + }, + "voting_power": "4800", + "proposer_priority": "196800" + }, + { + "address": "DA6AAAA959C9EF88A3EB37B1F107CB2667EBBAAB", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "KbhRasSMxRtStejqK/Ayzexm/DtavlfbNjWGznPXMlE=" + }, + "voting_power": "4900", + "proposer_priority": "200900" + }, + { + "address": "E800740C68C81B30345C3AE2BA638FA56FF67EEF", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "vvSJSs7OAESNGSF1CnA+aOcAz/VcRtH4qB2/ZBUp0Lo=" + }, + "voting_power": "100000", + "proposer_priority": "-1197567" + }, + { + "address": "EE73A19751D58C5EC044C11E3FB7AE685A10D2C1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "lObsqlAjmPsnBfBE+orb8vBbKrH2G5VskSUlAq/YcXc=" + }, + "voting_power": "14000", + "proposer_priority": "574000" + }, + { + "address": "F1755B14D0F358747185935F820FC06BE602B51F", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ppQFrqp0Ab3u4ZUZtAYtCMOcfFinKeu1lgg9pU13HFg=" + }, + "voting_power": "5000", + "proposer_priority": "205000" + }, + { + "address": "F4CAB410DE5567DB203BD56C694FB78D482479A1", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "ZihmjCxvIZinDz1hTU69024uNIKWyOkZVE2Q5Sbwl58=" + }, + "voting_power": "100", + "proposer_priority": "4100" + }, + { + "address": "F919902709B7482F01C030E8B57BF93B8D87043B", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "TaxOZNOCv+G5WzK3Apz3z27xyZVWSgOeGMR3ClxIrQM=" + }, + "voting_power": "100000", + "proposer_priority": "-1791217" + }, + { + "address": "FA0E5DFACCDCF74957A742144FE55BE61D433377", + "pub_key": { + "type": "tendermint/PubKeyEd25519", + "value": "SgJAVNasC6tDdkjH6XM9LbbTW/S6y1MgJsqq/1Y8Lhk=" + }, + "voting_power": "2500", + "proposer_priority": "102500" + } + ] + } +}