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