diff --git a/crates/cdk-common/src/error.rs b/crates/cdk-common/src/error.rs index c40bad0f..d0264401 100644 --- a/crates/cdk-common/src/error.rs +++ b/crates/cdk-common/src/error.rs @@ -234,6 +234,9 @@ pub enum Error { /// Invalid transaction id #[error("Invalid transaction id")] InvalidTransactionId, + /// Transaction not found + #[error("Transaction not found")] + TransactionNotFound, /// Custom Error #[error("`{0}`")] Custom(String), diff --git a/crates/cdk/src/wallet/transactions.rs b/crates/cdk/src/wallet/transactions.rs index ea7eb6e0..3a0f618b 100644 --- a/crates/cdk/src/wallet/transactions.rs +++ b/crates/cdk/src/wallet/transactions.rs @@ -28,4 +28,30 @@ impl Wallet { Ok(transaction) } + + /// Revert a transaction + pub async fn revert_transaction(&self, id: TransactionId) -> Result<(), Error> { + let tx = self + .localstore + .get_transaction(id) + .await? + .ok_or(Error::TransactionNotFound)?; + + if tx.direction != TransactionDirection::Outgoing { + return Err(Error::InvalidTransactionDirection); + } + + let pending_spent_proofs = self + .get_pending_spent_proofs() + .await? + .into_iter() + .filter(|p| match p.y() { + Ok(y) => tx.ys.contains(&y), + Err(_) => false, + }) + .collect::>(); + + self.reclaim_unspent(pending_spent_proofs).await?; + Ok(()) + } }