Skip to content

Commit 9d36f3b

Browse files
authored
Merge pull request #21 from oraichain/fix/re-caculate-relayer-fee
Fix/re caculate relayer fee
2 parents 653c545 + 22451d0 commit 9d36f3b

File tree

4 files changed

+57
-61
lines changed

4 files changed

+57
-61
lines changed

contracts/cw-ics20-latest/src/contract.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,6 @@ pub fn execute_transfer_back_to_remote_chain(
463463
&msg.remote_address,
464464
&msg.remote_denom,
465465
amount,
466-
mapping.pair_mapping.asset_info_decimals,
467466
&config.swap_router_contract,
468467
)?;
469468

contracts/cw-ics20-latest/src/ibc.rs

Lines changed: 28 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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(
927919
pub 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

970960
pub 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)

contracts/cw-ics20-latest/src/ibc_tests.rs

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@ mod test {
77

88
use crate::ibc::{
99
build_ibc_msg, build_swap_msgs, convert_remote_denom_to_evm_prefix, deduct_fee,
10-
deduct_relayer_fee, deduct_token_fee, get_token_price, ibc_packet_receive,
11-
parse_ibc_channel_without_sanity_checks, parse_ibc_denom_without_sanity_checks,
12-
parse_voucher_denom, process_ibc_msg, Ics20Ack, Ics20Packet, FOLLOW_UP_IBC_SEND_FAILURE_ID,
13-
IBC_TRANSFER_NATIVE_ERROR_ID, NATIVE_RECEIVE_ID, SWAP_OPS_FAILURE_ID,
10+
deduct_relayer_fee, deduct_token_fee, get_swap_token_amount_out_from_orai,
11+
ibc_packet_receive, parse_ibc_channel_without_sanity_checks,
12+
parse_ibc_denom_without_sanity_checks, parse_voucher_denom, process_ibc_msg, Ics20Ack,
13+
Ics20Packet, FOLLOW_UP_IBC_SEND_FAILURE_ID, IBC_TRANSFER_NATIVE_ERROR_ID,
14+
NATIVE_RECEIVE_ID, SWAP_OPS_FAILURE_ID,
1415
};
1516
use crate::ibc::{build_swap_operations, get_follow_up_msgs};
1617
use crate::test_helpers::*;
@@ -1105,16 +1106,20 @@ mod test {
11051106
let deps_mut = deps.as_mut();
11061107
let token_fee_denom = "cosmos";
11071108
let remote_address = "cosmos1zedxv25ah8fksmg2lzrndrpkvsjqgk4zt5ff7n";
1108-
let offer_amount = Uint128::from(10u32.pow(0 as u32));
1109-
let token_price = Uint128::from(10u64);
1109+
let destination_asset_on_orai = AssetInfo::NativeToken {
1110+
denom: "orai".to_string(),
1111+
};
1112+
let swap_router_contract = RouterController("foo".to_string());
1113+
11101114
// token price empty case. Should return zero fee
11111115
let result = deduct_relayer_fee(
11121116
deps_mut.storage,
11131117
deps_mut.api,
1118+
&deps_mut.querier,
11141119
remote_address,
11151120
token_fee_denom,
1116-
offer_amount.clone(),
1117-
Uint128::from(0u64),
1121+
destination_asset_on_orai.clone(),
1122+
&swap_router_contract,
11181123
)
11191124
.unwrap();
11201125
assert_eq!(result, Uint128::from(0u64));
@@ -1124,10 +1129,11 @@ mod test {
11241129
deduct_relayer_fee(
11251130
deps_mut.storage,
11261131
deps_mut.api,
1132+
&deps_mut.querier,
11271133
"foobar",
11281134
token_fee_denom,
1129-
offer_amount.clone(),
1130-
token_price,
1135+
destination_asset_on_orai.clone(),
1136+
&swap_router_contract,
11311137
)
11321138
.unwrap(),
11331139
Uint128::from(0u128)
@@ -1138,10 +1144,11 @@ mod test {
11381144
deduct_relayer_fee(
11391145
deps_mut.storage,
11401146
deps_mut.api,
1147+
&deps_mut.querier,
11411148
remote_address,
11421149
token_fee_denom,
1143-
offer_amount.clone(),
1144-
token_price,
1150+
destination_asset_on_orai.clone(),
1151+
&swap_router_contract,
11451152
)
11461153
.unwrap(),
11471154
Uint128::from(0u64)
@@ -1160,27 +1167,29 @@ mod test {
11601167
deduct_relayer_fee(
11611168
deps_mut.storage,
11621169
deps_mut.api,
1170+
&deps_mut.querier,
11631171
"oraib1603j3e4juddh7cuhfquxspl0p0nsun047wz3rl",
11641172
"foo0x",
1165-
offer_amount.clone(),
1166-
token_price,
1173+
destination_asset_on_orai.clone(),
1174+
&swap_router_contract,
11671175
)
11681176
.unwrap(),
1169-
Uint128::from(100u64)
1177+
Uint128::from(1000u64)
11701178
);
11711179

11721180
// normal case with remote address
11731181
assert_eq!(
11741182
deduct_relayer_fee(
11751183
deps_mut.storage,
11761184
deps_mut.api,
1185+
&deps_mut.querier,
11771186
remote_address,
11781187
token_fee_denom,
1179-
offer_amount.clone(),
1180-
token_price,
1188+
destination_asset_on_orai,
1189+
&swap_router_contract,
11811190
)
11821191
.unwrap(),
1183-
Uint128::from(10u64)
1192+
Uint128::from(100u64)
11841193
);
11851194
}
11861195

@@ -1270,10 +1279,10 @@ mod test {
12701279
}
12711280

12721281
#[test]
1273-
fn test_get_token_price_orai_case() {
1282+
fn test_get_swap_token_amount_out_from_orai() {
12741283
let deps = mock_dependencies();
12751284
let simulate_amount = Uint128::from(10u128);
1276-
let result = get_token_price(
1285+
let result = get_swap_token_amount_out_from_orai(
12771286
&deps.as_ref().querier,
12781287
simulate_amount,
12791288
&RouterController("foo".to_string()),

contracts/cw-ics20-latest/src/msg.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -271,8 +271,6 @@ pub struct FeeData {
271271
pub deducted_amount: Uint128,
272272
pub token_fee: Amount,
273273
pub relayer_fee: Amount,
274-
pub token_simulate_amount: Uint128,
275-
pub token_exchange_rate_with_orai: Uint128,
276274
}
277275

278276
#[cw_serde]

0 commit comments

Comments
 (0)