Skip to content

Commit 29e39a9

Browse files
committed
Merge branch 'grarco/skip-masp-fees' (#4730)
* origin/grarco/skip-masp-fees: Changelog #4730 Adds flag to skip fee checks in masp txs
2 parents 7837865 + 96dd002 commit 29e39a9

File tree

4 files changed

+109
-70
lines changed

4 files changed

+109
-70
lines changed
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
- Introduced the possibility to skip fee checks when MASP fee payment is
2+
expected. ([\#4730](https://github.com/anoma/namada/pull/4730))

crates/apps_lib/src/client/tx.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1246,7 +1246,7 @@ pub async fn submit_shielded_transfer(
12461246
)
12471247
.await?;
12481248
let (mut tx, signing_data) =
1249-
args.clone().build(namada, &mut bparams).await?;
1249+
args.clone().build(namada, &mut bparams, false).await?;
12501250
let disposable_fee_payer = match signing_data.fee_payer {
12511251
either::Either::Left((_, disposable_fee_payer)) => disposable_fee_payer,
12521252
either::Either::Right(_) => unreachable!(),
@@ -1409,7 +1409,7 @@ pub async fn submit_unshielding_transfer(
14091409
)
14101410
.await?;
14111411
let (mut tx, signing_data) =
1412-
args.clone().build(namada, &mut bparams).await?;
1412+
args.clone().build(namada, &mut bparams, false).await?;
14131413
let disposable_fee_payer = match signing_data.fee_payer {
14141414
either::Either::Left((_, disposable_fee_payer)) => disposable_fee_payer,
14151415
either::Either::Right(_) => unreachable!(),
@@ -1493,7 +1493,7 @@ where
14931493
// If transaction building fails for any reason, then abort the process
14941494
// blaming MASP build parameter generation if that had also failed.
14951495
let (mut tx, signing_data, _) = args
1496-
.build(namada, &mut bparams)
1496+
.build(namada, &mut bparams, false)
14971497
.await
14981498
.map_err(|e| bparams_err.unwrap_or(e))?;
14991499
let disposable_fee_payer = match signing_data.fee_payer {

crates/sdk/src/args.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -362,8 +362,10 @@ impl TxShieldedTransfer {
362362
&mut self,
363363
context: &impl Namada,
364364
bparams: &mut impl BuildParams,
365+
skip_fee_handling: bool,
365366
) -> crate::error::Result<(namada_tx::Tx, SigningTxData)> {
366-
tx::build_shielded_transfer(context, self, bparams).await
367+
tx::build_shielded_transfer(context, self, bparams, skip_fee_handling)
368+
.await
367369
}
368370
}
369371

@@ -458,8 +460,15 @@ impl TxUnshieldingTransfer {
458460
&mut self,
459461
context: &impl Namada,
460462
bparams: &mut impl BuildParams,
463+
skip_fee_handling: bool,
461464
) -> crate::error::Result<(namada_tx::Tx, SigningTxData)> {
462-
tx::build_unshielding_transfer(context, self, bparams).await
465+
tx::build_unshielding_transfer(
466+
context,
467+
self,
468+
bparams,
469+
skip_fee_handling,
470+
)
471+
.await
463472
}
464473
}
465474

@@ -920,9 +929,10 @@ impl TxIbcTransfer {
920929
&self,
921930
context: &impl Namada,
922931
bparams: &mut impl BuildParams,
932+
skip_fee_handling: bool,
923933
) -> crate::error::Result<(namada_tx::Tx, SigningTxData, Option<MaspEpoch>)>
924934
{
925-
tx::build_ibc_transfer(context, self, bparams).await
935+
tx::build_ibc_transfer(context, self, bparams, skip_fee_handling).await
926936
}
927937
}
928938

crates/sdk/src/tx.rs

Lines changed: 91 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -2706,6 +2706,7 @@ pub async fn build_ibc_transfer(
27062706
context: &impl Namada,
27072707
args: &args::TxIbcTransfer,
27082708
bparams: &mut impl BuildParams,
2709+
skip_fee_handling: bool,
27092710
) -> Result<(Tx, SigningTxData, Option<MaspEpoch>)> {
27102711
if args.ibc_shielding_data.is_some() && args.ibc_memo.is_some() {
27112712
return Err(Error::Other(
@@ -2798,25 +2799,33 @@ pub async fn build_ibc_transfer(
27982799
let mut transfer = token::Transfer::default();
27992800

28002801
// Add masp fee payment if necessary
2801-
let masp_fee_data = get_masp_fee_payment_amount(
2802-
context,
2803-
&args.tx,
2804-
fee_per_gas_unit,
2805-
// If no custom gas spending key is provided default to the source
2806-
fee_payer,
2807-
args.gas_spending_key.or(args.source.spending_key()),
2808-
)
2809-
.await?;
2810-
if let Some(fee_data) = &masp_fee_data {
2811-
transfer = transfer
2812-
.transfer(
2813-
MASP,
2814-
fee_data.target.to_owned(),
2815-
fee_data.token.to_owned(),
2816-
fee_data.amount,
2817-
)
2818-
.ok_or(Error::Other("Combined transfer overflows".to_string()))?;
2819-
}
2802+
let masp_fee_data = if skip_fee_handling {
2803+
None
2804+
} else {
2805+
let masp_fee_data = get_masp_fee_payment_amount(
2806+
context,
2807+
&args.tx,
2808+
fee_per_gas_unit,
2809+
// If no custom gas spending key is provided default to the source
2810+
fee_payer,
2811+
args.gas_spending_key.or(args.source.spending_key()),
2812+
)
2813+
.await?;
2814+
if let Some(fee_data) = &masp_fee_data {
2815+
transfer = transfer
2816+
.transfer(
2817+
MASP,
2818+
fee_data.target.to_owned(),
2819+
fee_data.token.to_owned(),
2820+
fee_data.amount,
2821+
)
2822+
.ok_or(Error::Other(
2823+
"Combined transfer overflows".to_string(),
2824+
))?;
2825+
}
2826+
2827+
masp_fee_data
2828+
};
28202829

28212830
// For transfer from a spending key
28222831
let shielded_parts = construct_shielded_parts(
@@ -3235,6 +3244,7 @@ pub async fn build_shielded_transfer<N: Namada>(
32353244
context: &N,
32363245
args: &mut args::TxShieldedTransfer,
32373246
bparams: &mut impl BuildParams,
3247+
skip_fee_handling: bool,
32383248
) -> Result<(Tx, SigningTxData)> {
32393249
let mut signing_data = signing::aux_signing_data(
32403250
context,
@@ -3290,29 +3300,37 @@ pub async fn build_shielded_transfer<N: Namada>(
32903300
// Construct the tx data with a placeholder shielded section hash
32913301
let mut data = token::Transfer::default();
32923302

3293-
let fee_payer = signing_data.fee_payer_or_err()?;
3294-
// Add masp fee payment if necessary
3295-
let masp_fee_data = get_masp_fee_payment_amount(
3296-
context,
3297-
&args.tx,
3298-
fee_per_gas_unit,
3299-
fee_payer,
3300-
// If no custom gas spending key is provided default to the first
3301-
// source
3302-
args.gas_spending_key
3303-
.or(args.sources.first().map(|data| data.source)),
3304-
)
3305-
.await?;
3306-
if let Some(fee_data) = &masp_fee_data {
3307-
data = data
3308-
.transfer(
3309-
MASP,
3310-
fee_data.target.to_owned(),
3311-
fee_data.token.to_owned(),
3312-
fee_data.amount,
3313-
)
3314-
.ok_or(Error::Other("Combined transfer overflows".to_string()))?;
3315-
}
3303+
let masp_fee_data = if skip_fee_handling {
3304+
None
3305+
} else {
3306+
let fee_payer = signing_data.fee_payer_or_err()?;
3307+
// Add masp fee payment if necessary
3308+
let masp_fee_data = get_masp_fee_payment_amount(
3309+
context,
3310+
&args.tx,
3311+
fee_per_gas_unit,
3312+
fee_payer,
3313+
// If no custom gas spending key is provided default to the first
3314+
// source
3315+
args.gas_spending_key
3316+
.or(args.sources.first().map(|data| data.source)),
3317+
)
3318+
.await?;
3319+
if let Some(fee_data) = &masp_fee_data {
3320+
data = data
3321+
.transfer(
3322+
MASP,
3323+
fee_data.target.to_owned(),
3324+
fee_data.token.to_owned(),
3325+
fee_data.amount,
3326+
)
3327+
.ok_or(Error::Other(
3328+
"Combined transfer overflows".to_string(),
3329+
))?;
3330+
}
3331+
3332+
masp_fee_data
3333+
};
33163334

33173335
let shielded_parts = construct_shielded_parts(
33183336
context,
@@ -3566,6 +3584,7 @@ pub async fn build_unshielding_transfer<N: Namada>(
35663584
context: &N,
35673585
args: &mut args::TxUnshieldingTransfer,
35683586
bparams: &mut impl BuildParams,
3587+
skip_fee_handling: bool,
35693588
) -> Result<(Tx, SigningTxData)> {
35703589
let mut signing_data = signing::aux_signing_data(
35713590
context,
@@ -3628,28 +3647,36 @@ pub async fn build_unshielding_transfer<N: Namada>(
36283647
}
36293648

36303649
// Add masp fee payment if necessary
3631-
let fee_payer = signing_data.fee_payer_or_err()?;
3632-
let masp_fee_data = get_masp_fee_payment_amount(
3633-
context,
3634-
&args.tx,
3635-
fee_per_gas_unit,
3636-
fee_payer,
3637-
// If no custom gas spending key is provided default to the source
3638-
args.gas_spending_key
3639-
.or(args.sources.first().map(|x| x.source)),
3640-
)
3641-
.await?;
3642-
if let Some(fee_data) = &masp_fee_data {
3643-
// Add another unshield to the list
3644-
data = data
3645-
.transfer(
3646-
MASP,
3647-
fee_data.target.to_owned(),
3648-
fee_data.token.to_owned(),
3649-
fee_data.amount,
3650-
)
3651-
.ok_or(Error::Other("Combined transfer overflows".to_string()))?;
3652-
}
3650+
let masp_fee_data = if skip_fee_handling {
3651+
None
3652+
} else {
3653+
let fee_payer = signing_data.fee_payer_or_err()?;
3654+
let masp_fee_data = get_masp_fee_payment_amount(
3655+
context,
3656+
&args.tx,
3657+
fee_per_gas_unit,
3658+
fee_payer,
3659+
// If no custom gas spending key is provided default to the source
3660+
args.gas_spending_key
3661+
.or(args.sources.first().map(|x| x.source)),
3662+
)
3663+
.await?;
3664+
if let Some(fee_data) = &masp_fee_data {
3665+
// Add another unshield to the list
3666+
data = data
3667+
.transfer(
3668+
MASP,
3669+
fee_data.target.to_owned(),
3670+
fee_data.token.to_owned(),
3671+
fee_data.amount,
3672+
)
3673+
.ok_or(Error::Other(
3674+
"Combined transfer overflows".to_string(),
3675+
))?;
3676+
}
3677+
3678+
masp_fee_data
3679+
};
36533680

36543681
let shielded_parts = construct_shielded_parts(
36553682
context,

0 commit comments

Comments
 (0)