@@ -421,7 +421,6 @@ fn handle_ibc_packet_receive_native_remote_chain(
421421 & msg. sender ,
422422 & msg. denom ,
423423 to_send. clone ( ) ,
424- pair_mapping. asset_info_decimals ,
425424 & config. swap_router_contract ,
426425 ) ?;
427426
@@ -470,10 +469,11 @@ fn handle_ibc_packet_receive_native_remote_chain(
470469 let additional_relayer_fee = deduct_relayer_fee (
471470 storage,
472471 api,
472+ querier,
473473 & destination. receiver ,
474474 & remote_destination_denom,
475- fee_data . token_simulate_amount ,
476- fee_data . token_exchange_rate_with_orai ,
475+ destination_asset_info_on_orai . clone ( ) ,
476+ & config . swap_router_contract ,
477477 ) ?;
478478
479479 fee_data. relayer_fee = Amount :: from_parts (
@@ -861,36 +861,28 @@ pub fn process_deduct_fee(
861861 remote_sender : & str ,
862862 remote_token_denom : & str ,
863863 local_amount : Amount , // local amount
864- decimals : u8 ,
865864 swap_router_contract : & RouterController ,
866865) -> StdResult < FeeData > {
867866 let local_denom = local_amount. denom ( ) ;
868867 let ( deducted_amount, token_fee) =
869868 deduct_token_fee ( storage, remote_token_denom, local_amount. amount ( ) ) ?;
870869 // simulate for relayer fee
871- let offer_asset_info = denom_to_asset_info ( querier, api, & local_amount. raw_denom ( ) ) ?;
872- let simulate_amount = Uint128 :: from ( 10u64 . pow ( ( decimals + 1 ) as u32 ) as u64 ) ; // +1 to make sure the offer amount is large enough to swap successfully
873- let exchange_rate_with_orai = get_token_price (
874- querier,
875- simulate_amount,
876- swap_router_contract,
877- offer_asset_info,
878- ) ;
870+ let ask_asset_info = denom_to_asset_info ( querier, api, & local_amount. raw_denom ( ) ) ?;
871+
879872 let relayer_fee = deduct_relayer_fee (
880873 storage,
881874 api,
875+ querier,
882876 remote_sender,
883877 remote_token_denom,
884- simulate_amount ,
885- exchange_rate_with_orai ,
878+ ask_asset_info ,
879+ swap_router_contract ,
886880 ) ?;
887881
888882 let mut fee_data = FeeData {
889883 deducted_amount : deducted_amount. checked_sub ( relayer_fee) . unwrap_or_default ( ) ,
890884 token_fee : Amount :: from_parts ( local_denom. clone ( ) , token_fee) ,
891885 relayer_fee : Amount :: from_parts ( local_denom. clone ( ) , relayer_fee) ,
892- token_simulate_amount : simulate_amount,
893- token_exchange_rate_with_orai : exchange_rate_with_orai,
894886 } ;
895887
896888 // if after token fee, the deducted amount is 0 then we deduct all to token fee
@@ -927,16 +919,12 @@ pub fn deduct_token_fee(
927919pub fn deduct_relayer_fee (
928920 storage : & mut dyn Storage ,
929921 _api : & dyn Api ,
922+ querier : & QuerierWrapper ,
930923 remote_address : & str ,
931924 remote_token_denom : & str ,
932- simulate_amount : Uint128 , // offer amount of token that swaps to ORAI
933- token_price : Uint128 ,
925+ ask_asset_info : AssetInfo ,
926+ swap_router_contract : & RouterController ,
934927) -> StdResult < Uint128 > {
935- // api.debug(format!("token price: {}", token_price).as_str());
936- if token_price. is_zero ( ) {
937- return Ok ( Uint128 :: from ( 0u64 ) ) ;
938- }
939-
940928 // this is bech32 prefix of sender from other chains. Should not error because we are in the cosmos ecosystem. Every address should have prefix
941929 // evm case, need to filter remote token denom since prefix is always oraib
942930 let prefix_result = get_prefix_decode_bech32 ( remote_address) ;
@@ -958,13 +946,15 @@ pub fn deduct_relayer_fee(
958946 if relayer_fee. is_none ( ) {
959947 return Ok ( Uint128 :: from ( 0u64 ) ) ;
960948 }
961- let relayer_fee = relayer_fee. unwrap ( ) ;
962- let required_fee_needed = relayer_fee
963- . checked_mul ( simulate_amount)
964- . unwrap_or_default ( )
965- . checked_div ( token_price)
966- . unwrap_or_default ( ) ;
967- Ok ( required_fee_needed)
949+
950+ let relayer_fee = get_swap_token_amount_out_from_orai (
951+ querier,
952+ relayer_fee. unwrap ( ) ,
953+ swap_router_contract,
954+ ask_asset_info,
955+ ) ;
956+
957+ Ok ( relayer_fee)
968958}
969959
970960pub fn deduct_fee ( token_fee : Ratio , amount : Uint128 ) -> Uint128 {
@@ -978,26 +968,26 @@ pub fn deduct_fee(token_fee: Ratio, amount: Uint128) -> Uint128 {
978968 ) )
979969}
980970
981- pub fn get_token_price (
971+ pub fn get_swap_token_amount_out_from_orai (
982972 querier : & QuerierWrapper ,
983- simulate_amount : Uint128 ,
973+ offer_amount : Uint128 ,
984974 swap_router_contract : & RouterController ,
985- offer_asset_info : AssetInfo ,
975+ ask_asset_info : AssetInfo ,
986976) -> Uint128 {
987977 let orai_asset_info = AssetInfo :: NativeToken {
988978 denom : "orai" . to_string ( ) ,
989979 } ;
990- if offer_asset_info . eq ( & orai_asset_info) {
991- return simulate_amount ;
980+ if ask_asset_info . eq ( & orai_asset_info) {
981+ return offer_amount ;
992982 }
993983 let token_price = swap_router_contract
994984 . simulate_swap (
995985 querier,
996- simulate_amount ,
986+ offer_amount ,
997987 vec ! [ SwapOperation :: OraiSwap {
998- offer_asset_info,
988+ offer_asset_info: orai_asset_info ,
999989 // always swap with orai. If it does not share a pool with ORAI => ignore, no fee
1000- ask_asset_info: orai_asset_info ,
990+ ask_asset_info,
1001991 } ] ,
1002992 )
1003993 . map ( |data| data. amount )
0 commit comments