internal static ReadOnlyCollection <TransactionReceipt> Create(TransactionID transactionId, Proto.TransactionReceipt rootReceipt, RepeatedField <Proto.TransactionReceipt> childrenReceipts, RepeatedField <Proto.TransactionReceipt> failedReceipts)
    {
        var count = (rootReceipt != null ? 1 : 0) + (childrenReceipts != null ? childrenReceipts.Count : 0) + (failedReceipts != null ? failedReceipts.Count : 0);

        if (count > 0)
        {
            var result = new List <TransactionReceipt>(count);
            if (rootReceipt is not null)
            {
                result.Add(new NetworkResult
                {
                    TransactionID = transactionId,
                    Receipt       = rootReceipt
                }.ToReceipt());
            }
            if (childrenReceipts is not null && childrenReceipts.Count > 0)
            {
                // The network DOES NOT return the
                // child transaction ID, so we have
                // to synthesize it.
                var nonce = 1;
                foreach (var entry in childrenReceipts)
                {
                    var childTransactionId = transactionId.Clone();
                    childTransactionId.Nonce = nonce;
                    result.Add(new NetworkResult
                    {
                        TransactionID = childTransactionId,
                        Receipt       = entry
                    }.ToReceipt());
                    nonce++;
                }
            }
            if (failedReceipts is not null && failedReceipts.Count > 0)
            {
                foreach (var entry in failedReceipts)
                {
                    result.Add(new NetworkResult
                    {
                        TransactionID = transactionId,
                        Receipt       = entry
                    }.ToReceipt());
                }
            }
            return(result.AsReadOnly());
        }
        return(EMPTY_RESULT);
    }