@@ -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