iota_types/
randomness_state.rs1use iota_sdk_types::{Identifier, ObjectId};
6use move_binary_format::{CompiledModule, file_format::SignatureToken};
7use move_bytecode_utils::resolve_struct;
8use move_core_types::{account_address::AccountAddress, ident_str, identifier::IdentStr};
9
10use crate::{
11 IOTA_FRAMEWORK_ADDRESS,
12 base_types::SequenceNumber,
13 error::{IotaError, IotaResult},
14 storage::ObjectStore,
15};
16
17pub const RANDOMNESS_STATE_UPDATE_FUNCTION_NAME: Identifier =
18 Identifier::from_static("update_randomness_state");
19pub const RANDOMNESS_STATE_CREATE_FUNCTION_NAME: Identifier = Identifier::from_static("create");
20pub const RESOLVED_IOTA_RANDOMNESS_STATE: (&AccountAddress, &IdentStr, &IdentStr) = (
21 &IOTA_FRAMEWORK_ADDRESS,
22 ident_str!("random"),
23 ident_str!("Random"),
24);
25
26pub fn get_randomness_state_obj_initial_shared_version(
27 object_store: &dyn ObjectStore,
28) -> IotaResult<SequenceNumber> {
29 object_store
30 .try_get_object(&ObjectId::RANDOMNESS_STATE)?
31 .map(|obj| {
32 obj.owner
33 .into_shared_opt()
34 .expect("Randomness state object must be shared")
35 })
36 .ok_or(IotaError::Storage(
37 "Randomness state object not found".to_string(),
38 ))
39}
40
41pub fn is_mutable_random(view: &CompiledModule, s: &SignatureToken) -> bool {
42 match s {
43 SignatureToken::MutableReference(inner) => is_mutable_random(view, inner),
44 SignatureToken::Datatype(idx) => {
45 resolve_struct(view, *idx) == RESOLVED_IOTA_RANDOMNESS_STATE
46 }
47 _ => false,
48 }
49}