pub struct ClientBuilder {
pub(crate) module_inits: ClientModuleInitRegistry,
pub(crate) primary_module_instance: Option<ModuleInstanceId>,
pub(crate) admin_creds: Option<AdminCreds>,
pub(crate) db_no_decoders: Database,
pub(crate) meta_service: Arc<MetaService>,
pub(crate) connector: Connector,
pub(crate) stopped: bool,
pub(crate) log_event_added_transient_tx: Sender<EventLogEntry>,
}
Expand description
Used to configure, assemble and build Client
Fields§
§module_inits: ClientModuleInitRegistry
§primary_module_instance: Option<ModuleInstanceId>
§admin_creds: Option<AdminCreds>
§db_no_decoders: Database
§meta_service: Arc<MetaService>
§connector: Connector
§stopped: bool
§log_event_added_transient_tx: Sender<EventLogEntry>
Implementations§
Source§impl ClientBuilder
impl ClientBuilder
pub(crate) fn new(db: Database) -> Self
pub(crate) fn from_existing(client: &Client) -> Self
Sourcepub fn with_module_inits(&mut self, module_inits: ClientModuleInitRegistry)
pub fn with_module_inits(&mut self, module_inits: ClientModuleInitRegistry)
Replace module generator registry entirely
Sourcepub fn with_module<M: ClientModuleInit>(&mut self, module_init: M)
pub fn with_module<M: ClientModuleInit>(&mut self, module_init: M)
Make module generator available when reading the config
pub fn stopped(&mut self)
Sourcepub fn with_primary_module(&mut self, primary_module_instance: ModuleInstanceId)
pub fn with_primary_module(&mut self, primary_module_instance: ModuleInstanceId)
Uses this module with the given instance id as the primary module. See
ClientModule::supports_being_primary
for more information.
§Panics
If there was a primary module specified previously
pub fn with_meta_service(&mut self, meta_service: Arc<MetaService>)
pub(crate) async fn migrate_database(&self, db: &Database) -> Result<()>
pub fn db_no_decoders(&self) -> &Database
pub async fn load_existing_config(&self) -> Result<ClientConfig>
pub fn set_admin_creds(&mut self, creds: AdminCreds)
pub fn with_connector(&mut self, connector: Connector)
pub fn with_tor_connector(&mut self)
pub(crate) async fn init( self, pre_root_secret: DerivableSecret, config: ClientConfig, api_secret: Option<String>, init_mode: InitMode, ) -> Result<ClientHandle>
Sourcepub async fn join(
self,
pre_root_secret: DerivableSecret,
config: ClientConfig,
api_secret: Option<String>,
) -> Result<ClientHandle>
pub async fn join( self, pre_root_secret: DerivableSecret, config: ClientConfig, api_secret: Option<String>, ) -> Result<ClientHandle>
Join a new Federation
When a user wants to connect to a new federation this function fetches
the federation config and initializes the client database. If a user
already joined the federation in the past and has a preexisting database
use ClientBuilder::open
instead.
Warning: Calling join
with a root_secret
key that was used
previous to join
a Federation will lead to all sorts of malfunctions
including likely loss of funds.
This should be generally called only if the root_secret
key is known
not to have been used before (e.g. just randomly generated). For keys
that might have been previous used (e.g. provided by the user),
it’s safer to call Self::recover
which will attempt to recover
client module states for the Federation.
A typical “join federation” flow would look as follows:
// Create a root secret, e.g. via fedimint-bip39, see also:
// https://github.com/fedimint/fedimint/blob/master/docs/secret_derivation.md
// let root_secret = …;
// Get invite code from user
let invite_code = InviteCode::from_str("fed11qgqpw9thwvaz7te3xgmjuvpwxqhrzw3jxumrvvf0qqqjpetvlg8glnpvzcufhffgzhv8m75f7y34ryk7suamh8x7zetly8h0v9v0rm")
.expect("Invalid invite code");
let config = fedimint_api_client::api::net::Connector::default().download_from_invite_code(&invite_code).await
.expect("Error downloading config");
// Tell the user the federation name, bitcoin network
// (e.g. from wallet module config), and other details
// that are typically contained in the federation's
// meta fields.
// let network = config.get_first_module_by_kind::<WalletClientConfig>("wallet")
// .expect("Module not found")
// .network;
println!(
"The federation name is: {}",
config.meta::<String>(META_FEDERATION_NAME_KEY)
.expect("Could not decode name field")
.expect("Name isn't set")
);
// Open the client's database, using the federation ID
// as the DB name is a common pattern:
// let db_path = format!("./path/to/db/{}", config.federation_id());
// let db = RocksDb::open(db_path).expect("error opening DB");
let client = Client::builder(db).await.expect("Error building client")
// Mount the modules the client should support:
// .with_module(LightningClientInit)
// .with_module(MintClientInit)
// .with_module(WalletClientInit::default())
.join(root_secret, config, None)
.await
.expect("Error joining federation");
Sourcepub async fn download_backup_from_federation(
&self,
root_secret: &DerivableSecret,
config: &ClientConfig,
api_secret: Option<String>,
) -> Result<Option<ClientBackup>>
pub async fn download_backup_from_federation( &self, root_secret: &DerivableSecret, config: &ClientConfig, api_secret: Option<String>, ) -> Result<Option<ClientBackup>>
Download most recent valid backup found from the Federation
Sourcepub async fn recover(
self,
root_secret: DerivableSecret,
config: ClientConfig,
api_secret: Option<String>,
backup: Option<ClientBackup>,
) -> Result<ClientHandle>
pub async fn recover( self, root_secret: DerivableSecret, config: ClientConfig, api_secret: Option<String>, backup: Option<ClientBackup>, ) -> Result<ClientHandle>
Join a (possibly) previous joined Federation
Unlike Self::join
, recover
will run client module recovery for
each client module attempting to recover any previous module state.
Recovery process takes time during which each recovering client module will not be available for use.
Calling recovery
with a root_secret
that was not actually previous
used in a given Federation is safe.
pub async fn open( self, pre_root_secret: DerivableSecret, ) -> Result<ClientHandle>
Sourcepub(crate) async fn build(
self,
pre_root_secret: DerivableSecret,
config: ClientConfig,
api_secret: Option<String>,
stopped: bool,
) -> Result<ClientHandle>
pub(crate) async fn build( self, pre_root_secret: DerivableSecret, config: ClientConfig, api_secret: Option<String>, stopped: bool, ) -> Result<ClientHandle>
Build a Client
and start the executor
Sourcepub(crate) async fn build_stopped(
self,
root_secret: DerivableSecret,
config: &ClientConfig,
api_secret: Option<String>,
log_event_added_transient_tx: Sender<EventLogEntry>,
) -> Result<ClientHandle>
pub(crate) async fn build_stopped( self, root_secret: DerivableSecret, config: &ClientConfig, api_secret: Option<String>, log_event_added_transient_tx: Sender<EventLogEntry>, ) -> Result<ClientHandle>
Build a Client
but do not start the executor
pub(crate) async fn load_init_state(db: &Database) -> InitState
pub(crate) fn decoders(&self, config: &ClientConfig) -> ModuleDecoderRegistry
pub(crate) fn config_decoded( config: &ClientConfig, decoders: &ModuleDecoderRegistry, ) -> Result<ClientConfig, DecodeError>
Sourcepub(crate) fn federation_root_secret(
root_secret: &DerivableSecret,
config: &ClientConfig,
) -> DerivableSecret
pub(crate) fn federation_root_secret( root_secret: &DerivableSecret, config: &ClientConfig, ) -> DerivableSecret
Re-derive client’s root_secret
using the federation ID. This
eliminates the possibility of having the same client root_secret
across multiple federations.
Sourcepub fn get_event_log_transient_receiver(&self) -> Receiver<EventLogEntry>
pub fn get_event_log_transient_receiver(&self) -> Receiver<EventLogEntry>
Register to receiver all new transient (unpersisted) events
Auto Trait Implementations§
impl Freeze for ClientBuilder
impl !RefUnwindSafe for ClientBuilder
impl Send for ClientBuilder
impl Sync for ClientBuilder
impl Unpin for ClientBuilder
impl !UnwindSafe for ClientBuilder
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
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync 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> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§impl<T> FutureExt for T
impl<T> FutureExt for T
§fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
§fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
§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.