feat: add finish related error
This commit is contained in:
parent
282fcfce0a
commit
e609b57bff
@ -51,6 +51,32 @@ interface WalletCreationError {
|
|||||||
LoadedNetworkDoesNotMatch(Network expected, Network? got);
|
LoadedNetworkDoesNotMatch(Network expected, Network? got);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
[Error]
|
||||||
|
interface CreateTxError {
|
||||||
|
Descriptor(string e);
|
||||||
|
Persist(string e);
|
||||||
|
Policy(string e);
|
||||||
|
SpendingPolicyRequired(string kind);
|
||||||
|
Version0();
|
||||||
|
Version1Csv();
|
||||||
|
LockTime(string requested, string required);
|
||||||
|
RbfSequence();
|
||||||
|
RbfSequenceCsv(string rbf, string csv);
|
||||||
|
FeeTooLow(u64 required);
|
||||||
|
FeeRateTooLow(string required);
|
||||||
|
NoUtxosSelected();
|
||||||
|
OutputBelowDustLimit(u64 index);
|
||||||
|
ChangePolicyDescriptor();
|
||||||
|
CoinSelection(string e);
|
||||||
|
InsufficientFunds(u64 needed, u64 available);
|
||||||
|
NoRecipients();
|
||||||
|
Psbt(string e);
|
||||||
|
MissingKeyOrigin(string key);
|
||||||
|
UnknownUtxo(string outpoint);
|
||||||
|
MissingNonWitnessUtxo(string outpoint);
|
||||||
|
MiniscriptPsbt(string e);
|
||||||
|
};
|
||||||
|
|
||||||
[Error]
|
[Error]
|
||||||
interface PersistenceError {
|
interface PersistenceError {
|
||||||
Write(string e);
|
Write(string e);
|
||||||
@ -302,7 +328,7 @@ interface TxBuilder {
|
|||||||
|
|
||||||
TxBuilder enable_rbf_with_sequence(u32 nsequence);
|
TxBuilder enable_rbf_with_sequence(u32 nsequence);
|
||||||
|
|
||||||
[Throws=Alpha3Error]
|
[Throws=CreateTxError]
|
||||||
Psbt finish([ByRef] Wallet wallet);
|
Psbt finish([ByRef] Wallet wallet);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -4,7 +4,7 @@ use bdk::bitcoin::psbt::PsbtParseError as BdkPsbtParseError;
|
|||||||
use bdk::bitcoin::Network;
|
use bdk::bitcoin::Network;
|
||||||
use bdk::chain::tx_graph::CalculateFeeError as BdkCalculateFeeError;
|
use bdk::chain::tx_graph::CalculateFeeError as BdkCalculateFeeError;
|
||||||
use bdk::descriptor::DescriptorError as BdkDescriptorError;
|
use bdk::descriptor::DescriptorError as BdkDescriptorError;
|
||||||
use bdk::wallet::error::{BuildFeeBumpError, CreateTxError};
|
use bdk::wallet::error::BuildFeeBumpError;
|
||||||
use bdk::wallet::signer::SignerError as BdkSignerError;
|
use bdk::wallet::signer::SignerError as BdkSignerError;
|
||||||
use bdk::wallet::tx_builder::{AddUtxoError, AllowShrinkingError};
|
use bdk::wallet::tx_builder::{AddUtxoError, AllowShrinkingError};
|
||||||
use bdk::wallet::{NewError, NewOrLoadError};
|
use bdk::wallet::{NewError, NewOrLoadError};
|
||||||
@ -19,7 +19,7 @@ use bdk::keys::bip39::Error as BdkBip39Error;
|
|||||||
|
|
||||||
use bdk::bitcoin::bip32;
|
use bdk::bitcoin::bip32;
|
||||||
|
|
||||||
use std::convert::Infallible;
|
use bdk::wallet::error::CreateTxError as BdkCreateTxError;
|
||||||
use std::convert::TryInto;
|
use std::convert::TryInto;
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
@ -64,6 +64,75 @@ pub enum Bip32Error {
|
|||||||
UnknownError { e: String },
|
UnknownError { e: String },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, thiserror::Error)]
|
||||||
|
pub enum CreateTxError {
|
||||||
|
#[error("Descriptor error: {e}")]
|
||||||
|
Descriptor { e: String },
|
||||||
|
|
||||||
|
#[error("Persistence failure: {e}")]
|
||||||
|
Persist { e: String },
|
||||||
|
|
||||||
|
#[error("Policy error: {e}")]
|
||||||
|
Policy { e: String },
|
||||||
|
|
||||||
|
#[error("Spending policy required for {kind}")]
|
||||||
|
SpendingPolicyRequired { kind: String },
|
||||||
|
|
||||||
|
#[error("Unsupported version 0")]
|
||||||
|
Version0,
|
||||||
|
|
||||||
|
#[error("Unsupported version 1 with CSV")]
|
||||||
|
Version1Csv,
|
||||||
|
|
||||||
|
#[error("Lock time conflict: requested {requested}, but required {required}")]
|
||||||
|
LockTime { requested: String, required: String },
|
||||||
|
|
||||||
|
#[error("Transaction requires RBF sequence number")]
|
||||||
|
RbfSequence,
|
||||||
|
|
||||||
|
#[error("RBF sequence: {rbf}, CSV sequence: {csv}")]
|
||||||
|
RbfSequenceCsv { rbf: String, csv: String },
|
||||||
|
|
||||||
|
#[error("Fee too low: {required} sat required")]
|
||||||
|
FeeTooLow { required: u64 },
|
||||||
|
|
||||||
|
#[error("Fee rate too low: {required}")]
|
||||||
|
FeeRateTooLow { required: String },
|
||||||
|
|
||||||
|
#[error("No UTXOs selected for the transaction")]
|
||||||
|
NoUtxosSelected,
|
||||||
|
|
||||||
|
#[error("Output value below dust limit at index {index}")]
|
||||||
|
OutputBelowDustLimit { index: u64 },
|
||||||
|
|
||||||
|
#[error("Change policy descriptor error")]
|
||||||
|
ChangePolicyDescriptor,
|
||||||
|
|
||||||
|
#[error("Coin selection failed: {e}")]
|
||||||
|
CoinSelection { e: String },
|
||||||
|
|
||||||
|
#[error("Insufficient funds: needed {needed} sat, available {available} sat")]
|
||||||
|
InsufficientFunds { needed: u64, available: u64 },
|
||||||
|
|
||||||
|
#[error("Transaction has no recipients")]
|
||||||
|
NoRecipients,
|
||||||
|
|
||||||
|
#[error("PSBT creation error: {e}")]
|
||||||
|
Psbt { e: String },
|
||||||
|
|
||||||
|
#[error("Missing key origin for: {key}")]
|
||||||
|
MissingKeyOrigin { key: String },
|
||||||
|
|
||||||
|
#[error("Reference to an unknown UTXO: {outpoint}")]
|
||||||
|
UnknownUtxo { outpoint: String },
|
||||||
|
|
||||||
|
#[error("Missing non-witness UTXO for outpoint: {outpoint}")]
|
||||||
|
MissingNonWitnessUtxo { outpoint: String },
|
||||||
|
|
||||||
|
#[error("Miniscript PSBT error: {e}")]
|
||||||
|
MiniscriptPsbt { e: String },
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug, thiserror::Error)]
|
#[derive(Debug, thiserror::Error)]
|
||||||
pub enum CalculateFeeError {
|
pub enum CalculateFeeError {
|
||||||
#[error("missing transaction output: {out_points:?}")]
|
#[error("missing transaction output: {out_points:?}")]
|
||||||
@ -362,6 +431,72 @@ pub enum ExtractTxError {
|
|||||||
OtherExtractTxErr,
|
OtherExtractTxErr,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl From<BdkCreateTxError<std::io::Error>> for CreateTxError {
|
||||||
|
fn from(error: BdkCreateTxError<std::io::Error>) -> Self {
|
||||||
|
match error {
|
||||||
|
BdkCreateTxError::Descriptor(e) => CreateTxError::Descriptor { e: e.to_string() },
|
||||||
|
BdkCreateTxError::Persist(e) => CreateTxError::Persist { e: e.to_string() },
|
||||||
|
BdkCreateTxError::Policy(e) => CreateTxError::Policy { e: e.to_string() },
|
||||||
|
BdkCreateTxError::SpendingPolicyRequired(kind) => {
|
||||||
|
CreateTxError::SpendingPolicyRequired {
|
||||||
|
kind: format!("{:?}", kind),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BdkCreateTxError::Version0 => CreateTxError::Version0,
|
||||||
|
BdkCreateTxError::Version1Csv => CreateTxError::Version1Csv,
|
||||||
|
BdkCreateTxError::LockTime {
|
||||||
|
requested,
|
||||||
|
required,
|
||||||
|
} => CreateTxError::LockTime {
|
||||||
|
requested: requested.to_string(),
|
||||||
|
required: required.to_string(),
|
||||||
|
},
|
||||||
|
BdkCreateTxError::RbfSequence => CreateTxError::RbfSequence,
|
||||||
|
BdkCreateTxError::RbfSequenceCsv { rbf, csv } => CreateTxError::RbfSequenceCsv {
|
||||||
|
rbf: rbf.to_string(),
|
||||||
|
csv: csv.to_string(),
|
||||||
|
},
|
||||||
|
BdkCreateTxError::FeeTooLow { required } => CreateTxError::FeeTooLow { required },
|
||||||
|
BdkCreateTxError::FeeRateTooLow { required } => CreateTxError::FeeRateTooLow {
|
||||||
|
required: required.to_string(),
|
||||||
|
},
|
||||||
|
BdkCreateTxError::NoUtxosSelected => CreateTxError::NoUtxosSelected,
|
||||||
|
BdkCreateTxError::OutputBelowDustLimit(index) => CreateTxError::OutputBelowDustLimit {
|
||||||
|
index: index as u64,
|
||||||
|
},
|
||||||
|
BdkCreateTxError::ChangePolicyDescriptor => CreateTxError::ChangePolicyDescriptor,
|
||||||
|
BdkCreateTxError::CoinSelection(e) => CreateTxError::CoinSelection { e: e.to_string() },
|
||||||
|
BdkCreateTxError::InsufficientFunds { needed, available } => {
|
||||||
|
CreateTxError::InsufficientFunds { needed, available }
|
||||||
|
}
|
||||||
|
BdkCreateTxError::NoRecipients => CreateTxError::NoRecipients,
|
||||||
|
BdkCreateTxError::Psbt(e) => CreateTxError::Psbt { e: e.to_string() },
|
||||||
|
BdkCreateTxError::MissingKeyOrigin(key) => CreateTxError::MissingKeyOrigin { key },
|
||||||
|
BdkCreateTxError::UnknownUtxo => CreateTxError::UnknownUtxo {
|
||||||
|
outpoint: "Unknown".to_string(),
|
||||||
|
},
|
||||||
|
BdkCreateTxError::MissingNonWitnessUtxo(outpoint) => {
|
||||||
|
CreateTxError::MissingNonWitnessUtxo {
|
||||||
|
outpoint: outpoint.to_string(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
BdkCreateTxError::MiniscriptPsbt(e) => {
|
||||||
|
CreateTxError::MiniscriptPsbt { e: e.to_string() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<AddUtxoError> for CreateTxError {
|
||||||
|
fn from(error: AddUtxoError) -> Self {
|
||||||
|
match error {
|
||||||
|
AddUtxoError::UnknownUtxo(outpoint) => CreateTxError::UnknownUtxo {
|
||||||
|
outpoint: outpoint.to_string(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl From<BdkDescriptorError> for DescriptorError {
|
impl From<BdkDescriptorError> for DescriptorError {
|
||||||
fn from(error: BdkDescriptorError) -> Self {
|
fn from(error: BdkDescriptorError) -> Self {
|
||||||
match error {
|
match error {
|
||||||
@ -492,12 +627,6 @@ impl From<BuildFeeBumpError> for Alpha3Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<CreateTxError<Infallible>> for Alpha3Error {
|
|
||||||
fn from(_: CreateTxError<Infallible>) -> Self {
|
|
||||||
Alpha3Error::Generic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<AddUtxoError> for Alpha3Error {
|
impl From<AddUtxoError> for Alpha3Error {
|
||||||
fn from(_: AddUtxoError) -> Self {
|
fn from(_: AddUtxoError) -> Self {
|
||||||
Alpha3Error::Generic
|
Alpha3Error::Generic
|
||||||
@ -544,12 +673,6 @@ impl From<NewError<std::io::Error>> for Alpha3Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<CreateTxError<std::io::Error>> for Alpha3Error {
|
|
||||||
fn from(_: CreateTxError<std::io::Error>) -> Self {
|
|
||||||
Alpha3Error::Generic
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl From<BdkCalculateFeeError> for CalculateFeeError {
|
impl From<BdkCalculateFeeError> for CalculateFeeError {
|
||||||
fn from(error: BdkCalculateFeeError) -> Self {
|
fn from(error: BdkCalculateFeeError) -> Self {
|
||||||
match error {
|
match error {
|
||||||
|
@ -20,6 +20,7 @@ use crate::error::Bip32Error;
|
|||||||
use crate::error::Bip39Error;
|
use crate::error::Bip39Error;
|
||||||
use crate::error::CalculateFeeError;
|
use crate::error::CalculateFeeError;
|
||||||
use crate::error::CannotConnectError;
|
use crate::error::CannotConnectError;
|
||||||
|
use crate::error::CreateTxError;
|
||||||
use crate::error::DescriptorError;
|
use crate::error::DescriptorError;
|
||||||
use crate::error::EsploraError;
|
use crate::error::EsploraError;
|
||||||
use crate::error::ExtractTxError;
|
use crate::error::ExtractTxError;
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
use crate::bitcoin::{FeeRate, OutPoint, Psbt, Script, Transaction};
|
use crate::bitcoin::{FeeRate, OutPoint, Psbt, Script, Transaction};
|
||||||
use crate::descriptor::Descriptor;
|
use crate::descriptor::Descriptor;
|
||||||
use crate::error::{
|
use crate::error::{
|
||||||
Alpha3Error, CalculateFeeError, CannotConnectError, PersistenceError, SignerError,
|
Alpha3Error, CalculateFeeError, CannotConnectError, CreateTxError, PersistenceError,
|
||||||
TxidParseError, WalletCreationError,
|
SignerError, TxidParseError, WalletCreationError,
|
||||||
};
|
};
|
||||||
use crate::types::{AddressIndex, AddressInfo, Balance, CanonicalTx, LocalOutput, ScriptAmount};
|
use crate::types::{AddressIndex, AddressInfo, Balance, CanonicalTx, LocalOutput, ScriptAmount};
|
||||||
|
|
||||||
@ -489,7 +489,7 @@ impl TxBuilder {
|
|||||||
// })
|
// })
|
||||||
// }
|
// }
|
||||||
|
|
||||||
pub(crate) fn finish(&self, wallet: &Arc<Wallet>) -> Result<Arc<Psbt>, Alpha3Error> {
|
pub(crate) fn finish(&self, wallet: &Arc<Wallet>) -> Result<Arc<Psbt>, CreateTxError> {
|
||||||
// TODO: I had to change the wallet here to be mutable. Why is that now required with the 1.0 API?
|
// TODO: I had to change the wallet here to be mutable. Why is that now required with the 1.0 API?
|
||||||
let mut wallet = wallet.get_wallet();
|
let mut wallet = wallet.get_wallet();
|
||||||
let mut tx_builder = wallet.build_tx();
|
let mut tx_builder = wallet.build_tx();
|
||||||
@ -499,8 +499,9 @@ impl TxBuilder {
|
|||||||
tx_builder.change_policy(self.change_policy);
|
tx_builder.change_policy(self.change_policy);
|
||||||
if !self.utxos.is_empty() {
|
if !self.utxos.is_empty() {
|
||||||
let bdk_utxos: Vec<BdkOutPoint> = self.utxos.iter().map(BdkOutPoint::from).collect();
|
let bdk_utxos: Vec<BdkOutPoint> = self.utxos.iter().map(BdkOutPoint::from).collect();
|
||||||
let utxos: &[BdkOutPoint] = &bdk_utxos;
|
tx_builder
|
||||||
tx_builder.add_utxos(utxos)?;
|
.add_utxos(&bdk_utxos)
|
||||||
|
.map_err(CreateTxError::from)?;
|
||||||
}
|
}
|
||||||
if !self.unspendable.is_empty() {
|
if !self.unspendable.is_empty() {
|
||||||
let bdk_unspendable: Vec<BdkOutPoint> =
|
let bdk_unspendable: Vec<BdkOutPoint> =
|
||||||
@ -536,7 +537,7 @@ impl TxBuilder {
|
|||||||
// tx_builder.add_data(self.data.as_slice());
|
// tx_builder.add_data(self.data.as_slice());
|
||||||
// }
|
// }
|
||||||
|
|
||||||
let psbt = tx_builder.finish()?;
|
let psbt = tx_builder.finish().map_err(CreateTxError::from)?;
|
||||||
|
|
||||||
Ok(Arc::new(psbt.into()))
|
Ok(Arc::new(psbt.into()))
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user