diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 3dae25a1df..dca46dbbd6 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -7,12 +7,30 @@ on:
env:
DOTNET_VERSION: 8.0.x
- COVERALL_COLLECT_OUTPUT: "/p:CollectCoverage=true /p:CoverletOutput='${{ github.workspace }}/TestResults/coverage/'"
- COVERALL_MERGE_PATH: "/p:MergeWith='${{ github.workspace }}/TestResults/coverage/coverage.json'"
jobs:
+ Format:
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v4
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v4
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Check Format (*.cs)
+ run: dotnet format --verify-no-changes --verbosity diagnostic
+
+ - name: Build (Neo.CLI)
+ run: |
+ dotnet build ./src/Neo.CLI \
+ --output ./out/Neo.CLI
+
Test:
+ needs: [Format]
timeout-minutes: 15
strategy:
matrix:
@@ -25,14 +43,6 @@ jobs:
uses: actions/setup-dotnet@v4
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- - name: Check format
- if: matrix.os == 'ubuntu-latest'
- run: |
- dotnet format --verify-no-changes --verbosity diagnostic
- - name: Build CLI
- if: matrix.os == 'ubuntu-latest'
- run: |
- dotnet publish ./src/Neo.CLI
- name: Test
if: matrix.os != 'ubuntu-latest'
run: |
@@ -42,31 +52,40 @@ jobs:
if: matrix.os == 'ubuntu-latest'
run: |
sudo apt-get --assume-yes install libleveldb-dev librocksdb-dev
-
- dotnet test ./tests/Neo.Cryptography.BLS12_381.Tests ${{ env.COVERALL_COLLECT_OUTPUT }}
- dotnet test ./tests/Neo.ConsoleService.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.UnitTests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.VM.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.Json.UnitTests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
+
+ dotnet test ./tests/Neo.Cryptography.BLS12_381.Tests --output ./bin/tests/Neo.Cryptography.BLS12_381.Tests
+ dotnet test ./tests/Neo.ConsoleService.Tests --output ./bin/tests/Neo.ConsoleService.Tests
+ dotnet test ./tests/Neo.UnitTests --output ./bin/tests/Neo.UnitTests
+ dotnet test ./tests/Neo.VM.Tests --output ./bin/tests/Neo.VM.Tests
+ dotnet test ./tests/Neo.Json.UnitTests --output ./bin/tests/Neo.Json.UnitTests
# Plugins
- dotnet test ./tests/Neo.Cryptography.MPTTrie.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.Network.RPC.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.Plugins.OracleService.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.Plugins.RpcServer.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }}
- dotnet test ./tests/Neo.Plugins.Storage.Tests ${{ env.COVERALL_COLLECT_OUTPUT }} ${{ env.COVERALL_MERGE_PATH }} /p:CoverletOutputFormat='cobertura'
+ dotnet test ./tests/Neo.Cryptography.MPTTrie.Tests --output ./bin/tests/Neo.Cryptography.MPTTrie.Tests
+ dotnet test ./tests/Neo.Network.RPC.Tests --output ./bin/tests/Neo.Network.RPC.Tests
+ dotnet test ./tests/Neo.Plugins.OracleService.Tests --output ./bin/tests/Neo.Plugins.OracleService.Tests
+ dotnet test ./tests/Neo.Plugins.RpcServer.Tests --output ./bin/tests/Neo.Plugins.RpcServer.Tests
+ dotnet test ./tests/Neo.Plugins.Storage.Tests --output ./bin/tests/Neo.Plugins.Storage.Tests
- name: Coveralls
if: matrix.os == 'ubuntu-latest'
uses: coverallsapp/github-action@v2.3.0
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
- format: cobertura
- file: ${{ github.workspace }}/TestResults/coverage/coverage.cobertura.xml
+ files:
+ ${{ github.workspace }}/tests/Neo.Cryptography.BLS12_381.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.ConsoleService.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.UnitTests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.VM.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Json.UnitTests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Cryptography.MPTTrie.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Network.RPC.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Plugins.OracleService.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Plugins.RpcServer.Tests/TestResults/coverage.info
+ ${{ github.workspace }}/tests/Neo.Plugins.Storage.Tests/TestResults/coverage.info
PublishPackage:
if: github.ref == 'refs/heads/master' && startsWith(github.repository, 'neo-project/')
- needs: Test
+ needs: [Test]
runs-on: ubuntu-latest
steps:
- name: Checkout
@@ -115,7 +134,7 @@ jobs:
Release:
if: github.ref == 'refs/heads/master' && startsWith(github.repository, 'neo-project/')
- needs: Test
+ needs: [Test]
runs-on: ubuntu-latest
steps:
- name: Checkout
diff --git a/src/Neo.CLI/Neo.CLI.csproj b/src/Neo.CLI/Neo.CLI.csproj
index bb52675ec4..a9d4c9919e 100644
--- a/src/Neo.CLI/Neo.CLI.csproj
+++ b/src/Neo.CLI/Neo.CLI.csproj
@@ -10,6 +10,7 @@
Neo.CLI
neo.ico
enable
+ $(SolutionDir)/bin/$(AssemblyTitle)
diff --git a/src/Neo.ConsoleService/Neo.ConsoleService.csproj b/src/Neo.ConsoleService/Neo.ConsoleService.csproj
index 206e18235e..9b3ad32dfe 100644
--- a/src/Neo.ConsoleService/Neo.ConsoleService.csproj
+++ b/src/Neo.ConsoleService/Neo.ConsoleService.csproj
@@ -4,6 +4,7 @@
netstandard2.1;net8.0
Neo.ConsoleService
enable
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo.Cryptography.BLS12_381/Neo.Cryptography.BLS12_381.csproj b/src/Neo.Cryptography.BLS12_381/Neo.Cryptography.BLS12_381.csproj
index 800699719f..d5313d9eab 100644
--- a/src/Neo.Cryptography.BLS12_381/Neo.Cryptography.BLS12_381.csproj
+++ b/src/Neo.Cryptography.BLS12_381/Neo.Cryptography.BLS12_381.csproj
@@ -5,6 +5,8 @@
netstandard2.1;net8.0
enable
enable
+ Neo.Cryptography.BLS12_381
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo.Extensions/Neo.Extensions.csproj b/src/Neo.Extensions/Neo.Extensions.csproj
index 71330a05a3..c6d549be6a 100644
--- a/src/Neo.Extensions/Neo.Extensions.csproj
+++ b/src/Neo.Extensions/Neo.Extensions.csproj
@@ -3,7 +3,9 @@
netstandard2.1;net8.0
enable
+ Neo.Extensions
NEO;Blockchain;Extensions
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo.GUI/Neo.GUI.csproj b/src/Neo.GUI/Neo.GUI.csproj
index 6c7c20912e..014459be4c 100644
--- a/src/Neo.GUI/Neo.GUI.csproj
+++ b/src/Neo.GUI/Neo.GUI.csproj
@@ -11,6 +11,7 @@
Neo.GUI
neo.ico
false
+ $(SolutionDir)/bin/$(AssemblyTitle)
@@ -62,4 +63,4 @@
-
\ No newline at end of file
+
diff --git a/src/Neo.IO/Neo.IO.csproj b/src/Neo.IO/Neo.IO.csproj
index f920a40fd5..a1a0a9ea2e 100644
--- a/src/Neo.IO/Neo.IO.csproj
+++ b/src/Neo.IO/Neo.IO.csproj
@@ -4,7 +4,9 @@
netstandard2.1;net8.0
true
enable
+ Neo.IO
NEO;Blockchain;IO
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo.Json/Neo.Json.csproj b/src/Neo.Json/Neo.Json.csproj
index cc3ea45278..3d75276dec 100644
--- a/src/Neo.Json/Neo.Json.csproj
+++ b/src/Neo.Json/Neo.Json.csproj
@@ -4,7 +4,9 @@
netstandard2.1;net8.0
enable
enable
+ Neo.Json
NEO;JSON
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo.VM/Neo.VM.csproj b/src/Neo.VM/Neo.VM.csproj
index a9157f5bcf..9315a850df 100644
--- a/src/Neo.VM/Neo.VM.csproj
+++ b/src/Neo.VM/Neo.VM.csproj
@@ -4,6 +4,8 @@
netstandard2.1;net8.0
true
enable
+ Neo.VM
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo/Neo.csproj b/src/Neo/Neo.csproj
index a10444df17..707b94fa4c 100644
--- a/src/Neo/Neo.csproj
+++ b/src/Neo/Neo.csproj
@@ -3,7 +3,9 @@
netstandard2.1;net8.0
true
+ Neo
NEO;AntShares;Blockchain;Smart Contract
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Neo/SmartContract/Native/NativeContract.cs b/src/Neo/SmartContract/Native/NativeContract.cs
index be43df68fd..1cc244408d 100644
--- a/src/Neo/SmartContract/Native/NativeContract.cs
+++ b/src/Neo/SmartContract/Native/NativeContract.cs
@@ -35,7 +35,7 @@ public class CacheEntry
public byte[] Script { get; set; }
}
- internal Dictionary NativeContracts { get; set; } = new Dictionary();
+ internal Dictionary NativeContracts { get; set; } = new();
public CacheEntry GetAllowedMethods(NativeContract native, ApplicationEngine engine)
{
@@ -48,12 +48,12 @@ public CacheEntry GetAllowedMethods(NativeContract native, ApplicationEngine eng
}
}
- public delegate bool IsHardforkEnabledDelegate(Hardfork hf, uint index);
- private static readonly List contractsList = new();
- private static readonly Dictionary contractsDictionary = new();
- private readonly ImmutableHashSet usedHardforks;
- private readonly ReadOnlyCollection methodDescriptors;
- private readonly ReadOnlyCollection eventsDescriptors;
+ public delegate bool IsHardforkEnabledDelegate(Hardfork hf, uint blockHeight);
+ private static readonly List s_contractsList = [];
+ private static readonly Dictionary s_contractsDictionary = new();
+ private readonly ImmutableHashSet _usedHardforks;
+ private readonly ReadOnlyCollection _methodDescriptors;
+ private readonly ReadOnlyCollection _eventsDescriptors;
private static int id_counter = 0;
#region Named Native Contracts
@@ -108,7 +108,7 @@ public CacheEntry GetAllowedMethods(NativeContract native, ApplicationEngine eng
///
/// Gets all native contracts.
///
- public static IReadOnlyCollection Contracts { get; } = contractsList;
+ public static IReadOnlyCollection Contracts { get; } = s_contractsList;
///
/// The name of the native contract.
@@ -139,17 +139,17 @@ protected NativeContract()
// Reflection to get the methods
- List listMethods = new();
+ List listMethods = [];
foreach (MemberInfo member in GetType().GetMembers(BindingFlags.Instance | BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.Public))
{
ContractMethodAttribute attribute = member.GetCustomAttribute();
if (attribute is null) continue;
listMethods.Add(new ContractMethodMetadata(member, attribute));
}
- methodDescriptors = listMethods.OrderBy(p => p.Name, StringComparer.Ordinal).ThenBy(p => p.Parameters.Length).ToList().AsReadOnly();
+ _methodDescriptors = listMethods.OrderBy(p => p.Name, StringComparer.Ordinal).ThenBy(p => p.Parameters.Length).ToList().AsReadOnly();
// Reflection to get the events
- eventsDescriptors =
+ _eventsDescriptors =
GetType().GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public, null, Array.Empty(), null)?.
GetCustomAttributes().
// Take into account not only the contract constructor, but also the base type constructor for proper FungibleToken events handling.
@@ -158,26 +158,25 @@ protected NativeContract()
OrderBy(p => p.Order).ToList().AsReadOnly();
// Calculate the initializations forks
- usedHardforks =
- methodDescriptors.Select(u => u.ActiveIn)
- .Concat(methodDescriptors.Select(u => u.DeprecatedIn))
- .Concat(eventsDescriptors.Select(u => u.ActiveIn))
- .Concat(new Hardfork?[] { ActiveIn })
- .Where(u => u is not null)
- .OrderBy(u => (byte)u)
- .Cast().ToImmutableHashSet();
-
- contractsList.Add(this);
- contractsDictionary.Add(Hash, this);
+ _usedHardforks =
+ _methodDescriptors.Select(u => u.ActiveIn)
+ .Concat(_methodDescriptors.Select(u => u.DeprecatedIn))
+ .Concat(_eventsDescriptors.Select(u => u.ActiveIn))
+ .Concat([ActiveIn])
+ .Where(u => u is not null)
+ .OrderBy(u => (byte)u)
+ .Cast().ToImmutableHashSet();
+ s_contractsList.Add(this);
+ s_contractsDictionary.Add(Hash, this);
}
///
/// The allowed methods and his offsets.
///
/// Hardfork checker
- /// Block index
+ /// Block height. Used to check the hardforks and active methods.
/// The .
- private NativeContractsCache.CacheEntry GetAllowedMethods(IsHardforkEnabledDelegate hfChecker, uint index)
+ private NativeContractsCache.CacheEntry GetAllowedMethods(IsHardforkEnabledDelegate hfChecker, uint blockHeight)
{
Dictionary methods = new();
@@ -185,14 +184,14 @@ private NativeContractsCache.CacheEntry GetAllowedMethods(IsHardforkEnabledDeleg
byte[] script;
using (ScriptBuilder sb = new())
{
- foreach (ContractMethodMetadata method in methodDescriptors.Where(u
+ foreach (ContractMethodMetadata method in _methodDescriptors.Where(u
=>
// no hardfork is involved
u.ActiveIn is null && u.DeprecatedIn is null ||
// deprecated method hardfork is involved
- u.DeprecatedIn is not null && hfChecker(u.DeprecatedIn.Value, index) == false ||
+ u.DeprecatedIn is not null && hfChecker(u.DeprecatedIn.Value, blockHeight) == false ||
// active method hardfork is involved
- u.ActiveIn is not null && hfChecker(u.ActiveIn.Value, index))
+ u.ActiveIn is not null && hfChecker(u.ActiveIn.Value, blockHeight))
)
{
method.Descriptor.Offset = sb.Length;
@@ -204,35 +203,35 @@ u.ActiveIn is null && u.DeprecatedIn is null ||
script = sb.ToArray();
}
- return new NativeContractsCache.CacheEntry() { Methods = methods, Script = script };
+ return new NativeContractsCache.CacheEntry { Methods = methods, Script = script };
}
///
/// The of the native contract.
///
/// The where the HardForks are configured.
- /// Block index
+ /// Block index
/// The .
[MethodImpl(MethodImplOptions.AggressiveInlining)]
- public ContractState GetContractState(ProtocolSettings settings, uint index) => GetContractState(settings.IsHardforkEnabled, index);
+ public ContractState GetContractState(ProtocolSettings settings, uint blockHeight) => GetContractState(settings.IsHardforkEnabled, blockHeight);
///
/// The of the native contract.
///
/// Hardfork checker
- /// Block index
+ /// Block height. Used to check hardforks and active methods.
/// The .
- public ContractState GetContractState(IsHardforkEnabledDelegate hfChecker, uint index)
+ public ContractState GetContractState(IsHardforkEnabledDelegate hfChecker, uint blockHeight)
{
// Get allowed methods and nef script
- var allowedMethods = GetAllowedMethods(hfChecker, index);
+ var allowedMethods = GetAllowedMethods(hfChecker, blockHeight);
// Compose nef file
var nef = new NefFile()
{
Compiler = "neo-core-v3.0",
Source = string.Empty,
- Tokens = Array.Empty(),
+ Tokens = [],
Script = allowedMethods.Script
};
nef.CheckSum = NefFile.ComputeChecksum(nef);
@@ -241,17 +240,17 @@ public ContractState GetContractState(IsHardforkEnabledDelegate hfChecker, uint
var manifest = new ContractManifest()
{
Name = Name,
- Groups = Array.Empty(),
- SupportedStandards = Array.Empty(),
- Abi = new ContractAbi()
+ Groups = [],
+ SupportedStandards = [],
+ Abi = new ContractAbi
{
- Events = eventsDescriptors
- .Where(u => u.ActiveIn is null || hfChecker(u.ActiveIn.Value, index))
+ Events = _eventsDescriptors
+ .Where(u => u.ActiveIn is null || hfChecker(u.ActiveIn.Value, blockHeight))
.Select(p => p.Descriptor).ToArray(),
Methods = allowedMethods.Methods.Values
.Select(p => p.Descriptor).ToArray()
},
- Permissions = new[] { ContractPermission.DefaultPermission },
+ Permissions = [ContractPermission.DefaultPermission],
Trusts = WildcardContainer.Create(),
Extra = null
};
@@ -282,7 +281,7 @@ internal bool IsInitializeBlock(ProtocolSettings settings, uint index, out Hardf
var hfs = new List();
// If is in the hardfork height, add them to return array
- foreach (var hf in usedHardforks)
+ foreach (var hf in _usedHardforks)
{
if (!settings.Hardforks.TryGetValue(hf, out var activeIn))
{
@@ -319,9 +318,9 @@ internal bool IsInitializeBlock(ProtocolSettings settings, uint index, out Hardf
/// Is the native contract active
///
/// The where the HardForks are configured.
- /// Block index
+ /// Block height
/// True if the native contract is active
- internal bool IsActive(ProtocolSettings settings, uint index)
+ internal bool IsActive(ProtocolSettings settings, uint blockHeight)
{
if (ActiveIn is null) return true;
@@ -331,7 +330,7 @@ internal bool IsActive(ProtocolSettings settings, uint index)
activeIn = 0;
}
- return activeIn <= index;
+ return activeIn <= blockHeight;
}
///
@@ -357,7 +356,7 @@ private protected KeyBuilder CreateStorageKey(byte prefix)
/// The native contract with the specified hash.
public static NativeContract GetContract(UInt160 hash)
{
- contractsDictionary.TryGetValue(hash, out var contract);
+ s_contractsDictionary.TryGetValue(hash, out var contract);
return contract;
}
@@ -415,7 +414,7 @@ internal async void Invoke(ApplicationEngine engine, byte version)
/// if the contract is native; otherwise, .
public static bool IsNative(UInt160 hash)
{
- return contractsDictionary.ContainsKey(hash);
+ return s_contractsDictionary.ContainsKey(hash);
}
internal virtual ContractTask InitializeAsync(ApplicationEngine engine, Hardfork? hardFork)
diff --git a/src/Plugins/ApplicationLogs/ApplicationLogs.csproj b/src/Plugins/ApplicationLogs/ApplicationLogs.csproj
index 89eea3b1bb..4529b946af 100644
--- a/src/Plugins/ApplicationLogs/ApplicationLogs.csproj
+++ b/src/Plugins/ApplicationLogs/ApplicationLogs.csproj
@@ -4,6 +4,7 @@
Neo.Plugins.ApplicationLogs
Neo.Plugins
enable
+ $(SolutionDir)/bin/$(PackageId)
@@ -18,4 +19,4 @@
PreserveNewest
-
\ No newline at end of file
+
diff --git a/src/Plugins/DBFTPlugin/DBFTPlugin.csproj b/src/Plugins/DBFTPlugin/DBFTPlugin.csproj
index b04e2e5c4f..68595be53a 100644
--- a/src/Plugins/DBFTPlugin/DBFTPlugin.csproj
+++ b/src/Plugins/DBFTPlugin/DBFTPlugin.csproj
@@ -4,6 +4,7 @@
net8.0
Neo.Consensus.DBFT
Neo.Consensus
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/Directory.Build.props b/src/Plugins/Directory.Build.props
index f7bcef093b..72e96f0300 100644
--- a/src/Plugins/Directory.Build.props
+++ b/src/Plugins/Directory.Build.props
@@ -9,7 +9,7 @@
-
+
diff --git a/src/Plugins/LevelDBStore/LevelDBStore.csproj b/src/Plugins/LevelDBStore/LevelDBStore.csproj
index ba82156b18..ef605a7afe 100644
--- a/src/Plugins/LevelDBStore/LevelDBStore.csproj
+++ b/src/Plugins/LevelDBStore/LevelDBStore.csproj
@@ -5,6 +5,7 @@
Neo.Plugins.Storage.LevelDBStore
Neo.Plugins.Storage
true
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/MPTTrie/MPTTrie.csproj b/src/Plugins/MPTTrie/MPTTrie.csproj
index a2c3377a16..ef9e45cc51 100644
--- a/src/Plugins/MPTTrie/MPTTrie.csproj
+++ b/src/Plugins/MPTTrie/MPTTrie.csproj
@@ -5,6 +5,7 @@
Neo.Cryptography.MPT
Neo.Cryptography
true
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/OracleService/OracleService.csproj b/src/Plugins/OracleService/OracleService.csproj
index 48ca5f3808..1fa5c5602f 100644
--- a/src/Plugins/OracleService/OracleService.csproj
+++ b/src/Plugins/OracleService/OracleService.csproj
@@ -3,6 +3,7 @@
net8.0
Neo.Plugins.OracleService
+ $(SolutionDir)/bin/$(PackageId)
@@ -23,4 +24,4 @@
-
\ No newline at end of file
+
diff --git a/src/Plugins/RocksDBStore/RocksDBStore.csproj b/src/Plugins/RocksDBStore/RocksDBStore.csproj
index 57037c68cf..441b17306e 100644
--- a/src/Plugins/RocksDBStore/RocksDBStore.csproj
+++ b/src/Plugins/RocksDBStore/RocksDBStore.csproj
@@ -4,6 +4,7 @@
net8.0
Neo.Plugins.Storage.RocksDBStore
Neo.Plugins.Storage
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/RpcClient/RpcClient.csproj b/src/Plugins/RpcClient/RpcClient.csproj
index cc634337d5..c43c71ef8a 100644
--- a/src/Plugins/RpcClient/RpcClient.csproj
+++ b/src/Plugins/RpcClient/RpcClient.csproj
@@ -4,6 +4,7 @@
net8.0
Neo.Network.RPC.RpcClient
Neo.Network.RPC
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/RpcServer/RpcServer.csproj b/src/Plugins/RpcServer/RpcServer.csproj
index 1721c6bccb..3fb7a7bb9a 100644
--- a/src/Plugins/RpcServer/RpcServer.csproj
+++ b/src/Plugins/RpcServer/RpcServer.csproj
@@ -1,8 +1,9 @@
-
+
net8.0
Neo.Plugins.RpcServer
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/SQLiteWallet/SQLiteWallet.csproj b/src/Plugins/SQLiteWallet/SQLiteWallet.csproj
index fb2d3e71b8..4c9029040f 100644
--- a/src/Plugins/SQLiteWallet/SQLiteWallet.csproj
+++ b/src/Plugins/SQLiteWallet/SQLiteWallet.csproj
@@ -5,6 +5,7 @@
Neo.Wallets.SQLite
Neo.Wallets.SQLite
enable
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/StateService/StateService.csproj b/src/Plugins/StateService/StateService.csproj
index b8e395c990..2bf85f1465 100644
--- a/src/Plugins/StateService/StateService.csproj
+++ b/src/Plugins/StateService/StateService.csproj
@@ -4,6 +4,7 @@
net8.0
Neo.Plugins.StateService
true
+ $(SolutionDir)/bin/$(PackageId)
@@ -18,4 +19,4 @@
-
\ No newline at end of file
+
diff --git a/src/Plugins/StorageDumper/StorageDumper.csproj b/src/Plugins/StorageDumper/StorageDumper.csproj
index 49d5362538..7805140f3e 100644
--- a/src/Plugins/StorageDumper/StorageDumper.csproj
+++ b/src/Plugins/StorageDumper/StorageDumper.csproj
@@ -5,6 +5,7 @@
Neo.Plugins.StorageDumper
enable
enable
+ $(SolutionDir)/bin/$(PackageId)
diff --git a/src/Plugins/TokensTracker/TokensTracker.csproj b/src/Plugins/TokensTracker/TokensTracker.csproj
index 7c3df5c0c6..bdacd3839c 100644
--- a/src/Plugins/TokensTracker/TokensTracker.csproj
+++ b/src/Plugins/TokensTracker/TokensTracker.csproj
@@ -1,8 +1,9 @@
-
+
net8.0
Neo.Plugins.TokensTracker
+ $(SolutionDir)/bin/$(PackageId)
@@ -15,4 +16,4 @@
-
\ No newline at end of file
+
diff --git a/tests/Directory.Build.props b/tests/Directory.Build.props
index 7ba3905160..a2fc251365 100644
--- a/tests/Directory.Build.props
+++ b/tests/Directory.Build.props
@@ -7,6 +7,9 @@
false
true
0
+ true
+ TestResults/
+ lcov