@@ -35,10 +35,12 @@ namespace kagome::host_api {
3535 StorageExtension::StorageExtension (
3636 std::shared_ptr<runtime::TrieStorageProvider> storage_provider,
3737 std::shared_ptr<const runtime::MemoryProvider> memory_provider,
38- std::shared_ptr<const crypto::Hasher> hasher)
38+ std::shared_ptr<const crypto::Hasher> hasher,
39+ LazySPtr<api::StateApi> state_api)
3940 : storage_provider_(std::move(storage_provider)),
4041 memory_provider_ (std::move(memory_provider)),
4142 hasher_(std::move(hasher)),
43+ state_api_(std::move(state_api)),
4244 logger_{log::createLogger (" StorageExtension" , " storage_extension" )} {
4345 BOOST_ASSERT (storage_provider_ != nullptr );
4446 BOOST_ASSERT (memory_provider_ != nullptr );
@@ -126,6 +128,31 @@ namespace kagome::host_api {
126128 SL_TRACE_VOID_FUNC_CALL (logger_, key, value);
127129
128130 auto batch = storage_provider_->getCurrentBatch ();
131+
132+ // Special handling for runtime code updates based on system version
133+ if (key == storage::kRuntimeCodeKey and state_api_.get ()) {
134+ uint8_t system_version = 0 ;
135+
136+ const auto runtime_version_res =
137+ state_api_.get ()->getRuntimeVersion (std::nullopt );
138+ if (runtime_version_res.has_value ()) {
139+ system_version = runtime_version_res.value ().system_version ;
140+ }
141+
142+ if (system_version >= 3 ) {
143+ SL_INFO (logger_,
144+ " Storing runtime code in :pending_code (system_version: {})" ,
145+ system_version);
146+ auto put_result = batch->put (storage::kPendingRuntimeCodeKey , value);
147+ if (not put_result) {
148+ logger_->error (
149+ " ext_set_storage failed to store pending code, reason: {}" ,
150+ put_result.error ());
151+ }
152+ return ;
153+ }
154+ }
155+
129156 auto put_result = batch->put (key, value);
130157 if (not put_result) {
131158 logger_->error (
0 commit comments