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