df_hyperliquid_core/transfer/
token.rs1use crate::client::{Network, Token};
5use crate::transfer::check::{HYPE_SYSTEM, system_address};
6use crate::utils::Address;
7use serde::Deserialize;
8
9pub use crate::client::{MAINNET_HYPE, TESTNET_HYPE};
11
12pub const HYPE_EVM_DECIMALS: u32 = 18;
14
15#[must_use]
17pub const fn hype(network: Network) -> Token {
18 network.hype()
19}
20
21#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
23#[serde(rename_all = "camelCase")]
24pub struct SpotToken {
25 pub name: String,
26 pub index: u32,
28 pub token_id: String,
30 pub wei_decimals: u32,
32 #[serde(default)]
35 pub evm_contract: Option<EvmContract>,
36}
37
38#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize)]
40pub struct EvmContract {
41 pub address: Address,
42 #[serde(rename = "evm_extra_wei_decimals")]
44 pub extra_wei_decimals: i32,
45}
46
47impl SpotToken {
48 #[must_use]
50 pub fn wire(&self) -> String {
51 format!("{}:{}", self.name, self.token_id)
52 }
53
54 #[must_use]
56 pub fn is_hype(&self, network: Network) -> bool {
57 self.index == network.hype().index
58 }
59
60 #[must_use]
63 pub fn system_address(&self, network: Network) -> Address {
64 match self.is_hype(network) {
65 true => HYPE_SYSTEM,
66 false => system_address(u64::from(self.index)),
67 }
68 }
69
70 #[must_use]
73 pub fn evm_decimals(&self, network: Network) -> Option<u32> {
74 if self.is_hype(network) {
75 return Some(HYPE_EVM_DECIMALS);
76 }
77 let link = self.evm_contract?;
78 u32::try_from(i64::from(self.wei_decimals) + i64::from(link.extra_wei_decimals)).ok()
79 }
80
81 #[must_use]
84 pub fn crossing_places(&self, network: Network) -> Option<u32> {
85 self.evm_decimals(network).map(|evm| evm.min(self.wei_decimals))
86 }
87}
88
89impl From<Token> for SpotToken {
92 fn from(token: Token) -> SpotToken {
93 SpotToken {
94 name: token.name.to_owned(),
95 index: token.index,
96 token_id: token.token_id.to_owned(),
97 wei_decimals: token.wei_decimals,
98 evm_contract: None,
99 }
100 }
101}
102
103#[cfg(test)]
104#[path = "tests/token.rs"]
105mod tests;