public TxReceipt Decode(RlpStream rlpStream, RlpBehaviors rlpBehaviors = RlpBehaviors.None) { if (rlpStream.IsNextItemNull()) { rlpStream.ReadByte(); return(null); } bool isStorage = (rlpBehaviors & RlpBehaviors.Storage) != 0; TxReceipt txReceipt = new TxReceipt(); rlpStream.ReadSequenceLength(); byte[] firstItem = rlpStream.DecodeByteArray(); if (firstItem.Length == 1) { txReceipt.StatusCode = firstItem[0]; } else { txReceipt.PostTransactionState = firstItem.Length == 0 ? null : new Keccak(firstItem); } if (isStorage) { txReceipt.BlockHash = rlpStream.DecodeKeccak(); } if (isStorage) { txReceipt.BlockNumber = (long)rlpStream.DecodeUInt256(); } if (isStorage) { txReceipt.Index = rlpStream.DecodeInt(); } if (isStorage) { txReceipt.Sender = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.Recipient = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.ContractAddress = rlpStream.DecodeAddress(); } if (isStorage) { txReceipt.GasUsed = (long)rlpStream.DecodeUBigInt(); } txReceipt.GasUsedTotal = (long)rlpStream.DecodeUBigInt(); txReceipt.Bloom = rlpStream.DecodeBloom(); int lastCheck = rlpStream.ReadSequenceLength() + rlpStream.Position; List <LogEntry> logEntries = new List <LogEntry>(); while (rlpStream.Position < lastCheck) { logEntries.Add(Rlp.Decode <LogEntry>(rlpStream, RlpBehaviors.AllowExtraData)); } bool allowExtraData = (rlpBehaviors & RlpBehaviors.AllowExtraData) != 0; if (!allowExtraData) { rlpStream.Check(lastCheck); } // since error was added later we can only rely on it in cases where we read receipt only and no data follows if (isStorage && !allowExtraData && rlpStream.Position != rlpStream.Length) { txReceipt.Error = rlpStream.DecodeString(); } txReceipt.Logs = logEntries.ToArray(); return(txReceipt); }