diff --git a/Cargo.lock b/Cargo.lock index 3c33f08d684..260200738ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -14111,6 +14111,7 @@ dependencies = [ "ibc-union-spec", "ics23", "lazy_static", + "protos", "serde_json", "sha2 0.10.9", "tendermint-light-client-types", @@ -14154,7 +14155,10 @@ dependencies = [ name = "tendermint-verifier" version = "0.0.0" dependencies = [ + "ark-bls12-381 0.5.0", + "ark-serialize 0.5.0", "cometbft-types", + "cosmwasm-std", "ed25519-dalek", "hex-literal 1.1.0", "prost 0.12.6", diff --git a/Cargo.toml b/Cargo.toml index 729807681ab..82bf1d79c03 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -292,11 +292,11 @@ members = [ ] [workspace.package] -authors = ["Union Labs"] -edition = "2024" -license-file = "LICENSE" -publish = false -repository = "https://github.com/unionlabs/union" +authors = ["Union Labs"] +edition = "2024" +license = "MIT OR Apache-2.0" +publish = false +repository = "https://github.com/unionlabs/union" [workspace.metadata.cargo-machete] ignored = ["embed-commit"] diff --git a/cosmwasm/access-managed/Cargo.toml b/cosmwasm/access-managed/Cargo.toml index b573adada88..4977b09b357 100644 --- a/cosmwasm/access-managed/Cargo.toml +++ b/cosmwasm/access-managed/Cargo.toml @@ -2,11 +2,11 @@ name = "access-managed" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/access-manager/Cargo.toml b/cosmwasm/access-manager/Cargo.toml index cc4a1cf4ca8..ba5b1e7f1b0 100644 --- a/cosmwasm/access-manager/Cargo.toml +++ b/cosmwasm/access-manager/Cargo.toml @@ -2,11 +2,11 @@ name = "access-manager" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/app/ucs00-pingpong/Cargo.toml b/cosmwasm/app/ucs00-pingpong/Cargo.toml index d7bbf59bdd6..5402323fb25 100644 --- a/cosmwasm/app/ucs00-pingpong/Cargo.toml +++ b/cosmwasm/app/ucs00-pingpong/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs00-pingpong" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/app/ucs03-zkgm/Cargo.toml b/cosmwasm/app/ucs03-zkgm/Cargo.toml index 10d20ababa9..0623a07dd3e 100644 --- a/cosmwasm/app/ucs03-zkgm/Cargo.toml +++ b/cosmwasm/app/ucs03-zkgm/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs03-zkgm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/app/ucs03-zkgm/src/contract.rs b/cosmwasm/app/ucs03-zkgm/src/contract.rs index 80ffbb9dd71..09bdacb956f 100644 --- a/cosmwasm/app/ucs03-zkgm/src/contract.rs +++ b/cosmwasm/app/ucs03-zkgm/src/contract.rs @@ -3528,3 +3528,17 @@ fn proxy_salt() { &hex_literal::hex!("6122846875c88a0694bb88749a175b0409aba7377dec45ba67824daef3fed7ab") ); } + +#[test] +fn salt_salt() { + let sender = "osmo1ucfp73mvq2nvyzjdm9qq7u02e69yggd27r38an8gkg4jdpxhy0xscusxnn".as_bytes(); + let salt: H256 = hex_literal::hex!("078d4a6dcc423d93beb8367b6e9ec195837e0c562edb89d5e4275f9233b80831").into(); + + let preimage: Bytes = (sender, salt).abi_encode().into(); + + dbg!(&preimage); + + let salted_salt = keccak256(preimage); + + dbg!(salted_salt); +} diff --git a/cosmwasm/core/Cargo.toml b/cosmwasm/core/Cargo.toml index 3cd0d3fca85..b60c3c38149 100644 --- a/cosmwasm/core/Cargo.toml +++ b/cosmwasm/core/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-union" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/core/light-client-interface/Cargo.toml b/cosmwasm/core/light-client-interface/Cargo.toml index 00bf3dbd45f..f979680e9c8 100644 --- a/cosmwasm/core/light-client-interface/Cargo.toml +++ b/cosmwasm/core/light-client-interface/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-union-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/core/msg/Cargo.toml b/cosmwasm/core/msg/Cargo.toml index 070b9ac1732..cc64bcc9eb1 100644 --- a/cosmwasm/core/msg/Cargo.toml +++ b/cosmwasm/core/msg/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-union-msg" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/cw-account/Cargo.toml b/cosmwasm/cw-account/Cargo.toml index b2b27d6cfb3..90853229516 100644 --- a/cosmwasm/cw-account/Cargo.toml +++ b/cosmwasm/cw-account/Cargo.toml @@ -2,11 +2,11 @@ name = "cw-account" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/cw-escrow-vault/Cargo.toml b/cosmwasm/cw-escrow-vault/Cargo.toml index 30803231e59..9aaf963e7c5 100644 --- a/cosmwasm/cw-escrow-vault/Cargo.toml +++ b/cosmwasm/cw-escrow-vault/Cargo.toml @@ -2,11 +2,11 @@ name = "cw-escrow-vault" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/cw-unionversal-token/Cargo.toml b/cosmwasm/cw-unionversal-token/Cargo.toml index 8ecb8eb68db..136fdeb3519 100644 --- a/cosmwasm/cw-unionversal-token/Cargo.toml +++ b/cosmwasm/cw-unionversal-token/Cargo.toml @@ -2,11 +2,11 @@ name = "cw-unionversal-token" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/cw20-token-minter/Cargo.toml b/cosmwasm/cw20-token-minter/Cargo.toml index feed2d5487a..03dcd4352f9 100644 --- a/cosmwasm/cw20-token-minter/Cargo.toml +++ b/cosmwasm/cw20-token-minter/Cargo.toml @@ -2,11 +2,11 @@ name = "cw20-token-minter" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/cw20-wrapped-tokenfactory/Cargo.toml b/cosmwasm/cw20-wrapped-tokenfactory/Cargo.toml index 989ee47fdf1..bec43ececf8 100644 --- a/cosmwasm/cw20-wrapped-tokenfactory/Cargo.toml +++ b/cosmwasm/cw20-wrapped-tokenfactory/Cargo.toml @@ -2,11 +2,11 @@ name = "cw20-wrapped-tokenfactory" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/deployer/Cargo.toml b/cosmwasm/deployer/Cargo.toml index fd2ed5cf3a7..82a3c1ae325 100644 --- a/cosmwasm/deployer/Cargo.toml +++ b/cosmwasm/deployer/Cargo.toml @@ -2,11 +2,11 @@ name = "cosmwasm-deployer" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/gatekeeper/Cargo.toml b/cosmwasm/gatekeeper/Cargo.toml index d891cefb9c5..62a76a85812 100644 --- a/cosmwasm/gatekeeper/Cargo.toml +++ b/cosmwasm/gatekeeper/Cargo.toml @@ -2,11 +2,11 @@ name = "gatekeeper" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/arbitrum/Cargo.toml b/cosmwasm/lightclient/arbitrum/Cargo.toml index 932ea577032..b6e29713da0 100644 --- a/cosmwasm/lightclient/arbitrum/Cargo.toml +++ b/cosmwasm/lightclient/arbitrum/Cargo.toml @@ -2,11 +2,11 @@ name = "arbitrum-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/attested/Cargo.toml b/cosmwasm/lightclient/attested/Cargo.toml index 909f19da878..0d560a6c0d5 100644 --- a/cosmwasm/lightclient/attested/Cargo.toml +++ b/cosmwasm/lightclient/attested/Cargo.toml @@ -2,11 +2,11 @@ name = "attested-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/berachain/Cargo.toml b/cosmwasm/lightclient/berachain/Cargo.toml index a712533e2a3..93df6e73923 100644 --- a/cosmwasm/lightclient/berachain/Cargo.toml +++ b/cosmwasm/lightclient/berachain/Cargo.toml @@ -2,11 +2,11 @@ name = "berachain-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/cometbls/Cargo.toml b/cosmwasm/lightclient/cometbls/Cargo.toml index d182f8acab0..395670d5110 100644 --- a/cosmwasm/lightclient/cometbls/Cargo.toml +++ b/cosmwasm/lightclient/cometbls/Cargo.toml @@ -2,11 +2,11 @@ name = "cometbls-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/ethereum/Cargo.toml b/cosmwasm/lightclient/ethereum/Cargo.toml index a321dbbfa06..0c0ecf827be 100644 --- a/cosmwasm/lightclient/ethereum/Cargo.toml +++ b/cosmwasm/lightclient/ethereum/Cargo.toml @@ -2,11 +2,11 @@ name = "ethereum-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/ethermint/Cargo.toml b/cosmwasm/lightclient/ethermint/Cargo.toml index ec01375fb1d..13f38a2ea7c 100644 --- a/cosmwasm/lightclient/ethermint/Cargo.toml +++ b/cosmwasm/lightclient/ethermint/Cargo.toml @@ -2,11 +2,11 @@ name = "ethermint-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/ethermint/src/client.rs b/cosmwasm/lightclient/ethermint/src/client.rs index 6894d231253..03f7c4db778 100644 --- a/cosmwasm/lightclient/ethermint/src/client.rs +++ b/cosmwasm/lightclient/ethermint/src/client.rs @@ -8,7 +8,6 @@ use ibc_union_light_client::{ use ics23::ibc_api::SDK_SPECS; use tendermint_light_client::verifier::Ed25519Verifier; use tendermint_light_client_types::{ConsensusState, Header}; -use tendermint_verifier::types::SignatureVerifier; use unionlabs::{ encoding::Bincode, ethereum::ibc_commitment_key, ibc::core::commitment::merkle_proof::MerkleProof, @@ -121,7 +120,7 @@ impl IbcClient for EthermintLightClient { consensus_state, header, ctx.env.block.time, - &SignatureVerifier::new(Ed25519Verifier::new(ctx.deps)), + Ed25519Verifier::new(ctx.deps), ) .map_err(Error::from)?; let state_update = StateUpdate::new(height, consensus_state); diff --git a/cosmwasm/lightclient/ethermint/src/errors.rs b/cosmwasm/lightclient/ethermint/src/errors.rs index 299accdeff3..84026a037d5 100644 --- a/cosmwasm/lightclient/ethermint/src/errors.rs +++ b/cosmwasm/lightclient/ethermint/src/errors.rs @@ -3,7 +3,7 @@ use unionlabs::primitives::FixedBytesError; use crate::client::EthermintLightClient; -#[derive(Debug, Clone, PartialEq, thiserror::Error)] +#[derive(Debug, thiserror::Error)] pub enum Error { #[error("tendermint light client error")] Tendermint(#[source] tendermint_light_client::errors::Error), diff --git a/cosmwasm/lightclient/movement/Cargo.toml b/cosmwasm/lightclient/movement/Cargo.toml index 57ddc9bd8d7..5c3e311dd66 100644 --- a/cosmwasm/lightclient/movement/Cargo.toml +++ b/cosmwasm/lightclient/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "movement-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/proof-lens/Cargo.toml b/cosmwasm/lightclient/proof-lens/Cargo.toml index be1a86fa7a7..38bd80cd028 100644 --- a/cosmwasm/lightclient/proof-lens/Cargo.toml +++ b/cosmwasm/lightclient/proof-lens/Cargo.toml @@ -2,11 +2,11 @@ name = "proof-lens-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/state-lens-ics23-ics23/Cargo.toml b/cosmwasm/lightclient/state-lens-ics23-ics23/Cargo.toml index b76adb75c68..41acd0dbcd8 100644 --- a/cosmwasm/lightclient/state-lens-ics23-ics23/Cargo.toml +++ b/cosmwasm/lightclient/state-lens-ics23-ics23/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-ics23-ics23-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/state-lens-ics23-mpt/Cargo.toml b/cosmwasm/lightclient/state-lens-ics23-mpt/Cargo.toml index 633651b4088..8733d2cea49 100644 --- a/cosmwasm/lightclient/state-lens-ics23-mpt/Cargo.toml +++ b/cosmwasm/lightclient/state-lens-ics23-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-ics23-mpt-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/state-lens-ics23-smt/Cargo.toml b/cosmwasm/lightclient/state-lens-ics23-smt/Cargo.toml index 6ad4a112a92..7103ecb7494 100644 --- a/cosmwasm/lightclient/state-lens-ics23-smt/Cargo.toml +++ b/cosmwasm/lightclient/state-lens-ics23-smt/Cargo.toml @@ -1,10 +1,10 @@ [package] -authors = ["Union Labs"] -edition = "2021" -license-file = { workspace = true } -name = "state-lens-ics23-smt-light-client" -publish = false -version = "0.0.0" +authors = ["Union Labs"] +edition = "2021" +license = { workspace = true } +name = "state-lens-ics23-smt-light-client" +publish = false +version = "0.0.0" [lints] workspace = true diff --git a/cosmwasm/lightclient/sui/Cargo.toml b/cosmwasm/lightclient/sui/Cargo.toml index 534241133f3..04c20ec74b0 100644 --- a/cosmwasm/lightclient/sui/Cargo.toml +++ b/cosmwasm/lightclient/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "sui-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lightclient/tendermint/Cargo.toml b/cosmwasm/lightclient/tendermint/Cargo.toml index 837a56129ad..bb9f0f01284 100644 --- a/cosmwasm/lightclient/tendermint/Cargo.toml +++ b/cosmwasm/lightclient/tendermint/Cargo.toml @@ -2,11 +2,11 @@ name = "tendermint-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true @@ -25,11 +25,13 @@ frissitheto = { workspace = true } ibc-union-light-client = { workspace = true } ibc-union-spec = { workspace = true } ics23 = { workspace = true } +protos = { workspace = true } sha2 = { workspace = true } tendermint-light-client-types = { workspace = true, features = ["ethabi", "bincode"] } -tendermint-verifier = { workspace = true } -thiserror = { workspace = true } -unionlabs = { workspace = true } + +tendermint-verifier = { workspace = true } +thiserror = { workspace = true } +unionlabs = { workspace = true } [dev-dependencies] base64 = { workspace = true } diff --git a/cosmwasm/lightclient/tendermint/src/client.rs b/cosmwasm/lightclient/tendermint/src/client.rs index 44cbc0278ff..cbd701cef5d 100644 --- a/cosmwasm/lightclient/tendermint/src/client.rs +++ b/cosmwasm/lightclient/tendermint/src/client.rs @@ -1,4 +1,5 @@ use cometbft_types::{ + CometbftHeight, crypto::public_key::PublicKey, types::{commit::Commit, signed_header::SignedHeader, validator_set::ValidatorSet}, }; @@ -6,14 +7,12 @@ use cosmwasm_std::{Addr, Empty}; use ibc_union_light_client::{ ClientCreationResult, IbcClient, IbcClientCtx, IbcClientError, StateUpdate, spec::Status, }; -use ibc_union_spec::path::IBC_UNION_COSMWASM_COMMITMENT_PREFIX; +use ibc_union_spec::{Timestamp, path::IBC_UNION_COSMWASM_COMMITMENT_PREFIX}; use ics23::ibc_api::SDK_SPECS; use tendermint_light_client_types::{ClientState, ConsensusState, Header}; -use tendermint_verifier::types::{HostFns, SignatureVerifier}; +use tendermint_verifier::types::Verification; use unionlabs::{ - bounded::BoundedI64, encoding::Bincode, - google::protobuf::{duration::Duration, timestamp::Timestamp}, ibc::core::{ client::height::Height, commitment::{merkle_proof::MerkleProof, merkle_root::MerkleRoot}, @@ -111,7 +110,7 @@ impl IbcClient for TendermintLightClient { consensus_state, header, ctx.env.block.time, - &SignatureVerifier::new(Ed25519Verifier::new(ctx.deps)), + Ed25519Verifier::new(ctx.deps), )?), _ => Err(Error::InvalidValidatorSet.into()), } @@ -147,8 +146,8 @@ impl IbcClient for TendermintLightClient { } } - fn get_timestamp(consensus_state: &Self::ConsensusState) -> ibc_union_spec::Timestamp { - ibc_union_spec::Timestamp::from_nanos(consensus_state.timestamp.as_unix_nanos()) + fn get_timestamp(consensus_state: &Self::ConsensusState) -> Timestamp { + Timestamp::from_nanos(consensus_state.timestamp.as_unix_nanos()) } fn get_latest_height(client_state: &Self::ClientState) -> u64 { @@ -169,12 +168,12 @@ impl IbcClient for TendermintLightClient { } } -pub fn verify_header( +pub fn verify_header( mut client_state: ClientState, consensus_state: ConsensusState, mut header: Header, block_timestamp: cosmwasm_std::Timestamp, - signature_verifier: &SignatureVerifier, + mut signature_verifier: V, ) -> Result, Error> { set_total_voting_power(&mut header.validator_set).map_err(Error::from)?; set_total_voting_power(&mut header.trusted_validators).map_err(Error::from)?; @@ -245,7 +244,7 @@ pub fn verify_header( block_timestamp_proto, client_state.max_clock_drift, &client_state.trust_level, - signature_verifier, + &mut signature_verifier, ) .map_err(Error::TendermintVerify)?; @@ -290,8 +289,8 @@ pub fn set_total_voting_power(validator_set: &mut ValidatorSet) -> Result<(), Ma pub fn construct_partial_header( chain_id: String, - height: BoundedI64<0, { i64::MAX }>, - time: Timestamp, + height: CometbftHeight, + time: unionlabs::google::protobuf::timestamp::Timestamp, next_validators_hash: H256, ) -> SignedHeader { SignedHeader { @@ -321,9 +320,9 @@ pub fn construct_partial_header( } pub fn is_client_expired( - consensus_state_timestamp: &Timestamp, - trusting_period: Duration, - current_block_time: Timestamp, + consensus_state_timestamp: &unionlabs::google::protobuf::timestamp::Timestamp, + trusting_period: unionlabs::google::protobuf::duration::Duration, + current_block_time: unionlabs::google::protobuf::timestamp::Timestamp, ) -> bool { if let Some(sum) = consensus_state_timestamp.checked_add(trusting_period) { sum < current_block_time @@ -413,206 +412,44 @@ pub fn verify_non_membership( .map_err(Error::VerifyMembership) } -// #[cfg(test)] -// mod tests { -// use std::fs; - -// use cosmwasm_std::{ -// testing::{mock_dependencies, MockApi, MockQuerier, MockStorage}, -// OwnedDeps, -// }; -// use ics008_wasm_client::{ -// storage_utils::{ -// consensus_db_key, read_subject_consensus_state, HOST_CLIENT_STATE_KEY, -// SUBJECT_CLIENT_STORE_PREFIX, SUBSTITUTE_CLIENT_STORE_PREFIX, -// }, -// FROZEN_HEIGHT, -// }; -// use unionlabs::{encoding::EncodeAs, google::protobuf::any::Any}; - -// use super::*; - -// const INITIAL_CONSENSUS_STATE_HEIGHT: Height = Height::new_with_revision(1, 10); - -// const INITIAL_SUBSTITUTE_CONSENSUS_STATE_HEIGHT: Height = Height::new_with_revision(1, 12); - -// fn save_states_to_migrate_store( -// deps: DepsMut, -// subject_client_state: &WasmClientStateOf, -// substitute_client_state: &WasmClientStateOf, -// subject_consensus_state: &WasmConsensusStateOf, -// substitute_consensus_state: &WasmConsensusStateOf, -// ) { -// deps.storage.set( -// format!("{SUBJECT_CLIENT_STORE_PREFIX}{HOST_CLIENT_STATE_KEY}").as_bytes(), -// &Any(subject_client_state.clone()).encode_as::(), -// ); -// deps.storage.set( -// format!( -// "{SUBJECT_CLIENT_STORE_PREFIX}{}", -// consensus_db_key(&INITIAL_CONSENSUS_STATE_HEIGHT) -// ) -// .as_bytes(), -// &Any(subject_consensus_state.clone()).encode_as::(), -// ); -// deps.storage.set( -// format!("{SUBSTITUTE_CLIENT_STORE_PREFIX}{HOST_CLIENT_STATE_KEY}").as_bytes(), -// &Any(substitute_client_state.clone()).encode_as::(), -// ); -// deps.storage.set( -// format!( -// "{SUBSTITUTE_CLIENT_STORE_PREFIX}{}", -// consensus_db_key(&INITIAL_SUBSTITUTE_CONSENSUS_STATE_HEIGHT) -// ) -// .as_bytes(), -// &Any(substitute_consensus_state.clone()).encode_as::(), -// ); -// } - -// #[allow(clippy::type_complexity)] // it's fine bro -// fn prepare_migrate_tests() -> ( -// OwnedDeps, -// WasmClientStateOf, -// WasmConsensusStateOf, -// WasmClientStateOf, -// WasmConsensusStateOf, -// ) { -// ( -// mock_dependencies(), -// serde_json::from_str(&fs::read_to_string("src/test/client_state.json").unwrap()) -// .unwrap(), -// serde_json::from_str(&fs::read_to_string("src/test/consensus_state.json").unwrap()) -// .unwrap(), -// serde_json::from_str( -// &fs::read_to_string("src/test/substitute_client_state.json").unwrap(), -// ) -// .unwrap(), -// serde_json::from_str( -// &fs::read_to_string("src/test/substitute_consensus_state.json").unwrap(), -// ) -// .unwrap(), -// ) -// } - -// #[test] -// fn migrate_client_store_works() { -// let ( -// mut deps, -// mut wasm_client_state, -// wasm_consensus_state, -// substitute_wasm_client_state, -// substitute_wasm_consensus_state, -// ) = prepare_migrate_tests(); - -// wasm_client_state.frozen_height = Some(FROZEN_HEIGHT); - -// save_states_to_migrate_store( -// deps.as_mut(), -// &wasm_client_state, -// &substitute_wasm_client_state, -// &wasm_consensus_state, -// &substitute_wasm_consensus_state, -// ); - -// TendermintLightClient::migrate_client_store(deps.as_mut()).unwrap(); - -// let wasm_client_state: WasmClientStateOf = -// read_subject_client_state::(deps.as_ref()).unwrap(); -// // we didn't miss updating any fields -// assert_eq!(wasm_client_state, substitute_wasm_client_state); -// // client is unfrozen -// assert_eq!(wasm_client_state.frozen_height, None); - -// // the new consensus state is saved under the correct height -// assert_eq!( -// read_subject_consensus_state::( -// deps.as_ref(), -// &INITIAL_SUBSTITUTE_CONSENSUS_STATE_HEIGHT -// ) -// .unwrap() -// .unwrap(), -// substitute_wasm_consensus_state -// ); - -// // the new consensus state metadata is saved under substitute's latest height -// assert_eq!( -// get_current_or_next_consensus_state_meta( -// deps.as_ref(), -// INITIAL_SUBSTITUTE_CONSENSUS_STATE_HEIGHT -// ) -// .unwrap() -// .unwrap() -// .0, -// substitute_wasm_client_state.latest_height -// ); -// } - -// #[test] -// fn migrate_client_store_fails_when_invalid_change() { -// let ( -// mut deps, -// wasm_client_state, -// wasm_consensus_state, -// substitute_wasm_client_state, -// substitute_wasm_consensus_state, -// ) = prepare_migrate_tests(); - -// macro_rules! modify_fns { -// ($param:ident, $($m:expr), + $(,)?) => ([$(|$param: &mut ClientState| $m),+]) -// } - -// let modifications = modify_fns! { s, -// s.trust_level.numerator ^= u64::MAX, -// s.unbonding_period = Duration::new(s.unbonding_period.seconds().inner() + 1, 0).unwrap(), -// s.max_clock_drift = Duration::new(s.max_clock_drift.seconds().inner() + 1, 0).unwrap(), -// s.proof_specs.push(s.proof_specs[0].clone()), -// s.upgrade_path.push(String::new()), - -// }; - -// for m in modifications { -// let mut state = substitute_wasm_client_state.clone(); -// m(&mut state.data); - -// save_states_to_migrate_store( -// deps.as_mut(), -// &wasm_client_state, -// &state, -// &wasm_consensus_state, -// &substitute_wasm_consensus_state, -// ); -// assert_eq!( -// TendermintLightClient::migrate_client_store(deps.as_mut()), -// Err( -// Error::MigrateClientStore(MigrateClientStoreError::MigrateFieldsChanged).into() -// ) -// ); -// } -// } - -// #[test] -// fn migrate_client_store_fails_when_substitute_client_frozen() { -// let ( -// mut deps, -// wasm_client_state, -// wasm_consensus_state, -// mut substitute_wasm_client_state, -// substitute_wasm_consensus_state, -// ) = prepare_migrate_tests(); - -// substitute_wasm_client_state.frozen_height = Some(FROZEN_HEIGHT); - -// save_states_to_migrate_store( -// deps.as_mut(), -// &wasm_client_state, -// &substitute_wasm_client_state, -// &wasm_consensus_state, -// &substitute_wasm_consensus_state, -// ); - -// assert_eq!( -// TendermintLightClient::migrate_client_store(deps.as_mut()), -// Err(Error::MigrateClientStore(MigrateClientStoreError::SubstituteClientFrozen).into()) -// ); -// } -// } +#[cfg(test)] +mod tests { + use cosmwasm_std::{Timestamp, testing::mock_dependencies}; + + use super::*; + + #[test] + fn update_works() { + let mut client_state: ClientState = serde_json::from_str(r#"{"chain_id":"bbn-1","contract_address":"0xbcf923a74d8b8914e0235d28c6b59e62b547af5ce366c6aafcb006bce7bb3ba4","frozen_height":null,"latest_height":"1-1633807","max_clock_drift":"600s","proof_specs":[{"inner_spec":{"child_order":[0,1],"child_size":33,"empty_child":"0x","hash":"sha256","max_prefix_length":12,"min_prefix_length":4},"leaf_spec":{"hash":"sha256","length":"var_proto","prefix":"0x00","prehash_key":"no_hash","prehash_value":"sha256"},"max_depth":null,"min_depth":null,"prehash_key_before_comparison":false},{"inner_spec":{"child_order":[0,1],"child_size":32,"empty_child":"0x","hash":"sha256","max_prefix_length":1,"min_prefix_length":1},"leaf_spec":{"hash":"sha256","length":"var_proto","prefix":"0x00","prehash_key":"no_hash","prehash_value":"sha256"},"max_depth":null,"min_depth":null,"prehash_key_before_comparison":false}],"trust_level":{"denominator":3,"numerator":1},"trusting_period":"153000s","unbonding_period":"180000s","upgrade_path":["upgrade","upgradedIBCState"]}"#).unwrap(); + let consensus_state: ConsensusState = serde_json::from_str( + r#"{"next_validators_hash":"c9b4f641bc23183daae525375c4cafac8ec92cedce0a0ce10db5c17504772548","root":{"hash":"Pp8BdDrdm2ZXjanHtr4Ywfo9eXzcZS5qXLoMyNE3WjA="},"timestamp":"2025-10-14T13:12:47.949379130Z"}"#, + ).unwrap(); + let header: Header = serde_json::from_str(r#"{"signed_header":{"header":{"version":{"block":"11","app":"0"},"chain_id":"bbn-1","height":"1633942","time":"2025-10-14T13:35:06.754262528Z","last_block_id":{"hash":"b381e6826691148b254d80251b6d213c1733345d956b6361423e0289c8bc84f8","parts":{"total":2,"hash":"5dbd3fccc2b5314f37669e769a62876b095a251e881d04421ba32eb5cd25a178"}},"last_commit_hash":"13adaf0ed14d1b16a9691ae8bee92ce6628a686038eba7fd0523c4653fd8ed03","data_hash":"6f94eea24ff10576c878a1dca9edba1c3a3e7c72ecd3b362eb2bb19ad104bebf","validators_hash":"c9b4f641bc23183daae525375c4cafac8ec92cedce0a0ce10db5c17504772548","next_validators_hash":"c9b4f641bc23183daae525375c4cafac8ec92cedce0a0ce10db5c17504772548","consensus_hash":"22e3fa2d1695ae7db62e55677bf0c914b1ec88d64cd8d280cf2e29b2e06d0965","app_hash":"5df6d08ac2d45a92a47c0f363e0092f9742c1fd76842d663de7d85603bb5db90","last_results_hash":"331814b9a6ebc05b1abb5dd9c36f35e019d3fe17f0656a69105036d479c1ac9b","evidence_hash":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","proposer_address":"77be23139b650d69ede7985b31fd7b1cee9ca7d3"},"commit":{"height":"1633942","round":0,"block_id":{"hash":"6f22ca17c5acf577b941ef277127a3404e9aa8892c1443f5509781e38b15201c","parts":{"total":2,"hash":"3772dbc24457a603c8cae7c86670eb3e83d7df02bba68e52db15df39140a615f"}},"signatures":[{"block_id_flag":2,"validator_address":"3c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d","timestamp":"2025-10-14T13:35:16.804163532Z","signature":"GefUXSOxiaCIWrhd66QlF1oSRPxQTGldiOrVvpmKX8UoB0LdxJW8kTf2Uk4DYvVovvZaGMpRrXvgLO9a6dKSDQ=="},{"block_id_flag":2,"validator_address":"ec033669fe506006f870bd8b12cb524a3abc3693","timestamp":"2025-10-14T13:35:16.867200809Z","signature":"TaUHYm6l/zbKQJ6RdyAbsiGR1eFAV986zxjy9Xi7zf8+SOTl2xFUsW/y/3ipNRshYOSlS/fTn2cFOqmeCY7qAw=="},{"block_id_flag":2,"validator_address":"33ecd5899a91105bb4e51066eb138189bc3825ad","timestamp":"2025-10-14T13:35:16.833609848Z","signature":"mVc6yLH6eLhy2BjJpM66fj+MI/6Jgvbw2Atowqc6AkZJ/XJIOBA7LlXB8Iv9v4SCoiHyXl/JfIu26yglak1zDQ=="},{"block_id_flag":2,"validator_address":"44c395a4a96c6d1a450ed33b5a8ddb359cefed36","timestamp":"2025-10-14T13:35:16.798332784Z","signature":"b904ZAs5cnG1owtZcrW9e/3/c1AqdMLYoXzhmnkTdg4Lm4hlYttSuq/5mWpK3sK+JwWiYEh807so5jWe6Ga5Dg=="},{"block_id_flag":2,"validator_address":"c27b627c2fd11ee1e3e850738720692be2e3f4c6","timestamp":"2025-10-14T13:35:16.816085472Z","signature":"yCiZsCIhIG5gxtBSbBZm0H2be849ViO5T+yG7fO22/PwbvJ1uISpnSYtH8Ep2Za7+oAflB4dUFzQrc9f0oHyAw=="},{"block_id_flag":2,"validator_address":"64cdacb04fb9c3b290579644f9edbd05cb00bb7d","timestamp":"2025-10-14T13:35:16.813152025Z","signature":"u7dDFYj1LZ5AqzYswGfngeCIFGZdFRsHxi7gam3k1D7oEqxRCcrjO/GCNptWwfi1arKxJKFmg13mG7y87J1zBg=="},{"block_id_flag":2,"validator_address":"5295664886565f43a3074140551a755872bf6ffd","timestamp":"2025-10-14T13:35:16.886834062Z","signature":"32CIGKELVhqrukC0vA/s8UsO4yBBlfkxTwaxVAdlMzTW5A6tMUB8AaQjz8zO15+tCANVS9VWrGAOL2TCsRllCg=="},{"block_id_flag":2,"validator_address":"2a3d40c3e7ce8d6b55077335cab141c2e11ac254","timestamp":"2025-10-14T13:35:16.828611352Z","signature":"gUFAPtiz9nDvjNqfepdyCA1oRhr39J9vDn1WMKc5v+6oEWfg1w0g8kHbVfNMn9uzRLCSs433rdPmFTLA2J8QCQ=="},{"block_id_flag":2,"validator_address":"f2e6bb25d8d269c9737bd3789b11dc76c4fc56e7","timestamp":"2025-10-14T13:35:16.842935918Z","signature":"HZkPxUmcYBmwE5ec1sXS0TSk8T7tFI2L1asHAS8E8FXv856bXGvtsMOpwLndlYfWQiQhOFQJKa852mm6P99XDA=="},{"block_id_flag":2,"validator_address":"bb386aa0e7b37eb33516aebb58cae3574af85d1f","timestamp":"2025-10-14T13:35:16.822050330Z","signature":"kSzcwHsEAXsEIV6Vo/c9rKXnrDiREg2uwQy0m6tleCaaKusOR/Y5llkw3qaioPKOiO4QCfm0g4Kp6goJOqaiAw=="},{"block_id_flag":2,"validator_address":"43804074334ac6111233037efe20105c516b0e9f","timestamp":"2025-10-14T13:35:16.836502518Z","signature":"RslNh01lORp7eAOqjpm/xCTGVZjwGC8bmv42i3sj1F5mvfFkMwnybKn8q2bHFsLXK1k8kTW/1sUuX08aKndsAw=="},{"block_id_flag":2,"validator_address":"da37d2935eae0a92de55e86db2e887b4f18575f0","timestamp":"2025-10-14T13:35:16.822154654Z","signature":"odqMZ2cFJEOk67m7nR1+r+Muzgfj32iXcvrEx2jWLxyFuKLfg5DDhhe2nvlqKIftIqjGVZ8MtoYtMHqjiQMEDQ=="},{"block_id_flag":2,"validator_address":"9c4cc8543dc684948490681118957942b29a9200","timestamp":"2025-10-14T13:35:16.808194913Z","signature":"+49qNcxkAhPwQ2aojC/Ev4u0VsNu59IsgcEqgFj03Ettctf/MGlFHETjYvinhMX9IdAigadiwTVaaYQ7T+2mBw=="},{"block_id_flag":2,"validator_address":"01b2c0f03ba9b2f352a39bc45ce37aa2710b5af4","timestamp":"2025-10-14T13:35:16.945498341Z","signature":"z1ZjlgSx3RW61AzbDczjmDmYF+VZ1coT9Btz8xS7LVwThyHuHnHNipsEH2L27O7/9ULsc9ltII/P/9Ry4VyFBA=="},{"block_id_flag":2,"validator_address":"410c1ebaf54c090f0a9132dfa9f79e0f480b2c06","timestamp":"2025-10-14T13:35:16.860619759Z","signature":"xvEW4m6sfChUnG42RtDMqyaGC4FjjshgtwHNYH4NwbM7hZY5p/cpeERSGvsKHbS/Bq27Lm7mDa8bLsFZnYyIAA=="},{"block_id_flag":2,"validator_address":"c2989ed51e73b742e4991cf915d6339419657ad5","timestamp":"2025-10-14T13:35:16.882512004Z","signature":"kqQcxLoBxidthsnizB/j+iVE9ys65ESaSTRBqh6BGp/DxSKAs8XoNfs23dSYJGEvO4Q6dUB/qx3Gdl3WSbj4Cg=="},{"block_id_flag":2,"validator_address":"f6866f1f291d5a6740480c6f0774aba45177b68d","timestamp":"2025-10-14T13:35:16.893733348Z","signature":"5h2czTahrsK5i2C1XBRrCcdqCPDsUi097NOPLHETQBLiighK76n2/nMBY+kmqLbZMhO9lf4nH8z3WJ+aGUnBAg=="},{"block_id_flag":2,"validator_address":"37b7e284915654acc06e394fb423dcae6a4fd94f","timestamp":"2025-10-14T13:35:16.939955970Z","signature":"MbAXe4/bIj4MmgCjEXtE84U/aqSWuKTdjIYiKwxbaoiJjhUl8wpl23Ae4HkRibeyU/gh8b4mPhn74hGdBGgOAA=="},{"block_id_flag":2,"validator_address":"1a4b644c16a4a1904618f8d3c0f6a67223038390","timestamp":"2025-10-14T13:35:16.922435962Z","signature":"MOKNp3LrKgypKQqFiVUJyQey9zDMg6CgBcX10NSw4fvJLQU+f2tylF4pfBI7XIamX+HbtZmWOC+K776TAeS5BA=="},{"block_id_flag":2,"validator_address":"53406de83381dd804632447f1baed00cf28048e0","timestamp":"2025-10-14T13:35:16.848275858Z","signature":"aH2UO6RisI1g8cs91p/AttFNcdHvSmgWIqk1ORdErPbGX5VVyiAbKPSvJsqfiW+3i7pd3R368GEqF0pG5e7uAQ=="},{"block_id_flag":2,"validator_address":"b3f0e466cf435fc603117e6cd516ab7e6337e212","timestamp":"2025-10-14T13:35:16.931329173Z","signature":"5HBkPoF3kj3HGOlRTFyC7hZQVdp7hb9KX57ba4jAO8NCvOkXEnf/AQSfiLjnS7ia7guCV4k1/ZHhZ7X0VUDpCQ=="},{"block_id_flag":2,"validator_address":"300636fc6b27a7016f3aef03c231aa63163eeb5d","timestamp":"2025-10-14T13:35:16.912739619Z","signature":"Ua2EMxsdAYmO8Rb/Cq0/Kt0/uflLS0WwJko2dPYtXq4+XOEQXXtynQBBd+2S9MZu+5fYDTi9HTCDWzAcZgSNBQ=="},{"block_id_flag":2,"validator_address":"b032b8177b81d9ed1bce8bf0ff14c45d17e821f1","timestamp":"2025-10-14T13:35:16.801900250Z","signature":"TW3bfhs0v8agHG/vzGVPZPbJrlUNMaRJkAw3NAb8r+8FJwjDNg9vHwq9YJqXJjnJqE4KP6zyU9SOyHoVVuMHAw=="},{"block_id_flag":2,"validator_address":"6cc0a1531ff58d61dc9061c5b89bc0efc07911fc","timestamp":"2025-10-14T13:35:16.817201350Z","signature":"JstuikU4GYb00TDnEK7bwKEug69PyyHLJFYCaoa/nm9A/09dU6R6stjF1JBJkYrsiEPFGG/OtX5sT20oowaHBQ=="},{"block_id_flag":2,"validator_address":"3965c223e13ac66f8175c86e657d396c711964b7","timestamp":"2025-10-14T13:35:16.859458177Z","signature":"XgPgJuww7X9iWtyQ9XTjFxbfKbi5GXDDMBRX0vgktmimTGE/HpTA4CSfkXh601NXt5b9sRyWk/V3klppMPKEBA=="},{"block_id_flag":2,"validator_address":"76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d9","timestamp":"2025-10-14T13:35:16.812586719Z","signature":"JUOjNCya0zVwSvE9HiQwQwvSRY5HtUxURvS82lz2F9GiJT2xhwUSKgnxANnryUShy7f3zLZhjb4+iJyzDMW5Dw=="},{"block_id_flag":2,"validator_address":"1b21f9bf3b9a650607cced8c0c2fbeca3211791b","timestamp":"2025-10-14T13:35:16.822749327Z","signature":"ofOe2EX2VvISkZdKaUeS5VAoTdNFcSs3RuR3cAqaZGfl6aoCsVzKb2koLHO6ntVe+TLtyWS6W2S1N45E//2cAw=="},{"block_id_flag":2,"validator_address":"1b03ab3c744545b281d224127708a9ec7487e58c","timestamp":"2025-10-14T13:35:16.864646325Z","signature":"E/THg7ezDHFAtTJ/jZIUjW1AS54i6IAeVEzSdALv1icjBdxnZmDnwCRBsSSNWMxeTFFx8/IQJUGI03rW/Gk6Dw=="},{"block_id_flag":2,"validator_address":"e2fc4df9e7870fc8238136faca07a120cc078a0c","timestamp":"2025-10-14T13:35:16.876367328Z","signature":"D5J15oOCLe2/uLPqZ67L8OdzR2n/EuiIcuJdzJ7KBiPuYDuxZf/Pvxqe98CAN788Mnh6PH503UmkLGcwDP26Aw=="},{"block_id_flag":2,"validator_address":"671d816776e8c7fae18dc122fb6dc231956c6d48","timestamp":"2025-10-14T13:35:16.810209699Z","signature":"JtmLv/ErUTI3hh+NrA2NckTb9LzR7ZgOLepvOk9JBqYbkI6LJl7hYdd7wcvpir68V4BQKkDiyExkro/vcx11BA=="},{"block_id_flag":2,"validator_address":"6bdc45074c28d7467d37f875091fa5036ac62eed","timestamp":"2025-10-14T13:35:16.819497787Z","signature":"QtBKSvbBypI97JfjMmmbQoOvncAiVs+VqqqurOGam+ftHrORa4u3wz6AokDLylkSVEbAKDKNUg2psb2uEw4xBA=="},{"block_id_flag":2,"validator_address":"718160e3538e0b0ed83d3b3dc4ece83809fcd107","timestamp":"2025-10-14T13:35:16.885512141Z","signature":"94TX2nwyVpzIa4IOMtDHkoFlMTQbj3HzJ1WOO4A3dm0vTH6RagyJNogTUlXI99Nfh9OpiytDEzzqF3X/BLRYDg=="},{"block_id_flag":2,"validator_address":"b03f0cb997f3428ef3968833bca2f2a4f613a8eb","timestamp":"2025-10-14T13:35:16.816376437Z","signature":"Qja5jT/alwISK+QIuGaYhRIWwj9VVejtJQe/ylewe954fRoYRCNwkP1x5CbuT28+Qa4vwKPAnAAO3tZOQoKDCg=="},{"block_id_flag":2,"validator_address":"77be23139b650d69ede7985b31fd7b1cee9ca7d3","timestamp":"2025-10-14T13:35:16.873506591Z","signature":"ek+fWLJ/zL/m06hxE+UDIbxAZHCIIQwUG6aqRV1qEmN6dNK1FNB5FuKkD82rFh8lojtDYmwqzPVmHjpFGM0aDg=="},{"block_id_flag":2,"validator_address":"5c78a0762f13b0b2a793e82d1a178eb45642234d","timestamp":"2025-10-14T13:35:16.862321548Z","signature":"KVx/kYEM3k6B0+3upINPVMiyH1JpUYBFAut1Eh2B6sbKy8GiOUufcTV+AyUrw+3Ul05n42PcHEkOM7v4aZMvBA=="},{"block_id_flag":2,"validator_address":"70dac78498afc6d766d860c433265a274d48b7d8","timestamp":"2025-10-14T13:35:16.879429442Z","signature":"Hi/bLFJawoh5rIBYECo3jLKQXrgq2vRcNLzUiyhvx/Tz5eAoCvZzwUzaOYgPoXWnusNF96nbjOgb9s3sWEhjAg=="},{"block_id_flag":2,"validator_address":"b41ef50272a7a2398ba617d3c963986ebebc5b2d","timestamp":"2025-10-14T13:35:17.037470044Z","signature":"oBMw6nnl8cS5H8J20635pdQUXfRugeF0YKrvX5eJiZX2mWOOTym+oSJd/mm9sur88gEqsALV6iMpI1ndVNwPDw=="},{"block_id_flag":2,"validator_address":"521d2a344e322b8ba76401c833a1ec74ea2bd075","timestamp":"2025-10-14T13:35:16.781733245Z","signature":"/2PYlDb4ooJ6CHN2CqXr0vqf1J5M2//Z3kqDd+8F2UlXqf1r83P7Wblm5e+9ZmZAyYiw+KOW27gAZcXt4BxAAw=="},{"block_id_flag":2,"validator_address":"35f6c0359084c37ef6eb4061b694386910093b99","timestamp":"2025-10-14T13:35:16.931324525Z","signature":"mshV/HWNWb8fof/2YxQ3oiJMriRoDRkkuzEiltegv/5WuhNwYF6NTMHbQh6wFImYqWt3N7Cj+64BTtL0EmJ3Dw=="},{"block_id_flag":2,"validator_address":"2a1b3fee6b29ea1828d427f0e5c3887cb7e64487","timestamp":"2025-10-14T13:35:16.805681903Z","signature":"YqhsB8zMjecLYFa61LHh4rIxRlwA853KJqcBhoU3cLWUN7vuvizyfUyc+fgOAQLkHWjoEVhhf0Zxu4H4d6YEAg=="},{"block_id_flag":2,"validator_address":"ccb2909dcd316fc5e738dcdb1f14360f04b44320","timestamp":"2025-10-14T13:35:16.826109205Z","signature":"oiymf8t9KD7540tNEaCtMpPx1lvOwr5/aBtcqr62rGCTUCJ9bGp2UsmwY63VU20j2xxSkV/KyOH3zR2MMKPdDg=="},{"block_id_flag":2,"validator_address":"616a45478336b92583cfe29e8ee942802de69eae","timestamp":"2025-10-14T13:35:16.861447244Z","signature":"UE0wuH8KctrAIfv2N6kZaKhTRMapirWEyTFpFksc8SMRQitSlusUrVwoeDrxR3n79JAHdKWeJnsu5hJmCj3LAA=="},{"block_id_flag":2,"validator_address":"fbc2a3f682b507f1a3a5d4c44c8cbb6af0860296","timestamp":"2025-10-14T13:35:16.871591263Z","signature":"IkX1JqACkSALcP9cbUqxJ7CThcWsou5uTu2yF3sl3afKQn76OIFfVxoQgsWLad54AxpfITA4uQxEV6OWto7wDw=="},{"block_id_flag":2,"validator_address":"2c4e108c3f09cf9b8b1515d3b26d50e332d86e3b","timestamp":"2025-10-14T13:35:16.807003387Z","signature":"QWwMVQ/WNk7FdZJGBDgiU6ZkWY3nAzEw7IKEw1tkVar0tmGIaqxfewAktacLghL+aLizDWlVBXvlJGjFaNABAg=="},{"block_id_flag":2,"validator_address":"f42c7e49df4f4d0993237959518415e473792392","timestamp":"2025-10-14T13:35:16.800848813Z","signature":"aNSxYejnEG8YM0B5QFaBWAb9YChLCf7Fyn0fUmZdadrzEoawpO7YMCVxCKrwKms8/QhKJs0IKyFXluMeQUr9DA=="},{"block_id_flag":2,"validator_address":"c268fe001a533b6f0860167381384363a790fd0d","timestamp":"2025-10-14T13:35:16.801419520Z","signature":"DxyslXbnXYcXtAQ9G0dygo3KhQCjEMsZRpOVLLEc+PipzzrKSrb5o6mDN4tbGUCmmNgUJfIU7MHUE4FAosWsAw=="},{"block_id_flag":2,"validator_address":"9a323ff30c24f59e160aaf02a57c63e11c41495e","timestamp":"2025-10-14T13:35:16.830117467Z","signature":"oW6zcz+H5hgDPmSdNXPzfhmk86K/LmdbvtIanpan7P400xMjxqpB07Q/3twWx1fjgI0X0b7sP6Z6LHzLm+GJDQ=="},{"block_id_flag":2,"validator_address":"a8f38fcb39b580c4b856dcaed882d504a216ee00","timestamp":"2025-10-14T13:35:16.855479281Z","signature":"hJszBNAr08+oWPmFccxRE0owaQC6xSfBUZJ5XNCfD7dsD6OCe/vAsajNgu7UBXqEhE5FUdWd5fssphmn1pjnCg=="},{"block_id_flag":2,"validator_address":"7ea986d8723587f5e653c0df785fcfce39238785","timestamp":"2025-10-14T13:35:16.802610216Z","signature":"WT8qEZ2iSrUZJUWtrMLhK3pw0OPj65LNmrEgI9WtHawVXF+C3dIVRmtZCjf6OQgL8kkrw+sWe5WCR6T+oz51Dw=="},{"block_id_flag":2,"validator_address":"aea26001de9b15d4dad32808712864e61ae52a17","timestamp":"2025-10-14T13:35:16.949727080Z","signature":"f3DpJnBWNF5Oe5MF+35GiUnMYdQVBoLquamFSKqlKuZj+IpgxO+ASnjEz4GaMXx/65i63TV1/fbv/9gQRXF+AA=="},{"block_id_flag":2,"validator_address":"2972b0df619f73d1a5c8933aff22ad8c9258f370","timestamp":"2025-10-14T13:35:16.838260718Z","signature":"++et0qiMVBU9QhOYyEC/U1F+aNldDQkwkNGkZDNOpk2uD0ZyVy/kHDQVSkS4jlG2GszkfjKcA5FJy7kwRAz0Bw=="},{"block_id_flag":2,"validator_address":"a8a2bf2709ca05755f881ebd939991aea9f88cf1","timestamp":"2025-10-14T13:35:16.866347399Z","signature":"pO/cYRiM/O+VZlP1ToOx3nTA35P2qr0y4j638buvxQLk8QR+XqROSjICfSvGPP6rloykVeowbe6DyNsdysQdAA=="},{"block_id_flag":2,"validator_address":"23df4a8418762cea4d24b7227ad125df76d2baf6","timestamp":"2025-10-14T13:35:16.871447600Z","signature":"wjvC06pGCaBA1Q3LBCckDoMLkJeQf4a/maGBmxaTbCgkWpmD/UQg2cSSPtQFs0uOWa3g0Bxvts1fVgRjANLiAA=="},{"block_id_flag":2,"validator_address":"9407fa25941c932473f8e2b1ecc5481e3ae15a71","timestamp":"2025-10-14T13:35:16.871585034Z","signature":"d5fN0/UnE1dcBq6Cr/N1Ad6uDrlMe+1BX3nf6gSQPp9DkJ8czpJs/QblBz1ez2qetcWlU4+I8Mp+tX+kpffhDA=="},{"block_id_flag":2,"validator_address":"65c584027f5fd8349027fa5bf1d4ed3828c29058","timestamp":"2025-10-14T13:35:16.894428661Z","signature":"jXZYuyuEvzE73joxhBnJabtFVEKMh2VBlIWizsAAVQU6Q2ma3mGjGWdvR1lwyKiSlVkxYo4WecP9KEMs4I1pDQ=="},{"block_id_flag":2,"validator_address":"466d1236b8c77925b25219e4ffe34dd069351847","timestamp":"2025-10-14T13:35:16.887589197Z","signature":"iksPB7Y1D9rkXTsmzLEljYSlX6CDLi15VC6jREl/B8huBntBSehaR+txrmJL0xvysvyUUpLKid0nuL+b8ZcVCQ=="},{"block_id_flag":2,"validator_address":"b8f9204a348e0dbc85abe5bc98936d6b84c01e45","timestamp":"2025-10-14T13:35:16.805082455Z","signature":"V9i6zangjpzXqGmatf3XCFJy9iPhU1K2i9xd4Oo6Sw6Cl24VcLHQ+Brh5F59+M2B0BAWKD5uc3jCBJyybWT4Ag=="},{"block_id_flag":2,"validator_address":"2ab301f354a74f45afb347b2c00cdceb09cc719d","timestamp":"2025-10-14T13:35:16.827079668Z","signature":"DuzyqZoACKrq4ZK17kwuOTReUVVxhH47Y1VOHAH+oKIMmfU1K5ani2ARuPwonPP7APkXRkjyQmAJyvCfAhaPBg=="},{"block_id_flag":2,"validator_address":"9215b6b8ec64cb9e7b461c3945e6ce00da86f8f2","timestamp":"2025-10-14T13:35:16.819978877Z","signature":"Czkz6GbWplQKAS5gbwWOxgr1DExBzwnuyGbSbC9UE7MzjW1XNJBhtR7MaWkNf96sGsHEGKS3ZksNF9Bg/7pJDA=="},{"block_id_flag":2,"validator_address":"a9c7a884bd7d6e799ef5311bf9168e0105bce416","timestamp":"2025-10-14T13:35:16.875444674Z","signature":"nTDhLLq4O5LD/Bz22HbSb6Iwaak1bqEPnbTqL2SUyILu2wP+5NbNCXEoiY9b0l5rSxqH13zIsIDpz5SqjEiNDg=="},{"block_id_flag":2,"validator_address":"f1961eee75e5a1c8a11a5bf72fb368b990bdd289","timestamp":"2025-10-14T13:35:16.982329948Z","signature":"WUkp7IYHb0q0BUDm1qWG+XEvbBkg00QWTjoDw2UUnEnO2myHyx8MZO3jLc3SMC53TA0NjgM387ABT/ECOzBODA=="},{"block_id_flag":2,"validator_address":"9fee83fbf0bd5a4d71519efc16d0d438c203dd5a","timestamp":"2025-10-14T13:35:16.818733534Z","signature":"RftK39YIljeH6XuWpL6SB7uO7/K4ZVB+gr3WQQGILS8aSnH7N8zJZBGo9ap4pgsvACQxqzyoBFHrJ6F/jWRrBg=="},{"block_id_flag":2,"validator_address":"b44fc7d70708095fbc30af164410749483f96439","timestamp":"2025-10-14T13:35:16.854712016Z","signature":"pKpT9fLVqMRbliZIOXh+aWAsEJAZK2MqoiTU9qDo1UHDvhVTcx5dnDsPgOHGqWcvjk9s9cUmU8haC37z29XfCQ=="},{"block_id_flag":2,"validator_address":"c4ef42d72d69f4b58ffe2a58db1335269842ac43","timestamp":"2025-10-14T13:35:16.915874586Z","signature":"CP37xuiRa2GmIesBXVVHKvcTnM8m12pp2GNUm7z0Nq0h+zNfY70dEVBDaBann4WrsxRt7hLeuXDG/qHErSEIAQ=="},{"block_id_flag":2,"validator_address":"60c51d643048d0a426171bd0deabd1689a89690f","timestamp":"2025-10-14T13:35:16.881817719Z","signature":"GfCMFKozcJOEZ1Fwp7mbOfbhTSiJqBINE19ut81dB0CT7PmVo6lMCmUTXWiVcOMwOM/J+2iXwlCA2QTyu8IkBg=="},{"block_id_flag":2,"validator_address":"5d673308ca2b45e5222303836d833e0f70b1f9b0","timestamp":"2025-10-14T13:35:16.829328259Z","signature":"ZwZvymCeKngGiTNQNmdwCqLx8gvJBSZyK1AfgDQzB6fn1dFVY2P0gdMd1QbrXHg6IigtJvkjVg7iltLv/1kyCg=="},{"block_id_flag":2,"validator_address":"06be03f1b334fc3f7947d0d031f7dfa568005bd4","timestamp":"2025-10-14T13:35:16.803792607Z","signature":"kw8fJXu82byqZkKTSnyufnAekuA6ctCssQSulleFadAYQEMdZrcSC9J5JNqKntaquZmZ3ru9zHP+vXnSD9gkCA=="},{"block_id_flag":2,"validator_address":"d7076d16c2e91e0eb16753575ac3cee3057781c0","timestamp":"2025-10-14T13:35:16.804300322Z","signature":"HDPX+tmT+yM2dos0IfOHKjm8UP33xu57eT9FH9fH3Rvk3gwzeEKwf044cU3qcKYUbETU4wCOOFQVLIJvWEjlCA=="},{"block_id_flag":2,"validator_address":"913834357f92e577cdc02b1e682c65e86d016ae5","timestamp":"2025-10-14T13:35:16.884055010Z","signature":"02HCdbgvYP+FUHLJCcI0WQnq5/BCF2NukWqct3mYZVqhLGe0t/4+qMu4TC1Gk2ocTn5917Y3qranWdXzCqGHAg=="},{"block_id_flag":2,"validator_address":"3ce85b466ff74142307b4b03ddacf17a52d46373","timestamp":"2025-10-14T13:35:16.793427896Z","signature":"RT2mfPidMNYnzu9AFLJH+JBdZoWA+Ff1jSj2Udd8mQc/WiZml2eMy5qT75aN5BAV3fak5Mt1OE65DysHGqg9AA=="},{"block_id_flag":2,"validator_address":"dc0802ad3262ecd784ce339d87073c836e31c69e","timestamp":"2025-10-14T13:35:16.816058121Z","signature":"n1z1Q6V273giUJYincMzVsU7aNoHryEKsYcu4nIQSWjy5hhqfPi16LtTQ8SBAwkzB+KnA5wt8gh9ORgyk6K4AA=="},{"block_id_flag":2,"validator_address":"31e623ab0ff5dc408c052072f96df3d4506718ce","timestamp":"2025-10-14T13:35:16.878369234Z","signature":"rWAexlCT52ut5QMs7u7vaPVLSJJz+yUIyZD0acCoobxmNF+4pvxHWAw76HWYmBHje7SHbWt4DPM19+m2N++HBw=="},{"block_id_flag":2,"validator_address":"02d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164","timestamp":"2025-10-14T13:35:16.894743814Z","signature":"vN2WnXfVcX7pqtoZO0rpBhc/Xe0UMt0E5+/7cgcyFELdoG5F/dsoCbLo5aHNFNaYH20VVOdn9yiqBt5d9TNuDg=="},{"block_id_flag":2,"validator_address":"646d5c6384c84c2e660bf268d0a4ebc1ffbceea6","timestamp":"2025-10-14T13:35:16.993396133Z","signature":"KxbNgFkLWRghwMD65IR3LsA3yqshu6JcJVw6mtmNC7HW1FM7UXPuzfj4TisGCOqwh+eYWNQtpLZBvNt0HxCcCQ=="},{"block_id_flag":2,"validator_address":"e6f8df77989972328c927e5493db6908936a4ea0","timestamp":"2025-10-14T13:35:16.792102156Z","signature":"XKBBC2daX+NjMW3gwUr2UE8SZGxYLAE3krH2aWzDsdr6QqhwdgtiI5FG5RYOGIkiZxcEUYHE8yoHd2EEmYueCg=="},{"block_id_flag":2,"validator_address":"0aabc33bff6e288ea151463ca133e38051bada85","timestamp":"2025-10-14T13:35:17.051971620Z","signature":"voP6fAKJvxU30T8OCyydIIbwNQrz4wY1oZW7hnHryHbxllyAiFjjRJAYpnD8Ys2qzn8eGUBH5CkRxXvhU/moAQ=="},{"block_id_flag":2,"validator_address":"e71b23c378e4c465bfe96ad48e7f93f237e939dc","timestamp":"2025-10-14T13:35:16.925969654Z","signature":"swpI/CiccP3BZZIxqZE3YAf7gfXLlCN4fquLMicYk/XM7l/iMJpoPVsN22+R8VahRFSFoEE51FfQdG2eWRmKDA=="},{"block_id_flag":2,"validator_address":"bfee4eba8e3307bcb074ad575ab9fa4524af2a25","timestamp":"2025-10-14T13:35:16.876593376Z","signature":"gyagLS63qXLuUC0XSvhaw+tp4dS1v/Qd8W97s1MwPR3/wSH5G3+O4Go2oxLHWAQBiWT+WNaWNKMu0P7rFYSSCg=="},{"block_id_flag":2,"validator_address":"fbe1e3ed324fa17379403acfc3dd28fa882c6e65","timestamp":"2025-10-14T13:35:16.856966914Z","signature":"FbvGqSofqDOKV2nqvki9GE6lt3xqRtPVLJUKP9yG5V+qa+zBqMg1Dsjr+ZxYx9cKZ7opTtN1lJwiUQsSRpLXBw=="},{"block_id_flag":2,"validator_address":"f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2","timestamp":"2025-10-14T13:35:16.793990564Z","signature":"yx7+pZAXJjTBS2gvjqtFtKhi6Un5QrA1HpWnNjmcNcE6IhMpYwsQdfc+WiOFHkX8NkDxVvhGlMHb7Z9m62b2Dw=="},{"block_id_flag":2,"validator_address":"7c4b90fe7584bad71c5c6ab0877b8c39cd289187","timestamp":"2025-10-14T13:35:16.957532122Z","signature":"QYL1TweLVRKQuhp3eD2VHtJPqu8o53T+L/r6p9dO6W+SwUPBRLkl1xHFtu9JX0U7DJUMQFjw5XHEKZ4NZjDbAg=="},{"block_id_flag":2,"validator_address":"3b2a7b69569e7835324f35f7f2264d008e850c12","timestamp":"2025-10-14T13:35:16.886441939Z","signature":"/E1cuu7SRPBji/gnMk6xbBtJEHuJEfVhbJ1pyuj+5Bkcqi8jrAUKO+9vXyejTyKgjKGb0WJXJvjABofu1zxRCw=="},{"block_id_flag":2,"validator_address":"edd5716db0738cb0eecd0a04aeb186c4a46720e9","timestamp":"2025-10-14T13:35:16.891830587Z","signature":"HGm8jj7bZVlSKTFLcDZxjPk9ahprRD1v0KqAYEgOV/mM6f1LBcZd61HXw2s7Kkmr8vkX33rBqfJ3MFuJWlT6Bg=="},{"block_id_flag":2,"validator_address":"f868d1eb91e32d7f21ef78462feac2892d09eb56","timestamp":"2025-10-14T13:35:16.869372664Z","signature":"XNEVLGt4I9msTE3mT4Mqd1bZFEqMWxTmyqsjoA8HTdvll8l5gRhzRbXzxMWNhe7VrRfK/jOyQpmUe/RwLsCRDg=="},{"block_id_flag":2,"validator_address":"59c09cd227541c5ee7d911084ada87352c899851","timestamp":"2025-10-14T13:35:16.823000638Z","signature":"ZBPYDKGsd6kiygujQTC0iHHuyelBoHHMNUk4XROzWxP9GtT9TPbaPqCLXSe1xgfv4ymZ6VBmsww+pIpZFivQBQ=="},{"block_id_flag":2,"validator_address":"478a66d6d2fcb936ba235daeb5a35ba454c048a7","timestamp":"2025-10-14T13:35:16.966472299Z","signature":"+BvY1KMOT2A8Sme5ExzmW8inBaUfCXKZ2sSnfc6rpa8CiWYO/Tu17AixQucuVI7DBqHpLn3PDON4QOWFFJ/fDA=="},{"block_id_flag":2,"validator_address":"15839d4135d8c8fa603f533ea3ba80a687fe527a","timestamp":"2025-10-14T13:35:16.880533325Z","signature":"x1LD55RFOW0mqq6YpluqVN/S7EmjplFCj1aYQSxNNlqXKnCNw4vepF3zCOQb+hW91N6zNtmCfMD6/12L9zAWBQ=="},{"block_id_flag":2,"validator_address":"13247270303a9d66ea8ffa02614a8b5369adda53","timestamp":"2025-10-14T13:35:16.834612945Z","signature":"2I+mPzUwhqI5hJnFZiTcy/S7J8l7WRDHyJifCwK/DZiZt6O5mHftHFzwtfdmYbEX9g+Yw+LZGuNZ6JLgPhPwDA=="},{"block_id_flag":2,"validator_address":"409d07de01ea2a63c779c0246562aa278a95611e","timestamp":"2025-10-14T13:35:16.900042462Z","signature":"KZoh5KTnomROCVotffDEUS2DRIZBLoyT6RyK9+XRyjXRHLqH4vihJzxij6z9bjiPanCOFhplD7HlHDbvoKE1Ag=="},{"block_id_flag":2,"validator_address":"4e30f6a73766baa5fe6db7181b7fd08329c103e0","timestamp":"2025-10-14T13:35:16.828609004Z","signature":"KIk7Mn4P27CS1QHRxAkHejg+tIz25BKLSiK2IwyWyFBL10DZduUHRrNVqLFdReAM3t3WUxcQywnQfVCd1/c2AQ=="},{"block_id_flag":2,"validator_address":"f70543a091a45a8c0de04e5ce9e40d9c16d980e1","timestamp":"2025-10-14T13:35:16.867745369Z","signature":"BLMQedIW/GtFJY7aityVzgZ8DJO1TDIoKYJta4EaFWXr/qzE8AXKamks6l5pXtFFhhl95JiXAPygNMMEnvk1AQ=="},{"block_id_flag":2,"validator_address":"e9b8e658e2f1aea81d57b78c8bdd2aa93a1bfc01","timestamp":"2025-10-14T13:35:16.819072960Z","signature":"hc83gJLpN9A2I812OdemzeU9+1AhY97csIRSE/nIL0CwPhb4NexvPs1qd0bVXlcRqeEF2GHxhKvaE5/RCb5CBw=="},{"block_id_flag":2,"validator_address":"3daf658a7b8dc1a5186f7c1547ab96ca35686575","timestamp":"2025-10-14T13:35:16.810616889Z","signature":"XlIWDkSPvUdKuL78c3n09xcfgsSOKSjIjxStqljGti02q09BzMcgpKUs00+bHemD/BgxjuV8IioDSl+x3x5WDg=="},{"block_id_flag":2,"validator_address":"02c375d9b259cdbb7b8a97d71b2a0a0dbed890e0","timestamp":"2025-10-14T13:35:16.804405242Z","signature":"tbDyx8A7IJ57TBh+mGqZffrub2Zjt6HZTOWGgTmMJbDyjxKqDWZktIM8GcI2gWW+lMAQ3wEMiKACYszsbiIGAQ=="},{"block_id_flag":2,"validator_address":"556f693ffba4b4c6de7af822852bd6e8a1a1d410","timestamp":"2025-10-14T13:35:16.885491263Z","signature":"hblJZBfZhNQdIFjLwgv4kWqqjMYl+PQCHs8QSFTLEgHVtame1B8oQg5wHYnn85Hj6++fwXstduRBtjPQEa8oAw=="},{"block_id_flag":2,"validator_address":"b31b8ebf6857480b1281e756f0fd67243ac7a202","timestamp":"2025-10-14T13:35:16.978626705Z","signature":"paNvmRWEqShvucbXgtEiaS96XFMstiArhv7iHY3DMfGoSBUZisCBWMa4E9mEPpgXytq3bUGpbXC4BZd7DosLAQ=="},{"block_id_flag":2,"validator_address":"8dabad1a71629e4938de8c44d0bd2f2ce1eabd08","timestamp":"2025-10-14T13:35:16.885644059Z","signature":"QPq+wwjw/nWaunFRXlG9CNj2I6mhBLD4fZkHyHT7E2QY4ZS6TYNM4XpP/Tl5Dkif+NT7ZJxqofRDrUCMHfwXBQ=="},{"block_id_flag":2,"validator_address":"615e9b48cd48fda3a754f28e3f42f77c2e49b0d7","timestamp":"2025-10-14T13:35:16.864513724Z","signature":"YczJKLkD9fwxa2oXMG6Y7pmkQ3K+S/+KBlgNTryxYaHYOlJpCocwsUwgFI0mEnmCFI2qgu/IL0MiKGe5TBzCBg=="},{"block_id_flag":2,"validator_address":"43965a09c5be34d027a599bd6f450f5e6a13ddf7","timestamp":"2025-10-14T13:35:16.805451178Z","signature":"kEcNJKkU4ZotGmmRXOomM9jP2Y1LDIxLlJG5daZ+QJ4D3zq4r2NrMbrujXtI0Uv4qOLLFiyfDFlKTOvKifuIAQ=="},{"block_id_flag":2,"validator_address":"25764380a6df1c9cad29a842a049f690ab0f08bc","timestamp":"2025-10-14T13:35:16.849808976Z","signature":"ksFgcObgQ5GLox5YBQJrDlRB37THtWA0Vjv7nMrUW51G9s2sAN8eZ8Psz6ytpe+3cd/ip3LNKButMhl6UWJxDg=="}]}},"validator_set":{"validators":[{"address":"3c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"hg4sm5gNYb9T4dWC94nDW+30olLECT6Tkrp1FtnVBRE="},"voting_power":"110885211","proposer_priority":"826892073"},{"address":"ec033669fe506006f870bd8b12cb524a3abc3693","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ADyMDDsnw93NdBSqXRlRdeWMNnicitm1ikJ14J240Jk="},"voting_power":"70917400","proposer_priority":"-343660815"},{"address":"33ecd5899a91105bb4e51066eb138189bc3825ad","pub_key":{"type":"tendermint/PubKeyEd25519","value":"dWFxEYRPzIyQpPwSHyw30ZZDZn6GgZJpDyMUvxRSbtQ="},"voting_power":"66631704","proposer_priority":"460858499"},{"address":"44c395a4a96c6d1a450ed33b5a8ddb359cefed36","pub_key":{"type":"tendermint/PubKeyEd25519","value":"q6lQj+wYNZ+QQu9zgWoWfSXcwnQNEzb2a7HnyWyBQf0="},"voting_power":"66396058","proposer_priority":"-502578383"},{"address":"c27b627c2fd11ee1e3e850738720692be2e3f4c6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"vuHjnsOVyXFYot1RaV+Wx+ck2hOOvb9/QXwXuzeWcm4="},"voting_power":"60834013","proposer_priority":"178486029"},{"address":"64cdacb04fb9c3b290579644f9edbd05cb00bb7d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ydZBYn1uztV039ywjiQ8rRycnXHc62hK10+4ZalaQVY="},"voting_power":"60576465","proposer_priority":"54070763"},{"address":"5295664886565f43a3074140551a755872bf6ffd","pub_key":{"type":"tendermint/PubKeyEd25519","value":"b3y28iu4R+IBmSIPwJA90k6yqb5kJPgvDVCmcnpSJck="},"voting_power":"60019185","proposer_priority":"-490243251"},{"address":"2a3d40c3e7ce8d6b55077335cab141c2e11ac254","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kUQmCZtP4I3q5FkKaPVTvXnr3UMD7GwlhnGdkXqsbbg="},"voting_power":"56084140","proposer_priority":"-780542481"},{"address":"f2e6bb25d8d269c9737bd3789b11dc76c4fc56e7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AQbty1lMHkV1ZHEcW8C6AYK8QhMfxaAhBdp2w+Ykp28="},"voting_power":"56060558","proposer_priority":"316571682"},{"address":"bb386aa0e7b37eb33516aebb58cae3574af85d1f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"cDPnCL7aSojDMLgu23KG3wIVb6cfpTFS3DBimDhtQro="},"voting_power":"50167947","proposer_priority":"-851639503"},{"address":"43804074334ac6111233037efe20105c516b0e9f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"4HpLoBBK/GzdceBjoD4ZXBCeMyv14WPDeoCtZ1BqYv0="},"voting_power":"50022601","proposer_priority":"49527168"},{"address":"da37d2935eae0a92de55e86db2e887b4f18575f0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"x7i3trbMJFfCcb9SAfZbL8s2M1D0OHQ4piGP+DmkJ0k="},"voting_power":"50004013","proposer_priority":"672238745"},{"address":"9c4cc8543dc684948490681118957942b29a9200","pub_key":{"type":"tendermint/PubKeyEd25519","value":"mQhc5iQg6aagqCU3i8bgNFr5jk7b733se67UQ7XizGM="},"voting_power":"49884162","proposer_priority":"513415451"},{"address":"01b2c0f03ba9b2f352a39bc45ce37aa2710b5af4","pub_key":{"type":"tendermint/PubKeyEd25519","value":"m2EQh1+c953MguY2I+O0+arfUVgEp57S7R7v8UOsLlM="},"voting_power":"45539042","proposer_priority":"-29276205"},{"address":"410c1ebaf54c090f0a9132dfa9f79e0f480b2c06","pub_key":{"type":"tendermint/PubKeyEd25519","value":"b7/i2ANiYV7Cta01WwjBIuN5mJT1qMgcE69gkJ4bBX8="},"voting_power":"40598279","proposer_priority":"716030867"},{"address":"c2989ed51e73b742e4991cf915d6339419657ad5","pub_key":{"type":"tendermint/PubKeyEd25519","value":"wFN94JzYFuZ9YiyRCoT7r4rnfoVaPiKDVmMYhsKn77o="},"voting_power":"40427821","proposer_priority":"707236170"},{"address":"f6866f1f291d5a6740480c6f0774aba45177b68d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"SlYCRkhYoEI/4dsRq81rc7vN6eArQOD375W1oexAOPs="},"voting_power":"40022790","proposer_priority":"200098693"},{"address":"37b7e284915654acc06e394fb423dcae6a4fd94f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"8YnR9Xa/B9WP201LE4tDTtMKYnzW5OTpRzYv9PtvEgk="},"voting_power":"40010006","proposer_priority":"68466812"},{"address":"1a4b644c16a4a1904618f8d3c0f6a67223038390","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ifVDlvP2zSzTP+4pcCMgpUm2aROakV8bjFtq6FGKRZM="},"voting_power":"40002650","proposer_priority":"104011443"},{"address":"53406de83381dd804632447f1baed00cf28048e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UfW0oW3DujAhga+d4Jf1kalUa5dUsrHLhtLZgN9M6sA="},"voting_power":"30562456","proposer_priority":"1556052"},{"address":"b3f0e466cf435fc603117e6cd516ab7e6337e212","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kuNvI/L/PpQSIGgn0DNFuB7lqt8jIdFUbTtAmm6Q+ZU="},"voting_power":"30037649","proposer_priority":"877877493"},{"address":"300636fc6b27a7016f3aef03c231aa63163eeb5d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"gruCRPAggDzkufHhdJ+HjaO2Tp/+UhtLs1uJwSS+fak="},"voting_power":"30010819","proposer_priority":"-267967571"},{"address":"b032b8177b81d9ed1bce8bf0ff14c45d17e821f1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"wEH/QHM8PzhiheI9SPCLVHfBsE4f68lL42rTLox8wgc="},"voting_power":"30000004","proposer_priority":"-550538340"},{"address":"6cc0a1531ff58d61dc9061c5b89bc0efc07911fc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"fu9i2vgnxjTxA2yISFpQdRmyJsfLt5zyA+Z7NijDK34="},"voting_power":"29875457","proposer_priority":"374194604"},{"address":"3965c223e13ac66f8175c86e657d396c711964b7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"I43SS5LrmBqDQURAVVyisYxX3Li+mYK7P7Sij6+yYIE="},"voting_power":"28798994","proposer_priority":"548217620"},{"address":"76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d9","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UcCQ3UtXPjyF5k4+KMonaWnQ22vtlZq6DfygnmaTp9Y="},"voting_power":"26528649","proposer_priority":"704303420"},{"address":"1b21f9bf3b9a650607cced8c0c2fbeca3211791b","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YjIyQkXPkU4HTUXD74DGwTXk1apkue35R0AispufH0g="},"voting_power":"25573773","proposer_priority":"-709916713"},{"address":"1b03ab3c744545b281d224127708a9ec7487e58c","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YhgNr8OiPRzSI1MybqgRZf3yWYPGMy7vNPxSzsfRFrE="},"voting_power":"24542545","proposer_priority":"971045626"},{"address":"e2fc4df9e7870fc8238136faca07a120cc078a0c","pub_key":{"type":"tendermint/PubKeyEd25519","value":"1TSNDP080xciccCHFOrXhVB1XBDPSVwMK85lq/H0dC8="},"voting_power":"24515904","proposer_priority":"835593963"},{"address":"671d816776e8c7fae18dc122fb6dc231956c6d48","pub_key":{"type":"tendermint/PubKeyEd25519","value":"xafI5gPZEFu7ifGpLfsS6VbkLvE6PLsEXEnQw1TQAn0="},"voting_power":"24515270","proposer_priority":"744946864"},{"address":"6bdc45074c28d7467d37f875091fa5036ac62eed","pub_key":{"type":"tendermint/PubKeyEd25519","value":"+sad+WQif7UkeXMjgbtA2w+qNh/um0saLp5ICSujp/M="},"voting_power":"24000005","proposer_priority":"-473006639"},{"address":"718160e3538e0b0ed83d3b3dc4ece83809fcd107","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uxrtntmwVXujeUpI8VJD9MjGubF2xptYnHFmT4lklvk="},"voting_power":"22876803","proposer_priority":"-665879227"},{"address":"b03f0cb997f3428ef3968833bca2f2a4f613a8eb","pub_key":{"type":"tendermint/PubKeyEd25519","value":"afEmBb9L2G5I/aE4ZJ24dGFEZJDvrdBH93of8jYGv20="},"voting_power":"20279407","proposer_priority":"-187193283"},{"address":"77be23139b650d69ede7985b31fd7b1cee9ca7d3","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7LqCm1ivwRYq/ZFrdBVV0jaitBm1ub/7A5sPsoNTF5g="},"voting_power":"20219782","proposer_priority":"-1056392398"},{"address":"5c78a0762f13b0b2a793e82d1a178eb45642234d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"tFyF8SVRJ81z9O2q2wzZMHUit2vgDWiEnv2aK/CSCoI="},"voting_power":"20216309","proposer_priority":"-297860650"},{"address":"70dac78498afc6d766d860c433265a274d48b7d8","pub_key":{"type":"tendermint/PubKeyEd25519","value":"VDk6q4U643fvFagHQjWNoKUqnr6lU3NKBo9ERAS5kDQ="},"voting_power":"20134471","proposer_priority":"919789418"},{"address":"b41ef50272a7a2398ba617d3c963986ebebc5b2d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"GprPmRax5CnFvFsS9f6mGstf7zRXEvJdEoBuvENp/cI="},"voting_power":"20101846","proposer_priority":"-1039644225"},{"address":"521d2a344e322b8ba76401c833a1ec74ea2bd075","pub_key":{"type":"tendermint/PubKeyEd25519","value":"BzddkwvM57jNIsA7TxUyS8wLLSTbDpa8IBqiGy+LaxE="},"voting_power":"20020216","proposer_priority":"-187954646"},{"address":"35f6c0359084c37ef6eb4061b694386910093b99","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AatuXTZOwAWhufDJiRXkrDce9jeVvbcZOhsuw6e+gNM="},"voting_power":"20002859","proposer_priority":"-105595836"},{"address":"2a1b3fee6b29ea1828d427f0e5c3887cb7e64487","pub_key":{"type":"tendermint/PubKeyEd25519","value":"WGS64GhNVcsRoSuQ0g1+iVaBp7CeQaITSPIqD+xcUAM="},"voting_power":"20002754","proposer_priority":"-712955740"},{"address":"ccb2909dcd316fc5e738dcdb1f14360f04b44320","pub_key":{"type":"tendermint/PubKeyEd25519","value":"R+agpHoODVGSoS3i/1cM3kgD6lbZKmJWYLcPVVmUn8Q="},"voting_power":"20000945","proposer_priority":"363179210"},{"address":"616a45478336b92583cfe29e8ee942802de69eae","pub_key":{"type":"tendermint/PubKeyEd25519","value":"XVwl5MdQw44yq0kvTQ2W1OKtFnO5/Z9snTk+2TI0PhQ="},"voting_power":"19589722","proposer_priority":"-456274238"},{"address":"fbc2a3f682b507f1a3a5d4c44c8cbb6af0860296","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LWOEtc00ggBtocjJaKbNQ2ArZJMD5IaYQ/a/agRacPE="},"voting_power":"19525184","proposer_priority":"-653020167"},{"address":"2c4e108c3f09cf9b8b1515d3b26d50e332d86e3b","pub_key":{"type":"tendermint/PubKeyEd25519","value":"WIfDZZv31OnJDUv5ZR78/HLozeQZESoDYKcbJscoxdc="},"voting_power":"18048625","proposer_priority":"113025989"},{"address":"f42c7e49df4f4d0993237959518415e473792392","pub_key":{"type":"tendermint/PubKeyEd25519","value":"HS7PneXHx4p3Pw4/Tf3k8dqqq3zA85tgmtD2Za2zlfA="},"voting_power":"17858362","proposer_priority":"571033906"},{"address":"c268fe001a533b6f0860167381384363a790fd0d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"I8TBe0JOeuJssNbOLGCyer0iMDlz6Ij/OcAxmCEpS/E="},"voting_power":"16755781","proposer_priority":"211144280"},{"address":"9a323ff30c24f59e160aaf02a57c63e11c41495e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YeVzZ/HjpKl0i0ddoaeekIdQdyvincMYD6YjPsSQpw4="},"voting_power":"13200031","proposer_priority":"-2754042"},{"address":"a8f38fcb39b580c4b856dcaed882d504a216ee00","pub_key":{"type":"tendermint/PubKeyEd25519","value":"Kda/tpSMpgzH0ImTXQR75NTU66y9D14hVCucT2y+9KA="},"voting_power":"12539120","proposer_priority":"588906164"},{"address":"7ea986d8723587f5e653c0df785fcfce39238785","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ABSElT/KHsxFF5u5b5hS8LhDS30VsSee3V1uZAS6J8w="},"voting_power":"12480381","proposer_priority":"573995641"},{"address":"aea26001de9b15d4dad32808712864e61ae52a17","pub_key":{"type":"tendermint/PubKeyEd25519","value":"RtPXsKSt++T/v0Xqr04rraOXAdQcZCLpz5Q474EmtRw="},"voting_power":"12241388","proposer_priority":"-749753904"},{"address":"2972b0df619f73d1a5c8933aff22ad8c9258f370","pub_key":{"type":"tendermint/PubKeyEd25519","value":"NhA92zy67zrx+Sy1A7i6EMIvELJIB7swGRIeoQaf0Xo="},"voting_power":"12179809","proposer_priority":"837533236"},{"address":"a8a2bf2709ca05755f881ebd939991aea9f88cf1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"srcpua9x2zK2xbHtXb1E/L6lJRTn7ehJggnlcBiCEPw="},"voting_power":"12119999","proposer_priority":"-938606509"},{"address":"23df4a8418762cea4d24b7227ad125df76d2baf6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"2e/NDjibT4BFoyfT5myyzMIGpDPAiHjeLCNXSj6/Ow0="},"voting_power":"12048703","proposer_priority":"-145673241"},{"address":"9407fa25941c932473f8e2b1ecc5481e3ae15a71","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uRLdogR9YCZFCUXggDpKqPJnRd1Tn52+twiAnkvC3zk="},"voting_power":"12041246","proposer_priority":"-558376975"},{"address":"65c584027f5fd8349027fa5bf1d4ed3828c29058","pub_key":{"type":"tendermint/PubKeyEd25519","value":"cxBI4Ef7MfASd1COwn2eqgVooP0Qp2eDQls/pv7dMa8="},"voting_power":"12031194","proposer_priority":"480976436"},{"address":"466d1236b8c77925b25219e4ffe34dd069351847","pub_key":{"type":"tendermint/PubKeyEd25519","value":"9pe9aXHTo4AckQ3eR2mHixLqZLjAw34OnzQLZtikS4c="},"voting_power":"12024095","proposer_priority":"267836605"},{"address":"b8f9204a348e0dbc85abe5bc98936d6b84c01e45","pub_key":{"type":"tendermint/PubKeyEd25519","value":"L2YmP55MMBPcbucOqkWZ8O5Xmwt/nQR9KABn5WRNC7I="},"voting_power":"12013392","proposer_priority":"894437732"},{"address":"2ab301f354a74f45afb347b2c00cdceb09cc719d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qFSnvrYxWgRHPWz424XRZOiClZXjHoDQBv1CMQDS7/o="},"voting_power":"12006092","proposer_priority":"-251313246"},{"address":"9215b6b8ec64cb9e7b461c3945e6ce00da86f8f2","pub_key":{"type":"tendermint/PubKeyEd25519","value":"Qng5pYzBWTouQK1EnLQxVfftKSo8DlOYydIuo8Am9ZA="},"voting_power":"12005923","proposer_priority":"-322140379"},{"address":"a9c7a884bd7d6e799ef5311bf9168e0105bce416","pub_key":{"type":"tendermint/PubKeyEd25519","value":"FdztpZioZVj+YQ0d5JCHZWBehgSFuWrjG8DKmRgwNRE="},"voting_power":"12004941","proposer_priority":"-838613255"},{"address":"f1961eee75e5a1c8a11a5bf72fb368b990bdd289","pub_key":{"type":"tendermint/PubKeyEd25519","value":"JrRT1aj11c5mrpfsh//PeKA+XCR6wlaDgAsB+fegNAs="},"voting_power":"12004031","proposer_priority":"141472735"},{"address":"9fee83fbf0bd5a4d71519efc16d0d438c203dd5a","pub_key":{"type":"tendermint/PubKeyEd25519","value":"sIJcUpa8J1/4qoXaZ0tbYNEkjSW25AJ31LsuiEYSivU="},"voting_power":"12002406","proposer_priority":"632883344"},{"address":"b44fc7d70708095fbc30af164410749483f96439","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6nmVExrET0kDePGFZDjbNirkLOw0SKuYgHsvn+w32DY="},"voting_power":"12001462","proposer_priority":"-441697099"},{"address":"c4ef42d72d69f4b58ffe2a58db1335269842ac43","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OwyWdapIzAWvKBByvLv2a5gl6yD6gK67eFzqf/SrlZE="},"voting_power":"12001234","proposer_priority":"-786662877"},{"address":"60c51d643048d0a426171bd0deabd1689a89690f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UlAJPv+2h+ChlG5uYdajVs3Eq+vp5/1Y83VoRk7tR7s="},"voting_power":"12001194","proposer_priority":"130231728"},{"address":"5d673308ca2b45e5222303836d833e0f70b1f9b0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"9wI5MjjfeZnz5otZED8KVlqXREJovA8DxYrBWIj7AEQ="},"voting_power":"12000513","proposer_priority":"576467062"},{"address":"06be03f1b334fc3f7947d0d031f7dfa568005bd4","pub_key":{"type":"tendermint/PubKeyEd25519","value":"RneQYjxZQGtzfYRO38NExiVtgjdagu1cirb3XQKLD4c="},"voting_power":"12000393","proposer_priority":"966074639"},{"address":"d7076d16c2e91e0eb16753575ac3cee3057781c0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"pwHw+O9X178B8Tmak4BelOCz0VRb2FkGHZzWSrS/ozs="},"voting_power":"12000372","proposer_priority":"-895101422"},{"address":"913834357f92e577cdc02b1e682c65e86d016ae5","pub_key":{"type":"tendermint/PubKeyEd25519","value":"GT1pq3LZ8xz8gNdWed8d2AJIWAeQ+qhxHBCOld24k0U="},"voting_power":"12000205","proposer_priority":"685373803"},{"address":"3ce85b466ff74142307b4b03ddacf17a52d46373","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OPbuQy+x6/viqrL7Pc21FLRNquvAUeegJSop3m9yEhc="},"voting_power":"12000185","proposer_priority":"-960247617"},{"address":"dc0802ad3262ecd784ce339d87073c836e31c69e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"3md1MTXk0zmxbKsPNAi1xpUvt5LJu4yUjGDtXaD7dKk="},"voting_power":"12000030","proposer_priority":"-855112185"},{"address":"31e623ab0ff5dc408c052072f96df3d4506718ce","pub_key":{"type":"tendermint/PubKeyEd25519","value":"KZACGMrjgoapUYJoZnXLubvTj7Lyvi8jPs2FZCDrdgU="},"voting_power":"12000008","proposer_priority":"476095106"},{"address":"02d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164","pub_key":{"type":"tendermint/PubKeyEd25519","value":"s4FTOQAIHzWzpl4G/wsgj5cYgJDZAmcAimOud5VcMcQ="},"voting_power":"12000006","proposer_priority":"777903824"},{"address":"646d5c6384c84c2e660bf268d0a4ebc1ffbceea6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"fN+f+HYif75SNXJTVJrQGOR19797ur001Hz/VUs3QgQ="},"voting_power":"12000005","proposer_priority":"-219372390"},{"address":"e6f8df77989972328c927e5493db6908936a4ea0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YZet9tH+pLca8oDQjPBqJdvCoSqfd+I7AAk4cwR4Lek="},"voting_power":"7826655","proposer_priority":"-922193094"},{"address":"0aabc33bff6e288ea151463ca133e38051bada85","pub_key":{"type":"tendermint/PubKeyEd25519","value":"8lf54CEx2NRPvLKy/wxlB8+XAGac4MHbHzKXHWwgHgM="},"voting_power":"2458471","proposer_priority":"-840428682"},{"address":"e71b23c378e4c465bfe96ad48e7f93f237e939dc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AATtUDupHksDYD1M0De5GdvoFcULQDol0XWSZoOt3lQ="},"voting_power":"2119422","proposer_priority":"220946237"},{"address":"bfee4eba8e3307bcb074ad575ab9fa4524af2a25","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7dsEUHdM6F+9oLMSl3xF2hRe2FqRcLOI9HNT43tDbR0="},"voting_power":"1629711","proposer_priority":"923769646"},{"address":"fbe1e3ed324fa17379403acfc3dd28fa882c6e65","pub_key":{"type":"tendermint/PubKeyEd25519","value":"gPUH+r4GyzzyALi19pL5YiHdbZxwVNFNq/aeqQMPp4E="},"voting_power":"1502555","proposer_priority":"-747171267"},{"address":"f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2","pub_key":{"type":"tendermint/PubKeyEd25519","value":"tPfAAuLM1NQUvi6onz2bpiEFQ0nS0G+HH+tiTUD74GQ="},"voting_power":"1057984","proposer_priority":"682268587"},{"address":"7c4b90fe7584bad71c5c6ab0877b8c39cd289187","pub_key":{"type":"tendermint/PubKeyEd25519","value":"rUPhoUYxrAZ8nNVmDzYBG8hKeq4DgFubS9csT5HPU/s="},"voting_power":"898826","proposer_priority":"-744711484"},{"address":"3b2a7b69569e7835324f35f7f2264d008e850c12","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OPrm7Vg+qi+G712UapKeeDBUbEeNbgHSRweHrI596h8="},"voting_power":"650165","proposer_priority":"932709426"},{"address":"edd5716db0738cb0eecd0a04aeb186c4a46720e9","pub_key":{"type":"tendermint/PubKeyEd25519","value":"crYIcbR36Gb3cv2i6j6iuDozHSmg5dYW/e7dOt0xRgw="},"voting_power":"398850","proposer_priority":"-419352069"},{"address":"f868d1eb91e32d7f21ef78462feac2892d09eb56","pub_key":{"type":"tendermint/PubKeyEd25519","value":"t6m29TlSMiMcl6l+KBJ11lX67QK2tC8P5LsF0dbWafk="},"voting_power":"217502","proposer_priority":"453775185"},{"address":"59c09cd227541c5ee7d911084ada87352c899851","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qCUSWl0pwiYSJwbknU4Fc6sZlFJINRCICBtz5xFYo8E="},"voting_power":"191753","proposer_priority":"239487984"},{"address":"478a66d6d2fcb936ba235daeb5a35ba454c048a7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"S5aSb0vlow3s2cR9n/PfrvEQpFdmnmFM4KaTVu2eO9M="},"voting_power":"176183","proposer_priority":"-281451715"},{"address":"15839d4135d8c8fa603f533ea3ba80a687fe527a","pub_key":{"type":"tendermint/PubKeyEd25519","value":"eXyi7xIpmOFoZ3LyW89SRog5/JvWOLGldYVCGOTeqOY="},"voting_power":"175897","proposer_priority":"-701319536"},{"address":"13247270303a9d66ea8ffa02614a8b5369adda53","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uE6n04V4cBXf9pOiIET69qDKtIrxqHdJXqyrHWt4WXE="},"voting_power":"174527","proposer_priority":"-828126470"},{"address":"409d07de01ea2a63c779c0246562aa278a95611e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6QAY+9wbHL6x2JRX67y8+O6iYVaD40AaAL3s6w0WyE4="},"voting_power":"158846","proposer_priority":"400010513"},{"address":"4e30f6a73766baa5fe6db7181b7fd08329c103e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qE97rQR9bxg3PoQQNzrW7jjiDfhURt212Ljh4NthQsE="},"voting_power":"129730","proposer_priority":"312908621"},{"address":"f70543a091a45a8c0de04e5ce9e40d9c16d980e1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"rkXcWaND0QwZ02iCoTek8THzVbBU2ck0oVi0VuhK9E8="},"voting_power":"119288","proposer_priority":"-555870672"},{"address":"e9b8e658e2f1aea81d57b78c8bdd2aa93a1bfc01","pub_key":{"type":"tendermint/PubKeyEd25519","value":"lMfcJzktWf2G2VKv2EkAnKlhIO21BVN1TUhlDUxhlXg="},"voting_power":"119093","proposer_priority":"724237762"},{"address":"3daf658a7b8dc1a5186f7c1547ab96ca35686575","pub_key":{"type":"tendermint/PubKeyEd25519","value":"yL6jB1QoQGd4jgWnLZEg+YT2gsp2FiLglItPbC4UCuo="},"voting_power":"116590","proposer_priority":"-615195010"},{"address":"02c375d9b259cdbb7b8a97d71b2a0a0dbed890e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"W+0vG8CMeptG2Jc6rgBrVJAd0Ap0slNLKOmH2VDzA0E="},"voting_power":"107749","proposer_priority":"-71114881"},{"address":"556f693ffba4b4c6de7af822852bd6e8a1a1d410","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kQRSDLmt8qpSDpPuxGQj0QDVToWhXF0uHKtnoZgoDx4="},"voting_power":"107326","proposer_priority":"-725928420"},{"address":"b31b8ebf6857480b1281e756f0fd67243ac7a202","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7jdjjvLZhZLmlwwEceQu/9PU3/D4lLmeYqg7ohiQrvM="},"voting_power":"106665","proposer_priority":"417900465"},{"address":"8dabad1a71629e4938de8c44d0bd2f2ce1eabd08","pub_key":{"type":"tendermint/PubKeyEd25519","value":"SySq3SuLFsjmhqTOxtNQwBuHd/xlWBipkHCK/nvHcTU="},"voting_power":"106170","proposer_priority":"-1076373229"},{"address":"615e9b48cd48fda3a754f28e3f42f77c2e49b0d7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"xGdHKqlekTKkSPiItkpINJl+CUc4TF0oQ3nh9KYE+vI="},"voting_power":"104964","proposer_priority":"260792826"},{"address":"43965a09c5be34d027a599bd6f450f5e6a13ddf7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6g6hfqPKqus5RBJ5nDfS5ZxHCNZQEl9KuCf+hbFAoJU="},"voting_power":"96973","proposer_priority":"399494349"},{"address":"25764380a6df1c9cad29a842a049f690ab0f08bc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"sRm+BMdyAFN5ifMXlKUn7VtpkGTqCSNkA9/wDQPy+S8="},"voting_power":"63683","proposer_priority":"754499561"}],"proposer":{"address":"77be23139b650d69ede7985b31fd7b1cee9ca7d3","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7LqCm1ivwRYq/ZFrdBVV0jaitBm1ub/7A5sPsoNTF5g="},"voting_power":"20219782","proposer_priority":"-1056392398"},"total_voting_power":2039442572},"trusted_height":"1-1633807","trusted_validators":{"validators":[{"address":"3c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"hg4sm5gNYb9T4dWC94nDW+30olLECT6Tkrp1FtnVBRE="},"voting_power":"110885211","proposer_priority":"244371803"},{"address":"ec033669fe506006f870bd8b12cb524a3abc3693","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ADyMDDsnw93NdBSqXRlRdeWMNnicitm1ikJ14J240Jk="},"voting_power":"70917400","proposer_priority":"350620445"},{"address":"33ecd5899a91105bb4e51066eb138189bc3825ad","pub_key":{"type":"tendermint/PubKeyEd25519","value":"dWFxEYRPzIyQpPwSHyw30ZZDZn6GgZJpDyMUvxRSbtQ="},"voting_power":"66631704","proposer_priority":"-310019549"},{"address":"44c395a4a96c6d1a450ed33b5a8ddb359cefed36","pub_key":{"type":"tendermint/PubKeyEd25519","value":"q6lQj+wYNZ+QQu9zgWoWfSXcwnQNEzb2a7HnyWyBQf0="},"voting_power":"66396058","proposer_priority":"797562705"},{"address":"c27b627c2fd11ee1e3e850738720692be2e3f4c6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"vuHjnsOVyXFYot1RaV+Wx+ck2hOOvb9/QXwXuzeWcm4="},"voting_power":"60834013","proposer_priority":"184498575"},{"address":"64cdacb04fb9c3b290579644f9edbd05cb00bb7d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ydZBYn1uztV039ywjiQ8rRycnXHc62hK10+4ZalaQVY="},"voting_power":"60576465","proposer_priority":"94594741"},{"address":"5295664886565f43a3074140551a755872bf6ffd","pub_key":{"type":"tendermint/PubKeyEd25519","value":"b3y28iu4R+IBmSIPwJA90k6yqb5kJPgvDVCmcnpSJck="},"voting_power":"60019185","proposer_priority":"-375043753"},{"address":"2a3d40c3e7ce8d6b55077335cab141c2e11ac254","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kUQmCZtP4I3q5FkKaPVTvXnr3UMD7GwlhnGdkXqsbbg="},"voting_power":"56084140","proposer_priority":"-138046953"},{"address":"f2e6bb25d8d269c9737bd3789b11dc76c4fc56e7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AQbty1lMHkV1ZHEcW8C6AYK8QhMfxaAhBdp2w+Ykp28="},"voting_power":"56060558","proposer_priority":"962227198"},{"address":"bb386aa0e7b37eb33516aebb58cae3574af85d1f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"cDPnCL7aSojDMLgu23KG3wIVb6cfpTFS3DBimDhtQro="},"voting_power":"50167947","proposer_priority":"583625887"},{"address":"43804074334ac6111233037efe20105c516b0e9f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"4HpLoBBK/GzdceBjoD4ZXBCeMyv14WPDeoCtZ1BqYv0="},"voting_power":"50022601","proposer_priority":"-535173650"},{"address":"da37d2935eae0a92de55e86db2e887b4f18575f0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"x7i3trbMJFfCcb9SAfZbL8s2M1D0OHQ4piGP+DmkJ0k="},"voting_power":"50004013","proposer_priority":"90028719"},{"address":"9c4cc8543dc684948490681118957942b29a9200","pub_key":{"type":"tendermint/PubKeyEd25519","value":"mQhc5iQg6aagqCU3i8bgNFr5jk7b733se67UQ7XizGM="},"voting_power":"49884162","proposer_priority":"-52734541"},{"address":"01b2c0f03ba9b2f352a39bc45ce37aa2710b5af4","pub_key":{"type":"tendermint/PubKeyEd25519","value":"m2EQh1+c953MguY2I+O0+arfUVgEp57S7R7v8UOsLlM="},"voting_power":"45539042","proposer_priority":"-13180117"},{"address":"410c1ebaf54c090f0a9132dfa9f79e0f480b2c06","pub_key":{"type":"tendermint/PubKeyEd25519","value":"b7/i2ANiYV7Cta01WwjBIuN5mJT1qMgcE69gkJ4bBX8="},"voting_power":"40598279","proposer_priority":"-645253375"},{"address":"c2989ed51e73b742e4991cf915d6339419657ad5","pub_key":{"type":"tendermint/PubKeyEd25519","value":"wFN94JzYFuZ9YiyRCoT7r4rnfoVaPiKDVmMYhsKn77o="},"voting_power":"40427821","proposer_priority":"-631206700"},{"address":"f6866f1f291d5a6740480c6f0774aba45177b68d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"SlYCRkhYoEI/4dsRq81rc7vN6eArQOD375W1oexAOPs="},"voting_power":"40022790","proposer_priority":"955372549"},{"address":"37b7e284915654acc06e394fb423dcae6a4fd94f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"8YnR9Xa/B9WP201LE4tDTtMKYnzW5OTpRzYv9PtvEgk="},"voting_power":"40010006","proposer_priority":"825453724"},{"address":"1a4b644c16a4a1904618f8d3c0f6a67223038390","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ifVDlvP2zSzTP+4pcCMgpUm2aROakV8bjFtq6FGKRZM="},"voting_power":"40002650","proposer_priority":"861984059"},{"address":"53406de83381dd804632447f1baed00cf28048e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UfW0oW3DujAhga+d4Jf1kalUa5dUsrHLhtLZgN9M6sA="},"voting_power":"30562456","proposer_priority":"-14927908"},{"address":"b3f0e466cf435fc603117e6cd516ab7e6337e212","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kuNvI/L/PpQSIGgn0DNFuB7lqt8jIdFUbTtAmm6Q+ZU="},"voting_power":"30037649","proposer_priority":"931717671"},{"address":"300636fc6b27a7016f3aef03c231aa63163eeb5d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"gruCRPAggDzkufHhdJ+HjaO2Tp/+UhtLs1uJwSS+fak="},"voting_power":"30010819","proposer_priority":"-210532173"},{"address":"b032b8177b81d9ed1bce8bf0ff14c45d17e821f1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"wEH/QHM8PzhiheI9SPCLVHfBsE4f68lL42rTLox8wgc="},"voting_power":"30000004","proposer_priority":"-491653732"},{"address":"6cc0a1531ff58d61dc9061c5b89bc0efc07911fc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"fu9i2vgnxjTxA2yISFpQdRmyJsfLt5zyA+Z7NijDK34="},"voting_power":"29875457","proposer_priority":"449768510"},{"address":"3965c223e13ac66f8175c86e657d396c711964b7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"I43SS5LrmBqDQURAVVyisYxX3Li+mYK7P7Sij6+yYIE="},"voting_power":"28798994","proposer_priority":"768037568"},{"address":"76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d9","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UcCQ3UtXPjyF5k4+KMonaWnQ22vtlZq6DfygnmaTp9Y="},"voting_power":"26528649","proposer_priority":"-811092974"},{"address":"1b21f9bf3b9a650607cced8c0c2fbeca3211791b","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YjIyQkXPkU4HTUXD74DGwTXk1apkue35R0AispufH0g="},"voting_power":"25573773","proposer_priority":"-57917151"},{"address":"1b03ab3c744545b281d224127708a9ec7487e58c","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YhgNr8OiPRzSI1MybqgRZf3yWYPGMy7vNPxSzsfRFrE="},"voting_power":"24542545","proposer_priority":"-278212832"},{"address":"e2fc4df9e7870fc8238136faca07a120cc078a0c","pub_key":{"type":"tendermint/PubKeyEd25519","value":"1TSNDP080xciccCHFOrXhVB1XBDPSVwMK85lq/H0dC8="},"voting_power":"24515904","proposer_priority":"-410094601"},{"address":"671d816776e8c7fae18dc122fb6dc231956c6d48","pub_key":{"type":"tendermint/PubKeyEd25519","value":"xafI5gPZEFu7ifGpLfsS6VbkLvE6PLsEXEnQw1TQAn0="},"voting_power":"24515270","proposer_priority":"-500656744"},{"address":"6bdc45074c28d7467d37f875091fa5036ac62eed","pub_key":{"type":"tendermint/PubKeyEd25519","value":"+sad+WQif7UkeXMjgbtA2w+qNh/um0saLp5ICSujp/M="},"voting_power":"24000005","proposer_priority":"389877835"},{"address":"718160e3538e0b0ed83d3b3dc4ece83809fcd107","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uxrtntmwVXujeUpI8VJD9MjGubF2xptYnHFmT4lklvk="},"voting_power":"22876803","proposer_priority":"347514315"},{"address":"b03f0cb997f3428ef3968833bca2f2a4f613a8eb","pub_key":{"type":"tendermint/PubKeyEd25519","value":"afEmBb9L2G5I/aE4ZJ24dGFEZJDvrdBH93of8jYGv20="},"voting_power":"20279407","proposer_priority":"-865191249"},{"address":"77be23139b650d69ede7985b31fd7b1cee9ca7d3","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7LqCm1ivwRYq/ZFrdBVV0jaitBm1ub/7A5sPsoNTF5g="},"voting_power":"20219782","proposer_priority":"313041958"},{"address":"5c78a0762f13b0b2a793e82d1a178eb45642234d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"tFyF8SVRJ81z9O2q2wzZMHUit2vgDWiEnv2aK/CSCoI="},"voting_power":"20216309","proposer_priority":"-967403484"},{"address":"70dac78498afc6d766d860c433265a274d48b7d8","pub_key":{"type":"tendermint/PubKeyEd25519","value":"VDk6q4U643fvFagHQjWNoKUqnr6lU3NKBo9ERAS5kDQ="},"voting_power":"20134471","proposer_priority":"261212876"},{"address":"b41ef50272a7a2398ba617d3c963986ebebc5b2d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"GprPmRax5CnFvFsS9f6mGstf7zRXEvJdEoBuvENp/cI="},"voting_power":"20101846","proposer_priority":"345593555"},{"address":"521d2a344e322b8ba76401c833a1ec74ea2bd075","pub_key":{"type":"tendermint/PubKeyEd25519","value":"BzddkwvM57jNIsA7TxUyS8wLLSTbDpa8IBqiGy+LaxE="},"voting_power":"20020216","proposer_priority":"-831221018"},{"address":"35f6c0359084c37ef6eb4061b694386910093b99","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AatuXTZOwAWhufDJiRXkrDce9jeVvbcZOhsuw6e+gNM="},"voting_power":"20002859","proposer_priority":"-746536370"},{"address":"2a1b3fee6b29ea1828d427f0e5c3887cb7e64487","pub_key":{"type":"tendermint/PubKeyEd25519","value":"WGS64GhNVcsRoSuQ0g1+iVaBp7CeQaITSPIqD+xcUAM="},"voting_power":"20002754","proposer_priority":"685560368"},{"address":"ccb2909dcd316fc5e738dcdb1f14360f04b44320","pub_key":{"type":"tendermint/PubKeyEd25519","value":"R+agpHoODVGSoS3i/1cM3kgD6lbZKmJWYLcPVVmUn8Q="},"voting_power":"20000945","proposer_priority":"-277504848"},{"address":"616a45478336b92583cfe29e8ee942802de69eae","pub_key":{"type":"tendermint/PubKeyEd25519","value":"XVwl5MdQw44yq0kvTQ2W1OKtFnO5/Z9snTk+2TI0PhQ="},"voting_power":"19589722","proposer_priority":"997588158"},{"address":"fbc2a3f682b507f1a3a5d4c44c8cbb6af0860296","pub_key":{"type":"tendermint/PubKeyEd25519","value":"LWOEtc00ggBtocjJaKbNQ2ArZJMD5IaYQ/a/agRacPE="},"voting_power":"19525184","proposer_priority":"809490321"},{"address":"2c4e108c3f09cf9b8b1515d3b26d50e332d86e3b","pub_key":{"type":"tendermint/PubKeyEd25519","value":"WIfDZZv31OnJDUv5ZR78/HLozeQZESoDYKcbJscoxdc="},"voting_power":"18048625","proposer_priority":"-266047189"},{"address":"f42c7e49df4f4d0993237959518415e473792392","pub_key":{"type":"tendermint/PubKeyEd25519","value":"HS7PneXHx4p3Pw4/Tf3k8dqqq3zA85tgmtD2Za2zlfA="},"voting_power":"17858362","proposer_priority":"217455970"},{"address":"c268fe001a533b6f0860167381384363a790fd0d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"I8TBe0JOeuJssNbOLGCyer0iMDlz6Ij/OcAxmCEpS/E="},"voting_power":"16755781","proposer_priority":"5312198"},{"address":"9a323ff30c24f59e160aaf02a57c63e11c41495e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YeVzZ/HjpKl0i0ddoaeekIdQdyvincMYD6YjPsSQpw4="},"voting_power":"13200031","proposer_priority":"267884376"},{"address":"a8f38fcb39b580c4b856dcaed882d504a216ee00","pub_key":{"type":"tendermint/PubKeyEd25519","value":"Kda/tpSMpgzH0ImTXQR75NTU66y9D14hVCucT2y+9KA="},"voting_power":"12539120","proposer_priority":"948106656"},{"address":"7ea986d8723587f5e653c0df785fcfce39238785","pub_key":{"type":"tendermint/PubKeyEd25519","value":"ABSElT/KHsxFF5u5b5hS8LhDS30VsSee3V1uZAS6J8w="},"voting_power":"12480381","proposer_priority":"941067159"},{"address":"aea26001de9b15d4dad32808712864e61ae52a17","pub_key":{"type":"tendermint/PubKeyEd25519","value":"RtPXsKSt++T/v0Xqr04rraOXAdQcZCLpz5Q474EmtRw="},"voting_power":"12241388","proposer_priority":"-350657324"},{"address":"2972b0df619f73d1a5c8933aff22ad8c9258f370","pub_key":{"type":"tendermint/PubKeyEd25519","value":"NhA92zy67zrx+Sy1A7i6EMIvELJIB7swGRIeoQaf0Xo="},"voting_power":"12179809","proposer_priority":"-794561170"},{"address":"a8a2bf2709ca05755f881ebd939991aea9f88cf1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"srcpua9x2zK2xbHtXb1E/L6lJRTn7ehJggnlcBiCEPw="},"voting_power":"12119999","proposer_priority":"-523243803"},{"address":"23df4a8418762cea4d24b7227ad125df76d2baf6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"2e/NDjibT4BFoyfT5myyzMIGpDPAiHjeLCNXSj6/Ow0="},"voting_power":"12048703","proposer_priority":"279243129"},{"address":"9407fa25941c932473f8e2b1ecc5481e3ae15a71","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uRLdogR9YCZFCUXggDpKqPJnRd1Tn52+twiAnkvC3zk="},"voting_power":"12041246","proposer_priority":"-132461367"},{"address":"65c584027f5fd8349027fa5bf1d4ed3828c29058","pub_key":{"type":"tendermint/PubKeyEd25519","value":"cxBI4Ef7MfASd1COwn2eqgVooP0Qp2eDQls/pv7dMa8="},"voting_power":"12031194","proposer_priority":"908239012"},{"address":"466d1236b8c77925b25219e4ffe34dd069351847","pub_key":{"type":"tendermint/PubKeyEd25519","value":"9pe9aXHTo4AckQ3eR2mHixLqZLjAw34OnzQLZtikS4c="},"voting_power":"12024095","proposer_priority":"696050447"},{"address":"b8f9204a348e0dbc85abe5bc98936d6b84c01e45","pub_key":{"type":"tendermint/PubKeyEd25519","value":"L2YmP55MMBPcbucOqkWZ8O5Xmwt/nQR9KABn5WRNC7I="},"voting_power":"12013392","proposer_priority":"-715356796"},{"address":"2ab301f354a74f45afb347b2c00cdceb09cc719d","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qFSnvrYxWgRHPWz424XRZOiClZXjHoDQBv1CMQDS7/o="},"voting_power":"12006092","proposer_priority":"179312998"},{"address":"9215b6b8ec64cb9e7b461c3945e6ce00da86f8f2","pub_key":{"type":"tendermint/PubKeyEd25519","value":"Qng5pYzBWTouQK1EnLQxVfftKSo8DlOYydIuo8Am9ZA="},"voting_power":"12005923","proposer_priority":"108508511"},{"address":"a9c7a884bd7d6e799ef5311bf9168e0105bce416","pub_key":{"type":"tendermint/PubKeyEd25519","value":"FdztpZioZVj+YQ0d5JCHZWBehgSFuWrjG8DKmRgwNRE="},"voting_power":"12004941","proposer_priority":"-407832777"},{"address":"f1961eee75e5a1c8a11a5bf72fb368b990bdd289","pub_key":{"type":"tendermint/PubKeyEd25519","value":"JrRT1aj11c5mrpfsh//PeKA+XCR6wlaDgAsB+fegNAs="},"voting_power":"12004031","proposer_priority":"572375153"},{"address":"9fee83fbf0bd5a4d71519efc16d0d438c203dd5a","pub_key":{"type":"tendermint/PubKeyEd25519","value":"sIJcUpa8J1/4qoXaZ0tbYNEkjSW25AJ31LsuiEYSivU="},"voting_power":"12002406","proposer_priority":"-975439060"},{"address":"b44fc7d70708095fbc30af164410749483f96439","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6nmVExrET0kDePGFZDjbNirkLOw0SKuYgHsvn+w32DY="},"voting_power":"12001462","proposer_priority":"-10450435"},{"address":"c4ef42d72d69f4b58ffe2a58db1335269842ac43","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OwyWdapIzAWvKBByvLv2a5gl6yD6gK67eFzqf/SrlZE="},"voting_power":"12001234","proposer_priority":"-355385661"},{"address":"60c51d643048d0a426171bd0deabd1689a89690f","pub_key":{"type":"tendermint/PubKeyEd25519","value":"UlAJPv+2h+ChlG5uYdajVs3Eq+vp5/1Y83VoRk7tR7s="},"voting_power":"12001194","proposer_priority":"561514304"},{"address":"5d673308ca2b45e5222303836d833e0f70b1f9b0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"9wI5MjjfeZnz5otZED8KVlqXREJovA8DxYrBWIj7AEQ="},"voting_power":"12000513","proposer_priority":"-1031601680"},{"address":"06be03f1b334fc3f7947d0d031f7dfa568005bd4","pub_key":{"type":"tendermint/PubKeyEd25519","value":"RneQYjxZQGtzfYRO38NExiVtgjdagu1cirb3XQKLD4c="},"voting_power":"12000393","proposer_priority":"-641978023"},{"address":"d7076d16c2e91e0eb16753575ac3cee3057781c0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"pwHw+O9X178B8Tmak4BelOCz0VRb2FkGHZzWSrS/ozs="},"voting_power":"12000372","proposer_priority":"-463708698"},{"address":"913834357f92e577cdc02b1e682c65e86d016ae5","pub_key":{"type":"tendermint/PubKeyEd25519","value":"GT1pq3LZ8xz8gNdWed8d2AJIWAeQ+qhxHBCOld24k0U="},"voting_power":"12000205","proposer_priority":"-922653667"},{"address":"3ce85b466ff74142307b4b03ddacf17a52d46373","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OPbuQy+x6/viqrL7Pc21FLRNquvAUeegJSop3m9yEhc="},"voting_power":"12000185","proposer_priority":"-528829835"},{"address":"dc0802ad3262ecd784ce339d87073c836e31c69e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"3md1MTXk0zmxbKsPNAi1xpUvt5LJu4yUjGDtXaD7dKk="},"voting_power":"12000030","proposer_priority":"-423673633"},{"address":"31e623ab0ff5dc408c052072f96df3d4506718ce","pub_key":{"type":"tendermint/PubKeyEd25519","value":"KZACGMrjgoapUYJoZnXLubvTj7Lyvi8jPs2FZCDrdgU="},"voting_power":"12000008","proposer_priority":"907536606"},{"address":"02d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164","pub_key":{"type":"tendermint/PubKeyEd25519","value":"s4FTOQAIHzWzpl4G/wsgj5cYgJDZAmcAimOud5VcMcQ="},"voting_power":"12000006","proposer_priority":"-830096980"},{"address":"646d5c6384c84c2e660bf268d0a4ebc1ffbceea6","pub_key":{"type":"tendermint/PubKeyEd25519","value":"fN+f+HYif75SNXJTVJrQGOR19797ur001Hz/VUs3QgQ="},"voting_power":"12000005","proposer_priority":"212069512"},{"address":"e6f8df77989972328c927e5493db6908936a4ea0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"YZet9tH+pLca8oDQjPBqJdvCoSqfd+I7AAk4cwR4Lek="},"voting_power":"7826655","proposer_priority":"68477708"},{"address":"0aabc33bff6e288ea151463ca133e38051bada85","pub_key":{"type":"tendermint/PubKeyEd25519","value":"8lf54CEx2NRPvLKy/wxlB8+XAGac4MHbHzKXHWwgHgM="},"voting_power":"2458471","proposer_priority":"869578776"},{"address":"e71b23c378e4c465bfe96ad48e7f93f237e939dc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"AATtUDupHksDYD1M0De5GdvoFcULQDol0XWSZoOt3lQ="},"voting_power":"2119422","proposer_priority":"-63056311"},{"address":"bfee4eba8e3307bcb074ad575ab9fa4524af2a25","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7dsEUHdM6F+9oLMSl3xF2hRe2FqRcLOI9HNT43tDbR0="},"voting_power":"1629711","proposer_priority":"705388372"},{"address":"fbe1e3ed324fa17379403acfc3dd28fa882c6e65","pub_key":{"type":"tendermint/PubKeyEd25519","value":"gPUH+r4GyzzyALi19pL5YiHdbZxwVNFNq/aeqQMPp4E="},"voting_power":"1502555","proposer_priority":"-948513637"},{"address":"f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2","pub_key":{"type":"tendermint/PubKeyEd25519","value":"tPfAAuLM1NQUvi6onz2bpiEFQ0nS0G+HH+tiTUD74GQ="},"voting_power":"1057984","proposer_priority":"540498731"},{"address":"7c4b90fe7584bad71c5c6ab0877b8c39cd289187","pub_key":{"type":"tendermint/PubKeyEd25519","value":"rUPhoUYxrAZ8nNVmDzYBG8hKeq4DgFubS9csT5HPU/s="},"voting_power":"898826","proposer_priority":"-865154168"},{"address":"3b2a7b69569e7835324f35f7f2264d008e850c12","pub_key":{"type":"tendermint/PubKeyEd25519","value":"OPrm7Vg+qi+G712UapKeeDBUbEeNbgHSRweHrI596h8="},"voting_power":"650165","proposer_priority":"845587316"},{"address":"edd5716db0738cb0eecd0a04aeb186c4a46720e9","pub_key":{"type":"tendermint/PubKeyEd25519","value":"crYIcbR36Gb3cv2i6j6iuDozHSmg5dYW/e7dOt0xRgw="},"voting_power":"398850","proposer_priority":"-472797969"},{"address":"f868d1eb91e32d7f21ef78462feac2892d09eb56","pub_key":{"type":"tendermint/PubKeyEd25519","value":"t6m29TlSMiMcl6l+KBJ11lX67QK2tC8P5LsF0dbWafk="},"voting_power":"217502","proposer_priority":"424629917"},{"address":"59c09cd227541c5ee7d911084ada87352c899851","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qCUSWl0pwiYSJwbknU4Fc6sZlFJINRCICBtz5xFYo8E="},"voting_power":"191753","proposer_priority":"213793082"},{"address":"478a66d6d2fcb936ba235daeb5a35ba454c048a7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"S5aSb0vlow3s2cR9n/PfrvEQpFdmnmFM4KaTVu2eO9M="},"voting_power":"176183","proposer_priority":"-305060237"},{"address":"15839d4135d8c8fa603f533ea3ba80a687fe527a","pub_key":{"type":"tendermint/PubKeyEd25519","value":"eXyi7xIpmOFoZ3LyW89SRog5/JvWOLGldYVCGOTeqOY="},"voting_power":"175897","proposer_priority":"-724889734"},{"address":"13247270303a9d66ea8ffa02614a8b5369adda53","pub_key":{"type":"tendermint/PubKeyEd25519","value":"uE6n04V4cBXf9pOiIET69qDKtIrxqHdJXqyrHWt4WXE="},"voting_power":"174527","proposer_priority":"-851513088"},{"address":"409d07de01ea2a63c779c0246562aa278a95611e","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6QAY+9wbHL6x2JRX67y8+O6iYVaD40AaAL3s6w0WyE4="},"voting_power":"158846","proposer_priority":"378725149"},{"address":"4e30f6a73766baa5fe6db7181b7fd08329c103e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"qE97rQR9bxg3PoQQNzrW7jjiDfhURt212Ljh4NthQsE="},"voting_power":"129730","proposer_priority":"295524801"},{"address":"f70543a091a45a8c0de04e5ce9e40d9c16d980e1","pub_key":{"type":"tendermint/PubKeyEd25519","value":"rkXcWaND0QwZ02iCoTek8THzVbBU2ck0oVi0VuhK9E8="},"voting_power":"119288","proposer_priority":"-571855264"},{"address":"e9b8e658e2f1aea81d57b78c8bdd2aa93a1bfc01","pub_key":{"type":"tendermint/PubKeyEd25519","value":"lMfcJzktWf2G2VKv2EkAnKlhIO21BVN1TUhlDUxhlXg="},"voting_power":"119093","proposer_priority":"708279300"},{"address":"3daf658a7b8dc1a5186f7c1547ab96ca35686575","pub_key":{"type":"tendermint/PubKeyEd25519","value":"yL6jB1QoQGd4jgWnLZEg+YT2gsp2FiLglItPbC4UCuo="},"voting_power":"116590","proposer_priority":"-630818070"},{"address":"02c375d9b259cdbb7b8a97d71b2a0a0dbed890e0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"W+0vG8CMeptG2Jc6rgBrVJAd0Ap0slNLKOmH2VDzA0E="},"voting_power":"107749","proposer_priority":"-85553247"},{"address":"556f693ffba4b4c6de7af822852bd6e8a1a1d410","pub_key":{"type":"tendermint/PubKeyEd25519","value":"kQRSDLmt8qpSDpPuxGQj0QDVToWhXF0uHKtnoZgoDx4="},"voting_power":"107326","proposer_priority":"-740310104"},{"address":"b31b8ebf6857480b1281e756f0fd67243ac7a202","pub_key":{"type":"tendermint/PubKeyEd25519","value":"7jdjjvLZhZLmlwwEceQu/9PU3/D4lLmeYqg7ohiQrvM="},"voting_power":"106665","proposer_priority":"403607355"},{"address":"8dabad1a71629e4938de8c44d0bd2f2ce1eabd08","pub_key":{"type":"tendermint/PubKeyEd25519","value":"SySq3SuLFsjmhqTOxtNQwBuHd/xlWBipkHCK/nvHcTU="},"voting_power":"106170","proposer_priority":"-1090600009"},{"address":"615e9b48cd48fda3a754f28e3f42f77c2e49b0d7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"xGdHKqlekTKkSPiItkpINJl+CUc4TF0oQ3nh9KYE+vI="},"voting_power":"104964","proposer_priority":"246727650"},{"address":"43965a09c5be34d027a599bd6f450f5e6a13ddf7","pub_key":{"type":"tendermint/PubKeyEd25519","value":"6g6hfqPKqus5RBJ5nDfS5ZxHCNZQEl9KuCf+hbFAoJU="},"voting_power":"96973","proposer_priority":"386499967"},{"address":"25764380a6df1c9cad29a842a049f690ab0f08bc","pub_key":{"type":"tendermint/PubKeyEd25519","value":"sRm+BMdyAFN5ifMXlKUn7VtpkGTqCSNkA9/wDQPy+S8="},"voting_power":"63683","proposer_priority":"745966039"}],"proposer":{"address":"5d673308ca2b45e5222303836d833e0f70b1f9b0","pub_key":{"type":"tendermint/PubKeyEd25519","value":"9wI5MjjfeZnz5otZED8KVlqXREJovA8DxYrBWIj7AEQ="},"voting_power":"12000513","proposer_priority":"-1031601680"},"total_voting_power":2039442572}}"#).unwrap(); + + let timestamp = Timestamp::from_nanos(header.signed_header.header.time.as_unix_nanos()); + + let state_update = verify_header( + client_state.clone(), + consensus_state, + header.clone(), + timestamp, + Ed25519Verifier::new(mock_dependencies().as_ref()), + ) + .unwrap(); + + client_state.latest_height = + Height::new_with_revision(1, header.signed_header.header.height.inner() as u64); + + assert_eq!(state_update.client_state.unwrap(), client_state); + assert_eq!( + state_update.consensus_state, + ConsensusState { + timestamp: header.signed_header.header.time, + root: MerkleRoot { + hash: header.signed_header.header.app_hash.into_encoding() + }, + next_validators_hash: header.signed_header.header.next_validators_hash + } + ); + } +} diff --git a/cosmwasm/lightclient/tendermint/src/errors.rs b/cosmwasm/lightclient/tendermint/src/errors.rs index 321b0eed05a..6792e80145b 100644 --- a/cosmwasm/lightclient/tendermint/src/errors.rs +++ b/cosmwasm/lightclient/tendermint/src/errors.rs @@ -8,7 +8,7 @@ use unionlabs::{ use crate::client::TendermintLightClient; -#[derive(Debug, Clone, PartialEq, thiserror::Error)] +#[derive(Debug, thiserror::Error)] // TODO: Use an error reporter at the top level of ics008-wasm-client so we don't have to include the sources manually in the display impl pub enum Error { #[error(transparent)] diff --git a/cosmwasm/lightclient/tendermint/src/verifier.rs b/cosmwasm/lightclient/tendermint/src/verifier.rs index 215b42f7a3e..a46f915807e 100644 --- a/cosmwasm/lightclient/tendermint/src/verifier.rs +++ b/cosmwasm/lightclient/tendermint/src/verifier.rs @@ -1,54 +1,131 @@ -use cometbft_types::crypto::public_key::PublicKey; +use cometbft_types::{crypto::public_key::PublicKey, types::block_id_flag::BlockIdFlag}; use cosmwasm_std::Deps; -use tendermint_verifier::types::HostFns; +use tendermint_verifier::{ + error::Error, + types::{ValidatorSig, Verification}, +}; pub struct Ed25519Verifier<'a> { deps: Deps<'a>, + pubkeys: Vec>, + msgs: Vec>, + signatures: Vec>, } impl<'a> Ed25519Verifier<'a> { pub fn new(deps: Deps<'a>) -> Self { - Self { deps } + Self { + deps, + pubkeys: Vec::new(), + msgs: Vec::new(), + signatures: Vec::new(), + } } } -#[allow(clippy::manual_unwrap_or)] -impl HostFns for Ed25519Verifier<'_> { - fn verify_signature(&self, pubkey: &PublicKey, msg: &[u8], sig: &[u8]) -> bool { - match pubkey { - PublicKey::Ed25519(key) => self - .deps - .api - .ed25519_verify(msg, sig, key) - .unwrap_or_default(), - _ => false, - } +#[derive(Debug, thiserror::Error)] +pub enum VerificationError { + #[error("timestamp must be set for the committed validators")] + TimestampMustBeSet, + #[error("signature must exist for the committed validators")] + SignatureMustExist, + #[error("validator address must exist for the committed validators")] + ValidatorAddressMustExist, + #[error("message must exist for all commits")] + MessageMustExist, + #[error("invalid public key type: {0}")] + InvalidPublicKeyType(String), + #[error("inner verification")] + InnerVerification(#[source] cosmwasm_std::VerificationError), + #[error("signature verification failed")] + SignatureVerificationFailed, +} + +impl From for Error { + fn from(value: VerificationError) -> Self { + Error::ClientSpecific(Box::new(value)) } +} + +impl<'a> Verification for Ed25519Verifier<'a> { + type Error = VerificationError; - fn verify_batch_signature( + type CanonicalVoteProto = protos::tendermint::types::CanonicalVote; + + fn filter_commit( &self, - pubkeys: &[PublicKey], - msgs: &[&[u8]], - sigs: &[&[u8]], - ) -> bool { - let Ok(pubkeys) = pubkeys - .iter() - .map(|pk| match pk { - PublicKey::Ed25519(pkey) => Ok(pkey.as_ref()), - _ => Err(()), - }) - .collect::, _>>() - else { - return false; + commit_sig: &cometbft_types::types::commit_sig::CommitSigRaw, + ) -> Result, Self::Error> { + if commit_sig.block_id_flag == Into::::into(BlockIdFlag::Commit) { + let timestamp = commit_sig + .timestamp + .ok_or(VerificationError::TimestampMustBeSet)?; + let signature = commit_sig + .signature + .clone() + .ok_or(VerificationError::SignatureMustExist)?; + + let validator_address = commit_sig + .validator_address + .ok_or(VerificationError::SignatureMustExist)? + .into_encoding(); + + Ok(Some(ValidatorSig { + validator_address, + timestamp, + signature: Some(signature.into_vec()), + })) + } else { + Ok(None) + } + } + + fn process_signature( + &mut self, + public_key: PublicKey, + msg: Option>, + signature: Option>, + ) -> Result<(), Self::Error> { + let msg = msg.ok_or(VerificationError::MessageMustExist)?; + let signature = signature.ok_or(VerificationError::SignatureMustExist)?; + + let PublicKey::Ed25519(public_key) = public_key else { + return Err(VerificationError::InvalidPublicKeyType( + "public key type must be ed25519".to_string(), + )); }; - self.deps + // TODO(aeryz): verify here + self.pubkeys.push(public_key.into_vec()); + self.msgs.push(msg); + self.signatures.push(signature); + + Ok(()) + } + + fn finish(&mut self) -> Result<(), Self::Error> { + let pubkeys: Vec<&[u8]> = self.pubkeys.iter().map(|x| x.as_slice()).collect(); + let msgs: Vec<&[u8]> = self.msgs.iter().map(|x| x.as_slice()).collect(); + let sigs: Vec<&[u8]> = self.signatures.iter().map(|x| x.as_slice()).collect(); + + let ret = if self + .deps .api - .ed25519_batch_verify(msgs, sigs, &pubkeys) - .unwrap_or_default() + .ed25519_batch_verify(&msgs, &sigs, &pubkeys) + .map_err(VerificationError::InnerVerification)? + { + Ok(()) + } else { + Err(VerificationError::SignatureVerificationFailed) + }; + + self.pubkeys = Vec::new(); + self.msgs = Vec::new(); + self.signatures = Vec::new(); + + ret } } - #[cfg(feature = "bls")] pub mod bls { use cometbft_types::crypto::public_key::PublicKey; diff --git a/cosmwasm/lightclient/trusted-mpt/Cargo.toml b/cosmwasm/lightclient/trusted-mpt/Cargo.toml index 2919604ecd7..df318824b78 100644 --- a/cosmwasm/lightclient/trusted-mpt/Cargo.toml +++ b/cosmwasm/lightclient/trusted-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "trusted-mpt-light-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/lst-staker/Cargo.toml b/cosmwasm/lst-staker/Cargo.toml index 79b3eaf920d..5252d9bb259 100644 --- a/cosmwasm/lst-staker/Cargo.toml +++ b/cosmwasm/lst-staker/Cargo.toml @@ -2,11 +2,11 @@ name = "lst-staker" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/multicall/Cargo.toml b/cosmwasm/multicall/Cargo.toml index 35db86142fc..4a94ecc7d51 100644 --- a/cosmwasm/multicall/Cargo.toml +++ b/cosmwasm/multicall/Cargo.toml @@ -2,11 +2,11 @@ name = "multicall" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/on-zkgm-call-proxy/Cargo.toml b/cosmwasm/on-zkgm-call-proxy/Cargo.toml index 7880b747274..36b6b6114b6 100644 --- a/cosmwasm/on-zkgm-call-proxy/Cargo.toml +++ b/cosmwasm/on-zkgm-call-proxy/Cargo.toml @@ -2,11 +2,11 @@ name = "on-zkgm-call-proxy" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/osmosis-tokenfactory-token-minter/Cargo.toml b/cosmwasm/osmosis-tokenfactory-token-minter/Cargo.toml index 23a0035ee83..6bb5083f9fd 100644 --- a/cosmwasm/osmosis-tokenfactory-token-minter/Cargo.toml +++ b/cosmwasm/osmosis-tokenfactory-token-minter/Cargo.toml @@ -2,11 +2,11 @@ name = "osmosis-tokenfactory-token-minter" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/osmosis-tokenfactory-token-owner/Cargo.toml b/cosmwasm/osmosis-tokenfactory-token-owner/Cargo.toml index a727add924f..06bed0388c8 100644 --- a/cosmwasm/osmosis-tokenfactory-token-owner/Cargo.toml +++ b/cosmwasm/osmosis-tokenfactory-token-owner/Cargo.toml @@ -2,11 +2,11 @@ name = "osmosis-tokenfactory-token-owner" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/pausable/Cargo.toml b/cosmwasm/pausable/Cargo.toml index 78f163cc68d..ffedcf8e8cb 100644 --- a/cosmwasm/pausable/Cargo.toml +++ b/cosmwasm/pausable/Cargo.toml @@ -2,11 +2,11 @@ name = "pausable" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/proxy-account-factory/Cargo.toml b/cosmwasm/proxy-account-factory/Cargo.toml index 46632bff226..ec32bcb7509 100644 --- a/cosmwasm/proxy-account-factory/Cargo.toml +++ b/cosmwasm/proxy-account-factory/Cargo.toml @@ -2,11 +2,11 @@ name = "proxy-account-factory" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/cosmwasm/token-factory-api/Cargo.toml b/cosmwasm/token-factory-api/Cargo.toml index e1a158fa695..32dfa8337eb 100644 --- a/cosmwasm/token-factory-api/Cargo.toml +++ b/cosmwasm/token-factory-api/Cargo.toml @@ -2,11 +2,11 @@ name = "token-factory-api" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/ucs03-zkgm-token-minter-api/Cargo.toml b/cosmwasm/ucs03-zkgm-token-minter-api/Cargo.toml index 2b8787e3ea2..95b0a5cbe9e 100644 --- a/cosmwasm/ucs03-zkgm-token-minter-api/Cargo.toml +++ b/cosmwasm/ucs03-zkgm-token-minter-api/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs03-zkgm-token-minter-api" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/cosmwasm/upgradable/Cargo.toml b/cosmwasm/upgradable/Cargo.toml index bc7caeab3cd..2008680ed86 100644 --- a/cosmwasm/upgradable/Cargo.toml +++ b/cosmwasm/upgradable/Cargo.toml @@ -2,11 +2,11 @@ name = "upgradable" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/devnet-compose/Cargo.toml b/devnet-compose/Cargo.toml index c1e3bac106f..19056ba56d2 100644 --- a/devnet-compose/Cargo.toml +++ b/devnet-compose/Cargo.toml @@ -2,11 +2,11 @@ name = "devnet-compose" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/drip/Cargo.toml b/drip/Cargo.toml index 4d13c9cdfbc..c20795541ba 100644 --- a/drip/Cargo.toml +++ b/drip/Cargo.toml @@ -2,11 +2,11 @@ name = "drip" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/e2e/access-managed-example/Cargo.toml b/e2e/access-managed-example/Cargo.toml index ee29bfabc1e..968346d1a79 100644 --- a/e2e/access-managed-example/Cargo.toml +++ b/e2e/access-managed-example/Cargo.toml @@ -2,11 +2,11 @@ name = "access-managed-example" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/e2e/access-manager-tests/Cargo.toml b/e2e/access-manager-tests/Cargo.toml index 021c2f5e7b5..94210c9ff23 100644 --- a/e2e/access-manager-tests/Cargo.toml +++ b/e2e/access-manager-tests/Cargo.toml @@ -2,11 +2,11 @@ name = "access-manager-tests" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [dependencies] access-managed-example = { workspace = true } diff --git a/e2e/access-manager-tests/src/main.rs b/e2e/access-manager-tests/src/main.rs index edeab42a4ab..e3cf6f8a0ce 100644 --- a/e2e/access-manager-tests/src/main.rs +++ b/e2e/access-manager-tests/src/main.rs @@ -1,4 +1,4 @@ -use std::{fmt::Display, num::NonZero, path::PathBuf}; +use std::{fmt::Display, num::NonZero, ops::Add, path::PathBuf}; use access_manager_types::{ RoleId, Selector, @@ -161,7 +161,7 @@ async fn wait_for_finalized_block_with( .signed_header .header .height - .add(&if commit.canonical { 0 } else { -1 }) + .add(if commit.canonical { 0 } else { -1 }) .inner() .try_into() .unwrap(), diff --git a/e2e/ensure-blocks/Cargo.toml b/e2e/ensure-blocks/Cargo.toml index a34d03d315d..208f9f97d52 100644 --- a/e2e/ensure-blocks/Cargo.toml +++ b/e2e/ensure-blocks/Cargo.toml @@ -3,11 +3,11 @@ description = "A small command line utility to ensure that blocks are produced o name = "ensure-blocks" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/generated/rust/aptos-move-ibc/Cargo.toml b/generated/rust/aptos-move-ibc/Cargo.toml index 025bcb02b21..bec34f49e39 100644 --- a/generated/rust/aptos-move-ibc/Cargo.toml +++ b/generated/rust/aptos-move-ibc/Cargo.toml @@ -2,11 +2,11 @@ name = "aptos-move-ibc" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/access-manager-types/Cargo.toml b/lib/access-manager-types/Cargo.toml index 07b4fd0eadd..dd73563d209 100644 --- a/lib/access-manager-types/Cargo.toml +++ b/lib/access-manager-types/Cargo.toml @@ -2,11 +2,11 @@ name = "access-manager-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/aptos-types/Cargo.toml b/lib/aptos-types/Cargo.toml index 9fa1887f19d..72299673409 100644 --- a/lib/aptos-types/Cargo.toml +++ b/lib/aptos-types/Cargo.toml @@ -2,11 +2,11 @@ name = "aptos-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/aptos-verifier/Cargo.toml b/lib/aptos-verifier/Cargo.toml index 643098718c7..f9dce86dc0a 100644 --- a/lib/aptos-verifier/Cargo.toml +++ b/lib/aptos-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "aptos-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/arbitrum-client/Cargo.toml b/lib/arbitrum-client/Cargo.toml index e89a820b982..f557342c4b9 100644 --- a/lib/arbitrum-client/Cargo.toml +++ b/lib/arbitrum-client/Cargo.toml @@ -2,11 +2,11 @@ name = "arbitrum-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [dependencies] alloy = { workspace = true, features = ["contract", "network", "providers", "signers", "signer-local", "rpc", "rpc-types", "transports", "transport-http", "transport-ws", "reqwest", "provider-ws"] } diff --git a/lib/arbitrum-light-client-types/Cargo.toml b/lib/arbitrum-light-client-types/Cargo.toml index 4232b5ffedb..06bd5d76aaf 100644 --- a/lib/arbitrum-light-client-types/Cargo.toml +++ b/lib/arbitrum-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "arbitrum-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/arbitrum-types/Cargo.toml b/lib/arbitrum-types/Cargo.toml index 53171b9a1df..3782622bf88 100644 --- a/lib/arbitrum-types/Cargo.toml +++ b/lib/arbitrum-types/Cargo.toml @@ -2,11 +2,11 @@ name = "arbitrum-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/arbitrum-verifier/Cargo.toml b/lib/arbitrum-verifier/Cargo.toml index 6bd921420ff..160ee3be7b4 100644 --- a/lib/arbitrum-verifier/Cargo.toml +++ b/lib/arbitrum-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "arbitrum-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/attested-light-client-types/Cargo.toml b/lib/attested-light-client-types/Cargo.toml index 66e7f22c05d..3958d534c1f 100644 --- a/lib/attested-light-client-types/Cargo.toml +++ b/lib/attested-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "attested-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/beacon-api-types/Cargo.toml b/lib/beacon-api-types/Cargo.toml index c192a98ed0b..f078fa57db4 100644 --- a/lib/beacon-api-types/Cargo.toml +++ b/lib/beacon-api-types/Cargo.toml @@ -2,11 +2,11 @@ name = "beacon-api-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/beacon-api/Cargo.toml b/lib/beacon-api/Cargo.toml index 48fd9ecaf81..f7f13b846ad 100644 --- a/lib/beacon-api/Cargo.toml +++ b/lib/beacon-api/Cargo.toml @@ -2,11 +2,11 @@ name = "beacon-api" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/berachain-light-client-types/Cargo.toml b/lib/berachain-light-client-types/Cargo.toml index e3ed3e2e544..2d30bdc6ef1 100644 --- a/lib/berachain-light-client-types/Cargo.toml +++ b/lib/berachain-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "berachain-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/chain-kitchen/Cargo.toml b/lib/chain-kitchen/Cargo.toml index ef758c2c7c4..8252228d664 100644 --- a/lib/chain-kitchen/Cargo.toml +++ b/lib/chain-kitchen/Cargo.toml @@ -2,11 +2,11 @@ name = "chain-kitchen" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cometbft-rpc/Cargo.toml b/lib/cometbft-rpc/Cargo.toml index ae54e08af1b..a9f4dcb51ce 100644 --- a/lib/cometbft-rpc/Cargo.toml +++ b/lib/cometbft-rpc/Cargo.toml @@ -2,11 +2,11 @@ name = "cometbft-rpc" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [package.metadata.crane] test-include = ["lib/cometbft-rpc/testdata"] diff --git a/lib/cometbft-rpc/src/lib.rs b/lib/cometbft-rpc/src/lib.rs index cfae26841b8..4a204a8d40e 100644 --- a/lib/cometbft-rpc/src/lib.rs +++ b/lib/cometbft-rpc/src/lib.rs @@ -6,6 +6,7 @@ use std::{ }; use ::serde::de::DeserializeOwned; +use cometbft_types::CometbftHeight; use jsonrpsee::{ core::{ client::{BatchResponse, ClientT}, @@ -17,18 +18,13 @@ use jsonrpsee::{ ws_client::{PingConfig, WsClientBuilder}, }; use tracing::{Instrument, debug, debug_span, instrument, trace}; -use unionlabs::{ - ErrorReporter, - bounded::{BoundedI64, BoundedU8}, - primitives::H256, - result_unwrap, -}; +use unionlabs::{ErrorReporter, bounded::BoundedU8, primitives::H256, result_unwrap}; use crate::rpc_types::{ AbciInfoResponse, AbciQueryResponse, AllValidatorsResponse, BlockResponse, BlockResultsResponse, BlockSearchResponse, BlockchainResponse, BroadcastTxSyncResponse, - CommitResponse, GrpcAbciQueryResponse, HeaderResponse, Order, StatusResponse, TxResponse, - TxSearchResponse, ValidatorsResponse, + CommitResponse, GenesisResponse, GrpcAbciQueryResponse, HeaderResponse, Order, StatusResponse, + TxResponse, TxSearchResponse, ValidatorsPagination, ValidatorsResponse, }; #[cfg(test)] @@ -86,7 +82,10 @@ impl Client { } // TODO: This should be bounded correctly - pub async fn commit(&self, height: Option) -> Result { + pub async fn commit( + &self, + height: Option, + ) -> Result { self.inner .request("commit", (height.map(|x| x.to_string()),)) .await @@ -94,7 +93,7 @@ impl Client { pub async fn header( &self, - height: Option>, + height: Option, ) -> Result { self.inner .request("header", (height.map(|x| x.to_string()),)) @@ -103,8 +102,8 @@ impl Client { pub async fn validators( &self, - height: Option, - pagination: Option, + height: Option, + pagination: Option, ) -> Result { self.inner .request( @@ -121,7 +120,7 @@ impl Client { /// Auto-paginated version of [`Self::validators`]. pub async fn all_validators( &self, - mut height: Option, + mut height: Option, ) -> Result { const PER_PAGE: BoundedU8<1, 100> = const { result_unwrap!(BoundedU8::<1, 100>::new_const(100)) }; @@ -193,7 +192,7 @@ impl Client { &self, path: impl AsRef, data: impl AsRef<[u8]>, - height: Option>, + height: Option, prove: bool, ) -> Result { trace!(data = %::serde_utils::to_hex(data.as_ref()), "data"); @@ -247,7 +246,7 @@ impl Client { &self, path: impl AsRef, data: &Q, - height: Option>, + height: Option, prove: bool, ) -> Result, JsonRpcError> { debug!("fetching grpc abci query"); @@ -280,7 +279,7 @@ impl Client { pub async fn block( &self, - height: Option>, + height: Option, ) -> Result { self.inner .request("block", (height.map(|x| x.to_string()),)) @@ -404,12 +403,18 @@ impl Client { pub async fn block_results( &self, - height: Option, + height: Option, ) -> Result { self.inner .request("block_results", rpc_params![height.map(|x| x.to_string())]) .await } + + pub async fn genesis( + &self, + ) -> Result, JsonRpcError> { + self.inner.request("genesis", rpc_params![]).await + } } #[derive(Debug, Clone)] diff --git a/lib/cometbft-rpc/src/rpc_types.rs b/lib/cometbft-rpc/src/rpc_types.rs index 8f9bffa631e..8c538ce022b 100644 --- a/lib/cometbft-rpc/src/rpc_types.rs +++ b/lib/cometbft-rpc/src/rpc_types.rs @@ -5,6 +5,7 @@ use std::{ }; use cometbft_types::{ + CometbftHeight, abci::{ event::Event, exec_tx_result::ExecTxResult, info_response::InfoResponse, query_response::QueryResponse, @@ -13,13 +14,13 @@ use cometbft_types::{ crypto::{proof_ops::ProofOps, public_key::PublicKey}, p2p::default_node_info::DefaultNodeInfo, types::{ - block::Block, block_id::BlockId, header::Header, signed_header::SignedHeader, - tx_proof::TxProof, validator::Validator, + block::Block, block_id::BlockId, consensus_params::ConsensusParams, header::Header, + signed_header::SignedHeader, tx_proof::TxProof, validator::Validator, }, }; use serde::{Deserialize, Serialize}; use unionlabs::{ - bounded::{BoundedI64, BoundedU8}, + bounded::BoundedU8, google::protobuf::timestamp::Timestamp, primitives::{ Bytes, H160, H256, @@ -126,8 +127,7 @@ pub struct ValidatorInfo { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] pub struct ValidatorsResponse { - #[serde(with = "::serde_utils::string")] - pub block_height: NonZeroU64, + pub block_height: CometbftHeight, pub validators: Vec, #[serde(with = "::serde_utils::string")] pub count: u64, @@ -135,9 +135,10 @@ pub struct ValidatorsResponse { pub total: u64, } -#[derive(Debug, Clone, PartialEq)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] pub struct AllValidatorsResponse { - pub block_height: NonZeroU64, + pub block_height: CometbftHeight, pub validators: Vec, } @@ -172,7 +173,7 @@ pub struct GrpcAbciQueryResponse { pub key: Option>, pub value: Option, pub proof_ops: Option, - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, pub codespace: String, } @@ -242,8 +243,7 @@ pub struct BlockSearchResponse { #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct BlockResultsResponse { - #[serde(with = "::serde_utils::string")] - pub height: u64, + pub height: CometbftHeight, pub txs_results: Option>, pub finalize_block_events: Option>, } @@ -257,3 +257,23 @@ pub struct BroadcastTxSyncResponse { pub log: String, pub hash: H256, } + +#[derive(macros::Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct GenesisResponse { + pub genesis: Genesis, +} + +#[derive(macros::Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct Genesis { + pub genesis_time: Timestamp, + pub chain_id: String, + pub initial_height: CometbftHeight, + pub consensus_params: ConsensusParams, + #[serde(rename = "$schema", default, skip_serializing_if = "Option::is_none")] + pub validators: Option>, + #[serde(with = "::cometbft_types::serde::maybe_empty_h256")] + pub app_hash: Option>, + pub app_state: AppState, +} diff --git a/lib/cometbft-rpc/src/tests.rs b/lib/cometbft-rpc/src/tests.rs index a332cf0ebe6..35feba302e3 100644 --- a/lib/cometbft-rpc/src/tests.rs +++ b/lib/cometbft-rpc/src/tests.rs @@ -40,7 +40,7 @@ mod validators { ensure_json( "testdata/validators/bartio-6760022.json", crate::rpc_types::ValidatorsResponse { - block_height: NonZeroU64::new(6760022).unwrap(), + block_height: CometbftHeight::new(6760022).unwrap(), validators: vec![ Validator { address: hex!("00c3b8dfaf3819df26bfa0917d6fac6b370c9896").into(), diff --git a/lib/cometbft-types/Cargo.toml b/lib/cometbft-types/Cargo.toml index 472b2dad645..0309aa02aea 100644 --- a/lib/cometbft-types/Cargo.toml +++ b/lib/cometbft-types/Cargo.toml @@ -2,11 +2,11 @@ name = "cometbft-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cometbft-types/src/abci/exec_tx_result.rs b/lib/cometbft-types/src/abci/exec_tx_result.rs index a468200d43a..3fe29428be4 100644 --- a/lib/cometbft-types/src/abci/exec_tx_result.rs +++ b/lib/cometbft-types/src/abci/exec_tx_result.rs @@ -4,7 +4,7 @@ use unionlabs::{ primitives::{Bytes, encoding::Base64}, }; -use crate::{abci::event::Event, code::Code}; +use crate::{CometbftHeight, abci::event::Event, code::Code}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct ExecTxResult { @@ -15,9 +15,9 @@ pub struct ExecTxResult { /// nondeterministic pub info: String, #[serde(with = "::serde_utils::string")] - pub gas_wanted: BoundedI64<0, { i64::MAX }>, - #[serde(with = "::serde_utils::string")] - pub gas_used: BoundedI64<0, { i64::MAX }>, + // dydx has a -1 value sometimes for some reason? + pub gas_wanted: BoundedI64<-1, { i64::MAX }>, + pub gas_used: CometbftHeight, /// nondeterministic pub events: Vec, pub codespace: String, diff --git a/lib/cometbft-types/src/abci/info_response.rs b/lib/cometbft-types/src/abci/info_response.rs index 9ffe9d3f580..888ea734c5e 100644 --- a/lib/cometbft-types/src/abci/info_response.rs +++ b/lib/cometbft-types/src/abci/info_response.rs @@ -1,8 +1,7 @@ use serde::{Deserialize, Serialize}; -use unionlabs::{ - bounded::BoundedI64, - primitives::{H256, encoding::Base64}, -}; +use unionlabs::primitives::{H256, encoding::Base64}; + +use crate::CometbftHeight; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] @@ -15,8 +14,7 @@ pub struct InfoResponse { skip_serializing_if = "is_zero" )] pub app_version: u64, - #[serde(with = "::serde_utils::string")] - pub last_block_height: BoundedI64<0, { i64::MAX }>, + pub last_block_height: CometbftHeight, pub last_block_app_hash: H256, } diff --git a/lib/cometbft-types/src/abci/query_response.rs b/lib/cometbft-types/src/abci/query_response.rs index a7b5c9b8b5a..31cf1b0f733 100644 --- a/lib/cometbft-types/src/abci/query_response.rs +++ b/lib/cometbft-types/src/abci/query_response.rs @@ -1,10 +1,7 @@ use serde::{Deserialize, Serialize}; -use unionlabs::{ - bounded::BoundedI64, - primitives::{Bytes, encoding::Base64}, -}; +use unionlabs::primitives::{Bytes, encoding::Base64}; -use crate::{code::Code, crypto::proof_ops::ProofOps}; +use crate::{CometbftHeight, code::Code, crypto::proof_ops::ProofOps}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] #[serde(deny_unknown_fields)] @@ -20,8 +17,7 @@ pub struct QueryResponse { pub value: Option>, #[serde(rename = "proofOps")] pub proof_ops: Option, - #[serde(with = "::serde_utils::string")] - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, pub codespace: String, } @@ -41,7 +37,7 @@ pub mod proto { key: value.key.unwrap_or_default().into_vec(), value: value.value.unwrap_or_default().into_vec(), proof_ops: value.proof_ops.map(Into::into), - height: value.height.inner(), + height: value.height.into(), codespace: value.codespace, } } diff --git a/lib/cometbft-types/src/lib.rs b/lib/cometbft-types/src/lib.rs index ca4e72af331..a57f27b02de 100644 --- a/lib/cometbft-types/src/lib.rs +++ b/lib/cometbft-types/src/lib.rs @@ -1,9 +1,100 @@ +use std::{fmt, ops::Add, str::FromStr}; + +use unionlabs::bounded::{BoundedI64, BoundedIntError, BoundedIntParseError}; + pub mod abci; pub mod crypto; pub mod p2p; pub mod types; pub mod version; +#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)] +#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))] +pub struct CometbftHeight(BoundedI64<0, { i64::MAX }>); + +impl Add for CometbftHeight { + type Output = Self; + + fn add(self, rhs: i64) -> Self::Output { + Self(self.0.add(&rhs)) + } +} + +impl CometbftHeight { + pub const fn inner(self) -> i64 { + self.0.inner() + } +} + +impl From for BoundedI64<0, { i64::MAX }> { + fn from(value: CometbftHeight) -> Self { + value.0 + } +} + +impl ::serde::Serialize for CometbftHeight { + fn serialize(&self, serializer: S) -> Result + where + S: ::serde::Serializer, + { + if serializer.is_human_readable() { + serializer.collect_str(self) + } else { + serializer.serialize_i64(self.0.inner()) + } + } +} + +impl<'de> ::serde::Deserialize<'de> for CometbftHeight { + fn deserialize(deserializer: D) -> Result + where + D: ::serde::Deserializer<'de>, + { + if deserializer.is_human_readable() { + String::deserialize(deserializer) + .and_then(|s| s.parse().map(Self).map_err(::serde::de::Error::custom)) + } else { + BoundedI64::deserialize(deserializer).map(Self) + } + } +} + +impl fmt::Display for CometbftHeight { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(&self.0, f) + } +} + +impl FromStr for CometbftHeight { + type Err = BoundedIntParseError; + + fn from_str(s: &str) -> Result { + s.parse().map(Self) + } +} + +impl TryFrom for CometbftHeight { + type Error = BoundedIntError; + + fn try_from(value: i64) -> Result { + value.try_into().map(Self) + } +} + +impl From for i64 { + fn from(value: CometbftHeight) -> i64 { + value.0.inner() + } +} + +impl TryFrom for CometbftHeight { + type Error = BoundedIntError; + + fn try_from(value: u64) -> Result { + BoundedI64::new(value).map(Self) + } +} + pub mod utils { use unionlabs::{ errors::{ExpectedLength, InvalidLength}, diff --git a/lib/cometbft-types/src/p2p/protocol_version.rs b/lib/cometbft-types/src/p2p/protocol_version.rs index 7e97ea81b25..9c82a28af75 100644 --- a/lib/cometbft-types/src/p2p/protocol_version.rs +++ b/lib/cometbft-types/src/p2p/protocol_version.rs @@ -6,10 +6,18 @@ pub struct ProtocolVersion { pub p2p: u64, #[serde(with = "::serde_utils::string")] pub block: u64, - #[serde(with = "::serde_utils::string")] + #[serde( + with = "::serde_utils::string", + default, + skip_serializing_if = "is_zero" + )] pub app: u64, } +const fn is_zero(n: &u64) -> bool { + *n == 0 +} + #[cfg(feature = "proto")] pub mod proto { use crate::p2p::protocol_version::ProtocolVersion; diff --git a/lib/cometbft-types/src/types.rs b/lib/cometbft-types/src/types.rs index 6023efb7691..a9d823dd920 100644 --- a/lib/cometbft-types/src/types.rs +++ b/lib/cometbft-types/src/types.rs @@ -1,15 +1,20 @@ +pub mod abci_params; pub mod block; pub mod block_id; pub mod block_id_flag; +pub mod block_params; pub mod canonical_block_id; pub mod canonical_part_set_header; pub mod canonical_vote; pub mod commit; pub mod commit_sig; +pub mod consensus_params; pub mod data; pub mod duplicate_vote_evidence; pub mod evidence; pub mod evidence_list; +pub mod evidence_params; +pub mod feature_params; pub mod header; pub mod light_block; pub mod light_client_attack_evidence; @@ -17,7 +22,10 @@ pub mod part_set_header; pub mod signed_header; pub mod signed_msg_type; pub mod simple_validator; +pub mod synchrony_params; pub mod tx_proof; pub mod validator; +pub mod validator_params; pub mod validator_set; +pub mod version_params; pub mod vote; diff --git a/lib/cometbft-types/src/types/abci_params.rs b/lib/cometbft-types/src/types/abci_params.rs new file mode 100644 index 00000000000..7bf7cbaf14c --- /dev/null +++ b/lib/cometbft-types/src/types/abci_params.rs @@ -0,0 +1,14 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct AbciParams { + /// vote_extensions_enable_height has been deprecated. + /// Instead, use FeatureParams.vote_extensions_enable_height. + #[serde(with = "::serde_utils::string")] + pub vote_extensions_enable_height: i64, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/block_params.rs b/lib/cometbft-types/src/types/block_params.rs new file mode 100644 index 00000000000..050d53b9ba0 --- /dev/null +++ b/lib/cometbft-types/src/types/block_params.rs @@ -0,0 +1,26 @@ +use serde::{Deserialize, Serialize}; +use unionlabs::bounded::BoundedI64; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct BlockParams { + /// Maximum size of a block, in bytes. + /// + /// Must be greater or equal to -1 and cannot be greater than the hard-coded + /// maximum block size, which is 100MB. + /// + /// If set to -1, the limit is the hard-coded maximum block size. + /// + /// SEE: + #[serde(with = "::serde_utils::string")] + pub max_bytes: BoundedI64<-1, 104857600>, + /// Maximum gas wanted by transactions included in a block. + /// + /// Must be greater or equal to -1. If set to -1, no limit is enforced. + #[serde(with = "::serde_utils::string")] + pub max_gas: BoundedI64<-1>, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/canonical_vote.rs b/lib/cometbft-types/src/types/canonical_vote.rs index 2e0b4263d1c..585c5e8d3f9 100644 --- a/lib/cometbft-types/src/types/canonical_vote.rs +++ b/lib/cometbft-types/src/types/canonical_vote.rs @@ -1,14 +1,17 @@ use serde::{Deserialize, Serialize}; use unionlabs::{bounded::BoundedI64, google::protobuf::timestamp::Timestamp}; -use crate::types::{canonical_block_id::CanonicalBlockId, signed_msg_type::SignedMsgType}; +use crate::{ + CometbftHeight, + types::{canonical_block_id::CanonicalBlockId, signed_msg_type::SignedMsgType}, +}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct CanonicalVote { /// type alias for byte pub ty: SignedMsgType, /// canonicalization requires fixed size encoding here - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, /// canonicalization requires fixed size encoding here pub round: BoundedI64<0, { i64::MAX }>, pub block_id: CanonicalBlockId, diff --git a/lib/cometbft-types/src/types/commit.rs b/lib/cometbft-types/src/types/commit.rs index 0e7fd9ad7df..15424e8aba7 100644 --- a/lib/cometbft-types/src/types/commit.rs +++ b/lib/cometbft-types/src/types/commit.rs @@ -1,16 +1,19 @@ use serde::{Deserialize, Serialize}; -use unionlabs::bounded::{BoundedI32, BoundedI64}; +use unionlabs::bounded::BoundedI32; -use crate::types::{block_id::BlockId, commit_sig::CommitSig}; +use crate::{ + CometbftHeight, + types::{block_id::BlockId, commit_sig::CommitSigRaw}, +}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))] pub struct Commit { #[serde(with = "::serde_utils::string")] - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, pub round: BoundedI32<0, { i32::MAX }>, pub block_id: BlockId, - pub signatures: Vec, + pub signatures: Vec, } #[cfg(feature = "proto")] @@ -57,7 +60,10 @@ pub mod proto { signatures: value .signatures .into_iter() - .map(TryInto::try_into) + .map(|s| { + TryInto::::try_into(s) + .map(Into::::into) + }) .collect::, _>>() .map_err(Error::Signatures)?, }) @@ -88,7 +94,10 @@ pub mod proto { signatures: value .signatures .into_iter() - .map(TryInto::try_into) + .map(|s| { + TryInto::::try_into(s) + .map(Into::::into) + }) .collect::, _>>() .map_err(Error::Signatures)?, }) diff --git a/lib/cometbft-types/src/types/commit_sig.rs b/lib/cometbft-types/src/types/commit_sig.rs index bbadbd25dbe..e5b6f7aca48 100644 --- a/lib/cometbft-types/src/types/commit_sig.rs +++ b/lib/cometbft-types/src/types/commit_sig.rs @@ -27,24 +27,101 @@ pub enum CommitSig { }, } -#[derive(Debug, Serialize, Deserialize)] +/// Raw CommitSig struct, able to represent all possible CometBFT-compatible commit sigs. +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +#[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))] pub struct CommitSigRaw { pub block_id_flag: i32, - pub validator_address: Bytes, + #[serde(with = "commit_sig_validator_address")] + pub validator_address: Option>, #[serde( default, - with = "::serde_utils::parse_from_rfc3339_string_but_0001_01_01T00_00_00Z_is_none" + with = "parse_from_rfc3339_string_but_0001_01_01T00_00_00Z_is_none" )] pub timestamp: Option, pub signature: Option>, } +// This is used for the very strange representation of nil protobuf timestamps in cometbft json responses +#[allow(non_snake_case)] +pub mod parse_from_rfc3339_string_but_0001_01_01T00_00_00Z_is_none { + use std::{format, string::String}; + + use serde::{Deserializer, Serializer, de::Deserialize}; + use unionlabs::google::protobuf::timestamp::Timestamp; + + pub fn serialize(data: &Option, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_str(&data.unwrap_or_else(|| { + "0001-01-01T00:00:00Z" + .parse::() + .expect("valid date time; qed;") + })) + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + >::deserialize(deserializer).and_then(|s| match s { + Some(s) => { + if s == "0001-01-01T00:00:00Z" { + Ok(None) + } else { + let datetime = s.parse::().map_err(|err| { + serde::de::Error::custom(format!("unable to parse data: {err:?}")) + })?; + + Ok(Some(Timestamp::try_from(datetime).map_err(|err| { + serde::de::Error::custom(format!( + "unable to convert data from rfc3339 datetime: {err:?}" + )) + })?)) + } + } + None => Ok(None), + }) + } +} + +mod commit_sig_validator_address { + use serde::{Deserialize, Deserializer, Serializer, de}; + use unionlabs::primitives::{H160, encoding::HexUnprefixed}; + + pub fn serialize( + data: &Option>, + serializer: S, + ) -> Result + where + S: Serializer, + { + match data { + Some(validator_address) => serializer.collect_str(validator_address), + None => serializer.serialize_str(""), + } + } + + pub fn deserialize<'de, D>(deserializer: D) -> Result>, D::Error> + where + D: Deserializer<'de>, + { + let s = String::deserialize(deserializer)?; + if s.is_empty() { + Ok(None) + } else { + s.parse().map_err(de::Error::custom).map(Some) + } + } +} + impl From for CommitSigRaw { fn from(value: CommitSig) -> Self { match value { CommitSig::Absent => Self { block_id_flag: BlockIdFlag::Absent.into(), - validator_address: Bytes::new(&[]), + validator_address: None, timestamp: None, signature: None, }, @@ -54,7 +131,7 @@ impl From for CommitSigRaw { signature, } => Self { block_id_flag: BlockIdFlag::Commit.into(), - validator_address: validator_address.into_bytes().into_encoding(), + validator_address: Some(validator_address.into_encoding()), timestamp: Some(timestamp), signature: Some(signature.into_encoding()), }, @@ -64,7 +141,7 @@ impl From for CommitSigRaw { signature, } => Self { block_id_flag: BlockIdFlag::Nil.into(), - validator_address: validator_address.into_bytes().into_encoding(), + validator_address: Some(validator_address.into_encoding()), timestamp: Some(timestamp), signature: Some(signature.into_encoding()), }, @@ -72,32 +149,6 @@ impl From for CommitSigRaw { } } -#[derive(Debug, Clone, PartialEq, thiserror::Error)] -pub enum Error { - #[error("invalid validator_address")] - ValidatorAddress(#[from] FixedBytesError), - #[error("invalid block_id_flag")] - BlockIdFlag(#[from] UnknownEnumVariant), - #[error("invalid timestamp")] - Timestamp(#[from] TryFromTimestampError), - #[error("block id flag was `Unknown`")] - UnknownBlockIdFlag, - #[error("an absent commit sig had an address")] - AbsentWithValidatorAddress, - #[error("an absent commit sig had a timestamp")] - AbsentWithTimestamp, - #[error("an absent commit sig had a signature")] - AbsentWithSignature, - #[error("a commit commit sig requires timestamp to be set")] - CommitMissingTimestamp, - #[error("a commit commit sig requires signature to be set")] - CommitMissingSignature, - #[error("a nil commit sig requires timestamp to be set")] - NilMissingTimestamp, - #[error("a nil commit sig requires signature to be set")] - NilMissingSignature, -} - impl TryFrom for CommitSig { type Error = Error; @@ -107,7 +158,7 @@ impl TryFrom for CommitSig { match block_id_flag { BlockIdFlag::Unknown => Err(Error::UnknownBlockIdFlag), BlockIdFlag::Absent => { - if !value.validator_address.is_empty() { + if value.validator_address.is_some() { Err(Error::AbsentWithValidatorAddress) } else if value.timestamp.is_some_and(|ts| ts != Timestamp::default()) { Err(Error::AbsentWithTimestamp) @@ -118,7 +169,10 @@ impl TryFrom for CommitSig { } } BlockIdFlag::Commit => Ok(Self::Commit { - validator_address: value.validator_address.try_into()?, + validator_address: value + .validator_address + .ok_or(Error::CommitMissingValidatorAddress)? + .into_encoding(), timestamp: value.timestamp.ok_or(Error::CommitMissingTimestamp)?, signature: value .signature @@ -126,7 +180,10 @@ impl TryFrom for CommitSig { .into_encoding(), }), BlockIdFlag::Nil => Ok(Self::Nil { - validator_address: value.validator_address.try_into()?, + validator_address: value + .validator_address + .ok_or(Error::NilMissingValidatorAddress)? + .into_encoding(), timestamp: value.timestamp.ok_or(Error::NilMissingTimestamp)?, signature: value .signature @@ -137,6 +194,40 @@ impl TryFrom for CommitSig { } } +#[derive(Debug, Clone, PartialEq, thiserror::Error)] +pub enum Error { + #[error("invalid validator_address")] + ValidatorAddress(#[from] FixedBytesError), + #[error("invalid block_id_flag")] + BlockIdFlag(#[from] UnknownEnumVariant), + #[error("invalid timestamp")] + Timestamp(#[from] TryFromTimestampError), + + #[error("block id flag was `Unknown`")] + UnknownBlockIdFlag, + + #[error("an absent commit sig had an address")] + AbsentWithValidatorAddress, + #[error("an absent/agg absent commit sig had a timestamp")] + AbsentWithTimestamp, + #[error("an absent/agg absent/agg nill absent commit sig had a signature")] + AbsentWithSignature, + + #[error("a commit commit sig requires validator address to be set")] + CommitMissingValidatorAddress, + #[error("a commit commit sig requires timestamp to be set")] + CommitMissingTimestamp, + #[error("a commit commit sig requires signature to be set")] + CommitMissingSignature, + + #[error("a nill commit sig requires validator address to be set")] + NilMissingValidatorAddress, + #[error("a nil commit sig requires timestamp to be set")] + NilMissingTimestamp, + #[error("a nil commit sig requires signature to be set")] + NilMissingSignature, +} + #[cfg(feature = "proto")] pub mod proto { use crate::types::{ @@ -146,6 +237,19 @@ pub mod proto { // COMETBFT <-> CANONICAL + impl From for protos::cometbft::types::v1::CommitSig { + fn from(value: CommitSigRaw) -> Self { + Self { + block_id_flag: value.block_id_flag, + validator_address: value + .validator_address + .map_or_else(Vec::new, |validator_address| validator_address.into()), + timestamp: value.timestamp.map(Into::into), + signature: value.signature.unwrap_or_default().into(), + } + } + } + impl From for protos::cometbft::types::v1::CommitSig { fn from(value: CommitSig) -> Self { match value { @@ -185,7 +289,11 @@ pub mod proto { fn try_from(value: protos::cometbft::types::v1::CommitSig) -> Result { CommitSigRaw { block_id_flag: value.block_id_flag, - validator_address: value.validator_address.into(), + validator_address: if value.validator_address.is_empty() { + None + } else { + Some(value.validator_address.try_into()?) + }, timestamp: value.timestamp.map(TryInto::try_into).transpose()?, signature: Some(value.signature.into()), } @@ -195,6 +303,19 @@ pub mod proto { // TENDERMINT <-> CANONICAL + impl From for protos::tendermint::types::CommitSig { + fn from(value: CommitSigRaw) -> Self { + Self { + block_id_flag: value.block_id_flag, + validator_address: value + .validator_address + .map_or_else(Vec::new, |validator_address| validator_address.into()), + timestamp: value.timestamp.map(Into::into), + signature: value.signature.unwrap_or_default().into(), + } + } + } + impl From for protos::tendermint::types::CommitSig { fn from(value: CommitSig) -> Self { match value { @@ -234,7 +355,11 @@ pub mod proto { fn try_from(value: protos::tendermint::types::CommitSig) -> Result { CommitSigRaw { block_id_flag: value.block_id_flag, - validator_address: value.validator_address.into(), + validator_address: if value.validator_address.is_empty() { + None + } else { + Some(value.validator_address.try_into()?) + }, timestamp: value.timestamp.map(TryInto::try_into).transpose()?, signature: Some(value.signature.into()), } diff --git a/lib/cometbft-types/src/types/consensus_params.rs b/lib/cometbft-types/src/types/consensus_params.rs new file mode 100644 index 00000000000..ef9abeb3229 --- /dev/null +++ b/lib/cometbft-types/src/types/consensus_params.rs @@ -0,0 +1,27 @@ +use serde::{Deserialize, Serialize}; + +use crate::types::{ + abci_params::AbciParams, block_params::BlockParams, evidence_params::EvidenceParams, + feature_params::FeatureParams, synchrony_params::SynchronyParams, + validator_params::ValidatorParams, version_params::VersionParams, +}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct ConsensusParams { + pub block: BlockParams, + pub evidence: EvidenceParams, + pub validator: ValidatorParams, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub version: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub abci: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub synchrony: Option, + #[serde(default, skip_serializing_if = "Option::is_none")] + pub feature: Option, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/evidence_params.rs b/lib/cometbft-types/src/types/evidence_params.rs new file mode 100644 index 00000000000..3f2a9d34be8 --- /dev/null +++ b/lib/cometbft-types/src/types/evidence_params.rs @@ -0,0 +1,31 @@ +use serde::{Deserialize, Serialize}; + +/// EvidenceParams determine the validity of evidences of Byzantine behavior. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct EvidenceParams { + /// Maximum age of evidence, in blocks. + /// + /// The recommended formula for calculating it is max_age_duration / {average + /// block time}. + // REVIEW: Bounded? + #[serde(with = "::serde_utils::string")] + pub max_age_num_blocks: i64, + /// Maximum age of evidence, in time. + /// + /// The recommended value of is should correspond to the application's + /// "unbonding period" or other similar mechanism for handling + /// Nothing-At-Stake attacks. + /// See: + #[serde(with = "::serde_utils::string")] + pub max_age_duration: i64, + /// Maximum size in bytes of evidence allowed to be included in a block. + /// + /// It should fall comfortably under the maximum size of a block. + // REVIEW: Bounded? + #[serde(with = "::serde_utils::string")] + pub max_bytes: i64, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/feature_params.rs b/lib/cometbft-types/src/types/feature_params.rs new file mode 100644 index 00000000000..5f9669d05bf --- /dev/null +++ b/lib/cometbft-types/src/types/feature_params.rs @@ -0,0 +1,57 @@ +use serde::{Deserialize, Serialize}; +use unionlabs::bounded::BoundedI64; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct FeatureParams { + /// Height during which vote extensions will be enabled. + /// + /// A value of 0 means vote extensions are disabled. A value > 0 denotes + /// the height at which vote extensions will be (or have been) enabled. + /// + /// During the specified height, and for all subsequent heights, precommit + /// messages that do not contain valid extension data will be considered + /// invalid. Prior to this height, or when this height is set to 0, vote + /// extensions will not be used or accepted by validators on the network. + /// + /// Once enabled, vote extensions will be created by the application in + /// ExtendVote, validated by the application in VerifyVoteExtension, and + /// used by the application in PrepareProposal, when proposing the next block. + /// + /// Cannot be set to heights lower or equal to the current blockchain height. + #[serde( + with = "::serde_utils::string_opt", + default, + skip_serializing_if = "Option::is_none" + )] + pub vote_extensions_enable_height: Option>, + + /// Height at which Proposer-Based Timestamps (PBTS) will be enabled. + /// + /// A value of 0 means PBTS is disabled. A value > 0 denotes the height at + /// which PBTS will be (or has been) enabled. + /// + /// From the specified height, and for all subsequent heights, the PBTS + /// algorithm will be used to produce and validate block timestamps. Prior to + /// this height, or when this height is set to 0, the legacy BFT Time + /// algorithm is used to produce and validate timestamps. + /// + /// Cannot be set to heights lower or equal to the current blockchain height. + #[serde( + with = "::serde_utils::string_opt", + default, + skip_serializing_if = "Option::is_none" + )] + pub pbts_enable_height: Option>, + + #[serde( + with = "::serde_utils::string_opt", + default, + skip_serializing_if = "Option::is_none" + )] + pub sbt_enable_height: Option>, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/header.rs b/lib/cometbft-types/src/types/header.rs index 46f484d1cee..d33234cf7f5 100644 --- a/lib/cometbft-types/src/types/header.rs +++ b/lib/cometbft-types/src/types/header.rs @@ -1,11 +1,10 @@ use serde::{Deserialize, Serialize}; use unionlabs::{ - bounded::BoundedI64, google::protobuf::timestamp::Timestamp, primitives::{H160, H256, encoding::HexUnprefixed}, }; -use crate::{types::block_id::BlockId, version::consensus::Consensus}; +use crate::{CometbftHeight, types::block_id::BlockId, version::consensus::Consensus}; #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "bincode", derive(bincode::Encode, bincode::Decode))] @@ -13,8 +12,7 @@ pub struct Header { /// basic block info pub version: Consensus, pub chain_id: String, - #[serde(with = "::serde_utils::string")] - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, pub time: Timestamp, /// prev block info pub last_block_id: BlockId, diff --git a/lib/cometbft-types/src/types/light_client_attack_evidence.rs b/lib/cometbft-types/src/types/light_client_attack_evidence.rs index 07cde0590b9..d6aab014929 100644 --- a/lib/cometbft-types/src/types/light_client_attack_evidence.rs +++ b/lib/cometbft-types/src/types/light_client_attack_evidence.rs @@ -1,13 +1,16 @@ use serde::{Deserialize, Serialize}; -use unionlabs::{bounded::BoundedI64, google::protobuf::timestamp::Timestamp}; +use unionlabs::google::protobuf::timestamp::Timestamp; -use crate::types::{light_block::LightBlock, validator::Validator}; +use crate::{ + CometbftHeight, + types::{light_block::LightBlock, validator::Validator}, +}; // TODO: Figure out serde for this type, I'm pretty sure this isn't quite correct #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct LightClientAttackEvidence { pub conflicting_block: LightBlock, - pub common_height: BoundedI64<1, { i64::MAX }>, + pub common_height: CometbftHeight, pub byzantine_validators: Vec, pub total_voting_power: i64, pub timestamp: Timestamp, diff --git a/lib/cometbft-types/src/types/synchrony_params.rs b/lib/cometbft-types/src/types/synchrony_params.rs new file mode 100644 index 00000000000..2b15f1ac1fa --- /dev/null +++ b/lib/cometbft-types/src/types/synchrony_params.rs @@ -0,0 +1,24 @@ +use serde::{Deserialize, Serialize}; + +/// SynchronyParams determine the validity of block timestamps. +/// +/// These parameters are part of the Proposer-Based Timestamps (PBTS) algorithm. +/// For more information on the relationship of the synchrony parameters to +/// block timestamps validity, refer to the PBTS specification: +/// +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct SynchronyParams { + /// Bound for how skewed a proposer's clock may be from any validator on the + /// network while still producing valid proposals. + #[serde(with = "::serde_utils::string")] + pub precision: i64, + /// Bound for how long a proposal message may take to reach all validators on + /// a network and still be considered valid. + #[serde(with = "::serde_utils::string")] + pub message_delay: i64, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/validator_params.rs b/lib/cometbft-types/src/types/validator_params.rs new file mode 100644 index 00000000000..3153035b709 --- /dev/null +++ b/lib/cometbft-types/src/types/validator_params.rs @@ -0,0 +1,11 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct ValidatorParams { + pub pub_key_types: Vec, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/version_params.rs b/lib/cometbft-types/src/types/version_params.rs new file mode 100644 index 00000000000..bcfd893edf4 --- /dev/null +++ b/lib/cometbft-types/src/types/version_params.rs @@ -0,0 +1,15 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[serde(deny_unknown_fields)] +pub struct VersionParams { + /// The ABCI application version. + /// + /// It was named app_version in CometBFT 0.34. + #[serde(with = "::serde_utils::string")] + pub app: u64, +} + +// TODO: Implement proto +// #[cfg(feature = "proto")] +// pub mod proto {} diff --git a/lib/cometbft-types/src/types/vote.rs b/lib/cometbft-types/src/types/vote.rs index e55950381ea..2df23f31b49 100644 --- a/lib/cometbft-types/src/types/vote.rs +++ b/lib/cometbft-types/src/types/vote.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; use unionlabs::{ - bounded::{BoundedI32, BoundedI64}, + bounded::BoundedI32, google::protobuf::timestamp::Timestamp, primitives::{ Bytes, H160, @@ -8,14 +8,16 @@ use unionlabs::{ }, }; -use crate::types::{block_id::BlockId, signed_msg_type::SignedMsgType}; +use crate::{ + CometbftHeight, + types::{block_id::BlockId, signed_msg_type::SignedMsgType}, +}; #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] pub struct Vote { #[serde(rename = "type")] pub ty: SignedMsgType, - #[serde(with = "::serde_utils::string")] - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, pub round: BoundedI32<0, { i32::MAX }>, pub block_id: BlockId, pub timestamp: Timestamp, @@ -42,7 +44,7 @@ pub mod proto { fn from(value: Vote) -> Self { Self { r#type: value.ty.into(), - height: value.height.inner(), + height: value.height.into(), round: value.round.inner(), block_id: Some(value.block_id.into()), timestamp: Some(value.timestamp.into()), diff --git a/lib/cometbft-types/src/version/consensus.rs b/lib/cometbft-types/src/version/consensus.rs index 65b5e43aca0..7119fcbb41e 100644 --- a/lib/cometbft-types/src/version/consensus.rs +++ b/lib/cometbft-types/src/version/consensus.rs @@ -5,11 +5,18 @@ use serde::{Deserialize, Serialize}; pub struct Consensus { #[serde(with = "::serde_utils::string")] pub block: u64, - // REVIEW: Why default? - #[serde(with = "::serde_utils::string", default)] + #[serde( + with = "::serde_utils::string", + default, + skip_serializing_if = "is_zero" + )] pub app: u64, } +const fn is_zero(n: &u64) -> bool { + *n == 0 +} + #[cfg(feature = "proto")] pub mod proto { use crate::version::consensus::Consensus; diff --git a/lib/cometbls-groth16-verifier/Cargo.toml b/lib/cometbls-groth16-verifier/Cargo.toml index dd16b085380..d7d27a69729 100644 --- a/lib/cometbls-groth16-verifier/Cargo.toml +++ b/lib/cometbls-groth16-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "cometbls-groth16-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cometbls-light-client-types/Cargo.toml b/lib/cometbls-light-client-types/Cargo.toml index 7f1da7b24c5..7c7bbf19c37 100644 --- a/lib/cometbls-light-client-types/Cargo.toml +++ b/lib/cometbls-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "cometbls-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/concurrent-keyring/Cargo.toml b/lib/concurrent-keyring/Cargo.toml index 59e8adbfb02..a4fd63ca481 100644 --- a/lib/concurrent-keyring/Cargo.toml +++ b/lib/concurrent-keyring/Cargo.toml @@ -2,11 +2,11 @@ name = "concurrent-keyring" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/consensus-primitives/Cargo.toml b/lib/consensus-primitives/Cargo.toml index fb2eb731fa5..e40010974d7 100644 --- a/lib/consensus-primitives/Cargo.toml +++ b/lib/consensus-primitives/Cargo.toml @@ -2,11 +2,11 @@ name = "consensus-primitives" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cosmos-client/Cargo.toml b/lib/cosmos-client/Cargo.toml index a9f3ae7ccc1..ff89956f9d8 100644 --- a/lib/cosmos-client/Cargo.toml +++ b/lib/cosmos-client/Cargo.toml @@ -2,11 +2,11 @@ name = "cosmos-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cosmos-client/src/lib.rs b/lib/cosmos-client/src/lib.rs index b086fe6e99b..0e6abac2af8 100644 --- a/lib/cosmos-client/src/lib.rs +++ b/lib/cosmos-client/src/lib.rs @@ -224,7 +224,7 @@ impl TxClient { } Err(err) => { debug!(err = %ErrorReporter(err), "unable to retrieve tx inclusion, trying again"); - target_height = reached_height.add(&1); + target_height = reached_height + 1; i += 1; continue; } diff --git a/lib/cosmos-sdk-event/Cargo.toml b/lib/cosmos-sdk-event/Cargo.toml index 24c5e5f9b0f..769ffa28f7c 100644 --- a/lib/cosmos-sdk-event/Cargo.toml +++ b/lib/cosmos-sdk-event/Cargo.toml @@ -2,11 +2,11 @@ name = "cosmos-sdk-event" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cosmos-signer/Cargo.toml b/lib/cosmos-signer/Cargo.toml index 9bad28babc7..1e4578961a6 100644 --- a/lib/cosmos-signer/Cargo.toml +++ b/lib/cosmos-signer/Cargo.toml @@ -2,11 +2,11 @@ name = "cosmos-signer" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [dependencies] bip32 = { workspace = true, features = ["secp256k1"] } diff --git a/lib/cosmwasm-event/Cargo.toml b/lib/cosmwasm-event/Cargo.toml index 6b755298f25..3e3f21ed24d 100644 --- a/lib/cosmwasm-event/Cargo.toml +++ b/lib/cosmwasm-event/Cargo.toml @@ -2,11 +2,11 @@ name = "cosmwasm-event" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/create3/Cargo.toml b/lib/create3/Cargo.toml index bb5813ec13b..e6232f5ec01 100644 --- a/lib/create3/Cargo.toml +++ b/lib/create3/Cargo.toml @@ -2,11 +2,11 @@ name = "create3" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/cw20-ctx/Cargo.toml b/lib/cw20-ctx/Cargo.toml index a5779d53448..2534e1bff66 100644 --- a/lib/cw20-ctx/Cargo.toml +++ b/lib/cw20-ctx/Cargo.toml @@ -2,11 +2,11 @@ name = "cw20-ctx" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/lib/deployments/Cargo.toml b/lib/deployments/Cargo.toml index 2dac0044162..b3ca0b68efe 100644 --- a/lib/deployments/Cargo.toml +++ b/lib/deployments/Cargo.toml @@ -2,11 +2,11 @@ name = "deployments" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/depolama/Cargo.toml b/lib/depolama/Cargo.toml index 0d48a74727e..c78aa259045 100644 --- a/lib/depolama/Cargo.toml +++ b/lib/depolama/Cargo.toml @@ -2,11 +2,11 @@ name = "depolama" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/embed-commit/Cargo.toml b/lib/embed-commit/Cargo.toml index c0d6414f197..a9e74d87280 100644 --- a/lib/embed-commit/Cargo.toml +++ b/lib/embed-commit/Cargo.toml @@ -2,11 +2,11 @@ name = "embed-commit" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ethereum-light-client-types/Cargo.toml b/lib/ethereum-light-client-types/Cargo.toml index 933864e51bf..8daad787f68 100644 --- a/lib/ethereum-light-client-types/Cargo.toml +++ b/lib/ethereum-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "ethereum-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ethereum-sync-protocol-types/Cargo.toml b/lib/ethereum-sync-protocol-types/Cargo.toml index 5bed5969769..3173f5add49 100644 --- a/lib/ethereum-sync-protocol-types/Cargo.toml +++ b/lib/ethereum-sync-protocol-types/Cargo.toml @@ -2,11 +2,11 @@ name = "ethereum-sync-protocol-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ethereum-sync-protocol/Cargo.toml b/lib/ethereum-sync-protocol/Cargo.toml index 0d2e0bfe73d..95d4979ec76 100644 --- a/lib/ethereum-sync-protocol/Cargo.toml +++ b/lib/ethereum-sync-protocol/Cargo.toml @@ -2,11 +2,11 @@ name = "ethereum-sync-protocol" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ethermint-light-client-types/Cargo.toml b/lib/ethermint-light-client-types/Cargo.toml index e42ea957eed..4b0914fdd06 100644 --- a/lib/ethermint-light-client-types/Cargo.toml +++ b/lib/ethermint-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "ethermint-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/evm-storage-verifier/Cargo.toml b/lib/evm-storage-verifier/Cargo.toml index ededdc908af..7be01edd458 100644 --- a/lib/evm-storage-verifier/Cargo.toml +++ b/lib/evm-storage-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "evm-storage-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/fork-schedules/Cargo.toml b/lib/fork-schedules/Cargo.toml index 1b17d457cfc..56610833b18 100644 --- a/lib/fork-schedules/Cargo.toml +++ b/lib/fork-schedules/Cargo.toml @@ -2,11 +2,11 @@ name = "fork-schedules" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/frissitheto/Cargo.toml b/lib/frissitheto/Cargo.toml index 0f0e4ee6abf..7bf74dff99e 100644 --- a/lib/frissitheto/Cargo.toml +++ b/lib/frissitheto/Cargo.toml @@ -4,11 +4,11 @@ name = "frissitheto" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lib] crate-type = ["cdylib", "rlib"] diff --git a/lib/galois-rpc/Cargo.toml b/lib/galois-rpc/Cargo.toml index 86d8a57ac31..662aad06fc9 100644 --- a/lib/galois-rpc/Cargo.toml +++ b/lib/galois-rpc/Cargo.toml @@ -2,11 +2,11 @@ name = "galois-rpc" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/galois-rpc/src/canonical_vote.rs b/lib/galois-rpc/src/canonical_vote.rs index 76a3feabb40..27c2bdc755b 100644 --- a/lib/galois-rpc/src/canonical_vote.rs +++ b/lib/galois-rpc/src/canonical_vote.rs @@ -1,4 +1,7 @@ -use cometbft_types::types::{canonical_block_id::CanonicalBlockId, signed_msg_type::SignedMsgType}; +use cometbft_types::{ + CometbftHeight, + types::{canonical_block_id::CanonicalBlockId, signed_msg_type::SignedMsgType}, +}; use serde::{Deserialize, Serialize}; use unionlabs::bounded::BoundedI64; @@ -7,7 +10,7 @@ pub struct CanonicalVote { /// type alias for byte pub ty: SignedMsgType, /// canonicalization requires fixed size encoding here - pub height: BoundedI64<0, { i64::MAX }>, + pub height: CometbftHeight, /// canonicalization requires fixed size encoding here pub round: BoundedI64<0, { i64::MAX }>, pub block_id: CanonicalBlockId, diff --git a/lib/gnark-key-parser/Cargo.toml b/lib/gnark-key-parser/Cargo.toml index 6e29b2b771c..7d38fd70a3c 100644 --- a/lib/gnark-key-parser/Cargo.toml +++ b/lib/gnark-key-parser/Cargo.toml @@ -2,11 +2,11 @@ name = "gnark-key-parser" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/gnark-mimc/Cargo.toml b/lib/gnark-mimc/Cargo.toml index f9ec171f5bb..0049f4823f2 100644 --- a/lib/gnark-mimc/Cargo.toml +++ b/lib/gnark-mimc/Cargo.toml @@ -2,11 +2,11 @@ name = "gnark-mimc" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ibc-classic-spec/Cargo.toml b/lib/ibc-classic-spec/Cargo.toml index 0346d08525f..12cec60658f 100644 --- a/lib/ibc-classic-spec/Cargo.toml +++ b/lib/ibc-classic-spec/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-classic-spec" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ibc-solidity/Cargo.toml b/lib/ibc-solidity/Cargo.toml index ef8562606f6..1b96286b7cc 100644 --- a/lib/ibc-solidity/Cargo.toml +++ b/lib/ibc-solidity/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-solidity" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ibc-union-spec/Cargo.toml b/lib/ibc-union-spec/Cargo.toml index a86a8e667d9..b3eefca45e2 100644 --- a/lib/ibc-union-spec/Cargo.toml +++ b/lib/ibc-union-spec/Cargo.toml @@ -2,11 +2,11 @@ name = "ibc-union-spec" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ibc-union-spec/src/types/packet.rs b/lib/ibc-union-spec/src/types/packet.rs index 67b156479fd..418816ffa77 100644 --- a/lib/ibc-union-spec/src/types/packet.rs +++ b/lib/ibc-union-spec/src/types/packet.rs @@ -337,6 +337,7 @@ pub mod ethabi { #[cfg(test)] mod tests { + use alloy_sol_types::SolType; use unionlabs::primitives::H256; use super::*; @@ -358,4 +359,35 @@ mod tests { .unwrap() ); } + + #[test] + fn smoke() { + let packet = Packet { + source_channel_id: ChannelId::new(3.try_into().unwrap()), + destination_channel_id: ChannelId::new(4.try_into().unwrap()), + data: "0xaf68ea97ce967fdc8ad331fd2481fbf7f5b3286bfab1c5e13a1b8151aa1fcd590000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000014fb180000000000000000000000000000000000000000000000000000000000000022000000000000000000000000000000000000000000000000000000000014fb18000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000002b6f736d6f316c6e6b79746671636a776c6c77733633677666306d76397974303461737779346c7a6a6771640000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014c4c68628a4259eb4779b5330bc5f8762289fe37900000000000000000000000000000000000000000000000000000000000000000000000000000000000000446962632f42433236413741383035454344363832323731393437324243423738343241343845463039444632303631383246384632353942323539334542354432334642000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014a1a1d0b9182339e86e80db519218ea03ec09a1a100000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000014a1a1d0b9182339e86e80db519218ea03ec09a1a10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000".parse().unwrap(), + timeout_height: MustBeZero, + timeout_timestamp: Timestamp::from_nanos(1770987413320000000), + }; + + assert_eq!( + packet.hash(), + "0x4e5e01a7fc0cd0038dba45d5590c4ed757842cc9c84516c1514a460645ea416a" + .parse::() + .unwrap() + ); + } + + #[test] + fn decode() { + use alloy_sol_types::SolValue; + + let bz = hex_literal::hex!( + "0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000018940c7ffa1c8300000000000000000000000000000000000000000000000000000000000000040084958e65227f5a4eb032dfdd430dfdeab6944a4bbe7fdd6d4088a39005d0416b0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000003200000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000002b6f736d6f31396c6e7063733070767a39687463766d35386a6b7036616b35356d343978356e3935706a716300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000142c96e52fce14baa13868ca8182f8a7903e4e76e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000446962632f44364530324335414538413337464332453341423146433841433136383837384144423837303534393338334446464541394644303230433233343532304137000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000014222c042e17d94f4c83720583c75a37242921ba1c00000000000000000000000000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000014222c042e17d94f4c83720583c75a37242921ba1c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" + ); + + let packet = >::abi_decode(&bz).unwrap(); + + dbg!(packet); + } } diff --git a/lib/ics23/Cargo.toml b/lib/ics23/Cargo.toml index 5ef179b92fd..fe6b4059031 100644 --- a/lib/ics23/Cargo.toml +++ b/lib/ics23/Cargo.toml @@ -2,11 +2,11 @@ name = "ics23" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/macros/Cargo.toml b/lib/macros/Cargo.toml index 29f93c3d72a..3f8091d0751 100644 --- a/lib/macros/Cargo.toml +++ b/lib/macros/Cargo.toml @@ -2,11 +2,11 @@ name = "macros" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/move-bindgen-derive/Cargo.toml b/lib/move-bindgen-derive/Cargo.toml index f2cdbe564fa..79389bfc8ed 100644 --- a/lib/move-bindgen-derive/Cargo.toml +++ b/lib/move-bindgen-derive/Cargo.toml @@ -2,11 +2,11 @@ name = "move-bindgen-derive" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/movement-light-client-types/Cargo.toml b/lib/movement-light-client-types/Cargo.toml index c483dc6df66..903815d422a 100644 --- a/lib/movement-light-client-types/Cargo.toml +++ b/lib/movement-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "movement-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/parlia-verifier/Cargo.toml b/lib/parlia-verifier/Cargo.toml index 53b1f3d1c61..0b27887e2b6 100644 --- a/lib/parlia-verifier/Cargo.toml +++ b/lib/parlia-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "parlia-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/pg-queue/Cargo.toml b/lib/pg-queue/Cargo.toml index 8d95eb14f6c..45686f1f598 100644 --- a/lib/pg-queue/Cargo.toml +++ b/lib/pg-queue/Cargo.toml @@ -2,11 +2,11 @@ name = "pg-queue" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/proof-lens-light-client-types/Cargo.toml b/lib/proof-lens-light-client-types/Cargo.toml index 9b8c58e14bb..ab72f30eced 100644 --- a/lib/proof-lens-light-client-types/Cargo.toml +++ b/lib/proof-lens-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "proof-lens-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/reconnecting-jsonrpc-ws-client/Cargo.toml b/lib/reconnecting-jsonrpc-ws-client/Cargo.toml index 75896d677e9..eabc6b1d4ed 100644 --- a/lib/reconnecting-jsonrpc-ws-client/Cargo.toml +++ b/lib/reconnecting-jsonrpc-ws-client/Cargo.toml @@ -2,11 +2,11 @@ name = "reconnecting-jsonrpc-ws-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/serde-utils/Cargo.toml b/lib/serde-utils/Cargo.toml index 2ddd7ec6a96..fdc7988267b 100644 --- a/lib/serde-utils/Cargo.toml +++ b/lib/serde-utils/Cargo.toml @@ -2,11 +2,11 @@ name = "serde-utils" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/serde-utils/src/lib.rs b/lib/serde-utils/src/lib.rs index 5833813fb0a..c098444d46d 100644 --- a/lib/serde-utils/src/lib.rs +++ b/lib/serde-utils/src/lib.rs @@ -730,67 +730,6 @@ pub mod bitvec_string { } } -// This is used for the very strange representation of nil protobuf timestamps in cometbft json responses -#[allow(non_snake_case)] -pub mod parse_from_rfc3339_string_but_0001_01_01T00_00_00Z_is_none { - use alloc::{format, string::String}; - use core::fmt::Debug; - - use chrono::{DateTime, SecondsFormat, Utc}; - use serde::{Deserializer, Serializer, de::Deserialize}; - - pub fn serialize(data: &Option, serializer: S) -> Result - where - S: Serializer, - T: Clone, - DateTime: TryFrom, - { - match data { - Some(data) => { - serializer.collect_str( - &>::try_from(data.clone()) - .map_err(|err| { - serde::ser::Error::custom(format!( - "unable to convert to datetime: {err:?}" - )) - })? - .to_rfc3339_opts( - SecondsFormat::Nanos, - // use_z - true, - ), - ) - } - None => serializer.serialize_none(), - } - } - - pub fn deserialize<'de, D, T>(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - T: TryFrom, Error: Debug>, - { - >::deserialize(deserializer).and_then(|s| match s { - Some(s) => { - if s == "0001-01-01T00:00:00Z" { - Ok(None) - } else { - let datetime = DateTime::parse_from_rfc3339(&s).map_err(|err| { - serde::de::Error::custom(format!("unable to parse data: {err:?}")) - })?; - - Ok(Some(T::try_from(datetime.into()).map_err(|err| { - serde::de::Error::custom(format!( - "unable to convert data from rfc3339 datetime: {err:?}" - )) - })?)) - } - } - None => Ok(None), - }) - } -} - pub mod fmt { use core::{ fmt::{self, Write}, diff --git a/lib/solidity-slot/Cargo.toml b/lib/solidity-slot/Cargo.toml index 3a129846220..1f40cfb9657 100644 --- a/lib/solidity-slot/Cargo.toml +++ b/lib/solidity-slot/Cargo.toml @@ -2,11 +2,11 @@ name = "solidity-slot" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ssz/tests-generator/Cargo.toml b/lib/ssz/tests-generator/Cargo.toml index c809a7715f6..a92ec76e16d 100644 --- a/lib/ssz/tests-generator/Cargo.toml +++ b/lib/ssz/tests-generator/Cargo.toml @@ -2,11 +2,11 @@ name = "ssz-tests-generator" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/starknet-light-client-types/Cargo.toml b/lib/starknet-light-client-types/Cargo.toml index 2275487092c..850414ec082 100644 --- a/lib/starknet-light-client-types/Cargo.toml +++ b/lib/starknet-light-client-types/Cargo.toml @@ -4,7 +4,7 @@ version = "0.0.0" authors = { workspace = true } edition = { workspace = true } -license-file = "LICENSE" +license = { workspace = true } publish = { workspace = true } repository = { workspace = true } diff --git a/lib/starknet-storage-verifier/Cargo.toml b/lib/starknet-storage-verifier/Cargo.toml index b471e8d1277..46a92ef3267 100644 --- a/lib/starknet-storage-verifier/Cargo.toml +++ b/lib/starknet-storage-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "starknet-storage-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/starknet-types/Cargo.toml b/lib/starknet-types/Cargo.toml index 5594b435d6e..88c93320f15 100644 --- a/lib/starknet-types/Cargo.toml +++ b/lib/starknet-types/Cargo.toml @@ -2,11 +2,11 @@ name = "starknet-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/starknet-verifier/Cargo.toml b/lib/starknet-verifier/Cargo.toml index 3b8ee0ae974..1444814e2b8 100644 --- a/lib/starknet-verifier/Cargo.toml +++ b/lib/starknet-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "starknet-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/state-lens-ics23-ics23-light-client-types/Cargo.toml b/lib/state-lens-ics23-ics23-light-client-types/Cargo.toml index cc73bf82ce6..389d26a4a39 100644 --- a/lib/state-lens-ics23-ics23-light-client-types/Cargo.toml +++ b/lib/state-lens-ics23-ics23-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-ics23-ics23-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/state-lens-ics23-mpt-light-client-types/Cargo.toml b/lib/state-lens-ics23-mpt-light-client-types/Cargo.toml index 0a38ca6e77e..4cc52989236 100644 --- a/lib/state-lens-ics23-mpt-light-client-types/Cargo.toml +++ b/lib/state-lens-ics23-mpt-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-ics23-mpt-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/state-lens-ics23-smt-light-client-types/Cargo.toml b/lib/state-lens-ics23-smt-light-client-types/Cargo.toml index ee8d00da112..c5ef9d3e009 100644 --- a/lib/state-lens-ics23-smt-light-client-types/Cargo.toml +++ b/lib/state-lens-ics23-smt-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-ics23-smt-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/state-lens-light-client-types/Cargo.toml b/lib/state-lens-light-client-types/Cargo.toml index 114516ae82e..a399c11b517 100644 --- a/lib/state-lens-light-client-types/Cargo.toml +++ b/lib/state-lens-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "state-lens-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/subset-of-derive/Cargo.toml b/lib/subset-of-derive/Cargo.toml index 09aa573a475..37ab0fe7018 100644 --- a/lib/subset-of-derive/Cargo.toml +++ b/lib/subset-of-derive/Cargo.toml @@ -3,11 +3,11 @@ autotests = false name = "subset-of-derive" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/subset-of/Cargo.toml b/lib/subset-of/Cargo.toml index f72d9abb796..fb140be77b1 100644 --- a/lib/subset-of/Cargo.toml +++ b/lib/subset-of/Cargo.toml @@ -2,11 +2,11 @@ name = "subset-of" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/sui-light-client-types/Cargo.toml b/lib/sui-light-client-types/Cargo.toml index c726f28779d..bc752e810c8 100644 --- a/lib/sui-light-client-types/Cargo.toml +++ b/lib/sui-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "sui-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/sui-verifier/Cargo.toml b/lib/sui-verifier/Cargo.toml index ada302a47c5..65a51a13c3a 100644 --- a/lib/sui-verifier/Cargo.toml +++ b/lib/sui-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "sui-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [dependencies] bcs = { workspace = true } diff --git a/lib/tendermint-light-client-types/Cargo.toml b/lib/tendermint-light-client-types/Cargo.toml index 780155c4262..90403634694 100644 --- a/lib/tendermint-light-client-types/Cargo.toml +++ b/lib/tendermint-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "tendermint-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/tendermint-light-client-types/src/header.rs b/lib/tendermint-light-client-types/src/header.rs index fd782114658..c74b3f1fcd5 100644 --- a/lib/tendermint-light-client-types/src/header.rs +++ b/lib/tendermint-light-client-types/src/header.rs @@ -96,7 +96,7 @@ mod tests { app: 456, }, chain_id: "oogabooga".to_owned(), - height: 321.try_into().unwrap(), + height: 321_i64.try_into().unwrap(), time: Timestamp { seconds: 654.try_into().unwrap(), nanos: 321.try_into().unwrap(), @@ -119,7 +119,7 @@ mod tests { proposer_address: H160::new([0xAA; 20]), }, commit: Commit { - height: 321.try_into().unwrap(), + height: 321_i64.try_into().unwrap(), round: 321.try_into().unwrap(), block_id: BlockId { hash: Some(H256::new([0xAA; 32])), @@ -147,6 +147,7 @@ mod tests { signature: [1, 2, 3].into(), }, ] + .map(Into::into) .to_vec(), }, }, @@ -225,7 +226,7 @@ mod tests { #[test] fn bincode_decode() { let bz = hex!( - "0b000000000000000000000000000000050000000000000062626e2d31dee1000000000000cd92fd6700000000fadca22201e4a56017947f084f060541877fb61ef3b80314695c4ae3256efb49ed251f562e0100000001aba78231ab06e91264495a0d50c4e058dc47aa091269c1d8a4dea9bc9caacd113c350c75525288bad1d53af34ff0c7aa80fda220c0e48fc3dbed9c788b4ac36ff23806a84fc414de3559755313024ed9bcbcbf840ccd090b86845c1dd2f1d4baaafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b34839aafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b3483922e3fa2d1695ae7db62e55677bf0c914b1ec88d64cd8d280cf2e29b2e06d0965a44d6b3b757a871048312142acf5acd3f8f7bb0b124e934070a73220c895f7e40790fcb874201a8c4a32b94d6d54699676121913822e577433e33133b13bacf4e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85564cdacb04fb9c3b290579644f9edbd05cb00bb7ddee100000000000001000000012f21db36c8cdacaef30683e5d7f2a059863369cc97253c828c31b45e12ee811f0100000001b9f6672f8031ea0d134a70a58f218211354cc93b0c1efcba518964b9f8ed03466000000000000000010000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6ddc92fd67000000007e64ff0a4000000000000000d1668fcf19649f12bce0c7166690e7e44b9e92b4d5aa5d77f0604f419d7b6ce7ae1c090816bd516c6963b0ee3021fd011de44481c843252c20b773ca2da24b0d0100000033ecd5899a91105bb4e51066eb138189bc3825addc92fd6700000000c000c30d4000000000000000594f40799b5c3f936124787572e412ecc9a851aee2445dd32e193340d62191f9b9ff572adf511785a0cff5207304ce47c22fdde2f670077b08552f3bb238f40a01000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e7dc92fd670000000019da9f0c4000000000000000fb30e94789b65fbde4a378793127a4657ae94bf383d9662c73d14da9549a452839f6674cf56011a3d88526c9da44695d33b510f94376becc7df94830d7a9eb0c01000000c27b627c2fd11ee1e3e850738720692be2e3f4c6dc92fd67000000002e107e0d4000000000000000894ac5cc29be216e9a3efe749703aa7c5becb4820d9503230b4a3cee041a7076b7060ef677f9916d22add307d3362d3a999c4c42bf57b2be02a436ca8591850101000000bb386aa0e7b37eb33516aebb58cae3574af85d1fdc92fd6700000000a611260e4000000000000000b87ec5cd663cc39ef6bea0ce7669b1f6648990dc87d61b7c74f9fc86a5821072ea76bc9d0b4ed68ed5d4113ffe8c00f41f4c90828368f475cc499c7b53cfe10f010000002a3d40c3e7ce8d6b55077335cab141c2e11ac254dc92fd67000000004553a40e400000000000000034bb471fd1362581d457c3188c0f7a7aaa029152b583d064a0db52b95385ca2960019fced10449d392dcf4f97c2a032cf43a0457e0b3a5b3f85cf6757f08dd000100000044c395a4a96c6d1a450ed33b5a8ddb359cefed36dc92fd67000000000830c10c40000000000000004019773a4b9ecd79031613acf7c1b56a04c235b79ddae3963538d4c510ccd57e81e09215252afce658a25d2fa3b47b777ea7b8d131d0d0f0686f3a19877aad0e0100000043804074334ac6111233037efe20105c516b0e9fdc92fd6700000000b04b390f4000000000000000665f3705d7e1840419e6d5b18e7dd44bfdaa85c570c1f8cd5abd3779f01da82a54315e8d93cfd34900802fd250314cd4f0b44b1d89d17f9aad8fa144f5de540e01000000ec033669fe506006f870bd8b12cb524a3abc3693dc92fd6700000000df22ac0c4000000000000000749f94ddf804480d70ceb42414053c3c20a810818619e6474f600b2ff8a7c5d2190847358686821550b1640346be911f958a470068c3a5c5f2ff97b6c4d75b0c0100000064cdacb04fb9c3b290579644f9edbd05cb00bb7ddc92fd6700000000c6ad660d40000000000000006dbb355bdced47869131705beaff0ef47dcfcd9e7e9cbb63a0aa0ad27f984dbc9476fdb10a3e7976c4d6ff6c90aada830fe37a8ef08247acf49f2383c0355a0a010000005295664886565f43a3074140551a755872bf6ffddc92fd67000000003f37c70d40000000000000008a2c771f2c01e31cd9d4938b065be94ddca10aebb5e1e2a7abf3f0a0974a01230d0144aa74ddbed4d3a53003ad7e9fe322ecf58b2a88cdd4d91183c915b9db0a01000000da37d2935eae0a92de55e86db2e887b4f18575f0dc92fd6700000000ab08b80d40000000000000007fad7bf5c560d374f8fce2bf11c748b5b67cf98f846ba61597fd131a52f4c21319075148028cf75c94e2730f5e3ffe4f15049925b75e2a37af129645a10d740001000000718160e3538e0b0ed83d3b3dc4ece83809fcd107dc92fd670000000067551f0c40000000000000002472f91b19fd6b5f9b8c536feb9a2c1dc79d131b0eca72ff47729fd7f04df245df89d50698c0323be26aab2da1fb88eedc5610a365ff67b3122a2bafe72ce10e01000000b03f0cb997f3428ef3968833bca2f2a4f613a8ebdc92fd6700000000cb3b750d4000000000000000e71fbe386dade1a2e05e4e835ebe9f8ae17276ae6738dd311a205584522fffb86e9e5555b88127895d130f6059b0475c287e4d3c530b3a36016885d150511108010000005c78a0762f13b0b2a793e82d1a178eb45642234ddc92fd67000000008477d10a4000000000000000aae679b6a0ec424ecf4ef251b8a846dc45bfad6786af6555c951552e8586c9c544eab0863a68b1d10500b1bc0835ed629cf8b4032b298c9f09240b652298ec0c01000000410c1ebaf54c090f0a9132dfa9f79e0f480b2c06dc92fd67000000000b54cf0d40000000000000002bad746822972e4e45ad4b15b87891808586a0616d5a7f11875e504abccda8a0a56f5d8b11c273a41726f0180c534092d3f994372d7a9e39c60fbff83960460a010000006cc0a1531ff58d61dc9061c5b89bc0efc07911fcdc92fd670000000093e2f20a4000000000000000f4d22e704c77cc278f1f00f2044b1af01e3e65dc948b86dcf83faa85f6a8d1912a542b02f22ec7ae85a48ffe9aed2da3d89066029114cc80cf0161569f4428020100000053406de83381dd804632447f1baed00cf28048e0dc92fd67000000007b12e70840000000000000008f0cc1ec4a79ca248e4c3a6a064eb06927054db38e2622a88299f9e83f8b929925c35f976db4cf5b94bfe90b29292fc3d4b3cb192bccb75c215430543c1b70010100000070dac78498afc6d766d860c433265a274d48b7d8dc92fd67000000007eef580d4000000000000000dec9bdf51feeb1c38a88e2f49c6ec4284d978bf1fca45d592b588a253bb7097341406ada4b886462164e3df45116901bacedad58fc61c1407e92a1430099f80e01000000b41ef50272a7a2398ba617d3c963986ebebc5b2ddc92fd67000000006da761134000000000000000bb3f1849d7cad3b10daf14edbc74705448ab7e4117d4a723655f6df2f3bd06aa06efb20439a5802bf5e0ef157123c379a78b8d63a2e9f1ebc9c8941d502b7e03010000003965c223e13ac66f8175c86e657d396c711964b7dc92fd6700000000b451da0c4000000000000000746d12153bbfab44a975abf9b240b20f0992d3454c93474a9522dbb6022487ed4d0e7cfc45ea17069cf2a42e1516afc0f903cbbc64564eae79d92765edde0c0501000000521d2a344e322b8ba76401c833a1ec74ea2bd075dc92fd670000000074a7670940000000000000000f01eabf40b227b8f6f5ed90b25202cab4047b2e5f4fa39d5aebb877c501913630c78e333a09c46dc9287ddf3cdb0071811b9e78886b1230d65d7a706727ad0301000000e2fc4df9e7870fc8238136faca07a120cc078a0cdc92fd6700000000cb93f30b40000000000000004c3aec69c4d8b5343e8834d26a07c040fd40858aa419c87ae81bb4c16f3fa2ea9e1ae00b75b3aace0b3a3e2bf2e44b60b49090c08b5f5f1b604f58d427a1a9050100000035f6c0359084c37ef6eb4061b694386910093b99dc92fd67000000007e4f97104000000000000000431834ba4e91f64a95fda1b00546c00a4f96fb5417aa1113b03377fa04159f183473a77f4f0254a35057629dbbb90b7b74faef8323c2d19b41f4f0fc19683f02010000001b03ab3c744545b281d224127708a9ec7487e58cdc92fd6700000000dd0aad0a400000000000000069343a6e4df448569bf883a488a1554bf622aaa6f75d8c19855fc1e1ab975fe07abe58e6b207329a9d5fcbf8ce29657268331f204e6fe703a8590010e5825d0f010000002a1b3fee6b29ea1828d427f0e5c3887cb7e64487dc92fd67000000003ba5440c4000000000000000d0edaa5792373569d866cf3b972df1fe10c357be7411e4333b9b8a33044140c7cb37ab006ead611d1af2182a05ea90c396c7cb4a35e3570e34bccf865c6d3b0e01000000ccb2909dcd316fc5e738dcdb1f14360f04b44320dc92fd6700000000c8709c0e40000000000000004afe18796206a73eed44fb8861ec9e0e5f87409e896f371cefdb84642234b3e4508b3f56e43fbd30b59c1696fd46d26f19c752a7c2b4fe7535c92b773dcaf90001000000671d816776e8c7fae18dc122fb6dc231956c6d48dc92fd67000000009bb0e20b4000000000000000214a0ae8edd0691c4545d594a1c6d1dfcf252f9f572758ad8510bb688c48b10bce37e5175a970f8ba0af15045e89cc264f44eae6b198ce588dcd523b428d680c01000000188f984567f5c6426386127b6fba27cb59684dc2dc92fd6700000000b401530d40000000000000007789393c0221d71adb0aa7463cb4655d8ed7700a1331ee96e817da681317c22242254f0eb687d8bad3fe41b0d009b8b9f923929bb1c8bd50915c7643c8f924030100000077be23139b650d69ede7985b31fd7b1cee9ca7d3dc92fd6700000000231c4f0f400000000000000009c8786a1c9e28bdd3bcb19e386e476fa53a868b239a3544b858a6d53462386da6ee26e0384e8b274a401540a61ac0c27a469a556419c0201860df8a7a71d504010000001a4b644c16a4a1904618f8d3c0f6a67223038390dc92fd6700000000be18691540000000000000006072da40b5a936f2c194eb3c64aa40912d36a0c6c62e01240c075b8c09827ce88fe617369cce301d55889769a0772eb53b02a44d24fe220499df394c1ff2550201000000c268fe001a533b6f0860167381384363a790fd0ddc92fd6700000000c288f20a4000000000000000490e1676c2b0ca48f48c7c9574bff4e0ce7252e55b9eabffed5f98b009fcab03225d90c614b529327c6188abd86313e9143492a03b3b303512446a3fb19bee0501000000a8a2bf2709ca05755f881ebd939991aea9f88cf1dc92fd670000000075ebcd0b4000000000000000c80df9101788eaf67999381df33169aa6b1423d1a58781c674bea01ebf8e3ff7740924c7dfb5a89990503e013f0f544c48e21257fff270c734c1751110c22a0e010000007ea986d8723587f5e653c0df785fcfce39238785dc92fd6700000000c5b21e0b40000000000000004b51d4294cba70231245444ba1a4b2e036e66c689043a39c3bb0d6c8b8e8df87c07af145b965d3293850ac63feee7b651f38505854599e15369a1dd94e1f060601000000616a45478336b92583cfe29e8ee942802de69eaedc92fd6700000000ba74b5094000000000000000aa81b2679ed38d24595c336ac33f54507c480b8e94711261ea2c0874cf6c91aa921ce20535c06721558fa8af13a929fa4b6b4020f0fd69d465f15c229fb24c04010000009407fa25941c932473f8e2b1ecc5481e3ae15a71dc92fd6700000000fd5e550d4000000000000000edb9fc8f682662e30d017aa3938751319010d965ba7a056e94b530652a5e7480d08bd5ef6bf6dc4ef382ea1fc8aaad3cf0b9e6527ff1fdc3a3cbc13f6139ec0001000000f42c7e49df4f4d0993237959518415e473792392dc92fd6700000000a7ad950b400000000000000078fbd2241ddb28f371c833d5fa6ea2df4be2d4cc955ddbba80f1635a33c68463a70544e5d4b0a3d4d310d69f6d6b27a987a473fe82d7113ca68c73fbaf2c880701000000aea26001de9b15d4dad32808712864e61ae52a17dc92fd670000000085b6d110400000000000000087cf4218c73d910f8491b08f174e48ead5d63369b714fa4bd3ba06be4c4c3f9df329e6624aab4601087d11f525a61323d692d8da5e68859cbb0c656f612ea50901000000fbc2a3f682b507f1a3a5d4c44c8cbb6af0860296dc92fd6700000000cdf0fb0c4000000000000000547b31f13b92120560df3ef667649c520559f64065c929c424d36b7f6874eed1d963cfcf4801369ef0214f9ee5b79c8db47180b2c61f2977dabf945a875f4f02010000002888677e39e38bf4ee64081bd43776fb4d507fcbdc92fd67000000005384860e4000000000000000ded22fa7e99447050b8da73a93860abff3284631e3425eb9b0710aea10e63635d86f723e55fc2b71da98e84529f7ab03bcefa2dcc3d96c9a15ccb26672947c0b0100000023df4a8418762cea4d24b7227ad125df76d2baf6dc92fd6700000000fc6cfd0c40000000000000001411a2aad941dc0f05cb305ee34a2bfcbd0f38c2f9f76ee2370150e8fc96b8bcc197d807b9e43bbdd624d079253727902f3722d283d3f8f8cb7de9c0df3fc20801000000a9c7a884bd7d6e799ef5311bf9168e0105bce416dc92fd6700000000a2c3390c4000000000000000131549da690839c7de7967d243de63d2c7441fc624096e9f1d11d83f3ca6c1cbc9fdcc377baa7efb849f568ffa1d1db85cba241eb1845ef34e3c18b8d476ad0c01000000b8f9204a348e0dbc85abe5bc98936d6b84c01e45dc92fd6700000000db34740a4000000000000000ad607e34654f2565a287759039c747c43034f4bad4239c8a0d2c3bbd7e270a60e2c4cb7cb590222359424bb1a72b9aebdd63e3e480eabba0ca129039767f62040100000076f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d9dc92fd67000000009930670c4000000000000000d4bba468e2f5b23fc126f5c8f987bdb96864b24b1805191287963ae3a3f9903f6a1cd868aef4462d3c71e301c9291512528a5c11c4e918082309f90e368aba0f010000009fee83fbf0bd5a4d71519efc16d0d438c203dd5adc92fd6700000000dcf1600c400000000000000069be4874085ff6d86c50671d258708828752b542de8a69289aadc48ff14e67accfc7eb27a35010a33e3ab16acb6b6474060340b80ba8ee5347ec145464f7cb0c01000000b44fc7d70708095fbc30af164410749483f96439dc92fd6700000000642217164000000000000000eb6e9e073e3181a81ccd61afb28691d6dd666618c9e35fe02583ac21d665e4c9207e1d18b7dec2d305af15ece02ceec10d7558b6a9511a91b605322b8d382909010000002ab301f354a74f45afb347b2c00cdceb09cc719ddc92fd6700000000fc1fbd0b40000000000000003ff30654885e849e7e005ae7e78512a1c258e9ecf8e4a65d37e504ce8f1746f079453ba13314d401eada93518c01ac6743a46d0f1b837430c5ba15da2d54880f01000000dc0802ad3262ecd784ce339d87073c836e31c69edc92fd67000000009641ff0b400000000000000062b3c5950f22390eeff47f991ad0f37d89d2bf379784564a0f8879a3cf4aedee66662da7621e3e3e42acdee0e55a9cdabc6aaad4ea9cef619274520b4c7f01070100000060c51d643048d0a426171bd0deabd1689a89690fdc92fd6700000000e527ab0d40000000000000009f726da9ba9d2bfc10191b29047ade65f8b097aec2eb289a829593a60b4b3d455fe1f89d863c54e7c0113022592e156dc002d1340e449ac70f7b5fcb87e1340b010000002972b0df619f73d1a5c8933aff22ad8c9258f370dc92fd67000000009e33540d4000000000000000ffd4fe59419da0d2625eb81a6e9ffcd6b00f048bdabc0b752cb7e7f679acdc6c934099d55b7de434159db9f1e1049619aa08d1185d3b86e3a283559fd6a8d20c0100000006be03f1b334fc3f7947d0d031f7dfa568005bd4dc92fd67000000005788cb0c40000000000000006150ff91f3bb3944eef77da62cca0ae975acb24e969a08e7c5c61552d3fdd218ae5454eeac3067dd06df5504fb74faa16731b741ae22fb66ea603f82fbc14709010000009c4cc8543dc684948490681118957942b29a9200dc92fd67000000006a89c00b4000000000000000a36c0134791a9e2fdadb9ca6c63562257b181e8c326d482f87320cffc1ede9b2aec01d7415fc849aed0734703406f13a6bf821a9c1e505f72872ac838b46740701000000466d1236b8c77925b25219e4ffe34dd069351847dc92fd6700000000be86910c4000000000000000385c823bb0e6a3bb70c71cd8440efd4c735a08f0fb38f34c23217c47b613915ca3d2ca201a5e7ccaafe385a8ea2c1af43e7e00a888281f1550641199f41c800301000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea6dc92fd67000000007b0e4e11400000000000000089e23aeb49e5b923ec5d9a7646557f03059244cd49254dd3df50d901977c40de74b6a06664eee8d8127eac54780c589e420ba287cc7521d89dcc4f990a53d0060100000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164dc92fd6700000000f9d4ca0f400000000000000006e01177048f97970117e07101408606a15c2ac8cae12c04f9aff1163f281c14ea8fc45116c7e3a60c8946f56b5c8f1df7da25ee766c699ca3dc32e74f72d703010000003ce85b466ff74142307b4b03ddacf17a52d46373dc92fd67000000000018d70b4000000000000000ef47867defcda5d3b62a4d9dfaf5f8e8c9417438512bfd733b950379aecd4732130e57cf4e86dafd6685cbaacc40968079da6aa8f63318a616ebf778f351c30101000000f1961eee75e5a1c8a11a5bf72fb368b990bdd289dc92fd67000000003c8c4c144000000000000000df26ec2da0ea052e27ad554c361b12b223f617120f4088ed29c3ebf0994e5e9f2638da74726fa38ff77dfae6f1a8c990d1e5ef537c9309e33668109107ebcc02010000005d673308ca2b45e5222303836d833e0f70b1f9b0dc92fd6700000000e0fcaf0d40000000000000006b9e7ef2541f5ecd60c2467786c2023ba50becadf1ae761d694c5e5bb326f9c3594e20789a5e7266679f12fb7310b2a9994fd4c7e7f02b06123c6b9f35cc900f01000000913834357f92e577cdc02b1e682c65e86d016ae5dc92fd6700000000ccb0c7094000000000000000bc6f207707ed98c0f5bf3128b748c9edab7e552307af615e65d86d555f299368078b09d2766161597b1682ca6f4000df3c65cbcf1ad74c93622161c342decb0601000000a8f38fcb39b580c4b856dcaed882d504a216ee00dc92fd6700000000f0ddb70b4000000000000000e84b9857e636ab6bdcac66db0396f40ada1ad55764828890c0f4e0ddf405d8834b2726106dd12c1741ef1e9dd043097354b6e3b553fafc39431515aeea87620c01000000c4ef42d72d69f4b58ffe2a58db1335269842ac43dc92fd6700000000bc2dd811400000000000000074716ce6cbee28f1e81c4347310a547e4175119f37a23843f9141219c40fdaf054b76bfc73348632d2c761146f442b0ae6773fea124dfd2aaa95d6bb07940e0101000000d7076d16c2e91e0eb16753575ac3cee3057781c0dc92fd670000000089af770c400000000000000042312437e504b33dd0868de847c54400db1c06976c3ac861a89ebab1eb86b072f917efe8e516c55c580740efc176c34055f7ad310e025436ab241cd2b669660f0100000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af4dc92fd67000000002e500811400000000000000091a3b8f84f2c3b4a0dac8344c74c72615efb3f9c7dd6618d880c50a01b93f0775f835aae219b6e973b212f50cc60bf82aae472f60311796adbe9742a7b64780f01000000fbe1e3ed324fa17379403acfc3dd28fa882c6e65dc92fd670000000018c5eb0c400000000000000060eca7a9dc974865c24263af46c8df64d202604a165e38985c1ee78ddebbe58a31eab48e3c25ea62f33b4499c9a4c55e4ebb1dfcb298b980064ab452bed4e9070100000043965a09c5be34d027a599bd6f450f5e6a13ddf7dc92fd6700000000748e4c0e4000000000000000927500d3a89688fe87a63a506615890c2c1f23a3161c256618303d20765c4553dc5d53f0bcf854be0130991dd9f8b60e6fd0ac41963307e8cb1f925880c52f0901000000edd5716db0738cb0eecd0a04aeb186c4a46720e9dc92fd6700000000f0ab990c40000000000000001b0d132a202cb605c50b7e28c9e2cbcdf829c6cdd0f2acf1b6e284b69f151e7dcd2c64ce5f122972af96b4944f5c276e4354523f86edfe91e8f7c4a3183e1e0401000000f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2dc92fd6700000000e310bf0a40000000000000001130e502e3042ac6d40378bc18013b2aef5a1ff500295b47f009dcf64d738234d10218114a0a6e6ab96e222ab41e3483d06ea74be7d9db30f7563f2c13387e0d01000000e6f8df77989972328c927e5493db6908936a4ea0dc92fd67000000003d39100d40000000000000009963075ba70a2e12fc28a44fbcd8269a6d7aa5c28bb04b1fee78a4ca101790ce655db8936f6415eb174ef4c3001d60f3027940b4d3a63cae96a10064a8fbd90a0100000025764380a6df1c9cad29a842a049f690ab0f08bcdc92fd67000000003262960c4000000000000000037d1c3f08a2123cd657b66d5f45fa243a10974c3e05790011e55b1f8341a143d09e2aee702da5cda655341d66abaabac2cfa2967183c6816440011e774ac0080100000051b78fd2e37a2142b313f68a4edb31b23fe1afd1dc92fd6700000000d04b6a0e4000000000000000336c627bb6a6e4ff19b07a59a2723b2888e15df4e0b7fab8bb7fa671107c8f2679215fe05d8312d23046b3bebc3626147b29b3d3ed1dfd94154abdf139d78a09010000008dabad1a71629e4938de8c44d0bd2f2ce1eabd08dc92fd67000000000212500d4000000000000000b34e86aa00a35a43abc956f33e892d0f43c84c42f16481286742171de142d8e03b55d1a2f0951f88880a3e44a759f87fa6b02a852a39fb12e6f86b7e79299102010000004e30f6a73766baa5fe6db7181b7fd08329c103e0dc92fd67000000002b3fe70c4000000000000000476d5062067a2742eb7543979abe75e3d4e73755e9dfa219e8c5390606efc3f605329b9a280800fcc4116b25c3f35af0e42486a11f217548897144d452ca12020100000066439667823cf1cdefaf47d5ada806d462a6e05fdc92fd6700000000f6cf1b0e4000000000000000cae2c478d899b4edfe2bfea4b07c7cd5000ed9e880d06d2c7819c0a5ec99597bd8d2e8696c9323d103324206815f36d69522454a30b918c8d2b7eabe10b7730101000000f70543a091a45a8c0de04e5ce9e40d9c16d980e1dc92fd67000000009965be0e4000000000000000f867b14f569c0f3e980f9b4e6380abf371299c4f5b3c4726019a8e9dc95828b75c79e6eb4ed72356b869ee5c38ef92ad3352cd3fce2bd1c7630d60ae1d60550201000000b860c8e1ad41462d6352406b85260c9713418ffadc92fd6700000000d2d4940d40000000000000002dd69cd319bf93ee6872a5b334ccd874e7cb6c69a88ecdea0d326d891f72d592a7ec3e7506370c7e08fecd7b497b0a808c2e3ef03efbb616fff6c1d3e9dd4b0e010000006967de8bfc42a68d7c5eac521dd0099cea1fe230dc92fd67000000007de8370e4000000000000000d52cc0093c6b434d47e574a9a169e6bfdb8626fa9bbb16e0c6172f82070da622a29f5e5ba46802a5040cb27566f47178f92dd1698a6e895d22fb668edfc24109010000000d1df149a8579909fedf2111513c57897118b09edc92fd6700000000239d9c0f4000000000000000b7d87f76a8a17be02cbdcb9f8340fdc69d75990f9efa8870308dadb7a76c52e85ad0e002d8169e358a132ccbfa56d7fdb9d0f7af734b78f1600c0582d245c80e0100000002c375d9b259cdbb7b8a97d71b2a0a0dbed890e0dc92fd670000000043e5da0b4000000000000000caa495e3537821e927562a8b90cf867d5469a15525f06998b86040a314566b4a1b885a398a6609d7f0f3ecce7cd67a6865d039951f6c160bd7a929ad32e23509010000005ade83d0ec62ab3eb6b023ff54c976eaf32e8655dc92fd670000000098662c0c4000000000000000d891d9c0ce85e7254bc1f54d8d99f2357d1bb760989c086eb30a9edc17f575565574eef88078e5b2c13dbea707222eef0e4a209688cb4c65b6653257f6abcc0801000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0dc92fd6700000000e7dec0094000000000000000f520f6b05e02c2c6ca1d45dd157f5b9f2be74e7667d6e34aa39bd1ae5cb9f46601ee0fd52688c0444458e231e65734fe4f35b1fc6beb30c317f2c71df351250c01000000409d07de01ea2a63c779c0246562aa278a95611edc92fd67000000007f392e0e40000000000000003481be5f776e2bb3c263e4b5e5a9ac3d06517b54bd5e34b2b90aba1366084f9821a73b5d21f59e49244758ef476fea38809c170619956e9658150016e178770501000000a93fccc20939a8a0fecc48a9737402486bc41d53dc92fd670000000053674a0e400000000000000073b26ece239baf6b56c05a4f233771301ff8041b77b3d0e269766a845d4fa32eb2331e5e67ab4c9dc79a91ac330b0b96231f833aba18bcd407514dedd2333303010000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2dc92fd6700000000a41a2d124000000000000000c42631b751a44c69b19fdd4c4a9ea49528f788f4b6394b83cf435eb3320aeeaffe453c999eb6dc5b2ce7ab93c1a1db1997797d745a4a01871b6ddc171771210601000000cea4cde95b67ff91fd25ea77c3075944764754b6dc92fd67000000002fa2420f4000000000000000090cd7dfec7f68f35c5ec4b5ec7901ebdc724f292f5f8244725dd21f9e74fbc5a29575224b95055f2d4da96a1b61010cbed84db91904388ca091f8951de40f090100000060131b8768de4f8a40aaa34a9f0d40be902807aedc92fd6700000000a25e870d4000000000000000e1494514195c9b6b0c66fe63a1cb4f6900b1352fd21bcf62ee7e758a62d71c19e9091db4a16641fd3db15fcd2cde519d9ab73ccbb2a12e14fdbf24c2dcc9360b0100000013247270303a9d66ea8ffa02614a8b5369adda53dc92fd6700000000f4037b0d4000000000000000743a6b27b7d6ee0823d31ad2333ffde8508e1f32887cf423a0d834fe0157ef089784d4e1a248097d73f55541ac52f20652733f4f541a478b4b50304a5bcc3a0d02000000349f27787689a635ffbe00e0dd66e848690a73f2dc92fd670000000014b1dd274000000000000000b650e130849fec2bbe84fd100dad6e192dd4fa556ad4423be0308bc5358cae173fe186bfc458e04284a0863ce71630e03d2d3cbe55c3503435bcb0f54e5cc00f01000000e71b23c378e4c465bfe96ad48e7f93f237e939dcdc92fd6700000000b9fc89104000000000000000fadcfde89d64078184d1d5f394ea7cef229deba4685848b0d121c76f0014ced8bdfd82984999d1c1c1cd7d513b86c48f271676fa069d8e4213e6af9de45d240601000000c2989ed51e73b742e4991cf915d6339419657ad5dc92fd6700000000c993fc0d400000000000000000cc9c46a2cf23aa55761d7007da4c11b839f412b6f9d00f7cb4631c2e3e9dd2a31ecb132389045874122d61d5e1db4111f7974f4b5b7f8d577f11c79d676a030100000080f78edcdb53aa69dea3f482472027327f1acf0edc92fd6700000000b43e1c0d4000000000000000973741882a58558fc4d58d9910bbf6123188b8d0e1a800ff75076b876008e354b2dfe66a7141bbbadf5db7a033066cedde5c183caaa4c4896ce113d40c7a31070100000069a300bbe8cba17536cdb4346c148d1dd7475c6ddc92fd670000000056e1da0b4000000000000000096c8d242e02e346a857bac8d3a7a8a77720eb55f0c176684e10c72e06ce0845c5313983057ebe634ba0b017a02844744b8784dfb4794d1b811becd99031cf07010000001b21f9bf3b9a650607cced8c0c2fbeca3211791bdc92fd67000000001670aa0e40000000000000006cf0177340ca51bff1a44175f6fa34d22a818fea0a0ab2462407098e54123649a525c1877cd60ba8990ef98f25bb108c6cd54e234858c72e1a7acbfa92183906010000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3bdc92fd6700000000df8c7f0f40000000000000003049221d183eaf44e8f2e7092e389fb991d3f86ecf53c8168e10b53ca9a11543e7ea2ad702dd4b763fc8efe47372c8623d3c404b697265908ffedbf35f441f0401000000300636fc6b27a7016f3aef03c231aa63163eeb5ddc92fd6700000000132c110f4000000000000000ab4122abf322fcdd9f99b5c1aa72642d70b2d902069fc96e982be1d8a347b1449e09b165e176c363f016db5d7cfa8edcbd2e2b8660e4902a41901b2cfea04a000100000037b7e284915654acc06e394fb423dcae6a4fd94fdc92fd670000000051a44f114000000000000000d32fcba7914db53c7acfe1f5afdb22d3cfc36e06c73fa8691abd693a584df5871e3250a930a07e5b3da3af1fb83c1f312547bab9acf6639b27b08abe1f80ba040100000065c584027f5fd8349027fa5bf1d4ed3828c29058dc92fd67000000001a2e57114000000000000000380aac5d338a2161116a25013ef2d5e0a9367210211ce3c915cb279ae573f87b3cad0390d82819028e3ba3592315fb89e40cc58923fc67fdbe23d27a4d6b9d0260000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b1619030000000003b23becffffffff33ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000008e58ec0100000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff02000000003f6a50e8ffffffffc27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff02000000007a20e12700000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000cf9335ebffffffff2a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb0200000000a91ae20a0000000044c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000009cf493290000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb020000000083e0632800000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000e07798020000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000002804fce9ffffffffda37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000e3f1492100000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000006347d5f4ffffffffb03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f8fde0f0ffffffff5c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c831010000000001d87ee6ffffffff410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb731010000000036f60213000000006cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb43101000000002b27d0130000000053406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba4310100000000b87060160000000070dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e31010000000026b4310300000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc2839631010000000013096402000000003965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000c11fa60a00000000521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000bee5520c00000000e2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c310100000000912836e8ffffffff35f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000081f00e2d000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000b5f312e5ffffffff2a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d732310100000000928961e9ffffffffccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000a5a891e3ffffffff671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f3101000000007636fe2900000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000487aa2040000000077be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d310100000000a58ede2d000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d3101000000006839c72900000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000001f9e1cf7ffffffffa8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc63758600000000009f8a1d21000000007ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb1850000000000c2c802ffffffffff616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba38810000000000fc118e00000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000cfc0fbfcfffffffff42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f018208100000000002d2b4afcffffffffaea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c8100000000008bc03f0000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000068630be3ffffffff2888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db800000000000571cb8ebffffffff23df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d9800000000000e6366ce9ffffffffa9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d1800000000000540866e3ffffffffb8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000d87010e6ffffffff76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000062dd302b000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000e2fd4e2ffffffffb44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c3800000000000845983e1ffffffff2ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c2800000000000cf47a4e1ffffffffdc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000a439bce0ffffffff60c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc0800000000000b2648ce0ffffffff2972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c08000000000006acca5e0ffffffff06be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf80000000000070c3312a000000009c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000e5d52c2a00000000466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000a8a60d2b00000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf80000000000069c8082b0000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf8000000000009256342b000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf8000000000003de4302a00000000f1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe8000000000000ae6fb2a000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c10f2a2a00000000913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008d60282a00000000a8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe80000000000057be282a00000000c4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005dae2c2a00000000d7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000ea7bfb2a0000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd01390000000000289aae2600000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a000000000050506efcffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d8902000000000048ad67e3ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000a9522edafffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ca0d16f4ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb0000000000004e9e690b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f6800000000000054476be1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000003125cdbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e00000000000041c5fad4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c146330000000000008fd8800f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e00000000000041b4ffbbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000666eac1200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df8430150700000000000013b41d09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b0500000000000035df0afdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af501040000000000006c9e7eafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e803000000000000a19ea3adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000007bcdda0700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000006083f70100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed9010000000000000b9cb10500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000055c5c06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f5909001000000000000e6b71b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000557c66afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d8100000000000000323089f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000850c090400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a000000000000001ac7900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000501065b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e0f383060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b00000000000000de189d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000529c7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f48010000000000000027327906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d70100000000000000aec98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da901000000000000006a3279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f12090100000000000000912979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000d50d79060000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c00000000f33bd74a0000000001010000000000000088e100000000000060000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b16190300000000285044100000000033ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000004c5b9c2b00000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff0200000000876ec71400000000c27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff020000000047a3a30900000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000bb10e418000000002a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb02000000004930e8edffffffff44c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000003f01a00c0000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb0200000000f25c890b00000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000f8c99a300000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb0200000000a6306c0f000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000006185031800000000da37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000bff37c0400000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000003ec7ed2300000000b03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f358a820000000005c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c83101000000007da7a51600000000410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb73101000000006d2b58f8ffffffff6cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb4310100000000076126f9ffffffff53406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba431010000000044f5bbfbffffffff70dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e3101000000003e558fe8ffffffffb41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7ffffffff3965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000093807f0ffffffff521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000c878ccf1ffffffffe2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c31010000000092998b180000000035f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000015f38e12000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000ef7d6b15000000002a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d7323101000000001520ba1900000000ccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000b55beb1300000000671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f31010000000034b7800f00000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000aefd24eaffffffff77be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d31010000000040876113000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d310100000000a9364a0f00000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000004dde9e0200000000a8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc6375860000000000c09078f4ffffffff7ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb18500000000001e2c761d00000000616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba388100000000002d787d20000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000b815ef1c00000000f42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f0182081000000000028bf411c00000000aea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c81000000000063c63d2000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000038bc1303000000002888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db8000000000009259c60b0000000023df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d98000000000008a5f7b0900000000a9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d18000000000009a8c770300000000b8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000184f23060000000076f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000012c56e00000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000f9fe90200000000b44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c380000000000078d59901000000002ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c28000000000000ad2ba0100000000dc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000cb81d3000000000060c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc08000000000005ed2a300000000002972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c0800000000000c03abd000000000006be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf800000000000ed3072ffffffffff9c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000b04a6dffffffffff466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000701e4e0000000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf800000000000d84349000000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf80000000000051d77400000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf800000000000467071fffffffffff1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe800000000000b47b3c00000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c0a56affffffffff913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008cf668ffffffffffa8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe800000000000565469ffffffffffc4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005c446dffffffffffd7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000e9113c000000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd013900000000006706c11300000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a0000000000343af9f8ffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d89020000000000c70690e2ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000350898d9fffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ce74abf3ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb00000000000085601b0b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f68000000000000d98f48e1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000033553edbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e000000000000f525e6d4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c1463300000000000051d26f0f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e0000000000001545f0bbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000bc78a11200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df843015070000000000001a5a1b09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b050000000000000e0809fdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af50104000000000000174a7dafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e8030000000000009952a2adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000009baed90700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000005bdef60100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed901000000000000fefeb00500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000e9cd5b06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f590900100000000000016331b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000ff2766afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d81000000000000005d0589f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000abe6080400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a00000000000000d8b3900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000050665b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e9ea83060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b0000000000000037159d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000a89b7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f480100000000000000d2317906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d7010000000000000059c98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da90100000000000000153279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f120901000000000000003c2979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000800d790600000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7fffffffff33bd74a00000000" + "0b000000000000000000000000000000050000000000000062626e2d31dee1000000000000cd92fd6700000000fadca22201e4a56017947f084f060541877fb61ef3b80314695c4ae3256efb49ed251f562e0100000001aba78231ab06e91264495a0d50c4e058dc47aa091269c1d8a4dea9bc9caacd113c350c75525288bad1d53af34ff0c7aa80fda220c0e48fc3dbed9c788b4ac36ff23806a84fc414de3559755313024ed9bcbcbf840ccd090b86845c1dd2f1d4baaafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b34839aafbd9b8eff8c8b0414d0fb8ec282dea6d2f20ec0a00718cfc6355e0a3b3483922e3fa2d1695ae7db62e55677bf0c914b1ec88d64cd8d280cf2e29b2e06d0965a44d6b3b757a871048312142acf5acd3f8f7bb0b124e934070a73220c895f7e40790fcb874201a8c4a32b94d6d54699676121913822e577433e33133b13bacf4e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b85564cdacb04fb9c3b290579644f9edbd05cb00bb7ddee100000000000001000000012f21db36c8cdacaef30683e5d7f2a059863369cc97253c828c31b45e12ee811f0100000001b9f6672f8031ea0d134a70a58f218211354cc93b0c1efcba518964b9f8ed0346600000000000000002000000013c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d01dc92fd67000000007e64ff0a014000000000000000d1668fcf19649f12bce0c7166690e7e44b9e92b4d5aa5d77f0604f419d7b6ce7ae1c090816bd516c6963b0ee3021fd011de44481c843252c20b773ca2da24b0d020000000133ecd5899a91105bb4e51066eb138189bc3825ad01dc92fd6700000000c000c30d014000000000000000594f40799b5c3f936124787572e412ecc9a851aee2445dd32e193340d62191f9b9ff572adf511785a0cff5207304ce47c22fdde2f670077b08552f3bb238f40a0200000001f2e6bb25d8d269c9737bd3789b11dc76c4fc56e701dc92fd670000000019da9f0c014000000000000000fb30e94789b65fbde4a378793127a4657ae94bf383d9662c73d14da9549a452839f6674cf56011a3d88526c9da44695d33b510f94376becc7df94830d7a9eb0c0200000001c27b627c2fd11ee1e3e850738720692be2e3f4c601dc92fd67000000002e107e0d014000000000000000894ac5cc29be216e9a3efe749703aa7c5becb4820d9503230b4a3cee041a7076b7060ef677f9916d22add307d3362d3a999c4c42bf57b2be02a436ca859185010200000001bb386aa0e7b37eb33516aebb58cae3574af85d1f01dc92fd6700000000a611260e014000000000000000b87ec5cd663cc39ef6bea0ce7669b1f6648990dc87d61b7c74f9fc86a5821072ea76bc9d0b4ed68ed5d4113ffe8c00f41f4c90828368f475cc499c7b53cfe10f02000000012a3d40c3e7ce8d6b55077335cab141c2e11ac25401dc92fd67000000004553a40e01400000000000000034bb471fd1362581d457c3188c0f7a7aaa029152b583d064a0db52b95385ca2960019fced10449d392dcf4f97c2a032cf43a0457e0b3a5b3f85cf6757f08dd00020000000144c395a4a96c6d1a450ed33b5a8ddb359cefed3601dc92fd67000000000830c10c0140000000000000004019773a4b9ecd79031613acf7c1b56a04c235b79ddae3963538d4c510ccd57e81e09215252afce658a25d2fa3b47b777ea7b8d131d0d0f0686f3a19877aad0e020000000143804074334ac6111233037efe20105c516b0e9f01dc92fd6700000000b04b390f014000000000000000665f3705d7e1840419e6d5b18e7dd44bfdaa85c570c1f8cd5abd3779f01da82a54315e8d93cfd34900802fd250314cd4f0b44b1d89d17f9aad8fa144f5de540e0200000001ec033669fe506006f870bd8b12cb524a3abc369301dc92fd6700000000df22ac0c014000000000000000749f94ddf804480d70ceb42414053c3c20a810818619e6474f600b2ff8a7c5d2190847358686821550b1640346be911f958a470068c3a5c5f2ff97b6c4d75b0c020000000164cdacb04fb9c3b290579644f9edbd05cb00bb7d01dc92fd6700000000c6ad660d0140000000000000006dbb355bdced47869131705beaff0ef47dcfcd9e7e9cbb63a0aa0ad27f984dbc9476fdb10a3e7976c4d6ff6c90aada830fe37a8ef08247acf49f2383c0355a0a02000000015295664886565f43a3074140551a755872bf6ffd01dc92fd67000000003f37c70d0140000000000000008a2c771f2c01e31cd9d4938b065be94ddca10aebb5e1e2a7abf3f0a0974a01230d0144aa74ddbed4d3a53003ad7e9fe322ecf58b2a88cdd4d91183c915b9db0a0200000001da37d2935eae0a92de55e86db2e887b4f18575f001dc92fd6700000000ab08b80d0140000000000000007fad7bf5c560d374f8fce2bf11c748b5b67cf98f846ba61597fd131a52f4c21319075148028cf75c94e2730f5e3ffe4f15049925b75e2a37af129645a10d74000200000001718160e3538e0b0ed83d3b3dc4ece83809fcd10701dc92fd670000000067551f0c0140000000000000002472f91b19fd6b5f9b8c536feb9a2c1dc79d131b0eca72ff47729fd7f04df245df89d50698c0323be26aab2da1fb88eedc5610a365ff67b3122a2bafe72ce10e0200000001b03f0cb997f3428ef3968833bca2f2a4f613a8eb01dc92fd6700000000cb3b750d014000000000000000e71fbe386dade1a2e05e4e835ebe9f8ae17276ae6738dd311a205584522fffb86e9e5555b88127895d130f6059b0475c287e4d3c530b3a36016885d15051110802000000015c78a0762f13b0b2a793e82d1a178eb45642234d01dc92fd67000000008477d10a014000000000000000aae679b6a0ec424ecf4ef251b8a846dc45bfad6786af6555c951552e8586c9c544eab0863a68b1d10500b1bc0835ed629cf8b4032b298c9f09240b652298ec0c0200000001410c1ebaf54c090f0a9132dfa9f79e0f480b2c0601dc92fd67000000000b54cf0d0140000000000000002bad746822972e4e45ad4b15b87891808586a0616d5a7f11875e504abccda8a0a56f5d8b11c273a41726f0180c534092d3f994372d7a9e39c60fbff83960460a02000000016cc0a1531ff58d61dc9061c5b89bc0efc07911fc01dc92fd670000000093e2f20a014000000000000000f4d22e704c77cc278f1f00f2044b1af01e3e65dc948b86dcf83faa85f6a8d1912a542b02f22ec7ae85a48ffe9aed2da3d89066029114cc80cf0161569f442802020000000153406de83381dd804632447f1baed00cf28048e001dc92fd67000000007b12e7080140000000000000008f0cc1ec4a79ca248e4c3a6a064eb06927054db38e2622a88299f9e83f8b929925c35f976db4cf5b94bfe90b29292fc3d4b3cb192bccb75c215430543c1b7001020000000170dac78498afc6d766d860c433265a274d48b7d801dc92fd67000000007eef580d014000000000000000dec9bdf51feeb1c38a88e2f49c6ec4284d978bf1fca45d592b588a253bb7097341406ada4b886462164e3df45116901bacedad58fc61c1407e92a1430099f80e0200000001b41ef50272a7a2398ba617d3c963986ebebc5b2d01dc92fd67000000006da76113014000000000000000bb3f1849d7cad3b10daf14edbc74705448ab7e4117d4a723655f6df2f3bd06aa06efb20439a5802bf5e0ef157123c379a78b8d63a2e9f1ebc9c8941d502b7e0302000000013965c223e13ac66f8175c86e657d396c711964b701dc92fd6700000000b451da0c014000000000000000746d12153bbfab44a975abf9b240b20f0992d3454c93474a9522dbb6022487ed4d0e7cfc45ea17069cf2a42e1516afc0f903cbbc64564eae79d92765edde0c050200000001521d2a344e322b8ba76401c833a1ec74ea2bd07501dc92fd670000000074a767090140000000000000000f01eabf40b227b8f6f5ed90b25202cab4047b2e5f4fa39d5aebb877c501913630c78e333a09c46dc9287ddf3cdb0071811b9e78886b1230d65d7a706727ad030200000001e2fc4df9e7870fc8238136faca07a120cc078a0c01dc92fd6700000000cb93f30b0140000000000000004c3aec69c4d8b5343e8834d26a07c040fd40858aa419c87ae81bb4c16f3fa2ea9e1ae00b75b3aace0b3a3e2bf2e44b60b49090c08b5f5f1b604f58d427a1a905020000000135f6c0359084c37ef6eb4061b694386910093b9901dc92fd67000000007e4f9710014000000000000000431834ba4e91f64a95fda1b00546c00a4f96fb5417aa1113b03377fa04159f183473a77f4f0254a35057629dbbb90b7b74faef8323c2d19b41f4f0fc19683f0202000000011b03ab3c744545b281d224127708a9ec7487e58c01dc92fd6700000000dd0aad0a01400000000000000069343a6e4df448569bf883a488a1554bf622aaa6f75d8c19855fc1e1ab975fe07abe58e6b207329a9d5fcbf8ce29657268331f204e6fe703a8590010e5825d0f02000000012a1b3fee6b29ea1828d427f0e5c3887cb7e6448701dc92fd67000000003ba5440c014000000000000000d0edaa5792373569d866cf3b972df1fe10c357be7411e4333b9b8a33044140c7cb37ab006ead611d1af2182a05ea90c396c7cb4a35e3570e34bccf865c6d3b0e0200000001ccb2909dcd316fc5e738dcdb1f14360f04b4432001dc92fd6700000000c8709c0e0140000000000000004afe18796206a73eed44fb8861ec9e0e5f87409e896f371cefdb84642234b3e4508b3f56e43fbd30b59c1696fd46d26f19c752a7c2b4fe7535c92b773dcaf9000200000001671d816776e8c7fae18dc122fb6dc231956c6d4801dc92fd67000000009bb0e20b014000000000000000214a0ae8edd0691c4545d594a1c6d1dfcf252f9f572758ad8510bb688c48b10bce37e5175a970f8ba0af15045e89cc264f44eae6b198ce588dcd523b428d680c0200000001188f984567f5c6426386127b6fba27cb59684dc201dc92fd6700000000b401530d0140000000000000007789393c0221d71adb0aa7463cb4655d8ed7700a1331ee96e817da681317c22242254f0eb687d8bad3fe41b0d009b8b9f923929bb1c8bd50915c7643c8f92403020000000177be23139b650d69ede7985b31fd7b1cee9ca7d301dc92fd6700000000231c4f0f01400000000000000009c8786a1c9e28bdd3bcb19e386e476fa53a868b239a3544b858a6d53462386da6ee26e0384e8b274a401540a61ac0c27a469a556419c0201860df8a7a71d50402000000011a4b644c16a4a1904618f8d3c0f6a6722303839001dc92fd6700000000be1869150140000000000000006072da40b5a936f2c194eb3c64aa40912d36a0c6c62e01240c075b8c09827ce88fe617369cce301d55889769a0772eb53b02a44d24fe220499df394c1ff255020200000001c268fe001a533b6f0860167381384363a790fd0d01dc92fd6700000000c288f20a014000000000000000490e1676c2b0ca48f48c7c9574bff4e0ce7252e55b9eabffed5f98b009fcab03225d90c614b529327c6188abd86313e9143492a03b3b303512446a3fb19bee050200000001a8a2bf2709ca05755f881ebd939991aea9f88cf101dc92fd670000000075ebcd0b014000000000000000c80df9101788eaf67999381df33169aa6b1423d1a58781c674bea01ebf8e3ff7740924c7dfb5a89990503e013f0f544c48e21257fff270c734c1751110c22a0e02000000017ea986d8723587f5e653c0df785fcfce3923878501dc92fd6700000000c5b21e0b0140000000000000004b51d4294cba70231245444ba1a4b2e036e66c689043a39c3bb0d6c8b8e8df87c07af145b965d3293850ac63feee7b651f38505854599e15369a1dd94e1f06060200000001616a45478336b92583cfe29e8ee942802de69eae01dc92fd6700000000ba74b509014000000000000000aa81b2679ed38d24595c336ac33f54507c480b8e94711261ea2c0874cf6c91aa921ce20535c06721558fa8af13a929fa4b6b4020f0fd69d465f15c229fb24c0402000000019407fa25941c932473f8e2b1ecc5481e3ae15a7101dc92fd6700000000fd5e550d014000000000000000edb9fc8f682662e30d017aa3938751319010d965ba7a056e94b530652a5e7480d08bd5ef6bf6dc4ef382ea1fc8aaad3cf0b9e6527ff1fdc3a3cbc13f6139ec000200000001f42c7e49df4f4d0993237959518415e47379239201dc92fd6700000000a7ad950b01400000000000000078fbd2241ddb28f371c833d5fa6ea2df4be2d4cc955ddbba80f1635a33c68463a70544e5d4b0a3d4d310d69f6d6b27a987a473fe82d7113ca68c73fbaf2c88070200000001aea26001de9b15d4dad32808712864e61ae52a1701dc92fd670000000085b6d11001400000000000000087cf4218c73d910f8491b08f174e48ead5d63369b714fa4bd3ba06be4c4c3f9df329e6624aab4601087d11f525a61323d692d8da5e68859cbb0c656f612ea5090200000001fbc2a3f682b507f1a3a5d4c44c8cbb6af086029601dc92fd6700000000cdf0fb0c014000000000000000547b31f13b92120560df3ef667649c520559f64065c929c424d36b7f6874eed1d963cfcf4801369ef0214f9ee5b79c8db47180b2c61f2977dabf945a875f4f0202000000012888677e39e38bf4ee64081bd43776fb4d507fcb01dc92fd67000000005384860e014000000000000000ded22fa7e99447050b8da73a93860abff3284631e3425eb9b0710aea10e63635d86f723e55fc2b71da98e84529f7ab03bcefa2dcc3d96c9a15ccb26672947c0b020000000123df4a8418762cea4d24b7227ad125df76d2baf601dc92fd6700000000fc6cfd0c0140000000000000001411a2aad941dc0f05cb305ee34a2bfcbd0f38c2f9f76ee2370150e8fc96b8bcc197d807b9e43bbdd624d079253727902f3722d283d3f8f8cb7de9c0df3fc2080200000001a9c7a884bd7d6e799ef5311bf9168e0105bce41601dc92fd6700000000a2c3390c014000000000000000131549da690839c7de7967d243de63d2c7441fc624096e9f1d11d83f3ca6c1cbc9fdcc377baa7efb849f568ffa1d1db85cba241eb1845ef34e3c18b8d476ad0c0200000001b8f9204a348e0dbc85abe5bc98936d6b84c01e4501dc92fd6700000000db34740a014000000000000000ad607e34654f2565a287759039c747c43034f4bad4239c8a0d2c3bbd7e270a60e2c4cb7cb590222359424bb1a72b9aebdd63e3e480eabba0ca129039767f6204020000000176f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d901dc92fd67000000009930670c014000000000000000d4bba468e2f5b23fc126f5c8f987bdb96864b24b1805191287963ae3a3f9903f6a1cd868aef4462d3c71e301c9291512528a5c11c4e918082309f90e368aba0f02000000019fee83fbf0bd5a4d71519efc16d0d438c203dd5a01dc92fd6700000000dcf1600c01400000000000000069be4874085ff6d86c50671d258708828752b542de8a69289aadc48ff14e67accfc7eb27a35010a33e3ab16acb6b6474060340b80ba8ee5347ec145464f7cb0c0200000001b44fc7d70708095fbc30af164410749483f9643901dc92fd670000000064221716014000000000000000eb6e9e073e3181a81ccd61afb28691d6dd666618c9e35fe02583ac21d665e4c9207e1d18b7dec2d305af15ece02ceec10d7558b6a9511a91b605322b8d38290902000000012ab301f354a74f45afb347b2c00cdceb09cc719d01dc92fd6700000000fc1fbd0b0140000000000000003ff30654885e849e7e005ae7e78512a1c258e9ecf8e4a65d37e504ce8f1746f079453ba13314d401eada93518c01ac6743a46d0f1b837430c5ba15da2d54880f0200000001dc0802ad3262ecd784ce339d87073c836e31c69e01dc92fd67000000009641ff0b01400000000000000062b3c5950f22390eeff47f991ad0f37d89d2bf379784564a0f8879a3cf4aedee66662da7621e3e3e42acdee0e55a9cdabc6aaad4ea9cef619274520b4c7f0107020000000160c51d643048d0a426171bd0deabd1689a89690f01dc92fd6700000000e527ab0d0140000000000000009f726da9ba9d2bfc10191b29047ade65f8b097aec2eb289a829593a60b4b3d455fe1f89d863c54e7c0113022592e156dc002d1340e449ac70f7b5fcb87e1340b02000000012972b0df619f73d1a5c8933aff22ad8c9258f37001dc92fd67000000009e33540d014000000000000000ffd4fe59419da0d2625eb81a6e9ffcd6b00f048bdabc0b752cb7e7f679acdc6c934099d55b7de434159db9f1e1049619aa08d1185d3b86e3a283559fd6a8d20c020000000106be03f1b334fc3f7947d0d031f7dfa568005bd401dc92fd67000000005788cb0c0140000000000000006150ff91f3bb3944eef77da62cca0ae975acb24e969a08e7c5c61552d3fdd218ae5454eeac3067dd06df5504fb74faa16731b741ae22fb66ea603f82fbc1470902000000019c4cc8543dc684948490681118957942b29a920001dc92fd67000000006a89c00b014000000000000000a36c0134791a9e2fdadb9ca6c63562257b181e8c326d482f87320cffc1ede9b2aec01d7415fc849aed0734703406f13a6bf821a9c1e505f72872ac838b4674070200000001466d1236b8c77925b25219e4ffe34dd06935184701dc92fd6700000000be86910c014000000000000000385c823bb0e6a3bb70c71cd8440efd4c735a08f0fb38f34c23217c47b613915ca3d2ca201a5e7ccaafe385a8ea2c1af43e7e00a888281f1550641199f41c80030200000001646d5c6384c84c2e660bf268d0a4ebc1ffbceea601dc92fd67000000007b0e4e1101400000000000000089e23aeb49e5b923ec5d9a7646557f03059244cd49254dd3df50d901977c40de74b6a06664eee8d8127eac54780c589e420ba287cc7521d89dcc4f990a53d006020000000102d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a316401dc92fd6700000000f9d4ca0f01400000000000000006e01177048f97970117e07101408606a15c2ac8cae12c04f9aff1163f281c14ea8fc45116c7e3a60c8946f56b5c8f1df7da25ee766c699ca3dc32e74f72d70302000000013ce85b466ff74142307b4b03ddacf17a52d4637301dc92fd67000000000018d70b014000000000000000ef47867defcda5d3b62a4d9dfaf5f8e8c9417438512bfd733b950379aecd4732130e57cf4e86dafd6685cbaacc40968079da6aa8f63318a616ebf778f351c3010200000001f1961eee75e5a1c8a11a5bf72fb368b990bdd28901dc92fd67000000003c8c4c14014000000000000000df26ec2da0ea052e27ad554c361b12b223f617120f4088ed29c3ebf0994e5e9f2638da74726fa38ff77dfae6f1a8c990d1e5ef537c9309e33668109107ebcc0202000000015d673308ca2b45e5222303836d833e0f70b1f9b001dc92fd6700000000e0fcaf0d0140000000000000006b9e7ef2541f5ecd60c2467786c2023ba50becadf1ae761d694c5e5bb326f9c3594e20789a5e7266679f12fb7310b2a9994fd4c7e7f02b06123c6b9f35cc900f0200000001913834357f92e577cdc02b1e682c65e86d016ae501dc92fd6700000000ccb0c709014000000000000000bc6f207707ed98c0f5bf3128b748c9edab7e552307af615e65d86d555f299368078b09d2766161597b1682ca6f4000df3c65cbcf1ad74c93622161c342decb060200000001a8f38fcb39b580c4b856dcaed882d504a216ee0001dc92fd6700000000f0ddb70b014000000000000000e84b9857e636ab6bdcac66db0396f40ada1ad55764828890c0f4e0ddf405d8834b2726106dd12c1741ef1e9dd043097354b6e3b553fafc39431515aeea87620c0200000001c4ef42d72d69f4b58ffe2a58db1335269842ac4301dc92fd6700000000bc2dd81101400000000000000074716ce6cbee28f1e81c4347310a547e4175119f37a23843f9141219c40fdaf054b76bfc73348632d2c761146f442b0ae6773fea124dfd2aaa95d6bb07940e010200000001d7076d16c2e91e0eb16753575ac3cee3057781c001dc92fd670000000089af770c01400000000000000042312437e504b33dd0868de847c54400db1c06976c3ac861a89ebab1eb86b072f917efe8e516c55c580740efc176c34055f7ad310e025436ab241cd2b669660f020000000101b2c0f03ba9b2f352a39bc45ce37aa2710b5af401dc92fd67000000002e50081101400000000000000091a3b8f84f2c3b4a0dac8344c74c72615efb3f9c7dd6618d880c50a01b93f0775f835aae219b6e973b212f50cc60bf82aae472f60311796adbe9742a7b64780f0200000001fbe1e3ed324fa17379403acfc3dd28fa882c6e6501dc92fd670000000018c5eb0c01400000000000000060eca7a9dc974865c24263af46c8df64d202604a165e38985c1ee78ddebbe58a31eab48e3c25ea62f33b4499c9a4c55e4ebb1dfcb298b980064ab452bed4e907020000000143965a09c5be34d027a599bd6f450f5e6a13ddf701dc92fd6700000000748e4c0e014000000000000000927500d3a89688fe87a63a506615890c2c1f23a3161c256618303d20765c4553dc5d53f0bcf854be0130991dd9f8b60e6fd0ac41963307e8cb1f925880c52f090200000001edd5716db0738cb0eecd0a04aeb186c4a46720e901dc92fd6700000000f0ab990c0140000000000000001b0d132a202cb605c50b7e28c9e2cbcdf829c6cdd0f2acf1b6e284b69f151e7dcd2c64ce5f122972af96b4944f5c276e4354523f86edfe91e8f7c4a3183e1e040200000001f8260be47a1c7d42bbd9a656bdf8e3d3f28cbab201dc92fd6700000000e310bf0a0140000000000000001130e502e3042ac6d40378bc18013b2aef5a1ff500295b47f009dcf64d738234d10218114a0a6e6ab96e222ab41e3483d06ea74be7d9db30f7563f2c13387e0d0200000001e6f8df77989972328c927e5493db6908936a4ea001dc92fd67000000003d39100d0140000000000000009963075ba70a2e12fc28a44fbcd8269a6d7aa5c28bb04b1fee78a4ca101790ce655db8936f6415eb174ef4c3001d60f3027940b4d3a63cae96a10064a8fbd90a020000000125764380a6df1c9cad29a842a049f690ab0f08bc01dc92fd67000000003262960c014000000000000000037d1c3f08a2123cd657b66d5f45fa243a10974c3e05790011e55b1f8341a143d09e2aee702da5cda655341d66abaabac2cfa2967183c6816440011e774ac008020000000151b78fd2e37a2142b313f68a4edb31b23fe1afd101dc92fd6700000000d04b6a0e014000000000000000336c627bb6a6e4ff19b07a59a2723b2888e15df4e0b7fab8bb7fa671107c8f2679215fe05d8312d23046b3bebc3626147b29b3d3ed1dfd94154abdf139d78a0902000000018dabad1a71629e4938de8c44d0bd2f2ce1eabd0801dc92fd67000000000212500d014000000000000000b34e86aa00a35a43abc956f33e892d0f43c84c42f16481286742171de142d8e03b55d1a2f0951f88880a3e44a759f87fa6b02a852a39fb12e6f86b7e7929910202000000014e30f6a73766baa5fe6db7181b7fd08329c103e001dc92fd67000000002b3fe70c014000000000000000476d5062067a2742eb7543979abe75e3d4e73755e9dfa219e8c5390606efc3f605329b9a280800fcc4116b25c3f35af0e42486a11f217548897144d452ca1202020000000166439667823cf1cdefaf47d5ada806d462a6e05f01dc92fd6700000000f6cf1b0e014000000000000000cae2c478d899b4edfe2bfea4b07c7cd5000ed9e880d06d2c7819c0a5ec99597bd8d2e8696c9323d103324206815f36d69522454a30b918c8d2b7eabe10b773010200000001f70543a091a45a8c0de04e5ce9e40d9c16d980e101dc92fd67000000009965be0e014000000000000000f867b14f569c0f3e980f9b4e6380abf371299c4f5b3c4726019a8e9dc95828b75c79e6eb4ed72356b869ee5c38ef92ad3352cd3fce2bd1c7630d60ae1d6055020200000001b860c8e1ad41462d6352406b85260c9713418ffa01dc92fd6700000000d2d4940d0140000000000000002dd69cd319bf93ee6872a5b334ccd874e7cb6c69a88ecdea0d326d891f72d592a7ec3e7506370c7e08fecd7b497b0a808c2e3ef03efbb616fff6c1d3e9dd4b0e02000000016967de8bfc42a68d7c5eac521dd0099cea1fe23001dc92fd67000000007de8370e014000000000000000d52cc0093c6b434d47e574a9a169e6bfdb8626fa9bbb16e0c6172f82070da622a29f5e5ba46802a5040cb27566f47178f92dd1698a6e895d22fb668edfc2410902000000010d1df149a8579909fedf2111513c57897118b09e01dc92fd6700000000239d9c0f014000000000000000b7d87f76a8a17be02cbdcb9f8340fdc69d75990f9efa8870308dadb7a76c52e85ad0e002d8169e358a132ccbfa56d7fdb9d0f7af734b78f1600c0582d245c80e020000000102c375d9b259cdbb7b8a97d71b2a0a0dbed890e001dc92fd670000000043e5da0b014000000000000000caa495e3537821e927562a8b90cf867d5469a15525f06998b86040a314566b4a1b885a398a6609d7f0f3ecce7cd67a6865d039951f6c160bd7a929ad32e2350902000000015ade83d0ec62ab3eb6b023ff54c976eaf32e865501dc92fd670000000098662c0c014000000000000000d891d9c0ce85e7254bc1f54d8d99f2357d1bb760989c086eb30a9edc17f575565574eef88078e5b2c13dbea707222eef0e4a209688cb4c65b6653257f6abcc080200000001bfffeb9cee54c0e110a1761f9a646e4589ee6fc001dc92fd6700000000e7dec009014000000000000000f520f6b05e02c2c6ca1d45dd157f5b9f2be74e7667d6e34aa39bd1ae5cb9f46601ee0fd52688c0444458e231e65734fe4f35b1fc6beb30c317f2c71df351250c0200000001409d07de01ea2a63c779c0246562aa278a95611e01dc92fd67000000007f392e0e0140000000000000003481be5f776e2bb3c263e4b5e5a9ac3d06517b54bd5e34b2b90aba1366084f9821a73b5d21f59e49244758ef476fea38809c170619956e9658150016e17877050200000001a93fccc20939a8a0fecc48a9737402486bc41d5301dc92fd670000000053674a0e01400000000000000073b26ece239baf6b56c05a4f233771301ff8041b77b3d0e269766a845d4fa32eb2331e5e67ab4c9dc79a91ac330b0b96231f833aba18bcd407514dedd233330302000000019215b6b8ec64cb9e7b461c3945e6ce00da86f8f201dc92fd6700000000a41a2d12014000000000000000c42631b751a44c69b19fdd4c4a9ea49528f788f4b6394b83cf435eb3320aeeaffe453c999eb6dc5b2ce7ab93c1a1db1997797d745a4a01871b6ddc17177121060200000001cea4cde95b67ff91fd25ea77c3075944764754b601dc92fd67000000002fa2420f014000000000000000090cd7dfec7f68f35c5ec4b5ec7901ebdc724f292f5f8244725dd21f9e74fbc5a29575224b95055f2d4da96a1b61010cbed84db91904388ca091f8951de40f09020000000160131b8768de4f8a40aaa34a9f0d40be902807ae01dc92fd6700000000a25e870d014000000000000000e1494514195c9b6b0c66fe63a1cb4f6900b1352fd21bcf62ee7e758a62d71c19e9091db4a16641fd3db15fcd2cde519d9ab73ccbb2a12e14fdbf24c2dcc9360b020000000113247270303a9d66ea8ffa02614a8b5369adda5301dc92fd6700000000f4037b0d014000000000000000743a6b27b7d6ee0823d31ad2333ffde8508e1f32887cf423a0d834fe0157ef089784d4e1a248097d73f55541ac52f20652733f4f541a478b4b50304a5bcc3a0d0300000001349f27787689a635ffbe00e0dd66e848690a73f201dc92fd670000000014b1dd27014000000000000000b650e130849fec2bbe84fd100dad6e192dd4fa556ad4423be0308bc5358cae173fe186bfc458e04284a0863ce71630e03d2d3cbe55c3503435bcb0f54e5cc00f0200000001e71b23c378e4c465bfe96ad48e7f93f237e939dc01dc92fd6700000000b9fc8910014000000000000000fadcfde89d64078184d1d5f394ea7cef229deba4685848b0d121c76f0014ced8bdfd82984999d1c1c1cd7d513b86c48f271676fa069d8e4213e6af9de45d24060200000001c2989ed51e73b742e4991cf915d6339419657ad501dc92fd6700000000c993fc0d01400000000000000000cc9c46a2cf23aa55761d7007da4c11b839f412b6f9d00f7cb4631c2e3e9dd2a31ecb132389045874122d61d5e1db4111f7974f4b5b7f8d577f11c79d676a03020000000180f78edcdb53aa69dea3f482472027327f1acf0e01dc92fd6700000000b43e1c0d014000000000000000973741882a58558fc4d58d9910bbf6123188b8d0e1a800ff75076b876008e354b2dfe66a7141bbbadf5db7a033066cedde5c183caaa4c4896ce113d40c7a3107020000000169a300bbe8cba17536cdb4346c148d1dd7475c6d01dc92fd670000000056e1da0b014000000000000000096c8d242e02e346a857bac8d3a7a8a77720eb55f0c176684e10c72e06ce0845c5313983057ebe634ba0b017a02844744b8784dfb4794d1b811becd99031cf0702000000011b21f9bf3b9a650607cced8c0c2fbeca3211791b01dc92fd67000000001670aa0e0140000000000000006cf0177340ca51bff1a44175f6fa34d22a818fea0a0ab2462407098e54123649a525c1877cd60ba8990ef98f25bb108c6cd54e234858c72e1a7acbfa9218390602000000012c4e108c3f09cf9b8b1515d3b26d50e332d86e3b01dc92fd6700000000df8c7f0f0140000000000000003049221d183eaf44e8f2e7092e389fb991d3f86ecf53c8168e10b53ca9a11543e7ea2ad702dd4b763fc8efe47372c8623d3c404b697265908ffedbf35f441f040200000001300636fc6b27a7016f3aef03c231aa63163eeb5d01dc92fd6700000000132c110f014000000000000000ab4122abf322fcdd9f99b5c1aa72642d70b2d902069fc96e982be1d8a347b1449e09b165e176c363f016db5d7cfa8edcbd2e2b8660e4902a41901b2cfea04a00020000000137b7e284915654acc06e394fb423dcae6a4fd94f01dc92fd670000000051a44f11014000000000000000d32fcba7914db53c7acfe1f5afdb22d3cfc36e06c73fa8691abd693a584df5871e3250a930a07e5b3da3af1fb83c1f312547bab9acf6639b27b08abe1f80ba04020000000165c584027f5fd8349027fa5bf1d4ed3828c2905801dc92fd67000000001a2e5711014000000000000000380aac5d338a2161116a25013ef2d5e0a9367210211ce3c915cb279ae573f87b3cad0390d82819028e3ba3592315fb89e40cc58923fc67fdbe23d27a4d6b9d0260000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b1619030000000003b23becffffffff33ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000008e58ec0100000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff02000000003f6a50e8ffffffffc27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff02000000007a20e12700000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000cf9335ebffffffff2a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb0200000000a91ae20a0000000044c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000009cf493290000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb020000000083e0632800000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000e07798020000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000002804fce9ffffffffda37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000e3f1492100000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000006347d5f4ffffffffb03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f8fde0f0ffffffff5c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c831010000000001d87ee6ffffffff410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb731010000000036f60213000000006cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb43101000000002b27d0130000000053406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba4310100000000b87060160000000070dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e31010000000026b4310300000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc2839631010000000013096402000000003965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000c11fa60a00000000521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000bee5520c00000000e2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c310100000000912836e8ffffffff35f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000081f00e2d000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000b5f312e5ffffffff2a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d732310100000000928961e9ffffffffccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000a5a891e3ffffffff671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f3101000000007636fe2900000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000487aa2040000000077be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d310100000000a58ede2d000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d3101000000006839c72900000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000001f9e1cf7ffffffffa8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc63758600000000009f8a1d21000000007ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb1850000000000c2c802ffffffffff616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba38810000000000fc118e00000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000cfc0fbfcfffffffff42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f018208100000000002d2b4afcffffffffaea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c8100000000008bc03f0000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000068630be3ffffffff2888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db800000000000571cb8ebffffffff23df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d9800000000000e6366ce9ffffffffa9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d1800000000000540866e3ffffffffb8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000d87010e6ffffffff76f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000062dd302b000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000e2fd4e2ffffffffb44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c3800000000000845983e1ffffffff2ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c2800000000000cf47a4e1ffffffffdc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000a439bce0ffffffff60c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc0800000000000b2648ce0ffffffff2972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c08000000000006acca5e0ffffffff06be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf80000000000070c3312a000000009c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000e5d52c2a00000000466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000a8a60d2b00000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf80000000000069c8082b0000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf8000000000009256342b000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf8000000000003de4302a00000000f1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe8000000000000ae6fb2a000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c10f2a2a00000000913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008d60282a00000000a8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe80000000000057be282a00000000c4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005dae2c2a00000000d7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000ea7bfb2a0000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd01390000000000289aae2600000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a000000000050506efcffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d8902000000000048ad67e3ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000a9522edafffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ca0d16f4ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb0000000000004e9e690b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f6800000000000054476be1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000003125cdbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e00000000000041c5fad4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c146330000000000008fd8800f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e00000000000041b4ffbbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000666eac1200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df8430150700000000000013b41d09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b0500000000000035df0afdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af501040000000000006c9e7eafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e803000000000000a19ea3adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000007bcdda0700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000006083f70100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed9010000000000000b9cb10500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000055c5c06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f5909001000000000000e6b71b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000557c66afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d8100000000000000323089f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000850c090400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a000000000000001ac7900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000501065b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e0f383060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b00000000000000de189d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000529c7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f48010000000000000027327906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d70100000000000000aec98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da901000000000000006a3279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f12090100000000000000912979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000d50d79060000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb02000000003cb83d2c00000000f33bd74a0000000001010000000000000088e100000000000060000000000000003c70d8336dee739bdf2d1c5a0fca0a88b87b9a6d000000002000000000000000860e2c9b980d61bf53e1d582f789c35bedf4a252c4093e9392ba7516d9d505110b16190300000000285044100000000033ecd5899a91105bb4e51066eb138189bc3825ad00000000200000000000000075617111844fcc8c90a4fc121f2c37d19643667e868192690f2314bf14526ed4d60e0803000000004c5b9c2b00000000f2e6bb25d8d269c9737bd3789b11dc76c4fc56e70000000020000000000000000106edcb594c1e457564711c5bc0ba0182bc42131fc5a02105da76c3e624a76f74b1ff0200000000876ec71400000000c27b627c2fd11ee1e3e850738720692be2e3f4c6000000002000000000000000bee1e39ec395c97158a2dd51695f96c7e724da138ebdbf7f417c17bb3796726edc48ff020000000047a3a30900000000bb386aa0e7b37eb33516aebb58cae3574af85d1f0000000020000000000000007033e708beda4a88c330b82edb7286df02156fa71fa53152dc306298386d42ba6007fc0200000000bb10e418000000002a3d40c3e7ce8d6b55077335cab141c2e11ac254000000002000000000000000914426099b4fe08deae4590a68f553bd79ebdd4303ec6c2586719d917aac6db8557afb02000000004930e8edffffffff44c395a4a96c6d1a450ed33b5a8ddb359cefed36000000002000000000000000aba9508fec18359f9042ef73816a167d25dcc2740d1336f66bb1e7c96c8141fd5e68fb02000000003f01a00c0000000043804074334ac6111233037efe20105c516b0e9f000000002000000000000000e07a4ba0104afc6cdd71e063a03e195c109e332bf5e163c37a80ad67506a62fdc21bfb0200000000f25c890b00000000ec033669fe506006f870bd8b12cb524a3abc3693000000002000000000000000003c8c0c3b27c3ddcd7414aa5d195175e58c36789c8ad9b58a4275e09db8d099e40afb0200000000f8c99a300000000064cdacb04fb9c3b290579644f9edbd05cb00bb7d000000002000000000000000c9d641627d6eced574dfdcb08e243cad1c9c9d71dceb684ad74fb865a95a4156b300fb0200000000a6306c0f000000005295664886565f43a3074140551a755872bf6ffd0000000020000000000000006f7cb6f22bb847e20199220fc0903dd24eb2a9be6424f82f0d50a6727a5225c947fbfa02000000006185031800000000da37d2935eae0a92de55e86db2e887b4f18575f0000000002000000000000000c7b8b7b6b6cc2457c271bf5201f65b2fcb363350f4387438a6218ff839a4274909f3fa0200000000bff37c0400000000718160e3538e0b0ed83d3b3dc4ece83809fcd107000000002000000000000000bb1aed9ed9b0557ba3794a48f15243f4c8c6b9b176c69b589c71664f896496f9dff63401000000003ec7ed2300000000b03f0cb997f3428ef3968833bca2f2a4f613a8eb00000000200000000000000069f12605bf4bd86e48fda138649db87461446490efadd047f77a1ff23606bf6d3fe8320100000000f358a820000000005c78a0762f13b0b2a793e82d1a178eb45642234d000000002000000000000000b45c85f1255127cd73f4edaadb0cd9307522b76be00d68849efd9a2bf0920a82c2c83101000000007da7a51600000000410c1ebaf54c090f0a9132dfa9f79e0f480b2c060000000020000000000000006fbfe2d80362615ec2b5ad355b08c122e3799894f5a8c81c13af60909e1b057fccb73101000000006d2b58f8ffffffff6cc0a1531ff58d61dc9061c5b89bc0efc07911fc0000000020000000000000007eef62daf827c634f1036c88485a507519b226c7cbb79cf203e67b3628c32b7ebbb4310100000000076126f9ffffffff53406de83381dd804632447f1baed00cf28048e000000000200000000000000051f5b4a16dc3ba302181af9de097f591a9546b9754b2b1cb86d2d980df4ceac0cba431010000000044f5bbfbffffffff70dac78498afc6d766d860c433265a274d48b7d800000000200000000000000054393aab853ae377ef15a80742358da0a52a9ebea553734a068f444404b990346f9e3101000000003e558fe8ffffffffb41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7ffffffff3965c223e13ac66f8175c86e657d396c711964b7000000002000000000000000238dd24b92eb981a83414440555ca2b18c57dcb8be9982bb3fb4a28fafb26081ff93310100000000093807f0ffffffff521d2a344e322b8ba76401c833a1ec74ea2bd07500000000200000000000000007375d930bcce7b8cd22c03b4f15324bcc0b2d24db0e96bc201aa21b2f8b6b11454a310100000000c878ccf1ffffffffe2fc4df9e7870fc8238136faca07a120cc078a0c000000002000000000000000d5348d0cfd3cd3172271c08714ead78550755c10cf495c0c2bce65abf1f4742f513c31010000000092998b180000000035f6c0359084c37ef6eb4061b694386910093b9900000000200000000000000001ab6e5d364ec005a1b9f0c98915e4ac371ef63795bdb7193a1b2ec3a7be80d3e33631010000000015f38e12000000001b03ab3c744545b281d224127708a9ec7487e58c00000000200000000000000062180dafc3a23d1cd22353326ea81165fdf25983c6332eef34fc52cec7d116b1fc32310100000000ef7d6b15000000002a1b3fee6b29ea1828d427f0e5c3887cb7e644870000000020000000000000005864bae0684d55cb11a12b90d20d7e895681a7b09e41a21348f22a0fec5c5003d7323101000000001520ba1900000000ccb2909dcd316fc5e738dcdb1f14360f04b4432000000000200000000000000047e6a0a47a0e0d5192a12de2ff570cde4803ea56d92a625660b70f5559949fc47e2f310100000000b55beb1300000000671d816776e8c7fae18dc122fb6dc231956c6d48000000002000000000000000c5a7c8e603d9105bbb89f1a92dfb12e956e42ef13a3cbb045c49d0c354d0027d612f31010000000034b7800f00000000188f984567f5c6426386127b6fba27cb59684dc200000000200000000000000069d38fcce468d11594da7b380ba73cfb74d834d0315e9dd1e9672fe5db773652592f310100000000aefd24eaffffffff77be23139b650d69ede7985b31fd7b1cee9ca7d3000000002000000000000000ecba829b58afc1162afd916b741555d236a2b419b5b9bffb039b0fb283531798f82d31010000000040876113000000001a4b644c16a4a1904618f8d3c0f6a6722303839000000000200000000000000089f54396f3f6cd2cd33fee29702320a549b669139a915f1b8c5b6ae8518a4593ea2d310100000000a9364a0f00000000c268fe001a533b6f0860167381384363a790fd0d00000000200000000000000023c4c17b424e7ae26cb0d6ce2c60b27abd22303973e888ff39c0319821294bf1b1bdbe00000000004dde9e0200000000a8a2bf2709ca05755f881ebd939991aea9f88cf1000000002000000000000000b2b729b9af71db32b6c5b1ed5dbd44fcbea52514e7ede8498209e570188210fc6375860000000000c09078f4ffffffff7ea986d8723587f5e653c0df785fcfce39238785000000002000000000000000001484953fca1ecc45179bb96f9852f0b8434b7d15b1279edd5d6e6404ba27cc3bb18500000000001e2c761d00000000616a45478336b92583cfe29e8ee942802de69eae0000000020000000000000005d5c25e4c750c38e32ab492f4d0d96d4e2ad1673b9fd9f6c9d393ed932343e14ba388100000000002d787d20000000009407fa25941c932473f8e2b1ecc5481e3ae15a71000000002000000000000000b912dda2047d6026450945e0803a4aa8f26745dd539f9dbeb708809e4bc2df39e22c810000000000b815ef1c00000000f42c7e49df4f4d0993237959518415e4737923920000000020000000000000001d2ecf9de5c7c78a773f0e3f4dfde4f1daaaab7cc0f39b609ad0f665adb395f0182081000000000028bf411c00000000aea26001de9b15d4dad32808712864e61ae52a1700000000200000000000000046d3d7b0a4adfbe4ffbf45eaaf4e2bada39701d41c6422e9cf9438ef8126b51caf0c81000000000063c63d2000000000fbc2a3f682b507f1a3a5d4c44c8cbb6af08602960000000020000000000000002d6384b5cd3482006da1c8c968a6cd43602b649303e4869843f6bf6a045a70f197ed80000000000038bc1303000000002888677e39e38bf4ee64081bd43776fb4d507fcb000000002000000000000000061caf848751b3590ab6f2c82d0ae3041f2831c8920dd62c4f556bd8d7a25e7fd8db8000000000009259c60b0000000023df4a8418762cea4d24b7227ad125df76d2baf6000000002000000000000000d9efcd0e389b4f8045a327d3e66cb2ccc206a433c08878de2c23574a3ebf3b0d13d98000000000008a5f7b0900000000a9c7a884bd7d6e799ef5311bf9168e0105bce41600000000200000000000000015dceda598a86558fe610d1de4908765605e860485b96ae31bc0ca9918303511f9d18000000000009a8c770300000000b8f9204a348e0dbc85abe5bc98936d6b84c01e450000000020000000000000002f66263f9e4c3013dc6ee70eaa4599f0ee579b0b7f9d047d280067e5644d0bb2e7cd800000000000184f23060000000076f6dd3f07bf2e9ff5b0a188bc08d5a4efcf40d900000000200000000000000051c090dd4b573e3c85e64e3e28ca276969d0db6bed959aba0dfca09e6693a7d610c780000000000012c56e00000000009fee83fbf0bd5a4d71519efc16d0d438c203dd5a000000002000000000000000b0825c5296bc275ff8aa85da674b5b60d1248d25b6e40277d4bb2e8846128af52ac68000000000000f9fe90200000000b44fc7d70708095fbc30af164410749483f96439000000002000000000000000ea7995131ac44f490378f1856438db362ae42cec3448ab98807b2f9fec37d83603c380000000000078d59901000000002ab301f354a74f45afb347b2c00cdceb09cc719d000000002000000000000000a854a7beb6315a04473d6cf8db85d164e8829595e31e80d006fd423100d2effad8c28000000000000ad2ba0100000000dc0802ad3262ecd784ce339d87073c836e31c69e000000002000000000000000de67753135e4d339b16cab0f3408b5c6952fb792c9bb8c948c60ed5da0fb74a99cc0800000000000cb81d3000000000060c51d643048d0a426171bd0deabd1689a89690f0000000020000000000000005250093effb687e0a1946e6e61d6a356cdc4abebe9e7fd58f37568464eed47bb2bc08000000000005ed2a300000000002972b0df619f73d1a5c8933aff22ad8c9258f37000000000200000000000000036103ddb3cbaef3af1f92cb503b8ba10c22f10b24807bb3019121ea1069fd17a29c0800000000000c03abd000000000006be03f1b334fc3f7947d0d031f7dfa568005bd4000000002000000000000000467790623c59406b737d844edfc344c6256d82375a82ed5c8ab6f75d028b0f8777bf800000000000ed3072ffffffffff9c4cc8543dc684948490681118957942b29a920000000000200000000000000099085ce62420e9a6a0a825378bc6e0345af98e4edbef7dec7baed443b5e2cc6361bf800000000000b04a6dffffffffff466d1236b8c77925b25219e4ffe34dd069351847000000002000000000000000f697bd6971d3a3801c910dde4769878b12ea64b8c0c37e0e9f340b66d8a44b8758bf800000000000701e4e0000000000646d5c6384c84c2e660bf268d0a4ebc1ffbceea60000000020000000000000007cdf9ff876227fbe52357253549ad018e475f7bf7bbabd34d47cff554b3742044dbf800000000000d84349000000000002d49d26c87ed7dc1e38d7bfe5b7fcdf5a3a3164000000002000000000000000b381533900081f35b3a65e06ff0b208f97188090d90267008a63ae77955c31c43dbf80000000000051d77400000000003ce85b466ff74142307b4b03ddacf17a52d4637300000000200000000000000038f6ee432fb1ebfbe2aab2fb3dcdb514b44daaebc051e7a0252a29de6f7212171bbf800000000000467071fffffffffff1961eee75e5a1c8a11a5bf72fb368b990bdd28900000000200000000000000026b453d5a8f5d5ce66ae97ec87ffcf78a03e5c247ac25683800b01f9f7a0340bfebe800000000000b47b3c00000000005d673308ca2b45e5222303836d833e0f70b1f9b0000000002000000000000000f702393238df7999f3e68b59103f0a565a97444268bc0f03c58ac15888fb0044fdbe800000000000c0a56affffffffff913834357f92e577cdc02b1e682c65e86d016ae5000000002000000000000000193d69ab72d9f31cfc80d75679df1dd80248580790faa8711c108e95ddb89345fdbe8000000000008cf668ffffffffffa8f38fcb39b580c4b856dcaed882d504a216ee0000000000200000000000000029d6bfb6948ca60cc7d089935d047be4d4d4ebacbd0f5e21542b9c4f6cbef4a0fdbe800000000000565469ffffffffffc4ef42d72d69f4b58ffe2a58db1335269842ac430000000020000000000000003b0c9675aa48cc05af281072bcbbf66b9825eb20fa80aebb785cea7ff4ab9591fdbe8000000000005c446dffffffffffd7076d16c2e91e0eb16753575ac3cee3057781c0000000002000000000000000a701f0f8ef57d7bf01f1399a93805e94e0b3d1545bd859061d9cd64ab4bfa33bfdbe800000000000e9113c000000000001b2c0f03ba9b2f352a39bc45ce37aa2710b5af40000000020000000000000009b6110875f9cf79dcc82e63623e3b4f9aadf515804a79ed2ed1eeff143ac2e53bd013900000000006706c11300000000fbe1e3ed324fa17379403acfc3dd28fa882c6e6500000000200000000000000080f507fabe06cb3cf200b8b5f692f96221dd6d9c7054d14dabf69ea9030fa781ac690a0000000000343af9f8ffffffff43965a09c5be34d027a599bd6f450f5e6a13ddf7000000002000000000000000ea0ea17ea3caaaeb394412799c37d2e59c4708d650125f4ab827fe85b140a0957d89020000000000c70690e2ffffffffedd5716db0738cb0eecd0a04aeb186c4a46720e900000000200000000000000072b60871b477e866f772fda2ea3ea2b83a331d29a0e5d616fdeedd3add31460ca4c4010000000000350898d9fffffffff8260be47a1c7d42bbd9a656bdf8e3d3f28cbab2000000002000000000000000b4f7c002e2ccd4d414be2ea89f3d9ba621054349d2d06f871feb624d40fbe0640c41010000000000ce74abf3ffffffffe6f8df77989972328c927e5493db6908936a4ea00000000020000000000000006197adf6d1fea4b71af280d08cf06a25dbc2a12a9f77e23b0009387304782de9a5eb00000000000085601b0b0000000025764380a6df1c9cad29a842a049f690ab0f08bc000000002000000000000000b119be04c77200537989f31794a527ed5b699064ea09236403dff00d03f2f92f8f68000000000000d98f48e1ffffffff51b78fd2e37a2142b313f68a4edb31b23fe1afd100000000200000000000000046a6a52ea5dd0f7214a29e7c92ca575da79e26f861fe53b5ae84db2cf420c254905900000000000033553edbffffffff8dabad1a71629e4938de8c44d0bd2f2ce1eabd080000000020000000000000004b24aadd2b8b16c8e686a4cec6d350c01b8777fc655818a990708afe7bc771351c3e000000000000f525e6d4ffffffff4e30f6a73766baa5fe6db7181b7fd08329c103e0000000002000000000000000a84f7bad047d6f18373e8410373ad6ee38e20df85446ddb5d8b8e1e0db6142c1463300000000000051d26f0f0000000066439667823cf1cdefaf47d5ada806d462a6e05f00000000200000000000000075b96c2fd3bf61720acf96ef8d9a3aee11d4cee7e51d7793cd68bf66295c60527c2e0000000000001545f0bbfffffffff70543a091a45a8c0de04e5ce9e40d9c16d980e1000000002000000000000000ae45dc59a343d10c19d36882a137a4f131f355b054d9c934a158b456e84af44f0221000000000000bc78a11200000000b860c8e1ad41462d6352406b85260c9713418ffa000000002000000000000000a43051727b37efe109f58c37356e78cd4a6c8659b8cac549998a8630f0df843015070000000000001a5a1b09000000006967de8bfc42a68d7c5eac521dd0099cea1fe230000000002000000000000000516be1ae9b9994b43b98613f3b0c24c3761d051aa27a0c9dc923fd60f3e617328b050000000000000e0809fdffffffff0d1df149a8579909fedf2111513c57897118b09e00000000200000000000000079d419d4cdd176f50d166cd016c3d7ff910ef6c9db51194bc9c8a6e54a584af50104000000000000174a7dafffffffff02c375d9b259cdbb7b8a97d71b2a0a0dbed890e00000000020000000000000005bed2f1bc08c7a9b46d8973aae006b54901dd00a74b2534b28e987d950f30341e8030000000000009952a2adffffffff5ade83d0ec62ab3eb6b023ff54c976eaf32e865500000000200000000000000047a58162ddcb35c8fd68f1f36f8b8fcd86ef8eb36013d86bd25912048b7c792460030000000000009baed90700000000bfffeb9cee54c0e110a1761f9a646e4589ee6fc0000000002000000000000000c073ae562642e4be9f84ead8cc50c0c7dc920b618e5bad629babbf98ffd4ae1df1010000000000005bdef60100000000409d07de01ea2a63c779c0246562aa278a95611e000000002000000000000000e90018fbdc1b1cbeb1d89457ebbcbcf8eea2615683e3401a00bdeceb0d16c84ed901000000000000fefeb00500000000a93fccc20939a8a0fecc48a9737402486bc41d53000000002000000000000000ef67a6569b62e1f189982471ebd2ed120a18e15707dbe0a9257085e2bd144f1dac01000000000000e9cd5b06000000009215b6b8ec64cb9e7b461c3945e6ce00da86f8f2000000002000000000000000427839a58cc1593a2e40ad449cb43155f7ed292a3c0e5398c9d22ea3c026f590900100000000000016331b0700000000cea4cde95b67ff91fd25ea77c3075944764754b6000000002000000000000000d9d7fdfbee4ba7e247253aeb6faab2fd6e46b349ee7502c37f93588e43f2a4f9fe00000000000000ff2766afffffffff60131b8768de4f8a40aaa34a9f0d40be902807ae000000002000000000000000abeb97145ce1a283bdcc667645304de4ed529348748eb1d6e3c61a5e7a19b89d81000000000000005d0589f1ffffffff13247270303a9d66ea8ffa02614a8b5369adda53000000002000000000000000b84ea7d385787015dff693a22044faf6a0cab48af1a877495eacab1d6b7859717200000000000000abe6080400000000349f27787689a635ffbe00e0dd66e848690a73f2000000002000000000000000c74711e51b16a97d2b16139604ac68f9c241f5393a53cbcf757d9b142fb4da4a3a00000000000000d8b3900600000000e71b23c378e4c465bfe96ad48e7f93f237e939dc0000000020000000000000000004ed503ba91e4b03603d4cd037b919dbe815c50b403a25d175926683adde541f00000000000000050665b2ffffffffc2989ed51e73b742e4991cf915d6339419657ad5000000002000000000000000c0537de09cd816e67d622c910a84fbaf8ae77e855a3e228356631886c2a7efba1b00000000000000e9ea83060000000080f78edcdb53aa69dea3f482472027327f1acf0e000000002000000000000000670a0d979a69fc78d59425442aba3548f2886fa68b4c783cab77a03405f3dbae0b0000000000000037159d040000000069a300bbe8cba17536cdb4346c148d1dd7475c6d0000000020000000000000006dafaf75f255ac071b403605b4fecde07eb28300943f29c7f04acc720561a30d0200000000000000a89b7906000000001b21f9bf3b9a650607cced8c0c2fbeca3211791b0000000020000000000000006232324245cf914e074d45c3ef80c6c135e4d5aa64b9edf9474022b29b9f1f480100000000000000d2317906000000002c4e108c3f09cf9b8b1515d3b26d50e332d86e3b0000000020000000000000005887c3659bf7d4e9c90d4bf9651efcfc72e8cde419112a0360a71b26c728c5d7010000000000000059c98fadffffffff300636fc6b27a7016f3aef03c231aa63163eeb5d00000000200000000000000082bb8244f020803ce4b9f1e1749f878da3b64e9ffe521b4bb35b89c124be7da90100000000000000153279060000000037b7e284915654acc06e394fb423dcae6a4fd94f000000002000000000000000f189d1f576bf07d58fdb4d4b138b434ed30a627cd6e4e4e947362ff4fb6f120901000000000000003c2979060000000065c584027f5fd8349027fa5bf1d4ed3828c29058000000002000000000000000731048e047fb31f01277508ec27d9eaa0568a0fd10a76783425b3fa6fedd31af0100000000000000800d790600000000b41ef50272a7a2398ba617d3c963986ebebc5b2d0000000020000000000000001a9acf9916b1e429c5bc5b12f5fea61acb5fef345712f25d12806ebc4369fdc28396310100000000874bc4e7fffffffff33bd74a00000000" ); let header = Header::decode_as::(&bz).unwrap(); diff --git a/lib/tendermint-verifier/Cargo.toml b/lib/tendermint-verifier/Cargo.toml index 9777133276e..2e81896d951 100644 --- a/lib/tendermint-verifier/Cargo.toml +++ b/lib/tendermint-verifier/Cargo.toml @@ -2,11 +2,11 @@ name = "tendermint-verifier" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true @@ -26,5 +26,9 @@ thiserror = { workspace = true } unionlabs = { workspace = true } [dev-dependencies] -ed25519-dalek = { workspace = true, features = ["default", "batch"] } +ark-serialize = "0.5.0" +cosmwasm-std = { workspace = true, features = ["cosmwasm_2_1"] } +ed25519-dalek = { version = "2.1.0", features = ["batch"] } serde_json = { workspace = true } + +ark-bls12-381 = { version = "0.5.0" } diff --git a/lib/tendermint-verifier/src/error.rs b/lib/tendermint-verifier/src/error.rs index b4d2e4412fd..aaab055278e 100644 --- a/lib/tendermint-verifier/src/error.rs +++ b/lib/tendermint-verifier/src/error.rs @@ -5,8 +5,10 @@ use unionlabs::{ primitives::{H160, H256, encoding::HexUnprefixed}, }; -#[derive(Debug, Clone, PartialEq, thiserror::Error)] +#[derive(Debug, thiserror::Error)] pub enum Error { + #[error("client specific")] + ClientSpecific(#[source] Box), #[error("integer overflow")] IntegerOverflow, // TODO: More descriptive message and name @@ -17,14 +19,16 @@ pub enum Error { #[error("headers must be adjacent")] HeadersMustBeAdjacent, #[error( - "header with the timestamp ({header_timestamp}) is expired (trusting period {trusting_period})" + "header with the timestamp ({header_timestamp}) is \ + expired (trusting period {trusting_period})" )] HeaderExpired { trusting_period: Duration, header_timestamp: Timestamp, }, #[error( - "untrusted ({untrusted_header_chain_id}) and trusted header ({trusted_header_chain_id}) chain id mismatch" + "untrusted ({untrusted_header_chain_id}) and trusted \ + header ({trusted_header_chain_id}) chain id mismatch" )] ChainIdMismatch { untrusted_header_chain_id: String, @@ -38,14 +42,16 @@ pub enum Error { commit_hash: H256, }, #[error( - "trusted header height ({untrusted_header_height}) cannot be greater than or equal to the untrusted height ({untrusted_header_height})" + "trusted header height ({untrusted_header_height}) cannot be greater \ + than or equal to the untrusted height ({untrusted_header_height})" )] UntrustedHeaderHeightIsLE { untrusted_header_height: i64, trusted_header_height: i64, }, #[error( - "trusted header timestamp ({untrusted_header_timestamp}) cannot be greater than or equal to the untrusted timestamp ({untrusted_header_timestamp})" + "trusted header timestamp ({untrusted_header_timestamp}) cannot be greater \ + than or equal to the untrusted timestamp ({untrusted_header_timestamp})" )] UntrustedHeaderTimestampIsLE { untrusted_header_timestamp: Timestamp, @@ -69,7 +75,10 @@ pub enum Error { max_clock_drift: Duration, timestamp: Timestamp, }, - #[error("next validators hash ({next_validators_hash}) of the trusted header does not match the adjacent header's validators hash ({validators_hash})", next_validators_hash = serde_utils::to_hex(next_validators_hash), validators_hash = serde_utils::to_hex(validators_hash))] + #[error( + "next validators hash ({next_validators_hash}) of the trusted \ + header does not match the adjacent header's validators hash ({validators_hash})" + )] NextValidatorsHashMismatch { next_validators_hash: H256, validators_hash: H256, @@ -79,7 +88,8 @@ pub enum Error { #[error("commit height ({commit_height}) does not match the expected height ({height})")] InvalidCommitHeight { commit_height: i64, height: i64 }, #[error( - "commit block_id ({commit_block_id:?}) does not match the expected block id ({block_id:?})" + "commit block_id ({commit_block_id:?}) does not \ + match the expected block id ({block_id:?})" )] InvalidCommitBlockId { commit_block_id: Box, diff --git a/lib/tendermint-verifier/src/types.rs b/lib/tendermint-verifier/src/types.rs index 4c2897fa883..792041a7daa 100644 --- a/lib/tendermint-verifier/src/types.rs +++ b/lib/tendermint-verifier/src/types.rs @@ -1,18 +1,52 @@ -use cometbft_types::crypto::public_key::PublicKey; +use cometbft_types::{ + crypto::public_key::PublicKey, + types::{canonical_vote::CanonicalVote, commit_sig::CommitSigRaw}, +}; +use unionlabs::{google::protobuf::timestamp::Timestamp, primitives::H160}; -pub trait HostFns { - fn verify_signature(&self, pubkey: &PublicKey, msg: &[u8], sig: &[u8]) -> bool; +use crate::error::Error; - fn verify_batch_signature(&self, pubkeys: &[PublicKey], msgs: &[&[u8]], sigs: &[&[u8]]) - -> bool; +pub struct ValidatorSig { + pub validator_address: H160, + pub timestamp: Timestamp, + pub signature: Option>, } -pub struct SignatureVerifier { - pub verifier: V, -} +pub trait Verification { + type Error: Into; + + /// The proto type for `CanonicalVote`. This must be the exact type that is proto encoded + /// and signed in the consensus algorithm. + type CanonicalVoteProto: From + prost::Message; + + /// This filter is being used during the signature verification and voting power checking loop. + /// This filter should filter out all of the non-voters and abstains. + /// + /// Return: + /// - `Err` to abort the verification entirely, + /// - `Ok(None)` to continue with the next iteration in the loop and filter out the signature. + /// - `Ok(Some(..))` to process the signature. The expected return values are (validator_address, timestamp, signature), + /// if the signature check is aggregated such as BLS, you can return the `signature` as `None` so that + /// `process_signature` won't be called but the voting count will be processed. + fn filter_commit(&self, commit_sig: &CommitSigRaw) + -> Result, Self::Error>; + + /// On every iteration of the verification loop, if the `filter_commit` returns `Ok(Some(..))` with the signature value + /// `Some(..)`, this function is being called to be able to process the signature. For example, for the case where you do + /// ed25519 signature verification one by one, you should do the signature check in this function for every signed validator. + /// But when it's the verification is batched, you should save the given values for later to check the signature. For the case of + /// signature aggregation where there is only a single - aggregated - `msg` and `signature`, this function will only be called once + /// at the `Commit` that holds the `signature`. Returning `Some(..)` as the signature in `filter_commit` triggers this to be called. + fn process_signature( + &mut self, + public_key: PublicKey, + msg: Option>, + signature: Option>, + ) -> Result<(), Self::Error>; -impl SignatureVerifier { - pub fn new(verifier: V) -> Self { - Self { verifier } - } + /// After the loop finishes, we are providing a way for the light clients to do batched or aggregated signature verification. + /// But they can also choose to implement this as noop if they don't need it. + /// + /// IMPORTANT NOTE: Reset the inner values if you save any intermediate states, so that this type can be reused by the verifier. + fn finish(&mut self) -> Result<(), Self::Error>; } diff --git a/lib/tendermint-verifier/src/utils.rs b/lib/tendermint-verifier/src/utils.rs index da989d2224f..5646de592d4 100644 --- a/lib/tendermint-verifier/src/utils.rs +++ b/lib/tendermint-verifier/src/utils.rs @@ -1,11 +1,9 @@ use cometbft_types::types::{ - block_id::BlockId, canonical_block_id::CanonicalBlockId, - canonical_part_set_header::CanonicalPartSetHeader, canonical_vote::CanonicalVote, - commit::Commit, commit_sig::CommitSig, signed_header::SignedHeader, + canonical_block_id::CanonicalBlockId, canonical_part_set_header::CanonicalPartSetHeader, + canonical_vote::CanonicalVote, commit::Commit, signed_header::SignedHeader, signed_msg_type::SignedMsgType, simple_validator::SimpleValidator, validator::Validator, validator_set::ValidatorSet, }; -use prost::Message; use unionlabs::{ encoding::{EncodeAs, Proto}, google::protobuf::{duration::Duration, timestamp::Timestamp}, @@ -14,45 +12,42 @@ use unionlabs::{ use crate::{error::Error, merkle::calculate_merkle_root}; -pub(crate) fn canonical_vote( +/// Calculate the [`CanonicalVote`] bytes for the provided CommitSig. +/// +/// # Errors +/// +/// This function assumes that `commit_sig` is [`CommitSig::Commit`], and will fail otherwise. +pub fn canonical_vote_bytes + prost::Message>( commit: &Commit, - commit_sig: &CommitSig, timestamp: &Timestamp, chain_id: &str, ) -> Result, Error> { - let block_id = match commit_sig { - CommitSig::Absent => BlockId::default(), - CommitSig::Commit { .. } => commit.block_id.clone(), - CommitSig::Nil { .. } => BlockId::default(), - }; - - Ok( - Into::::into(CanonicalVote { - ty: SignedMsgType::Precommit, - height: commit.height, - // roundabout way to go from i32 >= 0 to i64 >= 0 - round: i64::from(commit.round.inner()) - .try_into() - .expect("value is bounded >= 0; qed;"), // SAFE because within the bounds - block_id: CanonicalBlockId { - hash: block_id.hash.ok_or(Error::MissingBlockIdHash)?, - part_set_header: CanonicalPartSetHeader { - total: block_id.part_set_header.total, - hash: block_id - .part_set_header - .hash - .ok_or(Error::MissingBlockIdHash)?, - }, + Ok(CV::from(CanonicalVote { + ty: SignedMsgType::Precommit, + height: commit.height, + // roundabout way to go from i32 >= 0 to i64 >= 0 + round: i64::from(commit.round.inner()) + .try_into() + .expect("value is bounded >= 0; qed;"), // SAFE because within the bounds + block_id: CanonicalBlockId { + hash: commit.block_id.hash.ok_or(Error::MissingBlockIdHash)?, + part_set_header: CanonicalPartSetHeader { + total: commit.block_id.part_set_header.total, + hash: commit + .block_id + .part_set_header + .hash + .ok_or(Error::MissingBlockIdHash)?, }, - chain_id: chain_id.to_string(), - timestamp: *timestamp, - }) - .encode_length_delimited_to_vec(), - ) + }, + chain_id: chain_id.to_string(), + timestamp: *timestamp, + }) + .encode_length_delimited_to_vec()) } #[must_use] -pub(crate) fn get_validator_by_address<'a>( +pub fn get_validator_by_address<'a>( vals: &'a ValidatorSet, address: &H160, ) -> Option<(usize, &'a Validator)> { @@ -80,13 +75,10 @@ pub fn validators_hash(validator_set: &ValidatorSet) -> H256 { } #[must_use] -pub fn header_expired(_h: &SignedHeader, _trusting_period: Duration, _now: Timestamp) -> bool { - // TODO: Re-enable - // let Some(expiration_time) = h.header.time.checked_add(trusting_period) else { - // return false; - // }; - - // expiration_time <= now +pub fn header_expired(h: &SignedHeader, trusting_period: Duration, now: Timestamp) -> bool { + let Some(expiration_time) = h.header.time.checked_add(trusting_period) else { + return false; + }; - false + expiration_time <= now } diff --git a/lib/tendermint-verifier/src/verify.rs b/lib/tendermint-verifier/src/verify.rs index ea8536f6ba1..7245ae419fe 100644 --- a/lib/tendermint-verifier/src/verify.rs +++ b/lib/tendermint-verifier/src/verify.rs @@ -2,27 +2,21 @@ use std::collections::BTreeMap; -use cometbft_types::{ - crypto::public_key::PublicKey, - types::{ - block_id::BlockId, commit::Commit, commit_sig::CommitSig, signed_header::SignedHeader, - validator_set::ValidatorSet, - }, +use cometbft_types::types::{ + block_id::BlockId, commit::Commit, signed_header::SignedHeader, validator_set::ValidatorSet, }; use tendermint_light_client_types::Fraction; -use unionlabs::{ - google::protobuf::{duration::Duration, timestamp::Timestamp}, - primitives::H160, -}; +use unionlabs::google::protobuf::{duration::Duration, timestamp::Timestamp}; use crate::{ error::Error, - types::{HostFns, SignatureVerifier}, - utils::{canonical_vote, get_validator_by_address, header_expired, validators_hash}, + types::{ValidatorSig, Verification}, + utils::{canonical_vote_bytes, get_validator_by_address, header_expired, validators_hash}, }; +/// Reference implementation: #[allow(clippy::too_many_arguments)] -pub fn verify( +pub fn verify( trusted_header: &SignedHeader, trusted_vals: &ValidatorSet, // height=X or height=X+1 untrusted_header: &SignedHeader, // height=Y @@ -31,9 +25,9 @@ pub fn verify( now: Timestamp, max_clock_drift: Duration, trust_level: &Fraction, - signature_verifier: &SignatureVerifier, + signature_verifier: &mut V, ) -> Result<(), Error> { - // check adjacency in terms of block(header) height + // check adjacency in terms of block (header) height if untrusted_header.header.height.inner() != trusted_header .header @@ -78,8 +72,10 @@ pub fn verify( /// /// maxClockDrift defines how much untrustedHeader.Time can drift into the /// future. +/// +/// Reference implementation: #[allow(clippy::too_many_arguments)] -pub fn verify_non_adjacent( +pub fn verify_non_adjacent( trusted_header: &SignedHeader, trusted_vals: &ValidatorSet, // height=X or height=X+1 untrusted_header: &SignedHeader, // height=Y @@ -88,7 +84,7 @@ pub fn verify_non_adjacent( now: Timestamp, max_clock_drift: Duration, trust_level: &Fraction, - signature_verifier: &SignatureVerifier, + signature_verifier: &mut V, ) -> Result<(), Error> { // We only want this check to be done when the headers are not adjacent if untrusted_header.header.height.inner() @@ -137,14 +133,15 @@ pub fn verify_non_adjacent( Ok(()) } -pub fn verify_adjacent( +/// Reference implementation: +pub fn verify_adjacent( trusted_header: &SignedHeader, untrusted_header: &SignedHeader, // height=Y untrusted_vals: &ValidatorSet, // height=Y trusting_period: Duration, now: Timestamp, max_clock_drift: Duration, - signature_verifier: &SignatureVerifier, + signature_verifier: &mut V, ) -> Result<(), Error> { if untrusted_header.header.height.inner() != trusted_header @@ -191,13 +188,16 @@ pub fn verify_adjacent( Ok(()) } -pub fn verify_commit_light( +/// Reference implementation: +/// +/// Note that this does not include the caching logic. +pub fn verify_commit_light( vals: &ValidatorSet, chain_id: &str, block_id: &BlockId, height: i64, commit: &Commit, - signature_verifier: &SignatureVerifier, + signature_verifier: &mut V, ) -> Result<(), Error> { verify_basic_vals_and_commit(vals, commit, height, block_id)?; @@ -207,43 +207,14 @@ pub fn verify_commit_light( .ok_or(Error::IntegerOverflow)? / 3; - let filter_commit = - |commit_sig: &CommitSig| -> Result)>, Error> { - match commit_sig { - CommitSig::Commit { - validator_address, - timestamp, - signature, - } => Ok(Some(( - *validator_address, - *timestamp, - signature.clone().into_vec(), - ))), - _ => Ok(None), - } - }; - - if should_batch_verify(commit.signatures.len()) { - verify_commit_batch( - chain_id, - vals, - commit, - voting_power_needed, - filter_commit, - true, - signature_verifier, - ) - } else { - verify_commit_single( - chain_id, - vals, - commit, - voting_power_needed, - filter_commit, - true, - signature_verifier, - ) - } + verify_commit( + chain_id, + vals, + commit, + voting_power_needed, + true, + signature_verifier, + ) } fn verify_basic_vals_and_commit( @@ -276,12 +247,15 @@ fn verify_basic_vals_and_commit( Ok(()) } -pub fn verify_commit_light_trusting( +/// Reference implementation: +/// +/// Note that this does not include the caching logic. +pub fn verify_commit_light_trusting( chain_id: &str, vals: &ValidatorSet, commit: &Commit, trust_level: &Fraction, - signature_verifier: &SignatureVerifier, + signature_verifier: &mut V, ) -> Result<(), Error> { // SAFETY: as u64 is safe here since we do `abs` which makes it always positive let total_voting_power_mul_by_numerator = vals @@ -291,131 +265,39 @@ pub fn verify_commit_light_trusting( .ok_or(Error::IntegerOverflow)?; let voting_power_needed = total_voting_power_mul_by_numerator / trust_level.denominator; - // only use the commit signatures - let filter_commit = - |commit_sig: &CommitSig| -> Result)>, Error> { - match commit_sig { - CommitSig::Commit { - validator_address, - timestamp, - signature, - } => Ok(Some(( - *validator_address, - *timestamp, - signature.clone().into_vec(), - ))), - _ => Ok(None), - } - }; - // attempt to batch verify commit. As the validator set doesn't necessarily // correspond with the validator set that signed the block we need to look // up by address rather than index. - if should_batch_verify(commit.signatures.len()) { - verify_commit_batch( - chain_id, - vals, - commit, - voting_power_needed, - filter_commit, - false, - signature_verifier, - ) - } else { - verify_commit_single( - chain_id, - vals, - commit, - voting_power_needed, - filter_commit, - false, - signature_verifier, - ) - } -} - -fn verify_commit_single( - chain_id: &str, - vals: &ValidatorSet, - commit: &Commit, - voting_power_needed: u64, - filter_commit: fn(&CommitSig) -> Result)>, Error>, - lookup_by_index: bool, - signature_verifier: &SignatureVerifier, -) -> Result<(), Error> { verify_commit( chain_id, vals, commit, voting_power_needed, - filter_commit, - lookup_by_index, - |pubkey, msg, signature| { - if signature_verifier - .verifier - .verify_signature(pubkey, &msg, signature.as_ref()) - { - Ok(()) - } else { - Err(Error::SignatureVerification) - } - }, + false, + signature_verifier, ) } -fn verify_commit_batch( +fn verify_commit( chain_id: &str, vals: &ValidatorSet, commit: &Commit, voting_power_needed: u64, - filter_commit: fn(&CommitSig) -> Result)>, Error>, lookup_by_index: bool, - signature_verifier: &SignatureVerifier, -) -> Result<(), Error> { - let mut pubkeys = Vec::new(); - let mut msgs = Vec::new(); - let mut signatures = Vec::new(); - verify_commit( - chain_id, - vals, - commit, - voting_power_needed, - filter_commit, - lookup_by_index, - |pubkey, msg, signature| { - // TODO(aeryz): ensure same key here - pubkeys.push(pubkey.clone()); - msgs.push(msg); - signatures.push(signature); - Ok(()) - }, - )?; - - if signature_verifier.verifier.verify_batch_signature( - &pubkeys, - &msgs.iter().map(AsRef::as_ref).collect::>(), - &signatures.iter().map(AsRef::as_ref).collect::>(), - ) { - Ok(()) - } else { - Err(Error::SignatureVerification) - } -} - -fn verify_commit, Vec) -> Result<(), Error>>( - chain_id: &str, - vals: &ValidatorSet, - commit: &Commit, - voting_power_needed: u64, - filter_commit: fn(&CommitSig) -> Result)>, Error>, - lookup_by_index: bool, - mut signature_handle: F, + signature_verifier: &mut V, ) -> Result<(), Error> { let mut tallied_voting_power: u64 = 0; let mut seen_vals: BTreeMap = BTreeMap::new(); for (i, commit_sig) in commit.signatures.iter().enumerate() { - let Some((validator_address, timestamp, signature)) = filter_commit(commit_sig)? else { + let Some(ValidatorSig { + validator_address, + timestamp, + signature, + }) = signature_verifier + .filter_commit(commit_sig) + .map_err(Into::into)? + else { continue; }; @@ -439,9 +321,18 @@ fn verify_commit, Vec) -> Result<(), Error>>( val }; - let vote_sign_bytes = canonical_vote(commit, commit_sig, ×tamp, chain_id)?; + if let Some(signature) = signature { + let vote_sign_bytes = + canonical_vote_bytes::(commit, ×tamp, chain_id)?; - signature_handle(&val.pub_key, vote_sign_bytes, signature)?; + signature_verifier + .process_signature(val.pub_key.clone(), Some(vote_sign_bytes), Some(signature)) + .map_err(Into::into)?; + } else { + signature_verifier + .process_signature(val.pub_key.clone(), None, None) + .map_err(Into::into)?; + } // If this signature counts then add the voting power of the validator // to the tally @@ -452,12 +343,15 @@ fn verify_commit, Vec) -> Result<(), Error>>( } } + signature_verifier.finish().map_err(Into::into)?; + Err(Error::NotEnoughVotingPower { have: tallied_voting_power, need: voting_power_needed, }) } +/// Reference implementation: fn verify_new_headers_and_vals( untrusted_header: &SignedHeader, // height=Y untrusted_vals: &ValidatorSet, // height=Y @@ -539,54 +433,225 @@ fn verify_new_headers_and_vals( Ok(()) } -fn should_batch_verify(signatures_len: usize) -> bool { - signatures_len >= 2 -} - #[cfg(test)] mod tests { use std::{fs, num::NonZeroU64}; - use ed25519_dalek::{Signature, Verifier, VerifyingKey}; + use cometbft_types::{ + crypto::public_key::PublicKey, + types::{block_id_flag::BlockIdFlag, validator::Validator}, + }; + use cosmwasm_std::{BLS12_381_G1_GENERATOR, Deps, testing::mock_dependencies}; use tendermint_light_client_types::Header; use super::*; + use crate::types::ValidatorSig; + + pub struct Ed25519Verifier<'a> { + deps: Deps<'a>, + pubkeys: Vec, + msgs: Vec>, + signatures: Vec>, + } + + impl<'a> Ed25519Verifier<'a> { + pub fn new(deps: Deps<'a>) -> Self { + Self { + deps, + pubkeys: Vec::new(), + msgs: Vec::new(), + signatures: Vec::new(), + } + } + } + + impl<'a> Verification for Ed25519Verifier<'a> { + type Error = EmptyError; + + type CanonicalVoteProto = protos::tendermint::types::CanonicalVote; - struct EdVerifier; + fn filter_commit( + &self, + commit_sig: &cometbft_types::types::commit_sig::CommitSigRaw, + ) -> Result, Self::Error> { + if commit_sig.block_id_flag == Into::::into(BlockIdFlag::Commit) { + let Some(timestamp) = commit_sig.timestamp else { + return Ok(None); + }; + let Some(signature) = commit_sig.signature.clone() else { + return Ok(None); + }; + + Ok(Some(ValidatorSig { + validator_address: commit_sig.validator_address.unwrap().into_encoding(), + timestamp, + signature: Some(signature.into_vec()), + })) + } else { + Ok(None) + } + } - impl HostFns for EdVerifier { - fn verify_signature(&self, pubkey: &PublicKey, msg: &[u8], sig: &[u8]) -> bool { - let PublicKey::Ed25519(pubkey) = pubkey else { - panic!("invalid pubkey"); + fn process_signature( + &mut self, + public_key: PublicKey, + msg: Option>, + signature: Option>, + ) -> Result<(), Self::Error> { + let (Some(msg), Some(signature)) = (msg, signature) else { + panic!("msg and signature must have been provided"); }; - let key: VerifyingKey = - VerifyingKey::from_bytes(&pubkey.as_ref().try_into().unwrap()).unwrap(); - let signature: Signature = Signature::from_bytes(sig.try_into().unwrap()); - key.verify(msg, &signature).is_ok() + + // TODO(aeryz): verify here + self.pubkeys.push(public_key); + self.msgs.push(msg); + self.signatures.push(signature); + + Ok(()) + } + + fn finish(&mut self) -> Result<(), Self::Error> { + let Ok(pubkeys) = self + .pubkeys + .iter() + .map(|pk| match pk { + PublicKey::Ed25519(pkey) => Ok(pkey.as_ref()), + _ => Err(()), + }) + .collect::, _>>() + else { + panic!("invalid pubkey type"); + }; + + let ret = { + let msgs: Vec<&[u8]> = self.msgs.iter().map(|x| x.as_slice()).collect(); + let sigs: Vec<&[u8]> = self.signatures.iter().map(|x| x.as_slice()).collect(); + + if self + .deps + .api + .ed25519_batch_verify(&msgs, &sigs, &pubkeys) + .unwrap() + { + Ok(()) + } else { + panic!("invalid signature") + } + }; + + self.pubkeys = Vec::new(); + self.msgs = Vec::new(); + self.signatures = Vec::new(); + + ret + } + } + + pub struct Bls12381Verifier<'a> { + deps: Deps<'a>, + pubkeys: Vec>, + msg: Vec, + signature: Vec, + } + + impl<'a> Bls12381Verifier<'a> { + pub fn new(deps: Deps<'a>) -> Self { + Self { + deps, + pubkeys: Vec::new(), + msg: Vec::new(), + signature: Vec::new(), + } } + } + + pub struct EmptyError; + + impl From for Error { + fn from(_: EmptyError) -> Self { + Error::SignatureVerification + } + } - fn verify_batch_signature( + impl<'a> Verification for Bls12381Verifier<'a> { + type Error = EmptyError; + + type CanonicalVoteProto = protos::cometbft::types::v1::CanonicalVote; + + fn filter_commit( &self, - pubkeys: &[PublicKey], - msgs: &[&[u8]], - sigs: &[&[u8]], - ) -> bool { - let mut signatures = Vec::new(); - let mut keys = Vec::new(); - - for (pubkey, signature) in pubkeys.iter().zip(sigs.iter()) { - let PublicKey::Ed25519(pubkey) = pubkey else { - panic!("invalid pubkey"); + commit_sig: &cometbft_types::types::commit_sig::CommitSigRaw, + ) -> Result, Self::Error> { + if commit_sig.block_id_flag == 4 { + let Some(signature) = commit_sig.signature.clone() else { + return Ok(None); }; - let key: VerifyingKey = - VerifyingKey::from_bytes(pubkey.as_ref().try_into().unwrap()).unwrap(); - let signature: Signature = - Signature::from_bytes(&<[u8; 64]>::try_from(*signature).unwrap()); - signatures.push(signature); - keys.push(key) + + Ok(Some(ValidatorSig { + validator_address: commit_sig.validator_address.unwrap().into_encoding(), + timestamp: Timestamp::default(), + signature: Some(signature.into_vec()), + })) + } else { + Ok(None) + } + } + + fn process_signature( + &mut self, + public_key: PublicKey, + msg: Option>, + signature: Option>, + ) -> Result<(), Self::Error> { + // TODO(aeryz): verify here + let PublicKey::Bls12_381(public_key) = public_key else { + panic!("invalid public key type"); + }; + self.pubkeys.push(public_key.into_vec()); + + if let Some(msg) = msg { + self.msg = msg; + } + + if let Some(signature) = signature { + self.signature = signature; } - ed25519_dalek::verify_batch(msgs, &signatures, &keys).is_ok() + Ok(()) + } + + fn finish(&mut self) -> Result<(), Self::Error> { + let pubkeys = self.pubkeys.iter().flatten().copied().collect::>(); + + let pubkey = self.deps.api.bls12_381_aggregate_g1(&pubkeys).unwrap(); + + pub const DST_POP_G2: &[u8] = b"BLS_SIG_BLS12381G2_XMD:SHA-256_SSWU_RO_NUL_"; + let hashed_msg = self + .deps + .api + .bls12_381_hash_to_g2(cosmwasm_std::HashFunction::Sha256, &self.msg, DST_POP_G2) + .unwrap(); + + let valid = self + .deps + .api + .bls12_381_pairing_equality( + &BLS12_381_G1_GENERATOR, + self.signature.as_ref(), + &pubkey, + &hashed_msg, + ) + .unwrap(); + + self.pubkeys = Vec::new(); + self.msg = Vec::new(); + self.signature = Vec::new(); + + if valid { + Ok(()) + } else { + panic!("invalid signature"); + } } } @@ -609,7 +674,33 @@ mod tests { numerator: 1, denominator: const { NonZeroU64::new(3).unwrap() }, }, - &SignatureVerifier::new(EdVerifier), + &mut Ed25519Verifier::new(mock_dependencies().as_ref()), + ) + .unwrap(); + } + + #[test] + fn verify_bera_works() { + let commits = r#"{"height":"3805039","round":0,"block_id":{"hash":"FCB377B5B317BBE949E06D676D79B5515012D852FF4AC2D7B20DA1C0441C9078","parts":{"total":1,"hash":"741065469F353605417CA88B80D536FC355FC3C533936B7B9E9861B4CCD02ED4"}},"signatures":[{"block_id_flag":4,"validator_address":"09C4AB26B20EF50B371EAF4CB006D6D5B72A53B9","timestamp":"0001-01-01T00:00:00Z","signature":"gCCadb8QHnhhHBCvwgsFO4Z36LlA6qF6NmLXgITBddwUmSjxG6s+uuNkQqSWo8CXBR58HCQkjqlFXYk27RRlVf3zbqP6cc94MtJL+XG2jyfaNkmJXgocdHRkp3l/7Yfq"},{"block_id_flag":5,"validator_address":"0EB600A5EB0DCCD405B3C71953C727975E39EDE4","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"17348776DE5BC1F4BE6F1DB84042DAC57D71C890","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"27219ACFC8E974C0DB5E137CC42E8427553802FC","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"5951C4349AB792BFB3A63956512663CC3B733D6E","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":6,"validator_address":"76D5AF272836142878B608C2125DCE729190EF5F","timestamp":"0001-01-01T00:00:00Z","signature":"tvEZ7g279H1n9IQ1K7Qj8xNdT7VEj7pl2qzEGZ0R8LRrYiZMZf2p5ZevC12T+/90AWdtOVoLZhv15y2/jMUUfdkQVh0idTiG3QdqCAtRjOXyKNnSQjHHg8paDrzBROZr"},{"block_id_flag":5,"validator_address":"8CAED645FC96CDA80F0217B018B2129481050AD9","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"9DB42D740B0D0C6A08543D679BF50CED94CA8E3C","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"CB1DCA2CBFD59BDE8B61C9FC95EEB65D0EDED2B3","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"D00F2981BCE83818D2EECFF87F85000DBDD0AF08","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"DD20845E62583B038100A652D5AA8611D9D4026E","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"310D164F10AAE6E85D6CD32CC64DDC2F48F5919B","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"5E1F812F4D7607E3E844D01862D32E9C1A956CB0","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"8B7419E9E076797E9F1C2160218DEE06B8B4478D","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"CAF0EAD038B1A2F9E8E2762999535BD85380C64E","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"D13490E5D3BE85D637544484AEBB970C47BA9844","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"7DF743C6CE84A99660FB91239E53754416943671","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"6B3D9D5DFE82E0BF52D6045DF17F16560A027717","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"C0B3BFA566E1CBB93BF8B358F29C8F7B10120987","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"EA9508CAB5DA1954EBE6CFD1425CF0E2D6EC4B0A","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"EACF2006E60A59979E5850B71702DDB354A2048B","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"901FB60F9AF7935456867CFC8355B70FA226A069","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"E37FB6E5CFCB23F8AA412A79D793C6A04F54747D","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"8C611647259F4440DF572119AFFA58148FFAE0D0","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"6D4649CD64A83E777CE89E0B268654E56DAC1F96","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"B29EA710A83B6D518A5566AC8AB90C2979CACC16","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"EFB1A37176B9D0252B10D7F56851E68CF096B5CA","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"90106A700F58A4BF7EBE5C083BDBBAF8A8761E5B","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"C52C7CDD8E64EF9581473E2AE286A96FB6A444A9","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"1ED255BA54A031E4ACE64B4AC9B0CD999AF1AB71","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"616EABCEC6FB0DB1AC54C5461D952BFB46B45819","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"06BC43DC34E9F52CFBBDAD93F9FA743BF5278E7F","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"2C1B7662D046B2FCAF685C804037D3FC728E9E80","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"4C79631C9E3BACA9D266C8FB3AD6A5304431D055","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"6DE14F6BCFECCE0F3F86936B6DB580258E542047","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"8F7E52CBD156EDD9317042F67AE7ABD1D64C9E19","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"B08ADE9A00DFC0A0EACB84BF579B6B6C0C32A645","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"AC26D89FB38D59464EE04CF66A44F24CE64DA7D4","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"0E1982A8083CF41A0B0CDF3CC1A42F5540FC211A","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"0634E825DCD51BF722CCF02086899CDE1E862E5A","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"19395121376B12A00F8C6AD5FE8C3AD9A77CBFC1","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"19D48D2EBF5A4D5C31228C47828BDF6BFDD7B77A","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"1D4DCFB35BE65B5E09C4270F0B4E3329F967B4E2","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"2FBB6C9798950CDE7647CB68602498874336999F","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"39CCAF0EB8D31A9592ABA51B6705ABBBFC38086C","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"3AECCB026FAEA18F43E79FE116CB1B94E768075C","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"41462F6C19492B6FF4F5FAF7D6ED16E1264D1AAE","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"45C2BA0FF19BCB262FA5713E993FBA4408258BC1","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"4D21CFCB799E0C9B66CE566F6AB68BCCCBC75FDA","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"4F5F37B9DB46C29C48C0B2231BEAD3E14F04CD1A","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"64703E2FCEA0339EDE427510BE1642F4E53FC4D0","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"65697A8BAA1891DC3D466DFEDBE51EAC264936B7","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"7299ADB3E975B1A7B461F45C4CCA6AFA39DBC9A7","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"8A93B739376EBA41191E593847B1C844E66F29CA","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"A49685C59E968B2B097B0CB09E8D08D6B7FCD69E","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"C9D2DCB223D4353076E6A0E7E82DD99E42980CCA","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"CCB476A8C39D26D81428AB9FBD848F9B17E1BCE0","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":1,"validator_address":"0000000000000000000000000000000000000000","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"E1E054EDC9AEBA25B10965C927AB35D173080DC9","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"F1D993F20EFE45757E62F9AEB6BB14B15DBF2AE2","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"F314C84E265C6CF2D834F0CAAD99900CF6857FB2","timestamp":"0001-01-01T00:00:00Z","signature":null},{"block_id_flag":5,"validator_address":"FDCD7DBB810E66664F7ACA241E05834DDB79A5E0","timestamp":"0001-01-01T00:00:00Z","signature":null}]}"#; + + let commit: Commit = serde_json::from_str(commits).unwrap(); + + let validators = r#"[{"address":"09C4AB26B20EF50B371EAF4CB006D6D5B72A53B9","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"GYrfc21g7s39OrUTaneaojI1xEu23gje8gafc+lG3pY7NaaNWmbWEdOnzUUDXcqPB0fd2AnTvyRiaUGJkKCh6KpDAzpactRmmYnvo4JwxQ5nPb6+DtlX257Z0rugRpPO"},"voting_power":"10000000000000000","proposer_priority":"41747661734825856"},{"address":"0EB600A5EB0DCCD405B3C71953C727975E39EDE4","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"DMq6EL3cM6T40qzdeFk4eahMdGb2QfHZtCOLIO4tBwaJSz5VsHRAmMULm0gh2jIHCWPtVaWPFUAJTGmJLQZbTELa/l4AWbGrMLOqm+guY0O7JOK0Q1uK2V/4Yx+rNqbn"},"voting_power":"10000000000000000","proposer_priority":"-84498120106402191"},{"address":"17348776DE5BC1F4BE6F1DB84042DAC57D71C890","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AxmTFc82689qULq1coANeTJINfroMqPakjjzmcOf7Oti3kEznqtMyPeabU5ry4JcBwfwjyj4XpnQKKrtRwjSm1tlH9mVBadyqvpmnnZAgjt4ZfivckaJSMESmI0DvB62"},"voting_power":"10000000000000000","proposer_priority":"81775085425086853"},{"address":"27219ACFC8E974C0DB5E137CC42E8427553802FC","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CL4Sa/2k7uGQ5sAaIkJy7XBkJIUeIDeRxyea7strUDBZkB2zWxgh8e/k5rRF9cyfCb8r27m45fmxOlvJdyOp3EEHEKj5tNDW7ZAyiTXWacPfQoEjXdFCtJefkKjrsqQ8"},"voting_power":"10000000000000000","proposer_priority":"97067641437565583"},{"address":"5951C4349AB792BFB3A63956512663CC3B733D6E","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"A/1TcQt1whFb0KrBKLc565+p4mJgPazfg0Awq7G/TIpsALtysxTBI9d/T/QM1NSaCgz/u+e0aLH/zEKYQWYVBMJAky+Kn4V3JX6562r5yJbCh0BqLLKStdeAXwGO0j+n"},"voting_power":"10000000000000000","proposer_priority":"28339985187565583"},{"address":"76D5AF272836142878B608C2125DCE729190EF5F","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"ENZKsqirm1+qzpIl0gXUfcC4FVWSs1S4YBNJKPfznxX1TZCdrXiXhoq6bcfn7vbIBGMvuu/gVTCx2/215AswF9h3d/vhW2QYp7qepQVoReY+tC8jmRFrRMziu9FXTwa1"},"voting_power":"10000000000000000","proposer_priority":"65205496556254427"},{"address":"8CAED645FC96CDA80F0217B018B2129481050AD9","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AMZzGA2XITwcNf479OaE3TU0uqsjWhBtH3G5yKN+TTegVtR1RpZP0HVQHf9/dq6vFLKigAhjoKUNHgk/f5ETVk8+0lbI0CIZjpoMPMvccy3PJJLkI+g4+Sein20ic9VY"},"voting_power":"10000000000000000","proposer_priority":"-33264807797728722"},{"address":"9DB42D740B0D0C6A08543D679BF50CED94CA8E3C","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"A9D5DN7arBRQyNwIz6ZErgL1kYVyBBwvyn34tVM2aCy17bzK3W53Ep3kJYROFH0CBYU5e8fS/pywwNjC9RqT+Pz/2yGRQA1Dy5mGRXivGiRggXVWcFQzFpHk7upct4tt"},"voting_power":"10000000000000000","proposer_priority":"-56680014812434417"},{"address":"CB1DCA2CBFD59BDE8B61C9FC95EEB65D0EDED2B3","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"B1qvACQbFMzYYXbkuu0XDfZzVSmv0POPAez+iBy7YTBYkioDcoFLln466eiA2IZYCmHfQwFI6sJ6I5mq51J8XQ8N527u4whQybgLSzHJTkSM2gH4YEyR6+SJGg+kEEp9"},"voting_power":"10000000000000000","proposer_priority":"-76633930138154254"},{"address":"D00F2981BCE83818D2EECFF87F85000DBDD0AF08","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"Eo1vZr/Zyx7xjaaEOtnbbBtux+MJNwXJUiTo8gIy8kPnpifQkUQ2DUwXddj6/bDnA/JGLBmsIamicyjCsL4MvoTBUfn94ddnaBx+2km5aN3YlrAJoyMCl9Zc+UTGDJjJ"},"voting_power":"10000000000000000","proposer_priority":"-83381022529458601"},{"address":"DD20845E62583B038100A652D5AA8611D9D4026E","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"DdyItadCEbgO0rjFFpuFOAt0KKiwozgaRHDVIgPrIw8Ta0IzcDCHgwgoZvcWsGZREGMouYVDoUvaengK/0FUQDjmn5/lYl+hhsgFxxtJ/EWOfL7qONECm8QugcEJv3dv"},"voting_power":"10000000000000000","proposer_priority":"97457724121395729"},{"address":"310D164F10AAE6E85D6CD32CC64DDC2F48F5919B","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"ARR8bFk4un80Qj+d1HO/exu4g27UftP/JYFGyU1vEK7XPLo7RmitvjLKC1OpkDTzGOPumIJ3lwQK8jBF5Y+b0uOWp47yBeZyEql707LzhRT4qub1/3AqLfMjd5+f4T6a"},"voting_power":"9790000000000000","proposer_priority":"-63433764812434417"},{"address":"5E1F812F4D7607E3E844D01862D32E9C1A956CB0","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BoiN9JHozNxbuUC53aUfp0SVGFk4IMnk6QM6e4f16fjeu7pqT2ghhxGJaQatQM5xAazPreAt/aV1OloZFFc/0QNG+6kw0IChtPokHBgI7HEaBsyo8bwBT+J18NBqK4Wx"},"voting_power":"9790000000000000","proposer_priority":"68687620967741936"},{"address":"8B7419E9E076797E9F1C2160218DEE06B8B4478D","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AVh1qeVU5Ebl/NRjJF9Ne9aGOxpfUdM6yCjQb5GFxXBfHQpEK1LfFC7nTzAKAVUfGcM1giQZ9YgK2zTle9nZL4io6j4IZA3pfmY499SXiitUhGbNgWjO/+viKcEuqO9v"},"voting_power":"8930000000000000","proposer_priority":"-43754260922728722"},{"address":"CAF0EAD038B1A2F9E8E2762999535BD85380C64E","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CtvLDZnq1Woaa03vYqJfZzoQ6FI43nfHQWjV5uwdjzqkRaIr6BITA3eFelhe77K+Ckujgf7wlApsmr7Z1NbRSPU8A/sEKf2+kWbSaxkfiDNyvzUjOFfdZaK3Qor8qH+0"},"voting_power":"8550000000000000","proposer_priority":"-17931687830727100"},{"address":"D13490E5D3BE85D637544484AEBB970C47BA9844","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CS6NIiXOvu0l5UpZ9BZ2EHBPxQcXCntlMlhP+n9mwd2iDIOi8Uj7X37GFPNA7bpgCLy/RoqOhDkPia56+7JXveQTHjfL3W9zv2JQBH2xGm1yHvYWQVbQ4K3ql1ANwsmt"},"voting_power":"8020000000000000","proposer_priority":"82756452934955051"},{"address":"7DF743C6CE84A99660FB91239E53754416943671","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AcyiCU8B/MVPHpG50DBnGG8fWm0YJvH32Kh344tR42UBChQMi6Wff6nt15p3MNSkBMH2W+Mnzqg2MN/twIwe53k/cuG6CNmmJdgggsdNwDeyJaCdHkWe+c/0bEhl5Ql0"},"voting_power":"5830000000000000","proposer_priority":"-95941687830727100"},{"address":"6B3D9D5DFE82E0BF52D6045DF17F16560A027717","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CVQ8PlAlGuNVg1SE+vfLONrPypQ7l/75ye4eRySCWKcZjaQXv4/Gdx+n7xaorewPA6MWfE1zpUqLp50ofSmffRye+02ysa4XXKq/r07bIEoSxRcdiciJUedqf9Zu/RL8"},"voting_power":"5000000000000000","proposer_priority":"-62470014812434417"},{"address":"C0B3BFA566E1CBB93BF8B358F29C8F7B10120987","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BkldPAKxkhY6aM0pIc/u+EruIBi/20n90AY9KPetB/UX9DJtHNUV9ImmawVxUllHF/xjqKxwyi5F7jJ/i7TOrETOLMaLmuNIUjum/1CRi5S+1wF49h1/ffIq+wM8wa0z"},"voting_power":"5000000000000000","proposer_priority":"-9746435261927391"},{"address":"EA9508CAB5DA1954EBE6CFD1425CF0E2D6EC4B0A","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BKz9OKE68SrdjYLh7whCxN/B5BdfrluKtzdw+QUMv2c8r9v22Ktnn+nqEyCPULSFBcIGg3QJemNkNX6NRC3eIJAWBFXm9D397gii7YgbT7F7Y/oDNTwOafCEkK8OzTOJ"},"voting_power":"3830000000000000","proposer_priority":"-101089772529458601"},{"address":"EACF2006E60A59979E5850B71702DDB354A2048B","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"E44iqd+KCVo1VMGn3qu54J+t27aoAcfT7+nWHzP58aLoChyouQkIsi5OS3phcVAFEkHG+D77FSkL809zVKWGPa4yUOmF7ttaFzOHpMQm2sXNHagm/nLvPm5zBczyHeQr"},"voting_power":"3760000000000000","proposer_priority":"7695279893597809"},{"address":"901FB60F9AF7935456867CFC8355B70FA226A069","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"Djs1vTeWUgGf6PNBxchUpg9VdyAWNAeB6NNXfisk4awNV4bUVFnNdWgQKB7/j3KcDNr+/Fkd0rMa7Zjs4scsaL58+bubCl1Ji0/AgpN2s1QHQgkJafb1i+f21BqLEgWB"},"voting_power":"3600000000000000","proposer_priority":"33489985187565583"},{"address":"E37FB6E5CFCB23F8AA412A79D793C6A04F54747D","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FQFQf2dyjsewkpa/h/StEzr496/ACSRyegmx3twXyahow22QnP9ocwwdpm3PwehiGKm45csmb6M6KRxwpc9w41CoJpIN2i42ISWBDVZx62bNxLO8rHREaAUcw5qILeNd"},"voting_power":"2020000000000000","proposer_priority":"-68703719844121513"},{"address":"8C611647259F4440DF572119AFFA58148FFAE0D0","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FmUrui8vO2tPz9/phH9qVgSWXQ66w3wfDDd02ghmFAq2lzT+7A6wdh+OCNgJyeErCHs8CzyRKqKZTJ1r+Hn7pqqGy1HIAvQmDjyol7e5ko8wxnN18g/39JYaNFBjyKRa"},"voting_power":"830000000000000","proposer_priority":"4388981404739276"},{"address":"6D4649CD64A83E777CE89E0B268654E56DAC1F96","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CcvVQsc3zKS8M/HqUISoV6diAEL+N/0ybs9a62HyzglgQ80O1XukRpPPYGl4tWa6ChoteymmyidJDvIhwfc5tC0qKT99EgDFeLf7D51W32CRqkXJC0wFdoKctjaYV48+"},"voting_power":"790000000000000","proposer_priority":"-120169737753461015"},{"address":"B29EA710A83B6D518A5566AC8AB90C2979CACC16","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"DQqUpaK7Aonrsk5zIz9a5lCNY1Ai2KEsafzpl5F4O9dqs/0ztjBKX+QrhSAdsS8YBFL+1YflGfaJhND6IMnH+jN6vxMEDxk4kP8BM1zj6IFc00w/ZGcfVAtFBxUrfkGw"},"voting_power":"750000000000000","proposer_priority":"4449985187565583"},{"address":"EFB1A37176B9D0252B10D7F56851E68CF096B5CA","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"C/ttnrB4Xle0Ps/93V2QY3XdYn5zOBN6d8AniO1tVpsaCY/ywkmadA44KTCzm85IEEyXRS8b2Cf4xmF3Qspk7r9eoKF851rmJoyQeR46cnf9ovw+d5VvfZFm0xotvite"},"voting_power":"750000000000000","proposer_priority":"4419985187565583"},{"address":"90106A700F58A4BF7EBE5C083BDBBAF8A8761E5B","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"EGSbG8rhlxLpFE5ymq4uPziu2T1xTo6qwXvlIE8vWp/vvViCD6FEH+m84mjXJLPsFWAQ4lBiiBeAuHXhet9Uktg6m9N7rRctHcfr69p3RcCpTgg8zYMVE3fAin+feYlt"},"voting_power":"660000000000000","proposer_priority":"-119934797065044949"},{"address":"C52C7CDD8E64EF9581473E2AE286A96FB6A444A9","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BloE/D+yNLaVlfxGSwBgTo4fOH1H3GvKLRUDqC0uIAYDNO8nXHZBNvE7h0R709CoAAbc55eLPbDAWY650LOhVzSiWQjJDiQGZQMnaodPe/HrBtk5zd8Nu93A9g6b2Ifv"},"voting_power":"560000000000000","proposer_priority":"49169985187565583"},{"address":"1ED255BA54A031E4ACE64B4AC9B0CD999AF1AB71","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"F3CE0rkrqj4B7Fzlf71SnTyOYJQcY3vcfIXZyizFZUXDy+qGh53L6UAvilXQKE57GU+ohHee8GZwBCtr3cnkCiAAYlsItliY8fubfKGUK/j9XtnnphWQFQLt/SbUPY9j"},"voting_power":"550000000000000","proposer_priority":"-89070014812434417"},{"address":"616EABCEC6FB0DB1AC54C5461D952BFB46B45819","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"C5jqc/OvqwQVSCn40SpTfL8xqLCPf444cPSQIAHwARI07Y+SGLQLTtcy0R2In2CdExtiQmB73wifeqeuab0Eso+wtfEQew9PdQYd9zzii7x+NzO2sKd/+LqhqF5CSV+w"},"voting_power":"550000000000000","proposer_priority":"50179985187565583"},{"address":"06BC43DC34E9F52CFBBDAD93F9FA743BF5278E7F","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AyFTvz4JucqxRBRCWg6664ieIdIIcuu5kO2aYQLX3H8wF9Ron5MajpbZGL3rGE4bCzYYk+w0mnb0MImdZs7jZputCG7GCkoyQPZ8x0eZldZGttrmxfie0gTi40m2Mzyz"},"voting_power":"500000000000000","proposer_priority":"-47240014812434417"},{"address":"2C1B7662D046B2FCAF685C804037D3FC728E9E80","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"GBEabuVp8b4AVVHYx24EKqvLW/TEkdF3RForX7MN7ce/bbOeOHgxxnOb3kEpxq2lDMVRABiwdQj2Ugm/6xtmLOxw1DX+9lYnSIdTP5/EC8mSX0/C5oYFvr1lYxst16VC"},"voting_power":"500000000000000","proposer_priority":"-52580014812434417"},{"address":"4C79631C9E3BACA9D266C8FB3AD6A5304431D055","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FgBSxVCcqigCGPPs89p7pb9OwguX5sUnAN2TUV706WOBOqkqhzHJ4TexAn28dxAvCwzBINbhypK9BpKy5mNaSHMIjwieRMx9rTas7uFS46FkWDECipnwnrEAgGX9hsNC"},"voting_power":"500000000000000","proposer_priority":"-53280014812434417"},{"address":"6DE14F6BCFECCE0F3F86936B6DB580258E542047","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AU+jeh1MZTJr8JHTuw5WB/3olGRx7ZI+aBUHf6xygtiYIN1Ph2XkCFyoJH+5nstrEfeNQ4sabcJ0pOOXdIBWxuQC34iCrAiKV/6h6HNBp71n28Q+spq5zdLyyHFjp8TA"},"voting_power":"500000000000000","proposer_priority":"75409985187565583"},{"address":"8F7E52CBD156EDD9317042F67AE7ABD1D64C9E19","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AkfCH3PDMn8x+O4Nu0ARDvCoMK+JuDmG3d+S0b0aaLiPkFC8ag8UBct1+7RX4+g7F5ag/BG0s+ve19rMuez1jOxYByefy1oFZTZElpJLn8iENwRUjQIrvQ+d9j1LG9PE"},"voting_power":"500000000000000","proposer_priority":"73809985187565583"},{"address":"B08ADE9A00DFC0A0EACB84BF579B6B6C0C32A645","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CYhPyVq8uCc212j8itT99MshEklpdK4FRA2DXQ6TIWZDriErNl+22dJQHXbQkl7zAnCWXYjmhW8hIW3Yq/7ce5rrPbRjC0Gqnnj0aSTosGfwb9s4AM3OIo5+8baA1SRw"},"voting_power":"500000000000000","proposer_priority":"72769985187565583"},{"address":"AC26D89FB38D59464EE04CF66A44F24CE64DA7D4","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"GCp5HXw9cu+mdZ4CUHhTRiZtbHDtiBQk7GOtTQYJBJg7xXkD+hM6m8AMLW+bEpZND7LfxrqL6L40wa4ilxdKEI4su4rs3YghWDX54VaoB2UyU8Vg4BeRNV3ozBa5WR7h"},"voting_power":"470000000000000","proposer_priority":"8642377631154370"},{"address":"0E1982A8083CF41A0B0CDF3CC1A42F5540FC211A","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FyZslMSQZiR5qRiLBwyG5QXfTxZwFog69BFMjBpxQp6PJwwMLxt0N1iA+Bgot2jADCXB47VWXBu6uuVJGD9N8yPdeSU/qPmVTDw86HkfpHuZtCKrRbYdONnJ02Snwlr3"},"voting_power":"410000000000000","proposer_priority":"-22320014812434417"},{"address":"0634E825DCD51BF722CCF02086899CDE1E862E5A","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CSM9VMxU5ny6uUk683vL7aqd75LBRjdpS/iPZ1sszQpsmKjd4AnW2A9RXxGohFUXDMPZ1qxO/L59VE2fam7usUXbY4oA4YOBaPjECjx7tjIzw4Mxnz72MvG75X/HU/6B"},"voting_power":"250000000000000","proposer_priority":"74539985187565583"},{"address":"19395121376B12A00F8C6AD5FE8C3AD9A77CBFC1","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BHqmvRV9+mq29BE4SmYsPU1Ph0UhfqgZhHDW8xNb1xlY/YJCVv2/FrIUlOwwgLfuEaoutJru4CWKH0fcplYZsPX5LgoqiC5NkugSjeXHuBAp1LhBeXoyLjxkKrXN9kd/"},"voting_power":"250000000000000","proposer_priority":"63749985187565583"},{"address":"19D48D2EBF5A4D5C31228C47828BDF6BFDD7B77A","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FXeqB/NboWUbJm9/MW7RzRCQfQBk4B28tQLsjDm8H8AazeB/R1WtDUFIMvouK1YpGd0X0TbYwCDiH062884AVaaLM1+8J7G9huh11KEdJQnBu2DGkx2juZdrKF6RN0mx"},"voting_power":"250000000000000","proposer_priority":"63529985187565583"},{"address":"1D4DCFB35BE65B5E09C4270F0B4E3329F967B4E2","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"A1Ocoo4P100qPExVJ0C+d9aRTK0tjsFlg0ksxX6M+jWMYuMcyRBrFwDMFplihVpvDnfwL1wsTXHtBG/lQjntx5vkyss0fTo92658BELNJ1yLVxiJC1LUxsZ0ERLTInbX"},"voting_power":"250000000000000","proposer_priority":"63529985187565583"},{"address":"2FBB6C9798950CDE7647CB68602498874336999F","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"ADBYMfgcaIpoFOv52bhC4oogtCWGTEgPq29S5BVBhT6rOed8poJI0Ja9TVSZskt+A/+mSH8NeGqPQeClkt+s0w7IXsEYS4pz4w/L6iQnCsfi/NWX6euLS7fJA1jYqNp8"},"voting_power":"250000000000000","proposer_priority":"38009985187565583"},{"address":"39CCAF0EB8D31A9592ABA51B6705ABBBFC38086C","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"Ccfw1Mus5WKUtiT2+hsnvqpa/J2rcHI4PF9j9jbp94+ehoqC5mhKcgaBmUYfHxwVC6edjUpeWRYVvAuj2L0txxTbcWNTwtcD6CKH6FcbanSC5afcYGEzdMLyrKHJaE9N"},"voting_power":"250000000000000","proposer_priority":"37359985187565583"},{"address":"3AECCB026FAEA18F43E79FE116CB1B94E768075C","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"B/MYYGXz8YpLIbZh9AlBuULa05Bi2d85nZShiHDgYA8cyrUe5xyl1vlxt5wuUdbeDbLaHgDUFoQE60oNF1jCsuTu1/lW4+mNns3fXSMO7PROhkiAgVcu0Mh5nwMpRTcE"},"voting_power":"250000000000000","proposer_priority":"31669985187565583"},{"address":"41462F6C19492B6FF4F5FAF7D6ED16E1264D1AAE","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"B2mFjKvL4vojmZfmduN48gN6Z5oc9nRnnEDkEP+p5ykheBwkr3zHmWk2FVnohhXeEp/OSvv5GjdBK9UUnHpWMezNaiL/DOzOnyBCPBxlrwfXNYJAicA6vPaGzKBHadFn"},"voting_power":"250000000000000","proposer_priority":"17879985187565583"},{"address":"45C2BA0FF19BCB262FA5713E993FBA4408258BC1","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"EvqlH5zxqMgYRZA0lB2WVEW9oVshJmH3Twk5Ty/r5Awfj+66DO3K/UrSipRK+yssFxULWXOgDVKzgQwN1LoPNecfCwh7Rt5jQLpSsiaqaXkZKOFwfl6vmw+4m1sEwDzS"},"voting_power":"250000000000000","proposer_priority":"17869985187565583"},{"address":"4D21CFCB799E0C9B66CE566F6AB68BCCCBC75FDA","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"DbDC80dfvpAxDnsu1ghUba56pdD+fz0ndcLhirDoc2i8jGcN4CH3dA8vgubVSoExBt1V6BdzHxPNkAntv77z2zCVhOlxNPgRJKnxFmK8oGmymNxGVNMffgCRBTFU0Ddq"},"voting_power":"250000000000000","proposer_priority":"17579985187565583"},{"address":"4F5F37B9DB46C29C48C0B2231BEAD3E14F04CD1A","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"FAzIcB00TEEFSj0Ci7X18HAvfCKLIr3JCBVBgIwQGAjT2ywTDWQ1nv3XWJNluPBbFz6mrtELxVv9ZHorQN5i7NICAs7H8u3vHIRvOab+qsh+tic323Xmcpt20z8vS/rZ"},"voting_power":"250000000000000","proposer_priority":"16479985187565583"},{"address":"64703E2FCEA0339EDE427510BE1642F4E53FC4D0","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AUjdtHiikc9qFvuYGV4wdqrTGcqIIbSu9pyNHUXI7UnWEQmhy8AptY8i9btghU/kBZw6jfFdp7CUc1AcUE+n1UwdTmBXYsR42Wi2iGLlCU1+13nNFx5SoAvCAsQWwxR9"},"voting_power":"250000000000000","proposer_priority":"15779985187565583"},{"address":"65697A8BAA1891DC3D466DFEDBE51EAC264936B7","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"EwEr3Pa6qHwXN98DxfrHyLtEcoL7yl0t5Ccm7GfyN9ZqL4Z4U+MuvSlQEPB18i6VCDZdUqbzWlOWr4OgY3/KQOEBpVJD3SvJnmgZa2VZw8/qtnbqUe7DeONvLOUnhROg"},"voting_power":"250000000000000","proposer_priority":"15479985187565583"},{"address":"7299ADB3E975B1A7B461F45C4CCA6AFA39DBC9A7","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"BhlLTcX3yL0AZmy+GpSQ6uMwb/OXxNGYOV3ZOBAPw4KOLQcqG/byVimfnNuNK0LwF8n1aNmM9BdvohjDqlB/1iFQ8GNbgIkxHwlUkv9/C1tk5kavqBoj4uK9h+GVwKI2"},"voting_power":"250000000000000","proposer_priority":"1779985187565583"},{"address":"8A93B739376EBA41191E593847B1C844E66F29CA","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"CVBOiObpab0xoZTHyB3w5EtGRNDbga1xLVUCPFxuGsZWVY8nyPi6xlwf5yxZfmV4FiSu3FmeRYm8r39/WxoWiU6kRDhKpvHkYzdCbZ8w6AZOaMb6dgDfGMelkPqmZTvq"},"voting_power":"250000000000000","proposer_priority":"1779985187565583"},{"address":"A49685C59E968B2B097B0CB09E8D08D6B7FCD69E","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"GL7vQFPQl6oVJ6cDAQIaNj/TuSdUpEaTL1yX59qpyNC88u0xXnpVd1qLvl6+E0/7AMxG7T56AVXgxICoxHje7ls30spnhedGcMfgZsUWUMpRTw5OVDXmfK2q0j4jg37C"},"voting_power":"250000000000000","proposer_priority":"389985187565583"},{"address":"C9D2DCB223D4353076E6A0E7E82DD99E42980CCA","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AjKoG16DS4F9sB2F7hPjZVK0hBNiYofeURtsibe4/0pEjoZXE/0hyY8UZ6WP5u/lEjW4ItlXkNjQoG4t5asOMDbccBtl3SB32CeDMEm+zf6kauz7GFFcBmQcDBcTRG9+"},"voting_power":"250000000000000","proposer_priority":"-5910014812434417"},{"address":"CCB476A8C39D26D81428AB9FBD848F9B17E1BCE0","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"Fk3QYy0O13LdC1omnpgJvlt0LfCtRGNVLHtRvu9rr2AhNg22CwQo/xxMOGYcArKDBen050Z8Mk8Dg3yu64aGrWQg5OMONfB0f2/UYqgQw8VGnCqiuPeCnZ8N+TWy3F5S"},"voting_power":"250000000000000","proposer_priority":"-9760014812434417"},{"address":"D94347C994432FFC131B1FA33A61159E5FAB7D5F","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"EVgLQSQx/3ocyhYEXwmWdApeUuvRrv9jWUFdmYhriaNQaza9ca8TKl3LmJ56ibWNENZu/Il03uJwt/XyUmbgT/HADDMYj9vvqo/mAmXZ5ihJ6dX7wgf/NDIEcy6RqsE4"},"voting_power":"250000000000000","proposer_priority":"-9760014812434417"},{"address":"E1E054EDC9AEBA25B10965C927AB35D173080DC9","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"A64AD0DAbBrxxA1xM3Cl+/LMKP3WoDs2t1Gh6yilaZ7qRp17M3mBCB+sxzjDJgkdEaKX5fr0eMOjzXGJA+NHii2oC3qUhV9U9k6JqJypid3YQUB231qCtXUWoetuw9U+"},"voting_power":"250000000000000","proposer_priority":"-10090014812434417"},{"address":"F1D993F20EFE45757E62F9AEB6BB14B15DBF2AE2","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"ElXjF/fmQV6rBTGAyONrX2MSwebuHohKJsSQqkEhWVV0ZW7YnIPg1q/V4rM8ALEBGbd1P4yL9KviqczOrx6u8abbp13BmWXRBy5PF+2bkJj2d6gRSo9w6LpY26oaxei8"},"voting_power":"250000000000000","proposer_priority":"-15930014812434417"},{"address":"F314C84E265C6CF2D834F0CAAD99900CF6857FB2","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"GLckC2qmAoPvJzOEDcCZaxoWtos4+cvYPlt92lFtR7gnlEnxTFtqPSvY50gWziyuDJXsu29AXuMTzPNObw/oCFMRGoT0kQaeocmaKhsSqMS7c4xQKrGZjHJfzSl3CBTK"},"voting_power":"250000000000000","proposer_priority":"-24320014812434417"},{"address":"FDCD7DBB810E66664F7ACA241E05834DDB79A5E0","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"C8p4faS+iwk8Dou55iMR7mFFkUDNYWqtSNvKsjOhY9qFmUhpmD50ZY+lOvWVQy30ALxPLiDTVxqATTfrZrHSaomkud0/wCHQhrVs+Pnq4/RgPlmN0O2NYQ+m0lAKFn+h"},"voting_power":"250000000000000","proposer_priority":"-46980014812434417"}]"#; + + let validators: Vec = serde_json::from_str(validators).unwrap(); + let validator: Validator = serde_json::from_str(r#"{"address":"7DF743C6CE84A99660FB91239E53754416943671","pub_key":{"type":"cometbft/PubKeyBls12_381","value":"AcyiCU8B/MVPHpG50DBnGG8fWm0YJvH32Kh344tR42UBChQMi6Wff6nt15p3MNSkBMH2W+Mnzqg2MN/twIwe53k/cuG6CNmmJdgggsdNwDeyJaCdHkWe+c/0bEhl5Ql0"},"voting_power":"5830000000000000","proposer_priority":"-95941687830727100"}"#).unwrap(); + + verify_commit( + "mainnet-beacon-80094", + &ValidatorSet { + validators, + proposer: validator, + total_voting_power: 10, + }, + &commit, + 10, + true, + &mut Bls12381Verifier::new(mock_dependencies().as_ref()), ) .unwrap(); } diff --git a/lib/trusted-mpt-light-client-types/Cargo.toml b/lib/trusted-mpt-light-client-types/Cargo.toml index 5e91f7197f5..33de032f763 100644 --- a/lib/trusted-mpt-light-client-types/Cargo.toml +++ b/lib/trusted-mpt-light-client-types/Cargo.toml @@ -2,11 +2,11 @@ name = "trusted-mpt-light-client-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ucs03-solvable/Cargo.toml b/lib/ucs03-solvable/Cargo.toml index 26d72a4d9e3..377005b7033 100644 --- a/lib/ucs03-solvable/Cargo.toml +++ b/lib/ucs03-solvable/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs03-solvable" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ucs03-zkgm-packet/Cargo.toml b/lib/ucs03-zkgm-packet/Cargo.toml index 4846e6ccd3b..3dd68dc3c25 100644 --- a/lib/ucs03-zkgm-packet/Cargo.toml +++ b/lib/ucs03-zkgm-packet/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs03-zkgm-packet" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ucs03-zkgmable/Cargo.toml b/lib/ucs03-zkgmable/Cargo.toml index 11c3c690805..3b5fb895d5b 100644 --- a/lib/ucs03-zkgmable/Cargo.toml +++ b/lib/ucs03-zkgmable/Cargo.toml @@ -2,11 +2,11 @@ name = "ucs03-zkgmable" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/ucs04/Cargo.toml b/lib/ucs04/Cargo.toml index 879720db791..56172992226 100644 --- a/lib/ucs04/Cargo.toml +++ b/lib/ucs04/Cargo.toml @@ -2,13 +2,13 @@ name = "ucs04" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } -include = ["well-known.json"] +include = ["src/", "build.rs", "well-known.json"] [lints] workspace = true diff --git a/lib/ucs04/src/lib.rs b/lib/ucs04/src/lib.rs index a2e575611a9..323b40c3786 100644 --- a/lib/ucs04/src/lib.rs +++ b/lib/ucs04/src/lib.rs @@ -153,6 +153,66 @@ pub enum UniversalChainIdParseError { #[repr(transparent)] pub struct Id(str); +impl PartialEq for Id { + fn eq(&self, other: &String) -> bool { + &self.0 == other + } +} + +impl PartialEq for String { + fn eq(&self, other: &Id) -> bool { + self == &other.0 + } +} + +impl PartialEq for &Id { + fn eq(&self, other: &String) -> bool { + &self.0 == other + } +} + +impl PartialEq<&Id> for String { + fn eq(&self, other: &&Id) -> bool { + self == &other.0 + } +} + +impl PartialEq<&String> for Id { + fn eq(&self, other: &&String) -> bool { + &&self.0 == other + } +} + +impl PartialEq for &String { + fn eq(&self, other: &Id) -> bool { + self == &&other.0 + } +} + +impl PartialEq for str { + fn eq(&self, other: &Id) -> bool { + self == &other.0 + } +} + +impl PartialEq for Id { + fn eq(&self, other: &str) -> bool { + &self.0 == other + } +} + +impl PartialEq for &str { + fn eq(&self, other: &Id) -> bool { + *self == &other.0 + } +} + +impl PartialEq<&str> for Id { + fn eq(&self, other: &&str) -> bool { + &self.0 == *other + } +} + impl Display for Id { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { Display::fmt(&self.0, f) diff --git a/lib/unionlabs-encoding/Cargo.toml b/lib/unionlabs-encoding/Cargo.toml index 631175663db..c73d75325ee 100644 --- a/lib/unionlabs-encoding/Cargo.toml +++ b/lib/unionlabs-encoding/Cargo.toml @@ -2,11 +2,11 @@ name = "unionlabs-encoding" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/unionlabs-primitives/Cargo.toml b/lib/unionlabs-primitives/Cargo.toml index a4fa7b884b3..c95c1b274b8 100644 --- a/lib/unionlabs-primitives/Cargo.toml +++ b/lib/unionlabs-primitives/Cargo.toml @@ -2,11 +2,11 @@ name = "unionlabs-primitives" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/unionlabs-primitives/src/uint.rs b/lib/unionlabs-primitives/src/uint.rs index 3e042a0e289..3552253f3cc 100644 --- a/lib/unionlabs-primitives/src/uint.rs +++ b/lib/unionlabs-primitives/src/uint.rs @@ -571,7 +571,10 @@ mod u256_tests { #[test] fn roundtrip() { unionlabs::test_utils::assert_json_roundtrip(&U256::from_str("123456").unwrap()); - unionlabs::test_utils::assert_string_roundtrip(&U256::from_str("123456").unwrap()); + unionlabs::test_utils::assert_string_roundtrip( + "123456", + &U256::from_str("123456").unwrap(), + ); } #[test] diff --git a/lib/unionlabs/Cargo.toml b/lib/unionlabs/Cargo.toml index 6fc62a4be04..93376df283b 100644 --- a/lib/unionlabs/Cargo.toml +++ b/lib/unionlabs/Cargo.toml @@ -1,13 +1,14 @@ [package] -include = ["README.md"] name = "unionlabs" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } + +include = ["src/", "README.md"] [lints] workspace = true diff --git a/lib/unionlabs/fuzz_targets/duration/roundtrip.rs b/lib/unionlabs/fuzz_targets/duration/roundtrip.rs index 17d370b3152..0a1b2928492 100644 --- a/lib/unionlabs/fuzz_targets/duration/roundtrip.rs +++ b/lib/unionlabs/fuzz_targets/duration/roundtrip.rs @@ -6,5 +6,5 @@ use unionlabs::{google::protobuf::duration::Duration, test_utils::*}; fuzz_target!(|data: Duration| { assert_proto_roundtrip(&data); assert_json_roundtrip(&data); - assert_string_roundtrip(&data); + // assert_string_roundtrip(&data); }); diff --git a/lib/unionlabs/fuzz_targets/timestamp/roundtrip.rs b/lib/unionlabs/fuzz_targets/timestamp/roundtrip.rs index a329f023427..36922e5782e 100644 --- a/lib/unionlabs/fuzz_targets/timestamp/roundtrip.rs +++ b/lib/unionlabs/fuzz_targets/timestamp/roundtrip.rs @@ -6,5 +6,5 @@ use unionlabs::{google::protobuf::timestamp::Timestamp, test_utils::*}; fuzz_target!(|data: Timestamp| { assert_proto_roundtrip(&data); assert_json_roundtrip(&data); - assert_string_roundtrip(&data); + // assert_string_roundtrip(&data); }); diff --git a/lib/unionlabs/src/google/protobuf/timestamp.rs b/lib/unionlabs/src/google/protobuf/timestamp.rs index 2558873e829..1449e9954b3 100644 --- a/lib/unionlabs/src/google/protobuf/timestamp.rs +++ b/lib/unionlabs/src/google/protobuf/timestamp.rs @@ -200,11 +200,19 @@ impl Timestamp { impl Display for Timestamp { fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { - f.write_str(&DateTime::::from(*self).to_rfc3339_opts( - SecondsFormat::Nanos, + let s = DateTime::::from(*self).to_rfc3339_opts( + SecondsFormat::AutoSi, // use_z true, - )) + ); + + // hackery to match go's time.Time formatting + if self.nanos.inner() == 0 { + f.write_str(&s) + } else { + f.write_str(&s.trim_end_matches('Z').trim_end_matches('0'))?; + f.write_str("Z") + } } } @@ -416,13 +424,54 @@ mod tests { #[test] fn parse() { - Timestamp::from_str("2017-01-15T01:30:15.03441Z").unwrap(); + assert_string_roundtrip("2017-01-15T01:30:15.03441Z", &ts!(1484443815, 34410000)); + + assert_string_roundtrip("0001-01-01T00:00:00Z", &ts!(TIMESTAMP_SECONDS_MIN, 0)); + + assert_string_roundtrip( + "0001-01-01T00:00:00.000000001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 1), + ); + + assert_string_roundtrip( + "0001-01-01T00:00:00.00000001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 10), + ); + + assert_string_roundtrip( + "0001-01-01T00:00:00.0000001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 100), + ); + + assert_string_roundtrip( + "0001-01-01T00:00:00.000001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 1_000), + ); + + assert_string_roundtrip( + "0001-01-01T00:00:00.00001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 10_000), + ); - assert_string_roundtrip(&ts!(12345, 6789)); + assert_string_roundtrip( + "0001-01-01T00:00:00.0001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 100_000), + ); - Timestamp::from_str("0001-01-01T00:00:00Z").unwrap(); + assert_string_roundtrip( + "0001-01-01T00:00:00.001Z", + &ts!(TIMESTAMP_SECONDS_MIN, 1_000_000), + ); - assert_string_roundtrip(&ts!(TIMESTAMP_SECONDS_MIN, 0)); + assert_string_roundtrip( + "0001-01-01T00:00:00.01Z", + &ts!(TIMESTAMP_SECONDS_MIN, 10_000_000), + ); + + assert_string_roundtrip( + "0001-01-01T00:00:00.1Z", + &ts!(TIMESTAMP_SECONDS_MIN, 100_000_000), + ); } #[test] diff --git a/lib/unionlabs/src/test_utils.rs b/lib/unionlabs/src/test_utils.rs index 4189ce0c3d7..d8e736a19be 100644 --- a/lib/unionlabs/src/test_utils.rs +++ b/lib/unionlabs/src/test_utils.rs @@ -28,13 +28,15 @@ where } #[track_caller] -pub fn assert_string_roundtrip(t: &T) +pub fn assert_string_roundtrip(s: &str, t: &T) where T: Display + FromStr + Debug + PartialEq, { - let from_str = t.to_string().parse::().unwrap(); + let display = t.to_string(); - assert_eq!(t, &from_str, "string roundtrip failed"); + assert_eq!(s, &display, "display is not equal"); + + assert_eq!(&display.parse::().unwrap(), t, "parse is not equal"); } #[track_caller] diff --git a/lib/voyager-client/Cargo.toml b/lib/voyager-client/Cargo.toml index 8d19ccb330b..870bec32ef8 100644 --- a/lib/voyager-client/Cargo.toml +++ b/lib/voyager-client/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-core/Cargo.toml b/lib/voyager-core/Cargo.toml index 1720227a335..653db389fba 100644 --- a/lib/voyager-core/Cargo.toml +++ b/lib/voyager-core/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-core" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-message/Cargo.toml b/lib/voyager-message/Cargo.toml index 867b45f7b60..4758eee8d72 100644 --- a/lib/voyager-message/Cargo.toml +++ b/lib/voyager-message/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-message" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-plugin-protocol/Cargo.toml b/lib/voyager-plugin-protocol/Cargo.toml index 3407cd92dff..910cfe88766 100644 --- a/lib/voyager-plugin-protocol/Cargo.toml +++ b/lib/voyager-plugin-protocol/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-protocol" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-plugin/Cargo.toml b/lib/voyager-plugin/Cargo.toml index d929c044506..76ca344bc60 100644 --- a/lib/voyager-plugin/Cargo.toml +++ b/lib/voyager-plugin/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-primitives/Cargo.toml b/lib/voyager-primitives/Cargo.toml index e9ec4cc9f84..b859891df10 100644 --- a/lib/voyager-primitives/Cargo.toml +++ b/lib/voyager-primitives/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-primitives" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-rpc/Cargo.toml b/lib/voyager-rpc/Cargo.toml index d0f6a6c55f4..24fab11fc9c 100644 --- a/lib/voyager-rpc/Cargo.toml +++ b/lib/voyager-rpc/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-rpc" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-sdk/Cargo.toml b/lib/voyager-sdk/Cargo.toml index 5636185bb50..814a1533cc9 100644 --- a/lib/voyager-sdk/Cargo.toml +++ b/lib/voyager-sdk/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-sdk" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-types/Cargo.toml b/lib/voyager-types/Cargo.toml index 0394fbb743a..0c5e74cdf80 100644 --- a/lib/voyager-types/Cargo.toml +++ b/lib/voyager-types/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-types" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/voyager-vm/Cargo.toml b/lib/voyager-vm/Cargo.toml index dab65132361..c2b49461457 100644 --- a/lib/voyager-vm/Cargo.toml +++ b/lib/voyager-vm/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-vm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/lib/wasm-client-type/Cargo.toml b/lib/wasm-client-type/Cargo.toml index be870935afb..433d44be85b 100644 --- a/lib/wasm-client-type/Cargo.toml +++ b/lib/wasm-client-type/Cargo.toml @@ -2,11 +2,11 @@ name = "wasm-client-type" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/mpc/client/Cargo.toml b/mpc/client/Cargo.toml index 6939a5acac1..907f0cae76b 100644 --- a/mpc/client/Cargo.toml +++ b/mpc/client/Cargo.toml @@ -2,11 +2,11 @@ name = "mpc-client" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/mpc/coordinator/Cargo.toml b/mpc/coordinator/Cargo.toml index 9ed6f3fe81f..0c2b720d32f 100644 --- a/mpc/coordinator/Cargo.toml +++ b/mpc/coordinator/Cargo.toml @@ -2,11 +2,11 @@ name = "mpc-coordinator" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/mpc/shared/Cargo.toml b/mpc/shared/Cargo.toml index 5b92af56377..e03a6aed8b3 100644 --- a/mpc/shared/Cargo.toml +++ b/mpc/shared/Cargo.toml @@ -2,11 +2,11 @@ name = "mpc-shared" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/build-evm-deployer-tx/Cargo.toml b/tools/build-evm-deployer-tx/Cargo.toml index 9e3e0ffe535..f99f91392f6 100644 --- a/tools/build-evm-deployer-tx/Cargo.toml +++ b/tools/build-evm-deployer-tx/Cargo.toml @@ -2,11 +2,11 @@ name = "build-evm-deployer-tx" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/devnet-utils/Cargo.toml b/tools/devnet-utils/Cargo.toml index 10dbff83f37..d48812adb40 100644 --- a/tools/devnet-utils/Cargo.toml +++ b/tools/devnet-utils/Cargo.toml @@ -2,11 +2,11 @@ name = "devnet-utils" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/json-schema-to-nixos-module-options/Cargo.toml b/tools/json-schema-to-nixos-module-options/Cargo.toml index 3990f7d6c5d..36dd67c62f1 100644 --- a/tools/json-schema-to-nixos-module-options/Cargo.toml +++ b/tools/json-schema-to-nixos-module-options/Cargo.toml @@ -2,11 +2,11 @@ name = "json-schema-to-nixos-module-options" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/move-bindgen/Cargo.toml b/tools/move-bindgen/Cargo.toml index c8bfb6401bf..22c02c23535 100644 --- a/tools/move-bindgen/Cargo.toml +++ b/tools/move-bindgen/Cargo.toml @@ -2,11 +2,11 @@ name = "move-bindgen" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/parse-wasm-client-type/Cargo.toml b/tools/parse-wasm-client-type/Cargo.toml index d5e29c5579f..e40d2deadb6 100644 --- a/tools/parse-wasm-client-type/Cargo.toml +++ b/tools/parse-wasm-client-type/Cargo.toml @@ -2,11 +2,11 @@ name = "parse-wasm-client-type" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/rustfmt-sort/Cargo.toml b/tools/rustfmt-sort/Cargo.toml index 9d58496aebd..66c17795318 100644 --- a/tools/rustfmt-sort/Cargo.toml +++ b/tools/rustfmt-sort/Cargo.toml @@ -2,11 +2,11 @@ name = "rustfmt-sort" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/tidy/Cargo.toml b/tools/tidy/Cargo.toml index ba76cc7fd1b..8a02969faac 100644 --- a/tools/tidy/Cargo.toml +++ b/tools/tidy/Cargo.toml @@ -2,11 +2,11 @@ name = "tidy" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/tools/u/Cargo.toml b/tools/u/Cargo.toml index cbf30381066..9b8ca8b6fc4 100644 --- a/tools/u/Cargo.toml +++ b/tools/u/Cargo.toml @@ -2,13 +2,13 @@ name = "u" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } -include = ["../../deployments/deployments.json"] +include = ["src/", "../../deployments/deployments.json"] [lints] workspace = true @@ -38,7 +38,7 @@ parlia-verifier = { workspace = true } protos = { workspace = true, features = ["proto_full", "serde"] } rand = { workspace = true } serde = { workspace = true, features = ["derive"] } -serde_json = { workspace = true } +serde_json = { workspace = true, features = ["preserve_order"] } sha2 = { workspace = true, features = ["asm", "asm-aarch64"] } subtle-encoding = { workspace = true, features = ["bech32-preview"] } tokio = { workspace = true, features = ["macros"] } diff --git a/tools/u/src/cometbft/rpc.rs b/tools/u/src/cometbft/rpc.rs index 1fe99ccfc05..c2cd156adba 100644 --- a/tools/u/src/cometbft/rpc.rs +++ b/tools/u/src/cometbft/rpc.rs @@ -1,9 +1,9 @@ -use std::num::{NonZero, NonZeroU64}; +use std::num::NonZero; use anyhow::{Result, bail}; use clap::{Args, Subcommand}; -use cometbft_rpc::rpc_types::Order; -use unionlabs::{bounded::BoundedI64, primitives::Bytes}; +use cometbft_rpc::{rpc_types::Order, types::CometbftHeight}; +use unionlabs::primitives::{Bytes, H256, encoding::HexUnprefixed}; use crate::print_json; @@ -23,20 +23,16 @@ pub enum Method { AbciQuery { path: String, data: Bytes, - #[arg(long, short = 'H')] - height: Option>, + height: Option, #[arg(long, short = 'p', default_value_t = false)] prove: bool, }, /// /block?height=_ - Block { - #[arg(long, short = 'H')] - height: Option>, - }, + Block { height: Option }, /// /block_by_hash?hash=_ BlockByHash, /// /block_results?height=_ - BlockResults, + BlockResults { height: Option }, /// /block_search?query=_&page=_&per_page=_&order_by=_ BlockSearch { #[arg(long, short = 'q')] @@ -61,7 +57,7 @@ pub enum Method { /// /check_tx?tx=_ CheckTx, /// /commit?height=_ - Commit { height: Option }, + Commit { height: Option }, /// /consensus_params?height=_ ConsensusParams, /// /consensus_state? @@ -73,10 +69,7 @@ pub enum Method { /// /genesis_chunked?chunk=_ GenesisChunked, /// /header?height=_ - Header { - #[arg(long, short = 'H')] - height: Option>, - }, + Header { height: Option }, /// /header_by_hash?hash=_ HeaderByHash, /// /health? @@ -90,7 +83,11 @@ pub enum Method { /// /subscribe?query=_ Subscribe, /// /tx?hash=_&prove=_ - Tx, + Tx { + hash: H256, + #[arg(long, short = 'p', default_value_t = false)] + prove: bool, + }, /// /tx_search?query=_&prove=_&page=_&per_page=_&order_by=_ TxSearch, /// /unconfirmed_txs?limit=_ @@ -116,8 +113,10 @@ impl Cmd { prove, } => print_json(&client.abci_query(path, data, height, prove).await?), Method::Block { height } => print_json(&client.block(height).await?), + Method::BlockResults { height } => print_json(&client.block_results(height).await?), Method::Status => print_json(&client.status().await?), Method::Commit { height } => print_json(&client.commit(height).await?), + Method::Genesis => print_json(&client.genesis::().await?), Method::Header { height } => print_json(&client.header(height).await?), Method::BlockSearch { query, @@ -125,6 +124,9 @@ impl Cmd { per_page, order_by, } => print_json(&client.block_search(query, page, per_page, order_by).await?), + Method::Tx { hash, prove } => { + print_json(&client.tx(hash.into_encoding(), prove).await?) + } _ => bail!("not yet implemented"), } diff --git a/tools/union-test/Cargo.toml b/tools/union-test/Cargo.toml index a4fb0e62fe9..3d33aa4427a 100644 --- a/tools/union-test/Cargo.toml +++ b/tools/union-test/Cargo.toml @@ -2,11 +2,11 @@ name = "union-test" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [package.metadata.crane] diff --git a/tools/update-deployments/Cargo.toml b/tools/update-deployments/Cargo.toml index 35206215956..36edb219f1a 100644 --- a/tools/update-deployments/Cargo.toml +++ b/tools/update-deployments/Cargo.toml @@ -2,11 +2,11 @@ name = "update-deployments" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/unionvisor/Cargo.toml b/unionvisor/Cargo.toml index 4ef6e86ef9a..45f6bec46cb 100644 --- a/unionvisor/Cargo.toml +++ b/unionvisor/Cargo.toml @@ -2,11 +2,11 @@ name = "unionvisor" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/Cargo.toml b/voyager/Cargo.toml index ab6917043c9..60e08ef3cce 100644 --- a/voyager/Cargo.toml +++ b/voyager/Cargo.toml @@ -2,13 +2,11 @@ name = "voyager" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } - -include = [] +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [package.metadata.crane] test-include = [] diff --git a/voyager/modules/client-bootstrap/arbitrum/Cargo.toml b/voyager/modules/client-bootstrap/arbitrum/Cargo.toml index 3194d89a489..6c53bb800f7 100644 --- a/voyager/modules/client-bootstrap/arbitrum/Cargo.toml +++ b/voyager/modules/client-bootstrap/arbitrum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-arbitrum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/attested/Cargo.toml b/voyager/modules/client-bootstrap/attested/Cargo.toml index ace724ef7aa..3ff9740a7bf 100644 --- a/voyager/modules/client-bootstrap/attested/Cargo.toml +++ b/voyager/modules/client-bootstrap/attested/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-attested" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/base/Cargo.toml b/voyager/modules/client-bootstrap/base/Cargo.toml index 535452f7058..94631789baa 100644 --- a/voyager/modules/client-bootstrap/base/Cargo.toml +++ b/voyager/modules/client-bootstrap/base/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-base" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/bob/Cargo.toml b/voyager/modules/client-bootstrap/bob/Cargo.toml index e6547163202..adde2efed92 100644 --- a/voyager/modules/client-bootstrap/bob/Cargo.toml +++ b/voyager/modules/client-bootstrap/bob/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-bob" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/cometbls/Cargo.toml b/voyager/modules/client-bootstrap/cometbls/Cargo.toml index 1cd6ed288e9..5c17ef1e569 100644 --- a/voyager/modules/client-bootstrap/cometbls/Cargo.toml +++ b/voyager/modules/client-bootstrap/cometbls/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-cometbls" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/cometbls/src/main.rs b/voyager/modules/client-bootstrap/cometbls/src/main.rs index b2b5a3e16b3..b37803331e4 100644 --- a/voyager/modules/client-bootstrap/cometbls/src/main.rs +++ b/voyager/modules/client-bootstrap/cometbls/src/main.rs @@ -1,8 +1,6 @@ -use std::{ - fmt::Debug, - num::{NonZeroU64, ParseIntError}, -}; +use std::{fmt::Debug, num::ParseIntError}; +use cometbft_rpc::types::CometbftHeight; use cometbls_light_client_types::{ClientState, ConsensusState}; use jsonrpsee::{Extensions, core::async_trait}; use serde::{Deserialize, Serialize}; @@ -124,7 +122,7 @@ impl ClientBootstrapModuleServer for Module { let commit = self .cometbft_client - .commit(Some(NonZeroU64::new(height.height()).unwrap())) + .commit(Some(CometbftHeight::try_from(height.height()).unwrap())) .await .unwrap(); @@ -170,7 +168,7 @@ impl ClientBootstrapModuleServer for Module { let commit = self .cometbft_client - .commit(Some(NonZeroU64::new(height.height()).unwrap())) + .commit(Some(CometbftHeight::try_from(height.height()).unwrap())) .await .unwrap(); diff --git a/voyager/modules/client-bootstrap/ethereum/Cargo.toml b/voyager/modules/client-bootstrap/ethereum/Cargo.toml index be263a38850..60cec89c115 100644 --- a/voyager/modules/client-bootstrap/ethereum/Cargo.toml +++ b/voyager/modules/client-bootstrap/ethereum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-ethereum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/ethermint/Cargo.toml b/voyager/modules/client-bootstrap/ethermint/Cargo.toml index b65e644b363..43bba40c875 100644 --- a/voyager/modules/client-bootstrap/ethermint/Cargo.toml +++ b/voyager/modules/client-bootstrap/ethermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-ethermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/movement/Cargo.toml b/voyager/modules/client-bootstrap/movement/Cargo.toml index 034623a0c86..37803bab77e 100644 --- a/voyager/modules/client-bootstrap/movement/Cargo.toml +++ b/voyager/modules/client-bootstrap/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/parlia/Cargo.toml b/voyager/modules/client-bootstrap/parlia/Cargo.toml index 9e9c9a5cd50..3cb11799fc7 100644 --- a/voyager/modules/client-bootstrap/parlia/Cargo.toml +++ b/voyager/modules/client-bootstrap/parlia/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-parlia" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/proof-lens/Cargo.toml b/voyager/modules/client-bootstrap/proof-lens/Cargo.toml index cf6f98f76ae..0ceb8d1b389 100644 --- a/voyager/modules/client-bootstrap/proof-lens/Cargo.toml +++ b/voyager/modules/client-bootstrap/proof-lens/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-proof-lens" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/state-lens/ics23-ics23/Cargo.toml b/voyager/modules/client-bootstrap/state-lens/ics23-ics23/Cargo.toml index cb312887f01..81e800cee35 100644 --- a/voyager/modules/client-bootstrap/state-lens/ics23-ics23/Cargo.toml +++ b/voyager/modules/client-bootstrap/state-lens/ics23-ics23/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-state-lens-ics23-ics23" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/state-lens/ics23-mpt/Cargo.toml b/voyager/modules/client-bootstrap/state-lens/ics23-mpt/Cargo.toml index 73545a019c2..0e56d424858 100644 --- a/voyager/modules/client-bootstrap/state-lens/ics23-mpt/Cargo.toml +++ b/voyager/modules/client-bootstrap/state-lens/ics23-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-state-lens-ics23-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/state-lens/ics23-smt/Cargo.toml b/voyager/modules/client-bootstrap/state-lens/ics23-smt/Cargo.toml index 96222fae901..7de0177e5cf 100644 --- a/voyager/modules/client-bootstrap/state-lens/ics23-smt/Cargo.toml +++ b/voyager/modules/client-bootstrap/state-lens/ics23-smt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-state-lens-ics23-smt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/sui/Cargo.toml b/voyager/modules/client-bootstrap/sui/Cargo.toml index 20c17aa7c2e..db9057632ad 100644 --- a/voyager/modules/client-bootstrap/sui/Cargo.toml +++ b/voyager/modules/client-bootstrap/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/tendermint/Cargo.toml b/voyager/modules/client-bootstrap/tendermint/Cargo.toml index cf189aa62ce..e24c873ab2f 100644 --- a/voyager/modules/client-bootstrap/tendermint/Cargo.toml +++ b/voyager/modules/client-bootstrap/tendermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-tendermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client-bootstrap/trusted-mpt/Cargo.toml b/voyager/modules/client-bootstrap/trusted-mpt/Cargo.toml index e03a0fb7a1a..34bad81b596 100644 --- a/voyager/modules/client-bootstrap/trusted-mpt/Cargo.toml +++ b/voyager/modules/client-bootstrap/trusted-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-bootstrap-module-trusted-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/arbitrum/Cargo.toml b/voyager/modules/client/arbitrum/Cargo.toml index e27687a875b..8e7fe42cbf7 100644 --- a/voyager/modules/client/arbitrum/Cargo.toml +++ b/voyager/modules/client/arbitrum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-arbitrum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/attested/Cargo.toml b/voyager/modules/client/attested/Cargo.toml index ca75c6bda2e..5d307b95fd5 100644 --- a/voyager/modules/client/attested/Cargo.toml +++ b/voyager/modules/client/attested/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-attested" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/base/Cargo.toml b/voyager/modules/client/base/Cargo.toml index 192c81cc78c..3e8f0338d74 100644 --- a/voyager/modules/client/base/Cargo.toml +++ b/voyager/modules/client/base/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-base" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/bob/Cargo.toml b/voyager/modules/client/bob/Cargo.toml index 5b38fda1a51..7bcaadf4bde 100644 --- a/voyager/modules/client/bob/Cargo.toml +++ b/voyager/modules/client/bob/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-bob" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/cometbls/Cargo.toml b/voyager/modules/client/cometbls/Cargo.toml index 818b1332b8e..45c0ad831f7 100644 --- a/voyager/modules/client/cometbls/Cargo.toml +++ b/voyager/modules/client/cometbls/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-cometbls" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/ethereum/Cargo.toml b/voyager/modules/client/ethereum/Cargo.toml index 1efe4581577..d7839401879 100644 --- a/voyager/modules/client/ethereum/Cargo.toml +++ b/voyager/modules/client/ethereum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-ethereum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/ethermint/Cargo.toml b/voyager/modules/client/ethermint/Cargo.toml index dc0e28bd2e0..603969341de 100644 --- a/voyager/modules/client/ethermint/Cargo.toml +++ b/voyager/modules/client/ethermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-ethermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/movement/Cargo.toml b/voyager/modules/client/movement/Cargo.toml index 1c38a44715c..742c11c875c 100644 --- a/voyager/modules/client/movement/Cargo.toml +++ b/voyager/modules/client/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/parlia/Cargo.toml b/voyager/modules/client/parlia/Cargo.toml index 99c5676b55f..703087af453 100644 --- a/voyager/modules/client/parlia/Cargo.toml +++ b/voyager/modules/client/parlia/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-parlia" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/proof-lens/Cargo.toml b/voyager/modules/client/proof-lens/Cargo.toml index d486a6f8cd0..13f8ef6ac13 100644 --- a/voyager/modules/client/proof-lens/Cargo.toml +++ b/voyager/modules/client/proof-lens/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-proof-lens" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/state-lens/ics23-ics23/Cargo.toml b/voyager/modules/client/state-lens/ics23-ics23/Cargo.toml index 1738f8a2915..4ece4cf347f 100644 --- a/voyager/modules/client/state-lens/ics23-ics23/Cargo.toml +++ b/voyager/modules/client/state-lens/ics23-ics23/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-state-lens-ics23-ics23" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/state-lens/ics23-mpt/Cargo.toml b/voyager/modules/client/state-lens/ics23-mpt/Cargo.toml index 4d7826eda4f..3ef47e61629 100644 --- a/voyager/modules/client/state-lens/ics23-mpt/Cargo.toml +++ b/voyager/modules/client/state-lens/ics23-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-state-lens-ics23-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/state-lens/ics23-smt/Cargo.toml b/voyager/modules/client/state-lens/ics23-smt/Cargo.toml index a82ff487106..d2915a86c15 100644 --- a/voyager/modules/client/state-lens/ics23-smt/Cargo.toml +++ b/voyager/modules/client/state-lens/ics23-smt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-state-lens-ics23-smt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/sui/Cargo.toml b/voyager/modules/client/sui/Cargo.toml index 2ede9b7d992..100f028bc24 100644 --- a/voyager/modules/client/sui/Cargo.toml +++ b/voyager/modules/client/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/tendermint/Cargo.toml b/voyager/modules/client/tendermint/Cargo.toml index 79519195709..0748dc797f9 100644 --- a/voyager/modules/client/tendermint/Cargo.toml +++ b/voyager/modules/client/tendermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-tendermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/client/trusted-mpt/Cargo.toml b/voyager/modules/client/trusted-mpt/Cargo.toml index 5635a31bd9f..4afc45e3297 100644 --- a/voyager/modules/client/trusted-mpt/Cargo.toml +++ b/voyager/modules/client/trusted-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-module-trusted-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/arbitrum/Cargo.toml b/voyager/modules/finality/arbitrum/Cargo.toml index 13f6c72b9a9..381980ea06a 100644 --- a/voyager/modules/finality/arbitrum/Cargo.toml +++ b/voyager/modules/finality/arbitrum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-arbitrum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/attested-evm/Cargo.toml b/voyager/modules/finality/attested-evm/Cargo.toml index cf7dadd6dd8..d7b6e318ae4 100644 --- a/voyager/modules/finality/attested-evm/Cargo.toml +++ b/voyager/modules/finality/attested-evm/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-attested-evm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/base/Cargo.toml b/voyager/modules/finality/base/Cargo.toml index dbc967c70d6..2aa7c4e963a 100644 --- a/voyager/modules/finality/base/Cargo.toml +++ b/voyager/modules/finality/base/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-base" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/berachain/Cargo.toml b/voyager/modules/finality/berachain/Cargo.toml index 4ab4a1f8d95..56803152976 100644 --- a/voyager/modules/finality/berachain/Cargo.toml +++ b/voyager/modules/finality/berachain/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-berachain" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/bob/Cargo.toml b/voyager/modules/finality/bob/Cargo.toml index 9ca6a850b89..4773a4f532b 100644 --- a/voyager/modules/finality/bob/Cargo.toml +++ b/voyager/modules/finality/bob/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-bob" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/cometbls/Cargo.toml b/voyager/modules/finality/cometbls/Cargo.toml index fb7190330a7..2bd3683bf9a 100644 --- a/voyager/modules/finality/cometbls/Cargo.toml +++ b/voyager/modules/finality/cometbls/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-cometbls" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/ethereum/Cargo.toml b/voyager/modules/finality/ethereum/Cargo.toml index 86449e4d90a..7feea8d075a 100644 --- a/voyager/modules/finality/ethereum/Cargo.toml +++ b/voyager/modules/finality/ethereum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-ethereum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/movement/Cargo.toml b/voyager/modules/finality/movement/Cargo.toml index 406cd269a9d..5f4022b3b9c 100644 --- a/voyager/modules/finality/movement/Cargo.toml +++ b/voyager/modules/finality/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/parlia/Cargo.toml b/voyager/modules/finality/parlia/Cargo.toml index 927604d1966..36c6429d27b 100644 --- a/voyager/modules/finality/parlia/Cargo.toml +++ b/voyager/modules/finality/parlia/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-parlia" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/sui/Cargo.toml b/voyager/modules/finality/sui/Cargo.toml index fea2506be39..ce83c1ef6ff 100644 --- a/voyager/modules/finality/sui/Cargo.toml +++ b/voyager/modules/finality/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/tendermint/Cargo.toml b/voyager/modules/finality/tendermint/Cargo.toml index c06c7f52977..b4a69d7edf7 100644 --- a/voyager/modules/finality/tendermint/Cargo.toml +++ b/voyager/modules/finality/tendermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-tendermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/finality/trusted-evm/Cargo.toml b/voyager/modules/finality/trusted-evm/Cargo.toml index 110bfc15978..c8d25215783 100644 --- a/voyager/modules/finality/trusted-evm/Cargo.toml +++ b/voyager/modules/finality/trusted-evm/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-finality-module-trusted-evm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/attested/Cargo.toml b/voyager/modules/proof/attested/Cargo.toml index f73dccf4133..5cefa42b65d 100644 --- a/voyager/modules/proof/attested/Cargo.toml +++ b/voyager/modules/proof/attested/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-attested" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/cosmwasm/Cargo.toml b/voyager/modules/proof/cosmwasm/Cargo.toml index 20c26fab2b4..c623107d72b 100644 --- a/voyager/modules/proof/cosmwasm/Cargo.toml +++ b/voyager/modules/proof/cosmwasm/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-proof-module-cosmwasm" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/cosmwasm/src/main.rs b/voyager/modules/proof/cosmwasm/src/main.rs index 3e2516755f2..7f30efbf03f 100644 --- a/voyager/modules/proof/cosmwasm/src/main.rs +++ b/voyager/modules/proof/cosmwasm/src/main.rs @@ -1,5 +1,6 @@ #![warn(clippy::unwrap_used)] +use cometbft_rpc::types::CometbftHeight; use ibc_union_spec::{ IbcUnion, path::{IBC_UNION_COSMWASM_COMMITMENT_PREFIX, StorePath}, @@ -96,7 +97,7 @@ impl ProofModuleServer for Module { // a proof at height H is provable at height H + 1 // we assume that the height passed in to this function is the intended height to prove against, thus we have to query the height - 1 Some( - BoundedI64::new(at.height() - 1) + CometbftHeight::try_from(at.height() - 1) .map_err(RpcError::fatal(format!("invalid height value: {at}")))?, ), true, diff --git a/voyager/modules/proof/ethermint/Cargo.toml b/voyager/modules/proof/ethermint/Cargo.toml index 9bb305c349e..f21d85a024d 100644 --- a/voyager/modules/proof/ethermint/Cargo.toml +++ b/voyager/modules/proof/ethermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-ethermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/ethermint/src/main.rs b/voyager/modules/proof/ethermint/src/main.rs index 245c8a0b266..af50ab7fdf7 100644 --- a/voyager/modules/proof/ethermint/src/main.rs +++ b/voyager/modules/proof/ethermint/src/main.rs @@ -2,6 +2,7 @@ use std::num::ParseIntError; +use cometbft_rpc::types::CometbftHeight; use ibc_union_spec::{IbcUnion, path::StorePath}; use jsonrpsee::{Extensions, core::async_trait}; use serde::{Deserialize, Serialize}; @@ -111,7 +112,7 @@ impl ProofModuleServer for Module { // a proof at height H is provable at height H + 1 // we assume that the height passed in to this function is the intended height to prove against, thus we have to query the height - 1 Some( - BoundedI64::new(at.height() - 1) + CometbftHeight::try_from(at.height() - 1) .map_err(RpcError::fatal("invalid height value: {at}"))?, ), true, diff --git a/voyager/modules/proof/evm-mpt/Cargo.toml b/voyager/modules/proof/evm-mpt/Cargo.toml index 03f2e2e99bd..c3b06345f64 100644 --- a/voyager/modules/proof/evm-mpt/Cargo.toml +++ b/voyager/modules/proof/evm-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-evm-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/movement/Cargo.toml b/voyager/modules/proof/movement/Cargo.toml index c54a7120440..ddb80732ad5 100644 --- a/voyager/modules/proof/movement/Cargo.toml +++ b/voyager/modules/proof/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/parlia/Cargo.toml b/voyager/modules/proof/parlia/Cargo.toml index c577570721a..d97ca92032a 100644 --- a/voyager/modules/proof/parlia/Cargo.toml +++ b/voyager/modules/proof/parlia/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-parlia" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/proof/sui/Cargo.toml b/voyager/modules/proof/sui/Cargo.toml index b9faaa00265..1f25bd19c1c 100644 --- a/voyager/modules/proof/sui/Cargo.toml +++ b/voyager/modules/proof/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-proof-module-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/state/cosmwasm/Cargo.toml b/voyager/modules/state/cosmwasm/Cargo.toml index 61e477af19a..0d1f33a5ded 100644 --- a/voyager/modules/state/cosmwasm/Cargo.toml +++ b/voyager/modules/state/cosmwasm/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-state-module-cosmwasm" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/state/cosmwasm/src/main.rs b/voyager/modules/state/cosmwasm/src/main.rs index 8c0fd13e4d7..59ada74ed53 100644 --- a/voyager/modules/state/cosmwasm/src/main.rs +++ b/voyager/modules/state/cosmwasm/src/main.rs @@ -212,11 +212,7 @@ impl Module { let block_results = self .cometbft_client - .block_results(Some( - (block_response.block.header.height.inner() as u64) - .try_into() - .expect("block number is valid"), - )) + .block_results(Some(block_response.block.header.height)) .await .map_err(RpcError::retryable(format!( "error querying block {}", @@ -341,11 +337,7 @@ impl Module { let block_results = self .cometbft_client - .block_results(Some( - (block_response.block.header.height.inner() as u64) - .try_into() - .expect("block number is valid"), - )) + .block_results(Some(block_response.block.header.height)) .await .map_err(RpcError::retryable(format!( "error querying block {}", diff --git a/voyager/modules/state/evm/Cargo.toml b/voyager/modules/state/evm/Cargo.toml index c7d0dfd6e8d..fa59d266954 100644 --- a/voyager/modules/state/evm/Cargo.toml +++ b/voyager/modules/state/evm/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-state-module-evm" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/state/movement/Cargo.toml b/voyager/modules/state/movement/Cargo.toml index 7c0cf2037ff..d41ccd1bf2a 100644 --- a/voyager/modules/state/movement/Cargo.toml +++ b/voyager/modules/state/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-state-module-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/modules/state/sui/Cargo.toml b/voyager/modules/state/sui/Cargo.toml index 2461282b53a..15a36d2534a 100644 --- a/voyager/modules/state/sui/Cargo.toml +++ b/voyager/modules/state/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-state-module-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/attestor/evm/Cargo.toml b/voyager/plugins/attestor/evm/Cargo.toml index b69c19978d2..ba8e8679c07 100644 --- a/voyager/plugins/attestor/evm/Cargo.toml +++ b/voyager/plugins/attestor/evm/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-plugin-attestor-evm" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/arbitrum/Cargo.toml b/voyager/plugins/client-update/arbitrum/Cargo.toml index 0f8c632b559..4de5ae48305 100644 --- a/voyager/plugins/client-update/arbitrum/Cargo.toml +++ b/voyager/plugins/client-update/arbitrum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-arbitrum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/attested/Cargo.toml b/voyager/plugins/client-update/attested/Cargo.toml index d410c70dcc1..dcf80a08808 100644 --- a/voyager/plugins/client-update/attested/Cargo.toml +++ b/voyager/plugins/client-update/attested/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-attested" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/base/Cargo.toml b/voyager/plugins/client-update/base/Cargo.toml index f9133b8d567..3773c873e62 100644 --- a/voyager/plugins/client-update/base/Cargo.toml +++ b/voyager/plugins/client-update/base/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-base" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/berachain/Cargo.toml b/voyager/plugins/client-update/berachain/Cargo.toml index 8946fe3d19d..dd51aa6ce43 100644 --- a/voyager/plugins/client-update/berachain/Cargo.toml +++ b/voyager/plugins/client-update/berachain/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-berachain" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/bob/Cargo.toml b/voyager/plugins/client-update/bob/Cargo.toml index b9773e2043a..4d2465a5484 100644 --- a/voyager/plugins/client-update/bob/Cargo.toml +++ b/voyager/plugins/client-update/bob/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-bob" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/cometbls/Cargo.toml b/voyager/plugins/client-update/cometbls/Cargo.toml index a83b8f7a032..7dd4fe9bfe1 100644 --- a/voyager/plugins/client-update/cometbls/Cargo.toml +++ b/voyager/plugins/client-update/cometbls/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-cometbls" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/cometbls/src/callback.rs b/voyager/plugins/client-update/cometbls/src/callback.rs index e475fb7241f..41004c15f7c 100644 --- a/voyager/plugins/client-update/cometbls/src/callback.rs +++ b/voyager/plugins/client-update/cometbls/src/callback.rs @@ -64,7 +64,7 @@ impl Module { { let mut header = Header { signed_header: LightHeader { - height: prove_request.untrusted_header.height, + height: prove_request.untrusted_header.height.into(), time: prove_request.untrusted_header.time, validators_hash: prove_request .untrusted_header diff --git a/voyager/plugins/client-update/cometbls/src/main.rs b/voyager/plugins/client-update/cometbls/src/main.rs index f6bd972780c..8ecdb61df07 100644 --- a/voyager/plugins/client-update/cometbls/src/main.rs +++ b/voyager/plugins/client-update/cometbls/src/main.rs @@ -232,6 +232,7 @@ impl Module { // 3. compute trusted power let mut trusted_power = 0; for sig in signed_header.commit.signatures.iter() { + let sig = sig.clone().try_into().unwrap(); if let CommitSig::Commit { validator_address, .. } = sig @@ -436,6 +437,7 @@ impl PluginServer for Module { // don't find a validator for a given signature as the validator set // may have drifted (trusted validator set). for sig in signed_header.commit.signatures.iter() { + let sig = sig.clone().try_into().unwrap(); match sig { CommitSig::Absent => { debug!("validator did not sign"); diff --git a/voyager/plugins/client-update/ethereum/Cargo.toml b/voyager/plugins/client-update/ethereum/Cargo.toml index 4be64f5f31c..1696beac942 100644 --- a/voyager/plugins/client-update/ethereum/Cargo.toml +++ b/voyager/plugins/client-update/ethereum/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-ethereum" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/ethermint/Cargo.toml b/voyager/plugins/client-update/ethermint/Cargo.toml index 4392ae9a07a..0b4cceb38c2 100644 --- a/voyager/plugins/client-update/ethermint/Cargo.toml +++ b/voyager/plugins/client-update/ethermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-ethermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/movement/Cargo.toml b/voyager/plugins/client-update/movement/Cargo.toml index 4f65786ade8..42a31052441 100644 --- a/voyager/plugins/client-update/movement/Cargo.toml +++ b/voyager/plugins/client-update/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/parlia/Cargo.toml b/voyager/plugins/client-update/parlia/Cargo.toml index 51bce798d89..4b36793b9a3 100644 --- a/voyager/plugins/client-update/parlia/Cargo.toml +++ b/voyager/plugins/client-update/parlia/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-parlia" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/proof-lens/Cargo.toml b/voyager/plugins/client-update/proof-lens/Cargo.toml index 73bce7c058f..aef3dd00a06 100644 --- a/voyager/plugins/client-update/proof-lens/Cargo.toml +++ b/voyager/plugins/client-update/proof-lens/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-proof-lens" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/state-lens/Cargo.toml b/voyager/plugins/client-update/state-lens/Cargo.toml index 3779b4dc108..f1530d135aa 100644 --- a/voyager/plugins/client-update/state-lens/Cargo.toml +++ b/voyager/plugins/client-update/state-lens/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-state-lens" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/sui/Cargo.toml b/voyager/plugins/client-update/sui/Cargo.toml index 89de9f20f9c..4f331442dea 100644 --- a/voyager/plugins/client-update/sui/Cargo.toml +++ b/voyager/plugins/client-update/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/tendermint/Cargo.toml b/voyager/plugins/client-update/tendermint/Cargo.toml index 59801c769cb..7a04692f682 100644 --- a/voyager/plugins/client-update/tendermint/Cargo.toml +++ b/voyager/plugins/client-update/tendermint/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-tendermint" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/client-update/trusted-mpt/Cargo.toml b/voyager/plugins/client-update/trusted-mpt/Cargo.toml index c9e891a8540..3da2dbe6a8c 100644 --- a/voyager/plugins/client-update/trusted-mpt/Cargo.toml +++ b/voyager/plugins/client-update/trusted-mpt/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-client-update-plugin-trusted-mpt" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/event-source/cosmwasm/Cargo.toml b/voyager/plugins/event-source/cosmwasm/Cargo.toml index 886aea5e610..9f2fe8fa827 100644 --- a/voyager/plugins/event-source/cosmwasm/Cargo.toml +++ b/voyager/plugins/event-source/cosmwasm/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-event-source-plugin-cosmwasm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/event-source/evm/Cargo.toml b/voyager/plugins/event-source/evm/Cargo.toml index 8103dced85b..861064a0577 100644 --- a/voyager/plugins/event-source/evm/Cargo.toml +++ b/voyager/plugins/event-source/evm/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-event-source-plugin-evm" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/event-source/movement/Cargo.toml b/voyager/plugins/event-source/movement/Cargo.toml index 59aff3c5488..21e9232db1f 100644 --- a/voyager/plugins/event-source/movement/Cargo.toml +++ b/voyager/plugins/event-source/movement/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-event-source-plugin-movement" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/event-source/starknet/Cargo.toml b/voyager/plugins/event-source/starknet/Cargo.toml index 0bc66814ea2..024cb91459c 100644 --- a/voyager/plugins/event-source/starknet/Cargo.toml +++ b/voyager/plugins/event-source/starknet/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-event-source-plugin-starknet" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/event-source/sui/Cargo.toml b/voyager/plugins/event-source/sui/Cargo.toml index 2fdb53556f8..5169722efc2 100644 --- a/voyager/plugins/event-source/sui/Cargo.toml +++ b/voyager/plugins/event-source/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-event-source-plugin-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/packet-batch/Cargo.toml b/voyager/plugins/packet-batch/Cargo.toml index 985e7fe275d..4945e4608c3 100644 --- a/voyager/plugins/packet-batch/Cargo.toml +++ b/voyager/plugins/packet-batch/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-packet-batch" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/packet-filter/Cargo.toml b/voyager/plugins/packet-filter/Cargo.toml index e371aa32e86..94722b23efb 100644 --- a/voyager/plugins/packet-filter/Cargo.toml +++ b/voyager/plugins/packet-filter/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-packet-filter" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/packet-index/Cargo.toml b/voyager/plugins/packet-index/Cargo.toml index bf3d36d49b2..d6a846e8c15 100644 --- a/voyager/plugins/packet-index/Cargo.toml +++ b/voyager/plugins/packet-index/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-packet-index" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/packet-timeout/Cargo.toml b/voyager/plugins/packet-timeout/Cargo.toml index 25c6495a737..ea88160ec73 100644 --- a/voyager/plugins/packet-timeout/Cargo.toml +++ b/voyager/plugins/packet-timeout/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-packet-timeout" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/periodic-client-update/Cargo.toml b/voyager/plugins/periodic-client-update/Cargo.toml index ca757275297..e54025ff312 100644 --- a/voyager/plugins/periodic-client-update/Cargo.toml +++ b/voyager/plugins/periodic-client-update/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-periodic-client-update-plugin" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/sui-ibc-app/Cargo.toml b/voyager/plugins/sui-ibc-app/Cargo.toml index 27e27ca8d61..ea4006d873d 100644 --- a/voyager/plugins/sui-ibc-app/Cargo.toml +++ b/voyager/plugins/sui-ibc-app/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-sui-ibc-app-plugin-zkgm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/sui-packet-timeout/Cargo.toml b/voyager/plugins/sui-packet-timeout/Cargo.toml index 12e9a7020e9..67cc8176421 100644 --- a/voyager/plugins/sui-packet-timeout/Cargo.toml +++ b/voyager/plugins/sui-packet-timeout/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-sui-packet-timeout" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction-batch-proof-lens/Cargo.toml b/voyager/plugins/transaction-batch-proof-lens/Cargo.toml index 8cd852729ed..c7165d9e3b3 100644 --- a/voyager/plugins/transaction-batch-proof-lens/Cargo.toml +++ b/voyager/plugins/transaction-batch-proof-lens/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-plugin-transaction-batch-proof-lens" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction-batch/Cargo.toml b/voyager/plugins/transaction-batch/Cargo.toml index 4cd7e1ea7ee..c4c21c7a90c 100644 --- a/voyager/plugins/transaction-batch/Cargo.toml +++ b/voyager/plugins/transaction-batch/Cargo.toml @@ -3,11 +3,11 @@ name = "voyager-plugin-transaction-batch" readme = "README.md" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction/aptos/Cargo.toml b/voyager/plugins/transaction/aptos/Cargo.toml index 7aa4aeb482c..16b8dae4c93 100644 --- a/voyager/plugins/transaction/aptos/Cargo.toml +++ b/voyager/plugins/transaction/aptos/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-transaction-plugin-aptos" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction/cosmos/Cargo.toml b/voyager/plugins/transaction/cosmos/Cargo.toml index a609e3be3fd..3f0b9c520af 100644 --- a/voyager/plugins/transaction/cosmos/Cargo.toml +++ b/voyager/plugins/transaction/cosmos/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-transaction-plugin-cosmos" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction/evm/Cargo.toml b/voyager/plugins/transaction/evm/Cargo.toml index 0c95231b091..ed414a981a5 100644 --- a/voyager/plugins/transaction/evm/Cargo.toml +++ b/voyager/plugins/transaction/evm/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-transaction-plugin-evm" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/transaction/sui/Cargo.toml b/voyager/plugins/transaction/sui/Cargo.toml index 58e8453dd32..fe99dd8aefa 100644 --- a/voyager/plugins/transaction/sui/Cargo.toml +++ b/voyager/plugins/transaction/sui/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-transaction-plugin-sui" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true diff --git a/voyager/plugins/zkgm-filter/Cargo.toml b/voyager/plugins/zkgm-filter/Cargo.toml index 2141d12277a..bf4729043af 100644 --- a/voyager/plugins/zkgm-filter/Cargo.toml +++ b/voyager/plugins/zkgm-filter/Cargo.toml @@ -2,11 +2,11 @@ name = "voyager-plugin-zkgm-filter" version = "0.0.0" -authors = { workspace = true } -edition = { workspace = true } -license-file = { workspace = true } -publish = { workspace = true } -repository = { workspace = true } +authors = { workspace = true } +edition = { workspace = true } +license = { workspace = true } +publish = { workspace = true } +repository = { workspace = true } [lints] workspace = true