From 9ea70a52c7574f17986cd0966aeb87529303c856 Mon Sep 17 00:00:00 2001 From: Rodrigo Quelhas Date: Mon, 18 May 2026 21:40:10 +0100 Subject: [PATCH 1/2] Wire SubstrateConfigBuilder::set_genesis_hash through to Config::genesis_hash `SubstrateConfigBuilder::set_genesis_hash` stored the value on the builder, but `build()` did not propagate it to `SubstrateConfigInner`, and `impl Config for SubstrateConfig` never overrode `genesis_hash()`, falling back to the trait default of `None`. As a result, offline workflows that rely on the configured genesis hash (e.g. `OfflineClient::new_with_config(...).at_block(...).tx().create_signable_offline(...)`) fail with `ExtrinsicError::GenesisHashNotProvided` even when the user calls `set_genesis_hash`. The online path is unaffected because the genesis hash comes from the network and is stored on `OnlineClient`. `PolkadotConfig` inherits the same behaviour since its `genesis_hash()` delegates to the wrapped `SubstrateConfig`. Add the missing wiring (one field, one impl method) and a couple of tests covering the two paths. --- subxt/src/config/substrate.rs | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/subxt/src/config/substrate.rs b/subxt/src/config/substrate.rs index ebb8131370d..f8724dcb4aa 100644 --- a/subxt/src/config/substrate.rs +++ b/subxt/src/config/substrate.rs @@ -102,6 +102,7 @@ impl SubstrateConfigBuilder { legacy_types: self.legacy_types, spec_and_transaction_version_for_block_number: self .spec_and_transaction_version_for_block_number, + genesis_hash: self.genesis_hash, metadata_for_spec_version: self.metadata_for_spec_version, }), } @@ -132,6 +133,7 @@ pub struct SubstrateConfig { struct SubstrateConfigInner { legacy_types: Option, spec_and_transaction_version_for_block_number: RangeMap, + genesis_hash: Option, metadata_for_spec_version: RwLock>, } @@ -191,6 +193,10 @@ impl Config for SubstrateConfig { .cloned() } + fn genesis_hash(&self) -> Option { + self.inner.genesis_hash + } + fn set_metadata_for_spec_version(&self, spec_version: u32, metadata: ArcMetadata) { self.inner .metadata_for_spec_version @@ -558,4 +564,17 @@ mod test { serde_json::from_str(numeric_block_number_json).expect("valid block header"); assert_eq!(header.number(), 4); } + + #[test] + fn builder_propagates_genesis_hash() { + let hash = H256::from([42u8; 32]); + let config = SubstrateConfig::builder().set_genesis_hash(hash).build(); + assert_eq!(::genesis_hash(&config), Some(hash)); + } + + #[test] + fn builder_without_genesis_hash_returns_none() { + let config = SubstrateConfig::builder().build(); + assert_eq!(::genesis_hash(&config), None); + } } From 408826a4a5bc13372101cbedd03444c5c2e71431 Mon Sep 17 00:00:00 2001 From: Rodrigo Quelhas Date: Mon, 18 May 2026 22:10:44 +0100 Subject: [PATCH 2/2] Import HashFor instead of qualifying with super:: --- subxt/src/config/substrate.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/subxt/src/config/substrate.rs b/subxt/src/config/substrate.rs index f8724dcb4aa..a7c791753a0 100644 --- a/subxt/src/config/substrate.rs +++ b/subxt/src/config/substrate.rs @@ -4,7 +4,9 @@ //! Substrate specific configuration -use super::{Config, DefaultExtrinsicParamsBuilder, DefaultTransactionExtensions, Hasher, Header}; +use super::{ + Config, DefaultExtrinsicParamsBuilder, DefaultTransactionExtensions, HashFor, Hasher, Header, +}; use crate::config::Hash; use crate::metadata::{ArcMetadata, Metadata}; use crate::utils::RangeMap; @@ -193,7 +195,7 @@ impl Config for SubstrateConfig { .cloned() } - fn genesis_hash(&self) -> Option { + fn genesis_hash(&self) -> Option> { self.inner.genesis_hash } @@ -569,7 +571,10 @@ mod test { fn builder_propagates_genesis_hash() { let hash = H256::from([42u8; 32]); let config = SubstrateConfig::builder().set_genesis_hash(hash).build(); - assert_eq!(::genesis_hash(&config), Some(hash)); + assert_eq!( + ::genesis_hash(&config), + Some(hash) + ); } #[test]