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,
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}