use crate::{
Api,
backtrace::Backtrace,
config::GearConfig,
result::Result,
signer::{calls::SignerCalls, storage::SignerStorage},
};
use core::ops::Deref;
pub use pair_signer::PairSigner;
use rpc::SignerRpc;
use sp_core::{Pair as PairT, crypto::Ss58Codec, sr25519::Pair};
use sp_runtime::AccountId32;
use std::sync::Arc;
mod calls;
mod pair_signer;
mod rpc;
mod storage;
mod utils;
#[derive(Clone)]
pub struct Signer(Arc<Inner>);
#[derive(Clone)]
pub struct Inner {
api: Api,
signer: PairSigner<GearConfig, Pair>,
nonce: Option<u64>,
backtrace: Backtrace,
}
impl Signer {
pub fn backtrace(&self) -> Backtrace {
self.0.backtrace.clone()
}
pub fn new(api: Api, suri: &str, passwd: Option<&str>) -> Result<Self> {
Ok(Self::from((
api,
PairSigner::new(Pair::from_string(suri, passwd)?),
)))
}
pub fn change(mut self, suri: &str, passwd: Option<&str>) -> Result<Self> {
Arc::make_mut(&mut self.0).signer = PairSigner::new(Pair::from_string(suri, passwd)?);
Ok(self)
}
pub fn set_nonce(&mut self, nonce: u64) {
Arc::make_mut(&mut self.0).nonce = Some(nonce);
}
}
impl Inner {
pub fn storage(&self) -> SignerStorage<'_> {
SignerStorage(self)
}
pub fn rpc(&self) -> SignerRpc<'_> {
SignerRpc(self)
}
pub fn calls(&self) -> SignerCalls<'_> {
SignerCalls(self)
}
pub fn address(&self) -> String {
self.account_id().to_ss58check()
}
pub fn account_id(&self) -> &AccountId32 {
self.signer.account_id()
}
pub fn api(&self) -> &Api {
&self.api
}
pub fn signer(&self) -> &PairSigner<GearConfig, Pair> {
&self.signer
}
}
impl From<(Api, PairSigner<GearConfig, Pair>)> for Signer {
fn from((api, signer): (Api, PairSigner<GearConfig, Pair>)) -> Self {
Self(
Inner {
api,
signer,
nonce: None,
backtrace: Backtrace::default(),
}
.into(),
)
}
}
impl Deref for Signer {
type Target = Inner;
fn deref(&self) -> &Inner {
&self.0
}
}