!5179unit-test-expansion → develop5d023240d7

Unit coverage ≥ 80% for every file and package

AI-generatedEverything on this page was written by an AI agent from the diff: the summaries, the narration, the diagrams, the flags and the glossary. It can be wrong or incomplete, so check it against the code before you rely on it.

39commits
280files
68.6klines changed
373lines to read
71.3→90.0%main-module coverage
1,361new tests
21.2→90%README badge

Where the diff is

Tests250 files · 68,144 lines

…/regression/cmd/operations_cov_test.go+1,271 −0…/go-tss/tss/frost_keysign_cov_test.go+1,227 −0…/chainclients/ethereum/ethereum_cov_test.go+1,133 −0x/thorchain/migrations_mainnet_cov_test.go+1,126 −0…/chainclients/monero/signed_tx_payload_store_cov_test.go+1,124 −0x/thorchain/querier_covq_test.go+1,076 −0x/thorchain/manager_network_current_covc_test.go+1,069 −0…/chainclients/evm/client_cov_test.go+1,059 −0tools/events/activity_cov_test.go+834 −0…/actors/core/forced_to_leave_cov_test.go+823 −0…/monero/sidecar/client_cov_test.go+751 −0…/go-tss/tss/frost_keygen_cov_test.go+706 −0
+238 more filesshow fewer55,945tools/events/info_cov_test.go+670 −0…/keeper/v1/keeper_core_cov_test.go+634 −0…/client/cli/cli_cov_test.go+631 −0…/thorchain/types/type_misc_cov_test.go+631 −0x/thorchain/module_covc_test.go+626 −0…/chainclients/utxo/client_cov_test.go+608 −0…/chainclients/evm/evm_block_scanner_cov_test.go+599 −0…/actors/core/swap_memoless_cov_test.go+597 −0…/chainclients/evm/cov_harness_test.go+585 −0…/chainclients/tron/tron_client_cov_test.go+580 −0…/keeper/v1/keeper_misc_cov_test.go+570 −0…/chainclients/ethereum/ethereum_block_scanner_cov_test.go+565 −0…/actors/core/swap_cov_test.go+555 −0…/chainclients/solana/sol_keepalive_nonce_cov_test.go+551 −0x/thorchain/migrations_mainnet_fault_cov_test.go+550 −0…/actors/features/bond_yield_cov_test.go+547 −0x/thorchain/manager_pool_current_covc_test.go+542 −0x/thorchain/manager_txout_current_covc_test.go+540 −0…/shared/evm/misc_cov_test.go+519 −0…/regression/cmd/run_cov_test.go+504 −0…/pkg/evm/evm_cov_test.go+498 −0…/go-tss/tss/tss_server_cov_test.go+479 −0…/chainclients/monero/reorg_store_cov_test.go+472 −0bifrost/tss/recover_keyshares_cov_test.go+472 −0…/chainclients/ethereum/cov_helpers_test.go+459 −0…/thorchain/types/jsonpb_marshalers_cov_test.go+459 −0…/oracle/providers/provider_base_cov_test.go+457 −0…/chainclients/monero/scanner_migration_cov_test.go+457 −0…/actors/core/swap_aggregator_cov_test.go+447 −0…/chainclients/xrp/client_cov_test.go+443 −0x/thorchain/querier_txstages_covq_test.go+442 −0x/thorchain/querier_quotes_covq_test.go+425 −0…/keeper/v1/invariants_advswap_cov_test.go+422 −0…/actors/core/jailed_keysign_fallback_cov_test.go+413 −0x/thorchain/genesis_covc_test.go+413 −0…/keeper/v1/keeper_vault_node_cov_test.go+411 −0…/pkg/xrp/xrp_cov_test.go+408 −0…/actors/core/churn_cov_test.go+401 −0…/chainclients/ethereum/unstuck_cov_test.go+398 −0…/txscript/bchd-txscript/sign_cov_test.go+396 −0x/thorchain/manager_validator_current_covc_test.go+390 −0…/chainclients/monero/client_cov2_test.go+388 −0…/regression/cmd/export_cov_test.go+387 −0…/actors/core/cov_fakes_test.go+387 −0…/txscript/ltcd-txscript/sign_cov_test.go+386 −0…/txscript/txscript/sign_cov_test.go+386 −0…/chainclients/gaia/cosmos_client_cov_test.go+382 −0…/txscript/dogd-txscript/sign_cov_test.go+372 −0…/pkg/thornode/thornode_cov_test.go+371 −0bifrost/observer/attestation_state_init_cov_test.go+361 −0…/actors/features/inactive_vault_refunds_cov_test.go+359 −0cmd/bifrost/health_cov_test.go+357 −0…/go-tss/tss/frost_transcript_cov_test.go+356 −0tools/p2p-check/main_cov_test.go+351 −0…/regression/cmd/util_cov_test.go+347 −0…/chainclients/monero/client_cov3_test.go+342 −0x/thorchain/handler_covc_test.go+337 −0…/pkg/utxo/utxo_cov_test.go+335 −0…/shared/evm/token_manager_cov_test.go+334 −0cmd/bifrost/main_cov_test.go+331 −0…/actors/common/helpers_cov_test.go+329 −0bifrost/signer/sign_newsigner_cov_test.go+323 −0…/shared/evm/eth_rpc_cov_test.go+319 −0…/pkg/util/request_cov_test.go+318 −0…/chainclients/monero/client_cov4_test.go+316 −0app/app_cov_test.go+314 −0…/thorchain/types/msg_quorum_cov_test.go+313 −0common/address_cov_test.go+308 −0…/chainclients/monero/scanner_catchup_cov_test.go+306 −0…/actors/core/xmr_post_churn_cov_test.go+300 −0…/chainclients/monero/pending_internal_inbound_store_cov_test.go+299 −0…/actors/suites/suites_cov_test.go+299 −0cmd/bifrost/main_startup_cov_test.go+295 −0…/simulation/cmd/mocknet_cov_test.go+295 −0cmd/thornode/commands_cov_test.go+291 −0…/actors/features/memoless_refunds_cov_test.go+286 −0…/pkg/cosmos/cosmos_cov_test.go+282 −0…/pkg/solana/solana_cov_test.go+282 −0…/thorchain/types/msg_simple_cov_test.go+271 −0…/chainclients/monero/client_cov_test.go+269 −0x/thorchain/manager_wasm_current_covc_test.go+268 −0cmd/thornode/start_regtest_cov_test.go+267 −0x/thorchain/handler_add_liquidity_covc_test.go+266 −0…/actors/core/churn_balance_cov_test.go+265 −0…/solana/rpc/rpc_cov_test.go+263 −0tools/recover-keyshare-backup/main_cov_test.go+262 −0…/shared/mock/mock_cov_test.go+260 −0x/thorchain/handler_upgrade_covc_test.go+259 −0…/thorchain/types/type_event_cov_test.go+259 −0…/chainclients/evm/unstuck_cov_test.go+257 −0common/pubkey_cov_test.go+257 −0x/thorchain/handler_common_outbound_covc_test.go+255 −0x/thorchain/helpers_affiliates_covc_test.go+251 −0…/cmd/tss/main_seams_cov_test.go+250 −0bifrost/tss/keygen_cov_test.go+250 −0…/thornode/cmd/cmd_cov_test.go+246 −0…/chainclients/utxo/sign_utxo_cov_test.go+244 −0…/actors/core/cov_evm_fakes_test.go+242 −0…/actors/core/dual_lp_cov_test.go+236 −0…/pkg/types/types_cov_test.go+234 −0…/denom/keeper/keeper_cov_test.go+229 −0…/chainclients/monero/vault_cov_test.go+227 −0…/chainclients/solana/sol_scanner_scan_cov_test.go+226 −0…/actors/core/arb_cov_test.go+223 −0…/pkg/chainclients/loadchains_cov_test.go+222 −0…/actors/core/check_solvency_cov_test.go+222 −0x/thorchain/migrations_covc_test.go+222 −0…/oracle/providers/providers_cov_test.go+221 −0…/cmd/tss/main_cov_test.go+218 −0x/scheduler/module_cov_test.go+218 −0bifrost/thorclient/block_timestamp_cov_test.go+216 −0x/thorchain/querier_block_covq_test.go+216 −0…/pkg/monero/monero_cov_test.go+213 −0x/thorchain/grpc_query_covq_test.go+213 −0x/thorchain/ante_covc_test.go+212 −0…/client/cli/query_util_cov_test.go+210 −0…/pkg/tron/tron_cov_test.go+209 −0tools/gen-keyshare-fixtures/main_cov_test.go+208 −0x/thorchain/migration_data_covc_test.go+208 −0app/app_regtest_cov_test.go+205 −0…/oracle/providers/providers_specific_cov_test.go+205 −0…/monero/sidecar/server_cov_test.go+203 −0…/tron/api/tron_api_cov_test.go+202 −0…/thorchain/types/type_small_cov_test.go+199 −0…/pkg/chainclients/loadchains_retry_cov_test.go+195 −0…/actors/core/xmr_spent_refs_cov_test.go+193 −0…/actors/core/withdraw_lp_cov_test.go+191 −0…/cmd/tss-benchgen/main_test.go+189 −0x/thorchain/migrations_stagenet_cov_test.go+189 −0x/denom/module_cov_test.go+187 −0…/simulation/cmd/main_cov_test.go+186 −0…/actors/features/helpers_cov_test.go+185 −0…/providers/mock/server_test.go+183 −0…/simulation/cmd/main_run_cov_test.go+182 −0x/thorchain/handler_unbond_covc_test.go+180 −0bifrost/observer/event_client_cov_test.go+179 −0…/actors/features/consolidate_cov_test.go+177 −0x/thorchain/msg_server_covc_test.go+176 −0…/simulation/cmd/fakes_cov_test.go+173 −0…/thorchain/keeper/keeper_dummy_cov_test.go+172 −0…/chainclients/monero/client_cov5_test.go+171 −0…/chainclients/monero/scanner_misc_cov_test.go+171 −0…/actors/core/xmr_vault_balance_cov_test.go+171 −0bifrost/p2p/party_coordinator_cov_test.go+170 −0x/thorchain/handler_migrate_covc_test.go+169 −0x/thorchain/telemetry_vault_covc_test.go+167 −0…/cmd/tss-benchgen-eddsa/main_test.go+165 −0…/cmd/tss-benchsign-eddsa/main_test.go+165 −0…/chainclients/monero/scanner_errata_cov_test.go+164 −0…/go-tss/keysign/notifier_cov_test.go+164 −0tools/thorscan/thorscan_cov_test.go+163 −0common/relay/relay_cov_test.go+159 −0app/ante_grpc_cov_test.go+158 −0tools/events/security_cov_test.go+158 −0tools/gen-preparams/main_cov_test.go+156 −0…/cmd/tss-benchsign/main_test.go+155 −0…/monero/sidecar/adapter_cov_test.go+151 −0…/cmd/tss-benchgen/main_cov_test.go+148 −0x/thorchain/manager_misc_covc_test.go+147 −0x/thorchain/migration_helpers_covc_test.go+146 −0…/actors/core/xmr_frost_churn_readiness_cov_test.go+145 −0x/thorchain/handler_secured_asset_withdraw_covc_test.go+144 −0x/thorchain/manager_slasher_current_covc_test.go+142 −0…/keysign/eddsa/tss_keysign_cov_test.go+141 −0x/thorchain/handler_modify_limit_swap_covc_test.go+136 −0…/keeper/abci/abci_test.go+136 −0x/thorchain/handler_deposit_covc_test.go+134 −0…/upgrades/standard/upgrades_cov_test.go+133 −0…/pkg/cli/options_cov_test.go+133 −0x/thorchain/handler_rebond_covc_test.go+130 −0…/pkg/notify/notify_cov_test.go+127 −0x/thorchain/handler_mimir_covc_test.go+127 −0…/chainclients/monero/scanner_reorg_cov_test.go+124 −0bifrost/tss/encrypt_keyshares_cov_test.go+124 −0…/regression/cmd/config_cov_test.go+124 −0bifrost/p2p/communication_cov_test.go+121 −0…/client/cli/query_cov_test.go+119 −0x/thorchain/handler_bond_yield_covc_test.go+117 −0…/oracle/metrics/metrics_test.go+113 −0common/asset_cov_test.go+112 −0…/simulation/watchers/watchers_cov_test.go+111 −0x/thorchain/handler_bond_covc_test.go+110 −0x/thorchain/handler_maint_covc_test.go+110 −0…/thorchain/ebifrost/post_cov_test.go+107 −0tools/events/main_cov_test.go+101 −0tools/pubkey2address/pubkey2address_cov_test.go+101 −0…/simulation/cmd/helpers_cov_test.go+99 −0…/keygen/ecdsa/tss_keygen_cov_test.go+98 −0x/thorchain/handler_tcy_claim_covc_test.go+98 −0bifrost/pubkeymanager/mock_pool_address_validator_test.go+96 −0common/sign_cov_test.go+96 −0…/actors/core/mimir_cov_test.go+96 −0x/thorchain/handler_version_covc_test.go+96 −0…/shared/utxo/common_mainnet_cov_test.go+92 −0…/ecdsa_legacy/wrap_legacy/main_test.go+92 −0…/actors/common/main_cov_test.go+92 −0…/actors/features/main_cov_test.go+92 −0…/actors/suites/main_cov_test.go+92 −0tools/lint-whitelist-tokens/main_cov_test.go+91 −0…/pkg/dag/dag_cov_test.go+90 −0tools/pubkey2address/pubkey2address_network_cov_test.go+90 −0…/thorchain/keeper/mimir_cache_cov_test.go+81 −0bifrost/tss/mock_thorchain_keymanager_cov_test.go+78 −0x/thorchain/handler_node_pause_chain_covc_test.go+76 −0x/thorchain/handler_tcy_stake_covc_test.go+74 −0…/regression/cmd/setup_cov_test.go+71 −0tools/mimir-ids/main_cov_test.go+68 −0x/thorchain/querier_regtest_cov_test.go+68 −0x/thorchain/manager_event_current_covc_test.go+65 −0x/thorchain/migrations_chainnet_cov_test.go+62 −0common/tokenlist/token_list_cov_test.go+56 −0x/thorchain/handler_ragnarok_covc_test.go+52 −0…/actors/common/config_cov_test.go+50 −0…/actors/core/cov_evm_smoke_test.go+49 −0bifrost/tss/tss_signer_version_test.go+46 −0…/oracle/types/types_test.go+45 −0app/app_default_cov_test.go+42 −0…/blockscanner/types/types_test.go+30 −0…/p2p/messages/p2p_message_cov_test.go+30 −0common/oracle_price_cov_test.go+28 −0x/thorchain/xmr_genesis_delay_mocknet_covc_test.go+26 −0common/tcyclaimlist/tcy_claim_list_cov_test.go+22 −0…/keeper/v1/helpers_cov_test.go+21 −0…/denom/keeper/export_cov_test.go+13 −0…/chainclients/ethereum/mocknet_only_cov_test.go+10 −0…/chainclients/evm/mocknet_only_cov_test.go+10 −0…/chainclients/monero/mocknet_only_cov_test.go+10 −0…/chainclients/solana/mocknet_only_cov_test.go+10 −0…/chainclients/tron/mocknet_only_cov_test.go+10 −0tools/recover-keyshare-backup/mocknet_only_cov_test.go+10 −0…/keeper/v1/mocknet_only_cov_test.go+10 −0x/thorchain/mocknet_only_cov_test.go+10 −0app/regtest_off_cov_test.go+7 −0app/regtest_on_cov_test.go+7 −0…/go-tss/common/tss_test.go+3 −4cmd/bifrost/race_off_cov_test.go+6 −0cmd/bifrost/race_on_cov_test.go+6 −0bifrost/signer/sign_xmr_singleflight_test.go+3 −1
1make test-coverage-sum2strip generated from profile3tagged suites per network4total: 90.0%

