pub struct BaseRpcClient { /* private fields */ }Expand description
Client for communicating with the delta base layer through RPC
BaseRpcClient provides a high-level interface for interacting with delta base layers. It handles connection management, request formatting, and response parsing for all base layer operations.
§Example
use delta_base_sdk::rpc::BaseRpcClient;
async fn connect() -> Result<(), Box<dyn std::error::Error>> {
// Connect to local base layer provider
let client = BaseRpcClient::new("http://localhost:50051").await?;
// Connect to a remote node with HTTPS
let secure_client = BaseRpcClient::new("https://baselayer.example.com").await?;
// Connect with just the host (HTTPS will be added automatically)
let auto_scheme_client = BaseRpcClient::new("baselayer.example.com").await?;
Ok(())
}Implementations§
Source§impl BaseRpcClient
impl BaseRpcClient
Sourcepub async fn new(
url: impl TryInto<Uri, Error = InvalidUri> + Send,
) -> Result<Self, RpcError>
pub async fn new( url: impl TryInto<Uri, Error = InvalidUri> + Send, ) -> Result<Self, RpcError>
Creates a new client by connecting to the specified base layer provider URL
This method establishes a connection to delta base layer at the specified URL. If the URL does not include a scheme (http:// or https://), HTTPS will be used automatically.
§Parameters
url- URL of base layer provider to connect to, either as a string or a URI
§Errors
Returns RpcError if:
- The URL cannot be parsed; or
- The connection cannot be established
Sourcepub async fn submit_transaction<T>(
&self,
tx: SignedTransaction<T>,
) -> Result<(), RpcError>
pub async fn submit_transaction<T>( &self, tx: SignedTransaction<T>, ) -> Result<(), RpcError>
Submits a signed transaction to the base layer network
This method sends a transaction to base layer for processing. The transaction must be properly signed with a valid signature from the transaction signer’s private key.
§Parameters
tx- Signed transaction to submit
§Errors
Returns RpcError if:
- The connection to the base layer provider fails;
- The base layer provider rejects the transaction; or
- There’s a protocol conversion error.
Sourcepub async fn get_base_vault(
&self,
owner: OwnerId,
) -> Result<BaseVault, RpcError>
pub async fn get_base_vault( &self, owner: OwnerId, ) -> Result<BaseVault, RpcError>
Gets the base vault for an owner in the base layer shard
This is a convenience method that calls get_vault
with the base layer shard (0).
§Parameters
owner- The ID of the vault owner
§Errors
Returns RpcError if:
- The vault doesn’t exist;
- The connection to the base layer provider fails; or
- There’s a protocol conversion error.
Sourcepub async fn get_vault(
&self,
address: Address,
) -> Result<ShardedVault, RpcError>
pub async fn get_vault( &self, address: Address, ) -> Result<ShardedVault, RpcError>
Retrieves a domain vault data for a specific address
§Parameters
address- of the vault to fetch
§Errors
Returns RpcError if:
- The vault under the given address doesn’t exist;
- The connection to the base layer provider fails; or
- There’s a protocol conversion error.
§Example
use delta_base_sdk::{
crypto::ed25519,
rpc::BaseRpcClient,
vaults::{Address, ReadableNativeBalance},
};
async fn get_vault_example(client: &BaseRpcClient) -> Result<(), Box<dyn std::error::Error>> {
let address = Address::new(ed25519::PubKey::generate().owner(), 1);
let vault = client.get_vault(address).await?;
println!("Vault data: {:?}", vault);
println!("Vault balance: {}", vault.balance());
Ok(())
}Sourcepub async fn get_vaults(
&self,
addresses: impl IntoIterator<Item = Address>,
) -> Result<HashMap<Address, ShardedVault>, RpcError>
pub async fn get_vaults( &self, addresses: impl IntoIterator<Item = Address>, ) -> Result<HashMap<Address, ShardedVault>, RpcError>
Retrieves multiple sharded vaults by address
This method fetches multiple vaults in a single request, up to a maximum of 100.
§Parameters
addresses- An iterator of addresses to retrieve
§Errors
Returns RpcError if:
- Any of the vaults don’t exist;
- The connection to the base layer provider fails; or
- There’s a protocol conversion error.
Sourcepub async fn get_domain_owner_ids(
&self,
shard: Shard,
) -> Result<Vec<OwnerId>, RpcError>
pub async fn get_domain_owner_ids( &self, shard: Shard, ) -> Result<Vec<OwnerId>, RpcError>
Returns all the OwnerId that have a vault registered for the given shard on the base layer
Sourcepub async fn get_domain_agreement(
&self,
shard: Shard,
) -> Result<DomainAgreement, RpcError>
pub async fn get_domain_agreement( &self, shard: Shard, ) -> Result<DomainAgreement, RpcError>
Sourcepub async fn get_transaction_status(
&self,
tx_id: TxId,
) -> Result<TransactionStatus, RpcError>
pub async fn get_transaction_status( &self, tx_id: TxId, ) -> Result<TransactionStatus, RpcError>
Retrieves the current status of a transaction by its signature
This method allows tracking the progress of a transaction through the delta network. After submitting a transaction, you can use this method to check if it has been processed, confirmed, or rejected.
§Parameters
tx_id- TxId of the transaction to query
§Errors
Returns RpcError if:
- The connection to the base layer provider fails; or
- The signature is invalid or unknown to the network.
§Note
Transaction signatures are unique identifiers generated when signing a transaction. Retain the signature after submitting a transaction if you want to check its status later.
Sourcepub async fn get_epoch(&self) -> Result<Epoch, RpcError>
pub async fn get_epoch(&self) -> Result<Epoch, RpcError>
Retrieves the current epoch in delta
This method returns the current epoch number. Epochs are protocol-defined periods in the delta protocol during which the base layer provider set remains constant.
§Errors
Returns RpcError if:
- The connection to the base layer provider fails
- The base layer provider cannot provide epoch information
§Example
use delta_base_sdk::rpc::BaseRpcClient;
async fn get_network_info() -> Result<(), Box<dyn std::error::Error>> {
let client = BaseRpcClient::new("http://localhost:50051").await?;
// Get information about the current epoch
let epoch = client.get_epoch().await?;
println!("Current epoch: {}", epoch);
Ok(())
}Sourcepub async fn get_sdl(&self, hash: HashDigest) -> Result<StateDiffList, RpcError>
pub async fn get_sdl(&self, hash: HashDigest) -> Result<StateDiffList, RpcError>
Retrieves a State Diff List (SDL) by its hash identifier
A State Diff List (SDL) is a batch of state changes in the delta protocol. This method allows retrieving the complete contents of an SDL by its hash, enabling applications to inspect state changes or verify transaction results.
§Parameters
hash- Cryptographic hash that uniquely identifies the SDL
§Errors
Returns RpcError if:
- The SDL with the specified hash doesn’t exist;
- The connection to the base layer provider fails; or
- There’s a protocol conversion error.
Sourcepub async fn get_sdl_status(
&self,
hash: HashDigest,
) -> Result<SdlStatus, RpcError>
pub async fn get_sdl_status( &self, hash: HashDigest, ) -> Result<SdlStatus, RpcError>
Retrieves the status of a State Diff List (SDL).
§Parameters
hash- Cryptographic hash that uniquely identifies the SDL
§Errors
Returns RpcError if:
- The SDL with the specified hash doesn’t exist;
- The connection to the base layer provider fails; or
- There’s a protocol conversion error.
Sourcepub async fn stream_base_layer_events(
&self,
shard: Shard,
) -> Result<impl Stream<Item = Result<BaseLayerEvent, RpcError>> + Send, RpcError>
pub async fn stream_base_layer_events( &self, shard: Shard, ) -> Result<impl Stream<Item = Result<BaseLayerEvent, RpcError>> + Send, RpcError>
Subscribes to a stream of real-time events from the delta network
This method establishes a streaming connection to receive events from the base layer as they occur. Events include epoch transitions, vault migrations, and other network state changes. The events are filtered by shard.
§Parameters
shard- Shard number to receive events for
§Errors
Returns RpcError if:
- The connection to the base layer provider fails;
- The streaming request is rejected; or
- Individual stream items may contain errors if there are issues during streaming.
§Example
use delta_base_sdk::{
events::BaseLayerEvent,
rpc::BaseRpcClient,
};
use tokio_stream::StreamExt;
async fn monitor_events() -> Result<(), Box<dyn std::error::Error>> {
let client = BaseRpcClient::new("http://localhost:50051").await?;
// Subscribe to base layer events for shard 0 (the base layer shard)
let mut event_stream = client.stream_base_layer_events(0).await?;
println!("Listening for events...");
// Process events as they arrive
while let Some(event_result) = event_stream.next().await {
match event_result {
Ok(event) => {
match event {
BaseLayerEvent::NewEpoch(epoch) => {
println!("New epoch started: {}", epoch);
},
BaseLayerEvent::SdlUpdate(update) => {
println!("SDL update received: {:?}", update.hash);
},
BaseLayerEvent::VaultEmigrated(address) => {
println!("Vault emigrated: {address:?}");
},
BaseLayerEvent::VaultImmigrated(address) => {
println!("Vault immigrated: {address:?}");
},
}
},
Err(e) => {
eprintln!("Error in event stream: {e}");
// Decide whether to break or continue based on the error
}
}
}
Ok(())
}§Note
The returned stream implements the Stream trait from the tokio_stream crate.
You need to bring the StreamExt trait into scope to use methods like next().
This is a long-lived connection that will continue to deliver events until the stream is dropped or the connection is closed. It’s suitable for building reactive applications that need to respond to network events in real-time.
Trait Implementations§
Source§impl Clone for BaseRpcClient
impl Clone for BaseRpcClient
Source§fn clone(&self) -> BaseRpcClient
fn clone(&self) -> BaseRpcClient
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreAuto Trait Implementations§
impl !Freeze for BaseRpcClient
impl !RefUnwindSafe for BaseRpcClient
impl Send for BaseRpcClient
impl Sync for BaseRpcClient
impl Unpin for BaseRpcClient
impl !UnwindSafe for BaseRpcClient
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.