namada_ibc 0.150.2

Namada IBC
Documentation
//! Middleware entry points on Namada.

pub mod pfm_mod;
pub mod shielded_recv;

use std::cell::RefCell;
use std::collections::BTreeSet;
use std::fmt::Debug;
use std::marker::PhantomData;
use std::rc::Rc;

use ibc::core::host::types::identifiers::PortId;
use ibc::core::router::module::Module;
use ibc::core::router::types::module::ModuleId;
use ibc_middleware_overflow_receive::OverflowReceiveMiddleware;
use ibc_middleware_packet_forward::PacketForwardMiddleware;
use namada_core::address::Address;

use self::pfm_mod::PfmTransferModule;
use self::shielded_recv::ShieldedRecvModule;
use crate::context::transfer_mod::TransferModule;
use crate::{IbcCommonContext, IbcStorageContext};

/// The stack of middlewares of the transfer module.
pub type TransferMiddlewares<C, Params> =
    OverflowReceiveMiddleware<ShieldedRecvModule<C, Params>>;

/// Create a new instance of [`TransferMiddlewares`]
pub fn create_transfer_middlewares<C, Params>(
    ctx: Rc<RefCell<C>>,
    verifiers: Rc<RefCell<BTreeSet<Address>>>,
) -> TransferMiddlewares<C, Params>
where
    C: IbcCommonContext + Debug,
    Params: namada_systems::parameters::Read<<C as IbcStorageContext>::Storage>,
{
    OverflowReceiveMiddleware::wrap(ShieldedRecvModule {
        next: PacketForwardMiddleware::wrap(PfmTransferModule {
            transfer_module: TransferModule::new(ctx, verifiers),
            _phantom: PhantomData,
        }),
    })
}

impl<C, Params> crate::ModuleWrapper for TransferMiddlewares<C, Params>
where
    C: IbcCommonContext + Debug,
    Params: namada_systems::parameters::Read<<C as IbcStorageContext>::Storage>,
{
    fn as_module(&self) -> &dyn Module {
        self
    }

    fn as_module_mut(&mut self) -> &mut dyn Module {
        self
    }

    fn module_id(&self) -> ModuleId {
        ModuleId::new(ibc::apps::transfer::types::MODULE_ID_STR.to_string())
    }

    fn port_id(&self) -> PortId {
        PortId::transfer()
    }
}