use super::call_frame::*;
use crate::errors::*;
use crate::internal_prelude::*;
use crate::kernel::kernel_callback_api::*;
use crate::system::system_modules::execution_trace::*;
use crate::track::interface::*;
use radix_engine_interface::api::field_api::*;
use radix_substate_store_interface::db_key_mapper::*;
pub struct DroppedNode {
pub substates: NodeSubstates,
pub pinned_to_heap: bool,
}
pub trait KernelNodeApi {
fn kernel_pin_node(&mut self, node_id: NodeId) -> Result<(), RuntimeError>;
fn kernel_allocate_node_id(&mut self, entity_type: EntityType) -> Result<NodeId, RuntimeError>;
fn kernel_create_node(
&mut self,
node_id: NodeId,
node_substates: NodeSubstates,
) -> Result<(), RuntimeError>;
fn kernel_create_node_from(
&mut self,
node_id: NodeId,
partitions: BTreeMap<PartitionNumber, (NodeId, PartitionNumber)>,
) -> Result<(), RuntimeError>;
fn kernel_drop_node(&mut self, node_id: &NodeId) -> Result<DroppedNode, RuntimeError>;
}
pub trait KernelSubstateApi<L> {
fn kernel_mark_substate_as_transient(
&mut self,
node_id: NodeId,
partition_num: PartitionNumber,
key: SubstateKey,
) -> Result<(), RuntimeError>;
fn kernel_open_substate_with_default<F: FnOnce() -> IndexedScryptoValue>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
flags: LockFlags,
default: Option<F>,
lock_data: L,
) -> Result<SubstateHandle, RuntimeError>;
fn kernel_open_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
flags: LockFlags,
lock_data: L,
) -> Result<SubstateHandle, RuntimeError> {
self.kernel_open_substate_with_default(
node_id,
partition_num,
substate_key,
flags,
None::<fn() -> IndexedScryptoValue>,
lock_data,
)
}
fn kernel_get_lock_data(&mut self, lock_handle: SubstateHandle) -> Result<L, RuntimeError>;
fn kernel_close_substate(&mut self, lock_handle: SubstateHandle) -> Result<(), RuntimeError>;
fn kernel_read_substate(
&mut self,
lock_handle: SubstateHandle,
) -> Result<&IndexedScryptoValue, RuntimeError>;
fn kernel_write_substate(
&mut self,
lock_handle: SubstateHandle,
value: IndexedScryptoValue,
) -> Result<(), RuntimeError>;
fn kernel_set_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: SubstateKey,
value: IndexedScryptoValue,
) -> Result<(), RuntimeError>;
fn kernel_remove_substate(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
substate_key: &SubstateKey,
) -> Result<Option<IndexedScryptoValue>, RuntimeError>;
fn kernel_scan_sorted_substates(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<(SortedKey, IndexedScryptoValue)>, RuntimeError>;
fn kernel_scan_keys<K: SubstateKeyContent + 'static>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<SubstateKey>, RuntimeError>;
fn kernel_drain_substates<K: SubstateKeyContent + 'static>(
&mut self,
node_id: &NodeId,
partition_num: PartitionNumber,
count: u32,
) -> Result<Vec<(SubstateKey, IndexedScryptoValue)>, RuntimeError>;
}
#[derive(Debug)]
pub struct KernelInvocation<C> {
pub call_frame_data: C,
pub args: IndexedScryptoValue,
}
impl<C: CallFrameReferences> KernelInvocation<C> {
pub fn len(&self) -> usize {
self.call_frame_data.len() + self.args.len()
}
}
pub trait KernelInvokeApi<C> {
fn kernel_invoke(
&mut self,
invocation: Box<KernelInvocation<C>>,
) -> Result<IndexedScryptoValue, RuntimeError>;
}
pub struct SystemState<'a, M: KernelCallbackObject> {
pub system: &'a mut M,
pub current_call_frame: &'a M::CallFrameData,
pub caller_call_frame: &'a M::CallFrameData,
}
pub trait KernelInternalApi<M: KernelCallbackObject> {
fn kernel_get_system(&mut self) -> &mut M {
self.kernel_get_system_state().system
}
fn kernel_get_system_state(&mut self) -> SystemState<'_, M>;
fn kernel_get_current_depth(&self) -> usize;
fn kernel_get_node_visibility(&self, node_id: &NodeId) -> NodeVisibility;
fn kernel_read_bucket(&mut self, bucket_id: &NodeId) -> Option<BucketSnapshot>;
fn kernel_read_proof(&mut self, proof_id: &NodeId) -> Option<ProofSnapshot>;
}
pub trait KernelApi<M: KernelCallbackObject>:
KernelNodeApi
+ KernelSubstateApi<M::LockData>
+ KernelInvokeApi<M::CallFrameData>
+ KernelInternalApi<M>
{
}