sui_move_natives_v1/
tx_context.rsuse move_binary_format::errors::PartialVMResult;
use move_core_types::{account_address::AccountAddress, gas_algebra::InternalGas};
use move_vm_runtime::{native_charge_gas_early_exit, native_functions::NativeContext};
use move_vm_types::{
loaded_data::runtime_types::Type, natives::function::NativeResult, pop_arg, values::Value,
};
use smallvec::smallvec;
use std::{collections::VecDeque, convert::TryFrom};
use sui_types::base_types::{ObjectID, TransactionDigest};
use crate::{object_runtime::ObjectRuntime, NativesCostTable};
#[derive(Clone)]
pub struct TxContextDeriveIdCostParams {
pub tx_context_derive_id_cost_base: InternalGas,
}
pub fn derive_id(
context: &mut NativeContext,
ty_args: Vec<Type>,
mut args: VecDeque<Value>,
) -> PartialVMResult<NativeResult> {
debug_assert!(ty_args.is_empty());
debug_assert!(args.len() == 2);
let tx_context_derive_id_cost_params = context
.extensions_mut()
.get::<NativesCostTable>()
.tx_context_derive_id_cost_params
.clone();
native_charge_gas_early_exit!(
context,
tx_context_derive_id_cost_params.tx_context_derive_id_cost_base
);
let ids_created = pop_arg!(args, u64);
let tx_hash = pop_arg!(args, Vec<u8>);
let digest = TransactionDigest::try_from(tx_hash.as_slice()).unwrap();
let address = AccountAddress::from(ObjectID::derive_id(digest, ids_created));
let obj_runtime: &mut ObjectRuntime = context.extensions_mut().get_mut();
obj_runtime.new_id(address.into())?;
Ok(NativeResult::ok(
context.gas_used(),
smallvec![Value::address(address)],
))
}