iota_genesis_builder/stardust/migration/verification/
created_objects.rs

1// Copyright (c) 2024 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4use anyhow::{Result, anyhow, bail};
5use iota_types::base_types::ObjectID;
6
7/// Defines objects that may have been created by migrating an
8/// [`Output`](iota_sdk::types::block::output::Output).
9#[derive(Default)]
10pub struct CreatedObjects {
11    output: Option<ObjectID>,
12    package: Option<ObjectID>,
13    coin: Option<ObjectID>,
14    native_token_coin: Option<ObjectID>,
15    native_tokens: Option<Vec<ObjectID>>,
16    coin_manager: Option<ObjectID>,
17    coin_manager_treasury_cap: Option<ObjectID>,
18}
19
20impl CreatedObjects {
21    pub fn output(&self) -> Result<&ObjectID> {
22        self.output
23            .as_ref()
24            .ok_or_else(|| anyhow!("no created output object"))
25    }
26
27    pub(crate) fn set_output(&mut self, id: ObjectID) -> Result<()> {
28        if let Some(id) = self.output {
29            bail!("output already set: {id}")
30        }
31        self.output.replace(id);
32        Ok(())
33    }
34
35    pub fn package(&self) -> Result<&ObjectID> {
36        self.package
37            .as_ref()
38            .ok_or_else(|| anyhow!("no created package object"))
39    }
40
41    pub(crate) fn set_package(&mut self, id: ObjectID) -> Result<()> {
42        if let Some(id) = self.package {
43            bail!("package already set: {id}")
44        }
45        self.package.replace(id);
46        Ok(())
47    }
48
49    pub fn coin(&self) -> Result<&ObjectID> {
50        self.coin
51            .as_ref()
52            .ok_or_else(|| anyhow!("no created coin object"))
53    }
54
55    pub(crate) fn set_coin(&mut self, id: ObjectID) -> Result<()> {
56        if let Some(id) = self.coin {
57            bail!("coin already set: {id}")
58        }
59        self.coin.replace(id);
60        Ok(())
61    }
62
63    pub fn native_token_coin(&self) -> Result<&ObjectID> {
64        self.native_token_coin
65            .as_ref()
66            .ok_or_else(|| anyhow!("no native token coin object"))
67    }
68
69    pub(crate) fn set_native_token_coin(&mut self, id: ObjectID) -> Result<()> {
70        if let Some(id) = self.native_token_coin {
71            bail!("native token coin already set: {id}")
72        }
73        self.native_token_coin.replace(id);
74        Ok(())
75    }
76
77    pub fn native_tokens(&self) -> Result<&[ObjectID]> {
78        self.native_tokens
79            .as_deref()
80            .ok_or_else(|| anyhow!("no created native token objects"))
81    }
82
83    pub(crate) fn set_native_tokens(&mut self, ids: Vec<ObjectID>) -> Result<()> {
84        if let Some(id) = &self.native_tokens {
85            bail!("native tokens already set: {id:?}")
86        }
87        self.native_tokens.replace(ids);
88        Ok(())
89    }
90
91    pub fn coin_manager(&self) -> Result<&ObjectID> {
92        self.coin_manager
93            .as_ref()
94            .ok_or_else(|| anyhow!("no created coin manager object"))
95    }
96
97    pub(crate) fn set_coin_manager(&mut self, id: ObjectID) -> Result<()> {
98        if let Some(id) = self.coin_manager {
99            bail!("coin manager already set: {id}")
100        }
101        self.coin_manager.replace(id);
102        Ok(())
103    }
104
105    pub fn coin_manager_treasury_cap(&self) -> Result<&ObjectID> {
106        self.coin_manager_treasury_cap
107            .as_ref()
108            .ok_or_else(|| anyhow!("no coin manager treasury cap object"))
109    }
110
111    pub(crate) fn set_coin_manager_treasury_cap(&mut self, id: ObjectID) -> Result<()> {
112        if let Some(id) = self.coin_manager_treasury_cap {
113            bail!("coin manager treasury cap already set: {id}")
114        }
115        self.coin_manager_treasury_cap.replace(id);
116        Ok(())
117    }
118}