private void ProcessDeploy(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec) { if (notification.State.Count != 1) { return; } var hash = notification.State[0].GetByteSafely(); if (hash == null || hash.Length != 20) { return; } var contractHash = new UInt160(hash); if (!Result.ContractChangeEvents.ContainsKey(appExec.Transaction.Hash)) { Result.ContractChangeEvents[appExec.Transaction.Hash] = new List <ContractEventInfo>(); } ContractState contract = NativeContract.ContractManagement.GetContract(_snapshot, contractHash); Result.ContractChangeEvents[appExec.Transaction.Hash].Add(new ContractEventInfo() { Contract = contractHash, Name = contract?.Manifest.Name, Event = ContractEventType.Create }); var asset = AssetCache.GetAssetInfoFromChain(contractHash, _snapshot); if (asset != null) { Result.AssetInfos[asset.Asset] = asset; } }
public static JObject TxLogToJson(Blockchain.ApplicationExecuted appExec) { global::System.Diagnostics.Debug.Assert(appExec.Transaction != null); var txJson = new JObject(); txJson["txid"] = appExec.Transaction.Hash.ToString(); JObject trigger = new JObject(); trigger["trigger"] = appExec.Trigger; trigger["vmstate"] = appExec.VMState; trigger["exception"] = GetExceptionMessage(appExec.Exception); trigger["gasconsumed"] = new BigDecimal(appExec.GasConsumed, NativeContract.GAS.Decimals).ToString(); try { trigger["stack"] = appExec.Stack.Select(q => q.ToJson()).ToArray(); } catch (InvalidOperationException) { trigger["stack"] = "error: recursive reference"; } trigger["notifications"] = appExec.Notifications.Select(q => { JObject notification = new JObject(); notification["contract"] = q.ScriptHash.ToString(); notification["eventname"] = q.EventName; try { notification["state"] = q.State.ToJson(); } catch (InvalidOperationException) { notification["state"] = "error: recursive reference"; } return(notification); }).ToArray(); txJson["executions"] = new List <JObject>() { trigger }.ToArray(); return(txJson); }
private void ProcessTransfer(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec) { var transfer = notification.ConvertToTransfer(); // HasTransfer(notification, transaction); if (transfer == null) { return; } var asset = AssetCache.GetAssetInfo(transfer.Asset, _snapshot); if (asset == null) { return; } if (transfer.From != null) { Result.BalanceChangeAccounts.Add(new AccountAsset(transfer.From, transfer.Asset)); } if (transfer.To != null) { Result.BalanceChangeAccounts.Add(new AccountAsset(transfer.To, transfer.Asset)); } if (appExec.Trigger == TriggerType.Application) { var transferStorageItem = new TransferStorageItem() { From = transfer.From, To = transfer.To, Asset = transfer.Asset, Amount = transfer.Amount, TxId = appExec?.Transaction?.Hash, Trigger = appExec.Trigger, }; Result.Transfers.Add(transferStorageItem); } }
private static JObject Convert(Blockchain.ApplicationExecuted appExec) { JObject json = new JObject(); json["txid"] = appExec.Transaction.Hash.ToString(); json["executions"] = appExec.ExecutionResults.Select(p => { JObject execution = new JObject(); execution["trigger"] = p.Trigger; execution["contract"] = p.ScriptHash.ToString(); execution["vmstate"] = p.VMState; execution["gas_consumed"] = p.GasConsumed.ToString(); try { execution["stack"] = p.Stack.Select(q => q.ToParameter().ToJson()).ToArray(); } catch (InvalidOperationException) { execution["stack"] = "error: recursive reference"; } execution["notifications"] = p.Notifications.Select(q => { JObject notification = new JObject(); notification["contract"] = q.ScriptHash.ToString(); try { notification["state"] = q.State.ToParameter().ToJson(); } catch (InvalidOperationException) { notification["state"] = "error: recursive reference"; } return(notification); }).ToArray(); return(execution); }).ToArray(); return(json); }
private void ProcessDestory(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec) { if (notification.State.Count != 1) { return; } var contractHash = notification.State[0].GetByteSafely(); if (contractHash == null || contractHash.Length != 20) { return; } var contract = new UInt160(contractHash); if (!Result.ContractChangeEvents.ContainsKey(appExec.Transaction.Hash)) { Result.ContractChangeEvents[appExec.Transaction.Hash] = new List <ContractEventInfo>(); } Result.ContractChangeEvents[appExec.Transaction.Hash].Add(new ContractEventInfo() { Contract = contract, Event = ContractEventType.Destroy }); }
private void AnalysisAppExecuteResult(Blockchain.ApplicationExecuted appExec) { var execResult = new ExecuteResultInfo(); Transaction transaction = appExec.Transaction; if (transaction != null) { //fee account Result.BalanceChangeAccounts.Add(new AccountAsset(transaction.Sender, NativeContract.GAS.Hash)); execResult.TxId = transaction.Hash; } execResult.Trigger = appExec.Trigger; execResult.VMState = appExec.VMState; execResult.GasConsumed = appExec.GasConsumed; try { execResult.ResultStack = appExec.Stack.Select(q => q.ToContractParameter().ToJson()).ToArray(); } catch (InvalidOperationException) { execResult.ResultStack = "error: recursive reference"; } execResult.Notifications = appExec.Notifications.Select(n => n.ToNotificationInfo()).ToList(); Result.ExecuteResultInfos.Add(execResult); foreach (var contract in execResult.Notifications.Select(n => n.Contract).Distinct()) { var asset = AssetCache.GetAssetInfo(contract, _snapshot); if (asset != null) { Result.AssetInfos[asset.Asset] = asset; } } if (execResult.VMState.HasFlag(VMState.FAULT)) { //no need to track return; } if (execResult.Notifications.IsEmpty()) { //no need to track return; } foreach (var notification in appExec.Notifications) { switch (notification.EventName) { case "transfer": case "Transfer": ProcessTransfer(notification, appExec); break; case "Deploy": ProcessDeploy(notification, appExec); break; case "Destory": ProcessDestory(notification, appExec); break; default: break; } } }
private void ProcessUpdate(NotifyEventArgs notification, Blockchain.ApplicationExecuted appExec) { }