4-minute explainer

What changed

Coverage before → after

Main 71→90%, go-tss 63→86%, simulation 22→93%; no file under 80%.

maingo-tsssimulation80%

Badge counts hand-written code

Strip every generated file, not just *.pb.go: badge 21.2% → 90.0%.

coverage.txtgit grep headergrep -vFftotal 90.0%

Network-tagged suites run in CI

mainnet, stagenet, chainnet and regtest suites run under their own tag.

mainnetstagenetchainnetregtest

Test seams

Package vars, main→run and named decode helpers; same behaviour.

cmd/bifrostgo-tss cmdtools/*tokenlist

Bifrost EVM fixes

Real pending block, no nil-TxOutItem panic, strict decimals.

BlockByNumber(pending)unstuck: nil item keptdecimals: uint8 | uint64-fit

Races and panics

Signer version mutex, Bitfinex short-array guard, ticker stopped.

versionMulen(ticker) guardtick.Stop()

State-machine fixes (unversioned)

Ragnarok redemption in one cache context; mint checks address first.

CacheContextsend RUNESetPoolragnarok markcommit() only if all succeed

Deflakes

Five tests get longer waits only; assertions unchanged.

5s→30s1s→10s20ms→2s20ms→2s

Line by line · every changed logic line, narrated

11:08runtime
24code chapters
100%logic lines narrated (318/318)
7flagged spots
speed

Chapters

What to check

Ask an AI about this change

Chat assistantClaude, ChatGPT, … (reads a link)

Coding agentClaude Code, Cursor, … (reads the repo)

The context file is context.md. Use Copy with context for an AI that can't open links; it pastes the whole file in.

Glossary

Bifrost
The off-chain service each node runs to watch external chains and sign outbounds via TSS. how-bifrost-works.md ↗
Build tags (mocknet, mainnet …)
Go build constraints selecting the network constants. CI unit tests run under mocknet; other tags now run in test-network-specific. Makefile ↗
CacheContext
A Cosmos SDK context whose store writes and events are buffered until commit() is called; dropping it discards them. Cosmos SDK context docs ↗
Cover profile
The coverage.txt file go test writes, one line per code block; the badge total is computed from it. coverage-strip-generated.sh ↗
gocheck
The gopkg.in/check.v1 suite framework most x/thorchain tests use; -check.f filters suites by name. gocheck ↗
Liability reconstruction
At startup, the EVM clients rebuild the value owed by each vault's pending transactions before signing is allowed. ethereum.go ↗
Ragnarok
Retiring a pool: liquidity is returned and synths redeemed. Here, the synth redemption step now commits its three writes atomically. ADR-015 ↗
Synth
A synthetic asset backed by pool liquidity. During ragnarok its RUNE value moves from Asgard to the Reserve. ADR-013 ↗
Test seam
A package-level variable defaulting to the real function, so a test can replace a slow or external call. cmd/bifrost/main.go ↗
Unstuck / TxOutItem
Unstuck cancels outbounds stuck in the mempool; TxOutItem is the outbound record whose height the cancel is signed at. evm/unstuck.go ↗
Unversioned change
State-machine behaviour changed without a version gate; safe only if every node switches binaries at the same height. test-consensus-determinism.md ↗