From 14f7fd94c3f57d5abcaed3f86233a31ed57bb12c Mon Sep 17 00:00:00 2001 From: akildemir Date: Thu, 23 Apr 2026 13:45:35 +0300 Subject: [PATCH 1/2] add economic security time endpoint to node --- substrate/client/serai/src/genesis_liquidity.rs | 6 ++++++ substrate/genesis-liquidity/src/lib.rs | 6 ++++++ substrate/node/src/rpc/genesis_liquidity.rs | 14 ++++++++++++++ substrate/runtime/src/common.rs | 4 ++++ substrate/runtime/src/std_runtime_api.rs | 4 ++++ substrate/runtime/src/wasm/mod.rs | 4 ++++ 6 files changed, 38 insertions(+) diff --git a/substrate/client/serai/src/genesis_liquidity.rs b/substrate/client/serai/src/genesis_liquidity.rs index 5e0653fc2..d94b4da02 100644 --- a/substrate/client/serai/src/genesis_liquidity.rs +++ b/substrate/client/serai/src/genesis_liquidity.rs @@ -32,4 +32,10 @@ impl State<'_> { pub async fn genesis_completed(&self) -> Result { self.call::("genesis-liquidity/completed", "").await } + + /// Returns the time economic security is achieved first time for all networks. + /// Returns `0` if it hasn't happen yet. + pub async fn economic_security_time(&self) -> Result { + self.call::("genesis-liquidity/economic-security", "").await + } } diff --git a/substrate/genesis-liquidity/src/lib.rs b/substrate/genesis-liquidity/src/lib.rs index eedc76caf..9cc81d51b 100644 --- a/substrate/genesis-liquidity/src/lib.rs +++ b/substrate/genesis-liquidity/src/lib.rs @@ -280,6 +280,12 @@ mod pallet { pub fn completed() -> bool { Oraclized::::get().is_some() } + + /// Returns the time economic security was achieved, represented in milliseconds since the epoch. + /// Returns `0` if it isn't achieved yet. + pub fn economic_security_time() -> u64 { + EconomicSecurityAchieved::::get().unwrap_or(0) + } } #[pallet::call] diff --git a/substrate/node/src/rpc/genesis_liquidity.rs b/substrate/node/src/rpc/genesis_liquidity.rs index e6b8c2a7c..3f0df0766 100644 --- a/substrate/node/src/rpc/genesis_liquidity.rs +++ b/substrate/node/src/rpc/genesis_liquidity.rs @@ -72,5 +72,19 @@ pub(crate) fn module( }, )?; + module.register_method( + "genesis-liquidity/economic-security", + |params, client, _ext| -> Result<_, Error> { + let Some(block_hash) = block_hash(client, ¶ms)? else { + Err(Error::InvalidStateReference)? + }; + + let Ok(time) = client.runtime_api().economic_security_time(block_hash) else { + Err(Error::Internal("couldn't fetch genesis period status"))? + }; + Ok(time) + }, + )?; + Ok(module) } diff --git a/substrate/runtime/src/common.rs b/substrate/runtime/src/common.rs index 0ccd36533..0e5cd5dd5 100644 --- a/substrate/runtime/src/common.rs +++ b/substrate/runtime/src/common.rs @@ -81,5 +81,9 @@ sp_api::decl_runtime_apis! { /// Next nonce to be used for this account. fn account_nonce(of: SeraiAddress) -> u32; + + /// Returns the time economic security was achieved, represented in milliseconds since the epoch. + /// Returns `0` if it isn't achieved yet. + fn economic_security_time() -> u64; } } diff --git a/substrate/runtime/src/std_runtime_api.rs b/substrate/runtime/src/std_runtime_api.rs index c1ba6f687..8725d3d04 100644 --- a/substrate/runtime/src/std_runtime_api.rs +++ b/substrate/runtime/src/std_runtime_api.rs @@ -201,5 +201,9 @@ sp_api::impl_runtime_apis! { fn account_nonce(of: SeraiAddress) -> u32 { unimplemented!("runtime is only implemented when WASM") } + + fn economic_security_time() -> u64 { + unimplemented!("runtime is only implemented when WASM") + } } } diff --git a/substrate/runtime/src/wasm/mod.rs b/substrate/runtime/src/wasm/mod.rs index 3e3bcafec..1c08fabcd 100644 --- a/substrate/runtime/src/wasm/mod.rs +++ b/substrate/runtime/src/wasm/mod.rs @@ -533,6 +533,10 @@ sp_api::impl_runtime_apis! { fn account_nonce(of: SeraiAddress) -> u32 { Core::next_nonce(&of) } + + fn economic_security_time() -> u64 { + GenesisLiquidity::economic_security_time() + } } } From c5d644b17ce7c1303d17d816f26ab770243b615e Mon Sep 17 00:00:00 2001 From: akildemir Date: Mon, 26 Oct 2026 14:48:02 +0300 Subject: [PATCH 2/2] return Option instead of 0 --- substrate/client/serai/src/genesis_liquidity.rs | 6 +++--- substrate/genesis-liquidity/src/lib.rs | 8 ++++---- substrate/runtime/src/common.rs | 6 +++--- substrate/runtime/src/std_runtime_api.rs | 2 +- substrate/runtime/src/wasm/mod.rs | 2 +- 5 files changed, 12 insertions(+), 12 deletions(-) diff --git a/substrate/client/serai/src/genesis_liquidity.rs b/substrate/client/serai/src/genesis_liquidity.rs index d94b4da02..e4b7c5abf 100644 --- a/substrate/client/serai/src/genesis_liquidity.rs +++ b/substrate/client/serai/src/genesis_liquidity.rs @@ -34,8 +34,8 @@ impl State<'_> { } /// Returns the time economic security is achieved first time for all networks. - /// Returns `0` if it hasn't happen yet. - pub async fn economic_security_time(&self) -> Result { - self.call::("genesis-liquidity/economic-security", "").await + /// Returns `None` if it hasn't happen yet. + pub async fn economic_security_time(&self) -> Result, RpcError> { + self.call::>("genesis-liquidity/economic-security", "").await } } diff --git a/substrate/genesis-liquidity/src/lib.rs b/substrate/genesis-liquidity/src/lib.rs index 9cc81d51b..ecef84816 100644 --- a/substrate/genesis-liquidity/src/lib.rs +++ b/substrate/genesis-liquidity/src/lib.rs @@ -281,10 +281,10 @@ mod pallet { Oraclized::::get().is_some() } - /// Returns the time economic security was achieved, represented in milliseconds since the epoch. - /// Returns `0` if it isn't achieved yet. - pub fn economic_security_time() -> u64 { - EconomicSecurityAchieved::::get().unwrap_or(0) + /// Returns the time economic security was achieved, represented in milliseconds + /// since the epoch. Returns `None` if it isn't achieved yet. + pub fn economic_security_time() -> Option { + EconomicSecurityAchieved::::get() } } diff --git a/substrate/runtime/src/common.rs b/substrate/runtime/src/common.rs index 0e5cd5dd5..5ea464fc6 100644 --- a/substrate/runtime/src/common.rs +++ b/substrate/runtime/src/common.rs @@ -82,8 +82,8 @@ sp_api::decl_runtime_apis! { /// Next nonce to be used for this account. fn account_nonce(of: SeraiAddress) -> u32; - /// Returns the time economic security was achieved, represented in milliseconds since the epoch. - /// Returns `0` if it isn't achieved yet. - fn economic_security_time() -> u64; + /// Returns the time economic security was achieved, represented in milliseconds + /// since the epoch. Returns `None` if it isn't achieved yet. + fn economic_security_time() -> Option; } } diff --git a/substrate/runtime/src/std_runtime_api.rs b/substrate/runtime/src/std_runtime_api.rs index 8725d3d04..b2b32aaa5 100644 --- a/substrate/runtime/src/std_runtime_api.rs +++ b/substrate/runtime/src/std_runtime_api.rs @@ -202,7 +202,7 @@ sp_api::impl_runtime_apis! { unimplemented!("runtime is only implemented when WASM") } - fn economic_security_time() -> u64 { + fn economic_security_time() -> Option { unimplemented!("runtime is only implemented when WASM") } } diff --git a/substrate/runtime/src/wasm/mod.rs b/substrate/runtime/src/wasm/mod.rs index 1c08fabcd..dd5d5a702 100644 --- a/substrate/runtime/src/wasm/mod.rs +++ b/substrate/runtime/src/wasm/mod.rs @@ -534,7 +534,7 @@ sp_api::impl_runtime_apis! { Core::next_nonce(&of) } - fn economic_security_time() -> u64 { + fn economic_security_time() -> Option { GenesisLiquidity::economic_security_time() } }