1use std::str::FromStr;
5
6use iota_sdk_types::{Address, ObjectId, StructTag, TypeTag};
7use iota_types::supported_protocol_versions::Chain;
8use serde::{Deserialize, Serialize};
9
10use crate::Name;
11
12#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
13#[serde(rename_all = "kebab-case")]
14pub struct IotaNamesConfig {
15 pub package_address: Address,
17 pub object_id: ObjectId,
19 pub payments_package_address: Address,
21 pub registry_id: ObjectId,
23 pub reverse_registry_id: ObjectId,
25}
26
27impl Default for IotaNamesConfig {
28 fn default() -> Self {
29 Self::mainnet()
30 }
31}
32
33impl IotaNamesConfig {
34 pub fn new(
35 package_address: Address,
36 object_id: ObjectId,
37 payments_package_address: Address,
38 registry_id: ObjectId,
39 reverse_registry_id: ObjectId,
40 ) -> Self {
41 Self {
42 package_address,
43 object_id,
44 payments_package_address,
45 registry_id,
46 reverse_registry_id,
47 }
48 }
49
50 pub fn from_env() -> anyhow::Result<Self> {
51 Ok(Self::new(
52 std::env::var("IOTA_NAMES_PACKAGE_ADDRESS")?.parse()?,
53 std::env::var("IOTA_NAMES_OBJECT_ID")?.parse()?,
54 std::env::var("IOTA_NAMES_PAYMENTS_PACKAGE_ADDRESS")?.parse()?,
55 std::env::var("IOTA_NAMES_REGISTRY_ID")?.parse()?,
56 std::env::var("IOTA_NAMES_REVERSE_REGISTRY_ID")?.parse()?,
57 ))
58 }
59
60 pub fn from_chain(chain: &Chain) -> Self {
61 match chain {
62 Chain::Mainnet => IotaNamesConfig::mainnet(),
63 Chain::Testnet => IotaNamesConfig::testnet(),
64 Chain::Unknown => IotaNamesConfig::devnet(),
65 }
66 }
67
68 pub fn record_field_id(&self, name: &Name) -> ObjectId {
69 let name_type_tag = StructTag::new_name(self.package_address);
70 let name_bytes = bcs::to_bytes(name).unwrap();
71
72 iota_types::dynamic_field::derive_dynamic_field_id(
73 self.registry_id,
74 &TypeTag::Struct(Box::new(name_type_tag)),
75 &name_bytes,
76 )
77 .unwrap()
78 }
79
80 pub fn reverse_record_field_id(&self, address: &Address) -> ObjectId {
81 iota_types::dynamic_field::derive_dynamic_field_id(
82 self.reverse_registry_id,
83 &TypeTag::Address,
84 address.as_ref(),
85 )
86 .unwrap()
87 }
88
89 pub fn mainnet() -> Self {
91 const PACKAGE_ADDRESS: &str =
92 "0x6d2c743607ef275bd6934fe5c2a7e5179cca6fbd2049cfa79de2310b74f3cf83";
93 const OBJECT_ID: &str =
94 "0xa14e5d0481a7aa346157078e6facba3cd895d97038cd87b9f2cc24b0c6102d75";
95 const PAYMENTS_PACKAGE_ADDRESS: &str =
96 "0x53d3d37f00949a1baad95fa4fca0b3d0d70ff6121be316f9e46d37c2d29c71eb";
97 const REGISTRY_ID: &str =
98 "0xa773cef7d762871354f6ae19ad174dfb1153d2d247c4886ada0b5330b9543b57";
99 const REVERSE_REGISTRY_ID: &str =
100 "0x18fa62ab8b0ab95ae61088082bd5db796863016fda8f3205b1ea7d13b1792317";
101
102 let package_address = Address::from_str(PACKAGE_ADDRESS).unwrap();
103 let object_id = ObjectId::from_str(OBJECT_ID).unwrap();
104 let payments_package_address = Address::from_str(PAYMENTS_PACKAGE_ADDRESS).unwrap();
105 let registry_id = ObjectId::from_str(REGISTRY_ID).unwrap();
106 let reverse_registry_id = ObjectId::from_str(REVERSE_REGISTRY_ID).unwrap();
107
108 Self::new(
109 package_address,
110 object_id,
111 payments_package_address,
112 registry_id,
113 reverse_registry_id,
114 )
115 }
116
117 pub fn testnet() -> Self {
119 const PACKAGE_ADDRESS: &str =
120 "0x7fff6e95f385349bec98d17121ab2bfa3e134f2f0b1ccefc270313415f7835ea";
121 const OBJECT_ID: &str =
122 "0x7cab491740d51e0d75b26bf9984e49ba2e32a2d0694cabcee605543ed13c7dec";
123 const PAYMENTS_PACKAGE_ADDRESS: &str =
124 "0x6b1b01f4c72786a893191d5c6e73d3012f7529f86fdee3bc8c163323cee08441";
125 const REGISTRY_ID: &str =
126 "0x2dfc6f6d46ba55217425643a59dc85fe4d8ed273a9f74077bd0ee280dbb4f590";
127 const REVERSE_REGISTRY_ID: &str =
128 "0x3550bcacb793ef8b776264665e7c99fa3d897695ed664656aac693cf9cf9b76b";
129
130 let package_address = Address::from_str(PACKAGE_ADDRESS).unwrap();
131 let object_id = ObjectId::from_str(OBJECT_ID).unwrap();
132 let payments_package_address = Address::from_str(PAYMENTS_PACKAGE_ADDRESS).unwrap();
133 let registry_id = ObjectId::from_str(REGISTRY_ID).unwrap();
134 let reverse_registry_id = ObjectId::from_str(REVERSE_REGISTRY_ID).unwrap();
135
136 Self::new(
137 package_address,
138 object_id,
139 payments_package_address,
140 registry_id,
141 reverse_registry_id,
142 )
143 }
144
145 pub fn devnet() -> Self {
147 const PACKAGE_ADDRESS: &str =
148 "0x742d00d422294ca697c53662f571f8dc328296d62db2211e2bd05a1857c13e06";
149 const OBJECT_ID: &str =
150 "0x49ec1d51f532ba32f1b14d1794fdcd7727664587bde3fb65be31bd4eb7f32f21";
151 const PAYMENTS_PACKAGE_ADDRESS: &str =
152 "0xe14ccc7c77add03bb9b6ad902a9f92a470c6a25bf8a9793927b2678510bfbb31";
153 const REGISTRY_ID: &str =
154 "0x2e86c49747003e46be1691604e6c1fbf902b967e22452532de405647bff7af95";
155 const REVERSE_REGISTRY_ID: &str =
156 "0xad03947f9e0648b7cb85f8c8325ee95c58898cda5d21925184ed1e5f70a75cfb";
157
158 let package_address = Address::from_str(PACKAGE_ADDRESS).unwrap();
159 let object_id = ObjectId::from_str(OBJECT_ID).unwrap();
160 let payments_package_address = Address::from_str(PAYMENTS_PACKAGE_ADDRESS).unwrap();
161 let registry_id = ObjectId::from_str(REGISTRY_ID).unwrap();
162 let reverse_registry_id = ObjectId::from_str(REVERSE_REGISTRY_ID).unwrap();
163
164 Self::new(
165 package_address,
166 object_id,
167 payments_package_address,
168 registry_id,
169 reverse_registry_id,
170 )
171 }
172}