Example #1
0
        private static InvocationResult _InvokeSystemContract(
            InvocationContext context, UInt160 address, byte[] input, ulong gasLimit
            )
        {
            var call = _contractRegisterer.DecodeContract(context, address, input);

            if (call is null)
            {
                return(InvocationResult.WithStatus(ExecutionStatus.ExecutionHalted));
            }
            return(VirtualMachine.InvokeSystemContract(call, context, input, gasLimit));
        }
Example #2
0
        public static InvocationResult InvokeSystemContract(
            SystemContractCall systemContractCall, InvocationContext context, byte[] input, ulong gasLimit
            )
        {
            var status = FrameFactory.FromSystemContractCall(
                systemContractCall,
                context,
                input,
                out var rootFrame,
                gasLimit
                );

            return(status == ExecutionStatus.Ok ? ExecuteFrame(rootFrame) : InvocationResult.WithStatus(status));
        }
Example #3
0
        public static InvocationResult Invoke(UInt160 address, InvocationContext context, byte[] input, ulong gasLimit)
        {
            var systemContract = _contractRegisterer.GetContractByAddress(address);

            if (systemContract != null)
            {
                return(_InvokeSystemContract(context, address, input, gasLimit));
            }

            var contract = context.Snapshot.Contracts.GetContractByHash(address);

            return(contract is null
                ? InvocationResult.WithStatus(ExecutionStatus.ContractNotFound)
                : VirtualMachine.InvokeWasmContract(contract, context, input, gasLimit));
        }
Example #4
0
        public static InvocationResult InvokeWasmContract(
            Contract contract, InvocationContext context, byte[] input, ulong gasLimit
            )
        {
            var status = FrameFactory.FromInvocation(
                contract.ByteCode,
                context,
                contract.ContractAddress,
                input,
                BlockchainInterface,
                out var rootFrame,
                gasLimit
                );

            return(status == ExecutionStatus.Ok ? ExecuteFrame(rootFrame) : InvocationResult.WithStatus(status));
        }