diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index 872ecc9..ac83a7b 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -21,6 +21,7 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x
+ dotnet-quality: ga
# setup-dotnet proves installation, while global.json controls selection. Assert the actual
# resolver result because hosted runners also have newer SDK majors preinstalled.
@@ -35,7 +36,7 @@ jobs:
fi
- name: Restore
- run: dotnet restore -p:NuGetAuditMode=all -warnaserror
+ run: dotnet restore --locked-mode -p:NuGetAuditMode=all -warnaserror
# Hard gate: the project keeps a zero-warning build, so fail CI on any warning.
- name: Build
@@ -147,6 +148,7 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x
+ dotnet-quality: ga
- name: Verify .NET 8 SDK selection
shell: bash
@@ -159,7 +161,7 @@ jobs:
fi
- name: Restore and audit dependencies
- run: dotnet restore -p:NuGetAuditMode=all -warnaserror
+ run: dotnet restore --locked-mode -p:NuGetAuditMode=all -warnaserror
- name: Pack and validate public API
run: dotnet pack src/SolSharp/SolSharp.csproj -c Release -o artifacts -p:Version=999.0.0-ci --no-restore -warnaserror
diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml
index d54f4de..394eb0a 100644
--- a/.github/workflows/codeql.yml
+++ b/.github/workflows/codeql.yml
@@ -11,12 +11,14 @@ on:
permissions:
contents: read
- security-events: write
jobs:
analyze:
name: analyze-csharp
runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ security-events: write
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
@@ -32,9 +34,20 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x
+ dotnet-quality: ga
+
+ - name: Verify .NET 8 SDK selection
+ shell: bash
+ run: |
+ selected_version="$(dotnet --version)"
+ if [[ "${selected_version}" != 8.* ]]; then
+ echo "Expected a .NET 8 SDK, but dotnet selected ${selected_version}."
+ dotnet --info
+ exit 1
+ fi
- name: Restore
- run: dotnet restore -p:NuGetAuditMode=all -warnaserror
+ run: dotnet restore --locked-mode -p:NuGetAuditMode=all -warnaserror
- name: Build for CodeQL
run: dotnet build --no-restore --configuration Release -warnaserror
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
index 6469587..95f3754 100644
--- a/.github/workflows/release.yml
+++ b/.github/workflows/release.yml
@@ -6,13 +6,22 @@ on:
push:
tags: [ 'v*' ]
+permissions:
+ contents: read
+
+concurrency:
+ group: release-${{ github.ref }}
+ cancel-in-progress: false
+
jobs:
- publish:
+ validate:
+ name: validate-release
runs-on: ubuntu-latest
permissions:
- id-token: write # required for NuGet OIDC and package attestation
contents: read
- attestations: write
+ outputs:
+ package_name: ${{ steps.package.outputs.name }}
+ package_sha256: ${{ steps.package.outputs.sha256 }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
@@ -23,6 +32,7 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x
+ dotnet-quality: ga
- name: Verify .NET 8 SDK selection
shell: bash
@@ -35,7 +45,7 @@ jobs:
fi
- name: Restore and audit dependencies
- run: dotnet restore -p:NuGetAuditMode=all -warnaserror
+ run: dotnet restore --locked-mode -p:NuGetAuditMode=all -warnaserror
- name: Validate tag matches package version
shell: bash
@@ -175,10 +185,761 @@ jobs:
- name: Run packed package consumer
run: samples/SolSharp.AotSmoke/bin/Release/net8.0/linux-x64/publish/SolSharp.AotSmoke
+ - name: Record exact package artifact
+ id: package
+ shell: bash
+ run: |
+ package_version="${GITHUB_REF_NAME#v}"
+ expected_name="SolSharp.${package_version}.nupkg"
+ package_path="./artifacts/${expected_name}"
+ if [[ ! -f "${package_path}" ]]; then
+ echo "Expected release artifact ${package_path} was not produced."
+ find ./artifacts -maxdepth 1 -type f -print
+ exit 1
+ fi
+
+ mapfile -t packages < <(find ./artifacts -maxdepth 1 -type f -name '*.nupkg' -print)
+ if (( ${#packages[@]} != 1 )); then
+ echo "Expected exactly one package artifact, found ${#packages[@]}."
+ printf '%s\n' "${packages[@]}"
+ exit 1
+ fi
+
+ package_sha256="$(sha256sum "${package_path}" | cut -d ' ' -f 1)"
+ printf '%s %s\n' "${package_sha256}" "${expected_name}" > "${package_path}.sha256"
+ echo "name=${expected_name}" >> "${GITHUB_OUTPUT}"
+ echo "sha256=${package_sha256}" >> "${GITHUB_OUTPUT}"
+
+ - name: Transfer verified release artifact
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: release-package
+ path: |
+ ./artifacts/*.nupkg
+ ./artifacts/*.nupkg.sha256
+ if-no-files-found: error
+ overwrite: true
+ retention-days: 7
+
+ attest_package:
+ name: attest-package
+ needs: validate
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ id-token: write # required only for package attestation
+ attestations: write
+ steps:
+ # download-artifact validates the workflow artifact digest recorded by upload-artifact.
+ - name: Download verified release artifact
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: release-package
+ path: ./artifacts
+
+ - name: Verify exact package digest
+ shell: bash
+ env:
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ PACKAGE_SHA256: ${{ needs.validate.outputs.package_sha256 }}
+ run: |
+ package_path="./artifacts/${PACKAGE_NAME}"
+ printf '%s %s\n' "${PACKAGE_SHA256}" "${package_path}" | sha256sum --check --strict
+ if ! printf '%s %s\n' "${PACKAGE_SHA256}" "${PACKAGE_NAME}" | \
+ cmp --silent - "${package_path}.sha256"; then
+ echo "Package checksum artifact is not the exact canonical checksum record."
+ exit 1
+ fi
+
- name: Attest package provenance
+ id: attest
uses: actions/attest@1e69f48acb82d1966a394da916b4c1698aa569d6 # v4.2.2
with:
- subject-path: ./artifacts/*.nupkg
+ subject-path: ./artifacts/${{ needs.validate.outputs.package_name }}
+
+ - name: Prepare verifiable release provenance
+ shell: bash
+ env:
+ ATTESTATION_BUNDLE: ${{ steps.attest.outputs.bundle-path }}
+ GH_TOKEN: ${{ github.token }}
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ PACKAGE_SHA256: ${{ needs.validate.outputs.package_sha256 }}
+ run: |
+ provenance_path="./artifacts/${PACKAGE_NAME}.sigstore.json"
+ cp -- "${ATTESTATION_BUNDLE}" "${provenance_path}"
+ jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg package_sha256 "${PACKAGE_SHA256}" '
+ .mediaType == "application/vnd.dev.sigstore.bundle.v0.3+json" and
+ .dsseEnvelope.payloadType == "application/vnd.in-toto+json" and
+ ((.dsseEnvelope.payload | @base64d | fromjson) as $statement |
+ $statement._type == "https://in-toto.io/Statement/v1" and
+ $statement.predicateType == "https://slsa.dev/provenance/v1" and
+ ($statement.subject | type) == "array" and
+ ($statement.subject | length) == 1 and
+ $statement.subject[0].name == $package_name and
+ $statement.subject[0].digest.sha256 == $package_sha256)
+ ' "${provenance_path}" > /dev/null
+
+ gh attestation verify "./artifacts/${PACKAGE_NAME}" \
+ --repo "${GITHUB_REPOSITORY}" \
+ --bundle "${provenance_path}" \
+ --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml" \
+ --source-ref "${GITHUB_REF}" \
+ --source-digest "${GITHUB_SHA}" \
+ --deny-self-hosted-runners
+
+ - name: Transfer attested release candidate
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: attested-release-candidate
+ path: |
+ ./artifacts/*.nupkg
+ ./artifacts/*.nupkg.sha256
+ ./artifacts/*.nupkg.sigstore.json
+ if-no-files-found: error
+ overwrite: true
+ retention-days: 7
+
+ stage_release:
+ name: stage-github-release
+ needs: [ validate, attest_package ]
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write # required only for the durable draft GitHub Release
+ outputs:
+ release_id: ${{ steps.stage.outputs.release_id }}
+ package_sha256: ${{ steps.stage.outputs.package_sha256 }}
+ steps:
+ - name: Download attested release candidate
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: attested-release-candidate
+ path: ./candidate
+
+ # SDK 8 pack embeds a random core-properties name. A retry therefore must recover the exact
+ # bytes durably staged by the first run instead of treating its newly packed candidate as canonical.
+ - name: Stage or recover canonical release assets
+ id: stage
+ shell: bash
+ env:
+ CANDIDATE_SHA256: ${{ needs.validate.outputs.package_sha256 }}
+ GH_TOKEN: ${{ github.token }}
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ run: |
+ expected_title="SolSharp ${GITHUB_REF_NAME#v}"
+ expected_prerelease=false
+ if [[ "${GITHUB_REF_NAME}" == *-* ]]; then
+ expected_prerelease=true
+ fi
+
+ api_version="2022-11-28"
+ repo_api="/repos/${GITHUB_REPOSITORY}"
+ encoded_tag="$(jq --null-input --raw-output \
+ --arg value "${GITHUB_REF_NAME}" '$value | @uri')"
+ canonical_directory="./canonical"
+ mkdir -p "${canonical_directory}"
+
+ verify_tag_target() {
+ local ref_state="${RUNNER_TEMP}/release-tag-ref.json"
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/ref/tags/${encoded_tag}" \
+ > "${ref_state}"
+ local object_type object_sha
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ for _ in {1..9}; do
+ case "${object_type}" in
+ commit)
+ if [[ "${object_sha}" != "${GITHUB_SHA}" ]]; then
+ echo "Release tag ${GITHUB_REF_NAME} resolves to ${object_sha}, not ${GITHUB_SHA}."
+ return 1
+ fi
+ return 0
+ ;;
+ tag)
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/tags/${object_sha}" \
+ > "${ref_state}"
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ ;;
+ *)
+ echo "Release tag resolves to unsupported Git object type ${object_type}."
+ return 1
+ ;;
+ esac
+ done
+ echo "Release tag contains more than eight nested annotated tags."
+ return 1
+ }
+
+ verify_asset_directory() {
+ local asset_directory="$1"
+ local expected_sha256="${2:-}"
+ local package_path="${asset_directory}/${PACKAGE_NAME}"
+ local checksum_path="${package_path}.sha256"
+ local provenance_path="${package_path}.sigstore.json"
+
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ if [[ ! -f "${asset_directory}/${asset_name}" || \
+ -L "${asset_directory}/${asset_name}" ]]; then
+ echo "Required regular release asset ${asset_name} is missing."
+ return 1
+ fi
+ done
+
+ local package_sha256
+ package_sha256="$(sha256sum "${package_path}" | cut -d ' ' -f 1)"
+ if [[ -n "${expected_sha256}" && "${package_sha256}" != "${expected_sha256}" ]]; then
+ echo "Release package digest does not match the expected candidate digest."
+ return 1
+ fi
+
+ if ! printf '%s %s\n' "${package_sha256}" "${PACKAGE_NAME}" | \
+ cmp --silent - "${checksum_path}"; then
+ echo "Release checksum asset is not the exact canonical checksum record."
+ return 1
+ fi
+
+ if ! jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg package_sha256 "${package_sha256}" '
+ .mediaType == "application/vnd.dev.sigstore.bundle.v0.3+json" and
+ .dsseEnvelope.payloadType == "application/vnd.in-toto+json" and
+ ((.dsseEnvelope.payload | @base64d | fromjson) as $statement |
+ $statement._type == "https://in-toto.io/Statement/v1" and
+ $statement.predicateType == "https://slsa.dev/provenance/v1" and
+ ($statement.subject | type) == "array" and
+ ($statement.subject | length) == 1 and
+ $statement.subject[0].name == $package_name and
+ $statement.subject[0].digest.sha256 == $package_sha256)
+ ' "${provenance_path}" > /dev/null; then
+ echo "Release provenance does not attest exactly the canonical package."
+ return 1
+ fi
+
+ gh attestation verify "${package_path}" \
+ --repo "${GITHUB_REPOSITORY}" \
+ --bundle "${provenance_path}" \
+ --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml" \
+ --source-ref "${GITHUB_REF}" \
+ --source-digest "${GITHUB_SHA}" \
+ --deny-self-hosted-runners
+ }
+
+ get_published_release() {
+ local output_file="$1"
+ local status
+ if ! status="$(curl --silent --show-error \
+ --header 'Accept: application/vnd.github+json' \
+ --header "Authorization: Bearer ${GH_TOKEN}" \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --output "${output_file}" \
+ --write-out '%{http_code}' \
+ "https://api.github.com${repo_api}/releases/tags/${encoded_tag}")"; then
+ echo "GitHub's published-release lookup failed."
+ return 2
+ fi
+
+ case "${status}" in
+ 200) return 0 ;;
+ 404) return 1 ;;
+ *)
+ echo "GitHub's published-release lookup returned HTTP ${status}."
+ cat "${output_file}"
+ return 2
+ ;;
+ esac
+ }
+
+ read_release_by_id() {
+ local release_id="$1"
+ local output_file="$2"
+ local metadata_file asset_pages
+ metadata_file="$(mktemp "${RUNNER_TEMP}/solsharp-release-metadata.XXXXXX")"
+ asset_pages="$(mktemp "${RUNNER_TEMP}/solsharp-release-asset-pages.XXXXXX")"
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/releases/${release_id}" \
+ > "${metadata_file}"
+ gh api --paginate --slurp \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/releases/${release_id}/assets?per_page=100" \
+ > "${asset_pages}"
+ jq --slurpfile asset_pages "${asset_pages}" \
+ '.assets = (($asset_pages[0] | add) // [])' \
+ "${metadata_file}" > "${output_file}"
+ }
+
+ verify_release_identity() {
+ local state_file="$1"
+ local expected_draft="$2"
+ if ! jq --exit-status \
+ --arg release_name "${expected_title}" \
+ --arg tag_name "${GITHUB_REF_NAME}" \
+ --argjson is_draft "${expected_draft}" \
+ --argjson is_prerelease "${expected_prerelease}" '
+ (.id | type) == "number" and
+ .tag_name == $tag_name and
+ .name == $release_name and
+ .author.login == "github-actions[bot]" and
+ .draft == $is_draft and
+ .prerelease == $is_prerelease
+ ' "${state_file}" > /dev/null; then
+ echo "GitHub Release identity does not match this tag workflow."
+ jq '{ id, tag_name, target_commitish, name, author: .author.login, draft, prerelease }' \
+ "${state_file}"
+ return 1
+ fi
+ }
+
+ verify_release_asset_set() {
+ local state_file="$1"
+ if ! jq --exit-status \
+ --arg package "${PACKAGE_NAME}" \
+ --arg checksum "${PACKAGE_NAME}.sha256" \
+ --arg provenance "${PACKAGE_NAME}.sigstore.json" '
+ (.assets | type) == "array" and
+ (.assets | length) == 3 and
+ ([.assets[].name] | sort) == ([$package, $checksum, $provenance] | sort) and
+ all(.assets[];
+ (.id | type) == "number" and
+ (.size | type) == "number" and .size > 0 and
+ .state == "uploaded" and
+ (.digest | type) == "string" and
+ (.digest | test("^sha256:[0-9a-f]{64}$")) and
+ .uploader.login == "github-actions[bot]")
+ ' "${state_file}" > /dev/null; then
+ echo "GitHub Release has an unexpected asset set."
+ jq '[.assets[] | { id, name, state, size, digest, uploader: .uploader.login }]' \
+ "${state_file}"
+ return 1
+ fi
+ }
+
+ verify_recoverable_partial_draft() {
+ local state_file="$1"
+ jq --exit-status \
+ --arg package "${PACKAGE_NAME}" \
+ --arg checksum "${PACKAGE_NAME}.sha256" \
+ --arg provenance "${PACKAGE_NAME}.sigstore.json" \
+ --arg release_name "${expected_title}" \
+ --arg tag_name "${GITHUB_REF_NAME}" \
+ --argjson is_prerelease "${expected_prerelease}" '
+ .tag_name == $tag_name and
+ .name == $release_name and
+ .author.login == "github-actions[bot]" and
+ .draft == true and
+ .prerelease == $is_prerelease and
+ (.assets | type) == "array" and
+ (.assets | length) <= 3 and
+ all(.assets[];
+ (.name == $package or .name == $checksum or .name == $provenance) and
+ (.id | type) == "number" and
+ .uploader.login == "github-actions[bot]" and
+ (.state == "starter" or
+ (.state == "uploaded" and
+ (.size | type) == "number" and .size > 0 and
+ (.digest | type) == "string" and
+ (.digest | test("^sha256:[0-9a-f]{64}$")))))
+ ' "${state_file}" > /dev/null
+ }
+
+ verify_release_state() {
+ verify_release_identity "$1" "$2" && verify_release_asset_set "$1"
+ }
+
+ download_release_assets() {
+ local state_file="$1"
+ local asset_directory="$2"
+ mkdir -p "${asset_directory}"
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ local asset_id
+ asset_id="$(jq --exit-status --raw-output \
+ --arg asset_name "${asset_name}" '
+ [.assets[] | select(.name == $asset_name) | .id] |
+ if length == 1 and (.[0] | type) == "number"
+ then .[0]
+ else error("unexpected release asset set")
+ end
+ ' "${state_file}")"
+ curl --fail --silent --show-error --location \
+ --header 'Accept: application/octet-stream' \
+ --header "Authorization: Bearer ${GH_TOKEN}" \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --output "${asset_directory}/${asset_name}" \
+ "https://api.github.com${repo_api}/releases/assets/${asset_id}"
+ done
+ local actual_digest api_digest
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ actual_digest="sha256:$(sha256sum "${asset_directory}/${asset_name}" | cut -d ' ' -f 1)"
+ api_digest="$(jq --exit-status --raw-output \
+ --arg asset_name "${asset_name}" '
+ [.assets[] | select(.name == $asset_name) | .digest] |
+ if length == 1 then .[0] else error("unexpected release asset set") end
+ ' "${state_file}")"
+ if [[ "${actual_digest}" != "${api_digest}" ]]; then
+ echo "Downloaded release asset ${asset_name} differs from GitHub's recorded digest."
+ return 1
+ fi
+ done
+ verify_asset_directory "${asset_directory}"
+ }
+
+ emit_canonical_release() {
+ local state_file="$1"
+ local asset_directory="$2"
+ local release_id package_sha256
+ verify_tag_target
+ release_id="$(jq --exit-status --raw-output \
+ 'if (.id | type) == "number" then .id else error("missing release id") end' \
+ "${state_file}")"
+ package_sha256="$(sha256sum "${asset_directory}/${PACKAGE_NAME}" | cut -d ' ' -f 1)"
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ cp -- "${asset_directory}/${asset_name}" "${canonical_directory}/${asset_name}"
+ done
+ {
+ echo "release_id=${release_id}"
+ echo "package_sha256=${package_sha256}"
+ } >> "${GITHUB_OUTPUT}"
+ }
+
+ accept_published_release() {
+ local tag_state_file="$1"
+ local asset_directory release_id state_file
+ release_id="$(jq --exit-status --raw-output \
+ 'if (.id | type) == "number" then .id else error("missing release id") end' \
+ "${tag_state_file}")"
+ state_file="$(mktemp "${RUNNER_TEMP}/solsharp-published-state.XXXXXX")"
+ read_release_by_id "${release_id}" "${state_file}"
+ verify_release_state "${state_file}" false
+ asset_directory="$(mktemp -d "${RUNNER_TEMP}/solsharp-published-assets.XXXXXX")"
+ download_release_assets "${state_file}" "${asset_directory}"
+ emit_canonical_release "${state_file}" "${asset_directory}"
+ }
+
+ verify_tag_target
+ verify_asset_directory ./candidate "${CANDIDATE_SHA256}"
+
+ published_state="${RUNNER_TEMP}/published-release.json"
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ if (( lookup_status != 1 )); then
+ exit "${lookup_status}"
+ fi
+ fi
+
+ releases_pages="${RUNNER_TEMP}/release-pages.json"
+ gh api --paginate --slurp \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/releases?per_page=100" \
+ > "${releases_pages}"
+ draft_ids_file="${RUNNER_TEMP}/draft-ids.json"
+ jq --exit-status \
+ --arg tag_name "${GITHUB_REF_NAME}" '
+ [.[][] |
+ select(.draft == true and .tag_name == $tag_name and (.id | type) == "number") |
+ .id] | sort
+ ' "${releases_pages}" > "${draft_ids_file}"
+ mapfile -t draft_ids < <(jq --raw-output '.[]' "${draft_ids_file}")
+
+ valid_draft_state=""
+ valid_draft_assets=""
+ valid_draft_count=0
+ conflicting_draft_count=0
+ for draft_id in "${draft_ids[@]}"; do
+ draft_state="${RUNNER_TEMP}/draft-${draft_id}.json"
+ draft_assets="$(mktemp -d "${RUNNER_TEMP}/solsharp-draft-${draft_id}.XXXXXX")"
+ if ! read_release_by_id "${draft_id}" "${draft_state}"; then
+ conflicting_draft_count=$((conflicting_draft_count + 1))
+ elif verify_release_state "${draft_state}" true; then
+ # A complete staged draft is already the durable canonical source. Any transport,
+ # digest, or provenance failure must fail closed instead of rotating its package bytes.
+ if ! download_release_assets "${draft_state}" "${draft_assets}"; then
+ echo "Complete canonical draft ${draft_id} could not be verified; refusing recovery mutation."
+ exit 1
+ fi
+ valid_draft_count=$((valid_draft_count + 1))
+ valid_draft_state="${draft_state}"
+ valid_draft_assets="${draft_assets}"
+ elif verify_recoverable_partial_draft "${draft_state}"; then
+ # Leave workflow-owned partial drafts untouched. Creating and tracking a new exact-ID
+ # draft is safe, while a read-then-delete sequence could race with publication.
+ echo "Leaving recoverable partial draft ${draft_id} unchanged."
+ else
+ conflicting_draft_count=$((conflicting_draft_count + 1))
+ fi
+ done
+
+ # A public release is authoritative if another actor completed a listed draft while its
+ # exact state was being inspected. Resolve that transition before reporting conflicts.
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ if (( lookup_status != 1 )); then
+ exit "${lookup_status}"
+ fi
+ fi
+
+ if (( conflicting_draft_count > 0 )); then
+ echo "A same-tag draft is not an expected workflow-owned partial release; refusing mutation."
+ exit 1
+ fi
+ if (( valid_draft_count > 1 )); then
+ echo "Multiple valid canonical drafts exist for ${GITHUB_REF_NAME}; refusing an ambiguous release."
+ exit 1
+ fi
+
+ if (( valid_draft_count == 1 )); then
+ emit_canonical_release "${valid_draft_state}" "${valid_draft_assets}"
+ exit 0
+ fi
+
+ package_version="${GITHUB_REF_NAME#v}"
+ lower_version="${package_version,,}"
+ nuget_url="https://api.nuget.org/v3-flatcontainer/solsharp/${lower_version}/solsharp.${lower_version}.nupkg"
+ nuget_status="$(curl --silent --show-error --location \
+ --output /dev/null --write-out '%{http_code}' "${nuget_url}")"
+ case "${nuget_status}" in
+ 404) ;;
+ 200)
+ echo "NuGet already contains this version without a valid canonical GitHub Release."
+ exit 1
+ ;;
+ *)
+ echo "NuGet existence lookup returned HTTP ${nuget_status}; refusing release mutation."
+ exit 1
+ ;;
+ esac
+
+ # Partial same-tag drafts remain untouched. Re-check the authoritative public endpoint
+ # before creating and tracking a fresh exact-ID draft alongside them.
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ if (( lookup_status != 1 )); then
+ exit "${lookup_status}"
+ fi
+ fi
+
+ created_state="${RUNNER_TEMP}/created-release.json"
+ verify_tag_target
+ gh api --method POST \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --raw-field tag_name="${GITHUB_REF_NAME}" \
+ --raw-field target_commitish="${GITHUB_SHA}" \
+ --raw-field name="${expected_title}" \
+ --field draft=true \
+ --field prerelease="${expected_prerelease}" \
+ --field generate_release_notes=true \
+ "${repo_api}/releases" \
+ > "${created_state}"
+ release_id="$(jq --exit-status --raw-output \
+ 'if (.id | type) == "number" then .id else error("missing release id") end' \
+ "${created_state}")"
+ verify_release_identity "${created_state}" true
+
+ # Do not retry an ambiguous upload response in place: GitHub can leave a starter asset
+ # after a 502. A workflow rerun leaves that partial draft untouched and stages a fresh
+ # exact-ID draft if no canonical release exists.
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ encoded_asset_name="$(jq --null-input --raw-output \
+ --arg value "${asset_name}" '$value | @uri')"
+ curl --fail --silent --show-error \
+ --request POST \
+ --header 'Accept: application/vnd.github+json' \
+ --header "Authorization: Bearer ${GH_TOKEN}" \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --header 'Content-Type: application/octet-stream' \
+ --data-binary "@./candidate/${asset_name}" \
+ "https://uploads.github.com/repos/${GITHUB_REPOSITORY}/releases/${release_id}/assets?name=${encoded_asset_name}" \
+ > /dev/null
+ done
+
+ read_release_by_id "${release_id}" "${created_state}"
+ verify_release_state "${created_state}" true
+ staged_assets="$(mktemp -d "${RUNNER_TEMP}/solsharp-staged-assets.XXXXXX")"
+ download_release_assets "${created_state}" "${staged_assets}"
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ if ! cmp --silent "./candidate/${asset_name}" "${staged_assets}/${asset_name}"; then
+ echo "Staged GitHub Release asset ${asset_name} differs from the attested candidate."
+ exit 1
+ fi
+ done
+ emit_canonical_release "${created_state}" "${staged_assets}"
+
+ - name: Transfer canonical release assets
+ uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
+ with:
+ name: canonical-release-assets
+ path: |
+ ./canonical/*.nupkg
+ ./canonical/*.nupkg.sha256
+ ./canonical/*.nupkg.sigstore.json
+ if-no-files-found: error
+ overwrite: true
+ retention-days: 7
+
+ publish_package:
+ name: publish-package
+ needs: [ validate, stage_release ]
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+ id-token: write # required only for NuGet Trusted Publishing
+ steps:
+ - name: Set up .NET 8
+ id: setup_dotnet
+ uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
+ with:
+ dotnet-version: 8.0.x
+ dotnet-quality: ga
+
+ # This privileged job deliberately has no checkout. Use an isolated, fixed global.json so
+ # runner-installed newer SDKs cannot change the NuGet verification or publishing client.
+ - name: Verify .NET 8 SDK selection
+ shell: bash
+ env:
+ INSTALLED_DOTNET_SDK: ${{ steps.setup_dotnet.outputs.dotnet-version }}
+ run: |
+ if [[ ! "${INSTALLED_DOTNET_SDK}" =~ ^8\.[0-9]+\.[0-9]+$ ]]; then
+ echo "setup-dotnet returned an unexpected SDK version: ${INSTALLED_DOTNET_SDK}."
+ exit 1
+ fi
+
+ dotnet_sdk_workdir="${RUNNER_TEMP}/solsharp-dotnet-sdk"
+ mkdir -p "${dotnet_sdk_workdir}"
+ printf '%s\n' \
+ '{' \
+ ' "sdk": {' \
+ " \"version\": \"${INSTALLED_DOTNET_SDK}\"," \
+ ' "rollForward": "disable",' \
+ ' "allowPrerelease": false' \
+ ' }' \
+ '}' > "${dotnet_sdk_workdir}/global.json"
+ selected_version="$(cd "${dotnet_sdk_workdir}" && dotnet --version)"
+ if [[ "${selected_version}" != "${INSTALLED_DOTNET_SDK}" ]]; then
+ echo "Expected .NET SDK ${INSTALLED_DOTNET_SDK}, but dotnet selected ${selected_version}."
+ (cd "${dotnet_sdk_workdir}" && dotnet --info)
+ exit 1
+ fi
+
+ - name: Download canonical release assets
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: canonical-release-assets
+ path: ./artifacts
+
+ - name: Verify canonical release assets
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ PACKAGE_SHA256: ${{ needs.stage_release.outputs.package_sha256 }}
+ run: |
+ package_path="./artifacts/${PACKAGE_NAME}"
+ checksum_path="${package_path}.sha256"
+ provenance_path="${package_path}.sigstore.json"
+ actual_sha256="$(sha256sum "${package_path}" | cut -d ' ' -f 1)"
+ if [[ "${actual_sha256}" != "${PACKAGE_SHA256}" ]]; then
+ echo "Canonical package digest differs from the staged release output."
+ exit 1
+ fi
+ if ! printf '%s %s\n' "${actual_sha256}" "${PACKAGE_NAME}" | \
+ cmp --silent - "${checksum_path}"; then
+ echo "Canonical checksum asset is invalid."
+ exit 1
+ fi
+ jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg package_sha256 "${actual_sha256}" '
+ .mediaType == "application/vnd.dev.sigstore.bundle.v0.3+json" and
+ .dsseEnvelope.payloadType == "application/vnd.in-toto+json" and
+ ((.dsseEnvelope.payload | @base64d | fromjson) as $statement |
+ $statement._type == "https://in-toto.io/Statement/v1" and
+ $statement.predicateType == "https://slsa.dev/provenance/v1" and
+ ($statement.subject | type) == "array" and
+ ($statement.subject | length) == 1 and
+ $statement.subject[0].name == $package_name and
+ $statement.subject[0].digest.sha256 == $package_sha256)
+ ' "${provenance_path}" > /dev/null
+ gh attestation verify "${package_path}" \
+ --repo "${GITHUB_REPOSITORY}" \
+ --bundle "${provenance_path}" \
+ --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml" \
+ --source-ref "${GITHUB_REF}" \
+ --source-digest "${GITHUB_SHA}" \
+ --deny-self-hosted-runners
+
+ - name: Verify release tag target before publishing
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ api_version="2022-11-28"
+ repo_api="/repos/${GITHUB_REPOSITORY}"
+ encoded_tag="$(jq --null-input --raw-output \
+ --arg value "${GITHUB_REF_NAME}" '$value | @uri')"
+ ref_state="${RUNNER_TEMP}/release-tag-ref.json"
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/ref/tags/${encoded_tag}" \
+ > "${ref_state}"
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ for _ in {1..9}; do
+ case "${object_type}" in
+ commit)
+ if [[ "${object_sha}" != "${GITHUB_SHA}" ]]; then
+ echo "Release tag ${GITHUB_REF_NAME} resolves to ${object_sha}, not ${GITHUB_SHA}."
+ exit 1
+ fi
+ exit 0
+ ;;
+ tag)
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/tags/${object_sha}" \
+ > "${ref_state}"
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ ;;
+ *)
+ echo "Release tag resolves to unsupported Git object type ${object_type}."
+ exit 1
+ ;;
+ esac
+ done
+ echo "Release tag contains more than eight nested annotated tags."
+ exit 1
# Trusted Publishing: exchange the GitHub OIDC token for a short-lived NuGet API key
# (the jecacs/SolSharp policy authorizes this repo + this workflow file), then push with it.
@@ -189,4 +950,467 @@ jobs:
user: jecacs
- name: Push to NuGet
- run: dotnet nuget push "./artifacts/*.nupkg" --api-key "${{ steps.login.outputs.NUGET_API_KEY }}" --source https://api.nuget.org/v3/index.json
+ shell: bash
+ env:
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ run: |
+ cd "${RUNNER_TEMP}/solsharp-dotnet-sdk"
+ dotnet nuget push "${GITHUB_WORKSPACE}/artifacts/${PACKAGE_NAME}" \
+ --api-key "${{ steps.login.outputs.NUGET_API_KEY }}" \
+ --source https://api.nuget.org/v3/index.json \
+ --skip-duplicate
+
+ # A retry may encounter an already-published version after NuGet accepted a previous push but
+ # the workflow failed later. Never trust --skip-duplicate alone: the repository signature
+ # records the SHA-2 digest of the exact unsigned nupkg accepted by NuGet, so require that digest
+ # to match the canonical package recovered from the durable GitHub Release before continuing.
+ - name: Verify published NuGet package
+ shell: bash
+ env:
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ run: |
+ service_index="${RUNNER_TEMP}/nuget-service-index.json"
+ curl --fail --silent --show-error --location \
+ https://api.nuget.org/v3/index.json \
+ --output "${service_index}"
+ package_base_address="$(jq --exit-status --raw-output '
+ first(.resources[] | select(."@type" == "PackageBaseAddress/3.0.0") | ."@id")
+ ' "${service_index}")"
+
+ package_version="${GITHUB_REF_NAME#v}"
+ lower_version="${package_version,,}"
+ published_url="${package_base_address}solsharp/${lower_version}/solsharp.${lower_version}.nupkg"
+ published_package="${RUNNER_TEMP}/published-${PACKAGE_NAME}"
+ for attempt in {1..30}; do
+ if curl --fail --silent --show-error --location \
+ "${published_url}" --output "${published_package}"; then
+ break
+ fi
+ if (( attempt == 30 )); then
+ echo "The published package was not available from NuGet after 30 attempts."
+ exit 1
+ fi
+ sleep 5
+ done
+
+ (cd "${RUNNER_TEMP}/solsharp-dotnet-sdk" && \
+ dotnet nuget verify "${published_package}" --all)
+
+ signature_file="${RUNNER_TEMP}/nuget-repository-signature.p7s"
+ signature_properties="${RUNNER_TEMP}/nuget-repository-signature.properties"
+ if ! unzip -p "${published_package}" .signature.p7s > "${signature_file}"; then
+ echo "The package downloaded from NuGet has no repository signature."
+ exit 1
+ fi
+ openssl cms -verify -binary -inform DER \
+ -in "${signature_file}" -noverify -out "${signature_properties}"
+
+ mapfile -t hash_records < <(tr -d '\r' < "${signature_properties}" | \
+ grep --extended-regexp '^[0-9.]+-Hash:[A-Za-z0-9+/]+=*$')
+ if (( ${#hash_records[@]} != 1 )); then
+ echo "The NuGet repository signature contains an unexpected package-hash record."
+ exit 1
+ fi
+
+ hash_oid="${hash_records[0]%%-Hash:*}"
+ signed_hash="${hash_records[0]#*:}"
+ case "${hash_oid}" in
+ 2.16.840.1.101.3.4.2.1) hash_algorithm=sha256 ;;
+ 2.16.840.1.101.3.4.2.2) hash_algorithm=sha384 ;;
+ 2.16.840.1.101.3.4.2.3) hash_algorithm=sha512 ;;
+ *)
+ echo "The NuGet repository signature uses unsupported hash OID ${hash_oid}."
+ exit 1
+ ;;
+ esac
+
+ local_hash="$(openssl dgst "-${hash_algorithm}" -binary \
+ "./artifacts/${PACKAGE_NAME}" | openssl base64 -A)"
+ if [[ "${local_hash}" != "${signed_hash}" ]]; then
+ echo "NuGet did not publish the exact locally validated package artifact."
+ exit 1
+ fi
+
+ release:
+ name: publish-github-release
+ needs: [ validate, stage_release, publish_package ]
+ runs-on: ubuntu-latest
+ permissions:
+ contents: write # required only for completing the staged GitHub Release
+ steps:
+ - name: Download canonical release assets
+ uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
+ with:
+ name: canonical-release-assets
+ path: ./artifacts
+
+ - name: Verify canonical release assets
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ PACKAGE_SHA256: ${{ needs.stage_release.outputs.package_sha256 }}
+ run: |
+ package_path="./artifacts/${PACKAGE_NAME}"
+ checksum_path="${package_path}.sha256"
+ provenance_path="${package_path}.sigstore.json"
+ actual_sha256="$(sha256sum "${package_path}" | cut -d ' ' -f 1)"
+ if [[ "${actual_sha256}" != "${PACKAGE_SHA256}" ]]; then
+ echo "Canonical package digest differs from the staged release output."
+ exit 1
+ fi
+ if ! printf '%s %s\n' "${actual_sha256}" "${PACKAGE_NAME}" | \
+ cmp --silent - "${checksum_path}"; then
+ echo "Canonical checksum asset is invalid."
+ exit 1
+ fi
+ jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg package_sha256 "${actual_sha256}" '
+ .mediaType == "application/vnd.dev.sigstore.bundle.v0.3+json" and
+ .dsseEnvelope.payloadType == "application/vnd.in-toto+json" and
+ ((.dsseEnvelope.payload | @base64d | fromjson) as $statement |
+ $statement._type == "https://in-toto.io/Statement/v1" and
+ $statement.predicateType == "https://slsa.dev/provenance/v1" and
+ ($statement.subject | type) == "array" and
+ ($statement.subject | length) == 1 and
+ $statement.subject[0].name == $package_name and
+ $statement.subject[0].digest.sha256 == $package_sha256)
+ ' "${provenance_path}" > /dev/null
+ gh attestation verify "${package_path}" \
+ --repo "${GITHUB_REPOSITORY}" \
+ --bundle "${provenance_path}" \
+ --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml" \
+ --source-ref "${GITHUB_REF}" \
+ --source-digest "${GITHUB_SHA}" \
+ --deny-self-hosted-runners
+
+ - name: Publish staged GitHub Release
+ shell: bash
+ env:
+ GH_TOKEN: ${{ github.token }}
+ PACKAGE_NAME: ${{ needs.validate.outputs.package_name }}
+ PACKAGE_SHA256: ${{ needs.stage_release.outputs.package_sha256 }}
+ RELEASE_ID: ${{ needs.stage_release.outputs.release_id }}
+ run: |
+ expected_title="SolSharp ${GITHUB_REF_NAME#v}"
+ expected_prerelease=false
+ if [[ "${GITHUB_REF_NAME}" == *-* ]]; then
+ expected_prerelease=true
+ fi
+
+ api_version="2022-11-28"
+ repo_api="/repos/${GITHUB_REPOSITORY}"
+ encoded_tag="$(jq --null-input --raw-output \
+ --arg value "${GITHUB_REF_NAME}" '$value | @uri')"
+ release_state="${RUNNER_TEMP}/release-state.json"
+ if [[ ! "${RELEASE_ID}" =~ ^[1-9][0-9]*$ ]]; then
+ echo "Staging did not return a valid GitHub Release ID."
+ exit 1
+ fi
+
+ verify_tag_target() {
+ local ref_state="${RUNNER_TEMP}/release-tag-ref.json"
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/ref/tags/${encoded_tag}" \
+ > "${ref_state}"
+ local object_type object_sha
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ for _ in {1..9}; do
+ case "${object_type}" in
+ commit)
+ if [[ "${object_sha}" != "${GITHUB_SHA}" ]]; then
+ echo "Release tag ${GITHUB_REF_NAME} resolves to ${object_sha}, not ${GITHUB_SHA}."
+ return 1
+ fi
+ return 0
+ ;;
+ tag)
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/git/tags/${object_sha}" \
+ > "${ref_state}"
+ object_type="$(jq --exit-status --raw-output '.object.type' "${ref_state}")"
+ object_sha="$(jq --exit-status --raw-output '.object.sha' "${ref_state}")"
+ ;;
+ *)
+ echo "Release tag resolves to unsupported Git object type ${object_type}."
+ return 1
+ ;;
+ esac
+ done
+ echo "Release tag contains more than eight nested annotated tags."
+ return 1
+ }
+
+ get_published_release() {
+ local output_file="$1"
+ local status
+ if ! status="$(curl --silent --show-error \
+ --header 'Accept: application/vnd.github+json' \
+ --header "Authorization: Bearer ${GH_TOKEN}" \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --output "${output_file}" \
+ --write-out '%{http_code}' \
+ "https://api.github.com${repo_api}/releases/tags/${encoded_tag}")"; then
+ echo "GitHub's published-release lookup failed."
+ return 2
+ fi
+
+ case "${status}" in
+ 200) return 0 ;;
+ 404) return 1 ;;
+ *)
+ echo "GitHub's published-release lookup returned HTTP ${status}."
+ cat "${output_file}"
+ return 2
+ ;;
+ esac
+ }
+
+ read_release_by_id() {
+ local release_id="$1"
+ local output_file="$2"
+ local metadata_file asset_pages
+ metadata_file="$(mktemp "${RUNNER_TEMP}/solsharp-release-metadata.XXXXXX")"
+ asset_pages="$(mktemp "${RUNNER_TEMP}/solsharp-release-asset-pages.XXXXXX")"
+ gh api \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/releases/${release_id}" \
+ > "${metadata_file}"
+ gh api --paginate --slurp \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ "${repo_api}/releases/${release_id}/assets?per_page=100" \
+ > "${asset_pages}"
+ jq --slurpfile asset_pages "${asset_pages}" \
+ '.assets = (($asset_pages[0] | add) // [])' \
+ "${metadata_file}" > "${output_file}"
+ }
+
+ verify_release_state() {
+ local state_file="$1"
+ local expected_draft="$2"
+ if ! jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg release_name "${expected_title}" \
+ --arg tag_name "${GITHUB_REF_NAME}" \
+ --argjson release_id "${RELEASE_ID}" \
+ --argjson is_draft "${expected_draft}" \
+ --argjson is_prerelease "${expected_prerelease}" '
+ .id == $release_id and
+ .tag_name == $tag_name and
+ .name == $release_name and
+ .author.login == "github-actions[bot]" and
+ .draft == $is_draft and
+ .prerelease == $is_prerelease and
+ (.assets | type) == "array" and
+ (.assets | length) == 3 and
+ ([.assets[].name] | sort) == ([
+ $package_name,
+ ($package_name + ".sha256"),
+ ($package_name + ".sigstore.json")
+ ] | sort)
+ ' "${state_file}" > /dev/null; then
+ echo "GitHub Release state does not match the exact staged release."
+ jq '{ id, tag_name, target_commitish, name, author: .author.login, draft, prerelease,
+ assets: [.assets[].name] }' "${state_file}"
+ return 1
+ fi
+
+ if ! jq --exit-status '
+ all(.assets[];
+ (.id | type) == "number" and
+ (.size | type) == "number" and .size > 0 and
+ .state == "uploaded" and
+ (.digest | type) == "string" and
+ (.digest | test("^sha256:[0-9a-f]{64}$")) and
+ .uploader.login == "github-actions[bot]")
+ ' "${state_file}" > /dev/null; then
+ echo "GitHub Release asset metadata is invalid."
+ return 1
+ fi
+ }
+
+ verify_downloaded_assets() {
+ local asset_directory="$1"
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ if [[ ! -f "${asset_directory}/${asset_name}" || \
+ -L "${asset_directory}/${asset_name}" ]]; then
+ echo "GitHub Release is missing required regular asset ${asset_name}."
+ return 1
+ fi
+ if ! cmp --silent \
+ "./artifacts/${asset_name}" \
+ "${asset_directory}/${asset_name}"; then
+ echo "GitHub Release asset ${asset_name} differs from the canonical staged artifact."
+ return 1
+ fi
+ done
+
+ local package_path="${asset_directory}/${PACKAGE_NAME}"
+ local provenance_path="${package_path}.sigstore.json"
+ local actual_sha256
+ actual_sha256="$(sha256sum "${package_path}" | cut -d ' ' -f 1)"
+ if [[ "${actual_sha256}" != "${PACKAGE_SHA256}" ]]; then
+ echo "Downloaded GitHub Release package has an unexpected digest."
+ return 1
+ fi
+ if ! printf '%s %s\n' "${actual_sha256}" "${PACKAGE_NAME}" | \
+ cmp --silent - "${package_path}.sha256"; then
+ echo "Downloaded GitHub Release checksum asset is invalid."
+ return 1
+ fi
+ if ! jq --exit-status \
+ --arg package_name "${PACKAGE_NAME}" \
+ --arg package_sha256 "${actual_sha256}" '
+ .mediaType == "application/vnd.dev.sigstore.bundle.v0.3+json" and
+ .dsseEnvelope.payloadType == "application/vnd.in-toto+json" and
+ ((.dsseEnvelope.payload | @base64d | fromjson) as $statement |
+ $statement._type == "https://in-toto.io/Statement/v1" and
+ $statement.predicateType == "https://slsa.dev/provenance/v1" and
+ ($statement.subject | type) == "array" and
+ ($statement.subject | length) == 1 and
+ $statement.subject[0].name == $package_name and
+ $statement.subject[0].digest.sha256 == $package_sha256)
+ ' "${provenance_path}" > /dev/null; then
+ echo "Downloaded GitHub Release provenance is invalid."
+ return 1
+ fi
+ gh attestation verify "${package_path}" \
+ --repo "${GITHUB_REPOSITORY}" \
+ --bundle "${provenance_path}" \
+ --signer-workflow "${GITHUB_REPOSITORY}/.github/workflows/release.yml" \
+ --source-ref "${GITHUB_REF}" \
+ --source-digest "${GITHUB_SHA}" \
+ --deny-self-hosted-runners
+ }
+
+ download_and_verify_release() {
+ local state_file="$1"
+ local asset_directory
+ asset_directory="$(mktemp -d "${RUNNER_TEMP}/solsharp-release-assets.XXXXXX")"
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ local asset_id
+ asset_id="$(jq --exit-status --raw-output \
+ --arg asset_name "${asset_name}" '
+ [.assets[] | select(.name == $asset_name) | .id] |
+ if length == 1 and (.[0] | type) == "number"
+ then .[0]
+ else error("unexpected release asset set")
+ end
+ ' "${state_file}")"
+ curl --fail --silent --show-error --location \
+ --header 'Accept: application/octet-stream' \
+ --header "Authorization: Bearer ${GH_TOKEN}" \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --output "${asset_directory}/${asset_name}" \
+ "https://api.github.com${repo_api}/releases/assets/${asset_id}"
+ done
+ local actual_digest api_digest
+ for asset_name in \
+ "${PACKAGE_NAME}" \
+ "${PACKAGE_NAME}.sha256" \
+ "${PACKAGE_NAME}.sigstore.json"; do
+ actual_digest="sha256:$(sha256sum "${asset_directory}/${asset_name}" | cut -d ' ' -f 1)"
+ api_digest="$(jq --exit-status --raw-output \
+ --arg asset_name "${asset_name}" '
+ [.assets[] | select(.name == $asset_name) | .digest] |
+ if length == 1 then .[0] else error("unexpected release asset set") end
+ ' "${state_file}")"
+ if [[ "${actual_digest}" != "${api_digest}" ]]; then
+ echo "Downloaded release asset ${asset_name} differs from GitHub's recorded digest."
+ return 1
+ fi
+ done
+ verify_downloaded_assets "${asset_directory}"
+ }
+
+ accept_published_release() {
+ local tag_state_file="$1"
+ local release_id state_file
+ release_id="$(jq --exit-status --raw-output \
+ 'if (.id | type) == "number" then .id else error("missing release id") end' \
+ "${tag_state_file}")"
+ state_file="$(mktemp "${RUNNER_TEMP}/solsharp-published-state.XXXXXX")"
+ read_release_by_id "${release_id}" "${state_file}"
+ verify_release_state "${state_file}" false
+ download_and_verify_release "${state_file}"
+ }
+
+ verify_tag_target
+ read_release_by_id "${RELEASE_ID}" "${release_state}"
+ current_draft="$(jq --exit-status --raw-output \
+ 'if (.draft | type) == "boolean" then .draft else error("missing draft state") end' \
+ "${release_state}")"
+ if [[ "${current_draft}" == "false" ]]; then
+ accept_published_release "${release_state}"
+ published_state="${RUNNER_TEMP}/published-release.json"
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ if (( lookup_status == 1 )); then
+ echo "Exact release ${RELEASE_ID} is public but is absent from the tag endpoint."
+ fi
+ exit "${lookup_status}"
+ fi
+ fi
+
+ verify_release_state "${release_state}" true
+ download_and_verify_release "${release_state}"
+ make_latest="$(jq --exit-status --raw-output '
+ if .prerelease == true then "false"
+ elif .prerelease == false then "legacy"
+ else error("missing prerelease state")
+ end
+ ' "${release_state}")"
+
+ # Check the authoritative published-by-tag endpoint immediately before mutating the exact
+ # staged release ID. If it became public concurrently, only that same verified ID is accepted.
+ verify_tag_target
+ published_state="${RUNNER_TEMP}/published-release.json"
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ if (( lookup_status != 1 )); then
+ exit "${lookup_status}"
+ fi
+ fi
+
+ verify_tag_target
+ gh api --method PATCH \
+ --header "X-GitHub-Api-Version: ${api_version}" \
+ --field draft=false \
+ --raw-field make_latest="${make_latest}" \
+ "${repo_api}/releases/${RELEASE_ID}" \
+ > "${RUNNER_TEMP}/publish-release-response.json"
+ read_release_by_id "${RELEASE_ID}" "${release_state}"
+ verify_release_state "${release_state}" false
+ download_and_verify_release "${release_state}"
+
+ # The exact-ID response is authoritative for mutation; the tag endpoint must converge to
+ # that same verified release before the workflow reports success.
+ for attempt in {1..6}; do
+ if get_published_release "${published_state}"; then
+ accept_published_release "${published_state}"
+ exit 0
+ else
+ lookup_status=$?
+ fi
+ if (( lookup_status != 1 || attempt == 6 )); then
+ echo "Published release ${RELEASE_ID} did not become authoritative for ${GITHUB_REF_NAME}."
+ exit "${lookup_status}"
+ fi
+ sleep 2
+ done
diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml
index a3097cb..2d36374 100644
--- a/.github/workflows/security.yml
+++ b/.github/workflows/security.yml
@@ -25,6 +25,7 @@ jobs:
uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
with:
dotnet-version: 8.0.x
+ dotnet-quality: ga
- name: Verify .NET 8 SDK selection
shell: bash
@@ -39,6 +40,7 @@ jobs:
- name: Audit direct and transitive NuGet dependencies
run: >-
dotnet restore SolSharp.sln
+ --locked-mode
-p:NuGetAudit=true
-p:NuGetAuditMode=all
-p:NuGetAuditLevel=low
@@ -48,6 +50,7 @@ jobs:
- name: Audit benchmark dependencies
run: >-
dotnet restore benchmarks/SolSharp.Benchmarks/SolSharp.Benchmarks.csproj
+ --locked-mode
-p:NuGetAudit=true
-p:NuGetAuditMode=all
-p:NuGetAuditLevel=low
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cf9721a..1ce169a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -58,12 +58,13 @@ version (on the earlier 0.x releases, minor versions could carry them).
group, hook, and extension decoders. Cryptographic proof/ciphertext generation remains explicitly
caller-supplied rather than being replaced by an unverifiable local implementation.
- Added a forward-compatible local `global.json`; after `setup-dotnet` installs 8.x, every CI/release job
- asserts the SDK resolver's actual selected version, so preinstalled newer SDKs cannot invalidate the
- minimum-SDK gate. Release publishing now fails unless the pushed tag exactly matches the
+ that invokes .NET asserts the SDK resolver's actual selected version, so preinstalled newer SDKs cannot
+ invalidate the minimum-SDK gate. Release publishing now fails unless the pushed tag exactly matches the
package version, requires private live-cluster endpoints with zero skipped or inconclusive integration
paths, verifies the canonical devnet genesis hash before any write, and Native-AOT publishes and runs the
- exact packed artifact from an isolated package cache before pushing it. Duplicate immutable NuGet versions
- fail visibly instead of becoming a green no-op.
+ exact packed artifact from an isolated package cache before pushing it. A duplicate immutable NuGet version
+ succeeds only when the repository-signed NuGet copy proves it contains the exact pre-staged canonical
+ package; mismatched or unverifiable duplicates fail visibly.
- Added centrally configured StyleCop analysis to every project. Rider, Roslyn, and StyleCop now share an
explicit modifier order, while repository-conflicting documentation and legacy-layout rules are suppressed
in `.editorconfig` instead of producing misleading IDE warnings. CI and release now require a clean
@@ -74,6 +75,16 @@ version (on the earlier 0.x releases, minor versions could carry them).
`security-extended`, Dependabot updates, OpenSSF Scorecard reporting, Node 24 action pins, and release-package
provenance attestations harden the GitHub supply chain without representing automated results as an
independent security audit.
+- Added committed per-project NuGet lock files and locked CI/release restores. The dynamic packed-package
+ AOT consumer keeps its job-specific lock under `obj` and separately proves that it restored the exact
+ package produced by the job.
+- Added five deterministic FsCheck properties covering 5,000 bounded arbitrary, truncated, and
+ single-byte-overwrite legacy/v0/V1 transaction cases per run. Accepted bytes must round-trip exactly, and
+ rejected bytes must fail through the documented format boundary.
+- Split release validation from narrowly privileged attestation, draft-staging, NuGet-publishing, and
+ finalization jobs. The contents-only staging job durably records the exact attested package before the
+ OIDC publisher sends those same bytes to NuGet; a separate contents-only finalizer publishes the verified
+ draft with the `.nupkg`, SHA-256 digest, and Sigstore/SLSA provenance bundle.
- SPL Token and Token-2022 authority-bearing instruction builders now have additive multisig overloads:
the multisig authority remains a non-signer account and the supplied member accounts are appended as
readonly signers in caller order.
diff --git a/CLAUDE.md b/CLAUDE.md
index 95b3b4d..ba59bfd 100644
--- a/CLAUDE.md
+++ b/CLAUDE.md
@@ -29,9 +29,9 @@ Run from the repo root (where `SolSharp.sln` lives):
- **Target framework is `net8.0`.** Do not use net9-only APIs (e.g. `JsonStringEnumMemberName`,
`InlineArray`-based span tricks that need newer ref-safety). `global.json` starts at SDK 8.0.100
with `rollForward: major`, so a development machine with only a newer SDK can still build the
- repository. Hosted runners also contain newer SDKs; after installing 8.x, every CI/release job asserts
- the resolver's actual `dotnet --version` is 8.x. Do not remove that check or CI could silently stop
- proving the minimum if SDK selection or runner contents change.
+ repository. Hosted runners also contain newer SDKs; after installing 8.x, every CI/release job that invokes
+ .NET asserts the resolver's actual `dotnet --version` is 8.x. Do not remove that check or CI could silently
+ stop proving the minimum if SDK selection or runner contents change.
- **Modern C# 12 only.** File-scoped namespaces, `var`, collection expressions `[]`, primary constructors, switch expressions, pattern matching, `is null` / `is not null`. The full rule set lives in `.editorconfig` + `Directory.Build.props` — follow the analyzers, don't fight them. Do not restate style rules here.
- **A feature is not done until it is documented.** Every user-facing addition or change lands in the same commit with all four documentation layers: (1) XML docs on the public API (CS1591 enforces presence on production members; full ``, ``, and `` content remains a review policy); (2) `docs/USAGE.md` — a runnable example in the matching section (or a new section + `Contents` entry), with every snippet checked against the real signatures and model properties, not written from memory; (3) `README.md` — the wire-method list, feature bullets, and Layout if the shape of the repo changed (`README.nuget.md` only if the pitch/quick-start changes — it carries no method lists by design); (4) `CHANGELOG.md` under the release being prepared. Release-only extras: bump `Version` in `Directory.Build.props`, refresh `PackageReleaseNotes` in `src/SolSharp/SolSharp.csproj` (nuget.org shows only the current version's notes), and update the `Status:` line here.
@@ -73,6 +73,9 @@ SolSharp/
- **One nested fixture per method under test:**
`public static class XTests { [TestFixture] public sealed class Method { ... } }`.
- Wire formats and crypto are money-critical: cover them with known vectors (RFC 8032 for signing, canonical compact-u16 / base58 vectors), not just round-trips.
+- Property-based hostile-input tests use FsCheck with an explicit replay seed and bounded case counts/input
+ sizes (`MaxTest`, plus `EndSize` where collections are generated). They complement upstream vectors; they
+ never replace them or introduce nondeterministic CI failures.
- `IDE1006` is disabled for `tests/**` so `Method_Scenario_Expectation` names are allowed.
- For constructor-throws-only tests use an explicit discard: `Action act = () => _ = new T(...);`.
- **Arrange / Act / Assert comments.** Mark the three phases with `// Arrange`, `// Act`, `// Assert`. When the call under test and its check are a single fluent statement (exception delegates, `(await …).Should()…`), use one `// Act & Assert`. Skip the labels on expression-bodied or single-statement `[TestCase]` tests where there is nothing to separate — never restructure a test body just to fit them.
@@ -101,3 +104,10 @@ SolSharp/
- **SPL Token account state uses the fixed-size `Pack` layout, not Borsh.** `Mint` (82 bytes) and `TokenAccount` (165 bytes) read a `COption` as a 4-byte little-endian tag followed by an *always-present* value (the slot is reserved even when `None`) — unlike Borsh's 1-byte tag with the value present only when `Some`. So `BorshReader` / `BorshWriter` are for Anchor/Borsh data; the SPL decoders are hand-written against the Pack layout and KAT'd against `solders.token.state`. (The Token *instruction* data is different again: a minimal `COption` of a 1-byte tag plus the value only when `Some`.)
- Money-critical encodings (message/transaction serialization, instruction data, PDA/ATA, on-curve) are checked byte-for-byte against `solana-sdk` (solders) and `solana-py`, not just round-trips.
- **Ships as one NuGet package.** The source stays four layered projects (so the compiler keeps Core crypto/IO-free, Wallet owns Ed25519, etc.), but only the `src/SolSharp` facade is packable: it references the four with `PrivateAssets="all"` and an MSBuild target (`BundleProjectReferences`) folds their DLLs + XML docs into a single `SolSharp` package, re-declaring the real third-party deps (kept in sync by hand). PDBs are embedded (`DebugType=embedded`) so symbols ride inside the bundled DLLs rather than a near-empty `.snupkg`. Default-`false` `IsPackable` (overridden only for `MSBuildProjectName == SolSharp`) keeps every other project from emitting its own package. Package validation compares the packed public API with the previous stable `PackageValidationBaselineVersion`; update that baseline deliberately when preparing each release.
+- **NuGet graphs are locked per project.** Keep every committed `packages.lock.json` synchronized with its
+ project and use `--locked-mode` in ordinary CI/release restores. The AOT smoke's packed-package graph is
+ intentionally dynamic because the package is built by the current job; its separate lock belongs under
+ `obj`, never in the committed project-reference lock.
+- **SDK 8 package archives are not byte-reproducible.** The release workflow therefore attests and stages the
+ exact `.nupkg` in a durable draft GitHub Release before NuGet publishing. Retries recover those canonical
+ bytes; never replace that ordering with a fresh post-publish `dotnet pack` result.
diff --git a/Directory.Build.props b/Directory.Build.props
index aa706c7..566852c 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -11,6 +11,7 @@
false
true
+ true
diff --git a/README.md b/README.md
index fd2de38..2b2cc68 100644
--- a/README.md
+++ b/README.md
@@ -366,7 +366,7 @@ SolSharp/
src/SolSharp.Programs/ native/SPL clients and states, PDA/ATA, messages and transactions
src/SolSharp/ packaging facade — bundles the four assemblies into the single NuGet package
samples/ SolSharp.AotSmoke — native-compiled smoke sample, published and run in CI
- tests/ NUnit + FluentAssertions, mirroring each project
+ tests/ NUnit + FluentAssertions + bounded FsCheck properties, mirroring each project
(+ SolSharp.IntegrationTests: live-cluster read/streaming checks)
benchmarks/ SolSharp.Benchmarks — standalone BenchmarkDotNet micro-benchmark harness
.github/workflows/ CI, coverage, dependency/security review, Scorecard, and trusted publishing
@@ -389,12 +389,19 @@ overlapping lower-layer hits are merged rather than counted twice. CI publishes
line/branch and Markdown reports, fails if repository-wide line coverage drops below 90%, and rejects a
documented percentage that exceeds the current measured result.
+Five deterministic FsCheck properties exercise 5,000 generated hostile-input cases on every CI run:
+bounded arbitrary transaction payloads, proper prefixes, and single-byte overwrite cases across legacy,
+v0, and V1. Accepted payloads must reserialize byte-for-byte; rejected payloads must fail with the
+documented format error rather than an unexpected exception.
+
Every pull request also receives a direct-and-transitive NuGet advisory audit and a dependency-diff
-review. CodeQL runs the `security-extended` C# query suite, the dependency audit runs weekly even without
-repository changes, OpenSSF Scorecard checks the repository's supply-chain posture, and release packages
-receive GitHub build-provenance attestations. A green security badge means those automated checks found no
-known issue at the tested revision; it is not a claim that the library is vulnerability-free or a substitute
-for an independent audit.
+review. All ordinary CI/release restores use committed `packages.lock.json` files in locked mode; the
+dynamic packed-package AOT consumer uses an isolated generated lock and independently verifies the exact
+package artifact. CodeQL runs the `security-extended` C# query suite, the dependency audit runs weekly even
+without repository changes, and OpenSSF Scorecard checks the repository's supply-chain posture. A release
+publishes the verified `.nupkg`, its SHA-256 digest, and Sigstore/SLSA build provenance together on GitHub.
+A green security badge means those automated checks found no known issue at the tested revision; it is not
+a claim that the library is vulnerability-free or a substitute for an independent audit.
## Design notes
diff --git a/README.nuget.md b/README.nuget.md
index c42cb87..8287c24 100644
--- a/README.nuget.md
+++ b/README.nuget.md
@@ -41,9 +41,11 @@ and control, this is aimed at you.
unit-coverage baseline covers 93.7% of hand-written production lines. CI merges overlapping reports,
excludes generated sources, publishes line and branch details, enforces a 90% repository-wide line
floor, and rejects documentation that overstates the current result.
-- **Automated security gates.** Pull requests and weekly scans audit direct and transitive NuGet
- advisories, review dependency changes, run CodeQL's extended C# security queries, and run OpenSSF
- supply-chain checks; release packages receive GitHub build-provenance attestations.
+- **Automated security gates.** Pull requests run direct/transitive NuGet auditing, dependency review,
+ and CodeQL's extended C# queries; scheduled scans rerun the audit and CodeQL and report OpenSSF
+ supply-chain posture. Ordinary CI/release restores are locked to committed dependency graphs, 5,000
+ deterministic property-based hostile-input cases exercise transaction decoding per CI run, and the
+ release workflow attaches the verified package, SHA-256 digest, and Sigstore/SLSA build provenance.
## Compared with Solnet and the official Rust contracts
diff --git a/SECURITY.md b/SECURITY.md
index 88474b8..379e966 100644
--- a/SECURITY.md
+++ b/SECURITY.md
@@ -34,9 +34,12 @@ prefer otherwise.
critical findings fail the security gate.
- Dependency Review rejects pull requests that introduce a known vulnerable dependency, and the
advisory audit also runs weekly so newly published advisories are detected without a new commit.
+- Ordinary CI/release restores are locked to committed NuGet dependency graphs. Five deterministic
+ property-based tests exercise 5,000 bounded arbitrary, truncated, and single-byte-overwrite transaction
+ cases per CI run.
- CodeQL runs the extended C# security query suite. OpenSSF Scorecard reports repository supply-chain
- posture, and release packages receive GitHub build-provenance attestations after the exact packed
- artifact passes the Native AOT smoke test.
+ posture, and the release workflow attaches the verified package, SHA-256 digest, and Sigstore/SLSA build
+ provenance after the exact packed artifact passes the Native AOT smoke test.
These checks report known issues in the inputs and databases available at run time. A green badge is
useful evidence, but it is not proof that SolSharp is vulnerability-free and is not a professional audit.
diff --git a/benchmarks/SolSharp.Benchmarks/packages.lock.json b/benchmarks/SolSharp.Benchmarks/packages.lock.json
new file mode 100644
index 0000000..176972c
--- /dev/null
+++ b/benchmarks/SolSharp.Benchmarks/packages.lock.json
@@ -0,0 +1,553 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "BenchmarkDotNet": {
+ "type": "Direct",
+ "requested": "[0.14.0, )",
+ "resolved": "0.14.0",
+ "contentHash": "eIPSDKi3oni734M1rt/XJAwGQQOIf9gLjRRKKJ0HuVy3vYd7gnmAIX1bTjzI9ZbAY/nPddgqqgM/TeBYitMCIg==",
+ "dependencies": {
+ "BenchmarkDotNet.Annotations": "0.14.0",
+ "CommandLineParser": "2.9.1",
+ "Gee.External.Capstone": "2.3.0",
+ "Iced": "1.17.0",
+ "Microsoft.CodeAnalysis.CSharp": "4.1.0",
+ "Microsoft.Diagnostics.Runtime": "2.2.332302",
+ "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.8",
+ "Microsoft.DotNet.PlatformAbstractions": "3.1.6",
+ "Perfolizer": "[0.3.17]",
+ "System.Management": "5.0.0"
+ }
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BenchmarkDotNet.Annotations": {
+ "type": "Transitive",
+ "resolved": "0.14.0",
+ "contentHash": "CUDCg6bgHrDzhjnA+IOBl5gAo8Y5hZ2YSs7MBXrYMlMKpBZqrD5ez0537uDveOkcf+YWAoK+S4sMcuWPbIz8bw=="
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "CommandLineParser": {
+ "type": "Transitive",
+ "resolved": "2.9.1",
+ "contentHash": "OE0sl1/sQ37bjVsPKKtwQlWDgqaxWgtme3xZz7JssWUzg5JpMIyHgCTY9MVMxOg48fJ1AgGT3tgdH5m/kQ5xhA=="
+ },
+ "Gee.External.Capstone": {
+ "type": "Transitive",
+ "resolved": "2.3.0",
+ "contentHash": "2ap/rYmjtzCOT8hxrnEW/QeiOt+paD8iRrIcdKX0cxVwWLFa1e+JDBNeECakmccXrSFeBQuu5AV8SNkipFMMMw=="
+ },
+ "Iced": {
+ "type": "Transitive",
+ "resolved": "1.17.0",
+ "contentHash": "8x+HCVTl/HHTGpscH3vMBhV8sknN/muZFw9s3TsI8SA6+c43cOTCi2+jE4KsU8pNLbJ++iF2ZFcpcXHXtDglnw=="
+ },
+ "Microsoft.Bcl.AsyncInterfaces": {
+ "type": "Transitive",
+ "resolved": "1.1.0",
+ "contentHash": "1Am6l4Vpn3/K32daEqZI+FFr96OlZkgwK2LcT3pZ2zWubR5zTPW3/FkO1Rat9kb7oQOa4rxgl9LJHc5tspCWfg=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.CodeAnalysis.Analyzers": {
+ "type": "Transitive",
+ "resolved": "3.3.3",
+ "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ=="
+ },
+ "Microsoft.CodeAnalysis.Common": {
+ "type": "Transitive",
+ "resolved": "4.1.0",
+ "contentHash": "bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Analyzers": "3.3.3",
+ "System.Collections.Immutable": "5.0.0",
+ "System.Memory": "4.5.4",
+ "System.Reflection.Metadata": "5.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0",
+ "System.Text.Encoding.CodePages": "4.5.1",
+ "System.Threading.Tasks.Extensions": "4.5.4"
+ }
+ },
+ "Microsoft.CodeAnalysis.CSharp": {
+ "type": "Transitive",
+ "resolved": "4.1.0",
+ "contentHash": "sbu6kDGzo9bfQxuqWpeEE7I9P30bSuZEnpDz9/qz20OU6pm79Z63+/BsAzO2e/R/Q97kBrpj647wokZnEVr97w==",
+ "dependencies": {
+ "Microsoft.CodeAnalysis.Common": "[4.1.0]"
+ }
+ },
+ "Microsoft.Diagnostics.NETCore.Client": {
+ "type": "Transitive",
+ "resolved": "0.2.251802",
+ "contentHash": "bqnYl6AdSeboeN4v25hSukK6Odm6/54E3Y2B8rBvgqvAW0mF8fo7XNRVE2DMOG7Rk0fiuA079QIH28+V+W1Zdg==",
+ "dependencies": {
+ "Microsoft.Bcl.AsyncInterfaces": "1.1.0",
+ "Microsoft.Extensions.Logging": "2.1.1"
+ }
+ },
+ "Microsoft.Diagnostics.Runtime": {
+ "type": "Transitive",
+ "resolved": "2.2.332302",
+ "contentHash": "Hp84ivxSKIMTBzYSATxmUsm3YSXHWivcwiRRbsydGmqujMUK8BAueLN0ssAVEOkOBmh0vjUBhrq7YcroT7VCug==",
+ "dependencies": {
+ "Microsoft.Diagnostics.NETCore.Client": "0.2.251802",
+ "System.Collections.Immutable": "5.0.0",
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0"
+ }
+ },
+ "Microsoft.Diagnostics.Tracing.TraceEvent": {
+ "type": "Transitive",
+ "resolved": "3.1.8",
+ "contentHash": "kl3UMrZKSeSEYZ8rt/GjLUQToREjgQABqfg6PzQBmSlYHTZOKE9ePEOS2xptROQ9SVvngg3QGX51TIT11iZ0wA==",
+ "dependencies": {
+ "Microsoft.Win32.Registry": "4.4.0",
+ "System.Runtime.CompilerServices.Unsafe": "5.0.0"
+ }
+ },
+ "Microsoft.DotNet.PlatformAbstractions": {
+ "type": "Transitive",
+ "resolved": "3.1.6",
+ "contentHash": "jek4XYaQ/PGUwDKKhwR8K47Uh1189PFzMeLqO83mXrXQVIpARZCcfuDedH50YDTepBkfijCZN5U/vZi++erxtg=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.NETCore.Platforms": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Microsoft.Win32.Registry": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dDoKi0PnDz31yAyETfRntsLArTlVAVzUzCIvvEDsDsucrl33Dl8pIJG06ePTJTI3tGpeyHS9Cq7Foc/s4EeKcg==",
+ "dependencies": {
+ "System.Security.AccessControl": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "Perfolizer": {
+ "type": "Transitive",
+ "resolved": "0.3.17",
+ "contentHash": "FQgtCoF2HFwvzKWulAwBS5BGLlh8pgbrJtOp47jyBwh2CW16juVtacN1azOA2BqdrJXkXTNLNRMo7ZlHHiuAnA=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.CodeDom": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "FXkLXiK0sVVewcso0imKQoOxjoPAj42R8HtjjbSjVPAzwDfzoyoznWxgA3c38LDbN9SJux1xXoXYAhz98j7r2g=="
+ },
+ "System.Management": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "5.0.0",
+ "Microsoft.Win32.Registry": "5.0.0",
+ "System.CodeDom": "5.0.0"
+ }
+ },
+ "System.Memory": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "1MbJTHS1lZ4bS4FmsJjnuGJOu88ZzTT2rLvrhW7Ygic+pC0NWA+3hgAen0HRdsocuQXCkUTdFn9yHJJhsijDXw=="
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "5NecZgXktdGg34rh1OenY1rFNDCI8xSjFr+Z4OU4cU06AQHUdRnIIEeWENu3Wl4YowbzkymAIMvi3WyK9U53pQ=="
+ },
+ "System.Runtime.CompilerServices.Unsafe": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "ZD9TMpsmYJLrxbbmdvhwt9YEgG5WntEnZ/d1eH8JBX9LBp+Ju8BSBhUGbZMNVHHomWo2KVImJhTDl2hIgw/6MA=="
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "dagJ1mHZO3Ani8GH0PHpPEe/oYO+rVdbQjvjJkBRNQkX4t0r1iaeGn8+/ybkSLEan3/slM0t59SVdHzuHf2jmw==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "5.0.0",
+ "System.Security.Principal.Windows": "5.0.0"
+ }
+ },
+ "System.Security.Principal.Windows": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "t0MGLukB5WAVU9bO3MGzvlGnyJPgUlcwerXn1kzBRjwLKixT96XV0Uza41W49gVd8zEMFu9vQEFlv0IOrytICA=="
+ },
+ "System.Text.Encoding.CodePages": {
+ "type": "Transitive",
+ "resolved": "4.5.1",
+ "contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==",
+ "dependencies": {
+ "Microsoft.NETCore.Platforms": "2.1.2",
+ "System.Runtime.CompilerServices.Unsafe": "4.5.2"
+ }
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "System.Threading.Tasks.Extensions": {
+ "type": "Transitive",
+ "resolved": "4.5.4",
+ "contentHash": "zteT+G8xuGu6mS+mzDzYXbzS7rd3K6Fjb9RiZlYlJPam2/hU7JCBZBVEcywNuR+oZ1ncTvc/cq0faRr3P01OVg=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.programs": {
+ "type": "Project",
+ "dependencies": {
+ "SolSharp.Core": "[2.0.0, )",
+ "SolSharp.Wallet": "[2.0.0, )"
+ }
+ },
+ "solsharp.rpc": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Http": "[8.0.1, )",
+ "Microsoft.Extensions.Http.Resilience": "[8.10.0, )",
+ "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/samples/SolSharp.AotSmoke/SolSharp.AotSmoke.csproj b/samples/SolSharp.AotSmoke/SolSharp.AotSmoke.csproj
index ebfa6e3..6f3fadc 100644
--- a/samples/SolSharp.AotSmoke/SolSharp.AotSmoke.csproj
+++ b/samples/SolSharp.AotSmoke/SolSharp.AotSmoke.csproj
@@ -8,6 +8,10 @@
$(NoWarn);CS1591
+
+ $(BaseIntermediateOutputPath)packages.packed.lock.json
+
+
diff --git a/samples/SolSharp.AotSmoke/packages.lock.json b/samples/SolSharp.AotSmoke/packages.lock.json
new file mode 100644
index 0000000..b7382be
--- /dev/null
+++ b/samples/SolSharp.AotSmoke/packages.lock.json
@@ -0,0 +1,380 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "Microsoft.DotNet.ILCompiler": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "pJ9k0aa7xJCiukdnM7W6K6nNJchLpdBWkPnclDmunW1UPTD9cnWMWzEPQq0nqSLhoixR4xflE2VKslROxBlI5Q=="
+ },
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.programs": {
+ "type": "Project",
+ "dependencies": {
+ "SolSharp.Core": "[2.0.0, )",
+ "SolSharp.Wallet": "[2.0.0, )"
+ }
+ },
+ "solsharp.rpc": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Http": "[8.0.1, )",
+ "Microsoft.Extensions.Http.Resilience": "[8.10.0, )",
+ "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SolSharp.Core/packages.lock.json b/src/SolSharp.Core/packages.lock.json
new file mode 100644
index 0000000..9149adc
--- /dev/null
+++ b/src/SolSharp.Core/packages.lock.json
@@ -0,0 +1,53 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Direct",
+ "requested": "[5.6.4, )",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SolSharp.Programs/packages.lock.json b/src/SolSharp.Programs/packages.lock.json
new file mode 100644
index 0000000..b5bdc01
--- /dev/null
+++ b/src/SolSharp.Programs/packages.lock.json
@@ -0,0 +1,76 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SolSharp.Rpc/packages.lock.json b/src/SolSharp.Rpc/packages.lock.json
new file mode 100644
index 0000000..ebd466d
--- /dev/null
+++ b/src/SolSharp.Rpc/packages.lock.json
@@ -0,0 +1,343 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "Microsoft.Extensions.Http": {
+ "type": "Direct",
+ "requested": "[8.0.1, )",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Direct",
+ "requested": "[8.10.0, )",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Direct",
+ "requested": "[8.0.3, )",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SolSharp.Wallet/packages.lock.json b/src/SolSharp.Wallet/packages.lock.json
new file mode 100644
index 0000000..4f030fc
--- /dev/null
+++ b/src/SolSharp.Wallet/packages.lock.json
@@ -0,0 +1,70 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "BouncyCastle.Cryptography": {
+ "type": "Direct",
+ "requested": "[2.7.0, )",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Direct",
+ "requested": "[1.0.5, )",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SolSharp/packages.lock.json b/src/SolSharp/packages.lock.json
new file mode 100644
index 0000000..6b9a677
--- /dev/null
+++ b/src/SolSharp/packages.lock.json
@@ -0,0 +1,380 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "BouncyCastle.Cryptography": {
+ "type": "Direct",
+ "requested": "[2.7.0, )",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Direct",
+ "requested": "[8.0.1, )",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Direct",
+ "requested": "[8.10.0, )",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Direct",
+ "requested": "[8.0.3, )",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.NET.ILLink.Tasks": {
+ "type": "Direct",
+ "requested": "[8.0.29, )",
+ "resolved": "8.0.29",
+ "contentHash": "HSBTfrkIZijz8z3ybLRKB7E8rHk4QQufFwpHa9fc5CMIgRhRzdn4mBGmlyXZqaueiMPtuJcnjresGvSTfaW8Mg=="
+ },
+ "Microsoft.SourceLink.GitHub": {
+ "type": "Direct",
+ "requested": "[8.0.0, )",
+ "resolved": "8.0.0",
+ "contentHash": "G5q7OqtwIyGTkeIOAc3u2ZuV/kicQaec5EaRnc0pIeSnh9LUjj+PYQrJYBURvDt7twGl2PKA7nSN0kz1Zw5bnQ==",
+ "dependencies": {
+ "Microsoft.Build.Tasks.Git": "8.0.0",
+ "Microsoft.SourceLink.Common": "8.0.0"
+ }
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Direct",
+ "requested": "[1.0.5, )",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "SimpleBase": {
+ "type": "Direct",
+ "requested": "[5.6.4, )",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Microsoft.Build.Tasks.Git": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bZKfSIKJRXLTuSzLudMFte/8CempWjVamNUR5eHJizsy+iuOuO/k2gnh7W0dHJmYY0tBf+gUErfluCv5mySAOQ=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.SourceLink.Common": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "dk9JPxTCIevS75HyEQ0E4OVAFhB2N+V9ShCXf8Q6FkUQZDkgLI12y679Nym1YqsiSysuQskT7Z+6nUf3yab6Vw=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.programs": {
+ "type": "Project",
+ "dependencies": {
+ "SolSharp.Core": "[2.0.0, )",
+ "SolSharp.Wallet": "[2.0.0, )"
+ }
+ },
+ "solsharp.rpc": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Http": "[8.0.1, )",
+ "Microsoft.Extensions.Http.Resilience": "[8.10.0, )",
+ "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/SolSharp.Core.Tests/packages.lock.json b/tests/SolSharp.Core.Tests/packages.lock.json
new file mode 100644
index 0000000..65b5b68
--- /dev/null
+++ b/tests/SolSharp.Core.Tests/packages.lock.json
@@ -0,0 +1,244 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[10.0.1, )",
+ "resolved": "10.0.1",
+ "contentHash": "27jXSV/0DbVqF5jDrAxuQFZ9oaz6gmG03p8ttxAFk+X0M4woFYj7MoWDLCna5EGLb0CE6OE7X6ZH3Wt5smTtaA=="
+ },
+ "FluentAssertions": {
+ "type": "Direct",
+ "requested": "[7.2.2, )",
+ "resolved": "7.2.2",
+ "contentHash": "B6FJmtTadaqtLXH5qfn9hlYF5ruNOAdtjA9+1V3fuYp/MZzj7lB3Ys5cdgy72uv7w1GE5Y9PEX369UD3N1sfHg==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[18.6.0, )",
+ "resolved": "18.6.0",
+ "contentHash": "kAIBt0MsYR0o2RULmlW5BhQ1ha50aGEgLKG4f1p0kePBGLJCprqs3S+NxRrYN8UH7mSQRPKpeiH9mwPMEKUObQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "18.6.0",
+ "Microsoft.TestPlatform.TestHost": "18.6.0"
+ }
+ },
+ "NSubstitute": {
+ "type": "Direct",
+ "requested": "[5.3.0, )",
+ "resolved": "5.3.0",
+ "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==",
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ }
+ },
+ "NUnit": {
+ "type": "Direct",
+ "requested": "[4.6.1, )",
+ "resolved": "4.6.1",
+ "contentHash": "xS4+YaBFUv1r8bcAbjitSfYaRZGfMwUiMdiaRziBXZpKgVxKDSHhjUn0mV5mObHGZRZq6eNa+WFWr3g8grj66A=="
+ },
+ "NUnit3TestAdapter": {
+ "type": "Direct",
+ "requested": "[6.2.0, )",
+ "resolved": "6.2.0",
+ "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "8.0.2",
+ "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0",
+ "Microsoft.Testing.Platform.MSBuild": "2.1.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Castle.Core": {
+ "type": "Transitive",
+ "resolved": "5.1.1",
+ "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.23.0",
+ "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "bkmCXn/65Cd0LdO2zTb/ValGAJ1H8y/CgYOiBb3jsDyHI3Y1ljKx6RBvhvn3e5D/4R4I00RRwLf+Bd2Sn6bJjA=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
+ },
+ "Microsoft.Testing.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.23.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.VSTestBridge": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.0.1",
+ "Microsoft.Testing.Extensions.Telemetry": "2.1.0",
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.1.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Platform": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg=="
+ },
+ "Microsoft.Testing.Platform.MSBuild": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "gQTW4BIfM2ZLxixo9ITXoulLKjn20FiiHtqTsx9PENqTrX7368ZeJ5L0QZJyReXDWORPRV8jXwZR6Aar8JOyaA==",
+ "dependencies": {
+ "System.Reflection.Metadata": "8.0.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "em1eLz5Q46+hsCtAXdXggWAPd9gQyT4ngdsQ7k1eWvQgpsjtS/wAOJ/5TteieFdiAvrEq1iVn00LtusAxRaVmQ==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.6.0",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg=="
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA=="
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "8.0.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/SolSharp.IntegrationTests/packages.lock.json b/tests/SolSharp.IntegrationTests/packages.lock.json
new file mode 100644
index 0000000..d90d806
--- /dev/null
+++ b/tests/SolSharp.IntegrationTests/packages.lock.json
@@ -0,0 +1,533 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "FluentAssertions": {
+ "type": "Direct",
+ "requested": "[7.2.2, )",
+ "resolved": "7.2.2",
+ "contentHash": "B6FJmtTadaqtLXH5qfn9hlYF5ruNOAdtjA9+1V3fuYp/MZzj7lB3Ys5cdgy72uv7w1GE5Y9PEX369UD3N1sfHg==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Direct",
+ "requested": "[8.0.1, )",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[18.6.0, )",
+ "resolved": "18.6.0",
+ "contentHash": "kAIBt0MsYR0o2RULmlW5BhQ1ha50aGEgLKG4f1p0kePBGLJCprqs3S+NxRrYN8UH7mSQRPKpeiH9mwPMEKUObQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "18.6.0",
+ "Microsoft.TestPlatform.TestHost": "18.6.0"
+ }
+ },
+ "NUnit": {
+ "type": "Direct",
+ "requested": "[4.6.1, )",
+ "resolved": "4.6.1",
+ "contentHash": "xS4+YaBFUv1r8bcAbjitSfYaRZGfMwUiMdiaRziBXZpKgVxKDSHhjUn0mV5mObHGZRZq6eNa+WFWr3g8grj66A=="
+ },
+ "NUnit3TestAdapter": {
+ "type": "Direct",
+ "requested": "[6.2.0, )",
+ "resolved": "6.2.0",
+ "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "8.0.2",
+ "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0",
+ "Microsoft.Testing.Platform.MSBuild": "2.1.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.23.0",
+ "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "bkmCXn/65Cd0LdO2zTb/ValGAJ1H8y/CgYOiBb3jsDyHI3Y1ljKx6RBvhvn3e5D/4R4I00RRwLf+Bd2Sn6bJjA=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.Testing.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.23.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.VSTestBridge": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.0.1",
+ "Microsoft.Testing.Extensions.Telemetry": "2.1.0",
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.1.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Platform": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg=="
+ },
+ "Microsoft.Testing.Platform.MSBuild": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "gQTW4BIfM2ZLxixo9ITXoulLKjn20FiiHtqTsx9PENqTrX7368ZeJ5L0QZJyReXDWORPRV8jXwZR6Aar8JOyaA==",
+ "dependencies": {
+ "System.Reflection.Metadata": "8.0.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "em1eLz5Q46+hsCtAXdXggWAPd9gQyT4ngdsQ7k1eWvQgpsjtS/wAOJ/5TteieFdiAvrEq1iVn00LtusAxRaVmQ==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.6.0",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg=="
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "8.0.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.programs": {
+ "type": "Project",
+ "dependencies": {
+ "SolSharp.Core": "[2.0.0, )",
+ "SolSharp.Wallet": "[2.0.0, )"
+ }
+ },
+ "solsharp.rpc": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Http": "[8.0.1, )",
+ "Microsoft.Extensions.Http.Resilience": "[8.10.0, )",
+ "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj b/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj
index 2bd71f2..4dd11df 100644
--- a/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj
+++ b/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj
@@ -11,6 +11,7 @@
+
all
diff --git a/tests/SolSharp.Programs.Tests/TransactionDeserializeTests.cs b/tests/SolSharp.Programs.Tests/TransactionDeserializeTests.cs
index 861fe7e..f4cf637 100644
--- a/tests/SolSharp.Programs.Tests/TransactionDeserializeTests.cs
+++ b/tests/SolSharp.Programs.Tests/TransactionDeserializeTests.cs
@@ -1,5 +1,6 @@
using FluentAssertions;
using NUnit.Framework;
+using FsCheckProperty = FsCheck.NUnit.PropertyAttribute;
namespace SolSharp.Programs.Tests;
@@ -22,6 +23,51 @@ public static class TransactionDeserializeTests
[TestFixture]
public sealed class Deserialize
{
+ [FsCheckProperty(
+ MaxTest = 2_000,
+ EndSize = MessageV1.MaxTransactionSize,
+ Replay = "1597463007,12648431",
+ QuietOnSuccess = true)]
+ public bool ArbitraryBoundedPayload_EitherRejectsOrRoundTrips(byte[] data)
+ => RejectsOrRoundTrips(data);
+
+ [FsCheckProperty(
+ MaxTest = 1_000,
+ Replay = "3735928559,195948557",
+ QuietOnSuccess = true)]
+ public bool SingleByteMutation_EitherRejectsOrRoundTrips(bool useV0, int index, byte replacement)
+ {
+ // Arrange
+ var data = Convert.FromHexString(useV0 ? SignedV0Hex : SignedTransferHex);
+ var position = (int)((uint)index % (uint)data.Length);
+ data[position] = replacement;
+
+ // Act & Assert
+ return RejectsOrRoundTrips(data);
+ }
+
+ [FsCheckProperty(
+ MaxTest = 500,
+ Replay = "4277009102,2882400001",
+ QuietOnSuccess = true)]
+ public bool ProperPrefix_IsAlwaysRejected(bool useV0, int lengthSelector)
+ {
+ // Arrange
+ var data = Convert.FromHexString(useV0 ? SignedV0Hex : SignedTransferHex);
+ var length = (int)((uint)lengthSelector % (uint)data.Length);
+
+ // Act & Assert
+ try
+ {
+ _ = Transaction.Deserialize(data.AsSpan(0, length));
+ return false;
+ }
+ catch (FormatException)
+ {
+ return true;
+ }
+ }
+
[Test]
public void LegacyTransfer_RoundTripsAndParsesFields()
{
@@ -179,5 +225,18 @@ public void TrailingByte_ThrowsFormatException(string hex)
// Assert
act.Should().Throw().WithMessage("*trailing byte(s)*");
}
+
+ private static bool RejectsOrRoundTrips(byte[] data)
+ {
+ try
+ {
+ var transaction = Transaction.Deserialize(data);
+ return transaction.Serialize().AsSpan().SequenceEqual(data);
+ }
+ catch (FormatException)
+ {
+ return true;
+ }
+ }
}
}
diff --git a/tests/SolSharp.Programs.Tests/TransactionV1Tests.cs b/tests/SolSharp.Programs.Tests/TransactionV1Tests.cs
index aa71f52..4a0a113 100644
--- a/tests/SolSharp.Programs.Tests/TransactionV1Tests.cs
+++ b/tests/SolSharp.Programs.Tests/TransactionV1Tests.cs
@@ -2,6 +2,7 @@
using NUnit.Framework;
using SolSharp.Core.Primitives;
using SolSharp.Wallet;
+using FsCheckProperty = FsCheck.NUnit.PropertyAttribute;
namespace SolSharp.Programs.Tests;
@@ -172,6 +173,51 @@ public void CodecRoundTripsAtAndAboveRpcRuntimeSizeBoundary(int dataLength, int
[TestFixture]
public sealed class Deserialize
{
+ [FsCheckProperty(
+ MaxTest = 1_000,
+ Replay = "3405691582,3131961357",
+ QuietOnSuccess = true)]
+ public bool SingleByteMutation_EitherRejectsOrRoundTrips(int index, byte replacement)
+ {
+ // Arrange
+ byte[] data = [.. UpstreamMessage(), .. new byte[Transaction.SignatureLength]];
+ var position = (int)((uint)index % (uint)data.Length);
+ data[position] = replacement;
+
+ // Act & Assert
+ try
+ {
+ var transaction = Transaction.Deserialize(data);
+ return transaction.Serialize().AsSpan().SequenceEqual(data);
+ }
+ catch (FormatException)
+ {
+ return true;
+ }
+ }
+
+ [FsCheckProperty(
+ MaxTest = 500,
+ Replay = "232525822,19088743",
+ QuietOnSuccess = true)]
+ public bool ProperPrefix_IsAlwaysRejected(int lengthSelector)
+ {
+ // Arrange
+ byte[] data = [.. UpstreamMessage(), .. new byte[Transaction.SignatureLength]];
+ var length = (int)((uint)lengthSelector % (uint)data.Length);
+
+ // Act & Assert
+ try
+ {
+ _ = Transaction.Deserialize(data.AsSpan(0, length));
+ return false;
+ }
+ catch (FormatException)
+ {
+ return true;
+ }
+ }
+
[Test]
public void UnsignedTransaction_RoundTripsWithoutSignatureCountPrefix()
{
diff --git a/tests/SolSharp.Programs.Tests/packages.lock.json b/tests/SolSharp.Programs.Tests/packages.lock.json
new file mode 100644
index 0000000..cd15dd0
--- /dev/null
+++ b/tests/SolSharp.Programs.Tests/packages.lock.json
@@ -0,0 +1,292 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[10.0.1, )",
+ "resolved": "10.0.1",
+ "contentHash": "27jXSV/0DbVqF5jDrAxuQFZ9oaz6gmG03p8ttxAFk+X0M4woFYj7MoWDLCna5EGLb0CE6OE7X6ZH3Wt5smTtaA=="
+ },
+ "FluentAssertions": {
+ "type": "Direct",
+ "requested": "[7.2.2, )",
+ "resolved": "7.2.2",
+ "contentHash": "B6FJmtTadaqtLXH5qfn9hlYF5ruNOAdtjA9+1V3fuYp/MZzj7lB3Ys5cdgy72uv7w1GE5Y9PEX369UD3N1sfHg==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "FsCheck.NUnit": {
+ "type": "Direct",
+ "requested": "[3.3.3, )",
+ "resolved": "3.3.3",
+ "contentHash": "2Mg0yWFYWzRXmYW5/jR9jxAwAh5iJVTL5rTfMaeP4MljN3KviZKBHuv9Bq+t9HBxwDrXhRLDh+b+Ce00WR13/Q==",
+ "dependencies": {
+ "FsCheck": "[3.3.3]",
+ "NUnit": "[4.0.0, 5.0.0)"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[18.6.0, )",
+ "resolved": "18.6.0",
+ "contentHash": "kAIBt0MsYR0o2RULmlW5BhQ1ha50aGEgLKG4f1p0kePBGLJCprqs3S+NxRrYN8UH7mSQRPKpeiH9mwPMEKUObQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "18.6.0",
+ "Microsoft.TestPlatform.TestHost": "18.6.0"
+ }
+ },
+ "NSubstitute": {
+ "type": "Direct",
+ "requested": "[5.3.0, )",
+ "resolved": "5.3.0",
+ "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==",
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ }
+ },
+ "NUnit": {
+ "type": "Direct",
+ "requested": "[4.6.1, )",
+ "resolved": "4.6.1",
+ "contentHash": "xS4+YaBFUv1r8bcAbjitSfYaRZGfMwUiMdiaRziBXZpKgVxKDSHhjUn0mV5mObHGZRZq6eNa+WFWr3g8grj66A=="
+ },
+ "NUnit3TestAdapter": {
+ "type": "Direct",
+ "requested": "[6.2.0, )",
+ "resolved": "6.2.0",
+ "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "8.0.2",
+ "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0",
+ "Microsoft.Testing.Platform.MSBuild": "2.1.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Castle.Core": {
+ "type": "Transitive",
+ "resolved": "5.1.1",
+ "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ }
+ },
+ "FsCheck": {
+ "type": "Transitive",
+ "resolved": "3.3.3",
+ "contentHash": "FtJSNzekCwoVTJPLZwK2In1cr9PhIo6WAX/RSM7BL/jQERgnO0111+hdcN14pcog9BByJmqehBrMbjjKpHZULg==",
+ "dependencies": {
+ "FSharp.Core": "5.0.2"
+ }
+ },
+ "FSharp.Core": {
+ "type": "Transitive",
+ "resolved": "5.0.2",
+ "contentHash": "DpcajqENgb3VXaHw1FKfVS+TWwEzck1PCajqLwBAVrtd1lfxd7T8JISVZBdV1mX9+2g48+tIgpNaVJWObdMrBw=="
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.23.0",
+ "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "bkmCXn/65Cd0LdO2zTb/ValGAJ1H8y/CgYOiBb3jsDyHI3Y1ljKx6RBvhvn3e5D/4R4I00RRwLf+Bd2Sn6bJjA=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
+ },
+ "Microsoft.Testing.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.23.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.VSTestBridge": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.0.1",
+ "Microsoft.Testing.Extensions.Telemetry": "2.1.0",
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.1.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Platform": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg=="
+ },
+ "Microsoft.Testing.Platform.MSBuild": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "gQTW4BIfM2ZLxixo9ITXoulLKjn20FiiHtqTsx9PENqTrX7368ZeJ5L0QZJyReXDWORPRV8jXwZR6Aar8JOyaA==",
+ "dependencies": {
+ "System.Reflection.Metadata": "8.0.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "em1eLz5Q46+hsCtAXdXggWAPd9gQyT4ngdsQ7k1eWvQgpsjtS/wAOJ/5TteieFdiAvrEq1iVn00LtusAxRaVmQ==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.6.0",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg=="
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA=="
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "8.0.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.programs": {
+ "type": "Project",
+ "dependencies": {
+ "SolSharp.Core": "[2.0.0, )",
+ "SolSharp.Wallet": "[2.0.0, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/SolSharp.Rpc.Tests/packages.lock.json b/tests/SolSharp.Rpc.Tests/packages.lock.json
new file mode 100644
index 0000000..9876147
--- /dev/null
+++ b/tests/SolSharp.Rpc.Tests/packages.lock.json
@@ -0,0 +1,536 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[10.0.1, )",
+ "resolved": "10.0.1",
+ "contentHash": "27jXSV/0DbVqF5jDrAxuQFZ9oaz6gmG03p8ttxAFk+X0M4woFYj7MoWDLCna5EGLb0CE6OE7X6ZH3Wt5smTtaA=="
+ },
+ "FluentAssertions": {
+ "type": "Direct",
+ "requested": "[7.2.2, )",
+ "resolved": "7.2.2",
+ "contentHash": "B6FJmtTadaqtLXH5qfn9hlYF5ruNOAdtjA9+1V3fuYp/MZzj7lB3Ys5cdgy72uv7w1GE5Y9PEX369UD3N1sfHg==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection": {
+ "type": "Direct",
+ "requested": "[8.0.1, )",
+ "resolved": "8.0.1",
+ "contentHash": "BmANAnR5Xd4Oqw7yQ75xOAYODybZQRzdeNucg7kS5wWKd2PNnMdYtJ2Vciy0QLylRmv42DGl5+AFL9izA6F1Rw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[18.6.0, )",
+ "resolved": "18.6.0",
+ "contentHash": "kAIBt0MsYR0o2RULmlW5BhQ1ha50aGEgLKG4f1p0kePBGLJCprqs3S+NxRrYN8UH7mSQRPKpeiH9mwPMEKUObQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "18.6.0",
+ "Microsoft.TestPlatform.TestHost": "18.6.0"
+ }
+ },
+ "NSubstitute": {
+ "type": "Direct",
+ "requested": "[5.3.0, )",
+ "resolved": "5.3.0",
+ "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==",
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ }
+ },
+ "NUnit": {
+ "type": "Direct",
+ "requested": "[4.6.1, )",
+ "resolved": "4.6.1",
+ "contentHash": "xS4+YaBFUv1r8bcAbjitSfYaRZGfMwUiMdiaRziBXZpKgVxKDSHhjUn0mV5mObHGZRZq6eNa+WFWr3g8grj66A=="
+ },
+ "NUnit3TestAdapter": {
+ "type": "Direct",
+ "requested": "[6.2.0, )",
+ "resolved": "6.2.0",
+ "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "8.0.2",
+ "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0",
+ "Microsoft.Testing.Platform.MSBuild": "2.1.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "Castle.Core": {
+ "type": "Transitive",
+ "resolved": "5.1.1",
+ "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.23.0",
+ "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "bkmCXn/65Cd0LdO2zTb/ValGAJ1H8y/CgYOiBb3jsDyHI3Y1ljKx6RBvhvn3e5D/4R4I00RRwLf+Bd2Sn6bJjA=="
+ },
+ "Microsoft.Extensions.AmbientMetadata.Application": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "uSLKFK7IKLsgc3rqryPDH6qIOsEIagG/XGiq8osbgIZQpBff5TA28+3XwX3JyUf/h3lzqmnbyGsfOZf1v66BAA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Compliance.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "SlVnMqZjYh7409vddtcoQ1N2HEtEQUHbYPuOOJZ/zNSvbJT4x78BBHaWUTKNEfwdg+MEftRVL63BLB6CVdOCRg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10"
+ }
+ },
+ "Microsoft.Extensions.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0J/9YNXTMWSZP2p2+nvl8p71zpSwokZXZuJW+VjdErkegAnFdO1XlqtA62SJtgVYHdKu3uPxJHcMR/r35HwFBA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "3lE/iLSutpgX1CC0NOW70FJoGARRHbyKmG7dc0klnUZ9Dd9hS6N/POPWhKhMLCEuNN5nXEY5agmlFtH562vqhQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Configuration.Binder": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "7IQhGK+wjyGrNsPBjJcZwWAr+Wf6D4+TwOptUt77bWtgNkiV8tDEbhFS+dDamtQFZ2X7kWG9m71iZQRj2x3zgQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.DependencyInjection.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "3iE7UF7MQkCv1cxzCahz+Y/guQbTqieyxyaWKhrRO91itI9cOKO76OHeQDahqG4MmW5umr3CcCvGmK92lWNlbg=="
+ },
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "xN0s32RZHnMDr08/fu1qoC7BSEoTL1HlKQCffsNlNtMN5EJnTLEAHS/ES/ugP8l3x9uoaqi//RA7Rkj2LZpWDg==",
+ "dependencies": {
+ "Microsoft.Extensions.Hosting.Abstractions": "8.0.1"
+ }
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
+ },
+ "Microsoft.Extensions.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "doVPCUUCY7c6LhBsEfiy3W1bvS7Mi6LkfQMS8nlC22jZWNxBv8VO8bdfeyvpYFst6Kxqk7HBC6lytmEoBssvSQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "elH2vmwNmsXuKmUeMQ4YW9ldXiF+gSGDgg1vORksob5POnpaI6caj1Hu8zaYbEuibhqCoWg0YRWDazBY3zjBfg==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "ajZg6WnvwSi8/gpNWQ7ruoEooOdpwNf/DR9Yck3b2AVrorPuJWJjWFpgfCAwph4DO4PPazB+6ifcWBHWm4QBZA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.FileProviders.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ZbaMlhJlpisjuWbvXr4LdAst/1XxH3vZ6A0BsgTphZ2L4PGuxRLz7Jr/S7mkAAnOn78Vu0fKhEgNF5JO3zfjqQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Hosting.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "nHwq9aPBdBPYXPti6wYEEfgXddfBrYC+CQLn+qISiwQq5tpfaqDZSKOJNxoe9rfQxGf1c+2wC/qWFe1QYJPYqw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics.Abstractions": "8.0.1",
+ "Microsoft.Extensions.FileProviders.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "kDYeKJUzh0qeg/AI+nSr3ffthmXYQTEb0nS9qRC7YhSbbuN4M4NPbaB77AJwtkTnCV9XZ7qYj3dkZaNcyl73EA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Http.Diagnostics": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lLvjt7N4tUwXd1DJvsC7K12T1ZzmQpFBxFA6moi6A7SdJw5JLvhzXULsQUt06mxeu0tjkrR0neJJTsO8OZs4Uw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Http": "8.0.1",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry": "8.10.0",
+ "Microsoft.IO.RecyclableMemoryStream": "3.0.0"
+ }
+ },
+ "Microsoft.Extensions.Http.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "b+CnTcqlmg4vppGmxsLifY4gnMsE7XDhH1VRxpIn7NBksCoCqJn/2U+TTH9LjpNrAG6tfnGT8m4PP6WaDdPoMQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.Http.Diagnostics": "8.10.0",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Resilience": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Logging": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "4x+pzsQEbqxhNf1QYRr5TDkLP9UsLT3A6MdRKDDEgrW7h1ljiEPgTNhKYUhNCCAaVpQECVQ+onA91PTPnIp6Lw==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.0.3",
+ "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2"
+ }
+ },
+ "Microsoft.Extensions.Logging.Configuration": {
+ "type": "Transitive",
+ "resolved": "8.0.1",
+ "contentHash": "QWwTrsgOnJMmn+XUslm8D2H1n3PkP/u/v52FODtyBc/k4W9r3i2vcXXeeX/upnzllJYRRbrzVzT0OclfNJtBJA==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration": "8.0.0",
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.2",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Logging": "8.0.1",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.Options": "8.0.2",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.ObjectPool": {
+ "type": "Transitive",
+ "resolved": "8.0.10",
+ "contentHash": "u7gAG7JgxF8VSJUGPSudAcPxOt+ymJKQCSxNRxiuKV+klCQbHljQR75SilpedCTfhPWDhtUwIJpnDVtspr9nMg=="
+ },
+ "Microsoft.Extensions.Options": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "dWGKvhFybsaZpGmzkGCbNNwBD1rVlWzrZKANLW/CcbFJpCEceMCGzT7zZwHOGBCbwM0SzBuceMj5HN1LKV1QqA==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Options.ConfigurationExtensions": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "0f4DMRqEd50zQh+UyJc+/HiBsZ3vhAQALgdkcQEalSH1L2isdC7Yj54M3cyo5e+BeO5fcBQ7Dxly8XiBBcvRgw==",
+ "dependencies": {
+ "Microsoft.Extensions.Configuration.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Configuration.Binder": "8.0.0",
+ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Microsoft.Extensions.Primitives": "8.0.0"
+ }
+ },
+ "Microsoft.Extensions.Primitives": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "bXJEZrW9ny8vjMF1JV253WeLhpEVzFo1lyaZu1vQ4ZxWUlVvknZ/+ftFgVheLubb4eZPSwwxBeqS1JkCOjxd8g=="
+ },
+ "Microsoft.Extensions.Resilience": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "2WsgG1zEPVtROZ+SHSAKiyuTREqFOOz/gPPDD/9BjfxYEpGa8E+QsD86UGeWIwnrplUxF6e7K388XkVDWBbSnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.Diagnostics": "8.0.1",
+ "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "8.10.0",
+ "Microsoft.Extensions.Options.ConfigurationExtensions": "8.0.0",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0",
+ "Polly.Extensions": "8.4.2",
+ "Polly.RateLimiting": "8.4.2"
+ }
+ },
+ "Microsoft.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "FcWCYW8W1O05w5tXtFRl4seCtTgV4ihTrCFgkbDUo3PIW2f5N8I1IGEE7KbdApxBFN0Oqf8FmVmtvjTncmlUBw==",
+ "dependencies": {
+ "Microsoft.Extensions.AmbientMetadata.Application": "8.10.0",
+ "Microsoft.Extensions.DependencyInjection.AutoActivation": "8.10.0",
+ "Microsoft.Extensions.Logging.Configuration": "8.0.1",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Telemetry.Abstractions": "8.10.0"
+ }
+ },
+ "Microsoft.Extensions.Telemetry.Abstractions": {
+ "type": "Transitive",
+ "resolved": "8.10.0",
+ "contentHash": "lnXq37FJZHJPbSJNEFoQVndG8cJvRbzeaUE9eoY1i6yfQUACHnEhuMnkZm7zPCkSqn0tylF0fITQn/RuDvt+0g==",
+ "dependencies": {
+ "Microsoft.Extensions.Compliance.Abstractions": "8.10.0",
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.2",
+ "Microsoft.Extensions.ObjectPool": "8.0.10",
+ "Microsoft.Extensions.Options": "8.0.2"
+ }
+ },
+ "Microsoft.IO.RecyclableMemoryStream": {
+ "type": "Transitive",
+ "resolved": "3.0.0",
+ "contentHash": "irv0HuqoH8Ig5i2fO+8dmDNdFdsrO+DoQcedwIlb810qpZHBNQHZLW7C/AHBQDgLLpw2T96vmMAy/aE4Yj55Sg=="
+ },
+ "Microsoft.Testing.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.23.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.VSTestBridge": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.0.1",
+ "Microsoft.Testing.Extensions.Telemetry": "2.1.0",
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.1.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Platform": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg=="
+ },
+ "Microsoft.Testing.Platform.MSBuild": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "gQTW4BIfM2ZLxixo9ITXoulLKjn20FiiHtqTsx9PENqTrX7368ZeJ5L0QZJyReXDWORPRV8jXwZR6Aar8JOyaA==",
+ "dependencies": {
+ "System.Reflection.Metadata": "8.0.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "em1eLz5Q46+hsCtAXdXggWAPd9gQyT4ngdsQ7k1eWvQgpsjtS/wAOJ/5TteieFdiAvrEq1iVn00LtusAxRaVmQ==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.6.0",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "Polly.Core": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "BpE2I6HBYYA5tF0Vn4eoQOGYTYIK1BlF5EXVgkWGn3mqUUjbXAr13J6fZVbp7Q3epRR8yshacBMlsHMhpOiV3g=="
+ },
+ "Polly.Extensions": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "GZ9vRVmR0jV2JtZavt+pGUsQ1O1cuRKG7R7VOZI6ZDy9y6RNPvRvXK1tuS4ffUrv8L0FTea59oEuQzgS0R7zSA==",
+ "dependencies": {
+ "Microsoft.Extensions.Logging.Abstractions": "8.0.0",
+ "Microsoft.Extensions.Options": "8.0.0",
+ "Polly.Core": "8.4.2"
+ }
+ },
+ "Polly.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.4.2",
+ "contentHash": "ehTImQ/eUyO07VYW2WvwSmU9rRH200SKJ/3jku9rOkyWE0A2JxNFmAVms8dSn49QLSjmjFRRSgfNyOgr/2PSmA==",
+ "dependencies": {
+ "Polly.Core": "8.4.2",
+ "System.Threading.RateLimiting": "8.0.0"
+ }
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg=="
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA=="
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "8.0.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Threading.RateLimiting": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "7mu9v0QDv66ar3DpGSZHg9NuNcxDaaAcnMULuZlaTpP9+hwXhrxNGsF5GmLkSHxFdb5bBc1TzeujsRgTrPWi+Q=="
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.rpc": {
+ "type": "Project",
+ "dependencies": {
+ "Microsoft.Extensions.Http": "[8.0.1, )",
+ "Microsoft.Extensions.Http.Resilience": "[8.10.0, )",
+ "Microsoft.Extensions.Logging.Abstractions": "[8.0.3, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file
diff --git a/tests/SolSharp.Wallet.Tests/packages.lock.json b/tests/SolSharp.Wallet.Tests/packages.lock.json
new file mode 100644
index 0000000..d3ddbd2
--- /dev/null
+++ b/tests/SolSharp.Wallet.Tests/packages.lock.json
@@ -0,0 +1,262 @@
+{
+ "version": 1,
+ "dependencies": {
+ "net8.0": {
+ "coverlet.collector": {
+ "type": "Direct",
+ "requested": "[10.0.1, )",
+ "resolved": "10.0.1",
+ "contentHash": "27jXSV/0DbVqF5jDrAxuQFZ9oaz6gmG03p8ttxAFk+X0M4woFYj7MoWDLCna5EGLb0CE6OE7X6ZH3Wt5smTtaA=="
+ },
+ "FluentAssertions": {
+ "type": "Direct",
+ "requested": "[7.2.2, )",
+ "resolved": "7.2.2",
+ "contentHash": "B6FJmtTadaqtLXH5qfn9hlYF5ruNOAdtjA9+1V3fuYp/MZzj7lB3Ys5cdgy72uv7w1GE5Y9PEX369UD3N1sfHg==",
+ "dependencies": {
+ "System.Configuration.ConfigurationManager": "6.0.0"
+ }
+ },
+ "Microsoft.NET.Test.Sdk": {
+ "type": "Direct",
+ "requested": "[18.6.0, )",
+ "resolved": "18.6.0",
+ "contentHash": "kAIBt0MsYR0o2RULmlW5BhQ1ha50aGEgLKG4f1p0kePBGLJCprqs3S+NxRrYN8UH7mSQRPKpeiH9mwPMEKUObQ==",
+ "dependencies": {
+ "Microsoft.CodeCoverage": "18.6.0",
+ "Microsoft.TestPlatform.TestHost": "18.6.0"
+ }
+ },
+ "NSubstitute": {
+ "type": "Direct",
+ "requested": "[5.3.0, )",
+ "resolved": "5.3.0",
+ "contentHash": "lJ47Cps5Qzr86N99lcwd+OUvQma7+fBgr8+Mn+aOC0WrlqMNkdivaYD9IvnZ5Mqo6Ky3LS7ZI+tUq1/s9ERd0Q==",
+ "dependencies": {
+ "Castle.Core": "5.1.1"
+ }
+ },
+ "NUnit": {
+ "type": "Direct",
+ "requested": "[4.6.1, )",
+ "resolved": "4.6.1",
+ "contentHash": "xS4+YaBFUv1r8bcAbjitSfYaRZGfMwUiMdiaRziBXZpKgVxKDSHhjUn0mV5mObHGZRZq6eNa+WFWr3g8grj66A=="
+ },
+ "NUnit3TestAdapter": {
+ "type": "Direct",
+ "requested": "[6.2.0, )",
+ "resolved": "6.2.0",
+ "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==",
+ "dependencies": {
+ "Microsoft.Extensions.DependencyModel": "8.0.2",
+ "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0",
+ "Microsoft.Testing.Platform.MSBuild": "2.1.0"
+ }
+ },
+ "StyleCop.Analyzers": {
+ "type": "Direct",
+ "requested": "[1.2.0-beta.556, )",
+ "resolved": "1.2.0-beta.556",
+ "contentHash": "llRPgmA1fhC0I0QyFLEcjvtM2239QzKr/tcnbsjArLMJxJlu0AA5G7Fft0OI30pHF3MW63Gf4aSSsjc5m82J1Q==",
+ "dependencies": {
+ "StyleCop.Analyzers.Unstable": "1.2.0.556"
+ }
+ },
+ "BouncyCastle.Cryptography": {
+ "type": "Transitive",
+ "resolved": "2.7.0",
+ "contentHash": "U+12df8UEWHgBi04YVf/Lgi2dy3SItlIYvHjjEVa/BngCQIzDCDRBk50DDByCfDvSbe5pRNFr3b7UrVK2kMcLw=="
+ },
+ "Castle.Core": {
+ "type": "Transitive",
+ "resolved": "5.1.1",
+ "contentHash": "rpYtIczkzGpf+EkZgDr9CClTdemhsrwA/W5hMoPjLkRFnXzH44zDLoovXeKtmxb1ykXK9aJVODSpiJml8CTw2g==",
+ "dependencies": {
+ "System.Diagnostics.EventLog": "6.0.0"
+ }
+ },
+ "Microsoft.ApplicationInsights": {
+ "type": "Transitive",
+ "resolved": "2.23.0",
+ "contentHash": "nWArUZTdU7iqZLycLKWe0TDms48KKGE6pONH2terYNa8REXiqixrMOkf1sk5DHGMaUTqONU2YkS4SAXBhLStgw==",
+ "dependencies": {
+ "System.Diagnostics.DiagnosticSource": "5.0.0"
+ }
+ },
+ "Microsoft.CodeCoverage": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "bkmCXn/65Cd0LdO2zTb/ValGAJ1H8y/CgYOiBb3jsDyHI3Y1ljKx6RBvhvn3e5D/4R4I00RRwLf+Bd2Sn6bJjA=="
+ },
+ "Microsoft.Extensions.DependencyModel": {
+ "type": "Transitive",
+ "resolved": "8.0.2",
+ "contentHash": "mUBDZZRgZrSyFOsJ2qJJ9fXfqd/kXJwf3AiDoqLD9m6TjY5OO/vLNOb9fb4juC0487eq4hcGN/M2Rh/CKS7QYw=="
+ },
+ "Microsoft.Testing.Extensions.Telemetry": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==",
+ "dependencies": {
+ "Microsoft.ApplicationInsights": "2.23.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Extensions.VSTestBridge": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.0.1",
+ "Microsoft.Testing.Extensions.Telemetry": "2.1.0",
+ "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.1.0",
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.Testing.Platform": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg=="
+ },
+ "Microsoft.Testing.Platform.MSBuild": {
+ "type": "Transitive",
+ "resolved": "2.1.0",
+ "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==",
+ "dependencies": {
+ "Microsoft.Testing.Platform": "2.1.0"
+ }
+ },
+ "Microsoft.TestPlatform.ObjectModel": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "gQTW4BIfM2ZLxixo9ITXoulLKjn20FiiHtqTsx9PENqTrX7368ZeJ5L0QZJyReXDWORPRV8jXwZR6Aar8JOyaA==",
+ "dependencies": {
+ "System.Reflection.Metadata": "8.0.0"
+ }
+ },
+ "Microsoft.TestPlatform.TestHost": {
+ "type": "Transitive",
+ "resolved": "18.6.0",
+ "contentHash": "em1eLz5Q46+hsCtAXdXggWAPd9gQyT4ngdsQ7k1eWvQgpsjtS/wAOJ/5TteieFdiAvrEq1iVn00LtusAxRaVmQ==",
+ "dependencies": {
+ "Microsoft.TestPlatform.ObjectModel": "18.6.0",
+ "Newtonsoft.Json": "13.0.3"
+ }
+ },
+ "Microsoft.Win32.SystemEvents": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "hqTM5628jSsQiv+HGpiq3WKBl2c8v1KZfby2J6Pr7pEPlK9waPdgEO6b8A/+/xn/yZ9ulv8HuqK71ONy2tg67A=="
+ },
+ "Nethermind.Crypto.Bls": {
+ "type": "Transitive",
+ "resolved": "1.0.5",
+ "contentHash": "SYdQOFVVcC3R3VAm9Dv+u4Mc1yqHZETxt4tN3a+AFeOnEtUmpcjwVwYkkiiUIIrr6vQVVOUuwsDmaa9l3u45IQ=="
+ },
+ "Newtonsoft.Json": {
+ "type": "Transitive",
+ "resolved": "13.0.3",
+ "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ=="
+ },
+ "SimpleBase": {
+ "type": "Transitive",
+ "resolved": "5.6.4",
+ "contentHash": "4z4S1zdoiE74e8gmdAesX9g6RUDPY+dE3VTFE1H8ueUHBgLHk/WVlFdt6iop3ZYKkbZrsr1ZH3/qxg+NF4CveQ=="
+ },
+ "StyleCop.Analyzers.Unstable": {
+ "type": "Transitive",
+ "resolved": "1.2.0.556",
+ "contentHash": "zvn9Mqs/ox/83cpYPignI8hJEM2A93s2HkHs8HYMOAQW0PkampyoErAiIyKxgTLqbbad29HX/shv/6LGSjPJNQ=="
+ },
+ "System.Collections.Immutable": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg=="
+ },
+ "System.Configuration.ConfigurationManager": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "7T+m0kDSlIPTHIkPMIu6m6tV6qsMqJpvQWW2jIc2qi7sn40qxFo0q+7mEQAhMPXZHMKnWrnv47ntGlM/ejvw3g==",
+ "dependencies": {
+ "System.Security.Cryptography.ProtectedData": "6.0.0",
+ "System.Security.Permissions": "6.0.0"
+ }
+ },
+ "System.Diagnostics.DiagnosticSource": {
+ "type": "Transitive",
+ "resolved": "5.0.0",
+ "contentHash": "tCQTzPsGZh/A9LhhA6zrqCRV4hOHsK90/G7q3Khxmn6tnB1PuNU0cRaKANP2AWcF9bn0zsuOoZOSrHuJk6oNBA=="
+ },
+ "System.Diagnostics.EventLog": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw=="
+ },
+ "System.Drawing.Common": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "NfuoKUiP2nUWwKZN6twGqXioIe1zVD0RIj2t976A+czLHr2nY454RwwXs6JU9Htc6mwqL6Dn/nEL3dpVf2jOhg==",
+ "dependencies": {
+ "Microsoft.Win32.SystemEvents": "6.0.0"
+ }
+ },
+ "System.Reflection.Metadata": {
+ "type": "Transitive",
+ "resolved": "8.0.0",
+ "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==",
+ "dependencies": {
+ "System.Collections.Immutable": "8.0.0"
+ }
+ },
+ "System.Security.AccessControl": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "AUADIc0LIEQe7MzC+I0cl0rAT8RrTAKFHl53yHjEUzNVIaUlhFY11vc2ebiVJzVBuOzun6F7FBA+8KAbGTTedQ=="
+ },
+ "System.Security.Cryptography.ProtectedData": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "rp1gMNEZpvx9vP0JW0oHLxlf8oSiQgtno77Y4PLUBjSiDYoD77Y8uXHr1Ea5XG4/pIKhqAdxZ8v8OTUtqo9PeQ=="
+ },
+ "System.Security.Permissions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "T/uuc7AklkDoxmcJ7LGkyX1CcSviZuLCa4jg3PekfJ7SU0niF0IVTXwUiNVP9DSpzou2PpxJ+eNY2IfDM90ZCg==",
+ "dependencies": {
+ "System.Security.AccessControl": "6.0.0",
+ "System.Windows.Extensions": "6.0.0"
+ }
+ },
+ "System.Windows.Extensions": {
+ "type": "Transitive",
+ "resolved": "6.0.0",
+ "contentHash": "IXoJOXIqc39AIe+CIR7koBtRGMiCt/LPM3lI+PELtDIy9XdyeSrwXFdWV9dzJ2Awl0paLWUaknLxFQ5HpHZUog==",
+ "dependencies": {
+ "System.Drawing.Common": "6.0.0"
+ }
+ },
+ "solsharp.core": {
+ "type": "Project",
+ "dependencies": {
+ "SimpleBase": "[5.6.4, )"
+ }
+ },
+ "solsharp.wallet": {
+ "type": "Project",
+ "dependencies": {
+ "BouncyCastle.Cryptography": "[2.7.0, )",
+ "Nethermind.Crypto.Bls": "[1.0.5, )",
+ "SolSharp.Core": "[2.0.0, )"
+ }
+ }
+ }
+ }
+}
\ No newline at end of file