Make mutable inputs to closures in `create_proposed_transaction` explicit.

Signed-off-by: Daira-Emma Hopwood <daira@jacaranda.org>
This commit is contained in:
Daira-Emma Hopwood 2024-06-26 14:51:30 +01:00
parent b77813933a
commit 7a05b44df9
1 changed files with 29 additions and 17 deletions

View File

@ -857,7 +857,9 @@ where
#[cfg(feature = "transparent-inputs")] #[cfg(feature = "transparent-inputs")]
let utxos_spent = { let utxos_spent = {
let mut utxos_spent: Vec<OutPoint> = vec![]; let mut utxos_spent: Vec<OutPoint> = vec![];
let mut add_transparent_input = |address_metadata: &TransparentAddressMetadata, let add_transparent_input = |builder: &mut Builder<_, _>,
utxos_spent: &mut Vec<_>,
address_metadata: &TransparentAddressMetadata,
outpoint: OutPoint, outpoint: OutPoint,
txout: TxOut| txout: TxOut|
-> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> { -> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> {
@ -874,6 +876,8 @@ where
for utxo in proposal_step.transparent_inputs() { for utxo in proposal_step.transparent_inputs() {
add_transparent_input( add_transparent_input(
&mut builder,
&mut utxos_spent,
&metadata_from_address(*utxo.recipient_address())?, &metadata_from_address(*utxo.recipient_address())?,
utxo.outpoint().clone(), utxo.outpoint().clone(),
utxo.txout().clone(), utxo.txout().clone(),
@ -895,7 +899,13 @@ where
.ok_or(Error::Proposal(ProposalError::ReferenceError(*input_ref)))? .ok_or(Error::Proposal(ProposalError::ReferenceError(*input_ref)))?
.vout[outpoint.n() as usize]; .vout[outpoint.n() as usize];
add_transparent_input(&address_metadata, outpoint, txout.clone())?; add_transparent_input(
&mut builder,
&mut utxos_spent,
&address_metadata,
outpoint,
txout.clone(),
)?;
} }
utxos_spent utxos_spent
}; };
@ -976,7 +986,8 @@ where
); );
let recipient_address = payment.recipient_address(); let recipient_address = payment.recipient_address();
let mut add_sapling_output = |builder: &mut Builder<_, _>, let add_sapling_output = |builder: &mut Builder<_, _>,
sapling_output_meta: &mut Vec<_>,
to: sapling::PaymentAddress| to: sapling::PaymentAddress|
-> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> { -> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> {
let memo = payment.memo().map_or_else(MemoBytes::empty, |m| m.clone()); let memo = payment.memo().map_or_else(MemoBytes::empty, |m| m.clone());
@ -990,7 +1001,8 @@ where
}; };
#[cfg(feature = "orchard")] #[cfg(feature = "orchard")]
let mut add_orchard_output = |builder: &mut Builder<_, _>, let add_orchard_output = |builder: &mut Builder<_, _>,
orchard_output_meta: &mut Vec<_>,
to: orchard::Address| to: orchard::Address|
-> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> { -> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> {
let memo = payment.memo().map_or_else(MemoBytes::empty, |m| m.clone()); let memo = payment.memo().map_or_else(MemoBytes::empty, |m| m.clone());
@ -1008,8 +1020,8 @@ where
Ok(()) Ok(())
}; };
#[allow(unused_mut)] let add_transparent_output = |builder: &mut Builder<_, _>,
let mut add_transparent_output = |builder: &mut Builder<_, _>, transparent_output_meta: &mut Vec<_>,
to: TransparentAddress| to: TransparentAddress|
-> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> { -> Result<(), ErrorT<DbT, InputsErrT, FeeRuleT>> {
if payment.memo().is_some() { if payment.memo().is_some() {
@ -1038,22 +1050,22 @@ where
#[cfg(feature = "orchard")] #[cfg(feature = "orchard")]
PoolType::Shielded(ShieldedProtocol::Orchard) => { PoolType::Shielded(ShieldedProtocol::Orchard) => {
let to = *ua.orchard().expect("The mapping between payment pool and receiver is checked in step construction"); let to = *ua.orchard().expect("The mapping between payment pool and receiver is checked in step construction");
add_orchard_output(&mut builder, to)?; add_orchard_output(&mut builder, &mut orchard_output_meta, to)?;
} }
PoolType::Shielded(ShieldedProtocol::Sapling) => { PoolType::Shielded(ShieldedProtocol::Sapling) => {
let to = *ua.sapling().expect("The mapping between payment pool and receiver is checked in step construction"); let to = *ua.sapling().expect("The mapping between payment pool and receiver is checked in step construction");
add_sapling_output(&mut builder, to)?; add_sapling_output(&mut builder, &mut sapling_output_meta, to)?;
} }
PoolType::Transparent => { PoolType::Transparent => {
let to = *ua.transparent().expect("The mapping between payment pool and receiver is checked in step construction"); let to = *ua.transparent().expect("The mapping between payment pool and receiver is checked in step construction");
add_transparent_output(&mut builder, to)?; add_transparent_output(&mut builder, &mut transparent_output_meta, to)?;
} }
}, },
Address::Sapling(to) => { Address::Sapling(to) => {
add_sapling_output(&mut builder, to)?; add_sapling_output(&mut builder, &mut sapling_output_meta, to)?;
} }
Address::Transparent(to) => { Address::Transparent(to) => {
add_transparent_output(&mut builder, to)?; add_transparent_output(&mut builder, &mut transparent_output_meta, to)?;
} }
#[cfg(not(feature = "transparent-inputs"))] #[cfg(not(feature = "transparent-inputs"))]
Address::Tex(_) => { Address::Tex(_) => {
@ -1065,7 +1077,7 @@ where
return Err(Error::ProposalNotSupported); return Err(Error::ProposalNotSupported);
} }
let to = TransparentAddress::PublicKeyHash(data); let to = TransparentAddress::PublicKeyHash(data);
add_transparent_output(&mut builder, to)?; add_transparent_output(&mut builder, &mut transparent_output_meta, to)?;
} }
} }
} }