From 0cdea88f4edca22954ad41f104af7544356e1b4c Mon Sep 17 00:00:00 2001 From: Gonza Montiel Date: Wed, 10 Jul 2024 11:10:49 +0200 Subject: [PATCH] Expose moon_getLatestSyncedBlock RPC endpoint (#2858) * Expose RPC endpoint * add test * apply review suggestions --- client/rpc/finality/src/lib.rs | 19 +++++++++++++++++++ moonbeam-types-bundle/index.ts | 5 +++++ .../dev/moonbase/test-moon/test-moon-rpc.ts | 10 ++++++++++ .../moonbase/interfaces/augment-api-rpc.ts | 2 ++ .../moonbase/interfaces/moon/definitions.ts | 5 +++++ 5 files changed, 41 insertions(+) diff --git a/client/rpc/finality/src/lib.rs b/client/rpc/finality/src/lib.rs index 24e1e87f92..988d8d316c 100644 --- a/client/rpc/finality/src/lib.rs +++ b/client/rpc/finality/src/lib.rs @@ -14,10 +14,13 @@ // You should have received a copy of the GNU General Public License // along with Moonbeam. If not, see . use fc_rpc::frontier_backend_client::{self, is_canon}; + +use jsonrpsee::types::error::ErrorObject; use jsonrpsee::{core::RpcResult, proc_macros::rpc}; use sp_blockchain::HeaderBackend; use sp_core::H256; use sp_runtime::traits::Block; +use std::ops::Deref; use std::{marker::PhantomData, sync::Arc}; /// An RPC endpoint to check for finality of blocks and transactions in Moonbeam @@ -33,6 +36,10 @@ pub trait MoonbeamFinalityApi { /// Returns false if the transaction is not found #[method(name = "moon_isTxFinalized")] async fn is_tx_finalized(&self, tx_hash: H256) -> RpcResult; + + /// Gets the latest block hash that is fully indexed in frontier's backend. + #[method(name = "moon_getLatestBlockHash")] + async fn get_latest_block_hash(&self) -> RpcResult; } pub struct MoonbeamFinality { @@ -80,6 +87,18 @@ where Ok(false) } } + + async fn get_latest_block_hash(&self) -> RpcResult { + let res = self.backend.deref().latest_block_hash().await; + match res { + Ok(val) => Ok(val), + Err(e) => Err(ErrorObject::owned( + jsonrpsee::types::error::UNKNOWN_ERROR_CODE, + "No synced block", + Some(e), + )), + } + } } async fn is_block_finalized_inner, C: HeaderBackend + 'static>( diff --git a/moonbeam-types-bundle/index.ts b/moonbeam-types-bundle/index.ts index 3c3c47ab19..cccdf7a149 100644 --- a/moonbeam-types-bundle/index.ts +++ b/moonbeam-types-bundle/index.ts @@ -88,6 +88,11 @@ export const rpcDefinitions: Record Observable>; /** Returns whether an Ethereum transaction is finalized */ isTxFinalized: AugmentedRpc<(txHash: Hash | string | Uint8Array) => Observable>; + /** Returns the latest synced block from Frontier's backend */ + getLatestSyncedBlock: AugmentedRpc<() => Observable>; }; net: { /** Returns true if client is actively listening for network connections. Otherwise false. */ diff --git a/typescript-api/src/moonbase/interfaces/moon/definitions.ts b/typescript-api/src/moonbase/interfaces/moon/definitions.ts index d368c8f2b0..301a9c80d0 100644 --- a/typescript-api/src/moonbase/interfaces/moon/definitions.ts +++ b/typescript-api/src/moonbase/interfaces/moon/definitions.ts @@ -11,5 +11,10 @@ export default { params: [{ name: "txHash", type: "Hash" }], type: "bool", }, + getLatestSyncedBlock: { + description: "Returns the latest synced block from Frontier's backend", + params: [], + type: "u32", + }, }, };