use serde::{Deserialize, Serialize};
use crate::{
client::api::input_selection::{Burn, BurnDto},
types::block::{
output::OutputId,
payload::{dto::TaggedDataPayloadDto, tagged_data::TaggedDataPayload},
Error,
},
wallet::account::types::address::AccountAddress,
};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct TransactionOptions {
#[serde(default)]
pub remainder_value_strategy: RemainderValueStrategy,
#[serde(default)]
pub tagged_data_payload: Option<TaggedDataPayload>,
#[serde(default)]
pub custom_inputs: Option<Vec<OutputId>>,
#[serde(default)]
pub mandatory_inputs: Option<Vec<OutputId>>,
pub burn: Option<Burn>,
pub note: Option<String>,
#[serde(default)]
pub allow_micro_amount: bool,
}
impl TransactionOptions {
pub fn try_from_dto(value: &TransactionOptionsDto) -> Result<Self, Error> {
Ok(Self {
remainder_value_strategy: value.remainder_value_strategy.clone(),
tagged_data_payload: value
.tagged_data_payload
.as_ref()
.map(TaggedDataPayload::try_from)
.transpose()?,
custom_inputs: value.custom_inputs.clone(),
mandatory_inputs: value.mandatory_inputs.clone(),
burn: value.burn.as_ref().map(Burn::try_from).transpose()?,
note: value.note.clone(),
allow_micro_amount: value.allow_micro_amount,
})
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "camelCase")]
pub struct TransactionOptionsDto {
#[serde(default)]
pub remainder_value_strategy: RemainderValueStrategy,
#[serde(default)]
pub tagged_data_payload: Option<TaggedDataPayloadDto>,
#[serde(default)]
pub custom_inputs: Option<Vec<OutputId>>,
#[serde(default)]
pub mandatory_inputs: Option<Vec<OutputId>>,
pub burn: Option<BurnDto>,
pub note: Option<String>,
#[serde(default)]
pub allow_micro_amount: bool,
}
#[allow(clippy::enum_variant_names)]
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "strategy", content = "value")]
pub enum RemainderValueStrategy {
ReuseAddress,
ChangeAddress,
CustomAddress(AccountAddress),
}
impl Default for RemainderValueStrategy {
fn default() -> Self {
Self::ReuseAddress
}
}