From 37dd20ded12c012a4acb59ed130f29e290b6598f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C4=99drzej=20Stuczy=C5=84ski?= Date: Wed, 6 Dec 2023 12:28:58 +0000 Subject: [PATCH] wip2 --- Cargo.lock | 48 +- Cargo.toml | 5 +- .../client_traits/query_client.rs | 8 +- .../src/nyxd/cosmwasm_client/mod.rs | 9 +- .../nyxd/cosmwasm_client/module_traits/mod.rs | 8 + .../module_traits/slashing/mod.rs | 4 + .../module_traits/slashing/query.rs | 3 + .../module_traits/staking/mod.rs | 4 + .../module_traits/staking/query.rs | 80 + .../validator-client/src/nyxd/mod.rs | 48 +- nym-connect/desktop/Cargo.lock | 6 +- nym-validator-rewarder/Cargo.toml | 1 + nym-validator-rewarder/foomp | 3936 +++++++++++++++++ nym-validator-rewarder/src/cli/run.rs | 6 +- nym-validator-rewarder/src/rewarder/mod.rs | 103 +- .../src/rewarder/tasks/block_watcher.rs | 5 + .../src/rewarder/tasks/mod.rs | 2 + 17 files changed, 4174 insertions(+), 102 deletions(-) create mode 100644 common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/mod.rs create mode 100644 common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/mod.rs create mode 100644 common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/query.rs create mode 100644 common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/mod.rs create mode 100644 common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/query.rs create mode 100644 nym-validator-rewarder/foomp create mode 100644 nym-validator-rewarder/src/rewarder/tasks/block_watcher.rs diff --git a/Cargo.lock b/Cargo.lock index e46ab8de56..ebacb1c6ef 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1649,6 +1649,16 @@ dependencies = [ "tendermint-proto", ] +[[package]] +name = "cosmos-sdk-proto" +version = "0.20.0" +source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c" +dependencies = [ + "prost 0.12.1", + "prost-types 0.12.1", + "tendermint-proto", +] + [[package]] name = "cosmrs" version = "0.15.0" @@ -1656,7 +1666,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" dependencies = [ "bip32", - "cosmos-sdk-proto", + "cosmos-sdk-proto 0.20.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ecdsa 0.16.8", + "eyre", + "k256", + "rand_core 0.6.4", + "serde", + "serde_json", + "signature 2.1.0", + "subtle-encoding", + "tendermint", + "thiserror", +] + +[[package]] +name = "cosmrs" +version = "0.15.0" +source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c" +dependencies = [ + "bip32", + "cosmos-sdk-proto 0.20.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "ecdsa 0.16.8", "eyre", "k256", @@ -5956,7 +5985,7 @@ name = "nym-api-requests" version = "0.1.0" dependencies = [ "bs58 0.4.0", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "cosmwasm-std", "getset", "nym-coconut-interface", @@ -6014,7 +6043,7 @@ name = "nym-bity-integration" version = "0.1.0" dependencies = [ "anyhow", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "eyre", "k256", "nym-cli-commands", @@ -6059,7 +6088,7 @@ dependencies = [ "cfg-if", "clap 4.4.7", "comfy-table", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "cosmwasm-std", "cw-utils", "handlebars", @@ -6328,7 +6357,7 @@ name = "nym-credentials" version = "0.1.0" dependencies = [ "bls12_381", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "log", "nym-api-requests", "nym-coconut-interface", @@ -7415,7 +7444,7 @@ name = "nym-types" version = "1.0.0" dependencies = [ "base64 0.21.4", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "cosmwasm-std", "eyre", "hmac 0.12.1", @@ -7449,7 +7478,7 @@ dependencies = [ "bip32", "bip39", "colored", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "cosmwasm-std", "cw-controllers", "cw-utils", @@ -7498,6 +7527,7 @@ dependencies = [ "anyhow", "bip39", "clap 4.4.7", + "futures", "nym-bin-common", "nym-config", "nym-network-defaults", @@ -7530,7 +7560,7 @@ dependencies = [ name = "nym-wallet-types" version = "1.0.0" dependencies = [ - "cosmrs", + "cosmrs 0.15.0 (registry+https://github.com/rust-lang/crates.io-index)", "cosmwasm-std", "hex-literal", "nym-config", @@ -7614,7 +7644,7 @@ version = "0.1.0" dependencies = [ "async-trait", "const_format", - "cosmrs", + "cosmrs 0.15.0 (git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features)", "eyre", "futures", "nym-bin-common", diff --git a/Cargo.toml b/Cargo.toml index d12f2cd6d2..b64e797cb5 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -203,7 +203,10 @@ cw-controllers = { version = "=1.1.0" } # cosmrs-related bip32 = "0.5.1" -cosmrs = "=0.15.0" + +# temporarily using a fork again (yay.) because we need staking and slashing support +cosmrs = { git = "https://github.com/jstuczyn/cosmos-rust", branch ="nym-temp/all-validator-features" } +#cosmrs = "=0.15.0" tendermint = "0.34" # same version as used by cosmrs tendermint-rpc = "0.34" # same version as used by cosmrs prost = "0.12" diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client_traits/query_client.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client_traits/query_client.rs index a6ed3afddc..7d389adafb 100644 --- a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client_traits/query_client.rs +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/client_traits/query_client.rs @@ -52,10 +52,6 @@ use wasmtimer::tokio::sleep; pub const DEFAULT_BROADCAST_POLLING_RATE: Duration = Duration::from_secs(4); pub const DEFAULT_BROADCAST_TIMEOUT: Duration = Duration::from_secs(60); -#[cfg(feature = "http-client")] -#[async_trait] -impl CosmWasmClient for cosmrs::rpc::HttpClient {} - #[cfg_attr(target_arch = "wasm32", async_trait(?Send))] #[cfg_attr(not(target_arch = "wasm32"), async_trait)] pub trait CosmWasmClient: TendermintRpcClient { @@ -522,3 +518,7 @@ pub trait CosmWasmClient: TendermintRpcClient { res.try_into() } } + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl CosmWasmClient for T where T: TendermintRpcClient {} diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/mod.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/mod.rs index ab78a8c418..59086eee99 100644 --- a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/mod.rs @@ -26,6 +26,7 @@ use cosmrs::rpc::{HttpClient, HttpClientUrl}; pub mod client_traits; mod helpers; pub mod logs; +pub mod module_traits; pub mod types; #[derive(Debug)] @@ -329,14 +330,6 @@ where } } -#[async_trait] -impl CosmWasmClient for MaybeSigningClient -where - C: TendermintRpcClient + Send + Sync, - S: Send + Sync, -{ -} - #[async_trait] impl SigningCosmWasmClient for MaybeSigningClient where diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/mod.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/mod.rs new file mode 100644 index 0000000000..74df86a720 --- /dev/null +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/mod.rs @@ -0,0 +1,8 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub mod staking; +pub mod slashing; + +pub use staking::query::StakingQueryClient; +// pub use slashing::query \ No newline at end of file diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/mod.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/mod.rs new file mode 100644 index 0000000000..f4a7b38548 --- /dev/null +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/mod.rs @@ -0,0 +1,4 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub mod query; \ No newline at end of file diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/query.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/query.rs new file mode 100644 index 0000000000..67bf4e9a2d --- /dev/null +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/slashing/query.rs @@ -0,0 +1,3 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/mod.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/mod.rs new file mode 100644 index 0000000000..f4a7b38548 --- /dev/null +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/mod.rs @@ -0,0 +1,4 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +pub mod query; \ No newline at end of file diff --git a/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/query.rs b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/query.rs new file mode 100644 index 0000000000..9cc5b2e8d4 --- /dev/null +++ b/common/client-libs/validator-client/src/nyxd/cosmwasm_client/module_traits/staking/query.rs @@ -0,0 +1,80 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: Apache-2.0 + +use crate::nyxd::error::NyxdError; +use crate::nyxd::{CosmWasmClient, PageRequest}; +use async_trait::async_trait; +use cosmrs::proto::cosmos::staking::v1beta1::{ + QueryHistoricalInfoRequest as ProtoQueryHistoricalInfoRequest, + QueryHistoricalInfoResponse as ProtoQueryHistoricalInfoResponse, + QueryValidatorRequest as ProtoQueryValidatorRequest, + QueryValidatorResponse as ProtoQueryValidatorResponse, + QueryValidatorsRequest as ProtoQueryValidatorsRequest, + QueryValidatorsResponse as ProtoQueryValidatorsResponse, +}; +use cosmrs::staking::{ + QueryHistoricalInfoRequest, QueryHistoricalInfoResponse, QueryValidatorRequest, + QueryValidatorResponse, QueryValidatorsRequest, QueryValidatorsResponse, +}; +use cosmrs::AccountId; + +// TODO: change trait restriction from `CosmWasmClient` to `TendermintRpcClient` +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +pub trait StakingQueryClient: CosmWasmClient { + async fn historical_info(&self, height: i64) -> Result { + let path = Some("/cosmos.staking.v1beta1.Query/HistoricalInfo".to_owned()); + + let req = QueryHistoricalInfoRequest { height }; + + let res = self + .make_abci_query::( + path, + req.into(), + ) + .await?; + + Ok(res.try_into()?) + } + + async fn validator( + &self, + validator_addr: AccountId, + ) -> Result { + let path = Some("/cosmos.staking.v1beta1.Query/Validator".to_owned()); + + let req = QueryValidatorRequest { validator_addr }; + + let res = self + .make_abci_query::( + path, + req.into(), + ) + .await?; + + Ok(res.try_into()?) + } + + async fn validators( + &self, + status: String, + pagination: Option, + ) -> Result { + let path = Some("/cosmos.staking.v1beta1.Query/Validators".to_owned()); + + let req = QueryValidatorsRequest { status, pagination }; + + let res = self + .make_abci_query::( + path, + req.into(), + ) + .await?; + + Ok(res.try_into()?) + } +} + +#[cfg_attr(target_arch = "wasm32", async_trait(?Send))] +#[cfg_attr(not(target_arch = "wasm32"), async_trait)] +impl StakingQueryClient for T where T: CosmWasmClient {} diff --git a/common/client-libs/validator-client/src/nyxd/mod.rs b/common/client-libs/validator-client/src/nyxd/mod.rs index 46f9b0622a..49b6e972a5 100644 --- a/common/client-libs/validator-client/src/nyxd/mod.rs +++ b/common/client-libs/validator-client/src/nyxd/mod.rs @@ -29,24 +29,29 @@ use tendermint_rpc::endpoint::*; use tendermint_rpc::{Error as TendermintRpcError, Order}; use url::Url; -pub use crate::nyxd::cosmwasm_client::client_traits::{CosmWasmClient, SigningCosmWasmClient}; -pub use crate::nyxd::fee::Fee; +pub use crate::nyxd::{ + cosmwasm_client::{ + client_traits::{CosmWasmClient, SigningCosmWasmClient}, + module_traits::{self, StakingQueryClient}, + }, + fee::Fee, +}; pub use crate::rpc::TendermintRpcClient; pub use coin::Coin; -pub use cosmrs::bank::MsgSend; -pub use cosmrs::tendermint::abci::{ - response::DeliverTx, types::ExecTxResult, Event, EventAttribute, +pub use cosmrs::{ + bank::MsgSend, + bip32, + query::{PageRequest, PageResponse}, + tendermint::{ + abci::{response::DeliverTx, types::ExecTxResult, Event, EventAttribute}, + block::Height, + hash::{self, Algorithm, Hash}, + validator::Info as TendermintValidatorInfo, + Time as TendermintTime, + }, + tx::{self, Msg}, + AccountId, Coin as CosmosCoin, Denom, Gas, }; -pub use cosmrs::tendermint::block::Height; -pub use cosmrs::tendermint::hash::{self, Algorithm, Hash}; -pub use cosmrs::tendermint::validator::Info as TendermintValidatorInfo; -pub use cosmrs::tendermint::Time as TendermintTime; -pub use cosmrs::tx::Msg; -pub use cosmrs::tx::{self}; -pub use cosmrs::Any; -pub use cosmrs::Coin as CosmosCoin; -pub use cosmrs::Gas; -pub use cosmrs::{bip32, AccountId, Denom}; pub use cosmwasm_std::Coin as CosmWasmCoin; pub use cw2; pub use cw3; @@ -56,9 +61,8 @@ pub use fee::{gas_price::GasPrice, GasAdjustable, GasAdjustment}; pub use tendermint_rpc::{ endpoint::{tx::Response as TxResponse, validators::Response as ValidatorResponse}, query::Query, - Paging, + Paging, Request, Response, SimpleRequest, }; -pub use tendermint_rpc::{Request, Response, SimpleRequest}; #[cfg(feature = "http-client")] use crate::http_client; @@ -729,7 +733,7 @@ where where H: Into + Send, { - self.client.validators(height, paging).await + TendermintRpcClient::validators(&self.client, height, paging).await } async fn latest_consensus_params( @@ -804,14 +808,6 @@ where } } -#[async_trait] -impl CosmWasmClient for NyxdClient -where - C: TendermintRpcClient + Send + Sync, - S: Send + Sync, -{ -} - impl OfflineSigner for NyxdClient where S: OfflineSigner, diff --git a/nym-connect/desktop/Cargo.lock b/nym-connect/desktop/Cargo.lock index d92f3d4b49..240da01001 100644 --- a/nym-connect/desktop/Cargo.lock +++ b/nym-connect/desktop/Cargo.lock @@ -1014,8 +1014,7 @@ dependencies = [ [[package]] name = "cosmos-sdk-proto" version = "0.20.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32560304ab4c365791fd307282f76637213d8083c1a98490c35159cd67852237" +source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c" dependencies = [ "prost", "prost-types", @@ -1025,8 +1024,7 @@ dependencies = [ [[package]] name = "cosmrs" version = "0.15.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "47126f5364df9387b9d8559dcef62e99010e1d4098f39eb3f7ee4b5c254e40ea" +source = "git+https://github.com/jstuczyn/cosmos-rust?branch=nym-temp/all-validator-features#67718aa27a96efb9881e927a8f998c94b885093c" dependencies = [ "bip32", "cosmos-sdk-proto", diff --git a/nym-validator-rewarder/Cargo.toml b/nym-validator-rewarder/Cargo.toml index b380e053ba..2ba72f9411 100644 --- a/nym-validator-rewarder/Cargo.toml +++ b/nym-validator-rewarder/Cargo.toml @@ -14,6 +14,7 @@ license = "GPL-3" anyhow.workspace = true bip39 = { workspace = true, features = ["zeroize"] } clap = { workspace = true, features = ["cargo"] } +futures.workspace = true serde = { workspace = true, features = ["derive"] } thiserror.workspace = true tokio = { workspace = true, features = ["rt-multi-thread", "time", "macros"] } diff --git a/nym-validator-rewarder/foomp b/nym-validator-rewarder/foomp new file mode 100644 index 0000000000..e75e1021d3 --- /dev/null +++ b/nym-validator-rewarder/foomp @@ -0,0 +1,3936 @@ +Got event: Event { + query: "tm.event = 'NewBlock'", + data: LegacyNewBlock { + block: Some( + Block { + header: Header { + version: Version { + block: 11, + app: 0, + }, + chain_id: chain::Id(nyx), + height: block::Height(10104845), + time: Time( + 2023-12-05 10:00:27.168834598, + ), + last_block_id: Some( + Id { + hash: Hash::Sha256(05010DE73764F8DF015B7577831F74A5E289E12E4BA1AB43D2FAF25B71294898), + part_set_header: Header { + total: 1, + hash: Hash::Sha256(25F703C33A060479E582C0894D1B914E3C71C82816A9B68D699CF3B9428FED95), + }, + }, + ), + last_commit_hash: Some( + Hash::Sha256(B549FE4D2FA7286A902EBF04A417509DFE46DA1834A2F90A2A7E76761B044372), + ), + data_hash: Some( + Hash::Sha256(E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855), + ), + validators_hash: Hash::Sha256(97B531291F24462988D2D1B84DF6E21AE95E48C7546AF074554B355FEC76150C), + next_validators_hash: Hash::Sha256(97B531291F24462988D2D1B84DF6E21AE95E48C7546AF074554B355FEC76150C), + consensus_hash: Hash::Sha256(048091BC7DDC283F77BFBF91D73C44DA58C3DF8A9CBC867405D8B7F3DAADA22F), + app_hash: AppHash(46879129F47F945950D0E2E3D3A72F063C4817E13F5EA284C24E80525D25E657), + last_results_hash: Some( + Hash::Sha256(E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855), + ), + evidence_hash: Some( + Hash::Sha256(E3B0C44298FC1C149AFBF4C8996FB92427AE41E4649B934CA495991B7852B855), + ), + proposer_address: account::Id(F35FDD3B4295AD80FB5D14012E649128C83BE7BC), + }, + data: [], + evidence: List( + [], + ), + last_commit: Some( + Commit { + height: block::Height(10104844), + round: block::Round(0), + block_id: Id { + hash: Hash::Sha256(05010DE73764F8DF015B7577831F74A5E289E12E4BA1AB43D2FAF25B71294898), + part_set_header: Header { + total: 1, + hash: Hash::Sha256(25F703C33A060479E582C0894D1B914E3C71C82816A9B68D699CF3B9428FED95), + }, + }, + signatures: [ + BlockIdFlagCommit { + validator_address: account::Id(9A5783B0CB39B4AE670E0F9215D3C720B56506D1), + timestamp: Time( + 2023-12-05 10:00:27.142741875, + ), + signature: Some( + Signature( + [ + 118, + 63, + 211, + 243, + 145, + 45, + 41, + 51, + 22, + 47, + 69, + 157, + 177, + 81, + 24, + 161, + 119, + 61, + 31, + 79, + 98, + 95, + 216, + 177, + 116, + 100, + 152, + 29, + 152, + 180, + 85, + 237, + 195, + 124, + 143, + 217, + 196, + 225, + 3, + 89, + 206, + 139, + 91, + 26, + 86, + 226, + 30, + 159, + 207, + 252, + 144, + 134, + 76, + 3, + 74, + 25, + 183, + 21, + 47, + 223, + 1, + 10, + 65, + 3, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(E2E65903BAB5344E5CFFDDC2CD638A6BAB2E2E79), + timestamp: Time( + 2023-12-05 10:00:27.141560477, + ), + signature: Some( + Signature( + [ + 89, + 195, + 129, + 61, + 39, + 145, + 26, + 214, + 139, + 109, + 107, + 246, + 106, + 154, + 23, + 178, + 219, + 131, + 237, + 35, + 28, + 75, + 151, + 72, + 163, + 226, + 4, + 65, + 130, + 65, + 176, + 14, + 37, + 32, + 186, + 245, + 182, + 47, + 183, + 110, + 44, + 207, + 34, + 10, + 151, + 152, + 226, + 128, + 45, + 144, + 247, + 184, + 25, + 13, + 92, + 89, + 253, + 67, + 38, + 134, + 98, + 176, + 129, + 7, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(47601B18F0F434375F7219AC5297E156459D2A8C), + timestamp: Time( + 2023-12-05 10:00:27.256161926, + ), + signature: Some( + Signature( + [ + 122, + 126, + 230, + 222, + 202, + 30, + 31, + 20, + 112, + 37, + 239, + 8, + 65, + 0, + 134, + 85, + 206, + 231, + 102, + 99, + 208, + 186, + 243, + 3, + 65, + 113, + 220, + 95, + 92, + 204, + 148, + 8, + 69, + 56, + 172, + 53, + 213, + 103, + 70, + 162, + 219, + 114, + 201, + 174, + 108, + 26, + 65, + 128, + 61, + 76, + 85, + 66, + 25, + 79, + 104, + 48, + 7, + 11, + 32, + 186, + 249, + 143, + 148, + 12, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(4E4A4575F97EDCE249812A7AD125414AFCD86933), + timestamp: Time( + 2023-12-05 10:00:27.180566288, + ), + signature: Some( + Signature( + [ + 238, + 56, + 52, + 98, + 136, + 2, + 124, + 213, + 241, + 29, + 202, + 92, + 155, + 87, + 19, + 90, + 57, + 118, + 225, + 16, + 233, + 74, + 42, + 103, + 195, + 194, + 196, + 45, + 161, + 57, + 128, + 158, + 7, + 96, + 16, + 75, + 110, + 102, + 105, + 175, + 98, + 124, + 83, + 172, + 150, + 8, + 12, + 111, + 147, + 207, + 236, + 185, + 162, + 4, + 137, + 136, + 129, + 151, + 194, + 184, + 194, + 251, + 29, + 7, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(9B9E1D79F825A8339A62A98CA1E42905B6DF8BCD), + timestamp: Time( + 2023-12-05 10:00:27.150643872, + ), + signature: Some( + Signature( + [ + 58, + 32, + 1, + 112, + 164, + 119, + 62, + 176, + 50, + 233, + 150, + 21, + 224, + 92, + 254, + 76, + 158, + 3, + 38, + 116, + 191, + 121, + 202, + 159, + 72, + 61, + 64, + 98, + 145, + 204, + 95, + 171, + 107, + 41, + 211, + 85, + 50, + 22, + 105, + 187, + 25, + 222, + 190, + 45, + 55, + 1, + 203, + 239, + 219, + 39, + 224, + 19, + 32, + 40, + 35, + 164, + 72, + 228, + 185, + 237, + 61, + 168, + 96, + 4, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(645F7AE779B1819C8E622465293234C6AFB04806), + timestamp: Time( + 2023-12-05 10:00:27.176180403, + ), + signature: Some( + Signature( + [ + 163, + 29, + 156, + 186, + 15, + 30, + 249, + 160, + 48, + 174, + 143, + 112, + 54, + 233, + 108, + 14, + 40, + 108, + 203, + 162, + 137, + 209, + 138, + 151, + 5, + 194, + 108, + 220, + 95, + 49, + 55, + 79, + 235, + 246, + 105, + 198, + 79, + 40, + 118, + 32, + 221, + 162, + 165, + 73, + 132, + 47, + 99, + 106, + 107, + 203, + 53, + 146, + 234, + 252, + 149, + 239, + 86, + 16, + 84, + 194, + 250, + 216, + 55, + 1, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(73837BE389D82E7881B504A43F40ADF4855E3B4D), + timestamp: Time( + 2023-12-05 10:00:27.171786111, + ), + signature: Some( + Signature( + [ + 38, + 45, + 136, + 208, + 231, + 238, + 113, + 190, + 220, + 134, + 130, + 41, + 94, + 148, + 163, + 147, + 204, + 48, + 193, + 197, + 45, + 176, + 250, + 121, + 55, + 54, + 51, + 192, + 212, + 238, + 135, + 202, + 79, + 133, + 13, + 3, + 122, + 21, + 214, + 228, + 80, + 138, + 116, + 4, + 83, + 203, + 239, + 233, + 103, + 140, + 31, + 10, + 75, + 106, + 201, + 137, + 187, + 62, + 141, + 133, + 145, + 176, + 167, + 8, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(24CF61027DF3E26A774EBD6A527DDE7F28D1CB32), + timestamp: Time( + 2023-12-05 10:00:27.15429356, + ), + signature: Some( + Signature( + [ + 70, + 121, + 165, + 79, + 208, + 246, + 51, + 248, + 143, + 142, + 166, + 93, + 231, + 154, + 180, + 157, + 123, + 230, + 136, + 206, + 102, + 29, + 126, + 174, + 70, + 58, + 17, + 155, + 110, + 193, + 26, + 138, + 106, + 198, + 230, + 165, + 88, + 36, + 129, + 32, + 21, + 28, + 215, + 94, + 13, + 86, + 111, + 47, + 217, + 216, + 57, + 35, + 212, + 26, + 47, + 195, + 160, + 169, + 194, + 237, + 182, + 216, + 22, + 9, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(A43138580D4EF4571A6E4A5C0CDEC3243EAA7276), + timestamp: Time( + 2023-12-05 10:00:27.168834598, + ), + signature: Some( + Signature( + [ + 230, + 115, + 225, + 156, + 12, + 65, + 130, + 4, + 116, + 136, + 84, + 197, + 182, + 164, + 135, + 110, + 166, + 130, + 169, + 11, + 87, + 145, + 255, + 33, + 56, + 85, + 116, + 234, + 197, + 49, + 135, + 250, + 198, + 87, + 178, + 220, + 113, + 156, + 52, + 240, + 225, + 109, + 210, + 196, + 205, + 177, + 119, + 246, + 41, + 75, + 18, + 116, + 91, + 20, + 51, + 35, + 84, + 217, + 127, + 98, + 214, + 141, + 13, + 8, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(1DB464D43981AA325BC0CE4ACA3EB12EAC076A5D), + timestamp: Time( + 2023-12-05 10:00:27.213820999, + ), + signature: Some( + Signature( + [ + 97, + 83, + 4, + 80, + 197, + 62, + 14, + 154, + 105, + 208, + 149, + 238, + 215, + 185, + 140, + 229, + 209, + 225, + 35, + 253, + 224, + 85, + 136, + 179, + 76, + 162, + 186, + 180, + 52, + 122, + 76, + 152, + 169, + 215, + 109, + 252, + 55, + 10, + 120, + 3, + 69, + 206, + 7, + 42, + 131, + 211, + 161, + 18, + 11, + 52, + 184, + 7, + 84, + 89, + 147, + 3, + 126, + 180, + 118, + 16, + 19, + 240, + 172, + 10, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(AA71546DB40A211CDB8B78D8DEB6F750A611336D), + timestamp: Time( + 2023-12-05 10:00:27.16741474, + ), + signature: Some( + Signature( + [ + 231, + 196, + 212, + 44, + 45, + 140, + 115, + 106, + 181, + 209, + 73, + 210, + 41, + 35, + 35, + 252, + 214, + 47, + 181, + 31, + 195, + 81, + 243, + 157, + 63, + 235, + 117, + 52, + 101, + 83, + 107, + 205, + 222, + 76, + 238, + 119, + 166, + 174, + 247, + 241, + 100, + 55, + 143, + 128, + 21, + 33, + 172, + 64, + 179, + 189, + 211, + 174, + 160, + 39, + 128, + 237, + 184, + 100, + 246, + 145, + 86, + 28, + 239, + 10, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(D72D363E94A7C20E7A3A274F1A074E577F04432A), + timestamp: Time( + 2023-12-05 10:00:27.199784014, + ), + signature: Some( + Signature( + [ + 112, + 94, + 35, + 228, + 120, + 76, + 105, + 81, + 136, + 179, + 249, + 200, + 164, + 98, + 51, + 133, + 138, + 247, + 127, + 128, + 140, + 53, + 73, + 222, + 33, + 237, + 29, + 20, + 39, + 200, + 72, + 61, + 118, + 129, + 112, + 198, + 103, + 254, + 118, + 30, + 184, + 162, + 5, + 196, + 78, + 141, + 158, + 114, + 48, + 59, + 36, + 169, + 207, + 93, + 22, + 13, + 153, + 92, + 38, + 196, + 159, + 254, + 23, + 14, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(6EF6EE46207C59ACA4CDD011FD00A0D8F4172BED), + timestamp: Time( + 2023-12-05 10:00:27.213977579, + ), + signature: Some( + Signature( + [ + 160, + 212, + 29, + 164, + 89, + 216, + 195, + 82, + 214, + 39, + 57, + 169, + 98, + 218, + 26, + 172, + 63, + 115, + 15, + 203, + 46, + 68, + 253, + 79, + 50, + 47, + 134, + 182, + 43, + 55, + 22, + 235, + 118, + 253, + 77, + 254, + 236, + 162, + 183, + 144, + 99, + 85, + 45, + 237, + 176, + 27, + 199, + 21, + 217, + 122, + 163, + 173, + 90, + 235, + 108, + 13, + 132, + 116, + 12, + 174, + 100, + 188, + 36, + 8, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(F35FDD3B4295AD80FB5D14012E649128C83BE7BC), + timestamp: Time( + 2023-12-05 10:00:27.155506091, + ), + signature: Some( + Signature( + [ + 63, + 215, + 16, + 156, + 208, + 102, + 27, + 138, + 155, + 146, + 89, + 25, + 50, + 127, + 120, + 138, + 85, + 237, + 36, + 121, + 99, + 5, + 29, + 96, + 29, + 66, + 213, + 97, + 40, + 197, + 107, + 94, + 206, + 234, + 150, + 167, + 189, + 22, + 22, + 152, + 157, + 130, + 128, + 254, + 9, + 138, + 177, + 112, + 185, + 71, + 119, + 50, + 169, + 61, + 112, + 92, + 0, + 141, + 66, + 93, + 176, + 93, + 2, + 1, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(0C3BA60DDAFFCCB36DD87DF983FD5EB34507084C), + timestamp: Time( + 2023-12-05 10:00:27.118242235, + ), + signature: Some( + Signature( + [ + 195, + 249, + 106, + 237, + 58, + 89, + 167, + 10, + 123, + 94, + 63, + 222, + 142, + 169, + 198, + 95, + 172, + 170, + 20, + 126, + 174, + 24, + 166, + 183, + 138, + 172, + 220, + 102, + 140, + 71, + 20, + 87, + 156, + 195, + 141, + 7, + 253, + 59, + 121, + 142, + 124, + 195, + 31, + 207, + 123, + 33, + 86, + 159, + 207, + 39, + 73, + 129, + 208, + 37, + 98, + 131, + 175, + 110, + 199, + 90, + 223, + 56, + 244, + 9, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(1354CE3615325D1820E451ED8AE09A057BB22753), + timestamp: Time( + 2023-12-05 10:00:27.185198971, + ), + signature: Some( + Signature( + [ + 177, + 152, + 35, + 15, + 89, + 25, + 86, + 151, + 194, + 7, + 193, + 167, + 79, + 248, + 125, + 111, + 32, + 207, + 103, + 243, + 44, + 182, + 94, + 154, + 62, + 27, + 209, + 118, + 67, + 183, + 16, + 94, + 126, + 136, + 157, + 125, + 3, + 35, + 138, + 55, + 209, + 40, + 249, + 101, + 184, + 196, + 218, + 163, + 251, + 154, + 113, + 231, + 71, + 245, + 23, + 74, + 146, + 10, + 251, + 227, + 215, + 128, + 54, + 4, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(7BA8DF346A24B75AD421D747FB13D471D6F26223), + timestamp: Time( + 2023-12-05 10:00:27.195078759, + ), + signature: Some( + Signature( + [ + 59, + 105, + 121, + 153, + 201, + 107, + 205, + 89, + 121, + 79, + 229, + 198, + 240, + 235, + 243, + 185, + 169, + 143, + 206, + 252, + 13, + 92, + 74, + 252, + 78, + 76, + 240, + 138, + 119, + 158, + 225, + 23, + 116, + 101, + 171, + 124, + 125, + 30, + 135, + 249, + 235, + 143, + 236, + 109, + 216, + 189, + 123, + 139, + 151, + 47, + 40, + 206, + 177, + 187, + 175, + 18, + 202, + 14, + 28, + 228, + 83, + 46, + 203, + 6, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(AB2D0A303079ABA286D75C5BC2E95C0FB87546AB), + timestamp: Time( + 2023-12-05 10:00:27.215038418, + ), + signature: Some( + Signature( + [ + 94, + 115, + 223, + 98, + 147, + 203, + 208, + 216, + 205, + 20, + 96, + 203, + 137, + 233, + 170, + 101, + 42, + 63, + 76, + 168, + 176, + 22, + 238, + 81, + 138, + 57, + 202, + 12, + 13, + 116, + 240, + 156, + 191, + 193, + 56, + 148, + 248, + 243, + 116, + 236, + 94, + 56, + 25, + 189, + 56, + 51, + 221, + 214, + 224, + 107, + 109, + 216, + 65, + 237, + 128, + 34, + 148, + 188, + 145, + 217, + 212, + 69, + 132, + 6, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(36591649E77A9932341183563F7D32478383F85F), + timestamp: Time( + 2023-12-05 10:00:27.106239911, + ), + signature: Some( + Signature( + [ + 112, + 176, + 165, + 158, + 44, + 80, + 194, + 135, + 4, + 236, + 153, + 64, + 91, + 88, + 155, + 100, + 124, + 22, + 111, + 61, + 106, + 248, + 19, + 46, + 40, + 73, + 68, + 207, + 118, + 117, + 77, + 187, + 206, + 28, + 47, + 78, + 121, + 166, + 101, + 132, + 102, + 140, + 127, + 253, + 68, + 144, + 70, + 33, + 47, + 145, + 167, + 113, + 25, + 60, + 233, + 98, + 122, + 120, + 221, + 14, + 165, + 48, + 31, + 4, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(56A9F6AD81796EA0AACA8DD9EBCBB6F6539F0903), + timestamp: Time( + 2023-12-05 10:00:27.180075348, + ), + signature: Some( + Signature( + [ + 212, + 84, + 21, + 155, + 86, + 238, + 171, + 220, + 203, + 245, + 73, + 86, + 148, + 118, + 171, + 44, + 3, + 200, + 149, + 253, + 208, + 31, + 100, + 11, + 67, + 153, + 217, + 125, + 178, + 153, + 163, + 57, + 31, + 167, + 65, + 110, + 147, + 154, + 163, + 22, + 209, + 119, + 151, + 0, + 214, + 123, + 137, + 136, + 119, + 144, + 12, + 9, + 7, + 89, + 32, + 130, + 24, + 250, + 137, + 194, + 67, + 164, + 51, + 11, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(E394C2F7625D514B1BF05EDC6033167388DE4793), + timestamp: Time( + 2023-12-05 10:00:27.143046535, + ), + signature: Some( + Signature( + [ + 190, + 60, + 240, + 97, + 138, + 53, + 209, + 62, + 86, + 240, + 221, + 80, + 33, + 69, + 166, + 143, + 114, + 203, + 39, + 46, + 245, + 169, + 142, + 122, + 206, + 244, + 202, + 39, + 212, + 163, + 60, + 113, + 110, + 68, + 71, + 172, + 195, + 201, + 65, + 231, + 236, + 23, + 95, + 205, + 255, + 125, + 237, + 255, + 120, + 139, + 166, + 194, + 77, + 11, + 120, + 107, + 169, + 194, + 216, + 92, + 36, + 80, + 6, + 3, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(519AD7739408413E80010AECFDF1B509A580D0C0), + timestamp: Time( + 2023-12-05 10:00:27.156990374, + ), + signature: Some( + Signature( + [ + 142, + 180, + 152, + 195, + 59, + 36, + 69, + 156, + 169, + 232, + 13, + 198, + 116, + 45, + 108, + 32, + 198, + 109, + 180, + 242, + 61, + 146, + 21, + 107, + 205, + 147, + 247, + 59, + 191, + 101, + 101, + 70, + 226, + 64, + 96, + 179, + 170, + 94, + 127, + 36, + 158, + 168, + 185, + 230, + 96, + 2, + 13, + 192, + 95, + 49, + 179, + 185, + 187, + 138, + 155, + 64, + 142, + 88, + 12, + 48, + 237, + 38, + 200, + 8, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(9B6FF43A70EBDF0A7536E2C712FD7ECC2FC9E1E0), + timestamp: Time( + 2023-12-05 10:00:27.155536869, + ), + signature: Some( + Signature( + [ + 222, + 89, + 209, + 83, + 2, + 33, + 202, + 130, + 32, + 122, + 103, + 184, + 113, + 211, + 192, + 106, + 107, + 177, + 234, + 137, + 134, + 26, + 65, + 64, + 73, + 246, + 73, + 134, + 80, + 92, + 54, + 218, + 82, + 29, + 50, + 111, + 213, + 221, + 8, + 73, + 169, + 149, + 157, + 93, + 108, + 187, + 91, + 137, + 243, + 43, + 210, + 113, + 169, + 7, + 120, + 63, + 95, + 126, + 24, + 209, + 247, + 45, + 115, + 0, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(F15247741FAFBF85DB50C741E21E824D6D90059E), + timestamp: Time( + 2023-12-05 10:00:27.201509258, + ), + signature: Some( + Signature( + [ + 198, + 185, + 130, + 14, + 33, + 118, + 212, + 58, + 22, + 90, + 209, + 207, + 103, + 226, + 99, + 66, + 133, + 232, + 44, + 77, + 255, + 40, + 84, + 168, + 160, + 234, + 235, + 163, + 67, + 33, + 89, + 156, + 82, + 89, + 136, + 47, + 99, + 86, + 6, + 127, + 249, + 30, + 38, + 157, + 22, + 59, + 152, + 127, + 117, + 8, + 179, + 224, + 58, + 123, + 181, + 143, + 245, + 136, + 13, + 83, + 225, + 234, + 82, + 7, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(A466116BC84BEE971FF9B44398B0C29640AF1061), + timestamp: Time( + 2023-12-05 10:00:27.214225884, + ), + signature: Some( + Signature( + [ + 98, + 70, + 192, + 177, + 140, + 4, + 109, + 151, + 18, + 229, + 33, + 101, + 185, + 237, + 197, + 196, + 19, + 18, + 211, + 184, + 76, + 141, + 135, + 125, + 204, + 142, + 41, + 202, + 206, + 224, + 34, + 245, + 229, + 8, + 16, + 37, + 20, + 160, + 251, + 23, + 41, + 6, + 252, + 236, + 2, + 163, + 248, + 29, + 106, + 219, + 8, + 158, + 253, + 129, + 106, + 98, + 97, + 79, + 155, + 102, + 28, + 65, + 61, + 2, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(7A352301525273F08F61DFD2406777AF51FE4EB1), + timestamp: Time( + 2023-12-05 10:00:27.143654607, + ), + signature: Some( + Signature( + [ + 60, + 128, + 164, + 24, + 145, + 158, + 42, + 111, + 163, + 143, + 168, + 114, + 149, + 74, + 176, + 232, + 240, + 15, + 41, + 207, + 171, + 228, + 45, + 222, + 42, + 120, + 7, + 64, + 1, + 120, + 250, + 204, + 9, + 233, + 133, + 164, + 146, + 17, + 83, + 43, + 147, + 69, + 43, + 89, + 174, + 58, + 82, + 37, + 28, + 86, + 96, + 165, + 0, + 212, + 135, + 55, + 249, + 59, + 12, + 34, + 226, + 246, + 185, + 14, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(7808D15FE56C259EA14EE5C8B9A0BA655738425A), + timestamp: Time( + 2023-12-05 10:00:27.116587318, + ), + signature: Some( + Signature( + [ + 28, + 14, + 170, + 201, + 254, + 246, + 109, + 213, + 193, + 92, + 167, + 231, + 21, + 61, + 92, + 247, + 11, + 74, + 132, + 243, + 27, + 91, + 157, + 240, + 178, + 215, + 168, + 224, + 253, + 52, + 30, + 90, + 237, + 176, + 35, + 239, + 150, + 51, + 107, + 113, + 217, + 163, + 48, + 251, + 74, + 213, + 31, + 157, + 73, + 194, + 64, + 31, + 166, + 96, + 253, + 64, + 63, + 35, + 1, + 222, + 235, + 82, + 72, + 2, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(3363E8F97B02ECC00289E72173D827543047ACDA), + timestamp: Time( + 2023-12-05 10:00:27.180490882, + ), + signature: Some( + Signature( + [ + 241, + 222, + 7, + 157, + 182, + 19, + 7, + 71, + 88, + 111, + 117, + 81, + 78, + 230, + 140, + 61, + 6, + 66, + 156, + 53, + 232, + 46, + 56, + 157, + 84, + 241, + 237, + 217, + 64, + 128, + 2, + 66, + 248, + 243, + 96, + 229, + 9, + 99, + 219, + 41, + 8, + 30, + 86, + 30, + 189, + 233, + 80, + 85, + 27, + 216, + 108, + 141, + 253, + 153, + 235, + 209, + 185, + 23, + 17, + 134, + 159, + 182, + 38, + 4, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(74B3DA950977508AAEB105B2B0DEBFD6C54B8F40), + timestamp: Time( + 2023-12-05 10:00:27.167946056, + ), + signature: Some( + Signature( + [ + 33, + 25, + 199, + 164, + 84, + 140, + 121, + 85, + 225, + 168, + 192, + 73, + 65, + 209, + 85, + 200, + 134, + 89, + 197, + 98, + 124, + 70, + 115, + 237, + 238, + 107, + 163, + 126, + 180, + 65, + 110, + 56, + 196, + 229, + 208, + 131, + 244, + 35, + 10, + 6, + 82, + 89, + 188, + 73, + 242, + 83, + 161, + 100, + 170, + 114, + 44, + 193, + 139, + 227, + 255, + 37, + 78, + 215, + 18, + 210, + 218, + 5, + 228, + 10, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(A626601D8837DAB5E9FD6C760B1482A505D45F29), + timestamp: Time( + 2023-12-05 10:00:27.163792384, + ), + signature: Some( + Signature( + [ + 19, + 192, + 60, + 55, + 99, + 7, + 213, + 95, + 177, + 2, + 87, + 19, + 34, + 32, + 225, + 150, + 11, + 242, + 66, + 123, + 164, + 245, + 63, + 123, + 234, + 202, + 245, + 40, + 124, + 206, + 206, + 59, + 187, + 152, + 28, + 173, + 198, + 37, + 85, + 154, + 250, + 238, + 65, + 71, + 47, + 199, + 109, + 247, + 249, + 181, + 147, + 109, + 238, + 140, + 80, + 34, + 252, + 93, + 166, + 182, + 211, + 155, + 4, + 6, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(25219C7188D73816F8B2B7B153F83FA06A9A699E), + timestamp: Time( + 2023-12-05 10:00:27.145333751, + ), + signature: Some( + Signature( + [ + 194, + 209, + 111, + 175, + 16, + 253, + 148, + 210, + 211, + 159, + 246, + 81, + 212, + 137, + 145, + 64, + 26, + 28, + 207, + 244, + 185, + 222, + 112, + 244, + 40, + 4, + 237, + 154, + 253, + 12, + 139, + 36, + 170, + 109, + 64, + 91, + 204, + 172, + 39, + 62, + 207, + 133, + 208, + 188, + 109, + 180, + 74, + 117, + 30, + 40, + 102, + 96, + 62, + 67, + 223, + 20, + 228, + 106, + 14, + 51, + 16, + 165, + 85, + 5, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(4EADB65E0E0EED2FEA7D130AEE764E8FFBE0C6C2), + timestamp: Time( + 2023-12-05 10:00:27.161261575, + ), + signature: Some( + Signature( + [ + 111, + 170, + 186, + 85, + 150, + 115, + 141, + 39, + 73, + 77, + 90, + 191, + 21, + 54, + 244, + 154, + 245, + 169, + 167, + 27, + 108, + 238, + 11, + 43, + 219, + 23, + 65, + 68, + 239, + 231, + 120, + 194, + 204, + 225, + 24, + 4, + 22, + 186, + 67, + 165, + 76, + 249, + 138, + 202, + 219, + 188, + 229, + 184, + 81, + 26, + 109, + 87, + 59, + 199, + 51, + 198, + 13, + 47, + 34, + 251, + 166, + 8, + 240, + 1, + ], + ), + ), + }, + BlockIdFlagCommit { + validator_address: account::Id(50458E3714440C453BCBF6C62B2CC1DA5CC918BA), + timestamp: Time( + 2023-12-05 10:00:27.137629977, + ), + signature: Some( + Signature( + [ + 181, + 122, + 69, + 183, + 65, + 123, + 14, + 42, + 0, + 88, + 27, + 78, + 145, + 65, + 151, + 168, + 100, + 20, + 194, + 93, + 162, + 88, + 100, + 68, + 148, + 42, + 143, + 47, + 106, + 30, + 1, + 60, + 150, + 124, + 240, + 165, + 60, + 193, + 38, + 124, + 233, + 244, + 101, + 232, + 76, + 188, + 171, + 237, + 127, + 185, + 139, + 175, + 52, + 99, + 190, + 26, + 140, + 246, + 32, + 162, + 162, + 166, + 165, + 10, + ], + ), + ), + }, + ], + }, + ), + }, + ), + result_begin_block: Some( + BeginBlock { + events: [ + Event { + kind: "coin_spent", + attributes: [ + EventAttribute { + key: "spender", + value: "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "coin_received", + attributes: [ + EventAttribute { + key: "receiver", + value: "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "transfer", + attributes: [ + EventAttribute { + key: "recipient", + value: "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + index: true, + }, + EventAttribute { + key: "sender", + value: "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "message", + attributes: [ + EventAttribute { + key: "sender", + value: "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + index: true, + }, + ], + }, + Event { + kind: "mint", + attributes: [ + EventAttribute { + key: "bonded_ratio", + value: "0.048174013441366915", + index: true, + }, + EventAttribute { + key: "inflation", + value: "0.000000000000000000", + index: true, + }, + EventAttribute { + key: "annual_provisions", + value: "0.000000000000000000", + index: true, + }, + EventAttribute { + key: "amount", + value: "0", + index: true, + }, + ], + }, + Event { + kind: "coin_spent", + attributes: [ + EventAttribute { + key: "spender", + value: "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "coin_received", + attributes: [ + EventAttribute { + key: "receiver", + value: "n1jv65s3grqf6v6jl3dp4t6c9t9rk99cd84mn7k6", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "transfer", + attributes: [ + EventAttribute { + key: "recipient", + value: "n1jv65s3grqf6v6jl3dp4t6c9t9rk99cd84mn7k6", + index: true, + }, + EventAttribute { + key: "sender", + value: "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + index: true, + }, + EventAttribute { + key: "amount", + value: "", + index: true, + }, + ], + }, + Event { + kind: "message", + attributes: [ + EventAttribute { + key: "sender", + value: "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1xgyczxuxspeytdpyvp3w840ckzp4env4phq67x", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1xgyczxuxspeytdpyvp3w840ckzp4env4phq67x", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1e22wh85arrkpe6derct4l5r4gp3awvase24pf6", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1e22wh85arrkpe6derct4l5r4gp3awvase24pf6", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1gjtvly9lel6zskvwtvlg5vhwpu9c9wawlfdx8d", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1gjtvly9lel6zskvwtvlg5vhwpu9c9wawlfdx8d", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1ef8fjswyuxnv9779qfug042aca8hevenvnfcfm", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1ef8fjswyuxnv9779qfug042aca8hevenvnfcfm", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper18mgnd9k6rytn6tz7pf8d2d4dawl7e9crunrsxd", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper18mgnd9k6rytn6tz7pf8d2d4dawl7e9crunrsxd", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1h9ywl4ff7tpf8yzp7u9k5w0ks3rdnsercjjs0a", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1h9ywl4ff7tpf8yzp7u9k5w0ks3rdnsercjjs0a", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper14epla9mvgwl8456l4emvvchyj6reqg8a79fayw", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper14epla9mvgwl8456l4emvvchyj6reqg8a79fayw", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper197ml8ded7rpj3ezk55zjsavzemn549vuhy6qrh", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper197ml8ded7rpj3ezk55zjsavzemn549vuhy6qrh", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1q8cnx8s06q7ralnskqvj0acvqgacau6djqkm3z", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1q8cnx8s06q7ralnskqvj0acvqgacau6djqkm3z", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1uw3y3g6du2xxvlsu7qtv9vwvq7nqe5t65u0aph", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1uw3y3g6du2xxvlsu7qtv9vwvq7nqe5t65u0aph", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper166m7e8hxntq8e68whqrfk37f32xyk3eer0t427", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper166m7e8hxntq8e68whqrfk37f32xyk3eer0t427", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1mlmqlkxjttj6m4wwmf5eur35n3hf5zm2ev2vjj", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1mlmqlkxjttj6m4wwmf5eur35n3hf5zm2ev2vjj", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1aqxz5rhsu59tz3fykskqprarq2c2vxqv2jaysv", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1aqxz5rhsu59tz3fykskqprarq2c2vxqv2jaysv", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1upxrtt7nm7dpqe3ee9apaj838j9n2p2rqaswjn", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1upxrtt7nm7dpqe3ee9apaj838j9n2p2rqaswjn", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1v5hrqlv8dqgzvy0pwzqzg0gxy899rm4k062rxd", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1v5hrqlv8dqgzvy0pwzqzg0gxy899rm4k062rxd", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12uspvr6qnrn9exf083t8l3khmd5n4r746n6ydf", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12uspvr6qnrn9exf083t8l3khmd5n4r746n6ydf", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1v4ztxdpczle3z0n7ad4sgpe6a3ln4re8emev6n", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1v4ztxdpczle3z0n7ad4sgpe6a3ln4re8emev6n", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1xtzdn5suscpvmsfrm49u0025f8ars4zhwhupln", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1xtzdn5suscpvmsfrm49u0025f8ars4zhwhupln", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1ckz4f7gsqgsgv6q75rn038nsat6e68h4k9pl8g", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1ckz4f7gsqgsgv6q75rn038nsat6e68h4k9pl8g", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper18xr68spwm96vvehuvwf6ay9er0gd7q7ae8w8ns", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper18xr68spwm96vvehuvwf6ay9er0gd7q7ae8w8ns", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1w4slt0un6ac2l6nnwkkrm2yg39mghpgx98v0ka", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1w4slt0un6ac2l6nnwkkrm2yg39mghpgx98v0ka", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1u77g4a7tnt32uy7n4aknp9dtm9a86mypd29svm", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1u77g4a7tnt32uy7n4aknp9dtm9a86mypd29svm", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12ut47cxmnwgflwwryw4akvkrfda4kn0elzy6jc", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12ut47cxmnwgflwwryw4akvkrfda4kn0elzy6jc", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1jryrapf54q7gza547t490qkdgsjh5ngmc4xtm7", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1jryrapf54q7gza547t490qkdgsjh5ngmc4xtm7", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper15mxm5zujmm6xrdvp6wjzyupuprzv0a0xrww8cu", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper15mxm5zujmm6xrdvp6wjzyupuprzv0a0xrww8cu", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1l3whttjtav328jntcswfy63p9ell9uk0fp50zh", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1l3whttjtav328jntcswfy63p9ell9uk0fp50zh", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1nf7p9xlqw4jzzhslndtc40hac0g9askzrfplxg", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1nf7p9xlqw4jzzhslndtc40hac0g9askzrfplxg", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1jxv0u20scum4trha72c7ltfgfqef6nsck8t73h", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1jxv0u20scum4trha72c7ltfgfqef6nsck8t73h", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper15urq2dtp9qce4fyc85m6upwm9xul3049ckp6x4", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper15urq2dtp9qce4fyc85m6upwm9xul3049ckp6x4", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1wgdlgrd77vl385xaj6c929hh8lzltl5ajjdzv7", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1wgdlgrd77vl385xaj6c929hh8lzltl5ajjdzv7", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12xrk9wxmh7z4n5s5d8hk7zumn0hqu6z69a3e9f", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper12xrk9wxmh7z4n5s5d8hk7zumn0hqu6z69a3e9f", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1undq3eavkylu7x8jzx208xgu7asze7xr2kurzp", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1undq3eavkylu7x8jzx208xgu7asze7xr2kurzp", + index: true, + }, + ], + }, + Event { + kind: "commission", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1thl5syhmscgnj7whdyrydw3w6vy80044kt2h0u", + index: true, + }, + ], + }, + Event { + kind: "rewards", + attributes: [ + EventAttribute { + key: "amount", + value: "", + index: true, + }, + EventAttribute { + key: "validator", + value: "nvaloper1thl5syhmscgnj7whdyrydw3w6vy80044kt2h0u", + index: true, + }, + ], + }, + ], + }, + ), + result_end_block: Some( + EndBlock { + validator_updates: [], + consensus_param_updates: Some( + Params { + block: Size { + max_bytes: 22020096, + max_gas: -1, + time_iota_ms: 1000, + }, + evidence: Params { + max_age_num_blocks: 100000, + max_age_duration: Duration( + 172800s, + ), + max_bytes: 1048576, + }, + validator: ValidatorParams { + pub_key_types: [ + Ed25519, + ], + }, + version: None, + abci: AbciParams { + vote_extensions_enable_height: None, + }, + }, + ), + events: [], + }, + ), + }, + events: Some( + { + "coin_received.amount": [ + "", + "", + ], + "coin_received.receiver": [ + "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + "n1jv65s3grqf6v6jl3dp4t6c9t9rk99cd84mn7k6", + ], + "coin_spent.amount": [ + "", + "", + ], + "coin_spent.spender": [ + "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + ], + "commission.amount": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ], + "commission.validator": [ + "nvaloper1xgyczxuxspeytdpyvp3w840ckzp4env4phq67x", + "nvaloper1e22wh85arrkpe6derct4l5r4gp3awvase24pf6", + "nvaloper1gjtvly9lel6zskvwtvlg5vhwpu9c9wawlfdx8d", + "nvaloper1ef8fjswyuxnv9779qfug042aca8hevenvnfcfm", + "nvaloper18mgnd9k6rytn6tz7pf8d2d4dawl7e9crunrsxd", + "nvaloper1h9ywl4ff7tpf8yzp7u9k5w0ks3rdnsercjjs0a", + "nvaloper14epla9mvgwl8456l4emvvchyj6reqg8a79fayw", + "nvaloper197ml8ded7rpj3ezk55zjsavzemn549vuhy6qrh", + "nvaloper1q8cnx8s06q7ralnskqvj0acvqgacau6djqkm3z", + "nvaloper1uw3y3g6du2xxvlsu7qtv9vwvq7nqe5t65u0aph", + "nvaloper166m7e8hxntq8e68whqrfk37f32xyk3eer0t427", + "nvaloper1mlmqlkxjttj6m4wwmf5eur35n3hf5zm2ev2vjj", + "nvaloper1aqxz5rhsu59tz3fykskqprarq2c2vxqv2jaysv", + "nvaloper1upxrtt7nm7dpqe3ee9apaj838j9n2p2rqaswjn", + "nvaloper1v5hrqlv8dqgzvy0pwzqzg0gxy899rm4k062rxd", + "nvaloper12uspvr6qnrn9exf083t8l3khmd5n4r746n6ydf", + "nvaloper1v4ztxdpczle3z0n7ad4sgpe6a3ln4re8emev6n", + "nvaloper1xtzdn5suscpvmsfrm49u0025f8ars4zhwhupln", + "nvaloper1ckz4f7gsqgsgv6q75rn038nsat6e68h4k9pl8g", + "nvaloper18xr68spwm96vvehuvwf6ay9er0gd7q7ae8w8ns", + "nvaloper1w4slt0un6ac2l6nnwkkrm2yg39mghpgx98v0ka", + "nvaloper1u77g4a7tnt32uy7n4aknp9dtm9a86mypd29svm", + "nvaloper12ut47cxmnwgflwwryw4akvkrfda4kn0elzy6jc", + "nvaloper1jryrapf54q7gza547t490qkdgsjh5ngmc4xtm7", + "nvaloper15mxm5zujmm6xrdvp6wjzyupuprzv0a0xrww8cu", + "nvaloper1l3whttjtav328jntcswfy63p9ell9uk0fp50zh", + "nvaloper1nf7p9xlqw4jzzhslndtc40hac0g9askzrfplxg", + "nvaloper1jxv0u20scum4trha72c7ltfgfqef6nsck8t73h", + "nvaloper15urq2dtp9qce4fyc85m6upwm9xul3049ckp6x4", + "nvaloper1wgdlgrd77vl385xaj6c929hh8lzltl5ajjdzv7", + "nvaloper12xrk9wxmh7z4n5s5d8hk7zumn0hqu6z69a3e9f", + "nvaloper1undq3eavkylu7x8jzx208xgu7asze7xr2kurzp", + "nvaloper1thl5syhmscgnj7whdyrydw3w6vy80044kt2h0u", + ], + "message.sender": [ + "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + ], + "mint.amount": [ + "0", + ], + "mint.annual_provisions": [ + "0.000000000000000000", + ], + "mint.bonded_ratio": [ + "0.048174013441366915", + ], + "mint.inflation": [ + "0.000000000000000000", + ], + "rewards.amount": [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + ], + "rewards.validator": [ + "nvaloper1xgyczxuxspeytdpyvp3w840ckzp4env4phq67x", + "nvaloper1e22wh85arrkpe6derct4l5r4gp3awvase24pf6", + "nvaloper1gjtvly9lel6zskvwtvlg5vhwpu9c9wawlfdx8d", + "nvaloper1ef8fjswyuxnv9779qfug042aca8hevenvnfcfm", + "nvaloper18mgnd9k6rytn6tz7pf8d2d4dawl7e9crunrsxd", + "nvaloper1h9ywl4ff7tpf8yzp7u9k5w0ks3rdnsercjjs0a", + "nvaloper14epla9mvgwl8456l4emvvchyj6reqg8a79fayw", + "nvaloper197ml8ded7rpj3ezk55zjsavzemn549vuhy6qrh", + "nvaloper1q8cnx8s06q7ralnskqvj0acvqgacau6djqkm3z", + "nvaloper1uw3y3g6du2xxvlsu7qtv9vwvq7nqe5t65u0aph", + "nvaloper166m7e8hxntq8e68whqrfk37f32xyk3eer0t427", + "nvaloper1mlmqlkxjttj6m4wwmf5eur35n3hf5zm2ev2vjj", + "nvaloper1aqxz5rhsu59tz3fykskqprarq2c2vxqv2jaysv", + "nvaloper1upxrtt7nm7dpqe3ee9apaj838j9n2p2rqaswjn", + "nvaloper1v5hrqlv8dqgzvy0pwzqzg0gxy899rm4k062rxd", + "nvaloper12uspvr6qnrn9exf083t8l3khmd5n4r746n6ydf", + "nvaloper1v4ztxdpczle3z0n7ad4sgpe6a3ln4re8emev6n", + "nvaloper1xtzdn5suscpvmsfrm49u0025f8ars4zhwhupln", + "nvaloper1ckz4f7gsqgsgv6q75rn038nsat6e68h4k9pl8g", + "nvaloper18xr68spwm96vvehuvwf6ay9er0gd7q7ae8w8ns", + "nvaloper1w4slt0un6ac2l6nnwkkrm2yg39mghpgx98v0ka", + "nvaloper1u77g4a7tnt32uy7n4aknp9dtm9a86mypd29svm", + "nvaloper12ut47cxmnwgflwwryw4akvkrfda4kn0elzy6jc", + "nvaloper1jryrapf54q7gza547t490qkdgsjh5ngmc4xtm7", + "nvaloper15mxm5zujmm6xrdvp6wjzyupuprzv0a0xrww8cu", + "nvaloper1l3whttjtav328jntcswfy63p9ell9uk0fp50zh", + "nvaloper1nf7p9xlqw4jzzhslndtc40hac0g9askzrfplxg", + "nvaloper1jxv0u20scum4trha72c7ltfgfqef6nsck8t73h", + "nvaloper15urq2dtp9qce4fyc85m6upwm9xul3049ckp6x4", + "nvaloper1wgdlgrd77vl385xaj6c929hh8lzltl5ajjdzv7", + "nvaloper12xrk9wxmh7z4n5s5d8hk7zumn0hqu6z69a3e9f", + "nvaloper1undq3eavkylu7x8jzx208xgu7asze7xr2kurzp", + "nvaloper1thl5syhmscgnj7whdyrydw3w6vy80044kt2h0u", + ], + "tm.event": [ + "NewBlock", + ], + "transfer.amount": [ + "", + "", + ], + "transfer.recipient": [ + "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + "n1jv65s3grqf6v6jl3dp4t6c9t9rk99cd84mn7k6", + ], + "transfer.sender": [ + "n1m3h30wlvsf8llruxtpukdvsy0km2kum864s6c9", + "n17xpfvakm2amg962yls6f84z3kell8c5lza5z5c", + ], + }, + ), +} diff --git a/nym-validator-rewarder/src/cli/run.rs b/nym-validator-rewarder/src/cli/run.rs index 717edff440..7866053766 100644 --- a/nym-validator-rewarder/src/cli/run.rs +++ b/nym-validator-rewarder/src/cli/run.rs @@ -2,8 +2,10 @@ // SPDX-License-Identifier: GPL-3.0-only use crate::cli::try_load_current_config; +use crate::config::Config; use crate::error::NymRewarderError; use crate::rewarder::Rewarder; +use bip39::Mnemonic; use std::path::PathBuf; #[derive(Debug, clap::Args)] @@ -13,7 +15,9 @@ pub struct Args { } pub(crate) async fn execute(args: Args) -> Result<(), NymRewarderError> { - let config = try_load_current_config(&args.custom_config_path)?.with_override(args); + // let config = try_load_current_config(&args.custom_config_path)?.with_override(args); + + let config = Config::new(Mnemonic::generate(24).unwrap()); Rewarder::new(config).run().await } diff --git a/nym-validator-rewarder/src/rewarder/mod.rs b/nym-validator-rewarder/src/rewarder/mod.rs index 0c54f8a835..8dd2534bbc 100644 --- a/nym-validator-rewarder/src/rewarder/mod.rs +++ b/nym-validator-rewarder/src/rewarder/mod.rs @@ -3,10 +3,14 @@ use crate::config::Config; use crate::error::NymRewarderError; +use futures::StreamExt; use nym_network_defaults::NymNetworkDetails; use nym_task::TaskManager; +use nym_validator_client::nyxd::module_traits::StakingQueryClient; +use nym_validator_client::nyxd::{Paging, TendermintRpcClient}; use nym_validator_client::{nyxd, DirectSigningHttpRpcNyxdClient}; -use tendermint_rpc::WebSocketClient; +use tendermint_rpc::query::EventType; +use tendermint_rpc::{SubscriptionClient, WebSocketClient}; use tracing::info; mod tasks; @@ -29,55 +33,56 @@ impl Rewarder { // // - // let client_config = - // nyxd::Config::try_from_nym_network_details(&NymNetworkDetails::new_from_env())?; - // - // let client = DirectSigningHttpRpcNyxdClient::connect_with_mnemonic( - // client_config, - // self.config.base.upstream_nyxd.as_str(), - // // note: the clone here is fine as the mnemonic itself implements ZeroizeOnDrop - // self.config.base.mnemonic.clone(), - // )?; + let client_config = + nyxd::Config::try_from_nym_network_details(&NymNetworkDetails::new_from_env())?; - let (client, driver) = WebSocketClient::new("https://rpc.nymtech.net/") - .await - .unwrap(); - /* - /// #[tokio::main] - /// async fn main() { - /// let (client, driver) = WebSocketClient::new("ws://127.0.0.1:26657/websocket") - /// .await - /// .unwrap(); - /// let driver_handle = tokio::spawn(async move { driver.run().await }); - /// - /// // Standard client functionality - /// let tx = format!("some-key=some-value"); - /// client.broadcast_tx_async(Transaction::from(tx.into_bytes())).await.unwrap(); - /// - /// // Subscription functionality - /// let mut subs = client.subscribe(EventType::NewBlock.into()) - /// .await - /// .unwrap(); - /// - /// // Grab 5 NewBlock events - /// let mut ev_count = 5_i32; - /// - /// while let Some(res) = subs.next().await { - /// let ev = res.unwrap(); - /// println!("Got event: {:?}", ev); - /// ev_count -= 1; - /// if ev_count < 0 { - /// break; - /// } - /// } - /// - /// // Signal to the driver to terminate. - /// client.close().unwrap(); - /// // Await the driver's termination to ensure proper connection closure. - /// let _ = driver_handle.await.unwrap(); - /// } - /// ``` - */ + let client = DirectSigningHttpRpcNyxdClient::connect_with_mnemonic( + client_config, + self.config.base.upstream_nyxd.as_str(), + // note: the clone here is fine as the mnemonic itself implements ZeroizeOnDrop + self.config.base.mnemonic.clone(), + )?; + + let foo = StakingQueryClient::validator( + &client, + "nvaloper1l3whttjtav328jntcswfy63p9ell9uk0fp50zh" + .parse() + .unwrap(), + ) + .await + .unwrap(); + + println!("{:#?}", foo); + + // client.validator("").await.unwrap(); + + // let validators = client.validators(10015526u32, Paging::All).await.unwrap(); + + // println!("{:#?}", validators); + + // let (client, driver) = WebSocketClient::new("wss://rpc.nymtech.net/websocket") + // .await + // .unwrap(); + // + // let driver_handle = tokio::spawn(async move { driver.run().await }); + // + // let mut subs = client.subscribe(EventType::NewBlock.into()).await.unwrap(); + // + // let mut ev_count = 10; + // while let Some(res) = subs.next().await { + // let ev = res.unwrap(); + // println!("Got event: {:#?}", ev); + // break; + // // ev_count -= 1; + // // if ev_count < 0 { + // // break; + // // } + // } + // + // // Signal to the driver to terminate. + // client.close().unwrap(); + // // Await the driver's termination to ensure proper connection closure. + // let _ = driver_handle.await.unwrap(); /* task 1: diff --git a/nym-validator-rewarder/src/rewarder/tasks/block_watcher.rs b/nym-validator-rewarder/src/rewarder/tasks/block_watcher.rs new file mode 100644 index 0000000000..c4a77ff737 --- /dev/null +++ b/nym-validator-rewarder/src/rewarder/tasks/block_watcher.rs @@ -0,0 +1,5 @@ +// Copyright 2023 - Nym Technologies SA +// SPDX-License-Identifier: GPL-3.0-only + +// sure, we could subscribe to new block events and watch for signing of every single block +// but realistically we don't need that kind of accuracy so just checking the VP every few minutes is enough diff --git a/nym-validator-rewarder/src/rewarder/tasks/mod.rs b/nym-validator-rewarder/src/rewarder/tasks/mod.rs index af282c5deb..c6656f2a73 100644 --- a/nym-validator-rewarder/src/rewarder/tasks/mod.rs +++ b/nym-validator-rewarder/src/rewarder/tasks/mod.rs @@ -1,2 +1,4 @@ // Copyright 2023 - Nym Technologies SA // SPDX-License-Identifier: GPL-3.0-only + +pub mod block_watcher;