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
                            });
                        }
                    }
                }
            }
        }