ibc_app_transfer/handler/
mod.rs

1//! Implements the processing logic for ICS20 (token transfer) message.
2mod 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    // mint vouchers back to sender
35    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}