use crypto::keys::slip10::Chain;
use crate::{
client::secret::types::{InputSigningData, InputSigningDataDto},
types::block::{
address::{dto::AddressDto, Address},
output::{dto::OutputDto, Output},
payload::{
transaction::{
dto::{TransactionEssenceDto, TransactionPayloadDto},
TransactionEssence,
},
TransactionPayload,
},
protocol::ProtocolParameters,
Error,
},
};
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PreparedTransactionData {
pub essence: TransactionEssence,
pub inputs_data: Vec<InputSigningData>,
pub remainder: Option<RemainderData>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PreparedTransactionDataDto {
pub essence: TransactionEssenceDto,
pub inputs_data: Vec<InputSigningDataDto>,
pub remainder: Option<RemainderDataDto>,
}
impl From<&PreparedTransactionData> for PreparedTransactionDataDto {
fn from(value: &PreparedTransactionData) -> Self {
Self {
essence: TransactionEssenceDto::from(&value.essence),
inputs_data: value.inputs_data.iter().map(InputSigningDataDto::from).collect(),
remainder: value.remainder.as_ref().map(RemainderDataDto::from),
}
}
}
impl PreparedTransactionData {
pub fn try_from_dto(
value: &PreparedTransactionDataDto,
protocol_parameters: &ProtocolParameters,
) -> Result<Self, Error> {
Ok(Self {
essence: TransactionEssence::try_from_dto(&value.essence, protocol_parameters)
.map_err(|_| Error::InvalidField("essence"))?,
inputs_data: value
.inputs_data
.iter()
.map(|i| InputSigningData::try_from_dto(i, protocol_parameters.token_supply()))
.collect::<crate::client::Result<Vec<InputSigningData>>>()
.map_err(|_| Error::InvalidField("input_data"))?,
remainder: match &value.remainder {
Some(remainder) => Some(
RemainderData::try_from_dto(remainder, protocol_parameters.token_supply())
.map_err(|_| Error::InvalidField("remainder"))?,
),
None => None,
},
})
}
pub fn try_from_dto_unverified(value: &PreparedTransactionDataDto) -> Result<Self, Error> {
Ok(Self {
essence: TransactionEssence::try_from_dto_unverified(&value.essence)
.map_err(|_| Error::InvalidField("essence"))?,
inputs_data: value
.inputs_data
.iter()
.map(InputSigningData::try_from_dto_unverified)
.collect::<crate::client::Result<Vec<InputSigningData>>>()
.map_err(|_| Error::InvalidField("inputs_data"))?,
remainder: match &value.remainder {
Some(remainder) => Some(
RemainderData::try_from_dto_unverified(remainder).map_err(|_| Error::InvalidField("remainder"))?,
),
None => None,
},
})
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SignedTransactionData {
pub transaction_payload: TransactionPayload,
pub inputs_data: Vec<InputSigningData>,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SignedTransactionDataDto {
pub transaction_payload: TransactionPayloadDto,
pub inputs_data: Vec<InputSigningDataDto>,
}
impl From<&SignedTransactionData> for SignedTransactionDataDto {
fn from(value: &SignedTransactionData) -> Self {
Self {
transaction_payload: TransactionPayloadDto::from(&value.transaction_payload),
inputs_data: value.inputs_data.iter().map(InputSigningDataDto::from).collect(),
}
}
}
impl SignedTransactionData {
pub fn try_from_dto(
value: &SignedTransactionDataDto,
protocol_parameters: &ProtocolParameters,
) -> Result<Self, Error> {
Ok(Self {
transaction_payload: TransactionPayload::try_from_dto(&value.transaction_payload, protocol_parameters)
.map_err(|_| Error::InvalidField("transaction_payload"))?,
inputs_data: value
.inputs_data
.iter()
.map(|i| InputSigningData::try_from_dto(i, protocol_parameters.token_supply()))
.collect::<crate::client::Result<Vec<InputSigningData>>>()
.map_err(|_| Error::InvalidField("input_data"))?,
})
}
pub fn try_from_dto_unverified(value: &SignedTransactionDataDto) -> Result<Self, Error> {
Ok(Self {
transaction_payload: TransactionPayload::try_from_dto_unverified(&value.transaction_payload)
.map_err(|_| Error::InvalidField("transaction_payload"))?,
inputs_data: value
.inputs_data
.iter()
.map(InputSigningData::try_from_dto_unverified)
.collect::<crate::client::Result<Vec<InputSigningData>>>()
.map_err(|_| Error::InvalidField("inputs_data"))?,
})
}
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct RemainderData {
pub output: Output,
pub chain: Option<Chain>,
pub address: Address,
}
#[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize)]
pub struct RemainderDataDto {
pub output: OutputDto,
pub chain: Option<Chain>,
pub address: AddressDto,
}
impl RemainderData {
pub(crate) fn try_from_dto(remainder: &RemainderDataDto, token_supply: u64) -> crate::client::Result<Self> {
Ok(Self {
output: Output::try_from_dto(&remainder.output, token_supply)?,
chain: remainder.chain.clone(),
address: Address::try_from(&remainder.address)?,
})
}
pub(crate) fn try_from_dto_unverified(remainder: &RemainderDataDto) -> crate::client::Result<Self> {
Ok(Self {
output: Output::try_from_dto_unverified(&remainder.output)?,
chain: remainder.chain.clone(),
address: Address::try_from(&remainder.address)?,
})
}
}
impl From<&RemainderData> for RemainderDataDto {
fn from(remainder: &RemainderData) -> Self {
Self {
output: OutputDto::from(&remainder.output),
chain: remainder.chain.clone(),
address: AddressDto::from(&remainder.address),
}
}
}
#[derive(Debug, Clone)]
pub struct RawAddresses {
pub public: Vec<Address>,
pub internal: Vec<Address>,
}
#[derive(Debug, Clone)]
pub struct Bech32Addresses {
pub public: Vec<String>,
pub internal: Vec<String>,
}