BaseRpcClient

Struct BaseRpcClient 

Source
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

Source

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
Source

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.
Source

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.
Source

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(())
}
Source

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.
Source

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

Source

pub async fn get_domain_agreement( &self, shard: Shard, ) -> Result<DomainAgreement, RpcError>

Gets the Domain Agreement for the provided shard.

§Parameters
  • shard - the shard to query the agreement for
§Errors

Returns RpcError if:

  • There’s no active agreement;
  • The connection to the base layer RPC fails; or
  • There’s a protocol conversion error.
Source

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.

Source

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(())
}
Source

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
§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.
Source

pub async fn get_sdl_status( &self, hash: HashDigest, ) -> Result<SdlStatus, RpcError>

Retrieves the status of a State Diff List (SDL).

§Parameters
§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.
Source

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

Source§

fn clone(&self) -> BaseRpcClient

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for BaseRpcClient

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> FromRef<T> for T
where T: Clone,

§

fn from_ref(input: &T) -> T

Converts to this type from a reference to the input type.
§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoRequest<T> for T

Source§

fn into_request(self) -> Request<T>

Wrap the input message T in a tonic::Request
§

impl<T> Pipe for T
where T: ?Sized,

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows 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) -> R
where R: 'a,

Mutably borrows 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
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows 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
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows 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
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .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
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .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
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more