1use std::str::FromStr;
5
6use iota_types::{
7 TypeTag,
8 base_types::{IotaAddress, ObjectID},
9 supported_protocol_versions::Chain,
10};
11use serde::{Deserialize, Serialize};
12
13use crate::Name;
14
15#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]
16#[serde(rename_all = "kebab-case")]
17pub struct IotaNamesConfig {
18 pub package_address: IotaAddress,
20 pub object_id: ObjectID,
22 pub payments_package_address: IotaAddress,
24 pub registry_id: ObjectID,
26 pub reverse_registry_id: ObjectID,
28}
29
30impl Default for IotaNamesConfig {
31 fn default() -> Self {
32 Self::testnet()
34 }
35}
36
37impl IotaNamesConfig {
38 pub fn new(
39 package_address: IotaAddress,
40 object_id: ObjectID,
41 payments_package_address: IotaAddress,
42 registry_id: ObjectID,
43 reverse_registry_id: ObjectID,
44 ) -> Self {
45 Self {
46 package_address,
47 object_id,
48 payments_package_address,
49 registry_id,
50 reverse_registry_id,
51 }
52 }
53
54 pub fn from_env() -> anyhow::Result<Self> {
55 Ok(Self::new(
56 std::env::var("IOTA_NAMES_PACKAGE_ADDRESS")?.parse()?,
57 std::env::var("IOTA_NAMES_OBJECT_ID")?.parse()?,
58 std::env::var("IOTA_NAMES_PAYMENTS_PACKAGE_ADDRESS")?.parse()?,
59 std::env::var("IOTA_NAMES_REGISTRY_ID")?.parse()?,
60 std::env::var("IOTA_NAMES_REVERSE_REGISTRY_ID")?.parse()?,
61 ))
62 }
63
64 pub fn from_chain(chain: &Chain) -> Self {
65 match chain {
66 Chain::Mainnet => todo!("https://github.com/iotaledger/iota/issues/6532"),
67 Chain::Testnet => IotaNamesConfig::testnet(),
68 Chain::Unknown => IotaNamesConfig::devnet(),
69 }
70 }
71
72 pub fn record_field_id(&self, name: &Name) -> ObjectID {
73 let name_type_tag = Name::type_(self.package_address);
74 let name_bytes = bcs::to_bytes(name).unwrap();
75
76 iota_types::dynamic_field::derive_dynamic_field_id(
77 self.registry_id,
78 &TypeTag::Struct(Box::new(name_type_tag)),
79 &name_bytes,
80 )
81 .unwrap()
82 }
83
84 pub fn reverse_record_field_id(&self, address: &IotaAddress) -> ObjectID {
85 iota_types::dynamic_field::derive_dynamic_field_id(
86 self.reverse_registry_id,
87 &TypeTag::Address,
88 address.as_ref(),
89 )
90 .unwrap()
91 }
92
93 pub fn testnet() -> Self {
97 const PACKAGE_ADDRESS: &str =
98 "0x7fff6e95f385349bec98d17121ab2bfa3e134f2f0b1ccefc270313415f7835ea";
99 const OBJECT_ID: &str =
100 "0x7cab491740d51e0d75b26bf9984e49ba2e32a2d0694cabcee605543ed13c7dec";
101 const PAYMENTS_PACKAGE_ADDRESS: &str =
102 "0x6b1b01f4c72786a893191d5c6e73d3012f7529f86fdee3bc8c163323cee08441";
103 const REGISTRY_ID: &str =
104 "0x2dfc6f6d46ba55217425643a59dc85fe4d8ed273a9f74077bd0ee280dbb4f590";
105 const REVERSE_REGISTRY_ID: &str =
106 "0x3550bcacb793ef8b776264665e7c99fa3d897695ed664656aac693cf9cf9b76b";
107
108 let package_address = IotaAddress::from_str(PACKAGE_ADDRESS).unwrap();
109 let object_id = ObjectID::from_str(OBJECT_ID).unwrap();
110 let payments_package_address = IotaAddress::from_str(PAYMENTS_PACKAGE_ADDRESS).unwrap();
111 let registry_id = ObjectID::from_str(REGISTRY_ID).unwrap();
112 let reverse_registry_id = ObjectID::from_str(REVERSE_REGISTRY_ID).unwrap();
113
114 Self::new(
115 package_address,
116 object_id,
117 payments_package_address,
118 registry_id,
119 reverse_registry_id,
120 )
121 }
122
123 pub fn devnet() -> Self {
125 const PACKAGE_ADDRESS: &str =
126 "0xb9d617f24c84826bf660a2f4031951678cc80c264aebc4413459fb2a95ada9ba";
127 const OBJECT_ID: &str =
128 "0x07c59b37bd7d036bf78fa30561a2ab9f7a970837487656ec29466e817f879342";
129 const PAYMENTS_PACKAGE_ADDRESS: &str =
130 "0x98b9b33b7c2347a8f4e8b8716fb4c7e6e1af846ec2ea063a47bba81ffe03b440";
131 const REGISTRY_ID: &str =
132 "0xe00b2f2400c33b4dbd3081c4dcf2e289d0544caba23a3d130b264bd756403c07";
133 const REVERSE_REGISTRY_ID: &str =
134 "0x1c1da17843cc453ad4079b05ce55e103b7a8cdd4db6ab42dc367b47ed6d8994d";
135
136 let package_address = IotaAddress::from_str(PACKAGE_ADDRESS).unwrap();
137 let object_id = ObjectID::from_str(OBJECT_ID).unwrap();
138 let payments_package_address = IotaAddress::from_str(PAYMENTS_PACKAGE_ADDRESS).unwrap();
139 let registry_id = ObjectID::from_str(REGISTRY_ID).unwrap();
140 let reverse_registry_id = ObjectID::from_str(REVERSE_REGISTRY_ID).unwrap();
141
142 Self::new(
143 package_address,
144 object_id,
145 payments_package_address,
146 registry_id,
147 reverse_registry_id,
148 )
149 }
150}