ibc_app_transfer/handler/
mod.rs1mod on_recv_packet;
3mod send_transfer;
4
5use ibc_app_transfer_types::error::TokenTransferError;
6use ibc_app_transfer_types::is_sender_chain_source;
7use ibc_app_transfer_types::packet::PacketData;
8use ibc_core::channel::types::packet::Packet;
9use ibc_core::primitives::prelude::*;
10pub use on_recv_packet::*;
11pub use send_transfer::*;
12
13use crate::context::{TokenTransferExecutionContext, TokenTransferValidationContext};
14
15pub fn refund_packet_token_execute(
16 ctx_a: &mut impl TokenTransferExecutionContext,
17 packet: &Packet,
18 data: &PacketData,
19) -> Result<(), TokenTransferError> {
20 let sender = ctx_a.sender_account(&data.sender)?;
21
22 if is_sender_chain_source(
23 packet.port_id_on_a.clone(),
24 packet.chan_id_on_a.clone(),
25 &data.token.denom,
26 ) {
27 ctx_a.unescrow_coins_execute(
28 &sender,
29 &packet.port_id_on_a,
30 &packet.chan_id_on_a,
31 &data.token,
32 )?;
33 }
34 else {
36 ctx_a.mint_coins_execute(&sender, &data.token)?;
37 }
38
39 Ok(())
40}
41
42pub fn refund_packet_token_validate(
43 ctx_a: &impl TokenTransferValidationContext,
44 packet: &Packet,
45 data: &PacketData,
46) -> Result<(), TokenTransferError> {
47 let sender = ctx_a.sender_account(&data.sender)?;
48
49 if is_sender_chain_source(
50 packet.port_id_on_a.clone(),
51 packet.chan_id_on_a.clone(),
52 &data.token.denom,
53 ) {
54 ctx_a.unescrow_coins_validate(
55 &sender,
56 &packet.port_id_on_a,
57 &packet.chan_id_on_a,
58 &data.token,
59 )?;
60 } else {
61 ctx_a.mint_coins_validate(&sender, &data.token)?;
62 }
63
64 Ok(())
65}