use crypto::keys::slip10::Chain;
use serde::{Deserialize, Serialize};
#[cfg(feature = "stronghold")]
use zeroize::ZeroizeOnDrop;
use crate::{
client::Result,
types::block::{
address::Address,
output::{
dto::{OutputDto, OutputMetadataDto},
Output, OutputId, OutputMetadata,
},
},
};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, ZeroizeOnDrop)]
#[cfg(feature = "stronghold")]
#[cfg_attr(docsrs, doc(cfg(feature = "stronghold")))]
#[serde(rename_all = "camelCase")]
pub struct StrongholdDto {
pub password: Option<String>,
pub timeout: Option<u64>,
pub snapshot_path: String,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AccountAddress {
pub address: Address,
pub key_index: u32,
pub internal: bool,
}
#[derive(Copy, Clone, Debug, Default, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase", default)]
pub struct GenerateAddressOptions {
pub internal: bool,
pub ledger_nano_prompt: bool,
}
impl GenerateAddressOptions {
pub const fn internal() -> Self {
Self {
internal: true,
ledger_nano_prompt: false,
}
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct LedgerApp {
pub(crate) name: String,
pub(crate) version: String,
}
impl LedgerApp {
pub fn name(&self) -> &String {
&self.name
}
pub fn version(&self) -> &String {
&self.version
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub enum LedgerDeviceType {
#[serde(alias = "ledgerNanoS")]
LedgerNanoS,
#[serde(alias = "ledgerNanoX")]
LedgerNanoX,
#[serde(alias = "ledgerNanoSPlus")]
LedgerNanoSPlus,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LedgerNanoStatus {
pub(crate) connected: bool,
pub(crate) locked: bool,
pub(crate) blind_signing_enabled: bool,
pub(crate) app: Option<LedgerApp>,
pub(crate) device: Option<LedgerDeviceType>,
pub(crate) buffer_size: Option<usize>,
}
impl LedgerNanoStatus {
pub fn connected(&self) -> bool {
self.connected
}
pub fn locked(&self) -> bool {
self.locked
}
pub fn blind_signing_enabled(&self) -> bool {
self.blind_signing_enabled
}
pub fn app(&self) -> Option<&LedgerApp> {
self.app.as_ref()
}
pub fn device(&self) -> Option<LedgerDeviceType> {
self.device
}
pub fn buffer_size(&self) -> Option<usize> {
self.buffer_size
}
}
#[derive(Clone, Debug, Eq, PartialEq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InputSigningData {
pub output: Output,
pub output_metadata: OutputMetadata,
pub chain: Option<Chain>,
}
impl InputSigningData {
pub fn output_id(&self) -> &OutputId {
self.output_metadata.output_id()
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct InputSigningDataDto {
pub output: OutputDto,
pub output_metadata: OutputMetadataDto,
pub chain: Option<Chain>,
}
impl InputSigningData {
pub(crate) fn try_from_dto(input: &InputSigningDataDto, token_supply: u64) -> Result<Self> {
Ok(Self {
output: Output::try_from_dto(&input.output, token_supply)?,
output_metadata: OutputMetadata::try_from(&input.output_metadata)?,
chain: input.chain.clone(),
})
}
pub(crate) fn try_from_dto_unverified(input: &InputSigningDataDto) -> Result<Self> {
Ok(Self {
output: Output::try_from_dto_unverified(&input.output)?,
output_metadata: OutputMetadata::try_from(&input.output_metadata)?,
chain: input.chain.clone(),
})
}
}
impl From<&InputSigningData> for InputSigningDataDto {
fn from(input: &InputSigningData) -> Self {
Self {
output: OutputDto::from(&input.output),
output_metadata: OutputMetadataDto::from(&input.output_metadata),
chain: input.chain.clone(),
}
}
}