use crate::{
client::{api::PreparedTransactionData, secret::SecretManage, ClientError},
types::block::output::{AddressUnlockCondition, DelegationId, DelegationOutputBuilder, MinimumOutputAmount},
wallet::{types::TransactionWithMetadata, Wallet, WalletError},
};
impl<S: 'static + SecretManage> Wallet<S>
where
WalletError: From<S::Error>,
ClientError: From<S::Error>,
{
pub async fn delay_delegation_claiming(
&self,
delegation_id: DelegationId,
reclaim_excess: bool,
) -> Result<TransactionWithMetadata, WalletError> {
let prepared_transaction = self
.prepare_delay_delegation_claiming(delegation_id, reclaim_excess)
.await?;
self.sign_and_submit_transaction(prepared_transaction, None).await
}
pub async fn prepare_delay_delegation_claiming(
&self,
delegation_id: DelegationId,
reclaim_excess: bool,
) -> Result<PreparedTransactionData, WalletError> {
let delegation_output = self
.ledger()
.await
.unspent_delegation_output(&delegation_id)
.ok_or(WalletError::MissingDelegation(delegation_id))?
.output
.clone();
let protocol_parameters = self.client().get_protocol_parameters().await?;
let builder =
DelegationOutputBuilder::from(delegation_output.as_delegation()).with_delegation_id(delegation_id);
let mut outputs = Vec::new();
if reclaim_excess {
outputs.push(
builder
.with_minimum_amount(protocol_parameters.storage_score_parameters())
.finish_output()?,
);
} else {
let min_delegation_amount =
delegation_output.minimum_amount(protocol_parameters.storage_score_parameters());
if delegation_output.amount() >= 2 * min_delegation_amount {
outputs.push(
builder
.with_minimum_amount(protocol_parameters.storage_score_parameters())
.finish_output()?,
);
outputs.push(
DelegationOutputBuilder::new_with_amount(
delegation_output.amount() - min_delegation_amount,
DelegationId::null(),
*delegation_output.as_delegation().validator_address(),
)
.add_unlock_condition(AddressUnlockCondition::new(
delegation_output.as_delegation().address().clone(),
))
.finish_output()?,
);
} else {
outputs.push(builder.finish_output()?);
}
};
self.prepare_send_outputs(outputs, None).await
}
}