Skip to main content

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