private async Task AddNewTransactionsDataToDocumentAsync(string address, List <CirrusContractTable> contractTransactions, NonFungibleTokenComputedTable contract) { foreach (var contractTransaction in contractTransactions) { var reader = logReaderFactory.GetLogReader(contractTransaction.MethodName); if (reader is null) { logger.LogInformation($"No reader found for method {contractTransaction.MethodName} on transaction id - {contractTransaction.TransactionId}"); throw new InvalidOperationException( $"Reader was not found for transaction - {contractTransaction.TransactionId}"); } if (!reader.IsTransactionLogComplete(contractTransaction.Logs)) { var result = await cirrusClient.GetContractInfoAsync(contractTransaction.TransactionId); contractTransaction.Logs = result.Logs; } reader.UpdateContractFromTransactionLog(contractTransaction, contract); contract.LastProcessedBlockHeight = contractTransaction.BlockIndex; } await SaveTheContractAsync(address, contract); }
protected override void OnAddToStorageBatch(StorageBatch storageBatch, SyncBlockTransactionsOperation item) { storageBatch.ExtraData ??= new CirrusStorageBatch(); if (!(storageBatch.ExtraData is CirrusStorageBatch cirrusStorageBatch)) { throw new ArgumentNullException(nameof(cirrusStorageBatch)); } foreach (Transaction transaction in item.Transactions) { TxOut smartContractInternalCallTxOut = transaction.Outputs.FirstOrDefault(txOut => txOut.ScriptPubKey.IsSmartContractInternalCall()); if (smartContractInternalCallTxOut != null) { // handle sc internal transfer } TxOut smartContractTxOut = transaction.Outputs.FirstOrDefault(txOut => txOut.ScriptPubKey.IsSmartContractExec()); if (smartContractTxOut != null) { // is this a smart contract transaction if (smartContractTxOut.ScriptPubKey.IsSmartContractExec()) { string contractOpcode = smartContractTxOut.ScriptPubKey.IsSmartContractCreate() ? "create" : smartContractTxOut.ScriptPubKey.IsSmartContractCall() ? "call" : null; // fetch the contract receipt ContractReceiptResponse receipt = cirrusClient.GetContractInfoAsync(transaction.GetHash().ToString()).Result; if (receipt == null) { throw new ApplicationException($"Smart Contract receipt not found for trx {transaction.GetHash()}"); } cirrusStorageBatch.CirrusContractTable.Add(new CirrusContractTable { ContractOpcode = contractOpcode, ContractCodeType = receipt.ContractCodeType, MethodName = receipt.MethodName, NewContractAddress = receipt.NewContractAddress, FromAddress = receipt.From, ToAddress = receipt.To, BlockIndex = item.BlockInfo.Height, TransactionId = receipt.TransactionHash, Success = receipt.Success, Error = receipt.Error, PostState = receipt.PostState, GasUsed = receipt.GasUsed, GasPrice = receipt.GasPrice, Amount = receipt.Amount, ContractBalance = receipt.ContractBalance, Logs = receipt.Logs }); if (receipt.ContractCodeHash != null) { cirrusStorageBatch.CirrusContractCodeTable.Add(new CirrusContractCodeTable { ContractAddress = receipt.NewContractAddress, BlockIndex = item.BlockInfo.Height, CodeType = receipt.ContractCodeType, ContractHash = receipt.ContractCodeHash, ByteCode = receipt.ContractBytecode, SourceCode = receipt.ContractCSharp }); } } } } }