hpl-interface 0.0.6

Interface definitions for CosmWasm Hyperlane contracts
Documentation
pub mod cw20;
pub mod native;

use std::fmt;

use cosmwasm_schema::{cw_serde, QueryResponses};
use cosmwasm_std::{HexBinary, Uint256};

#[cw_serde]
pub enum TokenTypeNative {
    Fungible { denom: String },
    NonFungible { class: String },
}

#[cw_serde]
pub enum TokenType {
    Native(TokenTypeNative),
    CW20 { contract: String },
    CW721 { contract: String },
}

#[cw_serde]
pub enum TokenModeMsg<Bridged, Collateral> {
    Bridged(Bridged),
    Collateral(Collateral),
}

impl<A, B> From<TokenModeMsg<A, B>> for TokenMode {
    fn from(v: TokenModeMsg<A, B>) -> Self {
        match v {
            TokenModeMsg::Bridged(_) => Self::Bridged,
            TokenModeMsg::Collateral(_) => Self::Collateral,
        }
    }
}

#[cw_serde]
pub enum TokenMode {
    Bridged,
    Collateral,
}

impl fmt::Display for TokenMode {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        write!(
            f,
            "{}",
            match self {
                Self::Bridged => "bridged",
                Self::Collateral => "collateral",
            }
        )
    }
}

#[cw_serde]
pub struct Message {
    pub recipient: HexBinary,
    pub amount: Uint256,
    pub metadata: HexBinary,
}

impl From<Message> for HexBinary {
    fn from(v: Message) -> Self {
        v.recipient
            .iter()
            .chain(v.amount.to_be_bytes().iter())
            .chain(v.metadata.iter())
            .cloned()
            .collect::<Vec<u8>>()
            .into()
    }
}

impl From<HexBinary> for Message {
    fn from(v: HexBinary) -> Self {
        Self {
            recipient: v[0..32].to_vec().into(),
            amount: Uint256::from_be_bytes(v[32..64].try_into().unwrap()),
            metadata: v[64..].to_vec().into(),
        }
    }
}

#[cw_serde]
#[derive(QueryResponses)]
pub enum TokenWarpDefaultQueryMsg {
    #[returns(TokenTypeResponse)]
    TokenType {},

    #[returns(TokenModeResponse)]
    TokenMode {},
}

#[cw_serde]
pub struct TokenTypeResponse {
    #[serde(rename = "type")]
    pub typ: TokenType,
}

#[cw_serde]
pub struct TokenModeResponse {
    pub mode: TokenMode,
}