iota_types/
randomness_state.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use 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}