Skip to content

Commit 20991d2

Browse files
committed
Refactors custom tx builder
1 parent a0f462f commit 20991d2

File tree

1 file changed

+72
-45
lines changed

1 file changed

+72
-45
lines changed

crates/sdk/src/tx.rs

Lines changed: 72 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)