1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
use crate::account_config::constants::{from_currency_code_string, CORE_CODE_ADDRESS};
use move_core_types::{
ident_str,
identifier::IdentStr,
language_storage::{ModuleId, StructTag, TypeTag},
};
use once_cell::sync::Lazy;
pub const XDX_NAME: &str = "XDX";
pub const XDX_IDENTIFIER: &IdentStr = ident_str!(XDX_NAME);
pub const XUS_NAME: &str = "XUS";
pub const XUS_IDENTIFIER: &IdentStr = ident_str!(XUS_NAME);
pub fn xus_tag() -> TypeTag {
TypeTag::Struct(StructTag {
address: CORE_CODE_ADDRESS,
module: from_currency_code_string(XUS_NAME).unwrap(),
name: from_currency_code_string(XUS_NAME).unwrap(),
type_params: vec![],
})
}
pub static XDX_MODULE: Lazy<ModuleId> =
Lazy::new(|| ModuleId::new(CORE_CODE_ADDRESS, XDX_IDENTIFIER.to_owned()));
pub fn xdx_type_tag() -> TypeTag {
TypeTag::Struct(StructTag {
address: CORE_CODE_ADDRESS,
module: from_currency_code_string(XDX_NAME).unwrap(),
name: from_currency_code_string(XDX_NAME).unwrap(),
type_params: vec![],
})
}
pub fn coin_name(t: &TypeTag) -> Option<String> {
match t {
TypeTag::Struct(StructTag {
address,
module,
name,
..
}) if *address == CORE_CODE_ADDRESS && module == name => {
let name_str = name.to_string();
if name_str == XDX_NAME || name_str == XUS_NAME {
Some(name_str)
} else {
None
}
}
_ => None,
}
}
#[test]
fn coin_names() {
assert!(coin_name(&xus_tag()).unwrap() == XUS_NAME);
assert!(coin_name(&xdx_type_tag()).unwrap() == XDX_NAME);
assert!(coin_name(&TypeTag::U64) == None);
let bad_name = ident_str!("NotACoin").to_owned();
let bad_coin = TypeTag::Struct(StructTag {
address: CORE_CODE_ADDRESS,
module: bad_name.clone(),
name: bad_name,
type_params: vec![],
});
assert!(coin_name(&bad_coin) == None);
}