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 f7012b67a..c0d446a02 100644 --- a/substrate/genesis-liquidity/src/lib.rs +++ b/substrate/genesis-liquidity/src/lib.rs @@ -276,6 +276,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 309a326c3..7150f7cd2 100644 --- a/substrate/runtime/src/wasm/mod.rs +++ b/substrate/runtime/src/wasm/mod.rs @@ -535,6 +535,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() + } } }