Skip to main content

iota_names/
config.rs

1// Copyright (c) 2025 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use 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    /// Address of the `iota_names` package.
16    pub package_address: Address,
17    /// ID of the `IotaNames` object.
18    pub object_id: ObjectId,
19    /// Address of the `payments` package.
20    pub payments_package_address: Address,
21    /// ID of the registry table.
22    pub registry_id: ObjectId,
23    /// ID of the reverse registry table.
24    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    // Create a config based on the package and object ids published on mainnet.
90    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    // Create a config based on the package and object ids published on testnet.
118    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    // Create a config based on the package and object ids published on devnet.
146    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}