@@ -5064,39 +5064,69 @@ pub async fn build_custom(
50645064 // 3. If the wrapper signature was provided then we also expect the inner
50655065 // signature(s) to have been provided, in this case we generate a
50665066 // SigningData to attach all these signatures
5067- let is_tx_raw = tx. header . wrapper ( ) . is_none ( ) ;
5068- // FIXME: do we need this? In case can we move it in the match were we
5069- // generate the SigningData?
5070- if wrapper_signature. is_some ( ) && is_tx_raw {
5071- return Err ( Error :: Other (
5072- "A wrapper signature was provided but the transaction is not a \
5073- wrapper"
5074- . to_string ( ) ,
5075- ) ) ;
5076- }
5077- let signing_data = {
5078- let signing_data = signing:: aux_signing_data (
5079- context,
5080- tx_args,
5081- owner. clone ( ) ,
5082- owner. clone ( ) ,
5083- vec ! [ ] ,
5084- // The possible masp fee paying transaction has already been
5085- // produced so no need to generate a disposable address anyway
5086- false ,
5087- signatures. to_owned ( ) ,
5088- wrapper_signature. to_owned ( ) ,
5089- )
5090- . await ?;
5067+ let signing_data = match tx. header . wrapper ( ) {
5068+ Some ( _) => {
5069+ let wrapper_signing_data = signing:: aux_signing_data (
5070+ context,
5071+ tx_args,
5072+ owner. clone ( ) ,
5073+ owner. clone ( ) ,
5074+ vec ! [ ] ,
5075+ // The possible masp fee paying transaction has already been
5076+ // produced so no need to generate a disposable address anyway
5077+ false ,
5078+ signatures. to_owned ( ) ,
5079+ wrapper_signature. to_owned ( ) ,
5080+ )
5081+ . await ?;
50915082
5092- match & tx_args. wrap_tx {
5093- Some ( wrap_tx) => {
5094- // FIXME: actually is this correct? What if I want to rewrap?
5095- // Would be better to just look at the wrapper signature first
5096- if is_tx_raw {
5083+ if let ( Some ( wrap_tx) , Ok ( fee_payer) ) =
5084+ ( & tx_args. wrap_tx , wrapper_signing_data. fee_payer_or_err ( ) )
5085+ {
5086+ // If no wrapper signature is provided wrap the tx, even if it
5087+ // is already wrapped (wrapper overwrite)
5088+ let fee_amount =
5089+ validate_fee ( context, wrap_tx, tx_args. force ) . await ?;
5090+ tx. add_wrapper (
5091+ Fee {
5092+ amount_per_gas_unit : fee_amount,
5093+ token : wrap_tx. fee_token . to_owned ( ) ,
5094+ } ,
5095+ fee_payer. to_owned ( ) ,
5096+ wrap_tx. gas_limit ,
5097+ ) ;
5098+ }
5099+ SigningData :: Wrapper ( wrapper_signing_data)
5100+ }
5101+ None => {
5102+ if wrapper_signature. is_some ( ) {
5103+ return Err ( Error :: Other (
5104+ "A wrapper signature was provided but the transaction is \
5105+ not a wrapper"
5106+ . to_string ( ) ,
5107+ ) ) ;
5108+ }
5109+
5110+ match & tx_args. wrap_tx {
5111+ Some ( wrap_tx) => {
5112+ let wrapper_signing_data = signing:: aux_signing_data (
5113+ context,
5114+ tx_args,
5115+ owner. clone ( ) ,
5116+ owner. clone ( ) ,
5117+ vec ! [ ] ,
5118+ // The possible masp fee paying transaction has already
5119+ // been produced so no need to
5120+ // generate a disposable address anyway
5121+ false ,
5122+ signatures. to_owned ( ) ,
5123+ wrapper_signature. to_owned ( ) ,
5124+ )
5125+ . await ?;
50975126 let fee_amount =
50985127 validate_fee ( context, wrap_tx, tx_args. force ) . await ?;
5099- let fee_payer = signing_data. fee_payer_or_err ( ) ?. to_owned ( ) ;
5128+ let fee_payer =
5129+ wrapper_signing_data. fee_payer_or_err ( ) ?. to_owned ( ) ;
51005130 tx. add_wrapper (
51015131 Fee {
51025132 amount_per_gas_unit : fee_amount,
@@ -5105,23 +5135,20 @@ pub async fn build_custom(
51055135 fee_payer,
51065136 wrap_tx. gas_limit ,
51075137 ) ;
5138+ SigningData :: Wrapper ( wrapper_signing_data)
51085139 }
5109- SigningData :: Wrapper ( signing_data)
5110- }
5111- None if wrapper_signature. is_some ( ) => {
5112- SigningData :: Wrapper ( signing_data)
5140+ None => SigningData :: Inner (
5141+ signing:: aux_inner_signing_data (
5142+ context,
5143+ tx_args,
5144+ owner. clone ( ) ,
5145+ owner. clone ( ) ,
5146+ vec ! [ ] ,
5147+ signatures. to_owned ( ) ,
5148+ )
5149+ . await ?,
5150+ ) ,
51135151 }
5114- _ => SigningData :: Inner (
5115- signing:: aux_inner_signing_data (
5116- context,
5117- tx_args,
5118- owner. clone ( ) ,
5119- owner. clone ( ) ,
5120- vec ! [ ] ,
5121- signatures. to_owned ( ) ,
5122- )
5123- . await ?,
5124- ) ,
51255152 }
51265153 } ;
51275154
0 commit comments