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