@@ -3,8 +3,8 @@ use std::vec;
3
3
#[ cfg( not( feature = "library" ) ) ]
4
4
use cosmwasm_std:: entry_point;
5
5
use cosmwasm_std:: {
6
- from_binary, to_binary, Addr , Binary , Deps , DepsMut , Empty , Env , IbcEndpoint , IbcQuery ,
7
- MessageInfo , Order , PortIdResponse , Response , StdError , StdResult , Storage , Uint128 ,
6
+ from_binary, to_binary, Addr , Binary , CosmosMsg , Deps , DepsMut , Empty , Env , IbcEndpoint ,
7
+ IbcQuery , MessageInfo , Order , PortIdResponse , Response , StdError , StdResult , Storage , Uint128 ,
8
8
} ;
9
9
use cw2:: set_contract_version;
10
10
use cw20:: { Cw20Coin , Cw20ReceiveMsg } ;
@@ -14,9 +14,7 @@ use oraiswap::asset::AssetInfo;
14
14
use oraiswap:: router:: RouterController ;
15
15
16
16
use crate :: error:: ContractError ;
17
- use crate :: ibc:: {
18
- build_ibc_send_packet, collect_fee_msgs, parse_voucher_denom, process_deduct_fee,
19
- } ;
17
+ use crate :: ibc:: { build_ibc_send_packet, parse_voucher_denom, process_deduct_fee} ;
20
18
use crate :: msg:: {
21
19
AllowMsg , AllowedInfo , AllowedResponse , ChannelResponse , ChannelWithKeyResponse ,
22
20
ConfigResponse , DeletePairMsg , ExecuteMsg , InitMsg , ListAllowedResponse , ListChannelsResponse ,
@@ -26,8 +24,8 @@ use crate::msg::{
26
24
use crate :: state:: {
27
25
get_key_ics20_ibc_denom, ics20_denoms, increase_channel_balance, override_channel_balance,
28
26
reduce_channel_balance, AllowInfo , Config , MappingMetadata , RelayerFee , ReplyArgs , TokenFee ,
29
- ADMIN , ALLOW_LIST , CHANNEL_INFO , CHANNEL_REVERSE_STATE , CONFIG , RELAYER_FEE ,
30
- RELAYER_FEE_ACCUMULATOR , REPLY_ARGS , SINGLE_STEP_REPLY_ARGS , TOKEN_FEE , TOKEN_FEE_ACCUMULATOR ,
27
+ ADMIN , ALLOW_LIST , CHANNEL_INFO , CHANNEL_REVERSE_STATE , CONFIG , RELAYER_FEE , REPLY_ARGS ,
28
+ SINGLE_STEP_REPLY_ARGS , TOKEN_FEE ,
31
29
} ;
32
30
use cw20_ics20_msg:: amount:: { convert_local_to_remote, Amount } ;
33
31
use cw_utils:: { maybe_addr, nonpayable, one_coin} ;
@@ -458,7 +456,7 @@ pub fn execute_transfer_back_to_remote_chain(
458
456
. ok_or ( ContractError :: MappingPairNotFound { } ) ?;
459
457
460
458
// if found mapping, then deduct fee based on mapping
461
- let ( new_deducted_amount , token_fee , relayer_fee ) = process_deduct_fee (
459
+ let fee_data = process_deduct_fee (
462
460
deps. storage ,
463
461
& deps. querier ,
464
462
deps. api ,
@@ -469,6 +467,40 @@ pub fn execute_transfer_back_to_remote_chain(
469
467
& config. swap_router_contract ,
470
468
) ?;
471
469
470
+ let mut cosmos_msgs: Vec < CosmosMsg > = vec ! [ ] ;
471
+ if !fee_data. token_fee . is_empty ( ) {
472
+ cosmos_msgs. push (
473
+ fee_data
474
+ . token_fee
475
+ . send_amount ( config. token_fee_receiver . into_string ( ) , None ) ,
476
+ )
477
+ }
478
+ if !fee_data. relayer_fee . is_empty ( ) {
479
+ cosmos_msgs. push (
480
+ fee_data
481
+ . relayer_fee
482
+ . send_amount ( config. relayer_fee_receiver . into_string ( ) , None ) ,
483
+ )
484
+ }
485
+
486
+ // send response
487
+ let token_fee_str = fee_data. token_fee . amount ( ) . to_string ( ) ;
488
+ let relayer_fee_str = fee_data. relayer_fee . amount ( ) . to_string ( ) ;
489
+ let attributes = vec ! [
490
+ ( "action" , "transfer_back_to_remote_chain" ) ,
491
+ ( "sender" , sender. as_str( ) ) ,
492
+ ( "receiver" , & msg. remote_address) ,
493
+ ( "token_fee" , & token_fee_str) ,
494
+ ( "relayer_fee" , & relayer_fee_str) ,
495
+ ] ;
496
+
497
+ // if our fees have drained the initial amount entirely, then we just get all the fees and that's it
498
+ if fee_data. deducted_amount . is_zero ( ) {
499
+ return Ok ( Response :: new ( )
500
+ . add_messages ( cosmos_msgs)
501
+ . add_attributes ( attributes) ) ;
502
+ }
503
+
472
504
let ibc_denom = mapping. key ;
473
505
// ensure the requested channel is registered
474
506
if !CHANNEL_INFO . has ( deps. storage , & msg. local_channel_id ) {
@@ -486,7 +518,7 @@ pub fn execute_transfer_back_to_remote_chain(
486
518
let timeout = env. block . time . plus_seconds ( timeout_delta) ;
487
519
// need to convert decimal of cw20 to remote decimal before transferring
488
520
let amount_remote = convert_local_to_remote (
489
- new_deducted_amount ,
521
+ fee_data . deducted_amount ,
490
522
mapping. pair_mapping . remote_decimals ,
491
523
mapping. pair_mapping . asset_info_decimals ,
492
524
) ?;
@@ -510,30 +542,14 @@ pub fn execute_transfer_back_to_remote_chain(
510
542
& msg. local_channel_id ,
511
543
timeout. into ( ) ,
512
544
) ?;
513
-
514
- let mut cosmos_msgs = collect_fee_msgs (
515
- deps. storage ,
516
- config. token_fee_receiver . into_string ( ) ,
517
- TOKEN_FEE_ACCUMULATOR ,
518
- ) ?;
519
- cosmos_msgs. push ( ibc_msg. into ( ) ) ;
520
- cosmos_msgs. append ( & mut collect_fee_msgs (
521
- deps. storage ,
522
- config. relayer_fee_receiver . into_string ( ) ,
523
- RELAYER_FEE_ACCUMULATOR ,
524
- ) ?) ;
525
-
526
- // send response
527
- let res = Response :: new ( )
545
+ Ok ( Response :: new ( )
528
546
. add_messages ( cosmos_msgs)
529
- . add_attribute ( "action" , "transfer_back_to_remote_chain" )
530
- . add_attribute ( "sender" , sender. as_str ( ) )
531
- . add_attribute ( "receiver" , & msg. remote_address )
532
- . add_attribute ( "denom" , & ibc_denom)
533
- . add_attribute ( "amount" , & amount_remote. to_string ( ) )
534
- . add_attribute ( "token_fee" , token_fee)
535
- . add_attribute ( "relayer_fee" , relayer_fee) ;
536
- Ok ( res)
547
+ . add_message ( ibc_msg)
548
+ . add_attributes ( attributes)
549
+ . add_attributes ( vec ! [
550
+ ( "denom" , & ibc_denom) ,
551
+ ( "amount" , & amount_remote. to_string( ) ) ,
552
+ ] ) )
537
553
}
538
554
539
555
/// The gov contract can allow new contracts, or increase the gas limit on existing contracts.
@@ -642,19 +658,19 @@ pub fn execute_delete_mapping_pair(
642
658
}
643
659
644
660
#[ entry_point]
645
- pub fn migrate ( deps : DepsMut , _env : Env , msg : MigrateMsg ) -> Result < Response , ContractError > {
661
+ pub fn migrate ( deps : DepsMut , _env : Env , _msg : MigrateMsg ) -> Result < Response , ContractError > {
646
662
// we don't need to save anything if migrating from the same version
647
- CONFIG . save (
648
- deps. storage ,
649
- & Config {
650
- default_timeout : msg. default_timeout ,
651
- default_gas_limit : msg. default_gas_limit ,
652
- fee_denom : msg. fee_denom ,
653
- swap_router_contract : RouterController ( msg. swap_router_contract ) ,
654
- token_fee_receiver : deps. api . addr_validate ( & msg. token_fee_receiver ) ?,
655
- relayer_fee_receiver : deps. api . addr_validate ( & msg. relayer_fee_receiver ) ?,
656
- } ,
657
- ) ?;
663
+ // CONFIG.save(
664
+ // deps.storage,
665
+ // &Config {
666
+ // default_timeout: msg.default_timeout,
667
+ // default_gas_limit: msg.default_gas_limit,
668
+ // fee_denom: msg.fee_denom,
669
+ // swap_router_contract: RouterController(msg.swap_router_contract),
670
+ // token_fee_receiver: deps.api.addr_validate(&msg.token_fee_receiver)?,
671
+ // relayer_fee_receiver: deps.api.addr_validate(&msg.relayer_fee_receiver)?,
672
+ // },
673
+ // )?;
658
674
set_contract_version ( deps. storage , CONTRACT_NAME , CONTRACT_VERSION ) ?;
659
675
Ok ( Response :: new ( ) )
660
676
}
@@ -903,7 +919,7 @@ mod test {
903
919
904
920
use super :: * ;
905
921
use crate :: ibc:: { handle_packet_refund, ibc_packet_receive, Ics20Packet , REFUND_FAILURE_ID } ;
906
- use crate :: state:: { Ratio , TOKEN_FEE_ACCUMULATOR } ;
922
+ use crate :: state:: Ratio ;
907
923
use crate :: test_helpers:: * ;
908
924
909
925
use cosmwasm_std:: testing:: { mock_env, mock_info} ;
@@ -1453,15 +1469,6 @@ mod test {
1453
1469
}
1454
1470
) ;
1455
1471
1456
- // we need to reset fee accumulator because when execute returns error, the test state is still applied
1457
- TOKEN_FEE_ACCUMULATOR
1458
- . save (
1459
- deps. as_mut ( ) . storage ,
1460
- "cw20:token-addr" ,
1461
- & Uint128 :: from ( 0u64 ) ,
1462
- )
1463
- . unwrap ( ) ;
1464
-
1465
1472
// prepare some mock packets
1466
1473
let recv_packet =
1467
1474
mock_receive_packet ( remote_channel, local_channel, amount, denom, custom_addr) ;
@@ -1497,7 +1504,7 @@ mod test {
1497
1504
1498
1505
assert_eq ! ( res. messages[ 0 ] . gas_limit, None ) ;
1499
1506
println ! ( "res messages: {:?}" , res. messages) ;
1500
- assert_eq ! ( 2 , res. messages. len( ) ) ; // 2 because it also has deduct fee msg
1507
+ assert_eq ! ( res. messages. len( ) , 2 ) ; // 2 because it also has deduct fee msg
1501
1508
match res. messages [ 1 ] . msg . clone ( ) {
1502
1509
CosmosMsg :: Ibc ( IbcMsg :: SendPacket {
1503
1510
channel_id,
@@ -1652,15 +1659,6 @@ mod test {
1652
1659
}
1653
1660
) ;
1654
1661
1655
- // we need to reset fee accumulator because when execute returns error, the test state is still applied
1656
- TOKEN_FEE_ACCUMULATOR
1657
- . save (
1658
- deps. as_mut ( ) . storage ,
1659
- "cw20:token-addr" ,
1660
- & Uint128 :: from ( 0u64 ) ,
1661
- )
1662
- . unwrap ( ) ;
1663
-
1664
1662
// prepare some mock packets
1665
1663
let recv_packet =
1666
1664
mock_receive_packet ( remote_channel, local_channel, amount, denom, custom_addr) ;
0 commit comments