diff --git a/plugins/ApplicationLogs/ApplicationLogs.csproj b/plugins/ApplicationLogs/ApplicationLogs.csproj index 04c7d70cb..aa3a759af 100644 --- a/plugins/ApplicationLogs/ApplicationLogs.csproj +++ b/plugins/ApplicationLogs/ApplicationLogs.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/plugins/DBFTPlugin/Consensus/ConsensusContext.Get.cs b/plugins/DBFTPlugin/Consensus/ConsensusContext.Get.cs index 117e3443a..5173ae7bb 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusContext.Get.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusContext.Get.cs @@ -9,27 +9,29 @@ // Redistribution and use in source and binary forms with or without // modifications are permitted. -using Neo.Extensions; using Neo.Network.P2P.Payloads; using Neo.Plugins.DBFTPlugin.Messages; using Neo.SmartContract; +using System.Diagnostics.CodeAnalysis; using System.Runtime.CompilerServices; namespace Neo.Plugins.DBFTPlugin.Consensus; partial class ConsensusContext { - public ConsensusMessage GetMessage(ExtensiblePayload payload) + [return: NotNullIfNotNull(nameof(payload))] + public ConsensusMessage? GetMessage(ExtensiblePayload? payload) { if (payload is null) return null; - if (!cachedMessages.TryGetValue(payload.Hash, out ConsensusMessage message)) + if (!cachedMessages.TryGetValue(payload.Hash, out ConsensusMessage? message)) cachedMessages.Add(payload.Hash, message = ConsensusMessage.DeserializeFrom(payload.Data)); return message; } - public T GetMessage(ExtensiblePayload payload) where T : ConsensusMessage + [return: NotNullIfNotNull(nameof(payload))] + public T? GetMessage(ExtensiblePayload? payload) where T : ConsensusMessage { - return (T)GetMessage(payload); + return (T?)GetMessage(payload); } private RecoveryMessage.ChangeViewPayloadCompact GetChangeViewPayloadCompact(ExtensiblePayload payload) @@ -82,7 +84,7 @@ public UInt160 GetSender(int index) /// public int GetExpectedBlockSize() { - return GetExpectedBlockSizeWithoutTransactions(Transactions.Count) + // Base size + return GetExpectedBlockSizeWithoutTransactions(Transactions!.Count) + // Base size Transactions.Values.Sum(u => u.Size); // Sum Txs } @@ -91,7 +93,7 @@ public int GetExpectedBlockSize() /// public long GetExpectedBlockSystemFee() { - return Transactions.Values.Sum(u => u.SystemFee); // Sum Txs + return Transactions!.Values.Sum(u => u.SystemFee); // Sum Txs } /// diff --git a/plugins/DBFTPlugin/Consensus/ConsensusContext.MakePayload.cs b/plugins/DBFTPlugin/Consensus/ConsensusContext.MakePayload.cs index 0ba8982ec..da1b38ac9 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusContext.MakePayload.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusContext.MakePayload.cs @@ -9,7 +9,6 @@ // Redistribution and use in source and binary forms with or without // modifications are permitted. -using Neo.Extensions; using Neo.Ledger; using Neo.Network.P2P.Payloads; using Neo.Plugins.DBFTPlugin.Messages; @@ -32,15 +31,15 @@ public ExtensiblePayload MakeChangeView(ChangeViewReason reason) public ExtensiblePayload MakeCommit() { - if (CommitPayloads[MyIndex] is not null) - return CommitPayloads[MyIndex]; + if (CommitPayloads[MyIndex] is ExtensiblePayload payload) + return payload; - var block = EnsureHeader(); + var block = EnsureHeader()!; CommitPayloads[MyIndex] = MakeSignedPayload(new Commit { - Signature = _signer.SignBlock(block, _myPublicKey, dbftSettings.Network) + Signature = _signer.SignBlock(block, _myPublicKey!, dbftSettings.Network) }); - return CommitPayloads[MyIndex]; + return CommitPayloads[MyIndex]!; } private ExtensiblePayload MakeSignedPayload(ConsensusMessage message) @@ -112,7 +111,7 @@ public ExtensiblePayload MakePrepareRequest() PrevHash = Block.PrevHash, Timestamp = Block.Timestamp, Nonce = Block.Nonce, - TransactionHashes = TransactionHashes + TransactionHashes = TransactionHashes! }); } @@ -126,7 +125,7 @@ public ExtensiblePayload MakeRecoveryRequest() public ExtensiblePayload MakeRecoveryMessage() { - PrepareRequest prepareRequestMessage = null; + PrepareRequest? prepareRequestMessage = null; if (TransactionHashes != null) { prepareRequestMessage = new PrepareRequest @@ -144,23 +143,23 @@ public ExtensiblePayload MakeRecoveryMessage() return MakeSignedPayload(new RecoveryMessage { ChangeViewMessages = LastChangeViewPayloads.Where(p => p != null) - .Select(p => GetChangeViewPayloadCompact(p)) + .Select(p => GetChangeViewPayloadCompact(p!)) .Take(M) .ToDictionary(p => p.ValidatorIndex), PrepareRequestMessage = prepareRequestMessage, // We only need a PreparationHash set if we don't have the PrepareRequest information. PreparationHash = TransactionHashes == null ? PreparationPayloads.Where(p => p != null) - .GroupBy(p => GetMessage(p).PreparationHash, (k, g) => new { Hash = k, Count = g.Count() }) + .GroupBy(p => GetMessage(p!).PreparationHash, (k, g) => new { Hash = k, Count = g.Count() }) .OrderByDescending(p => p.Count) .Select(p => p.Hash) .FirstOrDefault() : null, PreparationMessages = PreparationPayloads.Where(p => p != null) - .Select(p => GetPreparationPayloadCompact(p)) + .Select(p => GetPreparationPayloadCompact(p!)) .ToDictionary(p => p.ValidatorIndex), CommitMessages = CommitSent - ? CommitPayloads.Where(p => p != null).Select(p => GetCommitPayloadCompact(p)).ToDictionary(p => p.ValidatorIndex) + ? CommitPayloads.Where(p => p != null).Select(p => GetCommitPayloadCompact(p!)).ToDictionary(p => p.ValidatorIndex) : new Dictionary() }); } @@ -169,7 +168,7 @@ public ExtensiblePayload MakePrepareResponse() { return PreparationPayloads[MyIndex] = MakeSignedPayload(new PrepareResponse { - PreparationHash = PreparationPayloads[Block.PrimaryIndex].Hash + PreparationHash = PreparationPayloads[Block.PrimaryIndex]!.Hash }); } diff --git a/plugins/DBFTPlugin/Consensus/ConsensusContext.cs b/plugins/DBFTPlugin/Consensus/ConsensusContext.cs index 043cb3568..1fccdf28a 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusContext.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusContext.cs @@ -11,7 +11,6 @@ using Neo.Cryptography; using Neo.Cryptography.ECC; -using Neo.Extensions; using Neo.Extensions.IO; using Neo.IO; using Neo.Ledger; @@ -32,41 +31,41 @@ public sealed partial class ConsensusContext : IDisposable, ISerializable /// private static readonly byte[] ConsensusStateKey = { 0xf4 }; - public Block Block; + public Block Block = null!; public byte ViewNumber; public TimeSpan TimePerBlock; - public ECPoint[] Validators; + public ECPoint[] Validators = null!; public int MyIndex; - public UInt256[] TransactionHashes; - public Dictionary Transactions; - public ExtensiblePayload[] PreparationPayloads; - public ExtensiblePayload[] CommitPayloads; - public ExtensiblePayload[] ChangeViewPayloads; - public ExtensiblePayload[] LastChangeViewPayloads; + public UInt256[]? TransactionHashes; + public Dictionary? Transactions; + public ExtensiblePayload?[] PreparationPayloads = null!; + public ExtensiblePayload?[] CommitPayloads = null!; + public ExtensiblePayload?[] ChangeViewPayloads = null!; + public ExtensiblePayload?[] LastChangeViewPayloads = null!; // LastSeenMessage array stores the height of the last seen message, for each validator. // if this node never heard from validator i, LastSeenMessage[i] will be -1. - public Dictionary LastSeenMessage { get; private set; } + public Dictionary? LastSeenMessage { get; private set; } /// /// Store all verified unsorted transactions' senders' fee currently in the consensus context. /// public TransactionVerificationContext VerificationContext = new(); - public StoreCache Snapshot { get; private set; } - private ECPoint _myPublicKey; + public StoreCache Snapshot { get; private set; } = null!; + private ECPoint? _myPublicKey; private int _witnessSize; private readonly NeoSystem neoSystem; private readonly DbftSettings dbftSettings; private readonly ISigner _signer; - private readonly IStore store; - private Dictionary cachedMessages; + private readonly IStore? store; + private Dictionary cachedMessages = null!; public int F => (Validators.Length - 1) / 3; public int M => Validators.Length - F; public bool IsPrimary => MyIndex == Block.PrimaryIndex; public bool IsBackup => MyIndex >= 0 && MyIndex != Block.PrimaryIndex; public bool WatchOnly => MyIndex < 0; - public Header PrevHeader => NativeContract.Ledger.GetHeader(Snapshot, Block.PrevHash); + public Header PrevHeader => NativeContract.Ledger.GetHeader(Snapshot, Block.PrevHash)!; public int CountCommitted => CommitPayloads.Count(p => p != null); public int CountFailed { @@ -82,8 +81,8 @@ public bool ValidatorsChanged { if (NativeContract.Ledger.CurrentIndex(Snapshot) == 0) return false; UInt256 hash = NativeContract.Ledger.CurrentHash(Snapshot); - TrimmedBlock currentBlock = NativeContract.Ledger.GetTrimmedBlock(Snapshot, hash); - TrimmedBlock previousBlock = NativeContract.Ledger.GetTrimmedBlock(Snapshot, currentBlock.Header.PrevHash); + TrimmedBlock currentBlock = NativeContract.Ledger.GetTrimmedBlock(Snapshot, hash)!; + TrimmedBlock previousBlock = NativeContract.Ledger.GetTrimmedBlock(Snapshot, currentBlock.Header.PrevHash)!; return currentBlock.Header.NextConsensus != previousBlock.Header.NextConsensus; } } @@ -128,11 +127,11 @@ public Block CreateBlock() for (int i = 0, j = 0; i < Validators.Length && j < M; i++) { if (GetMessage(CommitPayloads[i])?.ViewNumber != ViewNumber) continue; - sc.AddSignature(contract, Validators[i], GetMessage(CommitPayloads[i]).Signature.ToArray()); + sc.AddSignature(contract, Validators[i], GetMessage(CommitPayloads[i]!).Signature.ToArray()); j++; } Block.Header.Witness = sc.GetWitnesses()[0]; - Block.Transactions = TransactionHashes.Select(p => Transactions[p]).ToArray(); + Block.Transactions = TransactionHashes!.Select(p => Transactions![p]).ToArray(); return Block; } @@ -145,7 +144,7 @@ public ExtensiblePayload CreatePayload(ConsensusMessage message, ReadOnlyMemory< ValidBlockEnd = message.BlockIndex, Sender = GetSender(message.ValidatorIndex), Data = message.ToArray(), - Witness = invocationScript.IsEmpty ? null : new Witness + Witness = invocationScript.IsEmpty ? null! : new Witness { InvocationScript = invocationScript, VerificationScript = Contract.CreateSignatureRedeemScript(Validators[message.ValidatorIndex]) @@ -160,7 +159,7 @@ public void Dispose() Snapshot?.Dispose(); } - public Block EnsureHeader() + public Block? EnsureHeader() { if (TransactionHashes == null) return null; Block.Header.MerkleRoot ??= MerkleTree.ComputeRoot(TransactionHashes); @@ -267,13 +266,13 @@ public void Reset(byte viewNumber) } ViewNumber = viewNumber; Block.Header.PrimaryIndex = GetPrimaryIndex(viewNumber); - Block.Header.MerkleRoot = null; + Block.Header.MerkleRoot = null!; Block.Header.Timestamp = 0; Block.Header.Nonce = 0; - Block.Transactions = null; + Block.Transactions = null!; TransactionHashes = null; PreparationPayloads = new ExtensiblePayload[Validators.Length]; - if (MyIndex >= 0) LastSeenMessage[Validators[MyIndex]] = Block.Index; + if (MyIndex >= 0) LastSeenMessage![Validators[MyIndex]] = Block.Index; } public void Save() @@ -295,7 +294,7 @@ public void Deserialize(ref MemoryReader reader) Block.Header.PrimaryIndex = reader.ReadByte(); Block.Header.NextConsensus = reader.ReadSerializable(); if (Block.NextConsensus.Equals(UInt160.Zero)) - Block.Header.NextConsensus = null; + Block.Header.NextConsensus = null!; ViewNumber = reader.ReadByte(); TransactionHashes = reader.ReadSerializableArray(ushort.MaxValue); Transaction[] transactions = reader.ReadSerializableArray(ushort.MaxValue); diff --git a/plugins/DBFTPlugin/Consensus/ConsensusService.Check.cs b/plugins/DBFTPlugin/Consensus/ConsensusService.Check.cs index cdc8d7952..33d7f84a1 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusService.Check.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusService.Check.cs @@ -21,7 +21,7 @@ partial class ConsensusService { private bool CheckPrepareResponse() { - if (context.TransactionHashes.Length == context.Transactions.Count) + if (context.TransactionHashes!.Length == context.Transactions!.Count) { // if we are the primary for this view, but acting as a backup because we recovered our own // previously sent prepare request, then we don't want to send a prepare response. @@ -55,7 +55,7 @@ private bool CheckPrepareResponse() private void CheckCommits() { - if (context.CommitPayloads.Count(p => context.GetMessage(p)?.ViewNumber == context.ViewNumber) >= context.M && context.TransactionHashes.All(p => context.Transactions.ContainsKey(p))) + if (context.CommitPayloads.Count(p => context.GetMessage(p)?.ViewNumber == context.ViewNumber) >= context.M && context.TransactionHashes!.All(p => context.Transactions!.ContainsKey(p))) { block_received_index = context.Block.Index; Block block = context.CreateBlock(); @@ -73,7 +73,7 @@ private void CheckExpectedView(byte viewNumber) { if (!context.WatchOnly) { - ChangeView message = messages[context.MyIndex]; + ChangeView? message = messages[context.MyIndex]; // Communicate the network about my agreement to move to `viewNumber` // if my last change view payload, `message`, has NewViewNumber lower than current view to change if (message is null || message.NewViewNumber < viewNumber) @@ -85,7 +85,7 @@ private void CheckExpectedView(byte viewNumber) private void CheckPreparations() { - if (context.PreparationPayloads.Count(p => p != null) >= context.M && context.TransactionHashes.All(p => context.Transactions.ContainsKey(p))) + if (context.PreparationPayloads.Count(p => p != null) >= context.M && context.TransactionHashes!.All(p => context.Transactions!.ContainsKey(p))) { ExtensiblePayload payload = context.MakeCommit(); Log($"Sending {nameof(Commit)}"); diff --git a/plugins/DBFTPlugin/Consensus/ConsensusService.OnMessage.cs b/plugins/DBFTPlugin/Consensus/ConsensusService.OnMessage.cs index 2cbb4d233..e069ab17f 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusService.OnMessage.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusService.OnMessage.cs @@ -11,7 +11,6 @@ using Akka.Actor; using Neo.Cryptography; -using Neo.Extensions; using Neo.Ledger; using Neo.Network.P2P; using Neo.Network.P2P.Payloads; @@ -48,7 +47,7 @@ private void OnConsensusPayload(ExtensiblePayload payload) } if (message.ValidatorIndex >= context.Validators.Length) return; if (payload.Sender != Contract.CreateSignatureRedeemScript(context.Validators[message.ValidatorIndex]).ToScriptHash()) return; - context.LastSeenMessage[context.Validators[message.ValidatorIndex]] = message.BlockIndex; + context.LastSeenMessage?[context.Validators[message.ValidatorIndex]] = message.BlockIndex; switch (message) { case PrepareRequest request: @@ -106,13 +105,13 @@ private void OnPrepareRequestReceived(ExtensiblePayload payload, PrepareRequest context.VerificationContext = new TransactionVerificationContext(); for (int i = 0; i < context.PreparationPayloads.Length; i++) if (context.PreparationPayloads[i] != null) - if (!context.GetMessage(context.PreparationPayloads[i]).PreparationHash.Equals(payload.Hash)) + if (!context.GetMessage(context.PreparationPayloads[i]!).PreparationHash.Equals(payload.Hash)) context.PreparationPayloads[i] = null; context.PreparationPayloads[message.ValidatorIndex] = payload; - byte[] hashData = context.EnsureHeader().GetSignData(neoSystem.Settings.Network); + byte[] hashData = context.EnsureHeader()!.GetSignData(neoSystem.Settings.Network); for (int i = 0; i < context.CommitPayloads.Length; i++) if (context.GetMessage(context.CommitPayloads[i])?.ViewNumber == context.ViewNumber) - if (!Crypto.VerifySignature(hashData, context.GetMessage(context.CommitPayloads[i]).Signature.Span, context.Validators[i])) + if (!Crypto.VerifySignature(hashData, context.GetMessage(context.CommitPayloads[i]!).Signature.Span, context.Validators[i])) context.CommitPayloads[i] = null; if (context.TransactionHashes.Length == 0) @@ -127,7 +126,7 @@ private void OnPrepareRequestReceived(ExtensiblePayload payload, PrepareRequest var mtb = neoSystem.Settings.MaxTraceableBlocks; foreach (UInt256 hash in context.TransactionHashes) { - if (mempoolVerified.TryGetValue(hash, out Transaction tx)) + if (mempoolVerified.TryGetValue(hash, out Transaction? tx)) { if (NativeContract.Ledger.ContainsConflictHash(context.Snapshot, hash, tx.Signers.Select(s => s.Account), mtb)) { @@ -165,7 +164,7 @@ private void OnPrepareResponseReceived(ExtensiblePayload payload, PrepareRespons { if (message.ViewNumber != context.ViewNumber) return; if (context.PreparationPayloads[message.ValidatorIndex] != null || context.NotAcceptingPayloadsDueToViewChanging) return; - if (context.PreparationPayloads[context.Block.PrimaryIndex] != null && !message.PreparationHash.Equals(context.PreparationPayloads[context.Block.PrimaryIndex].Hash)) + if (context.PreparationPayloads[context.Block.PrimaryIndex] != null && !message.PreparationHash.Equals(context.PreparationPayloads[context.Block.PrimaryIndex]!.Hash)) return; // Timeout extension: prepare response has been received with success @@ -197,7 +196,7 @@ private void OnChangeViewReceived(ExtensiblePayload payload, ChangeView message) private void OnCommitReceived(ExtensiblePayload payload, Commit commit) { - ref ExtensiblePayload existingCommitPayload = ref context.CommitPayloads[commit.ValidatorIndex]; + ref ExtensiblePayload? existingCommitPayload = ref context.CommitPayloads[commit.ValidatorIndex]; if (existingCommitPayload != null) { if (existingCommitPayload.Hash != payload.Hash) @@ -213,7 +212,7 @@ private void OnCommitReceived(ExtensiblePayload payload, Commit commit) Log($"{nameof(OnCommitReceived)}: height={commit.BlockIndex} view={commit.ViewNumber} index={commit.ValidatorIndex} nc={context.CountCommitted} nf={context.CountFailed}"); - byte[] hashData = context.EnsureHeader()?.GetSignData(neoSystem.Settings.Network); + byte[]? hashData = context.EnsureHeader()?.GetSignData(neoSystem.Settings.Network); if (hashData == null) { existingCommitPayload = payload; @@ -254,7 +253,7 @@ private void OnRecoveryMessageReceived(RecoveryMessage message) { if (!context.RequestSentOrReceived) { - ExtensiblePayload prepareRequestPayload = message.GetPrepareRequestPayload(context); + ExtensiblePayload? prepareRequestPayload = message.GetPrepareRequestPayload(context); if (prepareRequestPayload != null) { totalPrepReq = 1; diff --git a/plugins/DBFTPlugin/Consensus/ConsensusService.cs b/plugins/DBFTPlugin/Consensus/ConsensusService.cs index 73fef63c0..fdb7fa459 100644 --- a/plugins/DBFTPlugin/Consensus/ConsensusService.cs +++ b/plugins/DBFTPlugin/Consensus/ConsensusService.cs @@ -30,7 +30,7 @@ private class Timer { public uint Height; public byte ViewNumber; } private readonly IActorRef localNode; private readonly IActorRef taskManager; private readonly IActorRef blockchain; - private ICancelable timer_token; + private ICancelable? timer_token; private DateTime prepareRequestReceivedTime; private uint prepareRequestReceivedBlockIndex; private uint block_received_index; @@ -200,7 +200,7 @@ private void SendPrepareRequest() if (context.Validators.Length == 1) CheckPreparations(); - if (context.TransactionHashes.Length > 0) + if (context.TransactionHashes!.Length > 0) { foreach (InvPayload payload in InvPayload.CreateGroup(InventoryType.TX, context.TransactionHashes)) localNode.Tell(Message.Create(MessageCommand.Inv, payload)); @@ -247,7 +247,7 @@ private void OnTransaction(Transaction transaction) { if (!context.IsBackup || context.NotAcceptingPayloadsDueToViewChanging || !context.RequestSentOrReceived || context.ResponseSent || context.BlockSent) return; - if (context.Transactions.ContainsKey(transaction.Hash)) return; + if (context.Transactions!.ContainsKey(transaction.Hash)) return; if (!context.TransactionHashes.Contains(transaction.Hash)) return; AddTransaction(transaction, true); } @@ -273,7 +273,7 @@ private bool AddTransaction(Transaction tx, bool verify) } } // After that, check whether context's transactions have Conflicts attribute with tx's hash. - foreach (var pooledTx in context.Transactions.Values) + foreach (var pooledTx in context.Transactions!.Values) { if (pooledTx.GetAttributes().Select(attr => attr.Hash).Contains(tx.Hash)) { @@ -295,7 +295,7 @@ private bool AddTransaction(Transaction tx, bool verify) return false; } } - context.Transactions[tx.Hash] = tx; + context.Transactions![tx.Hash] = tx; context.VerificationContext.AddTransaction(tx); return CheckPrepareResponse(); } diff --git a/plugins/DBFTPlugin/DBFTPlugin.cs b/plugins/DBFTPlugin/DBFTPlugin.cs index 2de5b4b9a..e0cadeb15 100644 --- a/plugins/DBFTPlugin/DBFTPlugin.cs +++ b/plugins/DBFTPlugin/DBFTPlugin.cs @@ -20,13 +20,13 @@ namespace Neo.Plugins.DBFTPlugin; -public sealed class DBFTPlugin : Plugin, IServiceAddedHandler, IMessageReceivedHandler, IWalletChangedHandler +public sealed class DBFTPlugin : Plugin, IMessageReceivedHandler { - private IWalletProvider walletProvider; - private IActorRef consensus; + private IWalletProvider? walletProvider; + private IActorRef consensus = null!; private bool started = false; - private NeoSystem neoSystem; - private DbftSettings settings; + private NeoSystem neoSystem = null!; + private DbftSettings settings = null!; public override string Description => "Consensus plugin with dBFT algorithm."; @@ -60,24 +60,27 @@ protected override void OnSystemLoaded(NeoSystem system) { if (system.Settings.Network != settings.Network) return; neoSystem = system; - neoSystem.ServiceAdded += ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + neoSystem.ServiceAdded += NeoSystem_ServiceAdded_Handler; } - void IServiceAddedHandler.NeoSystem_ServiceAdded_Handler(object sender, object service) + void NeoSystem_ServiceAdded_Handler(object? sender, object service) { if (service is not IWalletProvider provider) return; walletProvider = provider; - neoSystem.ServiceAdded -= ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + neoSystem.ServiceAdded -= NeoSystem_ServiceAdded_Handler; if (settings.AutoStart) { - walletProvider.WalletChanged += ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; + walletProvider.WalletChanged += IWalletProvider_WalletChanged_Handler; } } - void IWalletChangedHandler.IWalletProvider_WalletChanged_Handler(object sender, Wallet wallet) + void IWalletProvider_WalletChanged_Handler(object? sender, Wallet? wallet) { - walletProvider.WalletChanged -= ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; - Start(wallet); + if (wallet != null) + { + walletProvider!.WalletChanged -= IWalletProvider_WalletChanged_Handler; + Start(wallet); + } } /// @@ -89,8 +92,14 @@ void IWalletChangedHandler.IWalletProvider_WalletChanged_Handler(object sender, [ConsoleCommand("start consensus", Category = "Consensus", Description = "Start consensus service (dBFT)")] private void OnStart(string signerName = "") { - var signer = SignerManager.GetSignerOrDefault(signerName); - Start(signer ?? walletProvider.GetWallet()); + var signer = SignerManager.GetSignerOrDefault(signerName) + ?? walletProvider?.GetWallet(); + if (signer == null) + { + ConsoleHelper.Warning("Please open wallet first!"); + return; + } + Start(signer); } public void Start(ISigner signer) @@ -105,7 +114,7 @@ bool IMessageReceivedHandler.RemoteNode_MessageReceived_Handler(NeoSystem system { if (message.Command == MessageCommand.Transaction) { - Transaction tx = (Transaction)message.Payload; + Transaction tx = (Transaction)message.Payload!; if (tx.SystemFee > settings.MaxBlockSystemFee) return false; consensus?.Tell(tx); diff --git a/plugins/DBFTPlugin/Messages/ConsensusMessage.cs b/plugins/DBFTPlugin/Messages/ConsensusMessage.cs index 599929514..0eacff1c9 100644 --- a/plugins/DBFTPlugin/Messages/ConsensusMessage.cs +++ b/plugins/DBFTPlugin/Messages/ConsensusMessage.cs @@ -49,7 +49,7 @@ public static ConsensusMessage DeserializeFrom(ReadOnlyMemory data) { ConsensusMessageType type = (ConsensusMessageType)data.Span[0]; Type t = typeof(ConsensusMessage); - t = t.Assembly.GetType($"{t.Namespace}.{type}", false); + t = t.Assembly.GetType($"{t.Namespace}.{type}", false)!; if (t is null) throw new FormatException($"Invalid consensus message type: {type}"); return (ConsensusMessage)data.AsSerializable(t); } diff --git a/plugins/DBFTPlugin/Messages/PrepareRequest.cs b/plugins/DBFTPlugin/Messages/PrepareRequest.cs index 6162fe2c5..a5aa1b5d5 100644 --- a/plugins/DBFTPlugin/Messages/PrepareRequest.cs +++ b/plugins/DBFTPlugin/Messages/PrepareRequest.cs @@ -20,10 +20,10 @@ namespace Neo.Plugins.DBFTPlugin.Messages; public class PrepareRequest : ConsensusMessage { public uint Version; - public UInt256 PrevHash; + public required UInt256 PrevHash; public ulong Timestamp; public ulong Nonce; - public UInt256[] TransactionHashes; + public required UInt256[] TransactionHashes; public override int Size => base.Size + sizeof(uint) //Version diff --git a/plugins/DBFTPlugin/Messages/PrepareResponse.cs b/plugins/DBFTPlugin/Messages/PrepareResponse.cs index ad740800e..65a0471e8 100644 --- a/plugins/DBFTPlugin/Messages/PrepareResponse.cs +++ b/plugins/DBFTPlugin/Messages/PrepareResponse.cs @@ -17,7 +17,7 @@ namespace Neo.Plugins.DBFTPlugin.Messages; public class PrepareResponse : ConsensusMessage { - public UInt256 PreparationHash; + public required UInt256 PreparationHash; public override int Size => base.Size + PreparationHash.Size; diff --git a/plugins/DBFTPlugin/Messages/RecoveryMessage/RecoveryMessage.cs b/plugins/DBFTPlugin/Messages/RecoveryMessage/RecoveryMessage.cs index 4ff6ebf93..bb83c8ee1 100644 --- a/plugins/DBFTPlugin/Messages/RecoveryMessage/RecoveryMessage.cs +++ b/plugins/DBFTPlugin/Messages/RecoveryMessage/RecoveryMessage.cs @@ -21,13 +21,13 @@ namespace Neo.Plugins.DBFTPlugin.Messages; public partial class RecoveryMessage : ConsensusMessage { - public Dictionary ChangeViewMessages; - public PrepareRequest PrepareRequestMessage; + public required Dictionary ChangeViewMessages; + public PrepareRequest? PrepareRequestMessage; /// The PreparationHash in case the PrepareRequest hasn't been received yet. /// This can be null if the PrepareRequest information is present, since it can be derived in that case. - public UInt256 PreparationHash; - public Dictionary PreparationMessages; - public Dictionary CommitMessages; + public UInt256? PreparationHash; + public required Dictionary PreparationMessages; + public required Dictionary CommitMessages; public override int Size => base.Size + (ChangeViewMessages?.Values.GetVarSize() ?? 0) // ChangeViewMessages @@ -88,17 +88,17 @@ internal ExtensiblePayload[] GetCommitPayloadsFromRecoveryMessage(ConsensusConte }, p.InvocationScript)).ToArray(); } - internal ExtensiblePayload GetPrepareRequestPayload(ConsensusContext context) + internal ExtensiblePayload? GetPrepareRequestPayload(ConsensusContext context) { if (PrepareRequestMessage == null) return null; - if (!PreparationMessages.TryGetValue(context.Block.PrimaryIndex, out PreparationPayloadCompact compact)) + if (!PreparationMessages.TryGetValue(context.Block.PrimaryIndex, out PreparationPayloadCompact? compact)) return null; return context.CreatePayload(PrepareRequestMessage, compact.InvocationScript); } internal ExtensiblePayload[] GetPrepareResponsePayloads(ConsensusContext context) { - UInt256 preparationHash = PreparationHash ?? context.PreparationPayloads[context.Block.PrimaryIndex]?.Hash; + UInt256? preparationHash = PreparationHash ?? context.PreparationPayloads[context.Block.PrimaryIndex]?.Hash; if (preparationHash is null) return Array.Empty(); return PreparationMessages.Values.Where(p => p.ValidatorIndex != context.Block.PrimaryIndex).Select(p => context.CreatePayload(new PrepareResponse { @@ -113,12 +113,14 @@ public override void Serialize(BinaryWriter writer) { base.Serialize(writer); writer.Write(ChangeViewMessages.Values.ToArray()); - bool hasPrepareRequestMessage = PrepareRequestMessage != null; - writer.Write(hasPrepareRequestMessage); - if (hasPrepareRequestMessage) + if (PrepareRequestMessage != null) + { + writer.Write(true); writer.Write(PrepareRequestMessage); + } else { + writer.Write(false); if (PreparationHash == null) writer.WriteVarInt(0); else diff --git a/plugins/Directory.Build.props b/plugins/Directory.Build.props index 1c06fd7ef..509746d1a 100644 --- a/plugins/Directory.Build.props +++ b/plugins/Directory.Build.props @@ -13,6 +13,7 @@ 4.0.0 net10.0 $(PackageId) + enable enable true diff --git a/plugins/LevelDBStore/LevelDBStore.csproj b/plugins/LevelDBStore/LevelDBStore.csproj index 4ec8a2b80..e73cfeb10 100644 --- a/plugins/LevelDBStore/LevelDBStore.csproj +++ b/plugins/LevelDBStore/LevelDBStore.csproj @@ -4,7 +4,6 @@ false Neo.Plugins.Storage.LevelDBStore Neo - enable true diff --git a/plugins/MPTTrie/MPTTrie.csproj b/plugins/MPTTrie/MPTTrie.csproj index 852671a0a..80c43771e 100644 --- a/plugins/MPTTrie/MPTTrie.csproj +++ b/plugins/MPTTrie/MPTTrie.csproj @@ -3,7 +3,6 @@ Neo.Cryptography.MPT Neo.Cryptography.MPTTrie - enable diff --git a/plugins/OracleService/OracleService.cs b/plugins/OracleService/OracleService.cs index 0d2567b1d..3b3c21757 100644 --- a/plugins/OracleService/OracleService.cs +++ b/plugins/OracleService/OracleService.cs @@ -36,7 +36,7 @@ namespace Neo.Plugins.OracleService; -public sealed class OracleService : Plugin, ICommittingHandler, IServiceAddedHandler, IWalletChangedHandler +public sealed class OracleService : Plugin, ICommittingHandler { private const int RefreshIntervalMilliSeconds = 1000 * 60 * 3; @@ -46,15 +46,15 @@ public sealed class OracleService : Plugin, ICommittingHandler, IServiceAddedHan MaxResponseContentBufferSize = ushort.MaxValue }; - private Wallet wallet; + private Wallet wallet = null!; private readonly ConcurrentDictionary pendingQueue = new(); private readonly ConcurrentDictionary finishedCache = new(); - private Timer timer; + private Timer? timer; internal readonly CancellationTokenSource cancelSource = new(); private OracleStatus status = OracleStatus.Unstarted; - private IWalletProvider walletProvider; + private IWalletProvider? walletProvider; private int counter; - private NeoSystem _system; + private NeoSystem _system = null!; private readonly Dictionary protocols = new(); @@ -80,28 +80,31 @@ protected override void OnSystemLoaded(NeoSystem system) { if (system.Settings.Network != OracleSettings.Default.Network) return; _system = system; - _system.ServiceAdded += ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + _system.ServiceAdded += NeoSystem_ServiceAdded_Handler; RpcServerPlugin.RegisterMethods(this, OracleSettings.Default.Network); } - void IServiceAddedHandler.NeoSystem_ServiceAdded_Handler(object sender, object service) + void NeoSystem_ServiceAdded_Handler(object? sender, object service) { - if (service is IWalletProvider) + if (service is IWalletProvider provider) { - walletProvider = service as IWalletProvider; - _system.ServiceAdded -= ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + walletProvider = provider; + _system.ServiceAdded -= NeoSystem_ServiceAdded_Handler; if (OracleSettings.Default.AutoStart) { - walletProvider.WalletChanged += ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; + walletProvider.WalletChanged += IWalletProvider_WalletChanged_Handler; } } } - void IWalletChangedHandler.IWalletProvider_WalletChanged_Handler(object sender, Wallet wallet) + void IWalletProvider_WalletChanged_Handler(object? sender, Wallet? wallet) { - walletProvider.WalletChanged -= ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; - Start(wallet); + if (wallet != null) + { + walletProvider!.WalletChanged -= IWalletProvider_WalletChanged_Handler; + Start(wallet); + } } protected override void Dispose(bool disposing) @@ -124,7 +127,7 @@ private void OnStart() Start(walletProvider?.GetWallet()); } - public Task Start(Wallet wallet) + public Task Start(Wallet? wallet) { if (status == OracleStatus.Running) return Task.CompletedTask; @@ -186,7 +189,7 @@ void ICommittingHandler.Blockchain_Committing_Handler(NeoSystem system, Block bl OnStop(); } - private async void OnTimer(object state) + private async void OnTimer(object? state) { try { @@ -204,8 +207,8 @@ private async void OnTimer(object state) if (span > TimeSpan.FromMilliseconds(RefreshIntervalMilliSeconds)) { foreach (var account in wallet.GetAccounts()) - if (task.BackupSigns.TryGetValue(account.GetKey().PublicKey, out byte[] sign)) - tasks.Add(SendResponseSignatureAsync(id, sign, account.GetKey())); + if (task.BackupSigns.TryGetValue(account.GetKey()!.PublicKey, out byte[]? sign)) + tasks.Add(SendResponseSignatureAsync(id, sign, account.GetKey()!)); } } @@ -294,7 +297,7 @@ private async Task ProcessRequestAsync(DataCache snapshot, OracleRequest req) uint height = NativeContract.Ledger.CurrentIndex(snapshot) + 1; - (OracleResponseCode code, string data) = await ProcessUrlAsync(req.Url); + (OracleResponseCode code, string? data) = await ProcessUrlAsync(req.Url); Log($"[{req.OriginalTxid}] Process oracle request end:<{req.Url}>, responseCode:{code}, response:{data}"); @@ -306,7 +309,7 @@ private async Task ProcessRequestAsync(DataCache snapshot, OracleRequest req) { try { - result = Filter(data, request.Filter); + result = Filter(data!, request.Filter); } catch (Exception ex) { @@ -324,16 +327,17 @@ private async Task ProcessRequestAsync(DataCache snapshot, OracleRequest req) ECPoint[] oraclePublicKeys = NativeContract.RoleManagement.GetDesignatedByRole(snapshot, Role.Oracle, height); foreach (var account in wallet.GetAccounts()) { - var oraclePub = account.GetKey()?.PublicKey; - if (!account.HasKey || account.Lock || !oraclePublicKeys.Contains(oraclePub)) continue; + if (!account.HasKey || account.Lock) continue; + var key = account.GetKey()!; + if (!oraclePublicKeys.Contains(key.PublicKey)) continue; - var txSign = responseTx.Sign(account.GetKey(), _system.Settings.Network); - var backTxSign = backupTx.Sign(account.GetKey(), _system.Settings.Network); + var txSign = responseTx.Sign(key, _system.Settings.Network); + var backTxSign = backupTx.Sign(key, _system.Settings.Network); - AddResponseTxSign(snapshot, requestId, oraclePub, txSign, responseTx, backupTx, backTxSign); - tasks.Add(SendResponseSignatureAsync(requestId, txSign, account.GetKey())); + AddResponseTxSign(snapshot, requestId, key.PublicKey, txSign, responseTx, backupTx, backTxSign); + tasks.Add(SendResponseSignatureAsync(requestId, txSign, key)); - Log($"[{request.OriginalTxid}]-[[{responseTx.Hash}]] Send oracle sign data, Oracle node: {oraclePub}, Sign: {txSign.ToHexString()}"); + Log($"[{request.OriginalTxid}]-[[{responseTx.Hash}]] Send oracle sign data, Oracle node: {key.PublicKey}, Sign: {txSign.ToHexString()}"); } await Task.WhenAll(tasks); } @@ -349,7 +353,7 @@ private async Task ProcessRequestsAsync() foreach (var (id, request) in NativeContract.Oracle.GetRequests(snapshot)) { if (cancelSource.IsCancellationRequested) break; - if (!finishedCache.ContainsKey(id) && (!pendingQueue.TryGetValue(id, out OracleTask task) || task.Tx is null)) + if (!finishedCache.ContainsKey(id) && (!pendingQueue.TryGetValue(id, out OracleTask? task) || task.Tx is null)) await ProcessRequestAsync(snapshot, request); } } @@ -371,11 +375,11 @@ private void SyncPendingQueue(DataCache snapshot) } } - private async Task<(OracleResponseCode, string)> ProcessUrlAsync(string url) + private async Task<(OracleResponseCode, string?)> ProcessUrlAsync(string url) { if (!Uri.TryCreate(url, UriKind.Absolute, out var uri)) return (OracleResponseCode.Error, $"Invalid url:<{url}>"); - if (!protocols.TryGetValue(uri.Scheme, out IOracleProtocol protocol)) + if (!protocols.TryGetValue(uri.Scheme, out IOracleProtocol? protocol)) return (OracleResponseCode.ProtocolNotSupported, $"Invalid Protocol:<{url}>"); using CancellationTokenSource ctsTimeout = new(OracleSettings.Default.MaxOracleTimeout); @@ -393,7 +397,7 @@ private void SyncPendingQueue(DataCache snapshot) public static Transaction CreateResponseTx(DataCache snapshot, OracleRequest request, OracleResponse response, ECPoint[] oracleNodes, ProtocolSettings settings, bool useCurrentHeight = false) { - var requestTx = NativeContract.Ledger.GetTransactionState(snapshot, request.OriginalTxid); + var requestTx = NativeContract.Ledger.GetTransactionState(snapshot, request.OriginalTxid)!; var n = oracleNodes.Length; var m = n - (n - 1) / 3; var oracleSignContract = Contract.CreateMultiSigContract(m, oracleNodes); @@ -434,11 +438,11 @@ public static Transaction CreateResponseTx(DataCache snapshot, OracleRequest req // Calculate network fee - var oracleContract = NativeContract.ContractManagement.GetContract(snapshot, NativeContract.Oracle.Hash); + var oracleContract = NativeContract.ContractManagement.GetContract(snapshot, NativeContract.Oracle.Hash)!; var engine = ApplicationEngine.Create(TriggerType.Verification, tx, snapshot.CloneCache(), settings: settings); - ContractMethodDescriptor md = oracleContract.Manifest.Abi.GetMethod(ContractBasicMethod.Verify, ContractBasicMethod.VerifyPCount); + ContractMethodDescriptor md = oracleContract.Manifest.Abi.GetMethod(ContractBasicMethod.Verify, ContractBasicMethod.VerifyPCount)!; engine.LoadContract(oracleContract, md, CallFlags.None); - if (engine.Execute() != VMState.HALT) return null; + engine.Execute(); //FAULT is impossible tx.NetworkFee += engine.FeeConsumed; var executionFactor = NativeContract.Policy.GetExecFeeFactor(snapshot); @@ -473,12 +477,12 @@ public static Transaction CreateResponseTx(DataCache snapshot, OracleRequest req return tx; } - private void AddResponseTxSign(DataCache snapshot, ulong requestId, ECPoint oraclePub, byte[] sign, Transaction responseTx = null, Transaction backupTx = null, byte[] backupSign = null) + private void AddResponseTxSign(DataCache snapshot, ulong requestId, ECPoint oraclePub, byte[] sign, Transaction? responseTx = null, Transaction? backupTx = null, byte[]? backupSign = null) { var task = pendingQueue.GetOrAdd(requestId, _ => new OracleTask { Id = requestId, - Request = NativeContract.Oracle.GetRequest(snapshot, requestId), + Request = NativeContract.Oracle.GetRequest(snapshot, requestId)!, Signs = new ConcurrentDictionary(), BackupSigns = new ConcurrentDictionary() }); @@ -494,7 +498,7 @@ private void AddResponseTxSign(DataCache snapshot, ulong requestId, ECPoint orac task.BackupTx = backupTx; var data = task.BackupTx.GetSignData(_system.Settings.Network); task.BackupSigns.Where(p => !Crypto.VerifySignature(data, p.Value, p.Key)).ForEach(p => task.BackupSigns.Remove(p.Key, out _)); - task.BackupSigns.TryAdd(oraclePub, backupSign); + task.BackupSigns.TryAdd(oraclePub, backupSign!); } if (task.Tx == null) { @@ -505,25 +509,25 @@ private void AddResponseTxSign(DataCache snapshot, ulong requestId, ECPoint orac if (Crypto.VerifySignature(task.Tx.GetSignData(_system.Settings.Network), sign, oraclePub)) task.Signs.TryAdd(oraclePub, sign); - else if (Crypto.VerifySignature(task.BackupTx.GetSignData(_system.Settings.Network), sign, oraclePub)) + else if (Crypto.VerifySignature(task.BackupTx!.GetSignData(_system.Settings.Network), sign, oraclePub)) task.BackupSigns.TryAdd(oraclePub, sign); else throw new RpcException(RpcErrorFactory.InvalidSignature($"Invalid oracle response transaction signature from '{oraclePub}'.")); - if (CheckTxSign(snapshot, task.Tx, task.Signs) || CheckTxSign(snapshot, task.BackupTx, task.BackupSigns)) + if (CheckTxSign(snapshot, task.Tx, task.Signs) || CheckTxSign(snapshot, task.BackupTx!, task.BackupSigns)) { finishedCache.TryAdd(requestId, new DateTime()); pendingQueue.TryRemove(requestId, out _); } } - public static byte[] Filter(string input, string filterArgs) + public static byte[] Filter(string input, string? filterArgs) { if (string.IsNullOrEmpty(filterArgs)) return input.ToStrictUtf8Bytes(); - JToken beforeObject = JToken.Parse(input); - JArray afterObjects = beforeObject.JsonPath(filterArgs); + JToken? beforeObject = JToken.Parse(input); + JArray afterObjects = beforeObject?.JsonPath(filterArgs) ?? new(); return afterObjects.ToByteArray(false); } @@ -576,11 +580,11 @@ private static void Log(string message, LogLevel level = LogLevel.Info) class OracleTask { public ulong Id; - public OracleRequest Request; - public Transaction Tx; - public Transaction BackupTx; - public ConcurrentDictionary Signs; - public ConcurrentDictionary BackupSigns; + public required OracleRequest Request; + public Transaction? Tx; + public Transaction? BackupTx; + public required ConcurrentDictionary Signs; + public required ConcurrentDictionary BackupSigns; public readonly DateTime Timestamp = TimeProvider.Current.UtcNow; } diff --git a/plugins/OracleService/OracleSettings.cs b/plugins/OracleService/OracleSettings.cs index f0e518898..adbb77395 100644 --- a/plugins/OracleService/OracleSettings.cs +++ b/plugins/OracleService/OracleSettings.cs @@ -48,18 +48,18 @@ class OracleSettings : IPluginSettings public NeoFSSettings NeoFS { get; } public bool AutoStart { get; } - public static OracleSettings Default { get; private set; } + public static OracleSettings Default { get; private set; } = null!; public UnhandledExceptionPolicy ExceptionPolicy { get; } private OracleSettings(IConfigurationSection section) { Network = section.GetValue("Network", 5195086u); - Nodes = section.GetSection("Nodes").GetChildren().Select(p => new Uri(p.Get(), UriKind.Absolute)).ToArray(); + Nodes = section.GetSection("Nodes").GetChildren().Select(p => new Uri(p.Get()!, UriKind.Absolute)).ToArray(); MaxTaskTimeout = TimeSpan.FromMilliseconds(section.GetValue("MaxTaskTimeout", 432000000)); MaxOracleTimeout = TimeSpan.FromMilliseconds(section.GetValue("MaxOracleTimeout", 15000)); AllowPrivateHost = section.GetValue("AllowPrivateHost", false); - AllowedContentTypes = section.GetSection("AllowedContentTypes").GetChildren().Select(p => p.Get()).ToArray(); + AllowedContentTypes = section.GetSection("AllowedContentTypes").GetChildren().Select(p => p.Get()!).ToArray(); ExceptionPolicy = section.GetValue("UnhandledExceptionPolicy", UnhandledExceptionPolicy.Ignore); if (AllowedContentTypes.Length == 0) AllowedContentTypes = AllowedContentTypes.Concat("application/json").ToArray(); diff --git a/plugins/OracleService/Protocols/IOracleProtocol.cs b/plugins/OracleService/Protocols/IOracleProtocol.cs index 408fbe8db..5046550b8 100644 --- a/plugins/OracleService/Protocols/IOracleProtocol.cs +++ b/plugins/OracleService/Protocols/IOracleProtocol.cs @@ -16,5 +16,5 @@ namespace Neo.Plugins.OracleService.Protocols; interface IOracleProtocol : IDisposable { void Configure(); - Task<(OracleResponseCode, string)> ProcessAsync(Uri uri, CancellationToken cancellation); + Task<(OracleResponseCode, string?)> ProcessAsync(Uri uri, CancellationToken cancellation); } diff --git a/plugins/OracleService/Protocols/OracleHttpsProtocol.cs b/plugins/OracleService/Protocols/OracleHttpsProtocol.cs index 05e90bb27..fd39f9334 100644 --- a/plugins/OracleService/Protocols/OracleHttpsProtocol.cs +++ b/plugins/OracleService/Protocols/OracleHttpsProtocol.cs @@ -24,7 +24,7 @@ class OracleHttpsProtocol : IOracleProtocol public OracleHttpsProtocol() { CustomAttributeData attribute = Assembly.GetExecutingAssembly().CustomAttributes.First(p => p.AttributeType == typeof(AssemblyInformationalVersionAttribute)); - string version = (string)attribute.ConstructorArguments[0].Value; + string version = (string)attribute.ConstructorArguments[0].Value!; client.DefaultRequestHeaders.UserAgent.Add(new ProductInfoHeaderValue("NeoOracleService", version)); } @@ -41,11 +41,11 @@ public void Dispose() client.Dispose(); } - public async Task<(OracleResponseCode, string)> ProcessAsync(Uri uri, CancellationToken cancellation) + public async Task<(OracleResponseCode, string?)> ProcessAsync(Uri uri, CancellationToken cancellation) { Utility.Log(nameof(OracleHttpsProtocol), LogLevel.Debug, $"Request: {uri.AbsoluteUri}"); - HttpResponseMessage message; + HttpResponseMessage? message; try { int redirects = 2; @@ -77,6 +77,8 @@ public void Dispose() return (OracleResponseCode.Forbidden, null); if (!message.IsSuccessStatusCode) return (OracleResponseCode.Error, message.StatusCode.ToString()); + if (message.Content.Headers.ContentType is null) + return (OracleResponseCode.ContentTypeNotSupported, null); if (!OracleSettings.Default.AllowedContentTypes.Contains(message.Content.Headers.ContentType.MediaType)) return (OracleResponseCode.ContentTypeNotSupported, null); if (message.Content.Headers.ContentLength.HasValue && message.Content.Headers.ContentLength > OracleResponse.MaxResultSize) @@ -98,7 +100,7 @@ public void Dispose() private static Encoding GetEncoding(HttpContentHeaders headers) { - Encoding encoding = null; + Encoding? encoding = null; if ((headers.ContentType != null) && (headers.ContentType.CharSet != null)) { encoding = Encoding.GetEncoding(headers.ContentType.CharSet); diff --git a/plugins/OracleService/Protocols/OracleNeoFSProtocol.cs b/plugins/OracleService/Protocols/OracleNeoFSProtocol.cs index e6368eaed..c2153be24 100644 --- a/plugins/OracleService/Protocols/OracleNeoFSProtocol.cs +++ b/plugins/OracleService/Protocols/OracleNeoFSProtocol.cs @@ -43,7 +43,7 @@ public void Dispose() privateKey.Dispose(); } - public async Task<(OracleResponseCode, string)> ProcessAsync(Uri uri, CancellationToken cancellation) + public async Task<(OracleResponseCode, string?)> ProcessAsync(Uri uri, CancellationToken cancellation) { Utility.Log(nameof(OracleNeoFSProtocol), LogLevel.Debug, $"Request: {uri.AbsoluteUri}"); try diff --git a/plugins/RestServer/RestServer.csproj b/plugins/RestServer/RestServer.csproj index 0d4e585a5..dcd3e6ba8 100644 --- a/plugins/RestServer/RestServer.csproj +++ b/plugins/RestServer/RestServer.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/plugins/RestServer/RestWebServer.cs b/plugins/RestServer/RestWebServer.cs index f2acda735..e4668f84d 100644 --- a/plugins/RestServer/RestWebServer.cs +++ b/plugins/RestServer/RestWebServer.cs @@ -489,9 +489,8 @@ await context.Response.WriteAsync( options.RouteTemplate = "docs/{documentName}/swagger.json"; options.PreSerializeFilters.Add((document, request) => { - document.Servers.Clear(); - string basePath = $"{request.Scheme}://{request.Host.Value}"; - document.Servers.Add(new OpenApiServer { Url = basePath }); + document.Servers?.Clear(); + document.Servers?.Add(new OpenApiServer { Url = $"{request.Scheme}://{request.Host.Value}" }); }); }); app.UseSwaggerUI(options => diff --git a/plugins/RocksDBStore/RocksDBStore.csproj b/plugins/RocksDBStore/RocksDBStore.csproj index 2b76221e9..cec590455 100644 --- a/plugins/RocksDBStore/RocksDBStore.csproj +++ b/plugins/RocksDBStore/RocksDBStore.csproj @@ -3,7 +3,6 @@ Neo.Plugins.Storage.RocksDBStore Neo.Plugins.Storage - enable diff --git a/plugins/RpcClient/Models/RpcAccount.cs b/plugins/RpcClient/Models/RpcAccount.cs index eef89ccdc..fa7121b9d 100644 --- a/plugins/RpcClient/Models/RpcAccount.cs +++ b/plugins/RpcClient/Models/RpcAccount.cs @@ -15,11 +15,11 @@ namespace Neo.Network.RPC.Models; public class RpcAccount { - public string Address { get; set; } + public required string Address { get; set; } public bool HasKey { get; set; } - public string Label { get; set; } + public string? Label { get; set; } public bool WatchOnly { get; set; } @@ -38,10 +38,10 @@ public static RpcAccount FromJson(JObject json) { return new RpcAccount { - Address = json["address"].AsString(), - HasKey = json["haskey"].AsBoolean(), + Address = json["address"]!.AsString(), + HasKey = json["haskey"]!.AsBoolean(), Label = json["label"]?.AsString(), - WatchOnly = json["watchonly"].AsBoolean(), + WatchOnly = json["watchonly"]!.AsBoolean(), }; } } diff --git a/plugins/RpcClient/Models/RpcApplicationLog.cs b/plugins/RpcClient/Models/RpcApplicationLog.cs index 4ded2a09d..207f901a1 100644 --- a/plugins/RpcClient/Models/RpcApplicationLog.cs +++ b/plugins/RpcClient/Models/RpcApplicationLog.cs @@ -19,11 +19,11 @@ namespace Neo.Network.RPC.Models; public class RpcApplicationLog { - public UInt256 TxId { get; set; } + public UInt256? TxId { get; set; } - public UInt256 BlockHash { get; set; } + public UInt256? BlockHash { get; set; } - public List Executions { get; set; } + public required List Executions { get; set; } public JObject ToJson() { @@ -40,9 +40,9 @@ public static RpcApplicationLog FromJson(JObject json, ProtocolSettings protocol { return new RpcApplicationLog { - TxId = json["txid"] is null ? null : UInt256.Parse(json["txid"].AsString()), - BlockHash = json["blockhash"] is null ? null : UInt256.Parse(json["blockhash"].AsString()), - Executions = ((JArray)json["executions"]).Select(p => Execution.FromJson((JObject)p, protocolSettings)).ToList(), + TxId = json["txid"] is null ? null : UInt256.Parse(json["txid"]!.AsString()), + BlockHash = json["blockhash"] is null ? null : UInt256.Parse(json["blockhash"]!.AsString()), + Executions = ((JArray)json["executions"]!).Select(p => Execution.FromJson((JObject)p!, protocolSettings)).ToList(), }; } } @@ -55,11 +55,11 @@ public class Execution public long GasConsumed { get; set; } - public string ExceptionMessage { get; set; } + public string? ExceptionMessage { get; set; } - public List Stack { get; set; } + public required List Stack { get; set; } - public List Notifications { get; set; } + public required List Notifications { get; set; } public JObject ToJson() { @@ -78,23 +78,23 @@ public static Execution FromJson(JObject json, ProtocolSettings protocolSettings { return new Execution { - Trigger = json["trigger"].GetEnum(), - VMState = json["vmstate"].GetEnum(), - GasConsumed = long.Parse(json["gasconsumed"].AsString()), + Trigger = json["trigger"]!.GetEnum(), + VMState = json["vmstate"]!.GetEnum(), + GasConsumed = long.Parse(json["gasconsumed"]!.AsString()), ExceptionMessage = json["exception"]?.AsString(), - Stack = ((JArray)json["stack"]).Select(p => Utility.StackItemFromJson((JObject)p)).ToList(), - Notifications = ((JArray)json["notifications"]).Select(p => RpcNotifyEventArgs.FromJson((JObject)p, protocolSettings)).ToList() + Stack = ((JArray)json["stack"]!).Select(p => Utility.StackItemFromJson((JObject)p!)).ToList(), + Notifications = ((JArray)json["notifications"]!).Select(p => RpcNotifyEventArgs.FromJson((JObject)p!, protocolSettings)).ToList() }; } } public class RpcNotifyEventArgs { - public UInt160 Contract { get; set; } + public required UInt160 Contract { get; set; } - public string EventName { get; set; } + public required string EventName { get; set; } - public StackItem State { get; set; } + public required StackItem State { get; set; } public JObject ToJson() { @@ -110,9 +110,9 @@ public static RpcNotifyEventArgs FromJson(JObject json, ProtocolSettings protoco { return new RpcNotifyEventArgs { - Contract = json["contract"].ToScriptHash(protocolSettings), - EventName = json["eventname"].AsString(), - State = Utility.StackItemFromJson((JObject)json["state"]) + Contract = json["contract"]!.ToScriptHash(protocolSettings), + EventName = json["eventname"]!.AsString(), + State = Utility.StackItemFromJson((JObject)json["state"]!) }; } } diff --git a/plugins/RpcClient/Models/RpcBlock.cs b/plugins/RpcClient/Models/RpcBlock.cs index 22cb187e6..2873fa58f 100644 --- a/plugins/RpcClient/Models/RpcBlock.cs +++ b/plugins/RpcClient/Models/RpcBlock.cs @@ -16,11 +16,11 @@ namespace Neo.Network.RPC.Models; public class RpcBlock { - public Block Block { get; set; } + public required Block Block { get; set; } public uint Confirmations { get; set; } - public UInt256 NextBlockHash { get; set; } + public UInt256? NextBlockHash { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -35,8 +35,8 @@ public static RpcBlock FromJson(JObject json, ProtocolSettings protocolSettings) return new RpcBlock { Block = Utility.BlockFromJson(json, protocolSettings), - Confirmations = (uint)json["confirmations"].AsNumber(), - NextBlockHash = json["nextblockhash"] is null ? null : UInt256.Parse(json["nextblockhash"].AsString()) + Confirmations = (uint)json["confirmations"]!.AsNumber(), + NextBlockHash = json["nextblockhash"] is null ? null : UInt256.Parse(json["nextblockhash"]!.AsString()) }; } } diff --git a/plugins/RpcClient/Models/RpcBlockHeader.cs b/plugins/RpcClient/Models/RpcBlockHeader.cs index f36a0e94a..8bf9947a4 100644 --- a/plugins/RpcClient/Models/RpcBlockHeader.cs +++ b/plugins/RpcClient/Models/RpcBlockHeader.cs @@ -16,11 +16,11 @@ namespace Neo.Network.RPC.Models; public class RpcBlockHeader { - public Header Header { get; set; } + public required Header Header { get; set; } public uint Confirmations { get; set; } - public UInt256 NextBlockHash { get; set; } + public UInt256? NextBlockHash { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -35,8 +35,8 @@ public static RpcBlockHeader FromJson(JObject json, ProtocolSettings protocolSet return new RpcBlockHeader { Header = Utility.HeaderFromJson(json, protocolSettings), - Confirmations = (uint)json["confirmations"].AsNumber(), - NextBlockHash = json["nextblockhash"] is null ? null : UInt256.Parse(json["nextblockhash"].AsString()) + Confirmations = (uint)json["confirmations"]!.AsNumber(), + NextBlockHash = json["nextblockhash"] is null ? null : UInt256.Parse(json["nextblockhash"]!.AsString()) }; } } diff --git a/plugins/RpcClient/Models/RpcContractState.cs b/plugins/RpcClient/Models/RpcContractState.cs index e1a7e1a78..a8ae0dc82 100644 --- a/plugins/RpcClient/Models/RpcContractState.cs +++ b/plugins/RpcClient/Models/RpcContractState.cs @@ -17,7 +17,7 @@ namespace Neo.Network.RPC.Models; public class RpcContractState { - public ContractState ContractState { get; set; } + public required ContractState ContractState { get; set; } public JObject ToJson() { @@ -30,11 +30,11 @@ public static RpcContractState FromJson(JObject json) { ContractState = new ContractState { - Id = (int)json["id"].AsNumber(), - UpdateCounter = (ushort)json["updatecounter"].AsNumber(), - Hash = UInt160.Parse(json["hash"].AsString()), - Nef = RpcNefFile.FromJson((JObject)json["nef"]), - Manifest = ContractManifest.FromJson((JObject)json["manifest"]) + Id = (int)json["id"]!.AsNumber(), + UpdateCounter = (ushort)json["updatecounter"]!.AsNumber(), + Hash = UInt160.Parse(json["hash"]!.AsString()), + Nef = RpcNefFile.FromJson((JObject)json["nef"]!), + Manifest = ContractManifest.FromJson((JObject)json["manifest"]!) } }; } diff --git a/plugins/RpcClient/Models/RpcFoundStates.cs b/plugins/RpcClient/Models/RpcFoundStates.cs index 64248d1ec..0ec316e85 100644 --- a/plugins/RpcClient/Models/RpcFoundStates.cs +++ b/plugins/RpcClient/Models/RpcFoundStates.cs @@ -16,26 +16,26 @@ namespace Neo.Network.RPC.Models; public class RpcFoundStates { public bool Truncated; - public (byte[] key, byte[] value)[] Results; - public byte[] FirstProof; - public byte[] LastProof; + public required (byte[] key, byte[] value)[] Results; + public byte[]? FirstProof; + public byte[]? LastProof; public static RpcFoundStates FromJson(JObject json) { return new RpcFoundStates { - Truncated = json["truncated"].AsBoolean(), - Results = ((JArray)json["results"]) + Truncated = json["truncated"]!.AsBoolean(), + Results = ((JArray)json["results"]!) .Select(j => ( - Convert.FromBase64String(j["key"].AsString()), - Convert.FromBase64String(j["value"].AsString()) + Convert.FromBase64String(j!["key"]!.AsString()), + Convert.FromBase64String(j["value"]!.AsString()) )) .ToArray(), - FirstProof = ProofFromJson((JString)json["firstProof"]), - LastProof = ProofFromJson((JString)json["lastProof"]), + FirstProof = ProofFromJson((JString?)json["firstProof"]), + LastProof = ProofFromJson((JString?)json["lastProof"]), }; } - static byte[] ProofFromJson(JString json) + static byte[]? ProofFromJson(JString? json) => json == null ? null : Convert.FromBase64String(json.AsString()); } diff --git a/plugins/RpcClient/Models/RpcInvokeResult.cs b/plugins/RpcClient/Models/RpcInvokeResult.cs index 6c7d610cf..bdfbcb60d 100644 --- a/plugins/RpcClient/Models/RpcInvokeResult.cs +++ b/plugins/RpcClient/Models/RpcInvokeResult.cs @@ -18,19 +18,19 @@ namespace Neo.Network.RPC.Models; public class RpcInvokeResult { - public string Script { get; set; } + public required string Script { get; set; } public VMState State { get; set; } public long GasConsumed { get; set; } - public StackItem[] Stack { get; set; } + public required StackItem[] Stack { get; set; } - public string Tx { get; set; } + public string? Tx { get; set; } - public string Exception { get; set; } + public string? Exception { get; set; } - public string Session { get; set; } + public string? Session { get; set; } public JObject ToJson() { @@ -60,29 +60,24 @@ public JObject ToJson() public static RpcInvokeResult FromJson(JObject json) { - var invokeScriptResult = new RpcInvokeResult() + return new RpcInvokeResult() { - Script = json["script"].AsString(), - State = json["state"].GetEnum(), - GasConsumed = long.Parse(json["gasconsumed"].AsString()), + Script = json["script"]!.AsString(), + State = json["state"]!.GetEnum(), + GasConsumed = long.Parse(json["gasconsumed"]!.AsString()), + Stack = ((JArray)json["stack"]!).Select(p => Utility.StackItemFromJson((JObject)p!)).ToArray(), + Tx = json["tx"]?.AsString(), Exception = json["exception"]?.AsString(), Session = json["session"]?.AsString() }; - try - { - invokeScriptResult.Stack = ((JArray)json["stack"]).Select(p => Utility.StackItemFromJson((JObject)p)).ToArray(); - } - catch { } - invokeScriptResult.Tx = json["tx"]?.AsString(); - return invokeScriptResult; } } public class RpcStack { - public string Type { get; set; } + public required string Type { get; set; } - public JToken Value { get; set; } + public JToken? Value { get; set; } public JObject ToJson() => new() { ["type"] = Type, ["value"] = Value }; @@ -90,7 +85,7 @@ public static RpcStack FromJson(JObject json) { return new RpcStack { - Type = json["type"].AsString(), + Type = json["type"]!.AsString(), Value = json["value"] }; } diff --git a/plugins/RpcClient/Models/RpcMethodToken.cs b/plugins/RpcClient/Models/RpcMethodToken.cs index 89e729b88..fa7f02631 100644 --- a/plugins/RpcClient/Models/RpcMethodToken.cs +++ b/plugins/RpcClient/Models/RpcMethodToken.cs @@ -20,11 +20,11 @@ public static MethodToken FromJson(JObject json) { return new MethodToken { - Hash = UInt160.Parse(json["hash"].AsString()), - Method = json["method"].AsString(), - ParametersCount = (ushort)json["paramcount"].AsNumber(), - HasReturnValue = json["hasreturnvalue"].AsBoolean(), - CallFlags = (CallFlags)Enum.Parse(typeof(CallFlags), json["callflags"].AsString()) + Hash = UInt160.Parse(json["hash"]!.AsString()), + Method = json["method"]!.AsString(), + ParametersCount = (ushort)json["paramcount"]!.AsNumber(), + HasReturnValue = json["hasreturnvalue"]!.AsBoolean(), + CallFlags = Enum.Parse(json["callflags"]!.AsString()) }; } } diff --git a/plugins/RpcClient/Models/RpcNefFile.cs b/plugins/RpcClient/Models/RpcNefFile.cs index 9042d2a2d..f438ded54 100644 --- a/plugins/RpcClient/Models/RpcNefFile.cs +++ b/plugins/RpcClient/Models/RpcNefFile.cs @@ -20,11 +20,11 @@ public static NefFile FromJson(JObject json) { return new NefFile { - Compiler = json["compiler"].AsString(), - Source = json["source"].AsString(), - Tokens = ((JArray)json["tokens"]).Select(p => RpcMethodToken.FromJson((JObject)p)).ToArray(), - Script = Convert.FromBase64String(json["script"].AsString()), - CheckSum = (uint)json["checksum"].AsNumber() + Compiler = json["compiler"]!.AsString(), + Source = json["source"]!.AsString(), + Tokens = ((JArray)json["tokens"]!).Select(p => RpcMethodToken.FromJson((JObject)p!)).ToArray(), + Script = Convert.FromBase64String(json["script"]!.AsString()), + CheckSum = (uint)json["checksum"]!.AsNumber() }; } } diff --git a/plugins/RpcClient/Models/RpcNep17Balances.cs b/plugins/RpcClient/Models/RpcNep17Balances.cs index c023b6b2c..a1474210e 100644 --- a/plugins/RpcClient/Models/RpcNep17Balances.cs +++ b/plugins/RpcClient/Models/RpcNep17Balances.cs @@ -17,9 +17,9 @@ namespace Neo.Network.RPC.Models; public class RpcNep17Balances { - public UInt160 UserScriptHash { get; set; } + public required UInt160 UserScriptHash { get; set; } - public List Balances { get; set; } + public required List Balances { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -34,15 +34,15 @@ public static RpcNep17Balances FromJson(JObject json, ProtocolSettings protocolS { return new() { - Balances = ((JArray)json["balance"]).Select(p => RpcNep17Balance.FromJson((JObject)p, protocolSettings)).ToList(), - UserScriptHash = json["address"].ToScriptHash(protocolSettings) + Balances = ((JArray)json["balance"]!).Select(p => RpcNep17Balance.FromJson((JObject)p!, protocolSettings)).ToList(), + UserScriptHash = json["address"]!.ToScriptHash(protocolSettings) }; } } public class RpcNep17Balance { - public UInt160 AssetHash { get; set; } + public required UInt160 AssetHash { get; set; } public BigInteger Amount { get; set; } @@ -62,9 +62,9 @@ public static RpcNep17Balance FromJson(JObject json, ProtocolSettings protocolSe { return new() { - AssetHash = json["assethash"].ToScriptHash(protocolSettings), - Amount = BigInteger.Parse(json["amount"].AsString()), - LastUpdatedBlock = (uint)json["lastupdatedblock"].AsNumber() + AssetHash = json["assethash"]!.ToScriptHash(protocolSettings), + Amount = BigInteger.Parse(json["amount"]!.AsString()), + LastUpdatedBlock = (uint)json["lastupdatedblock"]!.AsNumber() }; } } diff --git a/plugins/RpcClient/Models/RpcNep17TokenInfo.cs b/plugins/RpcClient/Models/RpcNep17TokenInfo.cs index ff475f58f..b10ac2911 100644 --- a/plugins/RpcClient/Models/RpcNep17TokenInfo.cs +++ b/plugins/RpcClient/Models/RpcNep17TokenInfo.cs @@ -15,9 +15,9 @@ namespace Neo.Network.RPC.Models; public class RpcNep17TokenInfo { - public string Name { get; set; } + public required string Name { get; set; } - public string Symbol { get; set; } + public required string Symbol { get; set; } public byte Decimals { get; set; } diff --git a/plugins/RpcClient/Models/RpcNep17Transfers.cs b/plugins/RpcClient/Models/RpcNep17Transfers.cs index 1113724b5..b365204b2 100644 --- a/plugins/RpcClient/Models/RpcNep17Transfers.cs +++ b/plugins/RpcClient/Models/RpcNep17Transfers.cs @@ -17,11 +17,11 @@ namespace Neo.Network.RPC.Models; public class RpcNep17Transfers { - public UInt160 UserScriptHash { get; set; } + public required UInt160 UserScriptHash { get; set; } - public List Sent { get; set; } + public required List Sent { get; set; } - public List Received { get; set; } + public required List Received { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -37,9 +37,9 @@ public static RpcNep17Transfers FromJson(JObject json, ProtocolSettings protocol { return new() { - Sent = ((JArray)json["sent"]).Select(p => RpcNep17Transfer.FromJson((JObject)p, protocolSettings)).ToList(), - Received = ((JArray)json["received"]).Select(p => RpcNep17Transfer.FromJson((JObject)p, protocolSettings)).ToList(), - UserScriptHash = json["address"].ToScriptHash(protocolSettings) + Sent = ((JArray)json["sent"]!).Select(p => RpcNep17Transfer.FromJson((JObject)p!, protocolSettings)).ToList(), + Received = ((JArray)json["received"]!).Select(p => RpcNep17Transfer.FromJson((JObject)p!, protocolSettings)).ToList(), + UserScriptHash = json["address"]!.ToScriptHash(protocolSettings) }; } } @@ -48,9 +48,9 @@ public class RpcNep17Transfer { public ulong TimestampMS { get; set; } - public UInt160 AssetHash { get; set; } + public required UInt160 AssetHash { get; set; } - public UInt160 UserScriptHash { get; set; } + public UInt160? UserScriptHash { get; set; } public BigInteger Amount { get; set; } @@ -58,7 +58,7 @@ public class RpcNep17Transfer public ushort TransferNotifyIndex { get; set; } - public UInt256 TxHash { get; set; } + public required UInt256 TxHash { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -78,13 +78,13 @@ public static RpcNep17Transfer FromJson(JObject json, ProtocolSettings protocolS { return new RpcNep17Transfer { - TimestampMS = (ulong)json["timestamp"].AsNumber(), - AssetHash = json["assethash"].ToScriptHash(protocolSettings), + TimestampMS = (ulong)json["timestamp"]!.AsNumber(), + AssetHash = json["assethash"]!.ToScriptHash(protocolSettings), UserScriptHash = json["transferaddress"]?.ToScriptHash(protocolSettings), - Amount = BigInteger.Parse(json["amount"].AsString()), - BlockIndex = (uint)json["blockindex"].AsNumber(), - TransferNotifyIndex = (ushort)json["transfernotifyindex"].AsNumber(), - TxHash = UInt256.Parse(json["txhash"].AsString()) + Amount = BigInteger.Parse(json["amount"]!.AsString()), + BlockIndex = (uint)json["blockindex"]!.AsNumber(), + TransferNotifyIndex = (ushort)json["transfernotifyindex"]!.AsNumber(), + TxHash = UInt256.Parse(json["txhash"]!.AsString()) }; } } diff --git a/plugins/RpcClient/Models/RpcPeers.cs b/plugins/RpcClient/Models/RpcPeers.cs index 1027537a7..06d7cfbe0 100644 --- a/plugins/RpcClient/Models/RpcPeers.cs +++ b/plugins/RpcClient/Models/RpcPeers.cs @@ -15,11 +15,11 @@ namespace Neo.Network.RPC.Models; public class RpcPeers { - public RpcPeer[] Unconnected { get; set; } + public required RpcPeer[] Unconnected { get; set; } - public RpcPeer[] Bad { get; set; } + public required RpcPeer[] Bad { get; set; } - public RpcPeer[] Connected { get; set; } + public required RpcPeer[] Connected { get; set; } public JObject ToJson() { @@ -35,16 +35,16 @@ public static RpcPeers FromJson(JObject json) { return new RpcPeers { - Unconnected = ((JArray)json["unconnected"]).Select(p => RpcPeer.FromJson((JObject)p)).ToArray(), - Bad = ((JArray)json["bad"]).Select(p => RpcPeer.FromJson((JObject)p)).ToArray(), - Connected = ((JArray)json["connected"]).Select(p => RpcPeer.FromJson((JObject)p)).ToArray() + Unconnected = ((JArray)json["unconnected"]!).Select(p => RpcPeer.FromJson((JObject)p!)).ToArray(), + Bad = ((JArray)json["bad"]!).Select(p => RpcPeer.FromJson((JObject)p!)).ToArray(), + Connected = ((JArray)json["connected"]!).Select(p => RpcPeer.FromJson((JObject)p!)).ToArray() }; } } public class RpcPeer { - public string Address { get; set; } + public required string Address { get; set; } public int Port { get; set; } @@ -54,8 +54,8 @@ public static RpcPeer FromJson(JObject json) { return new RpcPeer { - Address = json["address"].AsString(), - Port = int.Parse(json["port"].AsString()) + Address = json["address"]!.AsString(), + Port = int.Parse(json["port"]!.AsString()) }; } } diff --git a/plugins/RpcClient/Models/RpcPlugin.cs b/plugins/RpcClient/Models/RpcPlugin.cs index 714b691ae..95d27a64f 100644 --- a/plugins/RpcClient/Models/RpcPlugin.cs +++ b/plugins/RpcClient/Models/RpcPlugin.cs @@ -15,11 +15,11 @@ namespace Neo.Network.RPC.Models; public class RpcPlugin { - public string Name { get; set; } + public required string Name { get; set; } - public string Version { get; set; } + public required string Version { get; set; } - public string[] Interfaces { get; set; } + public required string[] Interfaces { get; set; } public JObject ToJson() { @@ -35,9 +35,9 @@ public static RpcPlugin FromJson(JObject json) { return new RpcPlugin { - Name = json["name"].AsString(), - Version = json["version"].AsString(), - Interfaces = ((JArray)json["interfaces"]).Select(p => p.AsString()).ToArray() + Name = json["name"]!.AsString(), + Version = json["version"]!.AsString(), + Interfaces = ((JArray)json["interfaces"]!).Select(p => p!.AsString()).ToArray() }; } } diff --git a/plugins/RpcClient/Models/RpcRawMemPool.cs b/plugins/RpcClient/Models/RpcRawMemPool.cs index 654b9cafe..5e178cedc 100644 --- a/plugins/RpcClient/Models/RpcRawMemPool.cs +++ b/plugins/RpcClient/Models/RpcRawMemPool.cs @@ -17,9 +17,9 @@ public class RpcRawMemPool { public uint Height { get; set; } - public List Verified { get; set; } + public required List Verified { get; set; } - public List UnVerified { get; set; } + public required List UnVerified { get; set; } public JObject ToJson() { @@ -35,9 +35,9 @@ public static RpcRawMemPool FromJson(JObject json) { return new RpcRawMemPool { - Height = uint.Parse(json["height"].AsString()), - Verified = ((JArray)json["verified"]).Select(p => UInt256.Parse(p.AsString())).ToList(), - UnVerified = ((JArray)json["unverified"]).Select(p => UInt256.Parse(p.AsString())).ToList() + Height = uint.Parse(json["height"]!.AsString()), + Verified = ((JArray)json["verified"]!).Select(p => UInt256.Parse(p!.AsString())).ToList(), + UnVerified = ((JArray)json["unverified"]!).Select(p => UInt256.Parse(p!.AsString())).ToList() }; } } diff --git a/plugins/RpcClient/Models/RpcRequest.cs b/plugins/RpcClient/Models/RpcRequest.cs index dcac51f39..165d166d6 100644 --- a/plugins/RpcClient/Models/RpcRequest.cs +++ b/plugins/RpcClient/Models/RpcRequest.cs @@ -15,22 +15,22 @@ namespace Neo.Network.RPC.Models; public class RpcRequest { - public JToken Id { get; set; } + public JToken? Id { get; set; } - public string JsonRpc { get; set; } + public required string JsonRpc { get; set; } - public string Method { get; set; } + public required string Method { get; set; } - public JToken[] Params { get; set; } + public required JToken?[] Params { get; set; } public static RpcRequest FromJson(JObject json) { return new RpcRequest { Id = json["id"], - JsonRpc = json["jsonrpc"].AsString(), - Method = json["method"].AsString(), - Params = ((JArray)json["params"]).ToArray() + JsonRpc = json["jsonrpc"]!.AsString(), + Method = json["method"]!.AsString(), + Params = ((JArray)json["params"]!).ToArray() }; } diff --git a/plugins/RpcClient/Models/RpcResponse.cs b/plugins/RpcClient/Models/RpcResponse.cs index 6c57d295a..957b5d59a 100644 --- a/plugins/RpcClient/Models/RpcResponse.cs +++ b/plugins/RpcClient/Models/RpcResponse.cs @@ -15,28 +15,28 @@ namespace Neo.Network.RPC.Models; public class RpcResponse { - public JToken Id { get; set; } + public JToken? Id { get; set; } - public string JsonRpc { get; set; } + public required string JsonRpc { get; set; } - public RpcResponseError Error { get; set; } + public RpcResponseError? Error { get; set; } - public JToken Result { get; set; } + public JToken? Result { get; set; } - public string RawResponse { get; set; } + public string RawResponse { get; set; } = null!; public static RpcResponse FromJson(JObject json) { var response = new RpcResponse { Id = json["id"], - JsonRpc = json["jsonrpc"].AsString(), + JsonRpc = json["jsonrpc"]!.AsString(), Result = json["result"] }; if (json["error"] != null) { - response.Error = RpcResponseError.FromJson((JObject)json["error"]); + response.Error = RpcResponseError.FromJson((JObject)json["error"]!); } return response; @@ -58,16 +58,16 @@ public class RpcResponseError { public int Code { get; set; } - public string Message { get; set; } + public required string Message { get; set; } - public JToken Data { get; set; } + public JToken? Data { get; set; } public static RpcResponseError FromJson(JObject json) { return new RpcResponseError { - Code = (int)json["code"].AsNumber(), - Message = json["message"].AsString(), + Code = (int)json["code"]!.AsNumber(), + Message = json["message"]!.AsString(), Data = json["data"], }; } diff --git a/plugins/RpcClient/Models/RpcStateRoot.cs b/plugins/RpcClient/Models/RpcStateRoot.cs index 1b8ae7062..6664d7ff9 100644 --- a/plugins/RpcClient/Models/RpcStateRoot.cs +++ b/plugins/RpcClient/Models/RpcStateRoot.cs @@ -18,17 +18,17 @@ public class RpcStateRoot { public byte Version; public uint Index; - public UInt256 RootHash; - public Witness Witness; + public required UInt256 RootHash; + public required Witness Witness; public static RpcStateRoot FromJson(JObject json) { return new RpcStateRoot { - Version = (byte)json["version"].AsNumber(), - Index = (uint)json["index"].AsNumber(), - RootHash = UInt256.Parse(json["roothash"].AsString()), - Witness = ((JArray)json["witnesses"]).Select(p => Utility.WitnessFromJson((JObject)p)).FirstOrDefault() + Version = (byte)json["version"]!.AsNumber(), + Index = (uint)json["index"]!.AsNumber(), + RootHash = UInt256.Parse(json["roothash"]!.AsString()), + Witness = ((JArray)json["witnesses"]!).Select(p => Utility.WitnessFromJson((JObject)p!)).First() }; } } diff --git a/plugins/RpcClient/Models/RpcTransaction.cs b/plugins/RpcClient/Models/RpcTransaction.cs index f07949947..16a2d226f 100644 --- a/plugins/RpcClient/Models/RpcTransaction.cs +++ b/plugins/RpcClient/Models/RpcTransaction.cs @@ -17,9 +17,9 @@ namespace Neo.Network.RPC.Models; public class RpcTransaction { - public Transaction Transaction { get; set; } + public required Transaction Transaction { get; set; } - public UInt256 BlockHash { get; set; } + public UInt256? BlockHash { get; set; } public uint? Confirmations { get; set; } @@ -32,7 +32,7 @@ public JObject ToJson(ProtocolSettings protocolSettings) var json = Utility.TransactionToJson(Transaction, protocolSettings); if (Confirmations != null) { - json["blockhash"] = BlockHash.ToString(); + json["blockhash"] = BlockHash!.ToString(); json["confirmations"] = Confirmations; json["blocktime"] = BlockTime; if (VMState != null) @@ -52,9 +52,9 @@ public static RpcTransaction FromJson(JObject json, ProtocolSettings protocolSet if (json["confirmations"] != null) { - transaction.BlockHash = UInt256.Parse(json["blockhash"].AsString()); - transaction.Confirmations = (uint)json["confirmations"].AsNumber(); - transaction.BlockTime = (ulong)json["blocktime"].AsNumber(); + transaction.BlockHash = UInt256.Parse(json["blockhash"]!.AsString()); + transaction.Confirmations = (uint)json["confirmations"]!.AsNumber(); + transaction.BlockTime = (ulong)json["blocktime"]!.AsNumber(); transaction.VMState = json["vmstate"]?.GetEnum(); } return transaction; diff --git a/plugins/RpcClient/Models/RpcTransferOut.cs b/plugins/RpcClient/Models/RpcTransferOut.cs index 636e2762d..94a71f3b9 100644 --- a/plugins/RpcClient/Models/RpcTransferOut.cs +++ b/plugins/RpcClient/Models/RpcTransferOut.cs @@ -16,11 +16,11 @@ namespace Neo.Network.RPC.Models; public class RpcTransferOut { - public UInt160 Asset { get; set; } + public required UInt160 Asset { get; set; } - public UInt160 ScriptHash { get; set; } + public required UInt160 ScriptHash { get; set; } - public string Value { get; set; } + public required string Value { get; set; } public JObject ToJson(ProtocolSettings protocolSettings) { @@ -36,9 +36,9 @@ public static RpcTransferOut FromJson(JObject json, ProtocolSettings protocolSet { return new RpcTransferOut { - Asset = json["asset"].ToScriptHash(protocolSettings), - Value = json["value"].AsString(), - ScriptHash = json["address"].ToScriptHash(protocolSettings), + Asset = json["asset"]!.ToScriptHash(protocolSettings), + Value = json["value"]!.AsString(), + ScriptHash = json["address"]!.ToScriptHash(protocolSettings), }; } } diff --git a/plugins/RpcClient/Models/RpcUnclaimedGas.cs b/plugins/RpcClient/Models/RpcUnclaimedGas.cs index 0fb1824e1..0c266a0fb 100644 --- a/plugins/RpcClient/Models/RpcUnclaimedGas.cs +++ b/plugins/RpcClient/Models/RpcUnclaimedGas.cs @@ -17,7 +17,7 @@ public class RpcUnclaimedGas { public long Unclaimed { get; set; } - public string Address { get; set; } + public required string Address { get; set; } public JObject ToJson() => new() { ["unclaimed"] = Unclaimed.ToString(), ["address"] = Address }; @@ -25,8 +25,8 @@ public static RpcUnclaimedGas FromJson(JObject json) { return new RpcUnclaimedGas { - Unclaimed = long.Parse(json["unclaimed"].AsString()), - Address = json["address"].AsString() + Unclaimed = long.Parse(json["unclaimed"]!.AsString()), + Address = json["address"]!.AsString() }; } } diff --git a/plugins/RpcClient/Models/RpcValidateAddressResult.cs b/plugins/RpcClient/Models/RpcValidateAddressResult.cs index 3668556d2..2c5cfc5ce 100644 --- a/plugins/RpcClient/Models/RpcValidateAddressResult.cs +++ b/plugins/RpcClient/Models/RpcValidateAddressResult.cs @@ -15,7 +15,7 @@ namespace Neo.Network.RPC.Models; public class RpcValidateAddressResult { - public string Address { get; set; } + public required string Address { get; set; } public bool IsValid { get; set; } @@ -25,8 +25,8 @@ public static RpcValidateAddressResult FromJson(JObject json) { return new RpcValidateAddressResult { - Address = json["address"].AsString(), - IsValid = json["isvalid"].AsBoolean() + Address = json["address"]!.AsString(), + IsValid = json["isvalid"]!.AsBoolean() }; } } diff --git a/plugins/RpcClient/Models/RpcValidator.cs b/plugins/RpcClient/Models/RpcValidator.cs index 9875ec339..96e712a9a 100644 --- a/plugins/RpcClient/Models/RpcValidator.cs +++ b/plugins/RpcClient/Models/RpcValidator.cs @@ -16,7 +16,7 @@ namespace Neo.Network.RPC.Models; public class RpcValidator { - public string PublicKey { get; set; } + public required string PublicKey { get; set; } public BigInteger Votes { get; set; } @@ -26,8 +26,8 @@ public static RpcValidator FromJson(JObject json) { return new RpcValidator { - PublicKey = json["publickey"].AsString(), - Votes = BigInteger.Parse(json["votes"].AsString()), + PublicKey = json["publickey"]!.AsString(), + Votes = BigInteger.Parse(json["votes"]!.AsString()), }; } } diff --git a/plugins/RpcClient/Models/RpcVersion.cs b/plugins/RpcClient/Models/RpcVersion.cs index f01d5cf9e..3d5590e2a 100644 --- a/plugins/RpcClient/Models/RpcVersion.cs +++ b/plugins/RpcClient/Models/RpcVersion.cs @@ -27,9 +27,9 @@ public class RpcProtocol public uint MaxTransactionsPerBlock { get; set; } public int MemoryPoolMaxTransactions { get; set; } public ulong InitialGasDistribution { get; set; } - public IReadOnlyDictionary Hardforks { get; set; } - public IReadOnlyList SeedList { get; set; } - public IReadOnlyList StandbyCommittee { get; set; } + public required IReadOnlyDictionary Hardforks { get; set; } + public required IReadOnlyList SeedList { get; set; } + public required IReadOnlyList StandbyCommittee { get; set; } public JObject ToJson() { @@ -58,24 +58,24 @@ public static RpcProtocol FromJson(JObject json) { return new() { - Network = (uint)json["network"].AsNumber(), - ValidatorsCount = (int)json["validatorscount"].AsNumber(), - MillisecondsPerBlock = (uint)json["msperblock"].AsNumber(), - MaxValidUntilBlockIncrement = (uint)json["maxvaliduntilblockincrement"].AsNumber(), - MaxTraceableBlocks = (uint)json["maxtraceableblocks"].AsNumber(), - AddressVersion = (byte)json["addressversion"].AsNumber(), - MaxTransactionsPerBlock = (uint)json["maxtransactionsperblock"].AsNumber(), - MemoryPoolMaxTransactions = (int)json["memorypoolmaxtransactions"].AsNumber(), - InitialGasDistribution = (ulong)json["initialgasdistribution"].AsNumber(), - Hardforks = new Dictionary(((JArray)json["hardforks"]).Select(s => + Network = (uint)json["network"]!.AsNumber(), + ValidatorsCount = (int)json["validatorscount"]!.AsNumber(), + MillisecondsPerBlock = (uint)json["msperblock"]!.AsNumber(), + MaxValidUntilBlockIncrement = (uint)json["maxvaliduntilblockincrement"]!.AsNumber(), + MaxTraceableBlocks = (uint)json["maxtraceableblocks"]!.AsNumber(), + AddressVersion = (byte)json["addressversion"]!.AsNumber(), + MaxTransactionsPerBlock = (uint)json["maxtransactionsperblock"]!.AsNumber(), + MemoryPoolMaxTransactions = (int)json["memorypoolmaxtransactions"]!.AsNumber(), + InitialGasDistribution = (ulong)json["initialgasdistribution"]!.AsNumber(), + Hardforks = new Dictionary(((JArray)json["hardforks"]!).Select(s => { - var name = s["name"].AsString(); + var name = s!["name"]!.AsString(); // Add HF_ prefix to the hardfork response for proper Hardfork enum parsing. var hardfork = Enum.Parse(name.StartsWith("HF_") ? name : $"HF_{name}"); - return new KeyValuePair(hardfork, (uint)s["blockheight"].AsNumber()); + return new KeyValuePair(hardfork, (uint)s["blockheight"]!.AsNumber()); })), - SeedList = [.. ((JArray)json["seedlist"]).Select(s => s.AsString())], - StandbyCommittee = [.. ((JArray)json["standbycommittee"]).Select(s => ECPoint.Parse(s.AsString(), ECCurve.Secp256r1))] + SeedList = [.. ((JArray)json["seedlist"]!).Select(s => s!.AsString())], + StandbyCommittee = [.. ((JArray)json["standbycommittee"]!).Select(s => ECPoint.Parse(s!.AsString(), ECCurve.Secp256r1))] }; } @@ -89,9 +89,9 @@ private static string StripPrefix(string s, string prefix) public uint Nonce { get; set; } - public string UserAgent { get; set; } + public required string UserAgent { get; set; } - public RpcProtocol Protocol { get; set; } = new(); + public required RpcProtocol Protocol { get; set; } public JObject ToJson() { @@ -109,10 +109,10 @@ public static RpcVersion FromJson(JObject json) { return new() { - TcpPort = (int)json["tcpport"].AsNumber(), - Nonce = (uint)json["nonce"].AsNumber(), - UserAgent = json["useragent"].AsString(), - Protocol = RpcProtocol.FromJson((JObject)json["protocol"]) + TcpPort = (int)json["tcpport"]!.AsNumber(), + Nonce = (uint)json["nonce"]!.AsNumber(), + UserAgent = json["useragent"]!.AsString(), + Protocol = RpcProtocol.FromJson((JObject)json["protocol"]!) }; } } diff --git a/plugins/RpcClient/Nep17API.cs b/plugins/RpcClient/Nep17API.cs index b1de7646a..062b6c410 100644 --- a/plugins/RpcClient/Nep17API.cs +++ b/plugins/RpcClient/Nep17API.cs @@ -52,7 +52,7 @@ public async Task BalanceOfAsync(UInt160 scriptHash, UInt160 account public async Task SymbolAsync(UInt160 scriptHash) { var result = await TestInvokeAsync(scriptHash, "symbol").ConfigureAwait(false); - return result.Stack.Single().GetString(); + return result.Stack.Single().GetString()!; } /// @@ -96,7 +96,7 @@ .. scriptHash.MakeScript("decimals"), return new RpcNep17TokenInfo { Name = name, - Symbol = stack[0].GetString(), + Symbol = stack[0].GetString()!, Decimals = (byte)stack[1].GetInteger(), TotalSupply = stack[2].GetInteger() }; @@ -116,7 +116,7 @@ .. contractState.Hash.MakeScript("decimals"), return new RpcNep17TokenInfo { Name = name, - Symbol = stack[0].GetString(), + Symbol = stack[0].GetString()!, Decimals = (byte)stack[1].GetInteger(), TotalSupply = stack[2].GetInteger() }; @@ -132,7 +132,7 @@ .. contractState.Hash.MakeScript("decimals"), /// onPayment data /// Add assert at the end of the script /// - public async Task CreateTransferTxAsync(UInt160 scriptHash, KeyPair fromKey, UInt160 to, BigInteger amount, object data = null, bool addAssert = true) + public async Task CreateTransferTxAsync(UInt160 scriptHash, KeyPair fromKey, UInt160 to, BigInteger amount, object? data = null, bool addAssert = true) { var sender = Contract.CreateSignatureRedeemScript(fromKey.PublicKey).ToScriptHash(); Signer[] signers = new[] { new Signer { Scopes = WitnessScope.CalledByEntry, Account = sender } }; @@ -159,7 +159,7 @@ public async Task CreateTransferTxAsync(UInt160 scriptHash, KeyPair /// onPayment data /// Add assert at the end of the script /// - public async Task CreateTransferTxAsync(UInt160 scriptHash, int m, ECPoint[] pubKeys, KeyPair[] fromKeys, UInt160 to, BigInteger amount, object data = null, bool addAssert = true) + public async Task CreateTransferTxAsync(UInt160 scriptHash, int m, ECPoint[] pubKeys, KeyPair[] fromKeys, UInt160 to, BigInteger amount, object? data = null, bool addAssert = true) { if (m > fromKeys.Length) throw new ArgumentException($"Need at least {m} KeyPairs for signing!"); diff --git a/plugins/RpcClient/RpcClient.cs b/plugins/RpcClient/RpcClient.cs index 4c8c1bc22..1163f4959 100644 --- a/plugins/RpcClient/RpcClient.cs +++ b/plugins/RpcClient/RpcClient.cs @@ -35,7 +35,7 @@ public class RpcClient : IDisposable internal readonly ProtocolSettings protocolSettings; - public RpcClient(Uri url, string rpcUser = default, string rpcPass = default, ProtocolSettings protocolSettings = null) + public RpcClient(Uri url, string? rpcUser = null, string? rpcPass = null, ProtocolSettings? protocolSettings = null) { _httpClient = new HttpClient(); _baseAddress = url; @@ -47,7 +47,7 @@ public RpcClient(Uri url, string rpcUser = default, string rpcPass = default, Pr this.protocolSettings = protocolSettings ?? ProtocolSettings.Default; } - public RpcClient(HttpClient client, Uri url, ProtocolSettings protocolSettings = null) + public RpcClient(HttpClient client, Uri url, ProtocolSettings? protocolSettings = null) { _httpClient = client; _baseAddress = url; @@ -76,7 +76,7 @@ public void Dispose() } #endregion - static RpcRequest AsRpcRequest(string method, params JToken[] paraArgs) + static RpcRequest AsRpcRequest(string method, params JToken?[] paraArgs) { return new RpcRequest { @@ -89,7 +89,7 @@ static RpcRequest AsRpcRequest(string method, params JToken[] paraArgs) static RpcResponse AsRpcResponse(string content, bool throwOnError) { - var response = RpcResponse.FromJson((JObject)JToken.Parse(content)); + var response = RpcResponse.FromJson((JObject)JToken.Parse(content)!); response.RawResponse = content; if (response.Error != null && throwOnError) @@ -134,19 +134,19 @@ public virtual JToken RpcSend(string method, params JToken[] paraArgs) { var request = AsRpcRequest(method, paraArgs); var response = Send(request); - return response.Result; + return response.Result!; } - public virtual async Task RpcSendAsync(string method, params JToken[] paraArgs) + public virtual async Task RpcSendAsync(string method, params JToken?[] paraArgs) { var request = AsRpcRequest(method, paraArgs); var response = await SendAsync(request).ConfigureAwait(false); - return response.Result; + return response.Result!; } - public static string GetRpcName([CallerMemberName] string methodName = null) + public static string GetRpcName([CallerMemberName] string? methodName = null) { - return s_rpcNameRegex.Replace(methodName, "$1").ToLowerInvariant(); + return s_rpcNameRegex.Replace(methodName!, "$1").ToLowerInvariant(); } #region Blockchain @@ -256,11 +256,11 @@ public static ContractState ContractStateFromJson(JObject json) { return new ContractState { - Id = (int)json["id"].AsNumber(), + Id = (int)json["id"]!.AsNumber(), UpdateCounter = (ushort)(json["updatecounter"]?.AsNumber() ?? 0), - Hash = UInt160.Parse(json["hash"].AsString()), - Nef = RpcNefFile.FromJson((JObject)json["nef"]), - Manifest = ContractManifest.FromJson((JObject)json["manifest"]) + Hash = UInt160.Parse(json["hash"]!.AsString()), + Nef = RpcNefFile.FromJson((JObject)json["nef"]!), + Manifest = ContractManifest.FromJson((JObject)json["manifest"]!) }; } @@ -270,7 +270,7 @@ public static ContractState ContractStateFromJson(JObject json) public async Task GetNativeContractsAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return ((JArray)result).Select(p => ContractStateFromJson((JObject)p)).ToArray(); + return ((JArray)result).Select(p => ContractStateFromJson((JObject)p!)).ToArray(); } /// @@ -279,7 +279,7 @@ public async Task GetNativeContractsAsync() public async Task GetRawMempoolAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return ((JArray)result).Select(p => p.AsString()).ToArray(); + return ((JArray)result).Select(p => p!.AsString()).ToArray(); } /// @@ -320,7 +320,7 @@ public async Task CalculateNetworkFeeAsync(Transaction tx) { var json = await RpcSendAsync(GetRpcName(), Convert.ToBase64String(tx.ToArray())) .ConfigureAwait(false); - return (long)json["networkfee"].AsNumber(); + return (long)json["networkfee"]!.AsNumber(); } /// @@ -347,7 +347,7 @@ public async Task GetTransactionHeightAsync(string txHash) public async Task GetNextBlockValidatorsAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return ((JArray)result).Select(p => RpcValidator.FromJson((JObject)p)).ToArray(); + return ((JArray)result).Select(p => RpcValidator.FromJson((JObject)p!)).ToArray(); } /// @@ -356,7 +356,7 @@ public async Task GetNextBlockValidatorsAsync() public async Task GetCommitteeAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return [.. ((JArray)result).Select(p => p.AsString())]; + return [.. ((JArray)result).Select(p => p!.AsString())]; } #endregion Blockchain @@ -396,7 +396,7 @@ public async Task GetVersionAsync() public async Task SendRawTransactionAsync(byte[] rawTransaction) { var result = await RpcSendAsync(GetRpcName(), Convert.ToBase64String(rawTransaction)).ConfigureAwait(false); - return UInt256.Parse(result["hash"].AsString()); + return UInt256.Parse(result["hash"]!.AsString()); } /// @@ -413,7 +413,7 @@ public Task SendRawTransactionAsync(Transaction transaction) public async Task SubmitBlockAsync(byte[] block) { var result = await RpcSendAsync(GetRpcName(), Convert.ToBase64String(block)).ConfigureAwait(false); - return UInt256.Parse(result["hash"].AsString()); + return UInt256.Parse(result["hash"]!.AsString()); } #endregion Node @@ -464,9 +464,9 @@ public async IAsyncEnumerable TraverseIteratorAsync(string sessionId, s { var result = await RpcSendAsync(GetRpcName(), sessionId, id, count).ConfigureAwait(false); var array = (JArray)result; - foreach (JObject jObject in array) + foreach (var jObject in array) { - yield return jObject; + yield return (JObject)jObject!; } if (array.Count < count) break; } @@ -485,9 +485,9 @@ public async IAsyncEnumerable TraverseIteratorAsync(string sessionId, s var result = await RpcSendAsync(GetRpcName(), sessionId, id, count).ConfigureAwait(false); if (result is JArray { Count: > 0 } array) { - foreach (JObject jObject in array) + foreach (var jObject in array) { - yield return jObject; + yield return (JObject)jObject!; } } } @@ -512,7 +512,7 @@ public async Task TerminateSessionAsync(string sessionId) public async Task ListPluginsAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return [.. ((JArray)result).Select(p => RpcPlugin.FromJson((JObject)p))]; + return [.. ((JArray)result).Select(p => RpcPlugin.FromJson((JObject)p!))]; } /// @@ -563,7 +563,7 @@ public async Task GetNewAddressAsync() public async Task GetWalletBalanceAsync(string assetId) { var result = await RpcSendAsync(GetRpcName(), assetId).ConfigureAwait(false); - BigInteger balance = BigInteger.Parse(result["balance"].AsString()); + BigInteger balance = BigInteger.Parse(result["balance"]!.AsString()); byte decimals = await new Nep17API(this).DecimalsAsync(UInt160.Parse(assetId.AsScriptHash())).ConfigureAwait(false); return new BigDecimal(balance, decimals); } @@ -592,7 +592,7 @@ public async Task ImportPrivKeyAsync(string wif) public async Task> ListAddressAsync() { var result = await RpcSendAsync(GetRpcName()).ConfigureAwait(false); - return [.. ((JArray)result).Select(p => RpcAccount.FromJson((JObject)p))]; + return [.. ((JArray)result).Select(p => RpcAccount.FromJson((JObject)p!))]; } /// diff --git a/plugins/RpcClient/StateAPI.cs b/plugins/RpcClient/StateAPI.cs index 43b0ae72f..88567b077 100644 --- a/plugins/RpcClient/StateAPI.cs +++ b/plugins/RpcClient/StateAPI.cs @@ -52,7 +52,7 @@ public async Task VerifyProofAsync(UInt256 rootHash, byte[] proofBytes) return (localRootIndex, validatedRootIndex); } - static uint? ToNullableUint(JToken json) => (json == null) ? null : (uint?)json.AsNumber(); + static uint? ToNullableUint(JToken? json) => (json == null) ? null : (uint?)json.AsNumber(); public static JToken[] MakeFindStatesParams(UInt256 rootHash, UInt160 scriptHash, ReadOnlySpan prefix, ReadOnlySpan from = default, int? count = null) { diff --git a/plugins/RpcClient/TransactionManager.cs b/plugins/RpcClient/TransactionManager.cs index 3af64e583..f8579bb79 100644 --- a/plugins/RpcClient/TransactionManager.cs +++ b/plugins/RpcClient/TransactionManager.cs @@ -22,7 +22,7 @@ namespace Neo.Network.RPC; /// public class TransactionManager { - private class SignItem { public Contract Contract; public HashSet KeyPairs; } + private class SignItem { public required Contract Contract; public required HashSet KeyPairs; } private readonly RpcClient rpcClient; @@ -51,14 +51,14 @@ private class SignItem { public Contract Contract; public HashSet KeyPa public TransactionManager(Transaction tx, RpcClient rpcClient) { this.tx = tx; - context = new ContractParametersContext(null, tx, rpcClient.protocolSettings.Network); + context = new ContractParametersContext(null!, tx, rpcClient.protocolSettings.Network); this.rpcClient = rpcClient; } /// /// Helper function for one-off TransactionManager creation /// - public static Task MakeTransactionAsync(RpcClient rpcClient, ReadOnlyMemory script, Signer[] signers = null, TransactionAttribute[] attributes = null) + public static Task MakeTransactionAsync(RpcClient rpcClient, ReadOnlyMemory script, Signer[]? signers = null, TransactionAttribute[]? attributes = null) { var factory = new TransactionManagerFactory(rpcClient); return factory.MakeTransactionAsync(script, signers, attributes); @@ -67,7 +67,7 @@ public static Task MakeTransactionAsync(RpcClient rpcClient, /// /// Helper function for one-off TransactionManager creation /// - public static Task MakeTransactionAsync(RpcClient rpcClient, ReadOnlyMemory script, long systemFee, Signer[] signers = null, TransactionAttribute[] attributes = null) + public static Task MakeTransactionAsync(RpcClient rpcClient, ReadOnlyMemory script, long systemFee, Signer[]? signers = null, TransactionAttribute[]? attributes = null) { var factory = new TransactionManagerFactory(rpcClient); return factory.MakeTransactionAsync(script, systemFee, signers, attributes); @@ -116,12 +116,12 @@ public TransactionManager AddMultiSig(KeyPair[] keys, int m, params ECPoint[] pu private void AddSignItem(Contract contract, KeyPair key) { - if (!Tx.GetScriptHashesForVerifying(null).Contains(contract.ScriptHash)) + if (!Tx.GetScriptHashesForVerifying(null!).Contains(contract.ScriptHash)) { throw new Exception($"Add SignItem error: Mismatch ScriptHash ({contract.ScriptHash})"); } - SignItem item = signStore.FirstOrDefault(p => p.Contract.ScriptHash == contract.ScriptHash); + SignItem? item = signStore.FirstOrDefault(p => p.Contract.ScriptHash == contract.ScriptHash); if (item is null) { signStore.Add(new SignItem { Contract = contract, KeyPairs = new HashSet { key } }); @@ -163,13 +163,13 @@ public TransactionManager AddWitness(UInt160 scriptHash, params object[] paramet public async Task SignAsync() { // Calculate NetworkFee - Tx.Witnesses = Tx.GetScriptHashesForVerifying(null).Select(u => new Witness() + Tx.Witnesses = Tx.GetScriptHashesForVerifying(null!).Select(u => new Witness() { InvocationScript = ReadOnlyMemory.Empty, VerificationScript = GetVerificationScript(u) }).ToArray(); Tx.NetworkFee = await rpcClient.CalculateNetworkFeeAsync(Tx).ConfigureAwait(false); - Tx.Witnesses = null; + Tx.Witnesses = null!; var gasBalance = await new Nep17API(rpcClient).BalanceOfAsync(NativeContract.GAS.Hash, Tx.Sender).ConfigureAwait(false); if (gasBalance < Tx.SystemFee + Tx.NetworkFee) diff --git a/plugins/RpcClient/TransactionManagerFactory.cs b/plugins/RpcClient/TransactionManagerFactory.cs index c166ab162..730fa2a47 100644 --- a/plugins/RpcClient/TransactionManagerFactory.cs +++ b/plugins/RpcClient/TransactionManagerFactory.cs @@ -35,9 +35,9 @@ public TransactionManagerFactory(RpcClient rpcClient) /// Transaction Signers /// Transaction Attributes /// - public async Task MakeTransactionAsync(ReadOnlyMemory script, Signer[] signers = null, TransactionAttribute[] attributes = null) + public async Task MakeTransactionAsync(ReadOnlyMemory script, Signer[]? signers = null, TransactionAttribute[]? attributes = null) { - RpcInvokeResult invokeResult = await rpcClient.InvokeScriptAsync(script, signers).ConfigureAwait(false); + RpcInvokeResult invokeResult = await rpcClient.InvokeScriptAsync(script, signers ?? []).ConfigureAwait(false); return await MakeTransactionAsync(script, invokeResult.GasConsumed, signers, attributes).ConfigureAwait(false); } @@ -49,7 +49,7 @@ public async Task MakeTransactionAsync(ReadOnlyMemory /// Transaction Signers /// Transaction Attributes /// - public async Task MakeTransactionAsync(ReadOnlyMemory script, long systemFee, Signer[] signers = null, TransactionAttribute[] attributes = null) + public async Task MakeTransactionAsync(ReadOnlyMemory script, long systemFee, Signer[]? signers = null, TransactionAttribute[]? attributes = null) { uint blockCount = await rpcClient.GetBlockCountAsync().ConfigureAwait(false) - 1; diff --git a/plugins/RpcClient/Utility.cs b/plugins/RpcClient/Utility.cs index 8f306aeab..cdca1199f 100644 --- a/plugins/RpcClient/Utility.cs +++ b/plugins/RpcClient/Utility.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Neo.Cryptography.ECC; -using Neo.Extensions; using Neo.Json; using Neo.Network.P2P.Payloads; using Neo.Network.P2P.Payloads.Conditions; @@ -123,7 +122,7 @@ public static Block BlockFromJson(JObject json, ProtocolSettings protocolSetting return new Block() { Header = HeaderFromJson(json, protocolSettings), - Transactions = ((JArray)json["tx"]).Select(p => TransactionFromJson((JObject)p, protocolSettings)).ToArray() + Transactions = ((JArray)json["tx"]!).Select(p => TransactionFromJson((JObject)p!, protocolSettings)).ToArray() }; } @@ -138,15 +137,15 @@ public static Header HeaderFromJson(JObject json, ProtocolSettings protocolSetti { return new Header { - Version = (uint)json["version"].AsNumber(), - PrevHash = UInt256.Parse(json["previousblockhash"].AsString()), - MerkleRoot = UInt256.Parse(json["merkleroot"].AsString()), - Timestamp = (ulong)json["time"].AsNumber(), - Nonce = Convert.ToUInt64(json["nonce"].AsString(), 16), - Index = (uint)json["index"].AsNumber(), - PrimaryIndex = (byte)json["primary"].AsNumber(), - NextConsensus = json["nextconsensus"].ToScriptHash(protocolSettings), - Witness = ((JArray)json["witnesses"]).Select(p => WitnessFromJson((JObject)p)).FirstOrDefault() + Version = (uint)json["version"]!.AsNumber(), + PrevHash = UInt256.Parse(json["previousblockhash"]!.AsString()), + MerkleRoot = UInt256.Parse(json["merkleroot"]!.AsString()), + Timestamp = (ulong)json["time"]!.AsNumber(), + Nonce = Convert.ToUInt64(json["nonce"]!.AsString(), 16), + Index = (uint)json["index"]!.AsNumber(), + PrimaryIndex = (byte)json["primary"]!.AsNumber(), + NextConsensus = json["nextconsensus"]!.ToScriptHash(protocolSettings), + Witness = ((JArray)json["witnesses"]!).Select(p => WitnessFromJson((JObject)p!)).First() }; } @@ -154,15 +153,15 @@ public static Transaction TransactionFromJson(JObject json, ProtocolSettings pro { return new Transaction { - Version = byte.Parse(json["version"].AsString()), - Nonce = uint.Parse(json["nonce"].AsString()), - Signers = ((JArray)json["signers"]).Select(p => SignerFromJson((JObject)p, protocolSettings)).ToArray(), - SystemFee = long.Parse(json["sysfee"].AsString()), - NetworkFee = long.Parse(json["netfee"].AsString()), - ValidUntilBlock = uint.Parse(json["validuntilblock"].AsString()), - Attributes = ((JArray)json["attributes"]).Select(p => TransactionAttributeFromJson((JObject)p)).ToArray(), - Script = Convert.FromBase64String(json["script"].AsString()), - Witnesses = ((JArray)json["witnesses"]).Select(p => WitnessFromJson((JObject)p)).ToArray() + Version = byte.Parse(json["version"]!.AsString()), + Nonce = uint.Parse(json["nonce"]!.AsString()), + Signers = ((JArray)json["signers"]!).Select(p => SignerFromJson((JObject)p!, protocolSettings)).ToArray(), + SystemFee = long.Parse(json["sysfee"]!.AsString()), + NetworkFee = long.Parse(json["netfee"]!.AsString()), + ValidUntilBlock = uint.Parse(json["validuntilblock"]!.AsString()), + Attributes = ((JArray)json["attributes"]!).Select(p => TransactionAttributeFromJson((JObject)p!)).ToArray(), + Script = Convert.FromBase64String(json["script"]!.AsString()), + Witnesses = ((JArray)json["witnesses"]!).Select(p => WitnessFromJson((JObject)p!)).ToArray() }; } @@ -178,37 +177,37 @@ public static Signer SignerFromJson(JObject json, ProtocolSettings protocolSetti { return new Signer { - Account = json["account"].ToScriptHash(protocolSettings), - Rules = ((JArray)json["rules"])?.Select(p => RuleFromJson((JObject)p, protocolSettings)).ToArray(), - Scopes = (WitnessScope)Enum.Parse(typeof(WitnessScope), json["scopes"].AsString()), - AllowedContracts = ((JArray)json["allowedcontracts"])?.Select(p => p.ToScriptHash(protocolSettings)).ToArray(), - AllowedGroups = ((JArray)json["allowedgroups"])?.Select(p => ECPoint.Parse(p.AsString(), ECCurve.Secp256r1)).ToArray() + Account = json["account"]!.ToScriptHash(protocolSettings), + Rules = ((JArray?)json["rules"])?.Select(p => RuleFromJson((JObject)p!, protocolSettings)).ToArray(), + Scopes = Enum.Parse(json["scopes"]!.AsString()), + AllowedContracts = ((JArray?)json["allowedcontracts"])?.Select(p => p!.ToScriptHash(protocolSettings)).ToArray(), + AllowedGroups = ((JArray?)json["allowedgroups"])?.Select(p => ECPoint.Parse(p!.AsString(), ECCurve.Secp256r1)).ToArray() }; } public static TransactionAttribute TransactionAttributeFromJson(JObject json) { - TransactionAttributeType usage = Enum.Parse(json["type"].AsString()); + TransactionAttributeType usage = Enum.Parse(json["type"]!.AsString()); return usage switch { TransactionAttributeType.HighPriority => new HighPriorityAttribute(), TransactionAttributeType.OracleResponse => new OracleResponse() { - Id = (ulong)json["id"].AsNumber(), - Code = Enum.Parse(json["code"].AsString()), - Result = Convert.FromBase64String(json["result"].AsString()), + Id = (ulong)json["id"]!.AsNumber(), + Code = Enum.Parse(json["code"]!.AsString()), + Result = Convert.FromBase64String(json["result"]!.AsString()), }, TransactionAttributeType.NotValidBefore => new NotValidBefore() { - Height = (uint)json["height"].AsNumber(), + Height = (uint)json["height"]!.AsNumber(), }, TransactionAttributeType.Conflicts => new Conflicts() { - Hash = UInt256.Parse(json["hash"].AsString()) + Hash = UInt256.Parse(json["hash"]!.AsString()) }, TransactionAttributeType.NotaryAssisted => new NotaryAssisted() { - NKeys = (byte)json["nkeys"].AsNumber() + NKeys = (byte)json["nkeys"]!.AsNumber() }, _ => throw new FormatException(), }; @@ -218,8 +217,8 @@ public static Witness WitnessFromJson(JObject json) { return new Witness { - InvocationScript = Convert.FromBase64String(json["invocation"].AsString()), - VerificationScript = Convert.FromBase64String(json["verification"].AsString()) + InvocationScript = Convert.FromBase64String(json["invocation"]!.AsString()), + VerificationScript = Convert.FromBase64String(json["verification"]!.AsString()) }; } @@ -227,61 +226,61 @@ public static WitnessRule RuleFromJson(JObject json, ProtocolSettings protocolSe { return new WitnessRule() { - Action = Enum.Parse(json["action"].AsString()), - Condition = RuleExpressionFromJson((JObject)json["condition"], protocolSettings) + Action = Enum.Parse(json["action"]!.AsString()), + Condition = RuleExpressionFromJson((JObject)json["condition"]!, protocolSettings) }; } public static WitnessCondition RuleExpressionFromJson(JObject json, ProtocolSettings protocolSettings) { - return json["type"].AsString() switch + return json["type"]!.AsString() switch { - "Or" => new OrCondition { Expressions = ((JArray)json["expressions"])?.Select(p => RuleExpressionFromJson((JObject)p, protocolSettings)).ToArray() }, - "And" => new AndCondition { Expressions = ((JArray)json["expressions"])?.Select(p => RuleExpressionFromJson((JObject)p, protocolSettings)).ToArray() }, - "Boolean" => new BooleanCondition { Expression = json["expression"].AsBoolean() }, - "Not" => new NotCondition { Expression = RuleExpressionFromJson((JObject)json["expression"], protocolSettings) }, - "Group" => new GroupCondition { Group = ECPoint.Parse(json["group"].AsString(), ECCurve.Secp256r1) }, - "CalledByContract" => new CalledByContractCondition { Hash = json["hash"].ToScriptHash(protocolSettings) }, - "ScriptHash" => new ScriptHashCondition { Hash = json["hash"].ToScriptHash(protocolSettings) }, + "Or" => new OrCondition { Expressions = ((JArray)json["expressions"]!).Select(p => RuleExpressionFromJson((JObject)p!, protocolSettings)).ToArray() }, + "And" => new AndCondition { Expressions = ((JArray)json["expressions"]!).Select(p => RuleExpressionFromJson((JObject)p!, protocolSettings)).ToArray() }, + "Boolean" => new BooleanCondition { Expression = json["expression"]!.AsBoolean() }, + "Not" => new NotCondition { Expression = RuleExpressionFromJson((JObject)json["expression"]!, protocolSettings) }, + "Group" => new GroupCondition { Group = ECPoint.Parse(json["group"]!.AsString(), ECCurve.Secp256r1) }, + "CalledByContract" => new CalledByContractCondition { Hash = json["hash"]!.ToScriptHash(protocolSettings) }, + "ScriptHash" => new ScriptHashCondition { Hash = json["hash"]!.ToScriptHash(protocolSettings) }, "CalledByEntry" => new CalledByEntryCondition(), - "CalledByGroup" => new CalledByGroupCondition { Group = ECPoint.Parse(json["group"].AsString(), ECCurve.Secp256r1) }, + "CalledByGroup" => new CalledByGroupCondition { Group = ECPoint.Parse(json["group"]!.AsString(), ECCurve.Secp256r1) }, _ => throw new FormatException("Wrong rule's condition type"), }; } public static StackItem StackItemFromJson(JObject json) { - StackItemType type = json["type"].GetEnum(); + StackItemType type = json["type"]!.GetEnum(); switch (type) { case StackItemType.Boolean: - return json["value"].GetBoolean() ? StackItem.True : StackItem.False; + return json["value"]!.GetBoolean() ? StackItem.True : StackItem.False; case StackItemType.Buffer: - return new Buffer(Convert.FromBase64String(json["value"].AsString())); + return new Buffer(Convert.FromBase64String(json["value"]!.AsString())); case StackItemType.ByteString: - return new ByteString(Convert.FromBase64String(json["value"].AsString())); + return new ByteString(Convert.FromBase64String(json["value"]!.AsString())); case StackItemType.Integer: - return BigInteger.Parse(json["value"].AsString()); + return BigInteger.Parse(json["value"]!.AsString()); case StackItemType.Array: Array array = new(); - foreach (JObject item in (JArray)json["value"]) - array.Add(StackItemFromJson(item)); + foreach (var item in (JArray)json["value"]!) + array.Add(StackItemFromJson((JObject)item!)); return array; case StackItemType.Struct: Struct @struct = new(); - foreach (JObject item in (JArray)json["value"]) - @struct.Add(StackItemFromJson(item)); + foreach (var item in (JArray)json["value"]!) + @struct.Add(StackItemFromJson((JObject)item!)); return @struct; case StackItemType.Map: Map map = new(); - foreach (var item in (JArray)json["value"]) + foreach (var item in (JArray)json["value"]!) { - PrimitiveType key = (PrimitiveType)StackItemFromJson((JObject)item["key"]); - map[key] = StackItemFromJson((JObject)item["value"]); + PrimitiveType key = (PrimitiveType)StackItemFromJson((JObject)item!["key"]!); + map[key] = StackItemFromJson((JObject)item["value"]!); } return map; case StackItemType.Pointer: - return new Pointer(Script.Empty, (int)json["value"].AsNumber()); + return new Pointer(Script.Empty, (int)json["value"]!.AsNumber()); case StackItemType.InteropInterface: return new InteropInterface(json); default: @@ -289,7 +288,7 @@ public static StackItem StackItemFromJson(JObject json) } } - public static string GetIteratorId(this StackItem item) + public static string? GetIteratorId(this StackItem item) { if (item is InteropInterface iop) { diff --git a/plugins/RpcClient/WalletAPI.cs b/plugins/RpcClient/WalletAPI.cs index 76344a212..46077df74 100644 --- a/plugins/RpcClient/WalletAPI.cs +++ b/plugins/RpcClient/WalletAPI.cs @@ -142,7 +142,7 @@ public async Task ClaimGasAsync(KeyPair keyPair, bool addAssert = t /// onPayment data /// Add assert at the end of the script /// - public async Task TransferAsync(string tokenHash, string fromKey, string toAddress, decimal amount, object data = null, bool addAssert = true) + public async Task TransferAsync(string tokenHash, string fromKey, string toAddress, decimal amount, object? data = null, bool addAssert = true) { UInt160 scriptHash = Utility.GetScriptHash(tokenHash, rpcClient.protocolSettings); var decimals = await nep17API.DecimalsAsync(scriptHash).ConfigureAwait(false); @@ -163,7 +163,7 @@ public async Task TransferAsync(string tokenHash, string fromKey, s /// onPayment data /// Add assert at the end of the script /// - public async Task TransferAsync(UInt160 scriptHash, KeyPair from, UInt160 to, BigInteger amountInteger, object data = null, bool addAssert = true) + public async Task TransferAsync(UInt160 scriptHash, KeyPair from, UInt160 to, BigInteger amountInteger, object? data = null, bool addAssert = true) { Transaction transaction = await nep17API.CreateTransferTxAsync(scriptHash, from, to, amountInteger, data, addAssert).ConfigureAwait(false); await rpcClient.SendRawTransactionAsync(transaction).ConfigureAwait(false); @@ -182,7 +182,7 @@ public async Task TransferAsync(UInt160 scriptHash, KeyPair from, U /// onPayment data /// Add assert at the end of the script /// - public async Task TransferAsync(UInt160 scriptHash, int m, ECPoint[] pubKeys, KeyPair[] keys, UInt160 to, BigInteger amountInteger, object data = null, bool addAssert = true) + public async Task TransferAsync(UInt160 scriptHash, int m, ECPoint[] pubKeys, KeyPair[] keys, UInt160 to, BigInteger amountInteger, object? data = null, bool addAssert = true) { Transaction transaction = await nep17API.CreateTransferTxAsync(scriptHash, m, pubKeys, keys, to, amountInteger, data, addAssert).ConfigureAwait(false); await rpcClient.SendRawTransactionAsync(transaction).ConfigureAwait(false); @@ -198,7 +198,7 @@ public async Task TransferAsync(UInt160 scriptHash, int m, ECPoint[ public async Task WaitTransactionAsync(Transaction transaction, int timeout = 60) { DateTime deadline = DateTime.UtcNow.AddSeconds(timeout); - RpcTransaction rpcTx = null; + RpcTransaction? rpcTx = null; while (rpcTx == null || rpcTx.Confirmations == null) { if (deadline < DateTime.UtcNow) diff --git a/plugins/RpcServer/RpcServer.csproj b/plugins/RpcServer/RpcServer.csproj index 040cf1bbe..a1f9d85f9 100644 --- a/plugins/RpcServer/RpcServer.csproj +++ b/plugins/RpcServer/RpcServer.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/plugins/SQLiteWallet/SQLiteWallet.csproj b/plugins/SQLiteWallet/SQLiteWallet.csproj index 635465d29..1fb8d39d2 100644 --- a/plugins/SQLiteWallet/SQLiteWallet.csproj +++ b/plugins/SQLiteWallet/SQLiteWallet.csproj @@ -1,9 +1,8 @@  - Neo.Wallets.SQLite Neo.Wallets.SQLite - enable + Neo.Wallets.SQLite diff --git a/plugins/SignClient/SignClient.csproj b/plugins/SignClient/SignClient.csproj index ef06028b5..4e6c5c2d1 100644 --- a/plugins/SignClient/SignClient.csproj +++ b/plugins/SignClient/SignClient.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/plugins/StateService/Network/StateRoot.cs b/plugins/StateService/Network/StateRoot.cs index b727639f0..0081f345f 100644 --- a/plugins/StateService/Network/StateRoot.cs +++ b/plugins/StateService/Network/StateRoot.cs @@ -26,27 +26,16 @@ class StateRoot : IVerifiable public byte Version; public uint Index; - public UInt256 RootHash; - public Witness Witness; + public required UInt256 RootHash; + public Witness? Witness; - private UInt256 _hash = null; - public UInt256 Hash - { - get - { - if (_hash is null) - { - _hash = this.CalculateHash(); - } - return _hash; - } - } + public UInt256 Hash => field ??= this.CalculateHash(); Witness[] IVerifiable.Witnesses { get { - return [Witness]; + return [Witness!]; } set { diff --git a/plugins/StateService/StatePlugin.cs b/plugins/StateService/StatePlugin.cs index c9bdd094f..14b219218 100644 --- a/plugins/StateService/StatePlugin.cs +++ b/plugins/StateService/StatePlugin.cs @@ -29,7 +29,7 @@ namespace Neo.Plugins.StateService; -public class StatePlugin : Plugin, ICommittingHandler, ICommittedHandler, IWalletChangedHandler, IServiceAddedHandler +public class StatePlugin : Plugin, ICommittingHandler, ICommittedHandler { public const string StatePayloadCategory = "StateService"; public override string Name => "StateService"; @@ -38,14 +38,14 @@ public class StatePlugin : Plugin, ICommittingHandler, ICommittedHandler, IWalle protected override UnhandledExceptionPolicy ExceptionPolicy => StateServiceSettings.Default.ExceptionPolicy; - internal IActorRef Store; - internal IActorRef Verifier; + internal IActorRef Store = null!; + internal IActorRef Verifier = null!; - private static NeoSystem _system; + private static NeoSystem _system = null!; internal static NeoSystem NeoSystem => _system; - private IWalletProvider walletProvider; + private IWalletProvider? walletProvider; public StatePlugin() { @@ -63,27 +63,30 @@ protected override void OnSystemLoaded(NeoSystem system) if (system.Settings.Network != StateServiceSettings.Default.Network) return; _system = system; Store = _system.ActorSystem.ActorOf(StateStore.Props(this, string.Format(StateServiceSettings.Default.Path, system.Settings.Network.ToString("X8")))); - _system.ServiceAdded += ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + _system.ServiceAdded += NeoSystem_ServiceAdded_Handler; RpcServerPlugin.RegisterMethods(this, StateServiceSettings.Default.Network); } - void IServiceAddedHandler.NeoSystem_ServiceAdded_Handler(object sender, object service) + void NeoSystem_ServiceAdded_Handler(object? sender, object service) { - if (service is IWalletProvider) + if (service is IWalletProvider provider) { - walletProvider = service as IWalletProvider; - _system.ServiceAdded -= ((IServiceAddedHandler)this).NeoSystem_ServiceAdded_Handler; + walletProvider = provider; + _system.ServiceAdded -= NeoSystem_ServiceAdded_Handler; if (StateServiceSettings.Default.AutoVerify) { - walletProvider.WalletChanged += ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; + walletProvider.WalletChanged += IWalletProvider_WalletChanged_Handler; } } } - void IWalletChangedHandler.IWalletProvider_WalletChanged_Handler(object sender, Wallet wallet) + void IWalletProvider_WalletChanged_Handler(object? sender, Wallet? wallet) { - walletProvider.WalletChanged -= ((IWalletChangedHandler)this).IWalletProvider_WalletChanged_Handler; - Start(wallet); + if (wallet != null) + { + walletProvider!.WalletChanged -= IWalletProvider_WalletChanged_Handler; + Start(wallet); + } } protected override void Dispose(bool disposing) @@ -125,10 +128,10 @@ private void CheckNetwork() private void OnStartVerifyingState() { CheckNetwork(); - Start(walletProvider.GetWallet()); + Start(walletProvider?.GetWallet()); } - public void Start(Wallet wallet) + public void Start(Wallet? wallet) { if (Verifier is not null) { @@ -284,7 +287,7 @@ public JToken GetStateHeight() }; } - private ContractState GetHistoricalContractState(Trie trie, UInt160 scriptHash) + private ContractState? GetHistoricalContractState(Trie trie, UInt160 scriptHash) { const byte prefix = 8; var skey = new KeyBuilder(NativeContract.ContractManagement.Id, prefix).Add(scriptHash); @@ -307,7 +310,7 @@ private void CheckRootHash(UInt256 rootHash) } [RpcMethod] - public JToken FindStates(UInt256 rootHash, UInt160 scriptHash, byte[] prefix, byte[] key = null, int count = 0) + public JToken FindStates(UInt256 rootHash, UInt160 scriptHash, byte[] prefix, byte[]? key = null, int count = 0) { CheckRootHash(rootHash); @@ -339,11 +342,11 @@ public JToken FindStates(UInt256 rootHash, UInt160 scriptHash, byte[] prefix, by } if (0 < jarr.Count) { - json["firstProof"] = GetProof(trie, contract.Id, Convert.FromBase64String(jarr.First()["key"].AsString())); + json["firstProof"] = GetProof(trie, contract.Id, Convert.FromBase64String(jarr.First()!["key"]!.AsString())); } if (1 < jarr.Count) { - json["lastProof"] = GetProof(trie, contract.Id, Convert.FromBase64String(jarr.Last()["key"].AsString())); + json["lastProof"] = GetProof(trie, contract.Id, Convert.FromBase64String(jarr.Last()!["key"]!.AsString())); } json["truncated"] = count < i; json["results"] = jarr; diff --git a/plugins/StateService/StateServiceSettings.cs b/plugins/StateService/StateServiceSettings.cs index 94c3f2865..dc69b3922 100644 --- a/plugins/StateService/StateServiceSettings.cs +++ b/plugins/StateService/StateServiceSettings.cs @@ -21,7 +21,7 @@ internal class StateServiceSettings : IPluginSettings public bool AutoVerify { get; } public int MaxFindResultItems { get; } - public static StateServiceSettings Default { get; private set; } + public static StateServiceSettings Default { get; private set; } = null!; public UnhandledExceptionPolicy ExceptionPolicy { get; } diff --git a/plugins/StateService/Storage/StateSnapshot.cs b/plugins/StateService/Storage/StateSnapshot.cs index 2684caaae..8146d47c9 100644 --- a/plugins/StateService/Storage/StateSnapshot.cs +++ b/plugins/StateService/Storage/StateSnapshot.cs @@ -28,7 +28,7 @@ public StateSnapshot(IStore store) Trie = new Trie(_snapshot, CurrentLocalRootHash(), StateServiceSettings.Default.FullState); } - public StateRoot GetStateRoot(uint index) + public StateRoot? GetStateRoot(uint index) { return _snapshot.TryGet(Keys.StateRoot(index), out var data) ? data.AsSerializable() : null; } @@ -46,7 +46,7 @@ public void AddLocalStateRoot(StateRoot stateRoot) return null; } - public UInt256 CurrentLocalRootHash() + public UInt256? CurrentLocalRootHash() { var index = CurrentLocalRootIndex(); if (index is null) return null; @@ -68,7 +68,7 @@ public void AddValidatedStateRoot(StateRoot stateRoot) return null; } - public UInt256 CurrentValidatedRootHash() + public UInt256? CurrentValidatedRootHash() { var index = CurrentLocalRootIndex(); if (index is null) return null; diff --git a/plugins/StateService/Storage/StateStore.cs b/plugins/StateService/Storage/StateStore.cs index b243012a2..6582de2df 100644 --- a/plugins/StateService/Storage/StateStore.cs +++ b/plugins/StateService/Storage/StateStore.cs @@ -31,7 +31,7 @@ class StateStore : UntypedActor private readonly Dictionary _cache = []; private StateSnapshot _currentSnapshot; private StateSnapshot? _stateSnapshot; - public UInt256 CurrentLocalRootHash => _currentSnapshot.CurrentLocalRootHash(); + public UInt256? CurrentLocalRootHash => _currentSnapshot.CurrentLocalRootHash(); public uint? LocalRootIndex => _currentSnapshot.CurrentLocalRootIndex(); public uint? ValidatedRootIndex => _currentSnapshot.CurrentValidatedRootIndex(); diff --git a/plugins/StateService/Verification/VerificationContext.cs b/plugins/StateService/Verification/VerificationContext.cs index f982730e7..10dddd9c7 100644 --- a/plugins/StateService/Verification/VerificationContext.cs +++ b/plugins/StateService/Verification/VerificationContext.cs @@ -27,11 +27,9 @@ namespace Neo.Plugins.StateService.Verification; class VerificationContext { private const uint MaxValidUntilBlockIncrement = 100; - private StateRoot root; - private ExtensiblePayload rootPayload; - private ExtensiblePayload votePayload; + private ExtensiblePayload? rootPayload; private readonly Wallet wallet; - private readonly KeyPair keyPair; + private readonly KeyPair? keyPair; private readonly int myIndex; private readonly uint rootIndex; private readonly ECPoint[] verifiers; @@ -54,32 +52,24 @@ public int Sender } public bool IsSender => myIndex == Sender; - public ICancelable Timer; + public ICancelable? Timer; - public StateRoot StateRoot + public StateRoot? StateRoot { get { - if (root is null) + if (field is null) { using var snapshot = StateStore.Singleton.GetSnapshot(); - root = snapshot.GetStateRoot(rootIndex); + field = snapshot.GetStateRoot(rootIndex); } - return root; + return field; } } - public ExtensiblePayload StateRootMessage => rootPayload; + public ExtensiblePayload? StateRootMessage => rootPayload; - public ExtensiblePayload VoteMessage - { - get - { - if (votePayload is null) - votePayload = CreateVoteMessage(); - return votePayload; - } - } + public ExtensiblePayload? VoteMessage => field ??= CreateVoteMessage(); public VerificationContext(Wallet wallet, uint index) { @@ -91,20 +81,20 @@ public VerificationContext(Wallet wallet, uint index) if (wallet is null) return; for (int i = 0; i < verifiers.Length; i++) { - WalletAccount account = wallet.GetAccount(verifiers[i]); + WalletAccount? account = wallet.GetAccount(verifiers[i]); if (account?.HasKey != true) continue; myIndex = i; - keyPair = account.GetKey(); + keyPair = account.GetKey()!; break; } } - private ExtensiblePayload CreateVoteMessage() + private ExtensiblePayload? CreateVoteMessage() { if (StateRoot is null) return null; if (!signatures.TryGetValue(myIndex, out var sig)) { - sig = StateRoot.Sign(keyPair, StatePlugin.NeoSystem.Settings.Network); + sig = StateRoot.Sign(keyPair!, StatePlugin.NeoSystem.Settings.Network); signatures[myIndex] = sig; } return CreatePayload(MessageType.Vote, new Vote @@ -143,7 +133,7 @@ public bool CheckSignatures() var sc = new ContractParametersContext(StatePlugin.NeoSystem.StoreView, StateRoot, StatePlugin.NeoSystem.Settings.Network); for (int i = 0, j = 0; i < verifiers.Length && j < M; i++) { - if (!signatures.TryGetValue(i, out byte[] sig)) continue; + if (!signatures.TryGetValue(i, out byte[]? sig)) continue; sc.AddSignature(contract, verifiers[i], sig); j++; } @@ -170,7 +160,7 @@ private ExtensiblePayload CreatePayload(MessageType type, ISerializable payload, var msg = new ExtensiblePayload { Category = StatePlugin.StatePayloadCategory, - ValidBlockStart = StateRoot.Index, + ValidBlockStart = StateRoot!.Index, ValidBlockEnd = StateRoot.Index + validBlockEndThreshold, Sender = Contract.CreateSignatureRedeemScript(verifiers[MyIndex]).ToScriptHash(), Data = data, diff --git a/plugins/StateService/Verification/VerificationService.cs b/plugins/StateService/Verification/VerificationService.cs index 1924ca79b..abe681743 100644 --- a/plugins/StateService/Verification/VerificationService.cs +++ b/plugins/StateService/Verification/VerificationService.cs @@ -56,7 +56,7 @@ private void CheckVotes(VerificationContext context) if (context.IsSender && context.CheckSignatures()) { if (context.StateRootMessage is null) return; - Utility.Log(nameof(VerificationService), LogLevel.Info, $"relay state root, height={context.StateRoot.Index}, root={context.StateRoot.RootHash}"); + Utility.Log(nameof(VerificationService), LogLevel.Info, $"relay state root, height={context.StateRoot!.Index}, root={context.StateRoot.RootHash}"); StatePlugin.NeoSystem.Blockchain.Tell(context.StateRootMessage); } } @@ -98,7 +98,7 @@ private void OnValidatedRootPersisted(uint index) private void OnTimer(uint index) { - if (contexts.TryGetValue(index, out VerificationContext context)) + if (contexts.TryGetValue(index, out VerificationContext? context)) { SendVote(context); CheckVotes(context); diff --git a/plugins/StorageDumper/StorageDumper.csproj b/plugins/StorageDumper/StorageDumper.csproj index 1c4f04f47..262f0b386 100644 --- a/plugins/StorageDumper/StorageDumper.csproj +++ b/plugins/StorageDumper/StorageDumper.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/plugins/TokensTracker/TokensTracker.csproj b/plugins/TokensTracker/TokensTracker.csproj index 68d508e9b..39644fd04 100644 --- a/plugins/TokensTracker/TokensTracker.csproj +++ b/plugins/TokensTracker/TokensTracker.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props index b479c2d9f..3565aa3e6 100644 --- a/tests/Directory.Build.props +++ b/tests/Directory.Build.props @@ -3,6 +3,7 @@ net10.0 + enable enable false diff --git a/tests/Neo.CLI.Tests/UT_MainService_Contracts.cs b/tests/Neo.CLI.Tests/UT_MainService_Contracts.cs index a174339b4..9fdaca7bc 100644 --- a/tests/Neo.CLI.Tests/UT_MainService_Contracts.cs +++ b/tests/Neo.CLI.Tests/UT_MainService_Contracts.cs @@ -24,13 +24,13 @@ namespace Neo.CLI.Tests; [TestClass] public class UT_MainService_Contracts { - private MainService _mainService; - private NeoSystem _neoSystem; - private Mock _mockWallet; - private UInt160 _contractHash; - private ContractState _contractState; - private StringWriter _consoleOutput; - private TextWriter _originalOutput; + private MainService _mainService = null!; + private NeoSystem _neoSystem = null!; + private Mock _mockWallet = null!; + private UInt160 _contractHash = null!; + private ContractState _contractState = null!; + private StringWriter _consoleOutput = null!; + private TextWriter _originalOutput = null!; [TestInitialize] public void TestSetup() @@ -53,7 +53,7 @@ public void TestSetup() // Setup mock wallet _mockWallet = new Mock(); - var mockAccount = new Mock(UInt160.Zero, null); + var mockAccount = new Mock(UInt160.Zero, null!); _mockWallet.Setup(w => w.GetDefaultAccount()).Returns(mockAccount.Object); // Set CurrentWallet using reflection @@ -184,12 +184,12 @@ public void TestParseParameterFromAbi_Boolean() var method = GetPrivateMethod("ParseParameterFromAbi"); // Test true value - var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Boolean, JToken.Parse("true")]); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Boolean, JToken.Parse("true")])!; Assert.AreEqual(ContractParameterType.Boolean, result.Type); Assert.IsTrue((bool?)result.Value); // Test false value - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Boolean, JToken.Parse("false") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Boolean, JToken.Parse("false")])!; Assert.AreEqual(ContractParameterType.Boolean, result.Type); Assert.IsFalse((bool?)result.Value); } @@ -200,17 +200,17 @@ public void TestParseParameterFromAbi_Integer() var method = GetPrivateMethod("ParseParameterFromAbi"); // Test positive integer - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Integer, JToken.Parse("\"123\"") }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Integer, JToken.Parse("\"123\"")])!; Assert.AreEqual(ContractParameterType.Integer, result.Type); Assert.AreEqual(new BigInteger(123), result.Value); // Test negative integer - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Integer, JToken.Parse("\"-456\"") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Integer, JToken.Parse("\"-456\"")])!; Assert.AreEqual(ContractParameterType.Integer, result.Type); Assert.AreEqual(new BigInteger(-456), result.Value); // Test large integer - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Integer, JToken.Parse("\"999999999999999999999\"") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Integer, JToken.Parse("\"999999999999999999999\"")])!; Assert.AreEqual(ContractParameterType.Integer, result.Type); Assert.AreEqual(BigInteger.Parse("999999999999999999999"), result.Value); } @@ -220,12 +220,12 @@ public void TestParseParameterFromAbi_String() { var method = GetPrivateMethod("ParseParameterFromAbi"); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.String, JToken.Parse("\"Hello, World!\"") }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.String, JToken.Parse("\"Hello, World!\"")])!; Assert.AreEqual(ContractParameterType.String, result.Type); Assert.AreEqual("Hello, World!", result.Value); // Test empty string - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.String, JToken.Parse("\"\"") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.String, JToken.Parse("\"\"")])!; Assert.AreEqual(ContractParameterType.String, result.Type); Assert.AreEqual("", result.Value); } @@ -236,7 +236,7 @@ public void TestParseParameterFromAbi_Hash160() var method = GetPrivateMethod("ParseParameterFromAbi"); var hash160 = "0x1234567890abcdef1234567890abcdef12345678"; - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Hash160, JToken.Parse($"\"{hash160}\"") }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Hash160, JToken.Parse($"\"{hash160}\"")])!; Assert.AreEqual(ContractParameterType.Hash160, result.Type); Assert.AreEqual(UInt160.Parse(hash160), result.Value); } @@ -247,9 +247,9 @@ public void TestParseParameterFromAbi_ByteArray() var method = GetPrivateMethod("ParseParameterFromAbi"); var base64 = Convert.ToBase64String(new byte[] { 0x01, 0x02, 0x03, 0x04 }); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.ByteArray, JToken.Parse($"\"{base64}\"") }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.ByteArray, JToken.Parse($"\"{base64}\"")])!; Assert.AreEqual(ContractParameterType.ByteArray, result.Type); - CollectionAssert.AreEqual(new byte[] { 0x01, 0x02, 0x03, 0x04 }, (byte[])result.Value); + CollectionAssert.AreEqual(new byte[] { 0x01, 0x02, 0x03, 0x04 }, (byte[])result.Value!); } [TestMethod] @@ -258,10 +258,10 @@ public void TestParseParameterFromAbi_Array() var method = GetPrivateMethod("ParseParameterFromAbi"); var arrayJson = "[1, \"hello\", true]"; - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Array, JToken.Parse(arrayJson) }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Array, JToken.Parse(arrayJson)])!; Assert.AreEqual(ContractParameterType.Array, result.Type); - var array = (ContractParameter[])result.Value; + var array = (ContractParameter[])result.Value!; Assert.HasCount(3, array); Assert.AreEqual(ContractParameterType.Integer, array[0].Type); Assert.AreEqual(ContractParameterType.String, array[1].Type); @@ -274,10 +274,10 @@ public void TestParseParameterFromAbi_Map() var method = GetPrivateMethod("ParseParameterFromAbi"); var mapJson = "{\"key1\": \"value1\", \"key2\": 123}"; - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Map, JToken.Parse(mapJson) }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Map, JToken.Parse(mapJson)])!; Assert.AreEqual(ContractParameterType.Map, result.Type); - var map = (List>)result.Value; + var map = (List>)result.Value!; Assert.HasCount(2, map); Assert.AreEqual("key1", map[0].Key.Value); Assert.AreEqual("value1", map[0].Value.Value); @@ -291,24 +291,24 @@ public void TestParseParameterFromAbi_Any() var method = GetPrivateMethod("ParseParameterFromAbi"); // Test Any with boolean - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, JToken.Parse("true") }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, JToken.Parse("true")])!; Assert.AreEqual(ContractParameterType.Boolean, result.Type); Assert.IsTrue((bool?)result.Value); // Test Any with integer - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, JToken.Parse("123") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, JToken.Parse("123")])!; Assert.AreEqual(ContractParameterType.Integer, result.Type); Assert.AreEqual(new BigInteger(123), result.Value); // Test Any with string - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, JToken.Parse("\"test\"") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, JToken.Parse("\"test\"")])!; Assert.AreEqual(ContractParameterType.String, result.Type); Assert.AreEqual("test", result.Value); // Test Any with array - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, JToken.Parse("[1, 2, 3]") }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, JToken.Parse("[1, 2, 3]")])!; Assert.AreEqual(ContractParameterType.Array, result.Type); - Assert.HasCount(3, (ContractParameter[])result.Value); + Assert.HasCount(3, (ContractParameter[])result.Value!); } [TestMethod] @@ -316,11 +316,11 @@ public void TestParseParameterFromAbi_Null() { var method = GetPrivateMethod("ParseParameterFromAbi"); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.String, null }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.String, null])!; Assert.AreEqual(ContractParameterType.String, result.Type); Assert.IsNull(result.Value); - result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.String, JToken.Null }); + result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.String, JToken.Null])!; Assert.AreEqual(ContractParameterType.String, result.Type); Assert.IsNull(result.Value); } @@ -332,7 +332,7 @@ public void TestParseParameterFromAbi_InvalidInteger() // This should throw because "abc" is not a valid integer Assert.ThrowsExactly(() => - method.Invoke(_mainService, new object[] { ContractParameterType.Integer, JToken.Parse("\"abc\"") })); + method.Invoke(_mainService, [ContractParameterType.Integer, JToken.Parse("\"abc\"")])); } [TestMethod] @@ -342,7 +342,7 @@ public void TestParseParameterFromAbi_InvalidHash160() // This should throw because the hash is invalid Assert.ThrowsExactly(() => - method.Invoke(_mainService, new object[] { ContractParameterType.Hash160, JToken.Parse("\"invalid_hash\"") })); + method.Invoke(_mainService, [ContractParameterType.Hash160, JToken.Parse("\"invalid_hash\"")])); } [TestMethod] @@ -352,7 +352,7 @@ public void TestParseParameterFromAbi_UnsupportedType() // InteropInterface is not supported for JSON parsing Assert.ThrowsExactly(() => - method.Invoke(_mainService, new object[] { ContractParameterType.InteropInterface, JToken.Parse("\"test\"") })); + method.Invoke(_mainService, [ContractParameterType.InteropInterface, JToken.Parse("\"test\"")])); } private static MethodInfo GetPrivateMethod(string methodName) @@ -373,7 +373,7 @@ public void TestInvokeAbiCommand_ContractNotFound() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { nonExistentHash, "test", null, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [nonExistentHash, "test", null, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -388,7 +388,7 @@ public void TestInvokeAbiCommand_MethodNotFound() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "nonExistentMethod", null, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "nonExistentMethod", null, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -404,7 +404,7 @@ public void TestInvokeAbiCommand_WrongParameterCount() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testBoolean", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testBoolean", args, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -420,7 +420,7 @@ public void TestInvokeAbiCommand_TooManyArguments() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testMultipleParams", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testMultipleParams", args, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -436,7 +436,7 @@ public void TestInvokeAbiCommand_TooFewArguments() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testMultipleParams", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testMultipleParams", args, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -451,7 +451,7 @@ public void TestInvokeAbiCommand_NoArgumentsForMethodExpectingParameters() // Act - calling testBoolean with no arguments when it expects 1 var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testBoolean", null, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testBoolean", null, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -467,7 +467,7 @@ public void TestInvokeAbiCommand_InvalidParameterFormat() // Act var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testHash160", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testHash160", args, null, null, 20m]); // Assert var output = _consoleOutput.ToString(); @@ -488,7 +488,7 @@ public void TestInvokeAbiCommand_SuccessfulInvocation_SingleParameter() var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); try { - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testBoolean", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testBoolean", args, null, null, 20m]); } catch (TargetInvocationException ex) when (ex.InnerException?.Message.Contains("This method does not not exist") == true) { @@ -524,7 +524,7 @@ public void TestInvokeAbiCommand_ComplexTypes() var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); try { - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testArray", arrayArgs, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testArray", arrayArgs, null, null, 20m]); } catch (TargetInvocationException) { @@ -551,7 +551,7 @@ public void TestInvokeAbiCommand_MultipleParameters() var invokeAbiMethod = GetPrivateMethod("OnInvokeAbiCommand"); try { - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "testMultipleParams", args, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "testMultipleParams", args, null, null, 20m]); } catch (TargetInvocationException) { @@ -596,7 +596,7 @@ public void TestParseParameterFromAbi_ImprovedErrorMessages() // Test invalid integer format with helpful error try { - method.Invoke(_mainService, new object[] { ContractParameterType.Integer, JToken.Parse("\"abc\"") }); + method.Invoke(_mainService, [ContractParameterType.Integer, JToken.Parse("\"abc\"")]); Assert.Fail("Expected exception for invalid integer"); } catch (TargetInvocationException ex) @@ -609,7 +609,7 @@ public void TestParseParameterFromAbi_ImprovedErrorMessages() // Test invalid Hash160 format with helpful error try { - method.Invoke(_mainService, new object[] { ContractParameterType.Hash160, JToken.Parse("\"invalid\"") }); + method.Invoke(_mainService, [ContractParameterType.Hash160, JToken.Parse("\"invalid\"")]); Assert.Fail("Expected exception for invalid Hash160"); } catch (TargetInvocationException ex) @@ -623,7 +623,7 @@ public void TestParseParameterFromAbi_ImprovedErrorMessages() // Test invalid Base64 format with helpful error try { - method.Invoke(_mainService, new object[] { ContractParameterType.ByteArray, JToken.Parse("\"not-base64!@#$\"") }); + method.Invoke(_mainService, [ContractParameterType.ByteArray, JToken.Parse("\"not-base64!@#$\"")]); Assert.Fail("Expected exception for invalid Base64"); } catch (TargetInvocationException ex) @@ -641,10 +641,10 @@ public void TestParseParameterFromAbi_ContractParameterObjects() // Test parsing an array with ContractParameter objects (the issue from superboyiii) var arrayWithContractParam = JToken.Parse(@"[4, [{""type"":""PublicKey"",""value"":""0244d12f3e6b8eba7d0bc0cf0c176d9df545141f4d3447f8463c1b16afb90b1ea8""}]]"); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Array, arrayWithContractParam }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Array, arrayWithContractParam])!; Assert.AreEqual(ContractParameterType.Array, result.Type); - var array = (ContractParameter[])result.Value; + var array = (ContractParameter[])result.Value!; Assert.HasCount(2, array); // First element should be Integer @@ -653,7 +653,7 @@ public void TestParseParameterFromAbi_ContractParameterObjects() // Second element should be Array containing a PublicKey Assert.AreEqual(ContractParameterType.Array, array[1].Type); - var innerArray = (ContractParameter[])array[1].Value; + var innerArray = (ContractParameter[])array[1].Value!; Assert.HasCount(1, innerArray); Assert.AreEqual(ContractParameterType.PublicKey, innerArray[0].Type); @@ -669,13 +669,13 @@ public void TestParseParameterFromAbi_RegularMapVsContractParameter() // Test regular map (should be treated as Map) var regularMap = JToken.Parse(@"{""key1"": ""value1"", ""key2"": 123}"); - var mapResult = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, regularMap }); + var mapResult = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, regularMap])!; Assert.AreEqual(ContractParameterType.Map, mapResult.Type); // Test ContractParameter object with Any type - should be treated as Map since we only parse // ContractParameter format inside arrays var contractParamObj = JToken.Parse(@"{""type"": ""String"", ""value"": ""test""}"); - var paramResult = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Any, contractParamObj }); + var paramResult = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Any, contractParamObj])!; Assert.AreEqual(ContractParameterType.Map, paramResult.Type); } @@ -691,10 +691,10 @@ public void TestParseParameterFromAbi_MapWithContractParameterFormat() ""key3"": ""simple string"" }"); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Map, mapWithContractParams }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Map, mapWithContractParams])!; Assert.AreEqual(ContractParameterType.Map, result.Type); - var map = (List>)result.Value; + var map = (List>)result.Value!; Assert.HasCount(3, map); // Check each key-value pair @@ -731,10 +731,10 @@ public void TestParseParameterFromAbi_CompleteContractParameterMap() ] }"); - var result = (ContractParameter)method.Invoke(_mainService, new object[] { ContractParameterType.Map, completeMapFormat }); + var result = (ContractParameter)method.Invoke(_mainService, [ContractParameterType.Map, completeMapFormat])!; Assert.AreEqual(ContractParameterType.Map, result.Type); - var map = (List>)result.Value; + var map = (List>)result.Value!; Assert.HasCount(2, map); Assert.AreEqual("name", map[0].Key.Value); @@ -792,7 +792,7 @@ public void TestInvokeAbiCommand_MethodOverloading() try { - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "transfer", args2, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "transfer", args2, null, null, 20m]); } catch (TargetInvocationException) { @@ -807,7 +807,7 @@ public void TestInvokeAbiCommand_MethodOverloading() _consoleOutput.GetStringBuilder().Clear(); var args4 = new JArray("0x1234567890abcdef1234567890abcdef12345678", "0xabcdef1234567890abcdef1234567890abcdef12", 100, "extra"); - invokeAbiMethod.Invoke(_mainService, new object[] { _contractHash, "transfer", args4, null, null, 20m }); + invokeAbiMethod.Invoke(_mainService, [_contractHash, "transfer", args4, null, null, 20m]); output = _consoleOutput.ToString(); Assert.IsTrue(output.Contains("Method 'transfer' exists but expects") || output.Contains("expects exactly")); diff --git a/tests/Neo.ConsoleService.Tests/UT_CommandServiceBase.cs b/tests/Neo.ConsoleService.Tests/UT_CommandServiceBase.cs index 6ff8b81ff..0458807ed 100644 --- a/tests/Neo.ConsoleService.Tests/UT_CommandServiceBase.cs +++ b/tests/Neo.ConsoleService.Tests/UT_CommandServiceBase.cs @@ -53,7 +53,7 @@ public enum TestEnum { Value1, Value2, Value3 } public void TestParseIndicatorArguments() { var service = new TestConsoleService(); - var method = typeof(TestConsoleService).GetMethod("TestMethod"); + var method = typeof(TestConsoleService).GetMethod("TestMethod")!; // Test case 1: Basic indicator arguments var args1 = "test --strParam hello --intParam 42 --boolParam".Tokenize(); @@ -77,7 +77,7 @@ public void TestParseIndicatorArguments() Assert.ThrowsExactly(() => service.ParseIndicatorArguments(method, args2[1..])); // Test case 3: Enum parameter - var enumMethod = typeof(TestConsoleService).GetMethod("TestEnumMethod"); + var enumMethod = typeof(TestConsoleService).GetMethod("TestEnumMethod")!; var args3 = "testenum --enumParam Value2".Tokenize(); var result3 = service.ParseIndicatorArguments(enumMethod, args3[1..]); Assert.HasCount(1, result3); @@ -96,7 +96,7 @@ public void TestParseIndicatorArguments() public void TestParseSequentialArguments() { var service = new TestConsoleService(); - var method = typeof(TestConsoleService).GetMethod("TestMethod"); + var method = typeof(TestConsoleService).GetMethod("TestMethod")!; // Test case 1: All parameters provided var args1 = "test hello 42 true custom".Tokenize(); @@ -117,7 +117,7 @@ public void TestParseSequentialArguments() Assert.AreEqual("default", result2[3]); // optionalParam default value // Test case 3: Enum parameter - var enumMethod = typeof(TestConsoleService).GetMethod("TestEnumMethod"); + var enumMethod = typeof(TestConsoleService).GetMethod("TestEnumMethod")!; var args3 = "testenum Value1".Tokenize(); var result3 = service.ParseSequentialArguments(enumMethod, args3[1..].Trim()); Assert.HasCount(1, result3); diff --git a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Cache.cs b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Cache.cs index f5bddb8aa..fa6149f95 100644 --- a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Cache.cs +++ b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Cache.cs @@ -28,7 +28,7 @@ public void TestResolveLeaf() store.Put(n.Hash.ToKey(), n.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var resolved = cache.Resolve(n.Hash); + var resolved = cache.Resolve(n.Hash)!; Assert.AreEqual(n.Hash, resolved.Hash); Assert.AreEqual(n.Value.Span.ToHexString(), resolved.Value.Span.ToHexString()); } @@ -44,10 +44,10 @@ public void TestResolveBranch() store.Put(l.Hash.ToKey(), l.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var resolved_b = cache.Resolve(b.Hash); + var resolved_b = cache.Resolve(b.Hash)!; Assert.AreEqual(b.Hash, resolved_b.Hash); Assert.AreEqual(l.Hash, resolved_b.Children[1].Hash); - var resolved_l = cache.Resolve(l.Hash); + var resolved_l = cache.Resolve(l.Hash)!; Assert.AreEqual(l.Value.Span.ToHexString(), resolved_l.Value.Span.ToHexString()); } @@ -59,10 +59,10 @@ public void TestResolveExtension() store.Put(e.Hash.ToKey(), e.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var re = cache.Resolve(e.Hash); + var re = cache.Resolve(e.Hash)!; Assert.AreEqual(e.Hash, re.Hash); Assert.AreEqual(e.Key.Span.ToHexString(), re.Key.Span.ToHexString()); - Assert.IsTrue(re.Next.IsEmpty); + Assert.IsTrue(re.Next!.IsEmpty); } [TestMethod] @@ -74,7 +74,7 @@ public void TestGetAndChangedBranch() store.Put(b.Hash.ToKey(), b.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var resolved_b = cache.Resolve(b.Hash); + var resolved_b = cache.Resolve(b.Hash)!; Assert.AreEqual(resolved_b.Hash, b.Hash); foreach (var n in resolved_b.Children) { @@ -82,7 +82,7 @@ public void TestGetAndChangedBranch() } resolved_b.Children[1] = l; resolved_b.SetDirty(); - var resovled_b1 = cache.Resolve(b.Hash); + var resovled_b1 = cache.Resolve(b.Hash)!; Assert.AreEqual(resovled_b1.Hash, b.Hash); foreach (var n in resovled_b1.Children) { @@ -98,16 +98,16 @@ public void TestGetAndChangedExtension() store.Put(e.Hash.ToKey(), e.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var re = cache.Resolve(e.Hash); + var re = cache.Resolve(e.Hash)!; Assert.AreEqual(e.Hash, re.Hash); Assert.AreEqual(e.Key.Span.ToHexString(), re.Key.Span.ToHexString()); - Assert.IsTrue(re.Next.IsEmpty); + Assert.IsTrue(re.Next!.IsEmpty); re.Key = new byte[] { 0x02 }; re.SetDirty(); - var re1 = cache.Resolve(e.Hash); + var re1 = cache.Resolve(e.Hash)!; Assert.AreEqual(e.Hash, re1.Hash); Assert.AreEqual(e.Key.Span.ToHexString(), re1.Key.Span.ToHexString()); - Assert.IsTrue(re1.Next.IsEmpty); + Assert.IsTrue(re1.Next!.IsEmpty); } [TestMethod] @@ -118,12 +118,12 @@ public void TestGetAndChangedLeaf() store.Put(l.Hash.ToKey(), l.ToArray()); var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); - var rl = cache.Resolve(l.Hash); + var rl = cache.Resolve(l.Hash)!; Assert.AreEqual(l.Hash, rl.Hash); Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl.Value.Span)); rl.Value = new byte[] { 0x01 }; rl.SetDirty(); - var rl1 = cache.Resolve(l.Hash); + var rl1 = cache.Resolve(l.Hash)!; Assert.AreEqual(l.Hash, rl1.Hash); Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl1.Value.Span)); } @@ -138,7 +138,7 @@ public void TestPutAndChangedBranch() var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); cache.PutNode(b); - var rb = cache.Resolve(h); + var rb = cache.Resolve(h)!; Assert.AreEqual(h, rb.Hash); foreach (var n in rb.Children) { @@ -146,7 +146,7 @@ public void TestPutAndChangedBranch() } rb.Children[1] = l; rb.SetDirty(); - var rb1 = cache.Resolve(h); + var rb1 = cache.Resolve(h)!; Assert.AreEqual(h, rb1.Hash); foreach (var n in rb1.Children) { @@ -163,17 +163,17 @@ public void TestPutAndChangedExtension() var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); cache.PutNode(e); - var re = cache.Resolve(e.Hash); + var re = cache.Resolve(e.Hash)!; Assert.AreEqual(e.Hash, re.Hash); Assert.AreEqual(e.Key.Span.ToHexString(), re.Key.Span.ToHexString()); - Assert.IsTrue(re.Next.IsEmpty); + Assert.IsTrue(re.Next!.IsEmpty); e.Key = new byte[] { 0x02 }; e.Next = e; e.SetDirty(); - var re1 = cache.Resolve(h); + var re1 = cache.Resolve(h)!; Assert.AreEqual(h, re1.Hash); Assert.AreEqual("01", re1.Key.Span.ToHexString()); - Assert.IsTrue(re1.Next.IsEmpty); + Assert.IsTrue(re1.Next!.IsEmpty); } [TestMethod] @@ -185,12 +185,12 @@ public void TestPutAndChangedLeaf() var snapshot = store.GetSnapshot(); var cache = new Cache(snapshot, Prefix); cache.PutNode(l); - var rl = cache.Resolve(l.Hash); + var rl = cache.Resolve(l.Hash)!; Assert.AreEqual(h, rl.Hash); Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl.Value.Span)); l.Value = new byte[] { 0x01 }; l.SetDirty(); - var rl1 = cache.Resolve(h); + var rl1 = cache.Resolve(h)!; Assert.AreEqual(h, rl1.Hash); Assert.AreEqual("leaf", Encoding.ASCII.GetString(rl1.Value.Span)); } @@ -212,7 +212,7 @@ public void TestReference1() snapshot1.Commit(); var snapshot2 = store.GetSnapshot(); var cache2 = new Cache(snapshot2, Prefix); - var rl = cache2.Resolve(l.Hash); + var rl = cache2.Resolve(l.Hash)!; Assert.AreEqual(2, rl.Reference); } @@ -226,7 +226,7 @@ public void TestReference2() cache.PutNode(l); cache.PutNode(l); cache.DeleteNode(l.Hash); - var rl = cache.Resolve(l.Hash); + var rl = cache.Resolve(l.Hash)!; Assert.AreEqual(1, rl.Reference); } } diff --git a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Node.cs b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Node.cs index 24dca3299..e8c32064a 100644 --- a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Node.cs +++ b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Node.cs @@ -35,10 +35,10 @@ public void TestLogLevel() int raised = 0; Utility.Logging += (a, b, c) => raised++; - Utility.Log("a", LogLevel.Warning, null); + Utility.Log("a", LogLevel.Warning, "null"); Assert.AreEqual(1, raised); Utility.LogLevel = LogLevel.Fatal; - Utility.Log("a", LogLevel.Warning, null); + Utility.Log("a", LogLevel.Warning, "null"); Assert.AreEqual(1, raised); } @@ -153,7 +153,7 @@ public void TestCloneExtension() var n = Node.NewExtension(new byte[] { 0x01 }, new Node()); var n1 = n.Clone(); n1.Next = l; - Assert.IsTrue(n.Next.IsEmpty); + Assert.IsTrue(n.Next!.IsEmpty); } [TestMethod] @@ -168,23 +168,9 @@ public void TestCloneLeaf() [TestMethod] public void TestNewExtensionException() { - Assert.ThrowsExactly(() => _ = Node.NewExtension(null, new Node())); - Assert.ThrowsExactly(() => _ = Node.NewExtension(new byte[] { 0x01 }, null)); Assert.ThrowsExactly(() => _ = Node.NewExtension(Array.Empty(), new Node())); } - [TestMethod] - public void TestNewHashException() - { - Assert.ThrowsExactly(() => _ = Node.NewHash(null)); - } - - [TestMethod] - public void TestNewLeafException() - { - Assert.ThrowsExactly(() => _ = Node.NewLeaf(null)); - } - [TestMethod] public void TestSize() { diff --git a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs index 9124de0ad..0728d4dbf 100644 --- a/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs +++ b/tests/Neo.Cryptography.MPTTrie.Tests/Cryptography/MPTTrie/UT_Trie.cs @@ -12,6 +12,7 @@ using Neo.Extensions.IO; using Neo.Persistence; using Neo.Persistence.Providers; +using System.Diagnostics.CodeAnalysis; using System.Text; namespace Neo.Cryptography.MPTTrie.Tests; @@ -41,16 +42,16 @@ public void Delete(byte[] key) public bool Contains(byte[] key) { throw new NotImplementedException(); } - public IEnumerable<(byte[] Key, byte[] Value)> Find(byte[] key, SeekDirection direction) { throw new NotImplementedException(); } + public IEnumerable<(byte[] Key, byte[] Value)> Find(byte[]? key, SeekDirection direction) { throw new NotImplementedException(); } - public byte[] TryGet(byte[] key) + public byte[]? TryGet(byte[] key) { - var result = _store.TryGetValue(StoreKey(key), out byte[] value); + var result = _store.TryGetValue(StoreKey(key), out byte[]? value); if (result) return value; return null; } - public bool TryGet(byte[] key, out byte[] value) + public bool TryGet(byte[] key, [NotNullWhen(true)] out byte[]? value) { return _store.TryGetValue(StoreKey(key), out value); } @@ -63,8 +64,8 @@ public bool TryGet(byte[] key, out byte[] value) [TestClass] public class UT_Trie { - private Node _root; - private IStore _mptdb; + private Node _root = null!; + private IStore _mptdb = null!; private void PutToStore(IStore store, Node node) { diff --git a/tests/Neo.Network.RPC.Tests/TestUtils.cs b/tests/Neo.Network.RPC.Tests/TestUtils.cs index 5cc03e818..c8784b5b6 100644 --- a/tests/Neo.Network.RPC.Tests/TestUtils.cs +++ b/tests/Neo.Network.RPC.Tests/TestUtils.cs @@ -17,7 +17,7 @@ namespace Neo.Network.RPC.Tests; internal static class TestUtils { - public readonly static List RpcTestCases = ((JArray)JToken.Parse(File.ReadAllText("RpcTestCases.json"))).Select(p => RpcTestCase.FromJson((JObject)p)).ToList(); + public readonly static List RpcTestCases = ((JArray)JToken.Parse(File.ReadAllText("RpcTestCases.json"))!).Select(p => RpcTestCase.FromJson((JObject)p!)).ToList(); public static Block GetBlock(int txCount) { @@ -53,9 +53,9 @@ public static Transaction GetTransaction() internal class RpcTestCase { - public string Name { get; set; } - public RpcRequest Request { get; set; } - public RpcResponse Response { get; set; } + public required string Name { get; set; } + public required RpcRequest Request { get; set; } + public required RpcResponse Response { get; set; } public JObject ToJson() { @@ -71,9 +71,9 @@ public static RpcTestCase FromJson(JObject json) { return new RpcTestCase { - Name = json["Name"].AsString(), - Request = RpcRequest.FromJson((JObject)json["Request"]), - Response = RpcResponse.FromJson((JObject)json["Response"]), + Name = json["Name"]!.AsString(), + Request = RpcRequest.FromJson((JObject)json["Request"]!), + Response = RpcResponse.FromJson((JObject)json["Response"]!), }; } diff --git a/tests/Neo.Network.RPC.Tests/UT_ContractClient.cs b/tests/Neo.Network.RPC.Tests/UT_ContractClient.cs index c14952934..1ca007294 100644 --- a/tests/Neo.Network.RPC.Tests/UT_ContractClient.cs +++ b/tests/Neo.Network.RPC.Tests/UT_ContractClient.cs @@ -23,9 +23,9 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_ContractClient { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; + Mock rpcClientMock = null!; + KeyPair keyPair1 = null!; + UInt160 sender = null!; [TestInitialize] public void TestSetup() diff --git a/tests/Neo.Network.RPC.Tests/UT_Nep17API.cs b/tests/Neo.Network.RPC.Tests/UT_Nep17API.cs index 507ec4715..a98460cec 100644 --- a/tests/Neo.Network.RPC.Tests/UT_Nep17API.cs +++ b/tests/Neo.Network.RPC.Tests/UT_Nep17API.cs @@ -23,10 +23,10 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_Nep17API { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; - Nep17API nep17API; + Mock rpcClientMock = null!; + KeyPair keyPair1 = null!; + UInt160 sender = null!; + Nep17API nep17API = null!; [TestInitialize] public void TestSetup() @@ -105,10 +105,10 @@ .. scriptHash.MakeScript("decimals"), var haveNeoTokenUT = false; foreach (var test in tests) { - rpcClientMock.Setup(p => p.RpcSendAsync("getcontractstate", It.Is(u => true))) - .ReturnsAsync(test.Response.Result) - .Verifiable(); - if (test.Request.Params[0].AsString() == NativeContract.GAS.Hash.ToString() || test.Request.Params[0].AsString().Equals(NativeContract.GAS.Name, StringComparison.OrdinalIgnoreCase)) + rpcClientMock.Setup(p => p.RpcSendAsync("getcontractstate", It.Is(u => true))) + .ReturnsAsync(test.Response.Result!) + .Verifiable(); + if (test.Request.Params[0]!.AsString() == NativeContract.GAS.Hash.ToString() || test.Request.Params[0]!.AsString().Equals(NativeContract.GAS.Name, StringComparison.OrdinalIgnoreCase)) { var result = await nep17API.GetTokenInfoAsync(NativeContract.GAS.Name.ToLower()); Assert.AreEqual(NativeContract.GAS.Symbol, result.Symbol); @@ -123,7 +123,7 @@ .. scriptHash.MakeScript("decimals"), Assert.AreEqual("GasToken", result.Name); haveGasTokenUT = true; } - else if (test.Request.Params[0].AsString() == NativeContract.NEO.Hash.ToString() || test.Request.Params[0].AsString().Equals(NativeContract.NEO.Name, StringComparison.OrdinalIgnoreCase)) + else if (test.Request.Params[0]!.AsString() == NativeContract.NEO.Hash.ToString() || test.Request.Params[0]!.AsString().Equals(NativeContract.NEO.Name, StringComparison.OrdinalIgnoreCase)) { var result = await nep17API.GetTokenInfoAsync(NativeContract.NEO.Name.ToLower()); Assert.AreEqual(NativeContract.NEO.Symbol, result.Symbol); diff --git a/tests/Neo.Network.RPC.Tests/UT_PolicyAPI.cs b/tests/Neo.Network.RPC.Tests/UT_PolicyAPI.cs index 798eb7eea..00f32f7c0 100644 --- a/tests/Neo.Network.RPC.Tests/UT_PolicyAPI.cs +++ b/tests/Neo.Network.RPC.Tests/UT_PolicyAPI.cs @@ -21,10 +21,10 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_PolicyAPI { - Mock rpcClientMock; - KeyPair keyPair1; - UInt160 sender; - PolicyAPI policyAPI; + Mock rpcClientMock = null!; + KeyPair keyPair1 = null!; + UInt160 sender = null!; + PolicyAPI policyAPI = null!; [TestInitialize] public void TestSetup() diff --git a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs index 8728eb235..2ed4d6d09 100644 --- a/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs +++ b/tests/Neo.Network.RPC.Tests/UT_RpcClient.cs @@ -23,8 +23,8 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_RpcClient { - RpcClient rpc; - Mock handlerMock; + RpcClient rpc = null!; + Mock handlerMock = null!; [TestInitialize] public void TestSetup() @@ -46,7 +46,7 @@ private void MockResponse(RpcRequest request, RpcResponse response) // Setup the PROTECTED method to mock .Setup>( "SendAsync", - ItExpr.Is(p => p.Content.ReadAsStringAsync().Result == request.ToJson().ToString()), + ItExpr.Is(p => p.Content!.ReadAsStringAsync().Result == request.ToJson().ToString()), ItExpr.IsAny() ) // prepare the expected response of the mocked http call @@ -61,10 +61,10 @@ private void MockResponse(RpcRequest request, RpcResponse response) [TestMethod] public async Task TestErrorResponse() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync) + "error", StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync) + "error", StringComparison.CurrentCultureIgnoreCase))!; try { - var result = await rpc.SendRawTransactionAsync(Convert.FromBase64String(test.Request.Params[0].AsString()).AsSerializable()); + var result = await rpc.SendRawTransactionAsync(Convert.FromBase64String(test.Request.Params[0]!.AsString()).AsSerializable()); } catch (RpcException ex) { @@ -76,7 +76,7 @@ public async Task TestErrorResponse() [TestMethod] public async Task TestNoThrowErrorResponse() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync) + "error", StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync) + "error", StringComparison.CurrentCultureIgnoreCase))!; handlerMock = new Mock(MockBehavior.Strict); handlerMock.Protected() // Setup the PROTECTED method to mock @@ -130,9 +130,9 @@ public void TestConstructorWithBasicAuth() [TestMethod] public async Task TestGetBestBlockHash() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBestBlockHashAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBestBlockHashAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetBestBlockHashAsync(); - Assert.AreEqual(test.Response.Result.AsString(), result); + Assert.AreEqual(test.Response.Result!.AsString(), result); } [TestMethod] @@ -141,8 +141,8 @@ public async Task TestGetBlockHex() var tests = TestUtils.RpcTestCases.Where(p => p.Name.Equals(nameof(rpc.GetBlockHexAsync), StringComparison.CurrentCultureIgnoreCase)); foreach (var test in tests) { - var result = await rpc.GetBlockHexAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result); + var result = await rpc.GetBlockHexAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result); } } @@ -152,33 +152,33 @@ public async Task TestGetBlock() var tests = TestUtils.RpcTestCases.Where(p => p.Name.Equals(nameof(rpc.GetBlockAsync), StringComparison.CurrentCultureIgnoreCase)); foreach (var test in tests) { - var result = await rpc.GetBlockAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result.ToJson(rpc.protocolSettings).ToString()); + var result = await rpc.GetBlockAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result.ToJson(rpc.protocolSettings).ToString()); } } [TestMethod] public async Task TestGetBlockHeaderCount() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockHeaderCountAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockHeaderCountAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetBlockHeaderCountAsync(); - Assert.AreEqual(test.Response.Result.AsString(), result.ToString()); + Assert.AreEqual(test.Response.Result!.AsString(), result.ToString()); } [TestMethod] public async Task TestGetBlockCount() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockCountAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockCountAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetBlockCountAsync(); - Assert.AreEqual(test.Response.Result.AsString(), result.ToString()); + Assert.AreEqual(test.Response.Result!.AsString(), result.ToString()); } [TestMethod] public async Task TestGetBlockHash() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockHashAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetBlockHashAsync((uint)test.Request.Params[0].AsNumber()); - Assert.AreEqual(test.Response.Result.AsString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetBlockHashAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetBlockHashAsync((uint)test.Request.Params[0]!.AsNumber()); + Assert.AreEqual(test.Response.Result!.AsString(), result.ToString()); } [TestMethod] @@ -187,8 +187,8 @@ public async Task TestGetBlockHeaderHex() var tests = TestUtils.RpcTestCases.Where(p => p.Name.Equals(nameof(rpc.GetBlockHeaderHexAsync), StringComparison.CurrentCultureIgnoreCase)); foreach (var test in tests) { - var result = await rpc.GetBlockHeaderHexAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result); + var result = await rpc.GetBlockHeaderHexAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result); } } @@ -198,8 +198,8 @@ public async Task TestGetBlockHeader() var tests = TestUtils.RpcTestCases.Where(p => p.Name.Equals(nameof(rpc.GetBlockHeaderAsync), StringComparison.CurrentCultureIgnoreCase)); foreach (var test in tests) { - var result = await rpc.GetBlockHeaderAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson(rpc.protocolSettings).ToString()); + var result = await rpc.GetBlockHeaderAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson(rpc.protocolSettings).ToString()); } } @@ -210,7 +210,7 @@ public async Task TestGetCommittee() foreach (var test in tests) { var result = await rpc.GetCommitteeAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => (JToken)p).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => (JToken)p).ToArray()).ToString()); } } @@ -220,16 +220,16 @@ public async Task TestGetContractState() var tests = TestUtils.RpcTestCases.Where(p => p.Name.Equals(nameof(rpc.GetContractStateAsync), StringComparison.CurrentCultureIgnoreCase)); foreach (var test in tests) { - var type = test.Request.Params[0].GetType().Name; + var type = test.Request.Params[0]!.GetType().Name; if (type == "JString") { - var result = await rpc.GetContractStateAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var result = await rpc.GetContractStateAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } if (type == "JNumber") { - var result = await rpc.GetContractStateAsync((int)test.Request.Params[0].AsNumber()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var result = await rpc.GetContractStateAsync((int)test.Request.Params[0]!.AsNumber()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } } } @@ -241,64 +241,64 @@ public async Task TestGetNativeContracts() foreach (var test in tests) { var result = await rpc.GetNativeContractsAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); } } [TestMethod] public async Task TestGetRawMempool() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawMempoolAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawMempoolAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetRawMempoolAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => (JToken)p).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => (JToken)p).ToArray()).ToString()); } [TestMethod] public async Task TestGetRawMempoolBoth() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawMempoolBothAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawMempoolBothAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetRawMempoolBothAsync(); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod] public async Task TestGetRawTransactionHex() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawTransactionHexAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetRawTransactionHexAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawTransactionHexAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetRawTransactionHexAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result); } [TestMethod] public async Task TestGetRawTransaction() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetRawTransactionAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson(rpc.protocolSettings).ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetRawTransactionAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson(rpc.protocolSettings).ToString()); } [TestMethod] public async Task TestGetStorage() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetStorageAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetStorageAsync(test.Request.Params[0].AsString(), test.Request.Params[1].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetStorageAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetStorageAsync(test.Request.Params[0]!.AsString(), test.Request.Params[1]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result); } [TestMethod] public async Task TestGetTransactionHeight() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetTransactionHeightAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetTransactionHeightAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetTransactionHeightAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetTransactionHeightAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToString()); } [TestMethod] public async Task TestGetNextBlockValidators() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNextBlockValidatorsAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNextBlockValidatorsAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetNextBlockValidatorsAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); } #endregion Blockchain @@ -308,41 +308,41 @@ public async Task TestGetNextBlockValidators() [TestMethod] public async Task TestGetConnectionCount() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetConnectionCountAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetConnectionCountAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetConnectionCountAsync(); - Assert.AreEqual(test.Response.Result.ToString(), result.ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToString()); } [TestMethod] public async Task TestGetPeers() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetPeersAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetPeersAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetPeersAsync(); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod] public async Task TestGetVersion() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetVersionAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetVersionAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetVersionAsync(); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod] public async Task TestSendRawTransaction() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.SendRawTransactionAsync(Convert.FromBase64String(test.Request.Params[0].AsString()).AsSerializable()); - Assert.AreEqual(test.Response.Result["hash"].AsString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.SendRawTransactionAsync(Convert.FromBase64String(test.Request.Params[0]!.AsString()).AsSerializable()); + Assert.AreEqual(test.Response.Result!["hash"]!.AsString(), result.ToString()); } [TestMethod] public async Task TestSubmitBlock() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SubmitBlockAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.SubmitBlockAsync(Convert.FromBase64String(test.Request.Params[0].AsString())); - Assert.AreEqual(test.Response.Result["hash"].AsString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SubmitBlockAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.SubmitBlockAsync(Convert.FromBase64String(test.Request.Params[0]!.AsString())); + Assert.AreEqual(test.Response.Result!["hash"]!.AsString(), result.ToString()); } #endregion Node @@ -352,10 +352,10 @@ public async Task TestSubmitBlock() [TestMethod] public async Task TestInvokeFunction() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.InvokeFunctionAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.InvokeFunctionAsync(test.Request.Params[0].AsString(), test.Request.Params[1].AsString(), - ((JArray)test.Request.Params[2]).Select(p => RpcStack.FromJson((JObject)p)).ToArray()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.InvokeFunctionAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.InvokeFunctionAsync(test.Request.Params[0]!.AsString(), test.Request.Params[1]!.AsString(), + ((JArray)test.Request.Params[2]!).Select(p => RpcStack.FromJson((JObject)p!)).ToArray()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); // TODO test verify method } @@ -363,18 +363,18 @@ public async Task TestInvokeFunction() [TestMethod] public async Task TestInvokeScript() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.InvokeScriptAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.InvokeScriptAsync(Convert.FromBase64String(test.Request.Params[0].AsString())); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.InvokeScriptAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.InvokeScriptAsync(Convert.FromBase64String(test.Request.Params[0]!.AsString())); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod] public async Task TestGetUnclaimedGas() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetUnclaimedGasAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetUnclaimedGasAsync(test.Request.Params[0].AsString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetUnclaimedGasAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetUnclaimedGasAsync(test.Request.Params[0]!.AsString()); Assert.AreEqual(result.ToJson().AsString(), RpcUnclaimedGas.FromJson(result.ToJson()).ToJson().AsString()); - Assert.AreEqual(test.Response.Result["unclaimed"].AsString(), result.Unclaimed.ToString()); + Assert.AreEqual(test.Response.Result!["unclaimed"]!.AsString(), result.Unclaimed.ToString()); } #endregion SmartContract @@ -384,17 +384,17 @@ public async Task TestGetUnclaimedGas() [TestMethod] public async Task TestListPlugins() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ListPluginsAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ListPluginsAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.ListPluginsAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); } [TestMethod] public async Task TestValidateAddress() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ValidateAddressAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.ValidateAddressAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ValidateAddressAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.ValidateAddressAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } #endregion Utilities @@ -404,90 +404,90 @@ public async Task TestValidateAddress() [TestMethod] public async Task TestCloseWallet() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.CloseWalletAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.CloseWalletAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.CloseWalletAsync(); - Assert.AreEqual(test.Response.Result.AsBoolean(), result); + Assert.AreEqual(test.Response.Result!.AsBoolean(), result); } [TestMethod] public async Task TestDumpPrivKey() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.DumpPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.DumpPrivKeyAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.AsString(), result); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.DumpPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.DumpPrivKeyAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsString(), result); } [TestMethod] public async Task TestGetNewAddress() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNewAddressAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNewAddressAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetNewAddressAsync(); - Assert.AreEqual(test.Response.Result.AsString(), result); + Assert.AreEqual(test.Response.Result!.AsString(), result); } [TestMethod] public async Task TestGetWalletBalance() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetWalletBalanceAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetWalletBalanceAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result["balance"].AsString(), result.Value.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetWalletBalanceAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetWalletBalanceAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!["balance"]!.AsString(), result.Value.ToString()); } [TestMethod] public async Task TestGetWalletUnclaimedGas() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetWalletUnclaimedGasAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetWalletUnclaimedGasAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.GetWalletUnclaimedGasAsync(); - Assert.AreEqual(test.Response.Result.AsString(), result.ToString()); + Assert.AreEqual(test.Response.Result!.AsString(), result.ToString()); } [TestMethod] public async Task TestImportPrivKey() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ImportPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.ImportPrivKeyAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ImportPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.ImportPrivKeyAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod] public async Task TestListAddress() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ListAddressAsync), StringComparison.CurrentCultureIgnoreCase)); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.ListAddressAsync), StringComparison.CurrentCultureIgnoreCase))!; var result = await rpc.ListAddressAsync(); - Assert.AreEqual(test.Response.Result.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); + Assert.AreEqual(test.Response.Result!.ToString(), ((JArray)result.Select(p => p.ToJson()).ToArray()).ToString()); } [TestMethod] public async Task TestOpenWallet() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.OpenWalletAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.OpenWalletAsync(test.Request.Params[0].AsString(), test.Request.Params[1].AsString()); - Assert.AreEqual(test.Response.Result.AsBoolean(), result); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.OpenWalletAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.OpenWalletAsync(test.Request.Params[0]!.AsString(), test.Request.Params[1]!.AsString()); + Assert.AreEqual(test.Response.Result!.AsBoolean(), result); } [TestMethod] public async Task TestSendFrom() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendFromAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.SendFromAsync(test.Request.Params[0].AsString(), test.Request.Params[1].AsString(), - test.Request.Params[2].AsString(), test.Request.Params[3].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendFromAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.SendFromAsync(test.Request.Params[0]!.AsString(), test.Request.Params[1]!.AsString(), + test.Request.Params[2]!.AsString(), test.Request.Params[3]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToString()); } [TestMethod] public async Task TestSendMany() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendManyAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.SendManyAsync(test.Request.Params[0].AsString(), ((JArray)test.Request.Params[1]).Select(p => RpcTransferOut.FromJson((JObject)p, rpc.protocolSettings))); - Assert.AreEqual(test.Response.Result.ToString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendManyAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.SendManyAsync(test.Request.Params[0]!.AsString(), ((JArray)test.Request.Params[1]!).Select(p => RpcTransferOut.FromJson((JObject)p!, rpc.protocolSettings))); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToString()); } [TestMethod] public async Task TestSendToAddress() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendToAddressAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.SendToAddressAsync(test.Request.Params[0].AsString(), test.Request.Params[1].AsString(), test.Request.Params[2].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.SendToAddressAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.SendToAddressAsync(test.Request.Params[0]!.AsString(), test.Request.Params[1]!.AsString(), test.Request.Params[2]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToString()); } #endregion Wallet @@ -497,36 +497,36 @@ public async Task TestSendToAddress() [TestMethod()] public async Task GetApplicationLogTest() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetApplicationLogAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetApplicationLogAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetApplicationLogAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetApplicationLogAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod()] public async Task GetApplicationLogTest_TriggerType() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetApplicationLogAsync) + "_triggertype", StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetApplicationLogAsync(test.Request.Params[0].AsString(), TriggerType.OnPersist); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson().ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetApplicationLogAsync) + "_triggertype", StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetApplicationLogAsync(test.Request.Params[0]!.AsString(), TriggerType.OnPersist); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson().ToString()); } [TestMethod()] public async Task GetNep17TransfersTest() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNep17TransfersAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetNep17TransfersAsync(test.Request.Params[0].AsString(), (ulong)test.Request.Params[1].AsNumber(), (ulong)test.Request.Params[2].AsNumber()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson(rpc.protocolSettings).ToString()); - test = TestUtils.RpcTestCases.Find(p => p.Name == (nameof(rpc.GetNep17TransfersAsync).ToLower() + "_with_null_transferaddress")); - result = await rpc.GetNep17TransfersAsync(test.Request.Params[0].AsString(), (ulong)test.Request.Params[1].AsNumber(), (ulong)test.Request.Params[2].AsNumber()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson(rpc.protocolSettings).ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNep17TransfersAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetNep17TransfersAsync(test.Request.Params[0]!.AsString(), (ulong)test.Request.Params[1]!.AsNumber(), (ulong)test.Request.Params[2]!.AsNumber()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson(rpc.protocolSettings).ToString()); + test = TestUtils.RpcTestCases.Find(p => p.Name == (nameof(rpc.GetNep17TransfersAsync).ToLower() + "_with_null_transferaddress"))!; + result = await rpc.GetNep17TransfersAsync(test.Request.Params[0]!.AsString(), (ulong)test.Request.Params[1]!.AsNumber(), (ulong)test.Request.Params[2]!.AsNumber()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson(rpc.protocolSettings).ToString()); } [TestMethod()] public async Task GetNep17BalancesTest() { - var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNep17BalancesAsync), StringComparison.CurrentCultureIgnoreCase)); - var result = await rpc.GetNep17BalancesAsync(test.Request.Params[0].AsString()); - Assert.AreEqual(test.Response.Result.ToString(), result.ToJson(rpc.protocolSettings).ToString()); + var test = TestUtils.RpcTestCases.Find(p => p.Name.Equals(nameof(rpc.GetNep17BalancesAsync), StringComparison.CurrentCultureIgnoreCase))!; + var result = await rpc.GetNep17BalancesAsync(test.Request.Params[0]!.AsString()); + Assert.AreEqual(test.Response.Result!.ToString(), result.ToJson(rpc.protocolSettings).ToString()); } #endregion Plugins diff --git a/tests/Neo.Network.RPC.Tests/UT_RpcModels.cs b/tests/Neo.Network.RPC.Tests/UT_RpcModels.cs index 1e2d48c2e..ec319d3e5 100644 --- a/tests/Neo.Network.RPC.Tests/UT_RpcModels.cs +++ b/tests/Neo.Network.RPC.Tests/UT_RpcModels.cs @@ -19,8 +19,8 @@ namespace Neo.Network.RPC.Tests; [TestClass()] public class UT_RpcModels { - RpcClient rpc; - Mock handlerMock; + RpcClient rpc = null!; + Mock handlerMock = null!; [TestInitialize] public void TestSetup() @@ -36,9 +36,9 @@ public void TestSetup() public void TestRpcAccount() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.ImportPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.ImportPrivKeyAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcAccount.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -47,9 +47,9 @@ public void TestRpcAccount() public void TestRpcApplicationLog() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetApplicationLogAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetApplicationLogAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcApplicationLog.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -58,9 +58,9 @@ public void TestRpcApplicationLog() public void TestRpcBlock() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetBlockAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetBlockAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcBlock.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson(rpc.protocolSettings).ToString()); } @@ -69,9 +69,9 @@ public void TestRpcBlock() public void TestRpcBlockHeader() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetBlockHeaderAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetBlockHeaderAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcBlockHeader.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson(rpc.protocolSettings).ToString()); } @@ -80,23 +80,23 @@ public void TestRpcBlockHeader() public void TestGetContractState() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetContractStateAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetContractStateAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcContractState.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); - var nef = RpcNefFile.FromJson((JObject)json["nef"]); - Assert.AreEqual(json["nef"].ToString(), nef.ToJson().ToString()); + var nef = RpcNefFile.FromJson((JObject)json["nef"]!); + Assert.AreEqual(json["nef"]!.ToString(), nef.ToJson().ToString()); } [TestMethod()] public void TestRpcInvokeResult() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.InvokeFunctionAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.InvokeFunctionAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcInvokeResult.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -105,7 +105,7 @@ public void TestRpcInvokeResult() public void TestRpcMethodToken() { var json = """{"hash":"0x0e1b9bfaa44e60311f6f3c96cfcd6d12c2fc3add","method":"test","paramcount":1,"hasreturnvalue":true,"callflags":"All"}"""; - var item = RpcMethodToken.FromJson((JObject)JToken.Parse(json)); + var item = RpcMethodToken.FromJson((JObject)JToken.Parse(json)!); Assert.AreEqual("0x0e1b9bfaa44e60311f6f3c96cfcd6d12c2fc3add", item.Hash.ToString()); Assert.AreEqual("test", item.Method); Assert.AreEqual(1, item.ParametersCount); @@ -118,9 +118,9 @@ public void TestRpcMethodToken() public void TestRpcNep17Balances() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetNep17BalancesAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetNep17BalancesAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcNep17Balances.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson(rpc.protocolSettings).ToString()); } @@ -129,9 +129,9 @@ public void TestRpcNep17Balances() public void TestRpcNep17Transfers() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetNep17TransfersAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetNep17TransfersAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcNep17Transfers.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson(rpc.protocolSettings).ToString()); } @@ -140,9 +140,9 @@ public void TestRpcNep17Transfers() public void TestRpcPeers() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetPeersAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetPeersAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcPeers.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -151,10 +151,10 @@ public void TestRpcPeers() public void TestRpcPlugin() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.ListPluginsAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.ListPluginsAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; - var item = ((JArray)json).Select(p => RpcPlugin.FromJson((JObject)p)); + .Result!; + var item = ((JArray)json).Select(p => RpcPlugin.FromJson((JObject)p!)); Assert.AreEqual(json.ToString(), ((JArray)item.Select(p => p.ToJson()).ToArray()).ToString()); } @@ -162,9 +162,9 @@ public void TestRpcPlugin() public void TestRpcRawMemPool() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetRawMempoolBothAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetRawMempoolBothAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcRawMemPool.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -173,9 +173,9 @@ public void TestRpcRawMemPool() public void TestRpcTransaction() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetRawTransactionAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcTransaction.FromJson((JObject)json, rpc.protocolSettings); Assert.AreEqual(json.ToString(), item.ToJson(rpc.protocolSettings).ToString()); } @@ -184,8 +184,8 @@ public void TestRpcTransaction() public void TestRpcTransferOut() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.SendManyAsync), StringComparison.CurrentCultureIgnoreCase)).Request.Params[1]; - var item = ((JArray)json).Select(p => RpcTransferOut.FromJson((JObject)p, rpc.protocolSettings)); + .Find(p => p.Name.Equals(nameof(RpcClient.SendManyAsync), StringComparison.CurrentCultureIgnoreCase))!.Request.Params[1]!; + var item = ((JArray)json).Select(p => RpcTransferOut.FromJson((JObject)p!, rpc.protocolSettings)); Assert.AreEqual(json.ToString(), ((JArray)item.Select(p => p.ToJson(rpc.protocolSettings)).ToArray()).ToString()); } @@ -193,9 +193,9 @@ public void TestRpcTransferOut() public void TestRpcValidateAddressResult() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.ValidateAddressAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.ValidateAddressAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcValidateAddressResult.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } @@ -204,10 +204,10 @@ public void TestRpcValidateAddressResult() public void TestRpcValidator() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetNextBlockValidatorsAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetNextBlockValidatorsAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; - var item = ((JArray)json).Select(p => RpcValidator.FromJson((JObject)p)); + .Result!; + var item = ((JArray)json).Select(p => RpcValidator.FromJson((JObject)p!)); Assert.AreEqual(json.ToString(), ((JArray)item.Select(p => p.ToJson()).ToArray()).ToString()); } @@ -215,9 +215,9 @@ public void TestRpcValidator() public void TestRpcVersion() { var json = TestUtils.RpcTestCases - .Find(p => p.Name.Equals(nameof(RpcClient.GetVersionAsync), StringComparison.CurrentCultureIgnoreCase)) + .Find(p => p.Name.Equals(nameof(RpcClient.GetVersionAsync), StringComparison.CurrentCultureIgnoreCase))! .Response - .Result; + .Result!; var item = RpcVersion.FromJson((JObject)json); Assert.AreEqual(json.ToString(), item.ToJson().ToString()); } diff --git a/tests/Neo.Network.RPC.Tests/UT_TransactionManager.cs b/tests/Neo.Network.RPC.Tests/UT_TransactionManager.cs index 4ecefcef1..59a776b58 100644 --- a/tests/Neo.Network.RPC.Tests/UT_TransactionManager.cs +++ b/tests/Neo.Network.RPC.Tests/UT_TransactionManager.cs @@ -29,14 +29,13 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_TransactionManager { - TransactionManager txManager; - Mock rpcClientMock; - Mock multiSigMock; - KeyPair keyPair1; - KeyPair keyPair2; - UInt160 sender; - UInt160 multiHash; - RpcClient client; + Mock rpcClientMock = null!; + Mock multiSigMock = null!; + KeyPair keyPair1 = null!; + KeyPair keyPair2 = null!; + UInt160 sender = null!; + UInt160 multiHash = null!; + RpcClient client = null!; [TestInitialize] public void TestSetup() @@ -52,7 +51,7 @@ public void TestSetup() public static Mock MockRpcClient(UInt160 sender, byte[] script) { - var mockRpc = new Mock(MockBehavior.Strict, new Uri("http://seed1.neo.org:10331"), null, null, null); + var mockRpc = new Mock(MockBehavior.Strict, new Uri("http://seed1.neo.org:10331"), null!, null!, null!); // MockHeight mockRpc.Setup(p => p.RpcSendAsync("getblockcount")).ReturnsAsync(100).Verifiable(); @@ -84,7 +83,7 @@ public static Mock MockRpcClient(UInt160 sender, byte[] script) public static Mock MockMultiSig(UInt160 multiHash, byte[] script) { - var mockRpc = new Mock(MockBehavior.Strict, new Uri("http://seed1.neo.org:10331"), null, null, null); + var mockRpc = new Mock(MockBehavior.Strict, new Uri("http://seed1.neo.org:10331"), null!, null!, null!); // MockHeight mockRpc.Setup(p => p.RpcSendAsync("getblockcount")).ReturnsAsync(100).Verifiable(); @@ -143,7 +142,7 @@ public async Task TestMakeTransaction() }; byte[] script = new byte[1]; - txManager = await TransactionManager.MakeTransactionAsync(rpcClientMock.Object, script, signers); + TransactionManager txManager = await TransactionManager.MakeTransactionAsync(rpcClientMock.Object, script, signers); var tx = txManager.Tx; Assert.AreEqual(WitnessScope.Global, tx.Signers[0].Scopes); @@ -162,7 +161,7 @@ public async Task TestSign() }; byte[] script = new byte[1]; - txManager = await TransactionManager.MakeTransactionAsync(client, script, signers); + TransactionManager txManager = await TransactionManager.MakeTransactionAsync(client, script, signers); await txManager .AddSignature(keyPair1) .SignAsync(); @@ -221,7 +220,7 @@ public async Task TestSignMulti() }; byte[] script = new byte[1]; - txManager = await TransactionManager.MakeTransactionAsync(multiSigMock.Object, script, signers); + TransactionManager txManager = await TransactionManager.MakeTransactionAsync(multiSigMock.Object, script, signers); await txManager .AddMultiSig(keyPair1, 2, keyPair1.PublicKey, keyPair2.PublicKey) .AddMultiSig(keyPair2, 2, keyPair1.PublicKey, keyPair2.PublicKey) @@ -247,7 +246,7 @@ public async Task TestAddWitness() }; byte[] script = new byte[1]; - txManager = await TransactionManager.MakeTransactionAsync(rpcClientMock.Object, script, signers); + TransactionManager txManager = await TransactionManager.MakeTransactionAsync(rpcClientMock.Object, script, signers); txManager.AddWitness(UInt160.Zero); txManager.AddSignature(keyPair1); await txManager.SignAsync(); diff --git a/tests/Neo.Network.RPC.Tests/UT_Utility.cs b/tests/Neo.Network.RPC.Tests/UT_Utility.cs index a329d838f..dfe940fac 100644 --- a/tests/Neo.Network.RPC.Tests/UT_Utility.cs +++ b/tests/Neo.Network.RPC.Tests/UT_Utility.cs @@ -9,7 +9,6 @@ // Redistribution and use in source and binary forms with or without // modifications are permitted. -using Neo.Extensions; using Neo.Network.P2P.Payloads; using Neo.Network.P2P.Payloads.Conditions; using Neo.SmartContract; @@ -22,9 +21,9 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_Utility { - private KeyPair keyPair; - private UInt160 scriptHash; - private ProtocolSettings protocolSettings; + private KeyPair keyPair = null!; + private UInt160 scriptHash = null!; + private ProtocolSettings protocolSettings = null!; [TestInitialize] public void TestSetup() @@ -47,9 +46,6 @@ public void TestAsScriptHash() [TestMethod] public void TestGetKeyPair() { - string nul = null; - Assert.ThrowsExactly(() => _ = Utility.GetKeyPair(nul)); - string wif = "KyXwTh1hB76RRMquSvnxZrJzQx7h9nQP2PCRL38v6VDb5ip3nf1p"; var result = Utility.GetKeyPair(wif); Assert.AreEqual(keyPair, result); @@ -69,9 +65,6 @@ public void TestGetKeyPair() [TestMethod] public void TestGetScriptHash() { - string nul = null; - Assert.ThrowsExactly(() => _ = Utility.GetScriptHash(nul, protocolSettings)); - string addr = scriptHash.ToAddress(protocolSettings.AddressVersion); var result = Utility.GetScriptHash(addr, protocolSettings); Assert.AreEqual(scriptHash, result); diff --git a/tests/Neo.Network.RPC.Tests/UT_WalletAPI.cs b/tests/Neo.Network.RPC.Tests/UT_WalletAPI.cs index a65c5a258..76a171aa1 100644 --- a/tests/Neo.Network.RPC.Tests/UT_WalletAPI.cs +++ b/tests/Neo.Network.RPC.Tests/UT_WalletAPI.cs @@ -26,13 +26,13 @@ namespace Neo.Network.RPC.Tests; [TestClass] public class UT_WalletAPI { - Mock rpcClientMock; - KeyPair keyPair1; - string address1; - UInt160 sender; - WalletAPI walletAPI; - UInt160 multiSender; - RpcClient client; + Mock rpcClientMock = null!; + KeyPair keyPair1 = null!; + string address1 = null!; + UInt160 sender = null!; + WalletAPI walletAPI = null!; + UInt160 multiSender = null!; + RpcClient client = null!; [TestInitialize] public void TestSetup() diff --git a/tests/Neo.Plugins.ApplicationLogs.Tests/TestUtils.cs b/tests/Neo.Plugins.ApplicationLogs.Tests/TestUtils.cs index f9d9dd30f..6add03858 100644 --- a/tests/Neo.Plugins.ApplicationLogs.Tests/TestUtils.cs +++ b/tests/Neo.Plugins.ApplicationLogs.Tests/TestUtils.cs @@ -27,6 +27,6 @@ public static NEP6Wallet GenerateTestWallet(string password) ["extra"] = null }; Assert.AreEqual("{\"name\":\"noname\",\"version\":\"1.0\",\"scrypt\":{\"n\":2,\"r\":1,\"p\":1},\"accounts\":[],\"extra\":null}", wallet.ToString()); - return new NEP6Wallet(null, password, TestProtocolSettings.Default, wallet); + return new NEP6Wallet(null!, password, TestProtocolSettings.Default, wallet); } } diff --git a/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs b/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs index e0283afe1..69517ed66 100644 --- a/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs +++ b/tests/Neo.Plugins.ApplicationLogs.Tests/UT_LogReader.cs @@ -41,7 +41,7 @@ public class TestMemoryStoreProvider(MemoryStore memoryStore) : IStoreProvider { public MemoryStore MemoryStore { get; init; } = memoryStore; public string Name => nameof(MemoryStore); - public IStore GetStore(string path) => MemoryStore; + public IStore GetStore(string? path) => MemoryStore; } private class NeoSystemFixture : IDisposable @@ -78,7 +78,7 @@ public NeoSystemFixture() Witnesses = [] } ]; - byte[] signature = txs[0].Sign(_walletAccount.GetKey(), ApplicationLogsSettings.Default.Network); + byte[] signature = txs[0].Sign(_walletAccount.GetKey()!, ApplicationLogsSettings.Default.Network); txs[0].Witnesses = [new Witness { InvocationScript = new byte[] { (byte)OpCode.PUSHDATA1, (byte)signature.Length }.Concat(signature).ToArray(), @@ -99,7 +99,7 @@ public NeoSystemFixture() Transactions = txs, }; block.Header.MerkleRoot ??= MerkleTree.ComputeRoot(block.Transactions.Select(t => t.Hash).ToArray()); - signature = block.Sign(_walletAccount.GetKey(), ApplicationLogsSettings.Default.Network); + signature = block.Sign(_walletAccount.GetKey()!, ApplicationLogsSettings.Default.Network); block.Header.Witness = new Witness { InvocationScript = new byte[] { (byte)OpCode.PUSHDATA1, (byte)signature.Length }.Concat(signature).ToArray(), @@ -115,7 +115,7 @@ public void Dispose() } } - private static NeoSystemFixture s_neoSystemFixture; + private static NeoSystemFixture s_neoSystemFixture = null!; [ClassInitialize] public static void ClassInitialize(TestContext _) @@ -139,38 +139,38 @@ public async Task Test_GetApplicationLog() JObject blockJson = (JObject)s_neoSystemFixture.logReader.GetApplicationLog(block.Hash); Assert.AreEqual(blockJson["blockhash"], block.Hash.ToString()); - JArray executions = (JArray)blockJson["executions"]; + JArray executions = (JArray)blockJson["executions"]!; Assert.HasCount(2, executions); - Assert.AreEqual("OnPersist", executions[0]["trigger"]); - Assert.AreEqual("PostPersist", executions[1]["trigger"]); + Assert.AreEqual("OnPersist", executions[0]!["trigger"]); + Assert.AreEqual("PostPersist", executions[1]!["trigger"]); - JArray notifications = (JArray)executions[1]["notifications"]; + JArray notifications = (JArray)executions[1]!["notifications"]!; Assert.HasCount(1, notifications); - Assert.AreEqual(notifications[0]["contract"], GasToken.GAS.Hash.ToString()); - Assert.AreEqual("Transfer", notifications[0]["eventname"]); // from null to Validator - Assert.AreEqual(nameof(ContractParameterType.Any), notifications[0]["state"]["value"][0]["type"]); - CollectionAssert.AreEqual(Convert.FromBase64String(notifications[0]["state"]["value"][1]["value"].AsString()), ValidatorScriptHash.ToArray()); - Assert.AreEqual("50000000", notifications[0]["state"]["value"][2]["value"]); + Assert.AreEqual(notifications[0]!["contract"], GasToken.GAS.Hash.ToString()); + Assert.AreEqual("Transfer", notifications[0]!["eventname"]); // from null to Validator + Assert.AreEqual(nameof(ContractParameterType.Any), notifications[0]!["state"]!["value"]![0]!["type"]); + CollectionAssert.AreEqual(Convert.FromBase64String(notifications[0]!["state"]!["value"]![1]!["value"]!.AsString()), ValidatorScriptHash.ToArray()); + Assert.AreEqual("50000000", notifications[0]!["state"]!["value"]![2]!["value"]); blockJson = (JObject)s_neoSystemFixture.logReader.GetApplicationLog(block.Hash, "PostPersist"); - executions = (JArray)blockJson["executions"]; + executions = (JArray)blockJson["executions"]!; Assert.HasCount(1, executions); - Assert.AreEqual("PostPersist", executions[0]["trigger"]); + Assert.AreEqual("PostPersist", executions[0]!["trigger"]); // "true" is invalid but still works JObject transactionJson = (JObject)s_neoSystemFixture.logReader.GetApplicationLog(s_neoSystemFixture.txs[0].Hash.ToString(), "true"); - executions = (JArray)transactionJson["executions"]; + executions = (JArray)transactionJson["executions"]!; Assert.HasCount(1, executions); - Assert.AreEqual(nameof(VMState.HALT), executions[0]["vmstate"]); - Assert.IsTrue(executions[0]["stack"][0]["value"].GetBoolean()); - notifications = (JArray)executions[0]["notifications"]; + Assert.AreEqual(nameof(VMState.HALT), executions[0]!["vmstate"]); + Assert.IsTrue(executions[0]!["stack"]![0]!["value"]!.GetBoolean()); + notifications = (JArray)executions[0]!["notifications"]!; Assert.HasCount(2, notifications); - Assert.AreEqual("Transfer", notifications[0]["eventname"].AsString()); - Assert.AreEqual(notifications[0]["contract"].AsString(), NeoToken.NEO.Hash.ToString()); - Assert.AreEqual("1", notifications[0]["state"]["value"][2]["value"]); - Assert.AreEqual("Transfer", notifications[1]["eventname"].AsString()); - Assert.AreEqual(notifications[1]["contract"].AsString(), GasToken.GAS.Hash.ToString()); - Assert.AreEqual("50000000", notifications[1]["state"]["value"][2]["value"]); + Assert.AreEqual("Transfer", notifications[0]!["eventname"]!.AsString()); + Assert.AreEqual(notifications[0]!["contract"]!.AsString(), NeoToken.NEO.Hash.ToString()); + Assert.AreEqual("1", notifications[0]!["state"]!["value"]![2]!["value"]); + Assert.AreEqual("Transfer", notifications[1]!["eventname"]!.AsString()); + Assert.AreEqual(notifications[1]!["contract"]!.AsString(), GasToken.GAS.Hash.ToString()); + Assert.AreEqual("50000000", notifications[1]!["state"]!["value"]![2]!["value"]); } [TestMethod] @@ -185,8 +185,8 @@ public async Task Test_Commands() s_neoSystemFixture.logReader.OnGetContractCommand(NativeContract.NEO.Hash); s_neoSystemFixture.logReader.OnGetTransactionCommand(s_neoSystemFixture.txs[0].Hash); - var blockLog = s_neoSystemFixture.logReader._neostore.GetBlockLog(block.Hash, TriggerType.Application); - var transactionLog = s_neoSystemFixture.logReader._neostore.GetTransactionLog(s_neoSystemFixture.txs[0].Hash); + var blockLog = s_neoSystemFixture.logReader._neostore.GetBlockLog(block.Hash, TriggerType.Application)!; + var transactionLog = s_neoSystemFixture.logReader._neostore.GetTransactionLog(s_neoSystemFixture.txs[0].Hash)!; foreach (var log in new BlockchainExecutionModel[] { blockLog, transactionLog }) { Assert.AreEqual(VMState.HALT, log.VmState); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/ConsensusTestUtilities.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/ConsensusTestUtilities.cs index 3f62fcfb1..825c6737d 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/ConsensusTestUtilities.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/ConsensusTestUtilities.cs @@ -80,7 +80,7 @@ public ExtensiblePayload CreateConsensusPayload(ConsensusMessage message, int va /// /// Creates a PrepareRequest message /// - public PrepareRequest CreatePrepareRequest(UInt256 prevHash = null, UInt256[] transactionHashes = null, ulong nonce = 0) + public PrepareRequest CreatePrepareRequest(UInt256? prevHash = null, UInt256[]? transactionHashes = null, ulong nonce = 0) { return new PrepareRequest { @@ -95,7 +95,7 @@ public PrepareRequest CreatePrepareRequest(UInt256 prevHash = null, UInt256[] tr /// /// Creates a PrepareResponse message /// - public PrepareResponse CreatePrepareResponse(UInt256 preparationHash = null) + public PrepareResponse CreatePrepareResponse(UInt256? preparationHash = null) { return new PrepareResponse { @@ -106,7 +106,7 @@ public PrepareResponse CreatePrepareResponse(UInt256 preparationHash = null) /// /// Creates a Commit message /// - public Commit CreateCommit(byte[] signature = null) + public Commit CreateCommit(byte[]? signature = null) { return new Commit { @@ -224,7 +224,7 @@ public void SendToValidators(ExtensiblePayload payload, IActorRef[] consensusSer /// /// Simulates a complete consensus round with proper message flow /// - public async Task SimulateCompleteConsensusRoundAsync(IActorRef[] consensusServices, uint blockIndex = 1, UInt256[] transactions = null) + public async Task SimulateCompleteConsensusRoundAsync(IActorRef[] consensusServices, uint blockIndex = 1, UInt256[]? transactions = null) { var validatorCount = consensusServices.Length; var primaryIndex = (int)(blockIndex % (uint)validatorCount); @@ -272,7 +272,7 @@ public void SimulateConsensusWithProperFlow(IActorRef[] consensusServices, TestP /// Simulates a complete consensus round (legacy synchronous version) /// [Obsolete("Use SimulateCompleteConsensusRoundAsync for proper message flow testing")] - public void SimulateCompleteConsensusRound(IActorRef[] consensusServices, uint blockIndex = 1, UInt256[] transactions = null) + public void SimulateCompleteConsensusRound(IActorRef[] consensusServices, uint blockIndex = 1, UInt256[]? transactions = null) { var validatorCount = consensusServices.Length; var primaryIndex = (int)(blockIndex % (uint)validatorCount); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/MockBlockchain.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/MockBlockchain.cs index daab3e13c..643b3a10a 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/MockBlockchain.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/MockBlockchain.cs @@ -20,14 +20,13 @@ namespace Neo.Plugins.DBFTPlugin.Tests; public static class MockBlockchain { public static readonly NeoSystem TheNeoSystem; - public static readonly UInt160[] DefaultExtensibleWitnessWhiteList; private static readonly MemoryStore Store = new(); internal class StoreProvider : IStoreProvider { public string Name => "TestProvider"; - public IStore GetStore(string path) => Store; + public IStore GetStore(string? path) => Store; } static MockBlockchain() @@ -45,7 +44,7 @@ internal static void ResetStore() internal static DbftSettings CreateDefaultSettings() { var config = new Microsoft.Extensions.Configuration.ConfigurationBuilder() - .AddInMemoryCollection(new Dictionary + .AddInMemoryCollection(new Dictionary { ["ApplicationConfiguration:DBFTPlugin:RecoveryLogs"] = "ConsensusState", ["ApplicationConfiguration:DBFTPlugin:IgnoreRecoveryLogs"] = "false", diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/MockMemoryStoreProvider.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/MockMemoryStoreProvider.cs index 4f4ff4466..f5ec2a02e 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/MockMemoryStoreProvider.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/MockMemoryStoreProvider.cs @@ -18,5 +18,5 @@ public class MockMemoryStoreProvider(MemoryStore memoryStore) : IStoreProvider { public MemoryStore MemoryStore { get; init; } = memoryStore; public string Name => nameof(MemoryStore); - public IStore GetStore(string path) => MemoryStore; + public IStore GetStore(string? path) => MemoryStore; } diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/MockWallet.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/MockWallet.cs index c23d1f8c7..92556a945 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/MockWallet.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/MockWallet.cs @@ -20,7 +20,7 @@ public class MockWallet : Wallet { private readonly Dictionary accounts = new(); - public MockWallet(ProtocolSettings settings) : base(null, settings) + public MockWallet(ProtocolSettings settings) : base(null!, settings) { } @@ -59,7 +59,7 @@ public override WalletAccount CreateAccount(byte[] privateKey) throw new NotImplementedException(); } - public override WalletAccount CreateAccount(Contract contract, KeyPair key) + public override WalletAccount CreateAccount(Contract contract, KeyPair? key) { throw new NotImplementedException(); } @@ -74,7 +74,7 @@ public override bool DeleteAccount(UInt160 scriptHash) return accounts.Remove(scriptHash); } - public override WalletAccount GetAccount(UInt160 scriptHash) + public override WalletAccount? GetAccount(UInt160 scriptHash) { return accounts.TryGetValue(scriptHash, out var account) ? account : null; } diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_ConsensusService.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_ConsensusService.cs index fe1345f51..fa691edf8 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_ConsensusService.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_ConsensusService.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Extensions.IO; using Neo.Ledger; @@ -26,23 +25,13 @@ namespace Neo.Plugins.DBFTPlugin.Tests; [TestClass] public class UT_ConsensusService : TestKit { - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet testWallet; - private MemoryStore memoryStore; + private NeoSystem neoSystem = null!; + private MockWallet testWallet = null!; + private MemoryStore memoryStore = null!; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Core.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Core.cs index 5eec2bf16..99ba27e9a 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Core.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Core.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Ledger; using Neo.Network.P2P.Payloads; @@ -24,25 +23,15 @@ namespace Neo.Plugins.DBFTPlugin.Tests; [TestClass] public class UT_DBFT_Core : TestKit { - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private MemoryStore memoryStore; + private NeoSystem neoSystem = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private MemoryStore memoryStore = null!; private const int ValidatorCount = 7; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Failures.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Failures.cs index e7689833d..bb79dbd86 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Failures.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Failures.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Extensions.IO; using Neo.Network.P2P.Payloads; @@ -27,25 +26,15 @@ namespace Neo.Plugins.DBFTPlugin.Tests; public class UT_DBFT_Failures : TestKit { private const int ValidatorCount = 7; - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private MemoryStore memoryStore; - private DbftSettings settings; + private NeoSystem neoSystem = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private MemoryStore memoryStore = null!; + private DbftSettings settings = null!; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Integration.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Integration.cs index fb02c7ab2..3dab16972 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Integration.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Integration.cs @@ -22,14 +22,11 @@ namespace Neo.Plugins.DBFTPlugin.Tests; [TestClass] public class UT_DBFT_Integration : TestKit { - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private MemoryStore memoryStore; + private NeoSystem neoSystem = null!; + private TestProbe localNode = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private MemoryStore memoryStore = null!; private const int ValidatorCount = 4; // Smaller for integration tests [TestInitialize] @@ -37,9 +34,6 @@ public void Setup() { // Create test probes for actor dependencies localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); // Setup autopilot for localNode to handle consensus messages localNode.SetAutoPilot(new MockAutoPilot((sender, message) => diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_MessageFlow.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_MessageFlow.cs index d1d9bbc05..369016f55 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_MessageFlow.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_MessageFlow.cs @@ -35,14 +35,14 @@ namespace Neo.Plugins.DBFTPlugin.Tests; public class UT_DBFT_MessageFlow : TestKit { private const int ValidatorCount = 4; // Use 4 validators for faster testing - private NeoSystem neoSystem; - private MemoryStore memoryStore; - private DbftSettings settings; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private ConsensusTestUtilities testHelper; - private TestProbe networkProbe; // Simulates the network layer - private List capturedMessages; + private NeoSystem neoSystem = null!; + private MemoryStore memoryStore = null!; + private DbftSettings settings = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private ConsensusTestUtilities testHelper = null!; + private TestProbe networkProbe = null!; // Simulates the network layer + private List capturedMessages = null!; [TestInitialize] public void Setup() diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_NormalFlow.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_NormalFlow.cs index 87794a0fd..51fdbdd64 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_NormalFlow.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_NormalFlow.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Extensions.IO; using Neo.Network.P2P.Payloads; @@ -26,25 +25,15 @@ namespace Neo.Plugins.DBFTPlugin.Tests; public class UT_DBFT_NormalFlow : TestKit { private const int ValidatorCount = 7; - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private MemoryStore memoryStore; - private DbftSettings settings; + private NeoSystem neoSystem = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private MemoryStore memoryStore = null!; + private DbftSettings settings = null!; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Performance.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Performance.cs index d310cd8a4..815aa29f8 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Performance.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Performance.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Extensions.IO; using Neo.Network.P2P.Payloads; @@ -26,23 +25,13 @@ namespace Neo.Plugins.DBFTPlugin.Tests; [TestClass] public class UT_DBFT_Performance : TestKit { - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MemoryStore memoryStore; - private DbftSettings settings; + private NeoSystem neoSystem = null!; + private MemoryStore memoryStore = null!; + private DbftSettings settings = null!; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Recovery.cs b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Recovery.cs index fe862ef3e..995042236 100644 --- a/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Recovery.cs +++ b/tests/Neo.Plugins.DBFTPlugin.Tests/UT_DBFT_Recovery.cs @@ -10,7 +10,6 @@ // modifications are permitted. using Akka.Actor; -using Akka.TestKit; using Akka.TestKit.MsTest; using Neo.Extensions.IO; using Neo.Network.P2P.Payloads; @@ -27,25 +26,15 @@ namespace Neo.Plugins.DBFTPlugin.Tests; public class UT_DBFT_Recovery : TestKit { private const int ValidatorCount = 7; - private NeoSystem neoSystem; - private TestProbe localNode; - private TestProbe taskManager; - private TestProbe blockchain; - private TestProbe txRouter; - private MockWallet[] testWallets; - private IActorRef[] consensusServices; - private MemoryStore memoryStore; - private DbftSettings settings; + private NeoSystem neoSystem = null!; + private MockWallet[] testWallets = null!; + private IActorRef[] consensusServices = null!; + private MemoryStore memoryStore = null!; + private DbftSettings settings = null!; [TestInitialize] public void Setup() { - // Create test probes for actor dependencies - localNode = CreateTestProbe("localNode"); - taskManager = CreateTestProbe("taskManager"); - blockchain = CreateTestProbe("blockchain"); - txRouter = CreateTestProbe("txRouter"); - // Create memory store memoryStore = new MemoryStore(); var storeProvider = new MockMemoryStoreProvider(memoryStore); diff --git a/tests/Neo.Plugins.OracleService.Tests/E2E_Https.cs b/tests/Neo.Plugins.OracleService.Tests/E2E_Https.cs index cb307e483..1e0099236 100644 --- a/tests/Neo.Plugins.OracleService.Tests/E2E_Https.cs +++ b/tests/Neo.Plugins.OracleService.Tests/E2E_Https.cs @@ -25,7 +25,7 @@ namespace Neo.Plugins.OracleService.Tests; [TestClass] public class E2E_Https { - UInt160 customContract; + UInt160 customContract = null!; [TestInitialize] public void TestSetup() @@ -65,7 +65,7 @@ public void TestE2EHttps() Witnesses = [] } ]; - byte[] signature = txs[0].Sign(s_walletAccount.GetKey(), settings.Network); + byte[] signature = txs[0].Sign(s_walletAccount.GetKey()!, settings.Network); txs[0].Witnesses = [new Witness { InvocationScript = new byte[] { (byte)OpCode.PUSHDATA1, (byte)signature.Length }.Concat(signature).ToArray(), @@ -86,7 +86,7 @@ public void TestE2EHttps() Transactions = txs, }; block.Header.MerkleRoot ??= MerkleTree.ComputeRoot(block.Transactions.Select(t => t.Hash).ToArray()); - signature = block.Sign(s_walletAccount.GetKey(), settings.Network); + signature = block.Sign(s_walletAccount.GetKey()!, settings.Network); block.Header.Witness = new Witness { InvocationScript = new byte[] { (byte)OpCode.PUSHDATA1, (byte)signature.Length }.Concat(signature).ToArray(), diff --git a/tests/Neo.Plugins.OracleService.Tests/TestBlockchain.cs b/tests/Neo.Plugins.OracleService.Tests/TestBlockchain.cs index 3c8fcee10..133e5d7fa 100644 --- a/tests/Neo.Plugins.OracleService.Tests/TestBlockchain.cs +++ b/tests/Neo.Plugins.OracleService.Tests/TestBlockchain.cs @@ -34,7 +34,7 @@ public static class TestBlockchain private class StoreProvider : IStoreProvider { public string Name => "TestProvider"; - public IStore GetStore(string path) => s_store; + public IStore GetStore(string? path) => s_store; } static TestBlockchain() @@ -99,7 +99,7 @@ public static void Callback(string url, byte[] userData, int code, byte[] result Signers = [new Signer() { Account = TestUtils.ValidatorScriptHash, Scopes = WitnessScope.CalledByEntry }], Attributes = [], Script = script, - Witnesses = null, + Witnesses = null!, }; var engine = ApplicationEngine.Run(tx.Script, snapshot, container: tx, settings: s_theNeoSystem.Settings, gas: 1200_0000_0000); engine.SnapshotCache.Commit(); diff --git a/tests/Neo.Plugins.OracleService.Tests/TestUtils.cs b/tests/Neo.Plugins.OracleService.Tests/TestUtils.cs index 0bd193d25..55f79e9cf 100644 --- a/tests/Neo.Plugins.OracleService.Tests/TestUtils.cs +++ b/tests/Neo.Plugins.OracleService.Tests/TestUtils.cs @@ -51,6 +51,6 @@ public static NEP6Wallet GenerateTestWallet(string password) ["extra"] = null }; Assert.AreEqual("{\"name\":\"noname\",\"version\":\"1.0\",\"scrypt\":{\"n\":2,\"r\":1,\"p\":1},\"accounts\":[],\"extra\":null}", wallet.ToString()); - return new NEP6Wallet(null, password, settings, wallet); + return new NEP6Wallet(null!, password, settings, wallet); } } diff --git a/tests/Neo.Plugins.RestServer.Tests/Neo.Plugins.RestServer.Tests.csproj b/tests/Neo.Plugins.RestServer.Tests/Neo.Plugins.RestServer.Tests.csproj index 8eddcec18..e914b9c25 100644 --- a/tests/Neo.Plugins.RestServer.Tests/Neo.Plugins.RestServer.Tests.csproj +++ b/tests/Neo.Plugins.RestServer.Tests/Neo.Plugins.RestServer.Tests.csproj @@ -1,7 +1,6 @@  - enable Neo.Plugins.RestServer.Tests NU1605; diff --git a/tests/Neo.Plugins.RpcServer.Tests/TestBlockchain.cs b/tests/Neo.Plugins.RpcServer.Tests/TestBlockchain.cs index bd6076f6d..01ddef638 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/TestBlockchain.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/TestBlockchain.cs @@ -19,14 +19,13 @@ namespace Neo.Plugins.RpcServer.Tests; public static class TestBlockchain { public static readonly NeoSystem TheNeoSystem; - public static readonly UInt160[] DefaultExtensibleWitnessWhiteList; private static readonly MemoryStore Store = new(); internal class StoreProvider : IStoreProvider { public string Name => "TestProvider"; - public IStore GetStore(string path) => Store; + public IStore GetStore(string? path) => Store; } static TestBlockchain() diff --git a/tests/Neo.Plugins.RpcServer.Tests/TestMemoryStoreProvider.cs b/tests/Neo.Plugins.RpcServer.Tests/TestMemoryStoreProvider.cs index 7773326dd..c726a45c9 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/TestMemoryStoreProvider.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/TestMemoryStoreProvider.cs @@ -18,5 +18,5 @@ public class TestMemoryStoreProvider(MemoryStore memoryStore) : IStoreProvider { public MemoryStore MemoryStore { get; init; } = memoryStore; public string Name => nameof(MemoryStore); - public IStore GetStore(string path) => MemoryStore; + public IStore GetStore(string? path) => MemoryStore; } diff --git a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Block.cs b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Block.cs index 82e2b23cc..31ba21b99 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Block.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Block.cs @@ -70,7 +70,7 @@ public static Block CreateBlockWithValidTransactions(DataCache snapshot, { var block = (Block)RuntimeHelpers.GetUninitializedObject(typeof(Block)); var key = NativeContract.Ledger.CreateStorageKey(Prefix_CurrentBlock); - var state = snapshot.TryGet(key).GetInteroperable(); + var state = snapshot.TryGet(key)!.GetInteroperable(); var header = MakeHeader(snapshot, state.Hash); block.Header = header; @@ -79,7 +79,7 @@ public static Block CreateBlockWithValidTransactions(DataCache snapshot, header.MerkleRoot = MerkleTree.ComputeRoot(block.Transactions.Select(p => p.Hash).ToArray()); var contract = Contract.CreateMultiSigContract(1, TestProtocolSettings.SoleNode.StandbyCommittee); var sc = new ContractParametersContext(snapshot, header, TestProtocolSettings.SoleNode.Network); - var signature = header.Sign(account.GetKey(), TestProtocolSettings.SoleNode.Network); + var signature = header.Sign(account.GetKey()!, TestProtocolSettings.SoleNode.Network); sc.AddSignature(contract, TestProtocolSettings.SoleNode.StandbyCommittee[0], [.. signature]); block.Header.Witness = sc.GetWitnesses()[0]; @@ -90,7 +90,7 @@ public static void TransactionAdd(DataCache snapshot, params TransactionState[] { foreach (var tx in txs) { - var key = NativeContract.Ledger.CreateStorageKey(Prefix_Transaction, tx.Transaction.Hash); + var key = NativeContract.Ledger.CreateStorageKey(Prefix_Transaction, tx.Transaction!.Hash); snapshot.Add(key, new StorageItem(tx)); } } diff --git a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Transaction.cs b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Transaction.cs index 752b75309..f6af3dddd 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Transaction.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.Transaction.cs @@ -49,13 +49,13 @@ public static Transaction CreateValidTx(DataCache snapshot, NEP6Wallet wallet, U Assert.IsNull(data.GetSignatures(tx.Sender)); Assert.IsTrue(wallet.Sign(data)); Assert.IsTrue(data.Completed); - Assert.HasCount(1, data.GetSignatures(tx.Sender)); + Assert.HasCount(1, data.GetSignatures(tx.Sender)!); tx.Witnesses = data.GetWitnesses(); return tx; } - public static Transaction CreateInvalidTransaction(DataCache snapshot, NEP6Wallet wallet, WalletAccount account, InvalidTransactionType type, UInt256 conflict = null) + public static Transaction CreateInvalidTransaction(DataCache snapshot, NEP6Wallet wallet, WalletAccount account, InvalidTransactionType type, UInt256? conflict = null) { var sender = account.ScriptHash; @@ -95,7 +95,7 @@ public static Transaction CreateInvalidTransaction(DataCache snapshot, NEP6Walle case InvalidTransactionType.Conflicting: // To create a conflicting transaction, we'd need another valid transaction. // For simplicity, we'll just add a Conflicts attribute with a random hash. - tx.Attributes = [new Conflicts { Hash = conflict }]; + tx.Attributes = [new Conflicts { Hash = conflict! }]; break; } @@ -103,7 +103,7 @@ public static Transaction CreateInvalidTransaction(DataCache snapshot, NEP6Walle Assert.IsNull(data.GetSignatures(tx.Sender)); Assert.IsTrue(wallet.Sign(data)); Assert.IsTrue(data.Completed); - Assert.HasCount(1, data.GetSignatures(tx.Sender)); + Assert.HasCount(1, data.GetSignatures(tx.Sender)!); tx.Witnesses = data.GetWitnesses(); if (type == InvalidTransactionType.InvalidSignature) { diff --git a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.cs b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.cs index 4feda554c..08c12e92a 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/TestUtils.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/TestUtils.cs @@ -36,7 +36,7 @@ public static UInt160 RandomUInt160() return new UInt160(data); } - public static StorageKey CreateStorageKey(this NativeContract contract, byte prefix, ISerializableSpan key = null) + public static StorageKey CreateStorageKey(this NativeContract contract, byte prefix, ISerializableSpan? key = null) { var k = new KeyBuilder(contract.Id, prefix); if (key != null) k = k.Add(key); @@ -59,7 +59,7 @@ public static NEP6Wallet GenerateTestWallet(string password) ["extra"] = null }; Assert.AreEqual("{\"name\":\"noname\",\"version\":\"1.0\",\"scrypt\":{\"n\":2,\"r\":1,\"p\":1},\"accounts\":[],\"extra\":null}", wallet.ToString()); - return new NEP6Wallet(null, password, TestProtocolSettings.Default, wallet); + return new NEP6Wallet(null!, password, TestProtocolSettings.Default, wallet); } public static void StorageItemAdd(DataCache snapshot, int id, byte[] keyValue, byte[] value) diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_Parameters.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_Parameters.cs index ec1490d4b..b60327f82 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_Parameters.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_Parameters.cs @@ -9,7 +9,6 @@ // Redistribution and use in source and binary forms with or without // modifications are permitted. -using Neo.Extensions; using Neo.Json; using Neo.Network.P2P.Payloads; using Neo.Plugins.RpcServer.Model; @@ -401,7 +400,6 @@ public void TestAdditionalEdgeCases() // Test conversion of empty or null values Assert.AreEqual(0, ParameterConverter.AsParameter("", typeof(int))); - Assert.ThrowsExactly(() => _ = ParameterConverter.AsParameter(JToken.Null, typeof(int))); // Test conversion to non-numeric types Assert.ThrowsExactly(() => _ = ParameterConverter.AsParameter(42, typeof(DateTime))); diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcErrorHandling.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcErrorHandling.cs index 35749e716..5bf57526d 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcErrorHandling.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcErrorHandling.cs @@ -25,12 +25,12 @@ namespace Neo.Plugins.RpcServer.Tests; [TestClass] public class UT_RpcErrorHandling { - private MemoryStore _memoryStore; - private TestMemoryStoreProvider _memoryStoreProvider; - private NeoSystem _neoSystem; - private RpcServer _rpcServer; - private NEP6Wallet _wallet; - private WalletAccount _walletAccount; + private MemoryStore _memoryStore = null!; + private TestMemoryStoreProvider _memoryStoreProvider = null!; + private NeoSystem _neoSystem = null!; + private RpcServer _rpcServer = null!; + private NEP6Wallet _wallet = null!; + private WalletAccount _walletAccount = null!; [TestInitialize] public void TestSetup() @@ -94,13 +94,13 @@ public async Task TestDuplicateTransactionErrorCodeInJsonResponse() // Verify that the error code in the JSON response is -501 (Inventory already exists) Assert.IsNotNull(response["error"]); Console.WriteLine($"Response: {response}"); - Console.WriteLine($"Error code: {response["error"]["code"].AsNumber()}"); + Console.WriteLine($"Error code: {response["error"]!["code"]!.AsNumber()}"); Console.WriteLine($"Expected code: {RpcError.AlreadyExists.Code}"); - Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]["code"].AsNumber()); + Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]!["code"]!.AsNumber()); // The message might include additional data and stack trace in DEBUG mode, // so just check that it contains the expected message - var actualMessage = response["error"]["message"].AsString(); + var actualMessage = response["error"]!["message"]!.AsString(); Assert.Contains(RpcError.AlreadyExists.Message, actualMessage, $"Expected message to contain '{RpcError.AlreadyExists.Message}' but got '{actualMessage}'"); } @@ -128,18 +128,18 @@ public async Task TestDuplicateTransactionErrorCodeWithDynamicInvoke() }; // Process the request directly through the RPC server - var response = await _rpcServer.ProcessRequestAsync(context, request); + var response = (await _rpcServer.ProcessRequestAsync(context, request))!; // Verify that the error code in the JSON response is -501 (Inventory already exists) Assert.IsNotNull(response["error"]); Console.WriteLine($"Response: {response}"); - Console.WriteLine($"Error code: {response["error"]["code"].AsNumber()}"); + Console.WriteLine($"Error code: {response["error"]!["code"]!.AsNumber()}"); Console.WriteLine($"Expected code: {RpcError.AlreadyExists.Code}"); - Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]["code"].AsNumber()); + Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]!["code"]!.AsNumber()); // The message might include additional data and stack trace in DEBUG mode, // so just check that it contains the expected message - var actualMessage = response["error"]["message"].AsString(); + var actualMessage = response["error"]!["message"]!.AsString(); Assert.Contains(RpcError.AlreadyExists.Message, actualMessage, $"Expected message to contain '{RpcError.AlreadyExists.Message}' but got '{actualMessage}'"); } @@ -293,18 +293,18 @@ public async Task TestDynamicInvokeExceptionUnwrapping() }; // Process the request - this should use the standard RPC processing - var response = await _rpcServer.ProcessRequestAsync(context, request); + var response = (await _rpcServer.ProcessRequestAsync(context, request))!; // Verify that the error code in the JSON response is -501 (Inventory already exists) Assert.IsNotNull(response["error"]); Console.WriteLine($"Response: {response}"); - Console.WriteLine($"Error code: {response["error"]["code"].AsNumber()}"); + Console.WriteLine($"Error code: {response["error"]!["code"]!.AsNumber()}"); Console.WriteLine($"Expected code: {RpcError.AlreadyExists.Code}"); - Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]["code"].AsNumber()); + Assert.AreEqual(RpcError.AlreadyExists.Code, response["error"]!["code"]!.AsNumber()); // The message might include additional data and stack trace in DEBUG mode, // so just check that it contains the expected message - var actualMessage = response["error"]["message"].AsString(); + var actualMessage = response["error"]!["message"]!.AsString(); Assert.Contains(RpcError.AlreadyExists.Message, actualMessage, $"Expected message to contain '{RpcError.AlreadyExists.Message}' but got '{actualMessage}'"); } @@ -317,8 +317,8 @@ private async Task SimulatePostRequest(string requestBody) context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestBody)); context.Request.ContentType = "application/json"; - JToken requestJson = null; - JToken responseJson = null; + JToken? requestJson = null; + JToken responseJson; try { requestJson = JToken.Parse(requestBody); @@ -334,7 +334,7 @@ private async Task SimulatePostRequest(string requestBody) try { // Extract the method and parameters - var method = singleRequest["method"].AsString(); + var method = singleRequest["method"]!.AsString(); var parameters = singleRequest["params"] as JArray; // For sendrawtransaction, directly call the method to ensure proper error handling @@ -342,7 +342,7 @@ private async Task SimulatePostRequest(string requestBody) { try { - var result = _rpcServer.SendRawTransaction(parameters[0].AsString()); + var result = _rpcServer.SendRawTransaction(parameters[0]!.AsString()); // Create a successful response responseJson = new JObject() { @@ -365,13 +365,13 @@ private async Task SimulatePostRequest(string requestBody) else { // For other methods, use the standard processing - responseJson = await _rpcServer.ProcessRequestAsync(context, singleRequest); + responseJson = (await _rpcServer.ProcessRequestAsync(context, singleRequest))!; } } catch (Exception) { // Fallback to standard processing - responseJson = await _rpcServer.ProcessRequestAsync(context, singleRequest); + responseJson = (await _rpcServer.ProcessRequestAsync(context, singleRequest))!; } } else if (requestJson is JArray batchRequest) diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs index a9b1c5a25..3aec57b9d 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Blockchain.cs @@ -91,7 +91,7 @@ public void TestGetBlockByIndex() public void TestGetBlock_Genesis() { var snapshot = _neoSystem.GetSnapshotCache(); - var genesisBlock = NativeContract.Ledger.GetBlock(snapshot, 0); + var genesisBlock = NativeContract.Ledger.GetBlock(snapshot, 0)!; // Test non-verbose var resultNonVerbose = _rpcServer.GetBlock(new BlockHashOrIndex(0), false); @@ -103,13 +103,13 @@ public void TestGetBlock_Genesis() var resultVerbose = _rpcServer.GetBlock(new BlockHashOrIndex(0), true); var expectedJson = genesisBlock.ToJson(TestProtocolSettings.Default); expectedJson["confirmations"] = NativeContract.Ledger.CurrentIndex(snapshot) - genesisBlock.Index + 1; - Assert.AreEqual(expectedJson["hash"].AsString(), resultVerbose["hash"].AsString()); - Assert.AreEqual(expectedJson["size"].AsNumber(), resultVerbose["size"].AsNumber()); - Assert.AreEqual(expectedJson["version"].AsNumber(), resultVerbose["version"].AsNumber()); - Assert.AreEqual(expectedJson["merkleroot"].AsString(), resultVerbose["merkleroot"].AsString()); - Assert.AreEqual(expectedJson["confirmations"].AsNumber(), resultVerbose["confirmations"].AsNumber()); + Assert.AreEqual(expectedJson["hash"]!.AsString(), resultVerbose["hash"]!.AsString()); + Assert.AreEqual(expectedJson["size"]!.AsNumber(), resultVerbose["size"]!.AsNumber()); + Assert.AreEqual(expectedJson["version"]!.AsNumber(), resultVerbose["version"]!.AsNumber()); + Assert.AreEqual(expectedJson["merkleroot"]!.AsString(), resultVerbose["merkleroot"]!.AsString()); + Assert.AreEqual(expectedJson["confirmations"]!.AsNumber(), resultVerbose["confirmations"]!.AsNumber()); // Genesis block should have 0 transactions - Assert.IsEmpty((JArray)resultVerbose["tx"]); + Assert.IsEmpty((JArray)resultVerbose["tx"]!); } [TestMethod] @@ -146,10 +146,10 @@ public void TestGetBlock_NoTransactions() var resultVerbose = _rpcServer.GetBlock(new BlockHashOrIndex(block.Index), true); var expectedJson = block.ToJson(TestProtocolSettings.Default); expectedJson["confirmations"] = NativeContract.Ledger.CurrentIndex(snapshot) - block.Index + 1; - Assert.AreEqual(expectedJson["hash"].AsString(), resultVerbose["hash"].AsString()); - Assert.IsEmpty((JArray)resultVerbose["tx"]); + Assert.AreEqual(expectedJson["hash"]!.AsString(), resultVerbose["hash"]!.AsString()); + Assert.IsEmpty((JArray)resultVerbose["tx"]!); - var ex = Assert.ThrowsExactly(() => _rpcServer.GetBlock(null, true)); + var ex = Assert.ThrowsExactly(() => _rpcServer.GetBlock(null!, true)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); } @@ -200,7 +200,7 @@ public void TestGetBlockHeader() var header2 = headerArr.AsSerializable
(); Assert.AreEqual(block.Header.ToJson(_neoSystem.Settings).ToString(), header2.ToJson(_neoSystem.Settings).ToString()); - var ex = Assert.ThrowsExactly(() => _rpcServer.GetBlockHeader(null, true)); + var ex = Assert.ThrowsExactly(() => _rpcServer.GetBlockHeader(null!, true)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); } @@ -230,7 +230,7 @@ public void TestGetContractState() var ex2 = Assert.ThrowsExactly(() => _ = _rpcServer.GetContractState(new(contractState.Id))); Assert.AreEqual(RpcError.UnknownContract.Message, ex2.Message); - var ex3 = Assert.ThrowsExactly(() => _ = _rpcServer.GetContractState(null)); + var ex3 = Assert.ThrowsExactly(() => _ = _rpcServer.GetContractState(null!)); Assert.AreEqual(RpcError.InvalidParams.Code, ex3.HResult); } @@ -242,9 +242,9 @@ public void TestGetContractState_Native_CaseInsensitive() var resultUpper = _rpcServer.GetContractState(new ContractNameOrHashOrId("GASTOKEN")); var resultMixed = _rpcServer.GetContractState(new ContractNameOrHashOrId("GasToken")); - Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultLower)["hash"].AsString()); - Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultUpper)["hash"].AsString()); - Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultMixed)["hash"].AsString()); + Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultLower)["hash"]!.AsString()); + Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultUpper)["hash"]!.AsString()); + Assert.AreEqual(gasTokenHash.ToString(), ((JObject)resultMixed)["hash"]!.AsString()); } [TestMethod] @@ -270,10 +270,10 @@ public void TestGetRawMemPool() _neoSystem.MemPool.TryAdd(tx, snapshot); var result = _rpcServer.GetRawMemPool(); - Assert.IsTrue(((JArray)result).Any(p => p.AsString() == tx.Hash.ToString())); + Assert.IsTrue(((JArray)result).Any(p => p!.AsString() == tx.Hash.ToString())); result = _rpcServer.GetRawMemPool(true); - Assert.IsTrue(((JArray)result["verified"]).Any(p => p.AsString() == tx.Hash.ToString())); + Assert.IsTrue(((JArray)result["verified"]!).Any(p => p!.AsString() == tx.Hash.ToString())); } [TestMethod] @@ -290,8 +290,8 @@ public void TestGetRawMemPool_Empty() // Test with unverified result = _rpcServer.GetRawMemPool(true); Assert.IsInstanceOfType(result, typeof(JObject)); - Assert.IsEmpty((JArray)((JObject)result)["verified"]); - Assert.IsEmpty((JArray)((JObject)result)["unverified"]); + Assert.IsEmpty((JArray)((JObject)result)["verified"]!); + Assert.IsEmpty((JArray)((JObject)result)["unverified"]!); Assert.IsTrue(((JObject)result).ContainsProperty("height")); } @@ -320,8 +320,8 @@ public void TestGetRawMemPool_MixedVerifiedUnverified() // Call the RPC method var result = _rpcServer.GetRawMemPool(true); Assert.IsInstanceOfType(result, typeof(JObject)); - var actualVerifiedHashes = ((JArray)((JObject)result)["verified"]).Select(p => p.AsString()).ToHashSet(); - var actualUnverifiedHashes = ((JArray)((JObject)result)["unverified"]).Select(p => p.AsString()).ToHashSet(); + var actualVerifiedHashes = ((JArray)((JObject)result)["verified"]!).Select(p => p!.AsString()).ToHashSet(); + var actualUnverifiedHashes = ((JArray)((JObject)result)["unverified"]!).Select(p => p!.AsString()).ToHashSet(); // Assert counts and contents match the pool's state Assert.HasCount(expectedVerifiedCount, actualVerifiedHashes); @@ -348,7 +348,7 @@ public void TestGetRawTransaction() var tx2 = Convert.FromBase64String(result.AsString()).AsSerializable(); Assert.AreEqual(tx.ToJson(_neoSystem.Settings).ToString(), tx2.ToJson(_neoSystem.Settings).ToString()); - var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetRawTransaction(null, true)); + var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetRawTransaction(null!, true)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); } @@ -378,9 +378,9 @@ public void TestGetRawTransaction_Confirmed() Assert.IsInstanceOfType(resultVerbose, typeof(JObject)); Assert.AreEqual(expectedJson.ToString(), resultVerbose.ToString()); // Compare full JSON for simplicity here - Assert.AreEqual(block.Hash.ToString(), ((JObject)resultVerbose)["blockhash"].AsString()); - Assert.AreEqual(expectedJson["confirmations"].AsNumber(), ((JObject)resultVerbose)["confirmations"].AsNumber()); - Assert.AreEqual(block.Header.Timestamp, ((JObject)resultVerbose)["blocktime"].AsNumber()); + Assert.AreEqual(block.Hash.ToString(), ((JObject)resultVerbose)["blockhash"]!.AsString()); + Assert.AreEqual(expectedJson["confirmations"]!.AsNumber(), ((JObject)resultVerbose)["confirmations"]!.AsNumber()); + Assert.AreEqual(block.Header.Timestamp, ((JObject)resultVerbose)["blocktime"]!.AsNumber()); } [TestMethod] @@ -397,10 +397,10 @@ public void TestGetStorage() var result = _rpcServer.GetStorage(new(contractState.Hash), Convert.ToBase64String(key)); Assert.AreEqual(Convert.ToBase64String(value), result.AsString()); - var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(null, Convert.ToBase64String(key))); + var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(null!, Convert.ToBase64String(key))); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); - var ex2 = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(new(contractState.Hash), null)); + var ex2 = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(new(contractState.Hash), null!)); Assert.AreEqual(RpcError.InvalidParams.Code, ex2.HResult); } @@ -440,8 +440,8 @@ public void TestFindStorage() .ForEach(i => TestUtils.StorageItemAdd(snapshot, contractState.Id, [0x01, (byte)i], [0x02])); snapshot.Commit(); var result4 = _rpcServer.FindStorage(new(contractState.Hash), Convert.ToBase64String(new byte[] { 0x01 }), 0); - Assert.AreEqual(RpcServersSettings.Default.FindStoragePageSize, result4["next"].AsNumber()); - Assert.IsTrue(result4["truncated"].AsBoolean()); + Assert.AreEqual(RpcServersSettings.Default.FindStoragePageSize, result4["next"]!.AsNumber()); + Assert.IsTrue(result4["truncated"]!.AsBoolean()); } [TestMethod] @@ -457,20 +457,20 @@ public void TestStorage_NativeContractName() var result = _rpcServer.GetStorage(new("GasToken"), Convert.ToBase64String(key)); Assert.AreEqual(Convert.ToBase64String(value), result.AsString()); - var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(null, Convert.ToBase64String(key))); + var ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(null!, Convert.ToBase64String(key))); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); - ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(new("GasToken"), null)); + ex = Assert.ThrowsExactly(() => _ = _rpcServer.GetStorage(new("GasToken"), null!)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); // FindStorage var result2 = _rpcServer.FindStorage(new("GasToken"), Convert.ToBase64String(key), 0); - Assert.AreEqual(Convert.ToBase64String(value), result2["results"][0]["value"].AsString()); + Assert.AreEqual(Convert.ToBase64String(value), result2["results"]![0]!["value"]!.AsString()); - ex = Assert.ThrowsExactly(() => _ = _rpcServer.FindStorage(null, Convert.ToBase64String(key), 0)); + ex = Assert.ThrowsExactly(() => _ = _rpcServer.FindStorage(null!, Convert.ToBase64String(key), 0)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); - ex = Assert.ThrowsExactly(() => _ = _rpcServer.FindStorage(new("GasToken"), null, 0)); + ex = Assert.ThrowsExactly(() => _ = _rpcServer.FindStorage(new("GasToken"), null!, 0)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); } @@ -493,16 +493,16 @@ public void TestFindStorage_Pagination() // Get first page var resultPage1 = _rpcServer.FindStorage(new(contractState.Hash), Convert.ToBase64String(prefix), 0); - Assert.IsTrue(resultPage1["truncated"].AsBoolean()); - Assert.AreEqual(RpcServersSettings.Default.FindStoragePageSize, ((JArray)resultPage1["results"]).Count); - int nextIndex = (int)resultPage1["next"].AsNumber(); + Assert.IsTrue(resultPage1["truncated"]!.AsBoolean()); + Assert.AreEqual(RpcServersSettings.Default.FindStoragePageSize, ((JArray)resultPage1["results"]!).Count); + int nextIndex = (int)resultPage1["next"]!.AsNumber(); Assert.AreEqual(RpcServersSettings.Default.FindStoragePageSize, nextIndex); // Get second page var resultPage2 = _rpcServer.FindStorage(new(contractState.Hash), Convert.ToBase64String(prefix), nextIndex); - Assert.IsFalse(resultPage2["truncated"].AsBoolean()); - Assert.HasCount(5, (JArray)resultPage2["results"]); - Assert.AreEqual(totalItems, (int)resultPage2["next"].AsNumber()); // Next should be total count + Assert.IsFalse(resultPage2["truncated"]!.AsBoolean()); + Assert.HasCount(5, (JArray)resultPage2["results"]!); + Assert.AreEqual(totalItems, (int)resultPage2["next"]!.AsNumber()); // Next should be total count } [TestMethod] @@ -524,23 +524,23 @@ public void TestFindStorage_Pagination_End() // Get all items (assuming page size is larger than 3) var resultPage1 = _rpcServer.FindStorage(new(contractState.Hash), Convert.ToBase64String(prefix), 0); - Assert.IsFalse(resultPage1["truncated"].AsBoolean()); - Assert.AreEqual(totalItems, ((JArray)resultPage1["results"]).Count); - int nextIndex = (int)resultPage1["next"].AsNumber(); + Assert.IsFalse(resultPage1["truncated"]!.AsBoolean()); + Assert.AreEqual(totalItems, ((JArray)resultPage1["results"]!).Count); + int nextIndex = (int)resultPage1["next"]!.AsNumber(); Assert.AreEqual(totalItems, nextIndex); // Try to get next page (should be empty) var resultPage2 = _rpcServer.FindStorage(new(contractState.Hash), Convert.ToBase64String(prefix), nextIndex); - Assert.IsFalse(resultPage2["truncated"].AsBoolean()); - Assert.IsEmpty((JArray)resultPage2["results"]); - Assert.AreEqual(nextIndex, (int)resultPage2["next"].AsNumber()); // Next index should remain the same + Assert.IsFalse(resultPage2["truncated"]!.AsBoolean()); + Assert.IsEmpty((JArray)resultPage2["results"]!); + Assert.AreEqual(nextIndex, (int)resultPage2["next"]!.AsNumber()); // Next index should remain the same var ex = Assert.ThrowsExactly( - () => _ = _rpcServer.FindStorage(null, Convert.ToBase64String(prefix), 0)); + () => _ = _rpcServer.FindStorage(null!, Convert.ToBase64String(prefix), 0)); Assert.AreEqual(RpcError.InvalidParams.Code, ex.HResult); var ex2 = Assert.ThrowsExactly( - () => _ = _rpcServer.FindStorage(new(contractState.Hash), null, 0)); + () => _ = _rpcServer.FindStorage(new(contractState.Hash), null!, 0)); Assert.AreEqual(RpcError.InvalidParams.Code, ex2.HResult); } @@ -636,7 +636,7 @@ public void TestGetNativeContracts() var snapshot = _neoSystem.GetSnapshotCache(); var result = _rpcServer.GetNativeContracts(); var states = NativeContract.Contracts - .Select(p => NativeContract.ContractManagement.GetContract(snapshot, p.Hash).ToJson()); + .Select(p => NativeContract.ContractManagement.GetContract(snapshot, p.Hash)!.ToJson()); var contracts = new JArray(states); Assert.AreEqual(contracts.ToString(), result.ToString()); } @@ -794,7 +794,7 @@ public void TestGetTransactionHeightUnknownTransaction() Assert.AreEqual(RpcError.UnknownTransaction.Code, ex.HResult); } - var ex2 = Assert.ThrowsExactly(() => _ = _rpcServer.GetTransactionHeight(null)); + var ex2 = Assert.ThrowsExactly(() => _ = _rpcServer.GetTransactionHeight(null!)); Assert.AreEqual(RpcError.InvalidParams.Code, ex2.HResult); } diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs index 7b4bc999b..a1e7d317d 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Node.cs @@ -45,7 +45,7 @@ public void TestGetPeers() Assert.IsInstanceOfType(result, typeof(JObject)); var json = (JObject)result; Assert.IsTrue(json.ContainsProperty("unconnected")); - Assert.HasCount(3, json["unconnected"] as JArray); + Assert.HasCount(3, (JArray)json["unconnected"]!); Assert.IsTrue(json.ContainsProperty("bad")); Assert.IsTrue(json.ContainsProperty("connected")); } @@ -64,7 +64,7 @@ public void TestGetPeers_NoUnconnected() Assert.IsInstanceOfType(result, typeof(JObject)); var json = (JObject)result; Assert.IsTrue(json.ContainsProperty("unconnected")); - Assert.IsEmpty(json["unconnected"] as JArray); + Assert.IsEmpty((JArray)json["unconnected"]!); Assert.IsTrue(json.ContainsProperty("bad")); Assert.IsTrue(json.ContainsProperty("connected")); } @@ -85,7 +85,7 @@ public void TestGetPeers_NoConnected() Assert.IsTrue(json.ContainsProperty("unconnected")); Assert.IsTrue(json.ContainsProperty("bad")); Assert.IsTrue(json.ContainsProperty("connected")); - Assert.IsEmpty(json["connected"] as JArray); // Directly check connected count + Assert.IsEmpty((JArray)json["connected"]!); // Directly check connected count } [TestMethod] @@ -100,7 +100,7 @@ public void TestGetVersion() Assert.IsTrue(json.ContainsProperty("useragent")); Assert.IsTrue(json.ContainsProperty("protocol")); - var protocol = (JObject)json["protocol"]; + var protocol = (JObject)json["protocol"]!; Assert.IsTrue(protocol.ContainsProperty("addressversion")); Assert.IsTrue(protocol.ContainsProperty("network")); Assert.IsTrue(protocol.ContainsProperty("validatorscount")); @@ -121,21 +121,21 @@ public void TestGetVersion_HardforksStructure() var json = (JObject)result; Assert.IsTrue(json.ContainsProperty("protocol")); - var protocol = (JObject)json["protocol"]; + var protocol = (JObject)json["protocol"]!; Assert.IsTrue(protocol.ContainsProperty("hardforks")); - var hardforks = (JArray)protocol["hardforks"]; + var hardforks = (JArray)protocol["hardforks"]!; // Check if there are any hardforks defined in settings if (hardforks.Count > 0) { Assert.IsTrue(hardforks.All(hf => hf is JObject)); // Each item should be an object - foreach (JObject hfJson in hardforks) + foreach (JObject hfJson in hardforks.Cast()) { Assert.IsTrue(hfJson.ContainsProperty("name")); Assert.IsTrue(hfJson.ContainsProperty("blockheight")); Assert.IsInstanceOfType(hfJson["name"], typeof(JString)); Assert.IsInstanceOfType(hfJson["blockheight"], typeof(JNumber)); - Assert.DoesNotStartWith("HF_", hfJson["name"].AsString()); // Check if prefix was stripped + Assert.DoesNotStartWith("HF_", hfJson["name"]!.AsString()); // Check if prefix was stripped } } // If no hardforks are defined, the array should be empty @@ -374,7 +374,7 @@ public void TestSubmitBlock_InvalidIndex() [TestMethod] public void TestSendRawTransaction_NullInput() { - var exception = Assert.ThrowsExactly(() => _ = _rpcServer.SendRawTransaction((string)null), + var exception = Assert.ThrowsExactly(() => _ = _rpcServer.SendRawTransaction(null!), "Should throw RpcException for null input"); Assert.AreEqual(RpcError.InvalidParams.Code, exception.HResult); } @@ -390,7 +390,7 @@ public void TestSendRawTransaction_EmptyInput() [TestMethod] public void TestSubmitBlock_NullInput() { - var exception = Assert.ThrowsExactly(() => _ = _rpcServer.SubmitBlock((string)null), + var exception = Assert.ThrowsExactly(() => _ = _rpcServer.SubmitBlock(null!), "Should throw RpcException for null input"); Assert.AreEqual(RpcError.InvalidParams.Code, exception.HResult); } diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs index fd053138b..0d720ea77 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.SmartContract.cs @@ -73,13 +73,13 @@ public void TestInvokeFunction() Assert.AreEqual(resp["script"], NeoTotalSupplyScript); Assert.IsTrue(resp.ContainsProperty("gasconsumed")); Assert.IsTrue(resp.ContainsProperty("diagnostics")); - Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], s_neoHash); - Assert.IsEmpty((JArray)resp["diagnostics"]["storagechanges"]); + Assert.AreEqual(resp["diagnostics"]!["invokedcontracts"]!["call"]![0]!["hash"], s_neoHash); + Assert.IsEmpty((JArray)resp["diagnostics"]!["storagechanges"]!); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); Assert.IsNull(resp["exception"]); - Assert.IsEmpty((JArray)resp["notifications"]); - Assert.AreEqual(nameof(Integer), resp["stack"][0]["type"]); - Assert.AreEqual("100000000", resp["stack"][0]["value"]); + Assert.IsEmpty((JArray)resp["notifications"]!); + Assert.AreEqual(nameof(Integer), resp["stack"]![0]!["type"]); + Assert.AreEqual("100000000", resp["stack"]![0]!["value"]); Assert.IsTrue(resp.ContainsProperty("tx")); resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "symbol"); @@ -88,9 +88,9 @@ public void TestInvokeFunction() Assert.IsTrue(resp.ContainsProperty("gasconsumed")); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); Assert.IsNull(resp["exception"]); - Assert.IsEmpty((JArray)resp["notifications"]); - Assert.AreEqual(nameof(ByteString), resp["stack"][0]["type"]); - Assert.AreEqual(resp["stack"][0]["value"], Convert.ToBase64String(Encoding.UTF8.GetBytes("NEO"))); + Assert.IsEmpty((JArray)resp["notifications"]!); + Assert.AreEqual(nameof(ByteString), resp["stack"]![0]!["type"]); + Assert.AreEqual(resp["stack"]![0]!["value"], Convert.ToBase64String(Encoding.UTF8.GetBytes("NEO"))); // This call triggers not only NEO but also unclaimed GAS resp = (JObject)_rpcServer.InvokeFunction( @@ -109,19 +109,19 @@ public void TestInvokeFunction() Assert.AreEqual(resp["script"], NeoTransferScript); Assert.IsTrue(resp.ContainsProperty("gasconsumed")); Assert.IsTrue(resp.ContainsProperty("diagnostics")); - Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], s_neoHash); - Assert.HasCount(4, (JArray)resp["diagnostics"]["storagechanges"]); + Assert.AreEqual(resp["diagnostics"]!["invokedcontracts"]!["call"]![0]!["hash"], s_neoHash); + Assert.HasCount(4, (JArray)resp["diagnostics"]!["storagechanges"]!); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); Assert.AreEqual(resp["exception"], $"The smart contract or address {MultisigScriptHash} ({MultisigAddress}) is not found. " + $"If this is your wallet address and you want to sign a transaction with it, make sure you have opened this wallet."); - JArray notifications = (JArray)resp["notifications"]; + JArray notifications = (JArray)resp["notifications"]!; Assert.HasCount(2, notifications); - Assert.AreEqual("Transfer", notifications[0]["eventname"].AsString()); - Assert.AreEqual(notifications[0]["contract"].AsString(), s_neoHash); - Assert.AreEqual("1", notifications[0]["state"]["value"][2]["value"]); - Assert.AreEqual("Transfer", notifications[1]["eventname"].AsString()); - Assert.AreEqual(notifications[1]["contract"].AsString(), s_gasHash); - Assert.AreEqual("50000000", notifications[1]["state"]["value"][2]["value"]); + Assert.AreEqual("Transfer", notifications[0]!["eventname"]!.AsString()); + Assert.AreEqual(notifications[0]!["contract"]!.AsString(), s_neoHash); + Assert.AreEqual("1", notifications[0]!["state"]!["value"]![2]!["value"]); + Assert.AreEqual("Transfer", notifications[1]!["eventname"]!.AsString()); + Assert.AreEqual(notifications[1]!["contract"]!.AsString(), s_gasHash); + Assert.AreEqual("50000000", notifications[1]!["state"]!["value"]![2]!["value"]); _rpcServer.wallet = null; } @@ -140,12 +140,12 @@ public void TestInvokeFunctionInvalid() ["params"] = new JArray("0", "totalSupply", new JArray([]), validatorSigner, true), }; - var resp = _rpcServer.ProcessRequestAsync(context, json).GetAwaiter().GetResult(); + var resp = _rpcServer.ProcessRequestAsync(context, json).GetAwaiter().GetResult()!; Console.WriteLine(resp); Assert.AreEqual(3, resp.Count); Assert.IsNotNull(resp["error"]); - Assert.AreEqual(-32602, resp["error"]["code"]); + Assert.AreEqual(-32602, resp["error"]!["code"]); _rpcServer.wallet = null; } @@ -161,17 +161,17 @@ public void TestInvokeScript() Assert.AreEqual(7, resp.Count); Assert.IsTrue(resp.ContainsProperty("gasconsumed")); Assert.IsTrue(resp.ContainsProperty("diagnostics")); - Assert.AreEqual(resp["diagnostics"]["invokedcontracts"]["call"][0]["hash"], s_neoHash); + Assert.AreEqual(resp["diagnostics"]!["invokedcontracts"]!["call"]![0]!["hash"], s_neoHash); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); Assert.IsNull(resp["exception"]); - Assert.IsEmpty((JArray)resp["notifications"]); - Assert.AreEqual(nameof(Integer), resp["stack"][0]["type"]); - Assert.AreEqual("100000000", resp["stack"][0]["value"]); + Assert.IsEmpty((JArray)resp["notifications"]!); + Assert.AreEqual(nameof(Integer), resp["stack"]![0]!["type"]); + Assert.AreEqual("100000000", resp["stack"]![0]!["value"]); resp = (JObject)_rpcServer.InvokeScript(Convert.FromBase64String(NeoTransferScript)); Assert.AreEqual(6, resp.Count); - Assert.AreEqual(nameof(Boolean), resp["stack"][0]["type"]); - Assert.IsFalse(resp["stack"][0]["value"].GetBoolean()); + Assert.AreEqual(nameof(Boolean), resp["stack"]![0]!["type"]); + Assert.IsFalse(resp["stack"]![0]!["value"]!.GetBoolean()); } [TestMethod] @@ -181,9 +181,9 @@ public void TestInvokeFunction_FaultState() var functionName = "nonExistentMethod"; var resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, functionName, []); - Assert.AreEqual(nameof(VMState.FAULT), resp["state"].AsString()); - Assert.IsNotNull(resp["exception"].AsString()); - Assert.Contains("doesn't exist in the contract", resp["exception"].AsString()); // Fix based on test output + Assert.AreEqual(nameof(VMState.FAULT), resp["state"]!.AsString()); + Assert.IsNotNull(resp["exception"]!.AsString()); + Assert.Contains("doesn't exist in the contract", resp["exception"]!.AsString()); // Fix based on test output } [TestMethod] @@ -198,9 +198,9 @@ public void TestInvokeScript_FaultState() } var resp = (JObject)_rpcServer.InvokeScript(abortScript); - Assert.AreEqual(nameof(VMState.FAULT), resp["state"].AsString()); - Assert.IsNotNull(resp["exception"].AsString()); - Assert.Contains("ABORT is executed", resp["exception"].AsString()); // Check for specific ABORT message + Assert.AreEqual(nameof(VMState.FAULT), resp["state"]!.AsString()); + Assert.IsNotNull(resp["exception"]!.AsString()); + Assert.Contains("ABORT is executed", resp["exception"]!.AsString()); // Check for specific ABORT message } [TestMethod] @@ -222,10 +222,10 @@ public void TestInvokeScript_GasLimitExceeded() var tempRpcServer = new RpcServer(_neoSystem, lowGasSettings); var resp = (JObject)tempRpcServer.InvokeScript(loopScript); - Assert.AreEqual(nameof(VMState.FAULT), resp["state"].AsString()); - Assert.IsNotNull(resp["exception"].AsString()); - Assert.Contains("Insufficient GAS", resp["exception"].AsString()); - Assert.IsGreaterThan(lowGasSettings.MaxGasInvoke, long.Parse(resp["gasconsumed"].AsString())); + Assert.AreEqual(nameof(VMState.FAULT), resp["state"]!.AsString()); + Assert.IsNotNull(resp["exception"]!.AsString()); + Assert.Contains("Insufficient GAS", resp["exception"]!.AsString()); + Assert.IsGreaterThan(lowGasSettings.MaxGasInvoke, long.Parse(resp["gasconsumed"]!.AsString())); } [TestMethod] @@ -342,32 +342,32 @@ public void TestInvokeScript_WithDiagnostics() ); Assert.IsTrue(resp.ContainsProperty("diagnostics")); - var diagnostics = (JObject)resp["diagnostics"]; + var diagnostics = (JObject)resp["diagnostics"]!; // Verify Invoked Contracts structure Assert.IsTrue(diagnostics.ContainsProperty("invokedcontracts")); - var invokedContracts = (JObject)diagnostics["invokedcontracts"]; + var invokedContracts = (JObject)diagnostics["invokedcontracts"]!; // Don't assert on root hash for raw script invoke, structure might differ Assert.IsTrue(invokedContracts.ContainsProperty("call")); // Nested calls - var calls = (JArray)invokedContracts["call"]; + var calls = (JArray)invokedContracts["call"]!; Assert.IsGreaterThanOrEqualTo(1, calls.Count); // Should call at least GAS contract for claim // Also check for NEO call, as it's part of the transfer - Assert.IsTrue(calls.Any(c => c["hash"].AsString() == s_neoHash)); // Fix based on test output + Assert.IsTrue(calls.Any(c => c!["hash"]!.AsString() == s_neoHash)); // Fix based on test output // Verify Storage Changes Assert.IsTrue(diagnostics.ContainsProperty("storagechanges")); - var storageChanges = (JArray)diagnostics["storagechanges"]; + var storageChanges = (JArray)diagnostics["storagechanges"]!; Assert.IsGreaterThan(0, storageChanges.Count, "Expected storage changes for transfer"); // Check structure of a storage change item - var firstChange = (JObject)storageChanges[0]; + var firstChange = (JObject)storageChanges[0]!; Assert.IsTrue(firstChange.ContainsProperty("state")); Assert.IsTrue(firstChange.ContainsProperty("key")); Assert.IsTrue(firstChange.ContainsProperty("value")); - Assert.IsTrue(new[] { "Added", "Changed", "Deleted" }.Contains(firstChange["state"].AsString())); + Assert.IsTrue(new[] { "Added", "Changed", "Deleted" }.Contains(firstChange["state"]!.AsString())); } [TestMethod] @@ -375,8 +375,8 @@ public void TestTraverseIterator() { // GetAllCandidates that should return 0 candidates var resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - var sessionId = resp["session"]; - var iteratorId = resp["stack"][0]["id"]; + var sessionId = resp["session"]!; + var iteratorId = resp["stack"]![0]!["id"]!; var respArray = (JArray)_rpcServer.TraverseIterator(sessionId.AsParameter(), iteratorId.AsParameter(), 100); Assert.IsEmpty(respArray); @@ -403,8 +403,8 @@ public void TestTraverseIterator() ValidUntilBlock = NativeContract.Ledger.CurrentIndex(snapshot) + _neoSystem.Settings.MaxValidUntilBlockIncrement, Signers = [new Signer() { Account = ValidatorScriptHash, Scopes = WitnessScope.CalledByEntry }], Attributes = Array.Empty(), - Script = Convert.FromBase64String(resp["script"].AsString()), - Witnesses = null, + Script = Convert.FromBase64String(resp["script"]!.AsString()), + Witnesses = null!, }; var engine = ApplicationEngine.Run(tx.Script, snapshot, container: tx, settings: _neoSystem.Settings, gas: 1200_0000_0000); @@ -412,18 +412,18 @@ public void TestTraverseIterator() // GetAllCandidates that should return 1 candidate resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - sessionId = resp["session"]; - iteratorId = resp["stack"][0]["id"]; + sessionId = resp["session"]!; + iteratorId = resp["stack"]![0]!["id"]!; respArray = (JArray)_rpcServer.TraverseIterator(sessionId.AsParameter(), iteratorId.AsParameter(), 100); Assert.HasCount(1, respArray); - Assert.AreEqual(nameof(Struct), respArray[0]["type"]); + Assert.AreEqual(nameof(Struct), respArray[0]!["type"]); - var value = (JArray)respArray[0]["value"]; + var value = (JArray)respArray[0]!["value"]!; Assert.HasCount(2, value); - Assert.AreEqual(nameof(ByteString), value[0]["type"]); - Assert.AreEqual(value[0]["value"], Convert.ToBase64String(TestProtocolSettings.SoleNode.StandbyCommittee[0].ToArray())); - Assert.AreEqual(nameof(Integer), value[1]["type"]); - Assert.AreEqual("0", value[1]["value"]); + Assert.AreEqual(nameof(ByteString), value[0]!["type"]); + Assert.AreEqual(value[0]!["value"], Convert.ToBase64String(TestProtocolSettings.SoleNode.StandbyCommittee[0].ToArray())); + Assert.AreEqual(nameof(Integer), value[1]!["type"]); + Assert.AreEqual("0", value[1]!["value"]); // No result when traversed again respArray = (JArray)_rpcServer.TraverseIterator(sessionId.AsParameter(), iteratorId.AsParameter(), 100); @@ -431,8 +431,8 @@ public void TestTraverseIterator() // GetAllCandidates again resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - sessionId = resp["session"]; - iteratorId = resp["stack"][0]["id"]; + sessionId = resp["session"]!; + iteratorId = resp["stack"]![0]!["id"]!; // Insufficient result count limit respArray = (JArray)_rpcServer.TraverseIterator(sessionId.AsParameter(), iteratorId.AsParameter(), 0); @@ -449,8 +449,8 @@ public void TestTraverseIterator() // build another session that did not expire resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - var notExpiredSessionId = resp["session"]; - var notExpiredIteratorId = resp["stack"][0]["id"]; + var notExpiredSessionId = resp["session"]!; + var notExpiredIteratorId = resp["stack"]![0]!["id"]!; _rpcServer.OnTimer(new object()); Assert.ThrowsExactly( @@ -460,8 +460,8 @@ public void TestTraverseIterator() // Mocking disposal resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - sessionId = resp["session"]; - iteratorId = resp["stack"][0]["id"]; + sessionId = resp["session"]!; + iteratorId = resp["stack"]![0]!["id"]!; _rpcServer.Dispose_SmartContract(); Assert.ThrowsExactly( @@ -493,8 +493,8 @@ public void TestTraverseIterator_CountLimitExceeded() { // Need an active session and iterator first var resp = (JObject)_rpcServer.InvokeFunction(s_neoHash, "getAllCandidates", [], validatorSigner.AsParameter(), true); - var sessionId = resp["session"]; - var iteratorId = resp["stack"][0]["id"]; + var sessionId = resp["session"]!; + var iteratorId = resp["stack"]![0]!["id"]!; // Request more items than allowed int requestedCount = _rpcServerSettings.MaxIteratorResultItems + 1; diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Utilities.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Utilities.cs index c5e177058..36f8047cc 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Utilities.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Utilities.cs @@ -25,7 +25,7 @@ public void TestListPlugins() resp = (JArray)_rpcServer.ListPlugins(); Assert.HasCount(2, resp); foreach (var p in resp) - Assert.AreEqual(nameof(RpcServer), p["name"]); + Assert.AreEqual(nameof(RpcServer), p!["name"]); } [TestMethod] @@ -34,12 +34,12 @@ public void TestValidateAddress() var validAddr = new JString("NM7Aky765FG8NhhwtxjXRx7jEL1cnw7PBP"); var resp = (JObject)_rpcServer.ValidateAddress(validAddr.AsString()); Assert.AreEqual(resp["address"], validAddr); - Assert.IsTrue(resp["isvalid"].GetBoolean()); + Assert.IsTrue(resp["isvalid"]!.GetBoolean()); var invalidAddr = "ANeo2toNeo3MigrationAddressxwPB2Hz"; resp = (JObject)_rpcServer.ValidateAddress(invalidAddr); Assert.AreEqual(resp["address"], invalidAddr); - Assert.IsFalse(resp["isvalid"].GetBoolean()); + Assert.IsFalse(resp["isvalid"]!.GetBoolean()); } [TestMethod] @@ -48,7 +48,7 @@ public void TestValidateAddress_EmptyString() var emptyAddr = ""; var resp = (JObject)_rpcServer.ValidateAddress(emptyAddr); Assert.AreEqual(resp["address"], emptyAddr); - Assert.IsFalse(resp["isvalid"].GetBoolean()); + Assert.IsFalse(resp["isvalid"]!.GetBoolean()); } [TestMethod] @@ -59,7 +59,7 @@ public void TestValidateAddress_InvalidChecksum() var invalidChecksumAddr = "NM7Aky765FG8NhhwtxjXRx7jEL1cnw7PBO"; var resp = (JObject)_rpcServer.ValidateAddress(invalidChecksumAddr); Assert.AreEqual(resp["address"], invalidChecksumAddr); - Assert.IsFalse(resp["isvalid"].GetBoolean()); + Assert.IsFalse(resp["isvalid"]!.GetBoolean()); } [TestMethod] @@ -69,12 +69,12 @@ public void TestValidateAddress_WrongLength() var shortAddr = "NM7Aky765FG8NhhwtxjXRx7jEL1cnw7P"; var resp = (JObject)_rpcServer.ValidateAddress(shortAddr); Assert.AreEqual(resp["address"], shortAddr); - Assert.IsFalse(resp["isvalid"].GetBoolean()); + Assert.IsFalse(resp["isvalid"]!.GetBoolean()); // Address too long var longAddr = "NM7Aky765FG8NhhwtxjXRx7jEL1cnw7PBPPP"; resp = (JObject)_rpcServer.ValidateAddress(longAddr); Assert.AreEqual(resp["address"], longAddr); - Assert.IsFalse(resp["isvalid"].GetBoolean()); + Assert.IsFalse(resp["isvalid"]!.GetBoolean()); } } diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs index a5f3b27d8..5bfce38e4 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.Wallet.cs @@ -99,10 +99,10 @@ public void TestOpenInvalidWallet() public void TestDumpPrivKey() { TestUtilOpenWallet(); - var account = _rpcServer.wallet.GetAccounts().FirstOrDefault(); + var account = _rpcServer.wallet!.GetAccounts().FirstOrDefault(); Assert.IsNotNull(account); - var privKey = account.GetKey().Export(); + var privKey = account.GetKey()!.Export(); var address = account.Address; var result = _rpcServer.DumpPrivKey(new JString(address).ToAddress(ProtocolSettings.Default.AddressVersion)); Assert.AreEqual(privKey, result.AsString()); @@ -140,7 +140,7 @@ public void TestGetNewAddress() TestUtilOpenWallet(); var result = _rpcServer.GetNewAddress(); Assert.IsInstanceOfType(result, typeof(JString)); - Assert.IsTrue(_rpcServer.wallet.GetAccounts().Any(a => a.Address == result.AsString())); + Assert.IsTrue(_rpcServer.wallet!.GetAccounts().Any(a => a.Address == result.AsString())); TestUtilCloseWallet(); } @@ -195,7 +195,7 @@ public void TestGetWalletUnclaimedGas() public void TestImportPrivKey() { TestUtilOpenWallet(); - var privKey = _walletAccount.GetKey().Export(); + var privKey = _walletAccount.GetKey()!.Export(); var result = _rpcServer.ImportPrivKey(privKey); Assert.IsInstanceOfType(result, typeof(JObject)); @@ -210,7 +210,7 @@ public void TestImportPrivKey() [TestMethod] public void TestImportPrivKeyNoWallet() { - var privKey = _walletAccount.GetKey().Export(); + var privKey = _walletAccount.GetKey()!.Export(); var exception = Assert.ThrowsExactly(() => _ = _rpcServer.ImportPrivKey(privKey)); Assert.AreEqual(exception.HResult, RpcError.NoOpenedWallet.Code); } @@ -232,17 +232,17 @@ public void TestImportPrivKey_KeyAlreadyExists() TestUtilOpenWallet(); // Get a key already in the default test wallet - var existingAccount = _rpcServer.wallet.GetAccounts().First(a => a.HasKey); - var existingWif = existingAccount.GetKey().Export(); + var existingAccount = _rpcServer.wallet!.GetAccounts().First(a => a.HasKey); + var existingWif = existingAccount.GetKey()!.Export(); // Import the existing key var result = (JObject)_rpcServer.ImportPrivKey(existingWif); // Verify the returned account details match the existing one - Assert.AreEqual(existingAccount.Address, result["address"].AsString()); - Assert.AreEqual(existingAccount.HasKey, result["haskey"].AsBoolean()); + Assert.AreEqual(existingAccount.Address, result["address"]!.AsString()); + Assert.AreEqual(existingAccount.HasKey, result["haskey"]!.AsBoolean()); Assert.AreEqual(existingAccount.Label, result["label"]?.AsString()); - Assert.AreEqual(existingAccount.WatchOnly, result["watchonly"].AsBoolean()); + Assert.AreEqual(existingAccount.WatchOnly, result["watchonly"]!.AsBoolean()); // Ensure no duplicate account was created (check count remains same) var initialCount = _rpcServer.wallet.GetAccounts().Count(); @@ -321,10 +321,10 @@ public void TestSendFrom() Assert.AreEqual(12, resp.Count); Assert.AreEqual(resp["sender"], ValidatorAddress); - var signers = (JArray)resp["signers"]; + var signers = (JArray)resp["signers"]!; Assert.HasCount(1, signers); - Assert.AreEqual(signers[0]["account"], ValidatorScriptHash.ToString()); - Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]["scopes"]); + Assert.AreEqual(signers[0]!["account"], ValidatorScriptHash.ToString()); + Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]!["scopes"]); _rpcServer.wallet = null; } @@ -346,10 +346,10 @@ public void TestSendMany() Assert.AreEqual(12, resp.Count); Assert.AreEqual(resp["sender"], ValidatorAddress); - var signers = (JArray)resp["signers"]; + var signers = (JArray)resp["signers"]!; Assert.HasCount(1, signers); - Assert.AreEqual(signers[0]["account"], ValidatorScriptHash.ToString()); - Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]["scopes"]); + Assert.AreEqual(signers[0]!["account"], ValidatorScriptHash.ToString()); + Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]!["scopes"]); _rpcServer.wallet = null; } @@ -369,10 +369,10 @@ public void TestSendToAddress() Assert.AreEqual(12, resp.Count); Assert.AreEqual(resp["sender"], ValidatorAddress); - var signers = (JArray)resp["signers"]; + var signers = (JArray)resp["signers"]!; Assert.HasCount(1, signers); - Assert.AreEqual(signers[0]["account"], ValidatorScriptHash.ToString()); - Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]["scopes"]); + Assert.AreEqual(signers[0]!["account"], ValidatorScriptHash.ToString()); + Assert.AreEqual(nameof(WitnessScope.CalledByEntry), signers[0]!["scopes"]); _rpcServer.wallet = null; } @@ -528,7 +528,7 @@ public void TestGetWalletUnclaimedGas_WhenWalletNotOpen() public void TestImportPrivKey_WhenWalletNotOpen() { _rpcServer.wallet = null; - var privKey = _walletAccount.GetKey().Export(); + var privKey = _walletAccount.GetKey()!.Export(); var exception = Assert.ThrowsExactly( () => _ = _rpcServer.ImportPrivKey(privKey), "Should throw RpcException for no opened wallet"); @@ -604,17 +604,17 @@ public void TestCancelTransaction() "1" ); - var txHash = resp["hash"]; + var txHash = resp["hash"]!; resp = (JObject)_rpcServer.CancelTransaction( txHash.AsParameter(), new JArray(ValidatorAddress).AsParameter(), "1"); Assert.AreEqual(12, resp.Count); Assert.AreEqual(resp["sender"], ValidatorAddress); - var signers = (JArray)resp["signers"]; + var signers = (JArray)resp["signers"]!; Assert.HasCount(1, signers); - Assert.AreEqual(signers[0]["account"], ValidatorScriptHash.ToString()); - Assert.AreEqual(nameof(WitnessScope.None), signers[0]["scopes"]); - Assert.AreEqual(nameof(TransactionAttributeType.Conflicts), resp["attributes"][0]["type"]); + Assert.AreEqual(signers[0]!["account"], ValidatorScriptHash.ToString()); + Assert.AreEqual(nameof(WitnessScope.None), signers[0]!["scopes"]); + Assert.AreEqual(nameof(TransactionAttributeType.Conflicts), resp["attributes"]![0]!["type"]); _rpcServer.wallet = null; } @@ -683,7 +683,7 @@ public void TestInvokeContractVerify() ); Assert.AreEqual(nameof(VMState.HALT), deployResp["state"]); - var deployedScriptHash = new UInt160(Convert.FromBase64String(deployResp["notifications"][0]["state"]["value"][0]["value"].AsString())); + var deployedScriptHash = new UInt160(Convert.FromBase64String(deployResp["notifications"]![0]!["state"]!["value"]![0]!["value"]!.AsString())); var snapshot = _neoSystem.GetSnapshotCache(); var tx = new Transaction { @@ -691,8 +691,8 @@ public void TestInvokeContractVerify() ValidUntilBlock = NativeContract.Ledger.CurrentIndex(snapshot) + _neoSystem.Settings.MaxValidUntilBlockIncrement, Signers = [new Signer() { Account = ValidatorScriptHash, Scopes = WitnessScope.CalledByEntry }], Attributes = Array.Empty(), - Script = Convert.FromBase64String(deployResp["script"].AsString()), - Witnesses = null, + Script = Convert.FromBase64String(deployResp["script"]!.AsString()), + Witnesses = null!, }; var engine = ApplicationEngine.Run(tx.Script, snapshot, container: tx, settings: _neoSystem.Settings, gas: 1200_0000_0000); @@ -701,12 +701,12 @@ public void TestInvokeContractVerify() // invoke verify without signer; should return false var resp = (JObject)_rpcServer.InvokeContractVerify(deployedScriptHash); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); - Assert.IsFalse(resp["stack"][0]["value"].AsBoolean()); + Assert.IsFalse(resp["stack"]![0]!["value"]!.AsBoolean()); // invoke verify with signer; should return true resp = (JObject)_rpcServer.InvokeContractVerify(deployedScriptHash, [], validatorSigner.AsParameter()); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); - Assert.IsTrue(resp["stack"][0]["value"].AsBoolean()); + Assert.IsTrue(resp["stack"]![0]!["value"]!.AsBoolean()); // invoke verify with wrong input value; should FAULT resp = (JObject)_rpcServer.InvokeContractVerify( @@ -718,7 +718,7 @@ public void TestInvokeContractVerify() ); Assert.AreEqual(nameof(VMState.FAULT), resp["state"]); Assert.IsNotNull(resp["exception"]); - Assert.Contains("hashOrPubkey", resp["exception"].AsString()); + Assert.Contains("hashOrPubkey", resp["exception"]!.AsString()); // invoke verify with 1 param and signer; should return true resp = (JObject)_rpcServer.InvokeContractVerify( @@ -729,7 +729,7 @@ public void TestInvokeContractVerify() validatorSigner.AsParameter() ); Assert.AreEqual(nameof(VMState.HALT), resp["state"]); - Assert.IsTrue(resp["stack"][0]["value"].AsBoolean()); + Assert.IsTrue(resp["stack"]![0]!["value"]!.AsBoolean()); // invoke verify with 2 param (which does not exist); should throw Exception Assert.ThrowsExactly( diff --git a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.cs b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.cs index b79f9a775..e5a567fd3 100644 --- a/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.cs +++ b/tests/Neo.Plugins.RpcServer.Tests/UT_RpcServer.cs @@ -26,13 +26,13 @@ namespace Neo.Plugins.RpcServer.Tests; [TestClass] public partial class UT_RpcServer { - private NeoSystem _neoSystem; - private RpcServersSettings _rpcServerSettings; - private RpcServer _rpcServer; - private TestMemoryStoreProvider _memoryStoreProvider; - private MemoryStore _memoryStore; + private NeoSystem _neoSystem = null!; + private RpcServersSettings _rpcServerSettings = null!; + private RpcServer _rpcServer = null!; + private TestMemoryStoreProvider _memoryStoreProvider = null!; + private MemoryStore _memoryStore = null!; private readonly NEP6Wallet _wallet = TestUtils.GenerateTestWallet("123"); - private WalletAccount _walletAccount; + private WalletAccount _walletAccount = null!; [TestInitialize] public void TestSetup() @@ -131,8 +131,8 @@ private async Task SimulatePostRequest(string requestBody) context.Request.Body = new MemoryStream(Encoding.UTF8.GetBytes(requestBody)); context.Request.ContentType = "application/json"; - JToken requestJson = null; - JToken responseJson = null; + JToken? requestJson = null; + JToken responseJson; try { requestJson = JToken.Parse(requestBody); @@ -145,7 +145,7 @@ private async Task SimulatePostRequest(string requestBody) if (requestJson is JObject singleRequest) { - responseJson = await _rpcServer.ProcessRequestAsync(context, singleRequest); + responseJson = (await _rpcServer.ProcessRequestAsync(context, singleRequest))!; } else if (requestJson is JArray batchRequest) { @@ -185,7 +185,7 @@ public async Task TestProcessRequest_MalformedJsonPostBody() var response = await SimulatePostRequest(malformedJson); Assert.IsNotNull(response["error"]); - Assert.AreEqual(RpcError.BadRequest.Code, response["error"]["code"].AsNumber()); + Assert.AreEqual(RpcError.BadRequest.Code, response["error"]!["code"]!.AsNumber()); } [TestMethod] @@ -195,7 +195,7 @@ public async Task TestProcessRequest_EmptyBatch() var response = await SimulatePostRequest(emptyBatchJson); Assert.IsNotNull(response["error"]); - Assert.AreEqual(RpcError.InvalidRequest.Code, response["error"]["code"].AsNumber()); + Assert.AreEqual(RpcError.InvalidRequest.Code, response["error"]!["code"]!.AsNumber()); } [TestMethod] @@ -217,24 +217,24 @@ public async Task TestProcessRequest_MixedBatch() Assert.HasCount(4, batchResults); // Check response 1 (valid getblockcount) - Assert.IsNull(batchResults[0]["error"]); - Assert.IsNotNull(batchResults[0]["result"]); - Assert.AreEqual(1, batchResults[0]["id"].AsNumber()); + Assert.IsNull(batchResults[0]!["error"]); + Assert.IsNotNull(batchResults[0]!["result"]); + Assert.AreEqual(1, batchResults[0]!["id"]!.AsNumber()); // Check response 2 (invalid method) - Assert.IsNotNull(batchResults[1]["error"]); - Assert.AreEqual(RpcError.MethodNotFound.Code, batchResults[1]["error"]["code"].AsNumber()); - Assert.AreEqual(2, batchResults[1]["id"].AsNumber()); + Assert.IsNotNull(batchResults[1]!["error"]); + Assert.AreEqual(RpcError.MethodNotFound.Code, batchResults[1]!["error"]!["code"]!.AsNumber()); + Assert.AreEqual(2, batchResults[1]!["id"]!.AsNumber()); // Check response 3 (invalid params for getblock) - Assert.IsNotNull(batchResults[2]["error"]); - Assert.AreEqual(RpcError.InvalidParams.Code, batchResults[2]["error"]["code"].AsNumber()); - Assert.AreEqual(3, batchResults[2]["id"].AsNumber()); + Assert.IsNotNull(batchResults[2]!["error"]); + Assert.AreEqual(RpcError.InvalidParams.Code, batchResults[2]!["error"]!["code"]!.AsNumber()); + Assert.AreEqual(3, batchResults[2]!["id"]!.AsNumber()); // Check response 4 (valid getversion) - Assert.IsNull(batchResults[3]["error"]); - Assert.IsNotNull(batchResults[3]["result"]); - Assert.AreEqual(4, batchResults[3]["id"].AsNumber()); + Assert.IsNull(batchResults[3]!["error"]); + Assert.IsNotNull(batchResults[3]!["result"]); + Assert.AreEqual(4, batchResults[3]!["id"]!.AsNumber()); } private class MockRpcMethods @@ -289,65 +289,65 @@ public async Task TestRegisterMethods() var output = new StreamReader(responseBody).ReadToEnd(); // Parse the JSON response and check the result - var responseJson = JToken.Parse(output); + var responseJson = JToken.Parse(output)!; Assert.IsNotNull(responseJson["result"]); - Assert.AreEqual("string test", responseJson["result"].AsString()); + Assert.AreEqual("string test", responseJson["result"]!.AsString()); Assert.AreEqual(200, context.Response.StatusCode); } [TestMethod] public void TestNullableParameter() { - var method = typeof(MockRpcMethods).GetMethod("GetMockMethod"); + var method = typeof(MockRpcMethods).GetMethod("GetMockMethod")!; var parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsTrue(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("NullableMethod"); + method = typeof(MockRpcMethods).GetMethod("NullableMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsFalse(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("NullContextMethod"); + method = typeof(MockRpcMethods).GetMethod("NullContextMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsFalse(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("OptionalMethod"); + method = typeof(MockRpcMethods).GetMethod("OptionalMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsFalse(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); Assert.AreEqual("default", parameter.DefaultValue); - method = typeof(MockRpcMethods).GetMethod("IntMethod"); + method = typeof(MockRpcMethods).GetMethod("IntMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsTrue(parameter.Required); Assert.AreEqual(typeof(int), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("IntNullableMethod"); + method = typeof(MockRpcMethods).GetMethod("IntNullableMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsFalse(parameter.Required); Assert.AreEqual(typeof(int?), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("NotNullMethod"); + method = typeof(MockRpcMethods).GetMethod("NotNullMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsTrue(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("AllowNullMethod"); + method = typeof(MockRpcMethods).GetMethod("AllowNullMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsFalse(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); Assert.AreEqual("info", parameter.Name); - method = typeof(MockRpcMethods).GetMethod("DisallowNullMethod"); + method = typeof(MockRpcMethods).GetMethod("DisallowNullMethod")!; parameter = RpcServer.AsRpcParameter(method.GetParameters()[0]); Assert.IsTrue(parameter.Required); Assert.AreEqual(typeof(string), parameter.Type); diff --git a/tests/Neo.Plugins.SQLiteWallet.Tests/Neo.Plugins.SQLiteWallet.Tests.csproj b/tests/Neo.Plugins.SQLiteWallet.Tests/Neo.Plugins.SQLiteWallet.Tests.csproj index 47da73925..567df669d 100644 --- a/tests/Neo.Plugins.SQLiteWallet.Tests/Neo.Plugins.SQLiteWallet.Tests.csproj +++ b/tests/Neo.Plugins.SQLiteWallet.Tests/Neo.Plugins.SQLiteWallet.Tests.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/tests/Neo.Plugins.SignClient.Tests/Neo.Plugins.SignClient.Tests.csproj b/tests/Neo.Plugins.SignClient.Tests/Neo.Plugins.SignClient.Tests.csproj index 902a893fe..01a70f33c 100644 --- a/tests/Neo.Plugins.SignClient.Tests/Neo.Plugins.SignClient.Tests.csproj +++ b/tests/Neo.Plugins.SignClient.Tests/Neo.Plugins.SignClient.Tests.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/tests/Neo.Plugins.StateService.Tests/Neo.Plugins.StateService.Tests.csproj b/tests/Neo.Plugins.StateService.Tests/Neo.Plugins.StateService.Tests.csproj index addc3b7ce..0b644b74d 100644 --- a/tests/Neo.Plugins.StateService.Tests/Neo.Plugins.StateService.Tests.csproj +++ b/tests/Neo.Plugins.StateService.Tests/Neo.Plugins.StateService.Tests.csproj @@ -1,9 +1,5 @@  - - enable - - diff --git a/tests/Neo.Plugins.Storage.Tests/StoreTest.cs b/tests/Neo.Plugins.Storage.Tests/StoreTest.cs index 916e23ae1..f49de0889 100644 --- a/tests/Neo.Plugins.Storage.Tests/StoreTest.cs +++ b/tests/Neo.Plugins.Storage.Tests/StoreTest.cs @@ -21,8 +21,8 @@ public class StoreTest { private const string Path_leveldb = "Data_LevelDB_UT"; private const string Path_rocksdb = "Data_RocksDB_UT"; - private static LevelDBStore s_levelDbStore; - private static RocksDBStore s_rocksDBStore; + private static LevelDBStore s_levelDbStore = null!; + private static RocksDBStore s_rocksDBStore = null!; [AssemblyInitialize] public static void OnStart(TestContext testContext)