diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
new file mode 100644
index 0000000..f7dabfa
--- /dev/null
+++ b/.github/workflows/ci.yml
@@ -0,0 +1,83 @@
+name: CI
+
+on:
+ push:
+ branches: [ main ]
+ pull_request:
+ branches: [ main ]
+
+jobs:
+ build-and-test:
+ name: Build and Test
+ runs-on: ${{ matrix.os }}
+ strategy:
+ matrix:
+ os: [ubuntu-latest, macos-latest]
+ dotnet-version: ['9.0.x']
+ fail-fast: false
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: ${{ matrix.dotnet-version }}
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Build
+ run: dotnet build --configuration Release --no-restore
+
+ - name: Test with dotnet
+ run: dotnet test --no-restore --logger trx --results-directory "TestResults-${{ matrix.dotnet-version }}"
+
+ - name: Upload dotnet test results
+ uses: actions/upload-artifact@v4
+ with:
+ name: dotnet-results--${{ matrix.os }}
+ path: TestResults--${{ matrix.os }}
+ if: ${{ always() }}
+
+ lint:
+ name: Lint/Format Check
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: '9.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Check formatting
+ run: dotnet format --verify-no-changes --verbosity diagnostic
+
+ security:
+ name: Security Scan
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: '9.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Checking for external vulnerabilites
+ run: |
+ dotnet list package --vulnerable --include-transitive 2>&1 | tee vuln.log
+ echo "Analyze dotnet list package..."
+ ! grep -q -i "has the following vulnerable packages" vuln.log
diff --git a/.github/workflows/pr-validation.yml b/.github/workflows/pr-validation.yml
new file mode 100644
index 0000000..3d04bff
--- /dev/null
+++ b/.github/workflows/pr-validation.yml
@@ -0,0 +1,36 @@
+name: PR Validation
+
+on:
+ pull_request:
+ types: [opened, synchronize, reopened]
+
+jobs:
+ validate:
+ name: Validate PR
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v5
+ with:
+ fetch-depth: 0
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: '9.0.x'
+
+ - name: Restore dependencies
+ run: dotnet restore
+
+ - name: Build
+ run: dotnet build --configuration Debug --no-restore
+
+ - name: Check for compilation warnings
+ run: dotnet build --configuration Release --no-restore --warnaserror
+
+ - name: Run tests
+ run: dotnet test --configuration Release --no-build --verbosity normal
+
+ - name: Check formatting
+ run: dotnet format style --no-restore --verify-no-changes
diff --git a/src/BitcoinKernel.Interop/NativeMethods.cs b/src/BitcoinKernel.Interop/NativeMethods.cs
index 20e8601..744d767 100644
--- a/src/BitcoinKernel.Interop/NativeMethods.cs
+++ b/src/BitcoinKernel.Interop/NativeMethods.cs
@@ -427,7 +427,7 @@ public static extern int ScriptPubkeyVerify(
IntPtr script_pubkey,
long amount,
IntPtr tx_to,
- IntPtr[] spent_outputs,
+ IntPtr[]? spent_outputs,
nuint spent_outputs_len,
uint input_index,
uint flags,
diff --git a/tests/BitcoinKernel.Core.Tests/BitcoinKernel.Core.Tests.csproj b/tests/BitcoinKernel.Core.Tests/BitcoinKernel.Core.Tests.csproj
index 9a568f4..11925a3 100644
--- a/tests/BitcoinKernel.Core.Tests/BitcoinKernel.Core.Tests.csproj
+++ b/tests/BitcoinKernel.Core.Tests/BitcoinKernel.Core.Tests.csproj
@@ -11,10 +11,10 @@
-
-
-
-
+
+
+
+
diff --git a/tests/BitcoinKernel.Tests/BitcoinKernel.Tests.csproj b/tests/BitcoinKernel.Tests/BitcoinKernel.Tests.csproj
index aae6995..f48e5a5 100644
--- a/tests/BitcoinKernel.Tests/BitcoinKernel.Tests.csproj
+++ b/tests/BitcoinKernel.Tests/BitcoinKernel.Tests.csproj
@@ -11,10 +11,10 @@
-
-
-
-
+
+
+
+