From 10afaf23e8abf4266355859924ec47ae90f03c0c Mon Sep 17 00:00:00 2001 From: zsystm Date: Mon, 29 Jul 2024 16:33:13 +0900 Subject: [PATCH] add tc for working hash of modules --- app/app_test.go | 133 ++++++++++++++++++++++++++++++++++++++- app/height4-genesis.json | 1 + 2 files changed, 131 insertions(+), 3 deletions(-) create mode 100644 app/height4-genesis.json diff --git a/app/app_test.go b/app/app_test.go index fb2d9205..c68cfbdd 100644 --- a/app/app_test.go +++ b/app/app_test.go @@ -1,18 +1,40 @@ package app import ( + "encoding/hex" "encoding/json" + "fmt" "os" "testing" - - "github.com/stretchr/testify/require" + "time" "cosmossdk.io/log" - + "cosmossdk.io/store/iavl" + storetypes "cosmossdk.io/store/types" + upgradetypes "cosmossdk.io/x/upgrade/types" + coinswaptypes "github.com/Canto-Network/Canto/v7/x/coinswap/types" + epochstypes "github.com/Canto-Network/Canto/v7/x/epochs/types" + inflationtypes "github.com/Canto-Network/Canto/v7/x/inflation/types" abci "github.com/cometbft/cometbft/abci/types" + "github.com/cometbft/cometbft/state" + tmtypes2 "github.com/cometbft/cometbft/types" dbm "github.com/cosmos/cosmos-db" "github.com/cosmos/cosmos-sdk/baseapp" simtestutil "github.com/cosmos/cosmos-sdk/testutil/sims" + authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" + banktypes "github.com/cosmos/cosmos-sdk/x/bank/types" + consensustypes "github.com/cosmos/cosmos-sdk/x/consensus/types" + crisistypes "github.com/cosmos/cosmos-sdk/x/crisis/types" + distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/migrations/v1" + govtypes "github.com/cosmos/cosmos-sdk/x/gov/types" + paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" + slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" + stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + capabilitytypes "github.com/cosmos/ibc-go/modules/capability/types" + ibctransfertypes "github.com/cosmos/ibc-go/v8/modules/apps/transfer/types" + evmtypes "github.com/evmos/ethermint/x/evm/types" + feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" + "github.com/stretchr/testify/require" "github.com/Canto-Network/Canto/v7/types" ) @@ -66,3 +88,108 @@ func TestCantoExport(t *testing.T) { _, err = app2.ExportAppStateAndValidators(false, []string{}, []string{}) require.NoError(t, err, "ExportAppStateAndValidators should not have an error") } + +// TestWorkingHash tests that the working hash of the IAVL store is calculated correctly during the initialization phase of the genesis, given the initial height specified in the GenesisDoc. +func TestWorkingHash(t *testing.T) { + gdoc, err := state.MakeGenesisDocFromFile("height4-genesis.json") + require.NoError(t, err) + + gs, err := state.MakeGenesisState(gdoc) + require.NoError(t, err) + + tmpDir := fmt.Sprintf("test-%s", time.Now().String()) + db, err := dbm.NewGoLevelDB("test", tmpDir, nil) + app := NewCanto(log.NewNopLogger(), db, nil, true, map[int64]bool{}, DefaultNodeHome, 0, false, simtestutil.NewAppOptionsWithFlagHome(DefaultNodeHome), baseapp.SetChainID("canto_9000-1")) + + pbparams := gdoc.ConsensusParams.ToProto() + // Initialize the chain + _, err = app.InitChain(&abci.RequestInitChain{ + Time: gdoc.GenesisTime, + ChainId: gdoc.ChainID, + ConsensusParams: &pbparams, + Validators: tmtypes2.TM2PB.ValidatorUpdates(gs.Validators), + AppStateBytes: gdoc.AppState, + InitialHeight: gdoc.InitialHeight, + }) + require.NoError(t, err) + + _, err = app.FinalizeBlock(&abci.RequestFinalizeBlock{ + Height: gdoc.InitialHeight, + Time: time.Now(), + }) + require.NoError(t, err) + //_, err = app.Commit() + //require.NoError(t, err) + + storeKeys := app.GetStoreKeys() + // deterministicKeys are module keys which has always same working hash whenever run this test. (non deterministic module: staking) + deterministicKeys := []string{ + authtypes.StoreKey, banktypes.StoreKey, capabilitytypes.StoreKey, coinswaptypes.StoreKey, + consensustypes.StoreKey, crisistypes.StoreKey, distrtypes.StoreKey, epochstypes.StoreKey, + evmtypes.StoreKey, feemarkettypes.StoreKey, govtypes.StoreKey, ibctransfertypes.StoreKey, + inflationtypes.StoreKey, paramstypes.StoreKey, slashingtypes.StoreKey, upgradetypes.StoreKey} + // workingHashWithZeroInitialHeight is the working hash of the IAVL store with initial height 0 with given genesis. + // you can get this hash by running the test with iavl v1.1.2 with printing working hash (ref. https://github.com/b-harvest/cosmos-sdk/commit/4f44d6a2fe80ee7fe8c4409b820226e3615c6500) + workingHashWithZeroInitialHeight := map[string]string{ + authtypes.StoreKey: "939df0607b42b9dc73166475d95b34acc46eb7700c773dfb4936877ed545f52a", + banktypes.StoreKey: "149427e950d1ab4ee88a2028b52930f2b15ce89483b4640ce2dc93f11965045f", + capabilitytypes.StoreKey: "379646e1b21b0d39607965b0ad2371f83eece289eb469d024dd8ffc3cfbb0cd0", + coinswaptypes.StoreKey: "33e007488bc655cb90eb3a0ade1ac0168eb0d9bb3dd369f0cd05783f1afc8689", + consensustypes.StoreKey: "35760e4a68fbc1cdd5b3b181b90d04f51390a0aa55476cdb40924d1494bf3d1d", + crisistypes.StoreKey: "0244e5ce8733dda116da9b110abe8e4624bed97cb0d9342d685bfff3b7bec819", + distrtypes.StoreKey: "6da642a5ad9983f3d1590e950721d69e59611faadc2a5aaa46d462979658b743", + epochstypes.StoreKey: "afb6c6fdd19b56748393f6a0d07e07179b166c25e6f44fcd688c6d1dcb53b022", + evmtypes.StoreKey: "e5f6f682b247cd9812e05db063d355c3f2661aa12d03cf0b900879a1980d002b", + feemarkettypes.StoreKey: "986b2ae7d92fa552688e4370ae58009e7c2150d41741aae47e748de18bb49f67", + govtypes.StoreKey: "8e160b59f63d310da86e394c68deb47aa2cc47d61afec94b8677d6fb660dae43", + ibctransfertypes.StoreKey: "90fdae9ef2124b88045deea846624eed6bc9e5e5422fada847b882fb66d81f17", + inflationtypes.StoreKey: "2f694d43447679f2e058e5629d3305727566e5870dbea6010c574efa8e67ea8e", + paramstypes.StoreKey: "da7007ea1f6f90372c4bf724f30e024a95980353c09b5ed5272de30411604e53", + slashingtypes.StoreKey: "3abe3df91a605993b74446f58c82f17ae1dbebd155cb474c01972befa1e1ca03", + stakingtypes.StoreKey: "48c4ec05af62a8171124c88c2aeca67ca281a71df7047767ba0004d82e80ad84", + upgradetypes.StoreKey: "530a41d3858a8f8fb48ec710e543d633ff0b9ab71500f7c98a13515e53a0f6cd", + } + // workingHashWithZeroInitialHeight is the working hash of the IAVL store with correct initial height 4 with given genesis. + workingHashWithCorrectInitialHeight := map[string]string{ + authtypes.StoreKey: "b513a8bc783341508209bef42f2ca0d97f2e12e3f977e494d30ccd06ba2049f3", + banktypes.StoreKey: "cf0406a0e743fd4297d67b80dc245c81c466d722c8f2415c97b892d1da592c19", + capabilitytypes.StoreKey: "e9261548b1c687638721f75920e1c8e3f4f52cbd7ab3aeddc6c626cd8abc8718", + coinswaptypes.StoreKey: "57094d1ec4776eab36ae55145557a8679dca01529feed5e83bb1753a8849ed28", + consensustypes.StoreKey: "2573460b2ef3a08c825bdfb485e51680038530f70c45f0b723167ae09599761c", + crisistypes.StoreKey: "7c169f2c8fa4c6f64a61154e4fb3ffb3d74893a8bf6efdf50fc6e06d92979ecb", + distrtypes.StoreKey: "65cfb5c307b023ed80255b3ffc14e08b39cc00ecd7b710ff8b5bc96d1efdbda6", + epochstypes.StoreKey: "a26294cd8405c0e3cabc508c90d34317bfe547c90fd4be22223d27aecd819211", + evmtypes.StoreKey: "f2dcba601044394f83455be931d2ad78a08ede45873b16d8884d5f650db42f99", + feemarkettypes.StoreKey: "b8a66cce8e7809f521db9fdd71bfeb980966f1b74ef252bda65804d8b89da7de", + govtypes.StoreKey: "033e4a113195025eb54ecdeabffec5fd20605eae08da125d237768f1f3387616", + ibctransfertypes.StoreKey: "3ffd548eb86288efc51964649e36dc710f591c3d60d6f9c1b42f2a4d17870904", + inflationtypes.StoreKey: "b85bc597af9eb62c42e06b0f158bde591975585bab384e9666f89f80001b3d01", + paramstypes.StoreKey: "689664bc7d4f9aa8abeeb6ba13a556467e149d56e7bead89e8b574bdf8e0fe7f", + slashingtypes.StoreKey: "9da3ff2ded57e30dfea0371278d9043bea9f579421beb45b58ec7240e1b4f27a", + stakingtypes.StoreKey: "17b36186121d21b713a667c6cd534562bbc3095974ec866cb906cad7c2fa31e1", + upgradetypes.StoreKey: "9677219870ca98ba9868589ccdcd97411d9b82abc6a7aa1910016457b4730a93", + } + + matchAny := func(key string) bool { + for _, dk := range deterministicKeys { + if dk == key { + return true + } + } + return false + } + + for _, key := range storeKeys { + if key != nil && matchAny(key.Name()) { + kvstore := app.CommitMultiStore().GetCommitKVStore(key) + require.Equal(t, storetypes.StoreTypeIAVL, kvstore.GetStoreType()) + iavlStore, ok := kvstore.(*iavl.Store) + require.True(t, ok) + workingHash := hex.EncodeToString(iavlStore.WorkingHash()) + require.NotEqual(t, workingHashWithZeroInitialHeight[key.Name()], workingHash) + require.Equal(t, workingHashWithCorrectInitialHeight[key.Name()], workingHash) + } + } + // delete tmpDir + require.NoError(t, os.RemoveAll(tmpDir)) +} diff --git a/app/height4-genesis.json b/app/height4-genesis.json new file mode 100644 index 00000000..1ac350df --- /dev/null +++ b/app/height4-genesis.json @@ -0,0 +1 @@ +{"app_name":"cantod","app_version":"8.0.0-beta-2","genesis_time":"2024-07-29T06:30:51.161951Z","chain_id":"canto_9000-1","initial_height":"4","app_hash":null,"app_state":{"auth":{"params":{"max_memo_characters":"256","tx_sig_limit":"7","tx_size_cost_per_byte":"10","sig_verify_cost_ed25519":"590","sig_verify_cost_secp256k1":"1000"},"accounts":[{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1glht96kr2rseywuvhhay894qw7ekuc4qcjj2aw","pub_key":null,"account_number":"8","sequence":"0"},"name":"erc20","permissions":["minter","burner"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1fl48vsnmsdzcv85q5d2q4z5ajdha8yu38dgldl","pub_key":null,"account_number":"4","sequence":"0"},"name":"bonded_tokens_pool","permissions":["burner","staking"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1tygms3xhhs3yv487phx3dw4a95jn7t7lnd5wmt","pub_key":null,"account_number":"5","sequence":"0"},"name":"not_bonded_tokens_pool","permissions":["burner","staking"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1d4e35hk3gk4k6t5gh02dcm923z8ck86q5lkhl8","pub_key":null,"account_number":"7","sequence":"0"},"name":"inflation","permissions":["minter"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto10d07y265gmmuvt4z0w9aw880jnsr700jg5j4zm","pub_key":null,"account_number":"6","sequence":"0"},"name":"gov","permissions":["burner"]},{"@type":"/ethermint.types.v1.EthAccount","base_account":{"address":"canto1jfdykyt4hhmwhegh669c6exnjtfr3yparej8y8","pub_key":null,"account_number":"1","sequence":"0"},"code_hash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1jv65s3grqf6v6jl3dp4t6c9t9rk99cd84f9vah","pub_key":null,"account_number":"3","sequence":"0"},"name":"distribution","permissions":[]},{"@type":"/ethermint.types.v1.EthAccount","base_account":{"address":"canto1nhwql7xk6j5p7uaccur8ugv08flg6dn4wtnqya","pub_key":{"@type":"/ethermint.crypto.v1.ethsecp256k1.PubKey","key":"A3mgUmoShx5Qgww0TVtp6fKCeOr1ax2QCculwIZkWBa2"},"account_number":"0","sequence":"1"},"code_hash":"0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470"},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1k7nccsjnysj2c7e9snczukxxdxwxvzf9zhsef2","pub_key":null,"account_number":"9","sequence":"0"},"name":"govshuttle","permissions":["minter","burner"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto1cfen33znqea5xar3477w0ynsfkqkzykxrvxguj","pub_key":null,"account_number":"10","sequence":"0"},"name":"csr","permissions":["minter","burner"]},{"@type":"/cosmos.auth.v1beta1.ModuleAccount","base_account":{"address":"canto17xpfvakm2amg962yls6f84z3kell8c5lz0zsl4","pub_key":null,"account_number":"2","sequence":"0"},"name":"fee_collector","permissions":[]}]},"authz":{"authorization":[]},"bank":{"params":{"send_enabled":[],"default_send_enabled":true},"balances":[{"address":"canto1fl48vsnmsdzcv85q5d2q4z5ajdha8yu38dgldl","coins":[{"denom":"acanto","amount":"1000000000000000000000"}]},{"address":"canto1jfdykyt4hhmwhegh669c6exnjtfr3yparej8y8","coins":[{"denom":"acanto","amount":"100000000000000000000000000"}]},{"address":"canto1nhwql7xk6j5p7uaccur8ugv08flg6dn4wtnqya","coins":[{"denom":"acanto","amount":"99999000000000000000010000"}]}],"supply":[{"denom":"acanto","amount":"200000000000000000000010000"}],"denom_metadata":[],"send_enabled":[]},"capability":{"index":"2","owners":[{"index":"1","index_owners":{"owners":[{"module":"ibc","name":"ports/transfer"},{"module":"transfer","name":"ports/transfer"}]}}]},"coinswap":{"params":{"fee":"0.000000000000000000","pool_creation_fee":{"denom":"acanto","amount":"0"},"tax_rate":"0.000000000000000000","max_standard_coin_per_pool":"10000000000000000000000","max_swap_amount":[{"denom":"ibc/17CD484EE7D9723B847D95015FA3EBD1572FD13BC84FB838F55B18A57450F25B","amount":"10000000"},{"denom":"ibc/4F6A2DEFEA52CD8D90966ADCB2BD0593D3993AB0DF7F6AEB3EFD6167D79237B0","amount":"10000000"},{"denom":"ibc/DC186CA7A8C009B43774EBDC825C935CABA9743504CE6037507E6E5CCE12858A","amount":"10000000000000000"}]},"standard_denom":"acanto","pool":[],"sequence":"1"},"crisis":{"constant_fee":{"denom":"acanto","amount":"1000"}},"csr":{"params":{"enable_csr":false,"csr_shares":"0.200000000000000000"},"csrs":[],"turnstile_address":""},"distribution":{"params":{"community_tax":"0.020000000000000000","base_proposer_reward":"0.000000000000000000","bonus_proposer_reward":"0.000000000000000000","withdraw_addr_enabled":true},"fee_pool":{"community_pool":[]},"delegator_withdraw_infos":[],"previous_proposer":"cantovalcons1el6h5ahcyq8sxkycnkdtakg0nw8z7hvqgultse","outstanding_rewards":[{"validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","outstanding_rewards":[]}],"validator_accumulated_commissions":[{"validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","accumulated":{"commission":[]}}],"validator_historical_rewards":[{"validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","period":"1","rewards":{"cumulative_reward_ratio":[],"reference_count":2}}],"validator_current_rewards":[{"validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","rewards":{"rewards":[],"period":"2"}}],"delegator_starting_infos":[{"delegator_address":"canto1nhwql7xk6j5p7uaccur8ugv08flg6dn4wtnqya","validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","starting_info":{"previous_period":"1","stake":"1000000000000000000000.000000000000000000","height":"0"}}],"validator_slash_events":[]},"epochs":{"epochs":[{"identifier":"day","start_time":"2024-07-29T06:30:51.161951Z","duration":"86400s","current_epoch":"1","current_epoch_start_time":"2024-07-29T06:30:51.161951Z","epoch_counting_started":true,"current_epoch_start_height":"1"},{"identifier":"week","start_time":"2024-07-29T06:30:51.161951Z","duration":"604800s","current_epoch":"1","current_epoch_start_time":"2024-07-29T06:30:51.161951Z","epoch_counting_started":true,"current_epoch_start_height":"1"}]},"erc20":{"params":{"enable_erc20":true,"enable_evm_hook":true},"token_pairs":[],"denom_indexes":[],"erc20_address_indexes":[]},"evidence":{"evidence":[]},"evm":{"accounts":[{"address":"0x925a4b1175Bdf6EBE517d68B8D64D392D238903D","code":"","storage":[]},{"address":"0x9dDc0FF8D6D4a81f73B8c7067E218f3A7e8d3675","code":"","storage":[]}],"params":{"evm_denom":"acanto","enable_create":true,"enable_call":true,"extra_eips":[],"chain_config":{"homestead_block":"0","dao_fork_block":"0","dao_fork_support":true,"eip150_block":"0","eip150_hash":"0x0000000000000000000000000000000000000000000000000000000000000000","eip155_block":"0","eip158_block":"0","byzantium_block":"0","constantinople_block":"0","petersburg_block":"0","istanbul_block":"0","muir_glacier_block":"0","berlin_block":"0","london_block":"0","arrow_glacier_block":"0","gray_glacier_block":"0","merge_netsplit_block":"0","shanghai_block":"0","cancun_block":"0"},"allow_unprotected_txs":false}},"feegrant":{"allowances":[]},"feemarket":{"params":{"no_base_fee":false,"base_fee_change_denominator":8,"elasticity_multiplier":2,"enable_height":"0","base_fee":"671835938","min_gas_price":"0.000000000000000000","min_gas_multiplier":"0.500000000000000000"},"block_gas":"0"},"genutil":{"gen_txs":[]},"gov":{"starting_proposal_id":"1","deposits":[],"votes":[],"proposals":[],"deposit_params":null,"voting_params":null,"tally_params":null,"params":{"min_deposit":[{"denom":"acanto","amount":"10000000"}],"max_deposit_period":"172800s","voting_period":"172800s","quorum":"0.334000000000000000","threshold":"0.500000000000000000","veto_threshold":"0.334000000000000000","min_initial_deposit_ratio":"0.000000000000000000","proposal_cancel_ratio":"0.500000000000000000","proposal_cancel_dest":"","expedited_voting_period":"86400s","expedited_threshold":"0.667000000000000000","expedited_min_deposit":[{"denom":"acanto","amount":"50000000"}],"burn_vote_quorum":false,"burn_proposal_deposit_prevote":false,"burn_vote_veto":true,"min_deposit_ratio":"0.010000000000000000"},"constitution":""},"govshuttle":{"params":{},"port_contract_addr":""},"ibc":{"client_genesis":{"clients":[{"client_id":"09-localhost","client_state":{"@type":"/ibc.lightclients.localhost.v2.ClientState","latest_height":{"revision_number":"1","revision_height":"3"}}}],"clients_consensus":[],"clients_metadata":[],"params":{"allowed_clients":["*"]},"create_localhost":false,"next_client_sequence":"0"},"connection_genesis":{"connections":[{"id":"connection-localhost","client_id":"09-localhost","versions":[{"identifier":"1","features":["ORDER_ORDERED","ORDER_UNORDERED"]}],"state":"STATE_OPEN","counterparty":{"client_id":"09-localhost","connection_id":"connection-localhost","prefix":{"key_prefix":"aWJj"}},"delay_period":"0"}],"client_connection_paths":[],"next_connection_sequence":"0","params":{"max_expected_time_per_block":"30000000000"}},"channel_genesis":{"channels":[],"acknowledgements":[],"commitments":[],"receipts":[],"send_sequences":[],"recv_sequences":[],"ack_sequences":[],"next_channel_sequence":"0","params":{"upgrade_timeout":{"height":{"revision_number":"0","revision_height":"0"},"timestamp":"600000000000"}}}},"inflation":{"params":{"mint_denom":"acanto","exponential_calculation":{"a":"16304348.000000000000000000","r":"0.350000000000000000","c":"0.000000000000000000","bonding_target":"0.800000000000000000","max_variance":"0.000000000000000000"},"inflation_distribution":{"staking_rewards":"1.000000000000000000","community_pool":"0.000000000000000000"},"enable_inflation":false},"period":"0","epoch_identifier":"day","epochs_per_period":"30","skipped_epochs":"0"},"onboarding":{"params":{"enable_onboarding":true,"auto_swap_threshold":"4000000000000000000","whitelisted_channels":["channel-0"]}},"slashing":{"params":{"signed_blocks_window":"100","min_signed_per_window":"0.500000000000000000","downtime_jail_duration":"600s","slash_fraction_double_sign":"0.050000000000000000","slash_fraction_downtime":"0.010000000000000000"},"signing_infos":[{"address":"cantovalcons1el6h5ahcyq8sxkycnkdtakg0nw8z7hvqgultse","validator_signing_info":{"address":"cantovalcons1el6h5ahcyq8sxkycnkdtakg0nw8z7hvqgultse","start_height":"0","index_offset":"2","jailed_until":"1970-01-01T00:00:00Z","tombstoned":false,"missed_blocks_counter":"0"}}],"missed_blocks":[{"address":"cantovalcons1el6h5ahcyq8sxkycnkdtakg0nw8z7hvqgultse","missed_blocks":[]}]},"staking":{"params":{"unbonding_time":"1814400s","max_validators":100,"max_entries":7,"historical_entries":10000,"bond_denom":"acanto","min_commission_rate":"0.000000000000000000"},"last_total_power":"1000","last_validator_powers":[{"address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","power":"1000"}],"validators":[{"operator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","consensus_pubkey":{"@type":"/cosmos.crypto.ed25519.PubKey","key":"auKubr/a9EFLBqu8Dpcg3WnUpLZiRUEYkROpQB6miMs="},"jailed":false,"status":"BOND_STATUS_BONDED","tokens":"1000000000000000000000","delegator_shares":"1000000000000000000000.000000000000000000","description":{"moniker":"localtestnet","identity":"","website":"","security_contact":"","details":""},"unbonding_height":"0","unbonding_time":"1970-01-01T00:00:00Z","commission":{"commission_rates":{"rate":"0.100000000000000000","max_rate":"0.200000000000000000","max_change_rate":"0.010000000000000000"},"update_time":"2024-07-29T06:30:51.161951Z"},"min_self_delegation":"1","unbonding_on_hold_ref_count":"0","unbonding_ids":[]}],"delegations":[{"delegator_address":"canto1nhwql7xk6j5p7uaccur8ugv08flg6dn4wtnqya","validator_address":"cantovaloper1nhwql7xk6j5p7uaccur8ugv08flg6dn4v45y4c","shares":"1000000000000000000000.000000000000000000"}],"unbonding_delegations":[],"redelegations":[],"exported":true},"transfer":{"port_id":"transfer","denom_traces":[],"params":{"send_enabled":true,"receive_enabled":true},"total_escrowed":[]},"upgrade":{}},"consensus":{"validators":[{"address":"CFF57A76F8200F0358989D9ABED90F9B8E2F5D80","pub_key":{"type":"tendermint/PubKeyEd25519","value":"auKubr/a9EFLBqu8Dpcg3WnUpLZiRUEYkROpQB6miMs="},"power":"1000","name":"localtestnet"}],"params":{"block":{"max_bytes":"22020096","max_gas":"10000000"},"evidence":{"max_age_num_blocks":"100000","max_age_duration":"172800000000000","max_bytes":"1048576"},"validator":{"pub_key_types":["ed25519"]},"version":{"app":"0"},"abci":{"vote_extensions_enable_height":"0"}}}}