use crate::client::{Network, Token};
use crate::transfer::check::{HYPE_SYSTEM, system_address};
use crate::utils::Address;
use serde::Deserialize;
pub use crate::client::{MAINNET_HYPE, TESTNET_HYPE};
pub const HYPE_EVM_DECIMALS: u32 = 18;
#[must_use]
pub const fn hype(network: Network) -> Token {
network.hype()
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SpotToken {
pub name: String,
pub index: u32,
pub token_id: String,
pub wei_decimals: u32,
#[serde(default)]
pub evm_contract: Option<EvmContract>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
pub struct EvmContract {
pub address: Address,
#[serde(rename = "evm_extra_wei_decimals")]
pub extra_wei_decimals: i32,
}
impl SpotToken {
#[must_use]
pub fn wire(&self) -> String {
format!("{}:{}", self.name, self.token_id)
}
#[must_use]
pub fn is_hype(&self, network: Network) -> bool {
self.index == network.hype().index
}
#[must_use]
pub fn system_address(&self, network: Network) -> Address {
match self.is_hype(network) {
true => HYPE_SYSTEM,
false => system_address(u64::from(self.index)),
}
}
#[must_use]
pub fn evm_decimals(&self, network: Network) -> Option<u32> {
if self.is_hype(network) {
return Some(HYPE_EVM_DECIMALS);
}
let link = self.evm_contract?;
u32::try_from(i64::from(self.wei_decimals) + i64::from(link.extra_wei_decimals)).ok()
}
#[must_use]
pub fn crossing_places(&self, network: Network) -> Option<u32> {
self.evm_decimals(network).map(|evm| evm.min(self.wei_decimals))
}
}
impl From<Token> for SpotToken {
fn from(token: Token) -> SpotToken {
SpotToken {
name: token.name.to_owned(),
index: token.index,
token_id: token.token_id.to_owned(),
wei_decimals: token.wei_decimals,
evm_contract: None,
}
}
}
#[cfg(test)]
#[path = "tests/token.rs"]
mod tests;