1use super::call_frame::*;
2use crate::errors::*;
3use crate::internal_prelude::*;
4use crate::kernel::kernel_callback_api::*;
5use crate::track::interface::*;
6use radix_engine_interface::api::field_api::*;
7use radix_substate_store_interface::db_key_mapper::*;
8
9pub struct DroppedNode {
10 pub substates: NodeSubstates,
11 pub pinned_to_heap: bool,
12}
13
14pub trait KernelNodeApi {
19 fn kernel_pin_node(&mut self, node_id: NodeId) -> Result<(), RuntimeError>;
21
22 fn kernel_allocate_node_id(&mut self, entity_type: EntityType) -> Result<NodeId, RuntimeError>;
24
25 fn kernel_create_node(
27 &mut self,
28 node_id: NodeId,
29 node_substates: NodeSubstates,
30 ) -> Result<(), RuntimeError>;
31
32 fn kernel_create_node_from(
33 &mut self,
34 node_id: NodeId,
35 partitions: BTreeMap<PartitionNumber, (NodeId, PartitionNumber)>,
36 ) -> Result<(), RuntimeError>;
37
38 fn kernel_drop_node(&mut self, node_id: &NodeId) -> Result<DroppedNode, RuntimeError>;
43}
44
45pub trait KernelSubstateApi<L> {
47 fn kernel_mark_substate_as_transient(
49 &mut self,
50 node_id: NodeId,
51 partition_num: PartitionNumber,
52 key: SubstateKey,
53 ) -> Result<(), RuntimeError>;
54
55 fn kernel_open_substate_with_default<F: FnOnce() -> IndexedScryptoValue>(
57 &mut self,
58 node_id: &NodeId,
59 partition_num: PartitionNumber,
60 substate_key: &SubstateKey,
61 flags: LockFlags,
62 default: Option<F>,
63 lock_data: L,
64 ) -> Result<SubstateHandle, RuntimeError>;
65
66 fn kernel_open_substate(
67 &mut self,
68 node_id: &NodeId,
69 partition_num: PartitionNumber,
70 substate_key: &SubstateKey,
71 flags: LockFlags,
72 lock_data: L,
73 ) -> Result<SubstateHandle, RuntimeError> {
74 self.kernel_open_substate_with_default(
75 node_id,
76 partition_num,
77 substate_key,
78 flags,
79 None::<fn() -> IndexedScryptoValue>,
80 lock_data,
81 )
82 }
83
84 fn kernel_get_lock_data(&mut self, lock_handle: SubstateHandle) -> Result<L, RuntimeError>;
86
87 fn kernel_close_substate(&mut self, lock_handle: SubstateHandle) -> Result<(), RuntimeError>;
90
91 fn kernel_read_substate(
93 &mut self,
94 lock_handle: SubstateHandle,
95 ) -> Result<&IndexedScryptoValue, RuntimeError>;
96
97 fn kernel_write_substate(
99 &mut self,
100 lock_handle: SubstateHandle,
101 value: IndexedScryptoValue,
102 ) -> Result<(), RuntimeError>;
103
104 fn kernel_set_substate(
109 &mut self,
110 node_id: &NodeId,
111 partition_num: PartitionNumber,
112 substate_key: SubstateKey,
113 value: IndexedScryptoValue,
114 ) -> Result<(), RuntimeError>;
115
116 fn kernel_remove_substate(
121 &mut self,
122 node_id: &NodeId,
123 partition_num: PartitionNumber,
124 substate_key: &SubstateKey,
125 ) -> Result<Option<IndexedScryptoValue>, RuntimeError>;
126
127 fn kernel_scan_sorted_substates(
132 &mut self,
133 node_id: &NodeId,
134 partition_num: PartitionNumber,
135 count: u32,
136 ) -> Result<Vec<(SortedKey, IndexedScryptoValue)>, RuntimeError>;
137
138 fn kernel_scan_keys<K: SubstateKeyContent>(
139 &mut self,
140 node_id: &NodeId,
141 partition_num: PartitionNumber,
142 count: u32,
143 ) -> Result<Vec<SubstateKey>, RuntimeError>;
144
145 fn kernel_drain_substates<K: SubstateKeyContent>(
146 &mut self,
147 node_id: &NodeId,
148 partition_num: PartitionNumber,
149 count: u32,
150 ) -> Result<Vec<(SubstateKey, IndexedScryptoValue)>, RuntimeError>;
151}
152
153#[derive(Debug, Clone)]
154pub struct KernelInvocation<C> {
155 pub call_frame_data: C,
156 pub args: IndexedScryptoValue,
157}
158
159impl<C: CallFrameReferences> KernelInvocation<C> {
160 pub fn len(&self) -> usize {
161 self.call_frame_data.len() + self.args.len()
162 }
163}
164
165pub trait KernelInvokeApi<C> {
168 fn kernel_invoke(
169 &mut self,
170 invocation: Box<KernelInvocation<C>>,
171 ) -> Result<IndexedScryptoValue, RuntimeError>;
172}
173
174pub trait KernelStackApi {
176 type CallFrameData;
177
178 fn kernel_get_stack_id(&mut self) -> Result<usize, RuntimeError>;
180
181 fn kernel_switch_stack(&mut self, id: usize) -> Result<(), RuntimeError>;
183
184 fn kernel_send_to_stack(
186 &mut self,
187 id: usize,
188 value: &IndexedScryptoValue,
189 ) -> Result<(), RuntimeError>;
190
191 fn kernel_set_call_frame_data(&mut self, data: Self::CallFrameData)
193 -> Result<(), RuntimeError>;
194
195 fn kernel_get_owned_nodes(&mut self) -> Result<Vec<NodeId>, RuntimeError>;
197}
198
199pub struct SystemState<'a, M: KernelCallbackObject> {
200 pub system: &'a mut M,
201 pub current_call_frame: &'a M::CallFrameData,
202 pub caller_call_frame: &'a M::CallFrameData,
203}
204
205pub trait KernelInternalApi {
211 type System: KernelCallbackObject;
212
213 #[inline]
215 fn kernel_get_system(&mut self) -> &mut Self::System {
216 self.kernel_get_system_state().system
217 }
218
219 fn kernel_get_system_state(&mut self) -> SystemState<'_, Self::System>;
221
222 fn kernel_get_current_stack_depth_uncosted(&self) -> usize;
226
227 fn kernel_get_current_stack_id_uncosted(&self) -> usize;
231
232 fn kernel_get_node_visibility_uncosted(&self, node_id: &NodeId) -> NodeVisibility;
236
237 fn kernel_read_substate_uncosted(
241 &self,
242 node_id: &NodeId,
243 partition_num: PartitionNumber,
244 substate_key: &SubstateKey,
245 ) -> Option<&IndexedScryptoValue>;
246}
247
248pub trait KernelApi:
249 KernelNodeApi
250 + KernelSubstateApi<<Self::CallbackObject as KernelCallbackObject>::LockData>
251 + KernelInvokeApi<<Self::CallbackObject as KernelCallbackObject>::CallFrameData>
252 + KernelStackApi<CallFrameData = <Self::CallbackObject as KernelCallbackObject>::CallFrameData>
253 + KernelInternalApi<System = Self::CallbackObject>
254{
255 type CallbackObject: KernelCallbackObject;
256}