@@ -113,10 +113,7 @@ use trace::{
113113 is_sender_chain_source,
114114} ;
115115
116- use crate :: context:: middlewares:: {
117- MaspUnshieldingFeesExecutionContext , send_transfer_execute,
118- } ;
119- use crate :: context:: token_transfer:: ParamsStorageAdapter ;
116+ use crate :: context:: middlewares:: send_transfer_execute;
120117use crate :: storage:: {
121118 channel_counter_key, client_counter_key, connection_counter_key,
122119 deposit_prefix, nft_class_key, nft_metadata_key, withdraw_prefix,
@@ -164,6 +161,7 @@ impl From<Error> for StorageError {
164161 }
165162}
166163
164+ #[ derive( Debug ) ]
167165struct IbcTransferInfo {
168166 src_port_id : PortId ,
169167 src_channel_id : ChannelId ,
@@ -183,6 +181,11 @@ impl TryFrom<IbcMsgTransfer> for IbcTransferInfo {
183181 ) -> std:: result:: Result < Self , Self :: Error > {
184182 let packet_data = serde_json:: to_vec ( & message. packet_data )
185183 . map_err ( StorageError :: new) ?;
184+ tracing:: warn!(
185+ ?message,
186+ ?packet_data,
187+ "parsing IbcTransferInfo from IbcMsgTransfer"
188+ ) ;
186189 let ibc_traces = vec ! [ message. packet_data. token. denom. to_string( ) ] ;
187190 let amount: Amount = message. packet_data . token . amount . into ( ) ;
188191 let receiver = message. packet_data . receiver . to_string ( ) ;
@@ -328,6 +331,7 @@ where
328331 Some ( IbcMessage :: Transfer ( msg) ) => {
329332 // Get the packet commitment from post-storage that corresponds
330333 // to this event
334+ tracing:: warn!( msg = ?msg. message, "calling apply_transfer_msg" ) ;
331335 let ibc_transfer = IbcTransferInfo :: try_from ( msg. message ) ?;
332336 let receiver = ibc_transfer. receiver . clone ( ) ;
333337 let addr = TAddrData :: Ibc ( receiver. clone ( ) ) ;
@@ -337,14 +341,60 @@ where
337341 accum,
338342 ibc_transfer,
339343 keys_changed,
340- |ibc_transfer| {
341- // Recreate the original packet, by applying middlewares
342- let adapter = ParamsStorageAdapter :: < _ , Params > :: adapt (
343- storage_pre,
344- ) ;
345- adapter
346- . apply_masp_unshielding_fee ( ibc_transfer)
347- . into_storage_result ( )
344+ |packet_data_vec| {
345+ let mut packet_data =
346+ serde_json:: from_slice :: < PacketData > (
347+ packet_data_vec,
348+ )
349+ . map_err ( StorageError :: new) ?;
350+
351+ let token = trace:: convert_to_address (
352+ packet_data. token . denom . to_string ( ) ,
353+ )
354+ . map_err ( |e| {
355+ Error :: Trace ( format ! (
356+ "Failed to convert IBC trace to Namada \
357+ address: {e}"
358+ ) )
359+ } )
360+ . into_storage_result ( ) ?;
361+
362+ let Some ( fee_percentage) =
363+ Params :: ibc_unshielding_fee_percentage (
364+ & storage_pre,
365+ & token,
366+ ) ?
367+ else {
368+ return Ok ( ( ) ) ;
369+ } ;
370+
371+ let old_amount: Amount =
372+ packet_data. token . amount . into ( ) ;
373+ let fee = old_amount
374+ . checked_mul_dec ( fee_percentage)
375+ . ok_or ( StorageError :: new_const (
376+ "IBC unshielding fee overflow" ,
377+ ) ) ?;
378+
379+ if fee. is_zero ( ) {
380+ return Ok ( ( ) ) ;
381+ }
382+
383+ packet_data. token . amount = old_amount
384+ . checked_sub ( fee)
385+ . ok_or_else ( || {
386+ StorageError :: new_const (
387+ "Unshielding fee greater than withdrawn \
388+ amount",
389+ )
390+ } ) ?
391+ . into ( ) ;
392+
393+ packet_data_vec. clear ( ) ;
394+ serde_json:: to_writer ( packet_data_vec, & packet_data)
395+ . map_err ( StorageError :: new) ?;
396+
397+ Ok ( ( ) )
348398 } ,
349399 ) ?;
350400 }
@@ -525,14 +575,17 @@ impl fmt::Display for IbcAccountId {
525575 }
526576}
527577
528- fn check_ibc_transfer < S > (
578+ fn check_ibc_transfer < S , F > (
529579 storage : & S ,
530580 ibc_transfer : & IbcTransferInfo ,
531581 keys_changed : & BTreeSet < Key > ,
582+ alter_packet_data : F ,
532583) -> StorageResult < ( ) >
533584where
534585 S : StorageRead ,
586+ F : FnOnce ( & mut Vec < u8 > ) -> StorageResult < ( ) > ,
535587{
588+ tracing:: warn!( ?ibc_transfer, "calling check_ibc_transfer" ) ;
536589 let IbcTransferInfo {
537590 src_port_id,
538591 src_channel_id,
@@ -553,6 +606,9 @@ where
553606 ) ) ) ;
554607 }
555608
609+ let mut packet_data = packet_data. clone ( ) ;
610+ alter_packet_data ( & mut packet_data) ?;
611+
556612 // The commitment is also validated in IBC VP. Make sure that for when
557613 // IBC VP isn't triggered.
558614 let actual: PacketCommitment = storage
@@ -563,7 +619,7 @@ where
563619 ) ) ) ?
564620 . into ( ) ;
565621 let expected = compute_packet_commitment (
566- packet_data,
622+ & packet_data,
567623 timeout_height,
568624 timeout_timestamp,
569625 ) ;
@@ -601,16 +657,20 @@ fn check_packet_receiving(
601657fn apply_transfer_msg < S , F > (
602658 storage : & S ,
603659 mut accum : ChangedBalances ,
604- mut ibc_transfer : IbcTransferInfo ,
660+ ibc_transfer : IbcTransferInfo ,
605661 keys_changed : & BTreeSet < Key > ,
606- alter_ibc_transfer : F ,
662+ alter_packet_data : F ,
607663) -> StorageResult < ChangedBalances >
608664where
609665 S : StorageRead ,
610- F : FnOnce ( & mut IbcTransferInfo ) -> StorageResult < ( ) > ,
666+ F : FnOnce ( & mut Vec < u8 > ) -> StorageResult < ( ) > ,
611667{
612- check_ibc_transfer ( storage, & ibc_transfer, keys_changed) ?;
613- alter_ibc_transfer ( & mut ibc_transfer) ?;
668+ check_ibc_transfer (
669+ storage,
670+ & ibc_transfer,
671+ keys_changed,
672+ alter_packet_data,
673+ ) ?;
614674
615675 let IbcTransferInfo {
616676 ref ibc_traces,
0 commit comments