pub struct NeoRuntime { /* private fields */ }Expand description
Neo runtime for executing compiled Yul contracts
Implementations§
Source§impl NeoRuntime
impl NeoRuntime
Sourcepub fn enable_debugging(&mut self)
pub fn enable_debugging(&mut self)
Enable debugging mode
Sourcepub fn disable_debugging(&mut self)
pub fn disable_debugging(&mut self)
Disable debugging mode
Sourcepub fn set_breakpoint(&mut self, instruction_pointer: u32)
pub fn set_breakpoint(&mut self, instruction_pointer: u32)
Set breakpoint at instruction
Sourcepub fn remove_breakpoint(&mut self, instruction_pointer: u32)
pub fn remove_breakpoint(&mut self, instruction_pointer: u32)
Remove breakpoint
Sourcepub fn step(&mut self) -> Result<StepResult, RuntimeError>
pub fn step(&mut self) -> Result<StepResult, RuntimeError>
Step through execution
Source§impl NeoRuntime
impl NeoRuntime
Sourcepub fn deploy_contract(
&mut self,
bytecode: &[u8],
constructor_args: &[u8],
) -> Result<String, RuntimeError>
pub fn deploy_contract( &mut self, bytecode: &[u8], constructor_args: &[u8], ) -> Result<String, RuntimeError>
Deploy contract and return address
Source§impl NeoRuntime
impl NeoRuntime
Sourcepub fn override_block_height(&mut self, height: u64)
pub fn override_block_height(&mut self, height: u64)
Override block height for the next execution.
Sourcepub fn override_timestamp(&mut self, timestamp: u64)
pub fn override_timestamp(&mut self, timestamp: u64)
Override timestamp for the next execution.
Sourcepub fn override_caller_account(
&mut self,
account: &str,
) -> Result<(), RuntimeError>
pub fn override_caller_account( &mut self, account: &str, ) -> Result<(), RuntimeError>
Override caller script hash for the next execution.
Sourcepub fn override_value(&mut self, value: u64)
pub fn override_value(&mut self, value: u64)
Task #113 — Override Solidity msg.value for the next execution.
Neo N3 has no native attached-value concept, so compiled
MsgValue reads default to 0. This override lets harnesses drive
msg.value to a specific u64 for payable-fallback / NEP-17
onPayment test scenarios. Drained after the next execution
(mirrors override_timestamp / override_block_height).
Sourcepub fn execute_with_overrides(
&mut self,
bytecode: &[u8],
input: &[u8],
overrides: &ExecutionOverrides,
) -> Result<ExecutionResult, RuntimeError>
pub fn execute_with_overrides( &mut self, bytecode: &[u8], input: &[u8], overrides: &ExecutionOverrides, ) -> Result<ExecutionResult, RuntimeError>
Execute bytecode with optional metadata overrides applied to this invocation.
Sourcepub fn new(config: RuntimeConfig) -> Result<Self, RuntimeError>
pub fn new(config: RuntimeConfig) -> Result<Self, RuntimeError>
Create new runtime instance
Sourcepub fn execute(
&mut self,
bytecode: &[u8],
input: &[u8],
) -> Result<ExecutionResult, RuntimeError>
pub fn execute( &mut self, bytecode: &[u8], input: &[u8], ) -> Result<ExecutionResult, RuntimeError>
Execute bytecode with given input
Sourcepub fn execute_with_tokens(
&mut self,
bytecode: &[u8],
input: &[u8],
tokens: &[MethodToken],
) -> Result<ExecutionResult, RuntimeError>
pub fn execute_with_tokens( &mut self, bytecode: &[u8], input: &[u8], tokens: &[MethodToken], ) -> Result<ExecutionResult, RuntimeError>
Execute bytecode with a NEF method token table.
This is required when the script contains the CALLT opcode (0x37).
Sourcepub fn call_function(
&mut self,
bytecode: &[u8],
function_name: &str,
args: &[StackItem],
) -> Result<ExecutionResult, RuntimeError>
pub fn call_function( &mut self, bytecode: &[u8], function_name: &str, args: &[StackItem], ) -> Result<ExecutionResult, RuntimeError>
Call specific function with arguments
Sourcepub fn call_method(
&mut self,
bytecode: &[u8],
tokens: &[MethodToken],
manifest: &Value,
method_name: &str,
args: &[StackItem],
) -> Result<ExecutionResult, RuntimeError>
pub fn call_method( &mut self, bytecode: &[u8], tokens: &[MethodToken], manifest: &Value, method_name: &str, args: &[StackItem], ) -> Result<ExecutionResult, RuntimeError>
Invoke a named method on a compiled Neo DevPack for Solidity contract.
Unlike call_function, which cannot reach anything past the first
public method of a multi-method contract, this helper (Task #19):
- Runs
_deploy(null, false)once perNeoRuntimeinstance so that state-variable initializers populate storage before any user call observes the contract (Task #47: state-var initializers did not run under theexecute/call_functionpaths — this subsumes it). - Looks up the target method’s offset from
manifest.abi.methods[].offset(emitted by the compiler atsrc/cli/bytecode/bytecode_core.rs:120) and starts execution at that offset rather than always atbytecode[0]. - Pushes
argsin reverse onto the NeoVM evaluation stack so that theINITSLOT locals, argsprologue emitted by each compiled method (opcode 0x57, handler atinstruction/slots.rs:4) pops them into the method’s argument slots in declaration order.
The persisted storage lives in storage_manager; bridge::execute
flushes the storage_overlay via storage.commit(..) on halt, so
subsequent call_method invocations on the same NeoRuntime
observe deploy-time writes.
tokens is the NEF method-token table carried alongside the
bytecode (see CompilationArtifacts::tokens); pass an empty slice
for scripts that do not use CALLT.
Sourcepub fn call_method_with_deploy_args(
&mut self,
bytecode: &[u8],
tokens: &[MethodToken],
manifest: &Value,
method_name: &str,
args: &[StackItem],
deploy_args: Option<&[StackItem]>,
) -> Result<ExecutionResult, RuntimeError>
pub fn call_method_with_deploy_args( &mut self, bytecode: &[u8], tokens: &[MethodToken], manifest: &Value, method_name: &str, args: &[StackItem], deploy_args: Option<&[StackItem]>, ) -> Result<ExecutionResult, RuntimeError>
Task #81: Invoke a named method like call_method, but pass
deploy_args through the auto-fired _deploy(data, update) trigger
as the data parameter.
deploy_args wires constructor arguments for contracts whose
Solidity constructor(...) takes parameters. When
deploy_args = Some(&[..]), the slice is wrapped in a
StackItem::Array and passed as data; the compiled _deploy
prologue then decodes it (jsonDeserialize/deserialize fallbacks
throw on Array inputs, so the original Array flows through unchanged
to PICKITEM / ArrayGet for constructor-argument extraction, see
src/ir/ir_deploy.rs:112).
When deploy_args = None, behavior matches pre-Task #81
call_method: data = Null, suitable for no-arg constructors.
update is always Boolean(false) here (this is a first-deployment
trigger, not a contract update).
Source§impl NeoRuntime
impl NeoRuntime
Sourcepub fn get_state_snapshot(&self) -> StateSnapshot
pub fn get_state_snapshot(&self) -> StateSnapshot
Get current state of the runtime
Sourcepub fn restore_state(
&mut self,
snapshot: StateSnapshot,
) -> Result<(), RuntimeError>
pub fn restore_state( &mut self, snapshot: StateSnapshot, ) -> Result<(), RuntimeError>
Restore state from snapshot
Sourcepub fn get_storage(
&mut self,
account: &str,
key: &[u8],
) -> Result<Option<Vec<u8>>, RuntimeError>
pub fn get_storage( &mut self, account: &str, key: &[u8], ) -> Result<Option<Vec<u8>>, RuntimeError>
Get storage value for account and key
Sourcepub fn set_storage(
&mut self,
account: &str,
key: &[u8],
value: &[u8],
) -> Result<(), RuntimeError>
pub fn set_storage( &mut self, account: &str, key: &[u8], value: &[u8], ) -> Result<(), RuntimeError>
Set storage value for account and key
Sourcepub fn storage_find(
&mut self,
account: &str,
prefix: &[u8],
) -> Result<Vec<(Vec<u8>, Vec<u8>)>, RuntimeError>
pub fn storage_find( &mut self, account: &str, prefix: &[u8], ) -> Result<Vec<(Vec<u8>, Vec<u8>)>, RuntimeError>
Find all storage (key, value) pairs for account whose keys start with
prefix, returned in byte-lexicographic key order.
Delegates to StorageManager::query with an explicit prefix filter; an
empty prefix slice matches every key for the account (common “scan all”
pattern used by Neo N3 storage iterators).
Sourcepub fn get_balance(&self, account: &str) -> Result<u64, RuntimeError>
pub fn get_balance(&self, account: &str) -> Result<u64, RuntimeError>
Get account balance
Sourcepub fn set_balance(
&mut self,
account: &str,
balance: u64,
) -> Result<(), RuntimeError>
pub fn set_balance( &mut self, account: &str, balance: u64, ) -> Result<(), RuntimeError>
Set account balance
Sourcepub fn get_statistics(&self) -> RuntimeStatistics
pub fn get_statistics(&self) -> RuntimeStatistics
Get runtime statistics
Trait Implementations§
Auto Trait Implementations§
impl !RefUnwindSafe for NeoRuntime
impl !Send for NeoRuntime
impl !Sync for NeoRuntime
impl !UnwindSafe for NeoRuntime
impl Freeze for NeoRuntime
impl Unpin for NeoRuntime
impl UnsafeUnpin for NeoRuntime
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> FmtForward for T
impl<T> FmtForward for T
Source§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.Source§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.Source§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.Source§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.Source§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.Source§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.Source§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.Source§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
Source§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
Source§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read moreSource§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
Source§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
Source§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.Source§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.Source§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.Source§impl<T> Tap for T
impl<T> Tap for T
Source§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read moreSource§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read moreSource§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read moreSource§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read moreSource§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read moreSource§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.Source§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.Source§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.Source§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.Source§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.Source§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.