diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index e0a81e0..184e44e 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -11,7 +11,7 @@ body: id: version attributes: label: SolSharp version - placeholder: 3.2.0 + placeholder: 4.0.0 validations: required: true - type: dropdown diff --git a/AGENTS.md b/AGENTS.md index ed8179e..2396c47 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ A modern, contract-driven .NET SDK for Solana: keys and signing, program instruc transaction wire formats, RPC, and WebSocket streaming. It is optimized for low latency, bounded hostile-input handling, focused dependencies with a dependency-light Core, and Native AOT. -Status: 3.2.0. SolSharp is independently implemented +Status: 4.0.0. SolSharp is independently implemented against immutable Anza Solana SDK, Agave, and SPL source revisions; exact pins, client-side coverage, verification criteria, and deliberate node/runtime exclusions live in `docs/RUST_PARITY.md`. All JSON used by the library is source-generated and all four functional @@ -70,7 +70,7 @@ Three traps worth knowing: **`global.json` pins one exact SDK with `rollForward: disable`; every CI/release job that restores or builds the checkout installs it via `global-json-file: global.json`.** The pin is not stylistic: `IsAotCompatible` injects `Microsoft.NET.ILLink.Tasks` and `PublishAot` injects `Microsoft.DotNet.ILCompiler`, both versioned by - the SDK's *runtime* (10.0.303 carries runtime 10.0.11), and both are recorded in every + the SDK's *runtime* (10.0.401 carries runtime 10.0.12), and both are recorded in every `packages.lock.json` as direct references. A floating SDK therefore breaks `dotnet restore --locked-mode` with NU1004 the moment .NET ships a patch, with no source change at all. Every checkout job that restores or builds asserts `dotnet --version` equals the pinned value; do not @@ -158,6 +158,7 @@ SolSharp/ Bouncy Castle-based Ed25519 signer/verification path. The pathological-encoding verifier divergence is recorded in `docs/RUST_PARITY.md`. They are not transactions and examples must not imply on-chain authority. - Transactions support **legacy**, **v0**, and feature-gated **SIMD-0385 V1** messages behind `ITransactionMessage`. Account ordering matches the pinned Solana SDK (fee payer first, then public-key byte order within writable-signer / readonly-signer / writable / readonly classes). v0 drains eligible accounts into lookup tables and prefixes `0x80`; V1 prefixes `0x81`, keeps all addresses inline, carries an inline execution config, and writes the message before its fixed number of signatures. V1's omitted compute/data limits mean zero and cluster activation is external, so examples must set deliberate limits and never imply universal availability. All formats use exact pinned Rust vectors. +- **Transaction/block reads and block subscriptions accept V1 by default.** Preserve explicit numeric version overrides and explicit `null` in full options. The latter omits the field; it does not mean unlimited version support. Signatures-only block responses are not version-filtered by Agave. - `PublicKey.IsOnCurve` is field arithmetic over BouncyCastle's `X25519Field`, **not** BouncyCastle's public-key validation: BC's validation rejects non-canonical encodings (y ≥ p) that Solana's `curve25519-dalek` accepts after reducing mod p, so the check is written directly as `SqrtRatioVar((y²−1)/(dy²+1))` with the top bit masked and no canonicality test. Solders-derived edge KATs and a deterministic corpus checked against an independent BigInteger/Legendre-symbol oracle pin the network semantics. Using `X25519Field` rather than `BigInteger.ModPow` is what makes it ~39× faster; keep the reduction semantics if that code is ever touched. - **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. diff --git a/CHANGELOG.md b/CHANGELOG.md index 23b9a2c..37b7ea9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,45 @@ version (on the earlier 0.x releases, minor versions could carry them). ## [Unreleased] +## [4.0.0] - 2026-09-20 + +### Breaking changes + +- Default HTTP transaction/block reads and WebSocket block subscriptions now advertise support through + transaction version 1. Existing callers can receive V1 transactions; use the explicit + `*WithMaxVersionAsync(..., 0)` methods to retain a legacy/v0 ceiling. +- Full transaction/block configuration objects now default `MaxSupportedTransactionVersion` to `1` + instead of `null`. Explicit `null` still omits the field. Base58/binary users must explicitly select + `0` or `null`; accepting V1 requires base64, JSON, or jsonParsed. Parsed V1 resource limits and total + priority fees remain available in `transactionConfig`. + +See [Upgrading from 3.x](docs/USAGE.md#upgrading-from-3x) for migration examples and signatures-only behavior. + +### Added + +- Added `GetTransactionOptions.MinContextSlot` and `GetSignatureStatusesWithOptionsAsync` with + `GetSignatureStatusesOptions` for history lookup, commitment, and minimum-context-slot checks. + +### Fixed + +- Updated SourceLink and its `Microsoft.Build.Tasks.Git` dependency to 10.0.401 to address + GHSA-23fw-v26w-5fgq, which caused the scheduled security dependency audit to fail. Solution, + benchmark, and packed Native AOT dependency locks are synchronized with the updated references. + +### Changed + +- Updated Microsoft.Extensions runtime dependencies, test tooling, BenchmarkDotNet, and banned-API + analyzers to their latest stable releases. FluentAssertions remains on the latest 7.x release (7.2.2) + with its existing license, and the existing StyleCop prerelease remains unchanged. +- Pinned repository builds to .NET SDK 10.0.401 and updated the Native AOT toolchain packages to 10.0.12. + +### Tests + +- Added default V1 HTTP/WebSocket regressions, explicit v0 and omitted-version checks, transaction + freshness request/error coverage, and packed Native AOT checks for the new request configuration. +- Added a bounded, read-only live V1 test that compares raw and parsed responses and verifies the + transaction's wire bytes, signatures, and inline configuration. + ## [3.2.0] - 2026-08-29 ### Fixed @@ -665,7 +704,8 @@ bundles four layered assemblies. transaction building, signing and serialization, `Transaction.Deserialize`, and instruction decompilation — every wire format validated byte-for-byte against the Rust `solana-sdk`. -[Unreleased]: https://github.com/jecacs/SolSharp/compare/v3.2.0...HEAD +[Unreleased]: https://github.com/jecacs/SolSharp/compare/v4.0.0...HEAD +[4.0.0]: https://github.com/jecacs/SolSharp/compare/v3.2.0...v4.0.0 [3.2.0]: https://github.com/jecacs/SolSharp/compare/v3.1.0...v3.2.0 [3.1.0]: https://github.com/jecacs/SolSharp/compare/v3.0.0...v3.1.0 [3.0.0]: https://github.com/jecacs/SolSharp/compare/v2.0.0...v3.0.0 diff --git a/Directory.Build.props b/Directory.Build.props index cf7c515..a909a15 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -19,7 +19,7 @@ - 3.2.0 + 4.0.0 Yevhen Koval SolSharp SolSharp — Solana SDK for .NET @@ -51,7 +51,7 @@ - + @@ -66,7 +66,7 @@ review. Analyzer-only, so it never becomes a dependency of the shipped package. --> - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/README.md b/README.md index e4e6516..a269b5a 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ bounded codecs, and typed network responses. If you are writing wallets, bots, indexers, or backend services that talk to Solana from .NET and care about correctness, speed, and control, this is aimed at you. -> **Status: 3.2.0.** SolSharp ships as a single NuGet package — `SolSharp` — +> **Status: 4.0.0.** SolSharp ships as a single NuGet package — `SolSharp` — > bundling the Core (primitives + encodings), Wallet (Ed25519 and BLS12-381 keys, signing, verification, > key import/export, BIP-39/SLIP-0010 derivation, and signed off-chain messages), Rpc (the full applicable > non-admin JSON-RPC HTTP surface + WebSocket streaming + DI), and @@ -38,6 +38,12 @@ about correctness, speed, and control, this is aimed at you. SPL token state, building/signing/sending transactions, v0 + address lookup tables, SIMD-0385 V1, decoding transactions, WebSocket subscriptions, confirmation, Native AOT publishing, and more. +**Upgrading from 3.x:** transaction reads and block subscriptions now advertise V1 support by default, +and full options default `MaxSupportedTransactionVersion` to `1`. Keep a legacy/v0 ceiling with an +explicit `0`; existing base58/binary configurations need an explicit `0` or `null`, or a V1-compatible +encoding. See the [4.0 migration guide](docs/USAGE.md#upgrading-from-3x) for exact examples and the +difference between a version ceiling and filtering transactions. + ## Motivation When this was started, the .NET options for Solana were either unmaintained and stale or @@ -79,17 +85,17 @@ valuable ecosystem-oriented program surface. SolSharp is independently written w application-side parity with immutable official Rust contracts, plus a verifiable .NET deployment story. The official Rust column below is the reference contract rather than another client implementation. -Comparison basis: SolSharp is release `3.2.0`; Solnet means its +Comparison basis: SolSharp is release `4.0.0`; Solnet means its [published `8.7.0` release](https://github.com/bmresearch/Solnet/commit/e8df87bdb2006376ba3eea9e1d3b857c84fc5685) (2025-11-26), with unreleased-head differences called out explicitly; the Rust reference is the [pinned Anza SDK/Agave/SPL matrix](docs/RUST_PARITY.md). -| Dimension | Official Rust SDK / Agave reference | SolSharp 3.2.0 | Solnet official packages/source | +| Dimension | Official Rust SDK / Agave reference | SolSharp 4.0.0 | Solnet official packages/source | | --- | --- | --- | --- | | **Transaction formats** | Legacy, V0, and feature-gated [SIMD-0385 V1](https://github.com/anza-xyz/solana-sdk/blob/ec7a0467e268774b724d55120ad952b518f27d64/message/src/versions/v1/message.rs), including inline V1 configuration and a message-first signature envelope | Legacy/V0/V1 build, sanitize, parse, sign, serialize, and decompile; exact V1 config/framing and envelope vectors | Published 8.7: Legacy/V0 and [rejects versions above 0](https://github.com/bmresearch/Solnet/blob/e8df87bdb2006376ba3eea9e1d3b857c84fc5685/src/Solnet.Rpc/Models/Message.cs#L275-L286). Unreleased head names V1, but its current body/envelope is not the pinned SIMD-0385 layout (details below) | | **Native and SPL clients** | Canonical native-program and SPL interface crates, split by contract | System, Stake, Vote, legacy/upgradeable/V4 loaders, Compute Budget, ALT, Memo, three signature precompiles; Token, Token-2022 extensions/interfaces, ATA, metadata/group/transfer-hook, and ElGamal proof/registry client contracts with typed decoders | Broader ecosystem-oriented set including Governance, Stake Pool, Token Swap, Account Compression, Name Service, and Shared Memory; repository head adds an initial Token-2022 surface | | **HTTP RPC** | [53 applicable non-admin, non-obsolete request variants](https://github.com/anza-xyz/agave/blob/ab6553293094e59dee7d3e7c928c7fa1023d0684/rpc-client-types/src/request.rs#L12-L75) in the pinned Agave client enum | 53/53 typed async methods, including current context-slot, filter, slice, encoding/detail/reward, raw/parsed V1, and context-wrapped response variants; batching, bounded responses, typed errors, and send/simulate/confirm | 50/53 pinned methods through sync/async `RequestResult` APIs; no `getAgGenesisCert`, `getRecentPrioritizationFees`, or `getStakeMinimumDelegation` at the examined head | -| **PubSub** | Nine families: account, program, logs, signature, slot, slots-updates, block, vote, and root | 9/9, including exact logs/block filter unions, parsed account/program forms, early signature-receipt events, bounded channels, cancellation isolation, reconnect/replay, and V1 block opt-ins | [Six families](https://github.com/bmresearch/Solnet/blob/ebec9e1a3b708dbe86d103dd8fcf869d0cd923b6/src/Solnet.Rpc/IStreamingRpcClient.cs): account, program, logs, signature, slot, and root | +| **PubSub** | Nine families: account, program, logs, signature, slot, slots-updates, block, vote, and root | 9/9, including exact logs/block filter unions, parsed account/program forms, early signature-receipt events, bounded channels, cancellation isolation, reconnect/replay, and V1 block support by default | [Six families](https://github.com/bmresearch/Solnet/blob/ebec9e1a3b708dbe86d103dd8fcf869d0cd923b6/src/Solnet.Rpc/IStreamingRpcClient.cs): account, program, logs, signature, slot, and root | | **Offline / multisig signing** | Signer, presigner/null-signer, partial signing, fixed signature slots, and per-slot verification primitives | Exact message-byte export/hash, typed fixed slots, partial/all signing, verified external insertion, `Presigner`, `NullSigner`, and SPL multisig builders | Partial signing, externally supplied signatures, and program multisig builders/examples | | **AOT / trimming** | Native Rust output; not a .NET compatibility contract | Every assembly declares `IsAotCompatible`; generated JSON metadata, trim/AOT analyzers, and CI that publishes and runs a native package consumer | Targets .NET 8, but the examined projects publish no solution-wide AOT/trimming declaration or native-publish CI contract; reflection paths remain | | **Packaging** | Modular Cargo crates | One NuGet package containing four compiler-layered functional assemblies plus a minimal packaging facade | Five installable packages: `Solana.Rpc`, `Solana.Wallet`, `Solana.Programs`, `Solana.Extensions`, and `Solana.KeyStore` | @@ -119,7 +125,7 @@ dotnet add package SolSharp ``` ```xml - + ``` | Assembly | Purpose | @@ -140,10 +146,10 @@ After downloading all three assets, verify them before using the package outside flow (replace the version in the filenames): ```bash -sha256sum --check SolSharp.3.2.0.nupkg.sha256 -gh attestation verify SolSharp.3.2.0.nupkg \ +sha256sum --check SolSharp.4.0.0.nupkg.sha256 +gh attestation verify SolSharp.4.0.0.nupkg \ --repo jecacs/SolSharp \ - --bundle SolSharp.3.2.0.nupkg.sigstore.json \ + --bundle SolSharp.4.0.0.nupkg.sigstore.json \ --signer-workflow jecacs/SolSharp/.github/workflows/release.yml \ --deny-self-hosted-runners ``` @@ -205,15 +211,16 @@ bool ok = PublicKey.TryParse(input, out var key); metadata — transaction version/index, pre/post SOL and token balances, inner (CPI) instructions, loaded lookup-table addresses, logs, compute/cost units, program return data, and rewards. Failures decode to a typed `TransactionError` (including parameterized runtime errors and the program's `Custom` code) on - `TransactionMeta`, `SignatureStatus`, and `SimulateTransactionResult`. The compatibility-preserving default - read advertises legacy/v0; `GetTransactionWithMaxVersionAsync(..., 1)` opts into V1 bytes, which - `Transaction.Deserialize` understands locally. + `TransactionMeta`, `SignatureStatus`, and `SimulateTransactionResult`. Default transaction and block reads + advertise support through V1; `Transaction.Deserialize` understands legacy/v0/V1 locally. Explicit + `*WithMaxVersionAsync(..., 0)` calls retain a v0 ceiling. `GetTransactionWithOptionsAsync` exposes + `MinContextSlot`, and `GetSignatureStatusesWithOptionsAsync` adds commitment and minimum-context-slot + checks when supported by the RPC node. - `GetParsedTransactionAsync` / `GetParsedBlockAsync` / `GetParsedAccountInfoAsync` return the node's `jsonParsed` decoding — typed instructions, token balances, account state, and logs without local Borsh work. Recognized instructions carry the node's parsed action; unrecognized instructions retain their raw - program id, account list, and base58 data, matching the upstream tagged response union. Explicit - `*WithMaxVersionAsync` variants opt parsed transaction/block reads into V1 and preserve its inline - `transactionConfig`. + program id, account list, and base58 data, matching the upstream tagged response union. Parsed + transaction/block reads support V1 by default and preserve its inline `transactionConfig`. - WebSocket streaming multiplexed over one connection: `SubscribeSlotsAsync`, `SubscribeRootsAsync`, `SubscribeSlotsUpdatesAsync` (slot lifecycle with per-stage stats), and `SubscribeVotesAsync` (gossip votes) as `IAsyncEnumerable`; `SubscribeLogsAsync`, `SubscribeAccountAsync`, `SubscribeParsedAccountAsync`, @@ -222,8 +229,8 @@ bool ok = PublicKey.TryParse(input, out var key); transport (message-size cap, per-subscription buffers, opt-in receive timeout). The source-safe `SubscribeAccountWithOptionsAsync` and `SubscribeProgramWithOptionsAsync` paths expose the effective encoding/commitment fields (plus program filters) and return the same exact `RpcAccountData` union as HTTP. - Agave-accepted subscription fields that its encoder ignores are deliberately not advertised. Block - subscriptions also provide explicit `*WithMaxVersionAsync` V1 opt-ins; full methods cover logs/block filter + Fields ignored by the pinned base Agave subscription encoder are deliberately not advertised. Block + subscriptions support V1 by default and retain explicit `*WithMaxVersionAsync` overrides; full methods cover logs/block filter unions, parsed program streams, and the optional early `receivedSignature` event before final processing. - DI registration with a built-in resilience pipeline (retry on transient errors and HTTP 429), plus `AddSolanaWs` for a container-managed streaming client. @@ -335,7 +342,7 @@ var signature = await rpc.SendTransactionAsync(tx.Serialize()); ## Requirements -- .NET 10 SDK for consumers. Repository builds use the exact SDK 10.0.303 pinned by `global.json` with +- .NET 10 SDK for consumers. Repository builds use the exact SDK 10.0.401 pinned by `global.json` with `rollForward: disable`; CI jobs that restore or build the checkout assert that exact selection. - Calling the BLS12-381 API requires one of the native RIDs shipped by `Nethermind.Crypto.Bls` 1.1.0: `linux-x64`, `linux-arm64`, `osx-x64`, `osx-arm64`, or `win-x64`. All non-BLS SolSharp APIs remain @@ -377,6 +384,15 @@ SOLSHARP_RPC_URL=https://your-node SOLSHARP_WS_URL=wss://your-node \ dotnet test --filter "TestCategory=Integration" ``` +The read-only V1 regression test finds a V1 transaction in at most three recent finalized blocks, then +checks default raw/parsed reads, wire round-tripping, signatures, and execution configuration. Set +`SOLSHARP_V1_TRANSACTION_SIGNATURE` to use a known V1 transaction on the configured cluster instead. +Missing V1 data is inconclusive normally and fails with `SOLSHARP_INTEGRATION_STRICT=1`: + +```bash +dotnet test --filter "FullyQualifiedName~DefaultReads_DecodeAndVerifyALiveV1Transaction" +``` + ## Layout ``` diff --git a/README.nuget.md b/README.nuget.md index dfe8342..992d94d 100644 --- a/README.nuget.md +++ b/README.nuget.md @@ -2,7 +2,7 @@ [![Security checks](https://github.com/jecacs/SolSharp/actions/workflows/security.yml/badge.svg?branch=main)](https://github.com/jecacs/SolSharp/actions/workflows/security.yml?query=branch%3Amain) [![CodeQL](https://github.com/jecacs/SolSharp/actions/workflows/codeql.yml/badge.svg?branch=main)](https://github.com/jecacs/SolSharp/actions/workflows/codeql.yml?query=branch%3Amain) -[![Unit test coverage](https://img.shields.io/badge/unit_test_coverage-93.7%25_line-brightgreen)](https://github.com/jecacs/SolSharp/blob/v3.2.0/README.md#quality-gates) +[![Unit test coverage](https://img.shields.io/badge/unit_test_coverage-93.7%25_line-brightgreen)](https://github.com/jecacs/SolSharp/blob/v4.0.0/README.md#quality-gates) [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/jecacs/SolSharp/badge)](https://scorecard.dev/viewer/?uri=github.com/jecacs/SolSharp) A modern, contract-driven, Native AOT-ready .NET SDK for Solana — keys and signatures, @@ -15,6 +15,12 @@ SolSharp is built for low latency with focused dependencies and a dependency-lig bots, indexers, or backend services that talk to Solana from .NET and care about speed and control, this is aimed at you. +**Upgrading from 3.x:** HTTP transaction/block reads and WebSocket block subscriptions now advertise +V1 support, and full options default `MaxSupportedTransactionVersion` to `1`. Existing base58/binary +configurations need an explicit `0` or `null`; use base64, JSON, or jsonParsed to accept V1. The +[4.0 migration guide](https://github.com/jecacs/SolSharp/blob/v4.0.0/docs/USAGE.md#upgrading-from-3x) +shows how to retain the previous behavior. + ## Why SolSharp - **Native AOT ready.** Source-generated JSON (no reflection), trimmable, AOT-clean — ship a @@ -33,7 +39,7 @@ and control, this is aimed at you. PoP-gated same-message BLS aggregation, and domain-separated Solana off-chain messages. - **Traceable parity.** Exact upstream commit pins, coverage boundaries, and exclusions are published - in the [Rust parity matrix](https://github.com/jecacs/SolSharp/blob/v3.2.0/docs/RUST_PARITY.md); SolSharp + in the [Rust parity matrix](https://github.com/jecacs/SolSharp/blob/v4.0.0/docs/RUST_PARITY.md); SolSharp is independently written and is not an official Anza/Solana product. - **Purposeful dependencies.** A dependency-light Core, allocation-free hot paths and span-based APIs; the RPC resilience pipeline and vetted Ed25519/BLS backends are included deliberately. @@ -51,21 +57,21 @@ and control, this is aimed at you. Solnet is an established, ecosystem-oriented .NET SDK. This compact comparison uses its [published 8.7.0 release](https://github.com/bmresearch/Solnet/commit/e8df87bdb2006376ba3eea9e1d3b857c84fc5685); -SolSharp is release 3.2.0; the reference column is the pinned -[official Rust parity matrix](https://github.com/jecacs/SolSharp/blob/v3.2.0/docs/RUST_PARITY.md). +SolSharp is release 4.0.0; the reference column is the pinned +[official Rust parity matrix](https://github.com/jecacs/SolSharp/blob/v4.0.0/docs/RUST_PARITY.md). -| Capability | Official Rust SDK / Agave | SolSharp 3.2 | Solnet published 8.7.0 | +| Capability | Official Rust SDK / Agave | SolSharp 4.0.0 | Solnet published 8.7.0 | | --- | --- | --- | --- | | **Transactions** | Legacy, V0, feature-gated SIMD-0385 V1 | Legacy/V0/V1 exact wire build, parse, signing, validation, and decompilation | Legacy/V0; the published decoder rejects versions above 0 | -| **RPC / PubSub** | 53 applicable request variants; nine subscription families and their effective config unions | 53/53 RPC; 9/9 PubSub, including exact HTTP/WS account-encoding unions, effective `SubscribeAccountWithOptionsAsync` / `SubscribeProgramWithOptionsAsync` configs, early signature events, and explicit V1 opt-ins | 50/53 RPC; 6/9 PubSub families | +| **RPC / PubSub** | 53 applicable request variants; nine subscription families and their effective config unions | 53/53 RPC; 9/9 PubSub, including exact HTTP/WS account-encoding unions, effective `SubscribeAccountWithOptionsAsync` / `SubscribeProgramWithOptionsAsync` configs, early signature events, and V1 reads by default | 50/53 RPC; 6/9 PubSub families | | **Programs** | Canonical native and SPL crates | Deep native/SPL coverage, extensive Token-2022 interfaces, typed state/instruction decoders | Broader ecosystem program set; published package predates repository-head Token-2022 additions | | **Offline signing** | Fixed slots, signer/presigner/null-signer, partial signing and verification | Typed fixed slots, partial/all signing, verified external signatures, `Presigner` / `NullSigner` | Partial signing and externally supplied signatures | | **Deployment** | Native Rust crates | One package, generated JSON metadata, declared AOT compatibility, native-publish CI | Five modular packages; no published solution-wide AOT/trimming contract | -| **Provenance** | Authoritative source | Seven immutable upstream pins and byte-level KATs | No immutable upstream revision matrix in published documentation | +| **Provenance** | Authoritative source | Seven immutable base pins, a scoped RPC freshness extension, and byte-level KATs | No immutable upstream revision matrix in published documentation | Solnet repository head contains newer unreleased work; in particular, its current class named V1 does not yet use the pinned SIMD-0385 message body and message-first signature envelope. The full evidence-linked comparison -is in the [repository README](https://github.com/jecacs/SolSharp/blob/v3.2.0/README.md#how-it-compares-to-solnet). +is in the [repository README](https://github.com/jecacs/SolSharp/blob/v4.0.0/README.md#how-it-compares-to-solnet). ## Quick start @@ -108,13 +114,13 @@ var accountChanges = await ws.SubscribeAccountWithOptionsAsync( ## Learn more -- [Usage guide](https://github.com/jecacs/SolSharp/blob/v3.2.0/docs/USAGE.md) — a task-oriented +- [Usage guide](https://github.com/jecacs/SolSharp/blob/v4.0.0/docs/USAGE.md) — a task-oriented cookbook: keys, export, mnemonics, signed off-chain messages, reads, SPL token state, priority fees, v0 + address lookup tables, SIMD-0385 V1, durable nonces, decoding transactions, subscriptions, batching, and confirmation. - [GitHub repository](https://github.com/jecacs/SolSharp) -- [Changelog](https://github.com/jecacs/SolSharp/blob/v3.2.0/CHANGELOG.md) -- [Upstream parity and provenance](https://github.com/jecacs/SolSharp/blob/v3.2.0/docs/RUST_PARITY.md) -- [Third-party notices](https://github.com/jecacs/SolSharp/blob/v3.2.0/THIRD_PARTY_NOTICES.md) +- [Changelog](https://github.com/jecacs/SolSharp/blob/v4.0.0/CHANGELOG.md) +- [Upstream parity and provenance](https://github.com/jecacs/SolSharp/blob/v4.0.0/docs/RUST_PARITY.md) +- [Third-party notices](https://github.com/jecacs/SolSharp/blob/v4.0.0/THIRD_PARTY_NOTICES.md) ## Security @@ -129,5 +135,5 @@ BLS operations use the packaged native `blst` backend on `linux-x64`, `linux-arm `osx-arm64`, and `win-x64`. Other RIDs can use the rest of SolSharp, but cannot call its BLS API. To report a vulnerability, use the -[security policy](https://github.com/jecacs/SolSharp/blob/v3.2.0/SECURITY.md) — private reporting, +[security policy](https://github.com/jecacs/SolSharp/blob/v4.0.0/SECURITY.md) — private reporting, not a public issue. diff --git a/SECURITY.md b/SECURITY.md index 9dbcc5b..628fa3e 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -7,6 +7,7 @@ taken seriously and are appreciated. | Version | Supported | | ------- | --------- | +| 4.x | ✅ | | 3.x | ✅ | | 2.x | ✅ | | 1.x | ✅ | diff --git a/THIRD_PARTY_NOTICES.md b/THIRD_PARTY_NOTICES.md index e01c03c..864a4e3 100644 --- a/THIRD_PARTY_NOTICES.md +++ b/THIRD_PARTY_NOTICES.md @@ -18,6 +18,11 @@ The following repositories are licensed under the | [Address Lookup Table](https://github.com/solana-program/address-lookup-table) | Solana Program Library contributors | `8ebd5f4964454bc6b86d86ff191702d33c52490b` | | [System Program](https://github.com/solana-program/system) | Solana Program Library contributors | `8c47b48e8e129ab195db3e3d2a8334dd8bbd94aa` | +The optional transaction freshness configuration additionally follows Agave commit +[`f46e7976fd37d2fc5eea919d5b28bb5ff7fd17e9`](https://github.com/anza-xyz/agave/commit/f46e7976fd37d2fc5eea919d5b28bb5ff7fd17e9): +`getTransaction.minContextSlot` and `getSignatureStatuses.commitment/minContextSlot`. Other Agave +compatibility claims retain the base revision above. + The Token-2022 pin resolves the following interface contracts. Versions below come from that checkout's `Cargo.lock` (rather than from a floating documentation page): diff --git a/benchmarks/SolSharp.Benchmarks/SolSharp.Benchmarks.csproj b/benchmarks/SolSharp.Benchmarks/SolSharp.Benchmarks.csproj index 038196b..26c7926 100644 --- a/benchmarks/SolSharp.Benchmarks/SolSharp.Benchmarks.csproj +++ b/benchmarks/SolSharp.Benchmarks/SolSharp.Benchmarks.csproj @@ -10,7 +10,7 @@ - + diff --git a/benchmarks/SolSharp.Benchmarks/packages.lock.json b/benchmarks/SolSharp.Benchmarks/packages.lock.json index bfa96b5..6034ef2 100644 --- a/benchmarks/SolSharp.Benchmarks/packages.lock.json +++ b/benchmarks/SolSharp.Benchmarks/packages.lock.json @@ -4,37 +4,37 @@ "net10.0": { "BenchmarkDotNet": { "type": "Direct", - "requested": "[0.14.0, )", - "resolved": "0.14.0", - "contentHash": "eIPSDKi3oni734M1rt/XJAwGQQOIf9gLjRRKKJ0HuVy3vYd7gnmAIX1bTjzI9ZbAY/nPddgqqgM/TeBYitMCIg==", + "requested": "[0.15.8, )", + "resolved": "0.15.8", + "contentHash": "paCfrWxSeHqn3rUZc0spYXVFnHCF0nzRhG0nOLnyTjZYs8spsimBaaNmb3vwqvALKIplbYq/TF393vYiYSnh/Q==", "dependencies": { - "BenchmarkDotNet.Annotations": "0.14.0", + "BenchmarkDotNet.Annotations": "0.15.8", "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", + "Iced": "1.21.0", + "Microsoft.CodeAnalysis.CSharp": "4.14.0", + "Microsoft.Diagnostics.Runtime": "3.1.512801", + "Microsoft.Diagnostics.Tracing.TraceEvent": "3.1.21", "Microsoft.DotNet.PlatformAbstractions": "3.1.6", - "Perfolizer": "[0.3.17]", - "System.Management": "5.0.0" + "Perfolizer": "[0.6.1]", + "System.Management": "9.0.5" } }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "StyleCop.Analyzers": { @@ -48,8 +48,8 @@ }, "BenchmarkDotNet.Annotations": { "type": "Transitive", - "resolved": "0.14.0", - "contentHash": "CUDCg6bgHrDzhjnA+IOBl5gAo8Y5hZ2YSs7MBXrYMlMKpBZqrD5ez0537uDveOkcf+YWAoK+S4sMcuWPbIz8bw==" + "resolved": "0.15.8", + "contentHash": "hfucY0ycAsB0SsoaZcaAp9oq5wlWBJcylvEJb9pmvdYUx6PD6S4mDiYnZWjdjAlLhIpe/xtGCwzORfzAzPqvzA==" }, "BouncyCastle.Cryptography": { "type": "Transitive", @@ -68,64 +68,63 @@ }, "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==" + "resolved": "1.21.0", + "contentHash": "dv5+81Q1TBQvVMSOOOmRcjJmvWcX3BZPZsIq31+RLc5cNft0IHAyNlkdb7ZarOWG913PyBoFDsDXoCIlKmLclg==" }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.CodeAnalysis.Analyzers": { "type": "Transitive", - "resolved": "3.3.3", - "contentHash": "j/rOZtLMVJjrfLRlAMckJLPW/1rze9MT1yfWqSIbUPGRu1m1P0fuo9PmqapwsmePfGB5PJrudQLvmUOAMF0DqQ==" + "resolved": "3.11.0", + "contentHash": "v/EW3UE8/lbEYHoC2Qq7AR/DnmvpgdtAMndfQNmpuIMx/Mto8L5JnuCfdBYtgvalQOtfNCnxFejxuRrryvUTsg==" }, "Microsoft.CodeAnalysis.Common": { "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "bNzTyxP3iD5FPFHfVDl15Y6/wSoI7e3MeV0lOaj9igbIKTjgrmuw6LoVJ06jUNFA7+KaDC/OIsStWl/FQJz6sQ==", + "resolved": "4.14.0", + "contentHash": "PC3tuwZYnC+idaPuoC/AZpEdwrtX7qFpmnrfQkgobGIWiYmGi5MCRtl5mx6QrfMGQpK78X2lfIEoZDLg/qnuHg==", "dependencies": { - "Microsoft.CodeAnalysis.Analyzers": "3.3.3" + "Microsoft.CodeAnalysis.Analyzers": "3.11.0" } }, "Microsoft.CodeAnalysis.CSharp": { "type": "Transitive", - "resolved": "4.1.0", - "contentHash": "sbu6kDGzo9bfQxuqWpeEE7I9P30bSuZEnpDz9/qz20OU6pm79Z63+/BsAzO2e/R/Q97kBrpj647wokZnEVr97w==", + "resolved": "4.14.0", + "contentHash": "568a6wcTivauIhbeWcCwfWwIn7UV7MeHEBvFB2uzGIpM2OhJ4eM/FZ8KS0yhPoNxnSpjGzz7x7CIjTxhslojQA==", "dependencies": { - "Microsoft.CodeAnalysis.Common": "[4.1.0]" + "Microsoft.CodeAnalysis.Analyzers": "3.11.0", + "Microsoft.CodeAnalysis.Common": "[4.14.0]" } }, "Microsoft.Diagnostics.NETCore.Client": { "type": "Transitive", - "resolved": "0.2.251802", - "contentHash": "bqnYl6AdSeboeN4v25hSukK6Odm6/54E3Y2B8rBvgqvAW0mF8fo7XNRVE2DMOG7Rk0fiuA079QIH28+V+W1Zdg==", + "resolved": "0.2.510501", + "contentHash": "juoqJYMDs+lRrrZyOkXXMImJHneCF23cuvO4waFRd2Ds7j+ZuGIPbJm0Y/zz34BdeaGiiwGWraMUlln05W1PCQ==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "1.1.0", - "Microsoft.Extensions.Logging": "2.1.1" + "Microsoft.Extensions.Logging": "6.0.0" } }, "Microsoft.Diagnostics.Runtime": { "type": "Transitive", - "resolved": "2.2.332302", - "contentHash": "Hp84ivxSKIMTBzYSATxmUsm3YSXHWivcwiRRbsydGmqujMUK8BAueLN0ssAVEOkOBmh0vjUBhrq7YcroT7VCug==", + "resolved": "3.1.512801", + "contentHash": "0lMUDr2oxNZa28D6NH5BuSQEe5T9tZziIkvkD44YkkCGQXPJqvFjLq5ZQq1hYLl3RjQJrY+hR0jFgap+EWPDTw==", "dependencies": { - "Microsoft.Diagnostics.NETCore.Client": "0.2.251802" + "Microsoft.Diagnostics.NETCore.Client": "0.2.410101" } }, "Microsoft.Diagnostics.Tracing.TraceEvent": { "type": "Transitive", - "resolved": "3.1.8", - "contentHash": "kl3UMrZKSeSEYZ8rt/GjLUQToREjgQABqfg6PzQBmSlYHTZOKE9ePEOS2xptROQ9SVvngg3QGX51TIT11iZ0wA==" + "resolved": "3.1.21", + "contentHash": "/OrJFKaojSR6TkUKtwh8/qA9XWNtxLrXMqvEb89dBSKCWjaGVTbKMYodIUgF5deCEtmd6GXuRerciXGl5bhZ7Q==", + "dependencies": { + "Microsoft.Diagnostics.NETCore.Client": "0.2.510501", + "System.Reflection.TypeExtensions": "4.7.0" + } }, "Microsoft.DotNet.PlatformAbstractions": { "type": "Transitive", @@ -134,258 +133,253 @@ }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, - "Microsoft.NETCore.Platforms": { - "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ==" - }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Nethermind.Crypto.Bls": { "type": "Transitive", @@ -394,8 +388,11 @@ }, "Perfolizer": { "type": "Transitive", - "resolved": "0.3.17", - "contentHash": "FQgtCoF2HFwvzKWulAwBS5BGLlh8pgbrJtOp47jyBwh2CW16juVtacN1azOA2BqdrJXkXTNLNRMo7ZlHHiuAnA==" + "resolved": "0.6.1", + "contentHash": "CR1QmWg4XYBd1Pb7WseP+sDmV8nGPwvmowKynExTqr3OuckIGVMhvmN4LC5PGzfXqDlR295+hz/T7syA1CxEqA==", + "dependencies": { + "Pragmastat": "3.2.4" + } }, "Polly.Core": { "type": "Transitive", @@ -421,6 +418,11 @@ "System.Threading.RateLimiting": "8.0.0" } }, + "Pragmastat": { + "type": "Transitive", + "resolved": "3.2.4", + "contentHash": "I5qFifWw/gaTQT52MhzjZpkm/JPlfjSeO/DTZJjO7+hTKI+0aGRgOgZ3NN6D96dDuuqbIAZSeA5RimtHjqrA2A==" + }, "SimpleBase": { "type": "Transitive", "resolved": "5.6.4", @@ -433,23 +435,27 @@ }, "System.CodeDom": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "JPJArwA1kdj8qDAkY2XGjSWoYnqiM7q/3yRNkt6n28Mnn95MuEGkZXUbPBf7qc3IjwrGY5ttQon7yqHZyQJmOQ==" + "resolved": "9.0.5", + "contentHash": "cuzLM2MWutf9ZBEMPYYfd0DXwYdvntp7VCT6a/wvbKCa2ZuvGmW74xi+YBa2mrfEieAXqM4TNKlMmSnfAfpUoQ==" }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "System.Management": { "type": "Transitive", - "resolved": "5.0.0", - "contentHash": "MF1CHaRcC+MLFdnDthv4/bKWBZnlnSpkGqa87pKukQefgEdwtb9zFW6zs0GjPp73qtpYYg4q6PEKbzJbxCpKfw==", + "resolved": "9.0.5", + "contentHash": "n6o9PZm9p25+zAzC3/48K0oHnaPKTInRrxqFq1fi/5TPbMLjuoCm/h//mS3cUmSy+9AO1Z+qsC/Ilt/ZFatv5Q==", "dependencies": { - "Microsoft.NETCore.Platforms": "5.0.0", - "System.CodeDom": "5.0.0" + "System.CodeDom": "9.0.5" } }, + "System.Reflection.TypeExtensions": { + "type": "Transitive", + "resolved": "4.7.0", + "contentHash": "VybpaOQQhqE6siHppMktjfGBw1GCwvCqiufqmP8F1nj7fTUNtW35LOEt3UZTEsECfo+ELAl/9o9nJx3U91i7vA==" + }, "System.Threading.RateLimiting": { "type": "Transitive", "resolved": "8.0.0", @@ -464,17 +470,17 @@ "solsharp.programs": { "type": "Project", "dependencies": { - "SolSharp.Core": "[3.2.0, )", - "SolSharp.Wallet": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )", + "SolSharp.Wallet": "[4.0.0, )" } }, "solsharp.rpc": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Http": "[10.0.10, )", - "Microsoft.Extensions.Http.Resilience": "[10.8.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.10, )", - "SolSharp.Core": "[3.2.0, )" + "Microsoft.Extensions.Http": "[10.0.12, )", + "Microsoft.Extensions.Http.Resilience": "[10.10.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", + "SolSharp.Core": "[4.0.0, )" } }, "solsharp.wallet": { @@ -482,7 +488,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/docs/RUST_PARITY.md b/docs/RUST_PARITY.md index 6dfc0a0..6018f3e 100644 --- a/docs/RUST_PARITY.md +++ b/docs/RUST_PARITY.md @@ -27,6 +27,20 @@ All repositories above are Apache-2.0 licensed. SolSharp remains MIT licensed; a and the exact source pins shipped with the package are recorded in `THIRD_PARTY_NOTICES.md`. +The transaction freshness extension is additionally checked against Agave commit +[`f46e7976fd37d2fc5eea919d5b28bb5ff7fd17e9`](https://github.com/anza-xyz/agave/commit/f46e7976fd37d2fc5eea919d5b28bb5ff7fd17e9): +`getTransaction.minContextSlot` and `getSignatureStatuses.commitment/minContextSlot`. These optional +fields require a node implementing that extension. The latter retains the upstream `processed` +commitment default when omitted; a context below the requested minimum returns RPC error `-32016`. +Older nodes may ignore the new configuration fields, so their presence in a request alone does not +establish a freshness guarantee. +This additional contract does not replace the base pins or claim parity with all later Agave changes. + +HTTP transaction/block reads and WebSocket block subscriptions advertise a maximum transaction version +of `1` by default; explicit numeric overrides and explicit `null` in the full options retain their wire +meaning. V1's mainnet feature activated at epoch 1035 on September 15, 2026; private and older clusters +may differ. Wire-format verification remains pinned to the SDK revision above. + ## Status legend - **Compatible** — the current public API covers the applicable pinned client contract and @@ -67,8 +81,8 @@ and the exact source pins shipped with the package are recorded in | Token group and transfer-hook client helpers | Compatible | group/member instructions and state; validation PDA; extra-account-meta/seed codecs; bounded TLV decoding; async off-chain account resolution and de-escalation | None in the pinned client contract | | Confidential Token-2022 client contracts | Compatible | confidential transfer/fee/mint-burn and permissioned confidential-burn instructions, raw POD proof locations, native proof-program and ElGamal-registry clients/state | ZK proof generation and ciphertext arithmetic are explicit cryptographic exclusions | | Token/Token-2022 account decoding | Compatible | canonical base Mint/TokenAccount/multisig state, typed Token-2022 TLV/extensions, metadata/group/hook/registry state, and instruction decoders | None in the pinned client contract | -| HTTP JSON-RPC | Compatible | Every non-admin, non-obsolete method in the pinned `RpcRequest` surface; exact account-data encoding union and effective context/filter/slice/detail config variants; bounded responses, batching, typed errors, explicit V1 raw/parsed opt-ins and parsed V1 configuration | None in the pinned client contract | -| WebSocket PubSub | Compatible | Full pinned subscription families; `SubscribeAccountWithOptionsAsync` / `SubscribeProgramWithOptionsAsync` expose effective configs and the exact legacy binary/base58/base64/jsonParsed-fallback/base64+zstd union; bounded multiplexing with 1:N fan-out for Agave-deduplicated subscription IDs, cancellation isolation, reconnect/replay, parsed program state, early signature receipt, and explicit V1 block opt-ins | None in the pinned client contract | +| HTTP JSON-RPC | Compatible | Every non-admin, non-obsolete method in the pinned `RpcRequest` surface; exact account-data encoding union and effective context/filter/slice/detail config variants; bounded responses, batching, typed errors, V1 raw/parsed reads by default, explicit version overrides, parsed V1 configuration, and the additional transaction freshness contract above | None in the pinned client contract | +| WebSocket PubSub | Compatible | Full pinned subscription families; `SubscribeAccountWithOptionsAsync` / `SubscribeProgramWithOptionsAsync` expose effective configs and the exact legacy binary/base58/base64/jsonParsed-fallback/base64+zstd union; bounded multiplexing with 1:N fan-out for Agave-deduplicated subscription IDs, cancellation isolation, reconnect/replay, parsed program state, early signature receipt, and V1 block reads by default with explicit version overrides | None in the pinned client contract | | Native AOT/trimming | Compatible | source-generated JSON, AOT annotations, package-consumer smoke app | None for managed paths; BLS native-RID execution is tracked separately above | For `accountSubscribe`, pinned Agave applies only encoding and commitment to notifications; diff --git a/docs/USAGE.md b/docs/USAGE.md index 530ef20..6e22c83 100644 --- a/docs/USAGE.md +++ b/docs/USAGE.md @@ -25,6 +25,7 @@ using SolSharp.Wallet; - [Installation](#installation) - [Creating a client](#creating-a-client) +- [Upgrading from 3.x](#upgrading-from-3x) - [Keys and wallets](#keys-and-wallets) - [Signed off-chain messages](#signed-off-chain-messages) - [SOL and lamports](#sol-and-lamports) @@ -122,6 +123,53 @@ await ws.ConnectAsync(new Uri("wss://api.mainnet-beta.solana.com")); > The examples below assume an injected/resolved `SolanaRpcClient rpc` and, where relevant, a connected > `SolanaWsClient ws`. +## Upgrading from 3.x + +SolSharp 4.0 changes the transaction versions accepted by default: + +| API | 3.x default | 4.0 default | +| --- | --- | --- | +| Ordinary raw/parsed transaction reads and block reads/subscriptions | `maxSupportedTransactionVersion: 0` | `maxSupportedTransactionVersion: 1` | +| `GetTransactionOptions`, `GetBlockOptions`, `BlockSubscriptionOptions` | `MaxSupportedTransactionVersion = null` (field omitted) | `MaxSupportedTransactionVersion = 1` | + +Ordinary reads can now return V1 transactions. `Transaction.Deserialize` handles their bytes, and parsed +messages expose resource limits and the total priority fee through `Message.TransactionConfig`. +Applications with their own transaction decoders must support V1 or explicitly keep a legacy/v0 ceiling: + +```csharp +var transaction = await rpc.GetTransactionWithMaxVersionAsync(signature, 0); +var parsedTransaction = await rpc.GetParsedTransactionWithMaxVersionAsync(signature, 0); +var parsedBlock = await rpc.GetParsedBlockWithMaxVersionAsync(slot, 0); +var blocks = await ws.SubscribeParsedBlocksWithMaxVersionAsync(0); +``` + +The version ceiling is not a filter: a transaction-bearing response that includes an unsupported version +fails rather than removing that transaction. Agave does not check transaction versions for signatures-only +responses, including `GetBlockAsync` and `SubscribeBlocksAsync`; those methods do not exclude V1 signatures. + +For the full options, `0` accepts legacy/v0. Explicit `null` omits the field, retaining the node's +legacy-only default when transaction data is returned. Base58 and binary cannot be combined with a V1 +ceiling, even when the requested transaction itself is legacy. Preserve a base58 configuration explicitly: + +```csharp +var base58Transaction = await rpc.GetTransactionWithOptionsAsync( + signature, + new GetTransactionOptions + { + Encoding = RpcTransactionEncoding.Base58, + MaxSupportedTransactionVersion = 0 + }); +``` + +Use `RpcTransactionEncoding.Base64`, `Json`, or `JsonParsed` when accepting V1. The same encoding/version +rules apply to `GetBlockOptions` and `BlockSubscriptionOptions`. + +The new transaction/status freshness options are optional and require node support. Existing +`GetSignatureStatusesAsync` calls retain their processed-bank behavior. See +[transaction history and block reads](#walking-an-addresss-history-or-a-whole-block) for `MinContextSlot` +and `GetSignatureStatusesWithOptionsAsync` examples. Building and sending V1 remains explicit through +`BuildV1`; the [V1 guide](#simd-0385-v1-transactions) explains its resource limits and cluster support. + ## Keys and wallets `Keypair` is the local signer. It holds only the 32-byte seed and zeroes it on `Dispose`, so wrap it in `using`. @@ -1173,7 +1221,9 @@ then call `GetStatus`, `IsActive`, `GetActiveAddresses`, or `Lookup` with the cu ## SIMD-0385 V1 transactions -V1 is the current feature-gated transaction format in the pinned Solana SDK. It stores all account addresses +V1 is supported by the pinned Solana SDK and was +[activated on mainnet on September 15, 2026, at epoch 1035](https://solana.com/upgrades/larger-transaction-sizes). +It stores all account addresses inline (there are no address lookup tables), carries compute and fee settings in the message itself, begins with `0x81`, and places its fixed number of signatures **after** the message. Build it explicitly with `SetV1Config` and `BuildV1`: @@ -1203,9 +1253,9 @@ limits mean zero, so it is normally unusable at runtime; only the omitted heap s admission limit. The codec deliberately round-trips larger wire payloads like the pinned Rust SDK; the node enforces admission. -V1 is controlled by the cluster feature `enable_tx_v1` -(`SolanaFeatureIds.EnableTransactionV1`). Check activation on the target cluster before sending; library -support does not imply that a particular validator or RPC endpoint has enabled the feature: +The pinned runtime controls V1 through the cluster feature `enable_tx_v1` +(`SolanaFeatureIds.EnableTransactionV1`). Mainnet activation does not establish support on a private or +older cluster; the feature account can be checked before sending there: ```csharp using SolSharp.Core.Constants; @@ -1319,22 +1369,27 @@ static async Task> FetchTablesAsync(Sol `MessageV0.GetAccountKeys(tables)` gives the full resolved account list (static + lookup-loaded), so you can map a balance entry's `accountIndex` back to a public key. -The compatibility-preserving default raw read advertises legacy/v0. To fetch V1, opt into numeric version 1; -the returned bytes can be parsed locally: +Default raw and parsed transaction reads, block reads, and block subscriptions advertise +`maxSupportedTransactionVersion: 1`, so they can read legacy, v0, and V1 transactions. The returned wire +bytes can be parsed locally: ```csharp -var v1 = await rpc.GetTransactionWithMaxVersionAsync( +var fetchedTransaction = await rpc.GetTransactionAsync( signature, - maxSupportedTransactionVersion: 1, commitment: Commitment.Confirmed) ?? throw new InvalidOperationException("transaction not found"); -var decodedV1 = Transaction.Deserialize(v1.Transaction); +var decodedTransaction = Transaction.Deserialize(fetchedTransaction.Transaction); ``` -The existing method names keep their v0 maximum for source and behavior compatibility. Use the explicitly named -`GetParsedTransactionWithMaxVersionAsync`, `GetParsedBlockWithMaxVersionAsync`, -`SubscribeBlocksWithMaxVersionAsync`, and `SubscribeParsedBlocksWithMaxVersionAsync` methods when opting into -V1. A parsed V1 message exposes its nullable settings through `tx.Message.TransactionConfig`. +This changes the default version ceiling from v0 to V1. An application that only handles legacy/v0 can +retain the previous behavior with `GetTransactionWithMaxVersionAsync(signature, 0)`, +`GetParsedTransactionWithMaxVersionAsync(signature, 0)`, `GetParsedBlockWithMaxVersionAsync(slot, 0)`, +or the corresponding `Subscribe*BlocksWithMaxVersionAsync` methods. The full transaction/block options +also default `MaxSupportedTransactionVersion` to `1`; explicitly set it to `0` for a v0 ceiling or `null` +to omit the field and use the node's legacy-only default for transaction bodies. Base58 and binary +transaction encodings do not support V1 on newer nodes; use base64, JSON, or jsonParsed when accepting V1. +A parsed V1 message exposes its nullable settings through `tx.Message.TransactionConfig`. Read its +resource limits and total priority fee there, rather than scanning ComputeBudget instructions. ### Walking an address's history, or a whole block @@ -1391,10 +1446,29 @@ var configuredTransaction = await rpc.GetTransactionWithOptionsAsync( { Encoding = RpcTransactionEncoding.Json, Commitment = Commitment.Confirmed, - MaxSupportedTransactionVersion = 1 + MinContextSlot = lastObservedSlot }); + +var statuses = await rpc.GetSignatureStatusesWithOptionsAsync( + [signature], + new GetSignatureStatusesOptions + { + SearchTransactionHistory = true, + Commitment = Commitment.Finalized, + MinContextSlot = lastObservedSlot + }); +foreach (var status in statuses) + Console.WriteLine(status?.ConfirmationStatus ?? "not found"); ``` +`GetTransactionOptions.MinContextSlot` and the commitment/minimum-slot signature-status configuration +require a node implementing [Agave's transaction freshness extension](https://github.com/anza-xyz/agave/commit/f46e7976fd37d2fc5eea919d5b28bb5ff7fd17e9). +Older nodes may ignore these fields; confirm provider support before relying on a freshness guarantee. +The node checks its context slot at the requested commitment, not the transaction's historical slot. +An insufficient context returns `RpcException` with code `-32016` (`MinContextSlotNotReached`), rather +than an ordinary missing-transaction result. Omitted freshness fields preserve upstream defaults; +in particular, `GetSignatureStatusesAsync` and an unset status-options commitment still use `processed`. + ## Reading parsed transactions When you'd rather not Borsh-decode instructions yourself, ask the node to do it: the `jsonParsed` encoding @@ -1646,6 +1720,9 @@ Also available: `SubscribeRootsAsync` (rooted slots, like `SubscribeSlotsAsync`) (with base58/base64/raw memcmp, unsigned data-size, and token-account-state filters), `SubscribeSignatureAsync`, `SubscribeBlocksAsync`, and the `jsonParsed` streams `SubscribeParsedBlocksAsync` / `SubscribeParsedAccountAsync` / `SubscribeParsedProgramAsync`. +Block subscriptions accept V1 by default. Use `SubscribeParsedBlocksWithMaxVersionAsync(0)` for a legacy/v0 +consumer, or set `BlockSubscriptionOptions.MaxSupportedTransactionVersion` explicitly to `0` or `null`. +For parsed V1 notifications, the execution settings are in each transaction's `Message.TransactionConfig`. Cancel any channel subscription by cancelling the `CancellationToken` you pass in. A returned `ChannelReader` supports multiple concurrent consumers; each notification is delivered to one reader. diff --git a/global.json b/global.json index f84b5cd..1769bc1 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "10.0.303", + "version": "10.0.401", "rollForward": "disable", "allowPrerelease": false } diff --git a/samples/SolSharp.AotSmoke/Program.cs b/samples/SolSharp.AotSmoke/Program.cs index b82d29c..db53a8d 100644 --- a/samples/SolSharp.AotSmoke/Program.cs +++ b/samples/SolSharp.AotSmoke/Program.cs @@ -6,6 +6,7 @@ using System.Net; using System.Security.Cryptography; using System.Text; +using System.Text.Json; using SolSharp.Core.Primitives; using SolSharp.Programs; using SolSharp.Rpc; @@ -110,7 +111,8 @@ var introspected = InstructionsSysvar.ReadInstruction(instructionSysvar, 0); Check(introspected.ProgramId == SystemProgram.ProgramId, "Instructions sysvar round-trip"); -using var http = new HttpClient(new CannedRpcHandler()); +var handler = new CannedRpcHandler(); +using var http = new HttpClient(handler); http.BaseAddress = new("http://localhost"); var client = new SolanaRpcClient(http); @@ -148,12 +150,18 @@ simulation is var agGenesis = await client.GetAgGenesisCertificateAsync(); Check(agGenesis is null, "getAgGenesisCert nullable result"); -var rawV1 = await client.GetTransactionWithMaxVersionAsync(signatureBase58, 1); +var rawV1 = await client.GetTransactionAsync(signatureBase58); Check( rawV1 is { Transaction: [0x81, 1, 2, 3] } && rawV1.Version?.Number == 1, - "raw transaction V1 opt-in"); + "default raw transaction V1 read"); +using (var request = JsonDocument.Parse(handler.LastRequestBody!)) +{ + Check( + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetInt32() == 1, + "default raw transaction V1 request"); +} -var parsedRpcV1 = await client.GetParsedTransactionWithMaxVersionAsync(signatureBase58, 1); +var parsedRpcV1 = await client.GetParsedTransactionAsync(signatureBase58); Check( parsedRpcV1?.Message.TransactionConfig is { @@ -163,6 +171,50 @@ simulation is HeapSize: 32_768 }, "parsed transaction V1 config"); +using (var request = JsonDocument.Parse(handler.LastRequestBody!)) +{ + Check( + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetInt32() == 1, + "default parsed transaction V1 request"); +} + +var freshTransaction = await client.GetTransactionWithOptionsAsync( + signatureBase58, + new() + { + Encoding = RpcTransactionEncoding.Base64, + Commitment = Commitment.Finalized, + MinContextSlot = 3 + }); +Check(freshTransaction?.GetProperty("version").GetInt32() == 1, "configured transaction V1 read"); +using (var request = JsonDocument.Parse(handler.LastRequestBody!)) +{ + var config = request.RootElement.GetProperty("params")[1]; + Check( + config.GetProperty("minContextSlot").GetUInt64() == 3 && + config.GetProperty("commitment").GetString() == "finalized" && + config.GetProperty("maxSupportedTransactionVersion").GetInt32() == 1, + "transaction freshness request"); +} + +var statuses = await client.GetSignatureStatusesWithOptionsAsync( + [signatureBase58], + new() + { + SearchTransactionHistory = true, + Commitment = Commitment.Finalized, + MinContextSlot = 3 + }); +Check(statuses is [{ Slot: 3, ConfirmationStatus: "finalized", IsError: false }], "signature status response"); +using (var request = JsonDocument.Parse(handler.LastRequestBody!)) +{ + var config = request.RootElement.GetProperty("params")[1]; + Check( + config.GetProperty("searchTransactionHistory").GetBoolean() && + config.GetProperty("commitment").GetString() == "finalized" && + config.GetProperty("minContextSlot").GetUInt64() == 3, + "signature status freshness request"); +} var sent = await client.SendTransactionAsync(wire); Check(sent == signatureBase58, "sendTransaction"); @@ -207,9 +259,15 @@ internal sealed class CannedRpcHandler : HttpMessageHandler private const string SendTransactionJson = """{"jsonrpc":"2.0","result":"5VERv8NMvzbJMEkV8xnrLkEaWRtSz9CosKDYjCJjBRnbJLgp8uirBgmQpjKhoR4tjF3ZpRzrFmBV6UjKdiSZkQUW","id":1}"""; + private const string SignatureStatusesJson = + """{"jsonrpc":"2.0","result":{"context":{"slot":3},"value":[{"slot":3,"confirmations":null,"err":null,"status":{"Ok":null},"confirmationStatus":"finalized"}]},"id":1}"""; + + internal string? LastRequestBody { get; private set; } + protected override async Task SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var body = request.Content is null ? string.Empty : await request.Content.ReadAsStringAsync(cancellationToken); + LastRequestBody = body; var json = body switch { _ when body.Contains("getLatestBlockhash") => LatestBlockhashJson, @@ -219,6 +277,7 @@ _ when body.Contains("simulateTransaction") => SimulateTransactionJson, _ when body.Contains("getAgGenesisCert") => AgGenesisCertificateJson, _ when body.Contains("getTransaction") && body.Contains("jsonParsed") => ParsedVersionedTransactionJson, _ when body.Contains("getTransaction") => VersionedTransactionJson, + _ when body.Contains("getSignatureStatuses") => SignatureStatusesJson, _ when body.Contains("sendTransaction") => SendTransactionJson, _ => throw new InvalidOperationException($"Unexpected RPC request: {body}") }; diff --git a/samples/SolSharp.AotSmoke/packages.lock.json b/samples/SolSharp.AotSmoke/packages.lock.json index 3c8f38f..4eed41b 100644 --- a/samples/SolSharp.AotSmoke/packages.lock.json +++ b/samples/SolSharp.AotSmoke/packages.lock.json @@ -4,31 +4,31 @@ "net10.0": { "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "yloFUsIQOzspIsn2cDHrbgikKaWHAZspzj0EWxnWJJpFC89IBW64OXgCECsrrnzGWQvy1iLX9r5/R4zBf7Am3g==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "AawF393Q+VkdrnrnI1gu612zh5iqpa1AGSvnKCQ3IkMgSKJXIQbO1sXYRgEzOU4f0cPZ6MaCCF29xZSGWlmbuQ==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "StyleCop.Analyzers": { @@ -47,261 +47,261 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Nethermind.Crypto.Bls": { "type": "Transitive", @@ -344,8 +344,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "System.Threading.RateLimiting": { "type": "Transitive", @@ -361,17 +361,17 @@ "solsharp.programs": { "type": "Project", "dependencies": { - "SolSharp.Core": "[3.2.0, )", - "SolSharp.Wallet": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )", + "SolSharp.Wallet": "[4.0.0, )" } }, "solsharp.rpc": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Http": "[10.0.10, )", - "Microsoft.Extensions.Http.Resilience": "[10.8.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.10, )", - "SolSharp.Core": "[3.2.0, )" + "Microsoft.Extensions.Http": "[10.0.12, )", + "Microsoft.Extensions.Http.Resilience": "[10.10.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", + "SolSharp.Core": "[4.0.0, )" } }, "solsharp.wallet": { @@ -379,7 +379,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/samples/SolSharp.AotSmoke/packages.packed.lock.template.json b/samples/SolSharp.AotSmoke/packages.packed.lock.template.json index 3f58b4a..8cc9245 100644 --- a/samples/SolSharp.AotSmoke/packages.packed.lock.template.json +++ b/samples/SolSharp.AotSmoke/packages.packed.lock.template.json @@ -9,289 +9,289 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "yloFUsIQOzspIsn2cDHrbgikKaWHAZspzj0EWxnWJJpFC89IBW64OXgCECsrrnzGWQvy1iLX9r5/R4zBf7Am3g==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "AawF393Q+VkdrnrnI1gu612zh5iqpa1AGSvnKCQ3IkMgSKJXIQbO1sXYRgEzOU4f0cPZ6MaCCF29xZSGWlmbuQ==" }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "Nethermind.Crypto.Bls": { @@ -335,9 +335,9 @@ "contentHash": "__SOLSHARP_NUPKG_SHA512__", "dependencies": { "BouncyCastle.Cryptography": "2.7.0", - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Http.Resilience": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Http.Resilience": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", "Nethermind.Crypto.Bls": "1.1.0", "SimpleBase": "5.6.4" } @@ -358,8 +358,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "System.Threading.RateLimiting": { "type": "Transitive", @@ -370,11 +370,11 @@ "net10.0/linux-x64": { "Microsoft.DotNet.ILCompiler": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "yloFUsIQOzspIsn2cDHrbgikKaWHAZspzj0EWxnWJJpFC89IBW64OXgCECsrrnzGWQvy1iLX9r5/R4zBf7Am3g==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "AawF393Q+VkdrnrnI1gu612zh5iqpa1AGSvnKCQ3IkMgSKJXIQbO1sXYRgEzOU4f0cPZ6MaCCF29xZSGWlmbuQ==", "dependencies": { - "runtime.linux-x64.Microsoft.DotNet.ILCompiler": "10.0.11" + "runtime.linux-x64.Microsoft.DotNet.ILCompiler": "10.0.12" } }, "Nethermind.Crypto.Bls": { @@ -384,8 +384,8 @@ }, "runtime.linux-x64.Microsoft.DotNet.ILCompiler": { "type": "Transitive", - "resolved": "10.0.11", - "contentHash": "0lJviBev2CvBdrLhMCJ1hmwOKgjbk1ccRy+brEewywtK4TMft1WaVXv112j6OuTQg8ZMbnN/i3KRD3S6o4NJDw==" + "resolved": "10.0.12", + "contentHash": "wAa+LAE6+Bkd+pEJvGdnQU8PZQRzvhurpQ4hzsOTpRuedIq1kunJcz86xBCBlzsc+QlVdCKVUPzEfB3uYVB7Gw==" } } } diff --git a/src/SolSharp.Core/packages.lock.json b/src/SolSharp.Core/packages.lock.json index 6f06338..5ba9a61 100644 --- a/src/SolSharp.Core/packages.lock.json +++ b/src/SolSharp.Core/packages.lock.json @@ -4,25 +4,25 @@ "net10.0": { "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "SimpleBase": { @@ -42,16 +42,16 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", @@ -60,8 +60,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" } } } diff --git a/src/SolSharp.Programs/packages.lock.json b/src/SolSharp.Programs/packages.lock.json index 8786baf..acc8346 100644 --- a/src/SolSharp.Programs/packages.lock.json +++ b/src/SolSharp.Programs/packages.lock.json @@ -4,25 +4,25 @@ "net10.0": { "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "StyleCop.Analyzers": { @@ -41,16 +41,16 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Nethermind.Crypto.Bls": { "type": "Transitive", @@ -69,8 +69,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "solsharp.core": { "type": "Project", @@ -83,7 +83,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/src/SolSharp.Rpc/Protocol/RpcParams.cs b/src/SolSharp.Rpc/Protocol/RpcParams.cs index fa69e61..801d17e 100644 --- a/src/SolSharp.Rpc/Protocol/RpcParams.cs +++ b/src/SolSharp.Rpc/Protocol/RpcParams.cs @@ -182,6 +182,9 @@ internal sealed record TransactionConfig [JsonPropertyName("encoding")] public string? Encoding { get; init; } + + [JsonPropertyName("minContextSlot")] + public ulong? MinContextSlot { get; init; } } /// The getBlock configuration object ( is unset for the signatures-only read). @@ -218,6 +221,12 @@ internal sealed record SignatureStatusesConfig { [JsonPropertyName("searchTransactionHistory")] public required bool SearchTransactionHistory { get; init; } + + [JsonPropertyName("commitment")] + public Commitment? Commitment { get; init; } + + [JsonPropertyName("minContextSlot")] + public ulong? MinContextSlot { get; init; } } /// The getInflationReward configuration object. diff --git a/src/SolSharp.Rpc/Protocol/RpcRequests.cs b/src/SolSharp.Rpc/Protocol/RpcRequests.cs index 7a4347b..cbf25da 100644 --- a/src/SolSharp.Rpc/Protocol/RpcRequests.cs +++ b/src/SolSharp.Rpc/Protocol/RpcRequests.cs @@ -281,7 +281,8 @@ public static RpcRequest GetTransaction( string signature, Commitment? commitment, byte? maxSupportedTransactionVersion, - RpcTransactionEncoding? encoding = RpcTransactionEncoding.Base64) => + RpcTransactionEncoding? encoding = RpcTransactionEncoding.Base64, + ulong? minContextSlot = null) => new() { Method = RpcMethods.GetTransaction, @@ -292,16 +293,30 @@ public static RpcRequest GetTransaction( { Commitment = commitment, MaxSupportedTransactionVersion = maxSupportedTransactionVersion, - Encoding = encoding is { } value ? value.WireName : null + Encoding = encoding is { } value ? value.WireName : null, + MinContextSlot = minContextSlot } ] }; - public static RpcRequest GetSignatureStatuses(IReadOnlyList signatures, bool searchTransactionHistory) => + public static RpcRequest GetSignatureStatuses( + IReadOnlyList signatures, + bool searchTransactionHistory, + Commitment? commitment = null, + ulong? minContextSlot = null) => new() { Method = RpcMethods.GetSignatureStatuses, - Params = [signatures.ToArray(), new SignatureStatusesConfig { SearchTransactionHistory = searchTransactionHistory }] + Params = + [ + signatures.ToArray(), + new SignatureStatusesConfig + { + SearchTransactionHistory = searchTransactionHistory, + Commitment = commitment, + MinContextSlot = minContextSlot + } + ] }; public static RpcRequest GetSlotLeaders(ulong startSlot, ulong limit) => diff --git a/src/SolSharp.Rpc/RpcReadOptions.cs b/src/SolSharp.Rpc/RpcReadOptions.cs index 5b0ba70..29737f5 100644 --- a/src/SolSharp.Rpc/RpcReadOptions.cs +++ b/src/SolSharp.Rpc/RpcReadOptions.cs @@ -121,7 +121,10 @@ public sealed record GetInflationRewardOptions /// public sealed record GetBlockOptions { - /// The transaction encoding; use the node default when null. + /// + /// The transaction encoding; use the node default when null. For V1, use Base64, Json, or JsonParsed. + /// Base58 and Binary require to be 0 or null. + /// public RpcTransactionEncoding? Encoding { get; init; } /// The transaction detail level; use the node default when null. @@ -133,8 +136,8 @@ public sealed record GetBlockOptions /// The commitment level to query at. public Commitment? Commitment { get; init; } - /// The highest numeric transaction version the caller accepts. - public byte? MaxSupportedTransactionVersion { get; init; } + /// The highest numeric transaction version the caller accepts; defaults to V1. Set to null to omit the field and request legacy transactions only when transaction data is returned. + public byte? MaxSupportedTransactionVersion { get; init; } = 1; } /// @@ -143,14 +146,33 @@ public sealed record GetBlockOptions /// public sealed record GetTransactionOptions { - /// The transaction encoding; use the node default when null. + /// + /// The transaction encoding; use the node default when null. For V1, use Base64, Json, or JsonParsed. + /// Base58 and Binary require to be 0 or null. + /// public RpcTransactionEncoding? Encoding { get; init; } /// The commitment level to query at. public Commitment? Commitment { get; init; } - /// The highest numeric transaction version the caller accepts. - public byte? MaxSupportedTransactionVersion { get; init; } + /// The highest numeric transaction version the caller accepts; defaults to V1. Set to null to omit the field and request legacy transactions only. + public byte? MaxSupportedTransactionVersion { get; init; } = 1; + + /// The minimum slot the node must have reached at the requested commitment before looking up the transaction; requires node support. + public ulong? MinContextSlot { get; init; } +} + +/// Options for . +public sealed record GetSignatureStatusesOptions +{ + /// Whether to search the node's long-term transaction history in addition to its recent status cache; defaults to false. + public bool SearchTransactionHistory { get; init; } + + /// The commitment level used to select the status bank; the node defaults to when null. Requires node support. + public Commitment? Commitment { get; init; } + + /// The minimum slot the node's status bank must have reached before looking up signatures; requires node support. + public ulong? MinContextSlot { get; init; } } internal static class RpcWireNames diff --git a/src/SolSharp.Rpc/SolSharp.Rpc.csproj b/src/SolSharp.Rpc/SolSharp.Rpc.csproj index 86c936f..551a052 100644 --- a/src/SolSharp.Rpc/SolSharp.Rpc.csproj +++ b/src/SolSharp.Rpc/SolSharp.Rpc.csproj @@ -7,9 +7,9 @@ - - - + + + diff --git a/src/SolSharp.Rpc/SolanaRpcClient.cs b/src/SolSharp.Rpc/SolanaRpcClient.cs index 7088968..0a041bf 100644 --- a/src/SolSharp.Rpc/SolanaRpcClient.cs +++ b/src/SolSharp.Rpc/SolanaRpcClient.cs @@ -1122,8 +1122,8 @@ await SendAsync(RpcRequests.GetRecentPrioritizationFees(acc /// /// Returns a confirmed transaction by signature, or null if the cluster has not seen it. Supports - /// legacy and versioned-v0 transactions. Use to opt into - /// a newer numeric version. See + /// legacy, v0, and V1 transactions. Use to select a + /// different maximum numeric version. See /// getTransaction. /// /// The transaction signature (base58). @@ -1137,10 +1137,10 @@ await SendAsync(RpcRequests.GetRecentPrioritizationFees(acc string signature, Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) - => SendNullableAsync(RpcRequests.GetTransaction(signature, commitment, 0), cancellationToken); + => SendNullableAsync(RpcRequests.GetTransaction(signature, commitment, 1), cancellationToken); /// - /// Returns a confirmed transaction while explicitly opting into a newer transaction version. The + /// Returns a confirmed transaction with an explicit maximum transaction version. The /// transaction is returned as wire bytes on ; callers must /// only advertise versions whose wire format they can handle. /// @@ -1164,7 +1164,7 @@ await SendAsync(RpcRequests.GetRecentPrioritizationFees(acc RpcRequests.GetTransaction(signature, commitment, maxSupportedTransactionVersion), cancellationToken); /// - /// Returns a transaction using the exact upstream encoding, commitment, and transaction-version + /// Returns a transaction using the exact upstream encoding, commitment, minimum-context-slot, and transaction-version /// configuration. Because the encoding changes the transaction field's JSON schema, the result is exposed /// without lossy projection as a . /// @@ -1187,13 +1187,14 @@ await SendAsync(RpcRequests.GetRecentPrioritizationFees(acc signature, options.Commitment, options.MaxSupportedTransactionVersion, - options.Encoding), + options.Encoding, + options.MinContextSlot), cancellationToken); } /// /// Returns the processing status of each signature, in order; an entry is null if the cluster has - /// no record of that signature. See + /// no record of that signature. The node uses its processed bank. See /// getSignatureStatuses. /// /// The transaction signatures (base58) to look up. @@ -1217,6 +1218,35 @@ await SendAsync(RpcRequests.GetRecentPrioritizationFees(acc return RequireContextValue(result); } + /// + /// Returns each signature's processing status using explicit history-search, commitment, and + /// minimum-context-slot options. Commitment and minimum context slot require node support. + /// An omitted commitment preserves the node's historical processed-bank behavior. + /// + /// The transaction signatures (base58) to look up. + /// The signature-status configuration sent to the node. + /// A token to cancel the request. + /// One status per requested signature, in order; an entry is null when the signature is unknown. + /// or is null. + /// The node returned a JSON-RPC error, including when the minimum context slot has not been reached. + /// The request failed at the transport level or returned a non-success status. + /// The was cancelled. + public async Task> GetSignatureStatusesWithOptionsAsync( + IReadOnlyList signatures, + GetSignatureStatusesOptions options, + CancellationToken cancellationToken = default) + { + ArgumentNullException.ThrowIfNull(signatures); + ArgumentNullException.ThrowIfNull(options); + + var result = await SendAsync>( + RpcRequests.GetSignatureStatuses( + signatures, options.SearchTransactionHistory, options.Commitment, options.MinContextSlot), + cancellationToken); + + return RequireContextValue(result); + } + /// /// Polls getSignatureStatuses until the transaction reaches (or higher), /// or the timeout elapses. A confirmed-but-failed transaction is returned, not thrown - inspect @@ -1481,7 +1511,8 @@ public async Task> GetTokenLargestAccountsAsy /// /// Returns a confirmed block by slot (with transaction signatures only), or null if the slot was - /// skipped. See getBlock. + /// skipped. Advertises V1 support; the node does not enforce the version limit for signatures-only responses. + /// See getBlock. /// /// The slot to fetch the block for. /// The commitment level to query at (processed is not supported by the node). @@ -1494,12 +1525,12 @@ public async Task> GetTokenLargestAccountsAsy ulong slot, Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) - => SendNullableAsync(RpcRequests.GetBlock(slot, commitment, 0), cancellationToken); + => SendNullableAsync(RpcRequests.GetBlock(slot, commitment, 1), cancellationToken); /// - /// Returns a confirmed signatures-only block while explicitly opting into a newer transaction version. - /// This is required when the block contains a version newer than v0, even though only signatures are - /// requested. See getBlock. + /// Returns a confirmed signatures-only block with an explicit maximum transaction version. + /// The node does not enforce this limit for signatures-only responses. + /// See getBlock. /// /// The slot to fetch the block for. /// The highest numeric transaction version the caller accepts. @@ -1550,6 +1581,7 @@ public async Task> GetTokenLargestAccountsAsy /// /// Returns a confirmed transaction decoded by the node into jsonParsed form - recognized /// instructions, token balances and logs without local Borsh decoding - or null if not found. + /// Supports legacy, v0, and V1 transactions, including V1 execution configuration. /// See getTransaction. /// /// The transaction signature (base58) to fetch. @@ -1565,12 +1597,12 @@ public async Task> GetTokenLargestAccountsAsy CancellationToken cancellationToken = default) { var transaction = await SendNullableAsync( - RpcRequests.GetParsedTransaction(signature, commitment ?? Commitment.Confirmed, 0), cancellationToken); + RpcRequests.GetParsedTransaction(signature, commitment ?? Commitment.Confirmed, 1), cancellationToken); return RequireConfirmedParsedTransaction(transaction); } /// - /// Returns a node-decoded transaction while explicitly opting into a newer numeric transaction version. + /// Returns a node-decoded transaction with an explicit maximum numeric transaction version. /// For V1, exposes the message's execution configuration. /// /// The transaction signature (base58) to fetch. @@ -1600,6 +1632,7 @@ public async Task> GetTokenLargestAccountsAsy /// Returns a confirmed block whose transactions are decoded by the node into jsonParsed form, or /// null if the slot was skipped. Each transaction's and /// are filled in from the block. + /// Supports legacy, v0, and V1 transactions, including V1 execution configuration. /// See getBlock. /// /// The slot to fetch the block for. @@ -1613,10 +1646,10 @@ public async Task> GetTokenLargestAccountsAsy ulong slot, Commitment? commitment = null, CancellationToken cancellationToken = default) - => await GetParsedBlockCoreAsync(slot, 0, commitment, cancellationToken); + => await GetParsedBlockCoreAsync(slot, 1, commitment, cancellationToken); /// - /// Returns a node-decoded block while explicitly opting into a newer numeric transaction version. + /// Returns a node-decoded block with an explicit maximum numeric transaction version. /// For V1 messages, exposes the embedded execution settings. /// /// The slot to fetch the block for. diff --git a/src/SolSharp.Rpc/Streaming/SolanaWsClient.cs b/src/SolSharp.Rpc/Streaming/SolanaWsClient.cs index a97a2a7..477f69c 100644 --- a/src/SolSharp.Rpc/Streaming/SolanaWsClient.cs +++ b/src/SolSharp.Rpc/Streaming/SolanaWsClient.cs @@ -525,8 +525,9 @@ public async Task>> Subscrib } /// - /// Subscribes to every new block, delivered through a channel. The node must be started with block - /// subscriptions enabled (--rpc-pubsub-enable-block-subscription); many providers disable them. + /// Subscribes to every new signatures-only block, advertising support through transaction version 1. + /// The node must have block subscriptions enabled (--rpc-pubsub-enable-block-subscription); + /// many providers disable them. /// Cancelling unsubscribes and completes the channel. See /// blockSubscribe. /// @@ -538,12 +539,12 @@ public async Task>> Subscrib public Task>> SubscribeBlocksAsync( Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) - => SubscribeBlocksCoreAsync("all", commitment, 0, cancellationToken); + => SubscribeBlocksCoreAsync("all", commitment, 1, cancellationToken); /// - /// Subscribes to every new signatures-only block while explicitly opting into a newer numeric transaction - /// version. The node must have block subscriptions enabled. Cancelling - /// unsubscribes and completes the channel. + /// Subscribes to every new signatures-only block with an explicit maximum transaction version. + /// Agave does not validate transaction versions for signatures-only responses. The node must have + /// block subscriptions enabled. Cancelling unsubscribes and completes the channel. /// /// The highest numeric transaction version the caller accepts. /// The commitment level to query at. @@ -558,8 +559,8 @@ public Task>> SubscribeBlocksWi => SubscribeBlocksCoreAsync("all", commitment, maxSupportedTransactionVersion, cancellationToken); /// - /// Subscribes to new blocks that mention , delivered through a - /// channel. The node must be started with block subscriptions enabled + /// Subscribes to signatures-only blocks that mention , + /// advertising support through transaction version 1. The node must have block subscriptions enabled /// (--rpc-pubsub-enable-block-subscription). Cancelling /// unsubscribes and completes the channel. See /// blockSubscribe. @@ -575,12 +576,12 @@ public Task>> SubscribeBlocksAs Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) => SubscribeBlocksCoreAsync( - new BlockSubscribeFilter { MentionsAccountOrProgram = mentionsAccountOrProgram }, commitment, 0, cancellationToken); + new BlockSubscribeFilter { MentionsAccountOrProgram = mentionsAccountOrProgram }, commitment, 1, cancellationToken); /// - /// Subscribes to signatures-only blocks that mention an account or program while explicitly opting into a - /// newer numeric transaction version. Cancelling unsubscribes and - /// completes the channel. + /// Subscribes to signatures-only blocks that mention an account or program with an explicit maximum + /// transaction version. Agave does not validate versions for signatures-only responses. + /// Cancelling unsubscribes and completes the channel. /// /// The account or program a block must mention to be delivered. /// The highest numeric transaction version the caller accepts. @@ -646,8 +647,8 @@ public async Task>> Subscrib /// /// Subscribes to every new block with its transactions decoded into jsonParsed form, delivered - /// through a channel. The node must be started with block subscriptions enabled - /// (--rpc-pubsub-enable-block-subscription); many providers disable them. Cancelling + /// through a channel, accepting legacy, v0, and V1 transactions. The node must have block subscriptions + /// enabled (--rpc-pubsub-enable-block-subscription); many providers disable them. Cancelling /// unsubscribes and completes the channel. See /// blockSubscribe. /// @@ -659,11 +660,11 @@ public async Task>> Subscrib public Task>> SubscribeParsedBlocksAsync( Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) - => SubscribeParsedBlocksCoreAsync("all", commitment, 0, cancellationToken); + => SubscribeParsedBlocksCoreAsync("all", commitment, 1, cancellationToken); /// - /// Subscribes to every new node-decoded block while explicitly opting into a newer numeric transaction - /// version. V1 messages expose their execution settings on + /// Subscribes to every new node-decoded block with an explicit maximum transaction version. + /// V1 messages expose their execution settings on /// . Cancelling /// unsubscribes and completes the channel. /// @@ -681,8 +682,8 @@ public Task>> SubscribePa /// /// Subscribes to new blocks that mention , with their - /// transactions decoded into jsonParsed form, delivered through a channel. The node must be started - /// with block subscriptions enabled (--rpc-pubsub-enable-block-subscription). Cancelling + /// legacy, v0, and V1 transactions decoded into jsonParsed form, delivered through a channel. + /// The node must have block subscriptions enabled (--rpc-pubsub-enable-block-subscription). Cancelling /// unsubscribes and completes the channel. See /// blockSubscribe. /// @@ -697,11 +698,11 @@ public Task>> SubscribePa Commitment commitment = Commitment.Confirmed, CancellationToken cancellationToken = default) => SubscribeParsedBlocksCoreAsync( - new BlockSubscribeFilter { MentionsAccountOrProgram = mentionsAccountOrProgram }, commitment, 0, cancellationToken); + new BlockSubscribeFilter { MentionsAccountOrProgram = mentionsAccountOrProgram }, commitment, 1, cancellationToken); /// - /// Subscribes to node-decoded blocks that mention an account or program while explicitly opting into a - /// newer numeric transaction version. V1 messages expose their execution settings on + /// Subscribes to node-decoded blocks that mention an account or program with an explicit maximum + /// transaction version. V1 messages expose their execution settings on /// . /// /// The account or program a block must mention to be delivered. @@ -945,9 +946,8 @@ private static string CreateCoalescingKey(string method, object[] parameters) _ => parameters }; - return JsonSerializer.Serialize( - new RpcRequest { Id = 0, Method = method, Params = normalized }, - RpcJson.TypeInfo()); + return JsonSerializer + .Serialize(new() { Id = 0, Method = method, Params = normalized }, RpcJson.TypeInfo()); } private static object NormalizeProgramFilter(object filter) @@ -961,6 +961,7 @@ private static object NormalizeProgramFilter(object filter) "base64" => Convert.FromBase64String(memcmp.Bytes), _ => null }; + return bytes is null ? filter : new RawMemcmpFilter diff --git a/src/SolSharp.Rpc/Streaming/SubscriptionOptions.cs b/src/SolSharp.Rpc/Streaming/SubscriptionOptions.cs index e4aa24a..aa2f4bf 100644 --- a/src/SolSharp.Rpc/Streaming/SubscriptionOptions.cs +++ b/src/SolSharp.Rpc/Streaming/SubscriptionOptions.cs @@ -106,7 +106,10 @@ public sealed record BlockSubscriptionOptions /// The commitment level at which blocks are delivered. public Commitment? Commitment { get; init; } - /// The transaction encoding; use the node default when null. + /// + /// The transaction encoding; use the node default when null. Use base64, JSON, or jsonParsed + /// for V1; binary/base58 requires to be 0 or null. + /// public RpcTransactionEncoding? Encoding { get; init; } /// The transaction detail level; use the node default when null. @@ -115,6 +118,10 @@ public sealed record BlockSubscriptionOptions /// Whether block-level rewards are included; use the node default when null. public bool? ShowRewards { get; init; } - /// The highest numeric transaction version the caller accepts. - public byte? MaxSupportedTransactionVersion { get; init; } + /// + /// The highest numeric transaction version the caller accepts. Defaults to 1, accepting legacy, v0, + /// and V1. Set to 0 for legacy/v0, or null to omit the field and use the node's legacy-only default + /// for transaction-bearing responses. Agave does not validate versions for signatures-only responses. + /// + public byte? MaxSupportedTransactionVersion { get; init; } = 1; } diff --git a/src/SolSharp.Rpc/packages.lock.json b/src/SolSharp.Rpc/packages.lock.json index 0c9e28b..1a5176b 100644 --- a/src/SolSharp.Rpc/packages.lock.json +++ b/src/SolSharp.Rpc/packages.lock.json @@ -4,59 +4,59 @@ "net10.0": { "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Direct", - "requested": "[10.8.0, )", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "requested": "[10.10.0, )", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "StyleCop.Analyzers": { @@ -70,230 +70,230 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Polly.Core": { "type": "Transitive", @@ -331,8 +331,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "System.Threading.RateLimiting": { "type": "Transitive", diff --git a/src/SolSharp.Wallet/packages.lock.json b/src/SolSharp.Wallet/packages.lock.json index d151609..f34b56e 100644 --- a/src/SolSharp.Wallet/packages.lock.json +++ b/src/SolSharp.Wallet/packages.lock.json @@ -10,25 +10,25 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "Nethermind.Crypto.Bls": { @@ -48,16 +48,16 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "SimpleBase": { "type": "Transitive", @@ -71,8 +71,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "solsharp.core": { "type": "Project", diff --git a/src/SolSharp/SolSharp.csproj b/src/SolSharp/SolSharp.csproj index b3a67cc..c4b9a23 100644 --- a/src/SolSharp/SolSharp.csproj +++ b/src/SolSharp/SolSharp.csproj @@ -6,9 +6,9 @@ SolSharp true true - 3.1.0 + 3.2.0 A contract-driven, Native AOT-ready .NET 10 SDK for Solana — independently implemented from pinned Anza Solana SDK, Agave, and SPL source contracts. Source-generated JSON with no reflection; typed RPC and multiplexed WebSocket streaming; Ed25519 and BLS12-381 keys/signatures; program instructions and bounded state decoding; and exact legacy/v0/V1 transaction wire formats verified against Rust-compatible vectors. Ships as one package bundling the Core, Wallet, Rpc, and Programs functional assemblies plus a minimal packaging facade. - 3.2.0 — differential-audit remediation and RPC/WebSocket hardening. WebSocket PubSub now fans Agave-deduplicated subscriptions out to every matching local subscriber, unsubscribes only the final consumer, and safely handles late acknowledgements and closing-route races. Transfer-hook TLV decoding now validates the complete buffer and exact ListView storage contract. Alpenglow signer bitmaps accept the full 515-byte envelope; message compilation snapshots bounded instruction inputs; PDA bump search matches 255 through 1; malformed account/error responses consistently surface as JsonException; and RPC batches isolate attributable malformed entries while retaining batch-wide rejection for ambiguous ids. Adds pinned loader, curve, BIP-39, BLS, confidential-token, and PDA parity vectors, and documents intentional runtime/client decoder and pathological Ed25519-verifier differences. Full details: https://github.com/jecacs/SolSharp/blob/v3.2.0/CHANGELOG.md + 4.0.0 — V1 transactions by default. Breaking change: HTTP transaction/block reads and WebSocket block subscriptions now advertise transaction version 1; full configuration objects also default MaxSupportedTransactionVersion to 1. Use explicit version 0 to retain legacy/v0-only reads, or null in full options to omit the version field. Base58/binary encodings require an explicit version 0 or null; use base64, JSON, or jsonParsed for V1. Adds GetTransactionOptions.MinContextSlot and GetSignatureStatusesWithOptionsAsync with history, commitment, and minimum-context-slot options. Updates NuGet dependencies and the pinned .NET 10 toolchain, fixes the SourceLink security-audit failure, and synchronizes solution, benchmark, and packed AOT locks. Verified with default V1 HTTP/WebSocket tests, a read-only mainnet V1 regression, and packed Native AOT smoke checks. Full details: https://github.com/jecacs/SolSharp/blob/v4.0.0/CHANGELOG.md $(TargetsForTfmSpecificBuildOutput);BundleProjectReferences @@ -23,9 +23,9 @@ - - - + + + diff --git a/src/SolSharp/packages.lock.json b/src/SolSharp/packages.lock.json index f63013d..0fc8ad4 100644 --- a/src/SolSharp/packages.lock.json +++ b/src/SolSharp/packages.lock.json @@ -10,59 +10,59 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.Extensions.Http": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Direct", - "requested": "[10.8.0, )", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "requested": "[10.10.0, )", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.NET.ILLink.Tasks": { "type": "Direct", - "requested": "[10.0.11, )", - "resolved": "10.0.11", - "contentHash": "IBf7lbovvjGWVWXZX5cJ/cO0WXbId0Zq4BuSeT94mGZuOAP66oMeH9PTBZ9Jpp3Jb6jtK0qm/NyUbPRo1gC/wQ==" + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "xi+BDjFpW+Sb+MHFHaH6Y/gV9I8BluFwRXc1QyCdoZbIK26eNiBeFuMTe/FMwc33G1wdHCyDg7CVTmb8OdQrMQ==" }, "Microsoft.SourceLink.GitHub": { "type": "Direct", - "requested": "[10.0.301, )", - "resolved": "10.0.301", - "contentHash": "S9U9Ye2bylMeDkzdNh+TsbRUNr6rkBORrnXDk45maPIxVvTmHV1SN2/qtZ/6yO7cdWmQv1LHv77yIeG6Q3nvMQ==", + "requested": "[10.0.401, )", + "resolved": "10.0.401", + "contentHash": "LGmlwgP1Cx37JEWzyjS0o1/+xs/s/e3E2TBSuogI5ePA/9L0pfIfeYX0k5in7Bfcw8Nn2y2sG9jXxydTjiR2Fg==", "dependencies": { - "Microsoft.Build.Tasks.Git": "10.0.301", - "Microsoft.SourceLink.Common": "10.0.301", - "System.IO.Hashing": "10.0.10" + "Microsoft.Build.Tasks.Git": "10.0.401", + "Microsoft.SourceLink.Common": "10.0.401", + "System.IO.Hashing": "10.0.12" } }, "Nethermind.Crypto.Bls": { @@ -88,230 +88,230 @@ }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "9Tah8f2BYuXlff9nIsJAeQJcqnijJTXNraIcTOF2f/f9kLmg0HNWPlMemnD6FBLd/UQcE0s9Vze2zCkA6nrZAA==", + "resolved": "10.0.401", + "contentHash": "ZYctNuT10V9IYyCFydy63DXx0ggZQuynuzQOdLvW62dPgzjIz7f0ISEP75RGiq1jFQh8p6TmGSqxeQZQ87LCig==", "dependencies": { - "System.IO.Hashing": "10.0.10" + "System.IO.Hashing": "10.0.12" } }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.SourceLink.Common": { "type": "Transitive", - "resolved": "10.0.301", - "contentHash": "oz44EclJdAYVZcRb9dSbWd+6RaE+8a4j5zdE+O7yw5qPRZZhu3pcpDZ/Moy6pLeIXZqBP1FMd8CSE0sgJAGV0g==" + "resolved": "10.0.401", + "contentHash": "u3rLxIwi/9MqDFaWGE/QQgLR1NBEzLOW2lv5+9OrZPDBYIAmFdYSWCWrR1ufpXWOqFn+x02TgKropl/oDuHmgA==" }, "Polly.Core": { "type": "Transitive", @@ -344,8 +344,8 @@ }, "System.IO.Hashing": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "eE839zyWZD/UBZYzP2lu9fhHX6RWe63/jz3Jxf+JumzO/db+Vc2s7CMiDwxk9ti2NTUft2tdRx31Rw2OjKbecA==" + "resolved": "10.0.12", + "contentHash": "jDix4bBMYnpZdSPcnY+KDV6ik3SRMzpMKby/bZl/XUwIiflwRNAFZ0oOl61R/pSaveIJ8t1gs2BUlrGsPs/bcg==" }, "System.Threading.RateLimiting": { "type": "Transitive", @@ -361,17 +361,17 @@ "solsharp.programs": { "type": "Project", "dependencies": { - "SolSharp.Core": "[3.2.0, )", - "SolSharp.Wallet": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )", + "SolSharp.Wallet": "[4.0.0, )" } }, "solsharp.rpc": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Http": "[10.0.10, )", - "Microsoft.Extensions.Http.Resilience": "[10.8.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.10, )", - "SolSharp.Core": "[3.2.0, )" + "Microsoft.Extensions.Http": "[10.0.12, )", + "Microsoft.Extensions.Http.Resilience": "[10.10.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", + "SolSharp.Core": "[4.0.0, )" } }, "solsharp.wallet": { @@ -379,7 +379,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/tests/SolSharp.Core.Tests/SolSharp.Core.Tests.csproj b/tests/SolSharp.Core.Tests/SolSharp.Core.Tests.csproj index e594957..ef88262 100644 --- a/tests/SolSharp.Core.Tests/SolSharp.Core.Tests.csproj +++ b/tests/SolSharp.Core.Tests/SolSharp.Core.Tests.csproj @@ -9,9 +9,9 @@ - + - + diff --git a/tests/SolSharp.Core.Tests/packages.lock.json b/tests/SolSharp.Core.Tests/packages.lock.json index 19c32df..daa697d 100644 --- a/tests/SolSharp.Core.Tests/packages.lock.json +++ b/tests/SolSharp.Core.Tests/packages.lock.json @@ -19,18 +19,18 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.9.0, )", - "resolved": "18.9.0", - "contentHash": "xIzVXa/VpKXqDWzyC/5Hw8JbFY5u9k3Jc53CpcjBiOXvkQGio484LD9FNwOiGUSMDcYL3Rcw9sNgGi5WrswlPQ==", + "requested": "[18.10.1, )", + "resolved": "18.10.1", + "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", "dependencies": { - "Microsoft.CodeCoverage": "18.9.0", - "Microsoft.TestPlatform.TestHost": "18.9.0" + "Microsoft.CodeCoverage": "18.10.1", + "Microsoft.TestPlatform.TestHost": "18.10.1" } }, "NSubstitute": { @@ -50,13 +50,13 @@ }, "NUnit3TestAdapter": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==", + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "8ZD+0dIfDHsL4w4Gl/LPxWH0O4ky3hFXqTZjY+ry0ThI3cMVErr9Tjxal5O5wJxGXh50a9qkDEAWVca8KQYCEw==", "dependencies": { "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0", - "Microsoft.Testing.Platform.MSBuild": "2.1.0" + "Microsoft.Testing.Extensions.VSTestBridge": "2.3.3", + "Microsoft.Testing.Platform.MSBuild": "2.3.3" } }, "StyleCop.Analyzers": { @@ -83,8 +83,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "MtegCIKGuG0r/LCdIjoR1HgzCGIUBhR3aNdbtQpts5vMXQuqBDZ2Jsd2uFKoHFM2XrQV6ZrDf3F5oLi3SLTp8w==" + "resolved": "18.10.1", + "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", @@ -93,56 +93,56 @@ }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==", + "resolved": "2.3.3", + "contentHash": "nY8ceQyPWB9TRE1WE5Oe/sks2e10SxgPv61vBHsFYpgCeDtNwhpMZwmL29GklO3/etTdOsLdrCmNr4zJWaR2fg==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==", + "resolved": "2.3.3", + "contentHash": "dceVNxnfTEjKnrIreLcMfkgrzzBY8kgCCJX5NAv7Lq/6vPlTP4VB5zxKeuYy0yfCoBtWuPkLjUG6qtOBMfpypA==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==", + "resolved": "2.3.3", + "contentHash": "JLovZjH6K10YiHO/BcidsaSHo/M2DfOe9FDjxjFdV6aoHO6VYTTYlLBNcyLJSo20q5gDTmNvmxYVH39A942aJA==", "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.TestPlatform.ObjectModel": "18.4.0", + "Microsoft.Testing.Extensions.Telemetry": "2.3.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.3.3", + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg==" + "resolved": "2.3.3", + "contentHash": "ENbH4BQh9riXtOKc25KKITfiGGWhWMBJA7pZuNaF9zxzzSaVkp5AMeZxGQ6sXYaR6xb724NLz985Is6XIYqLSg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==", + "resolved": "2.3.3", + "contentHash": "iVAvNbZ5JPDZSrTcIrCDoCsAkzjDxwDEt2mDuMd8ng1P6e2P2NCd0g0BsoBVG+nJLSmK//V+yeEvjCa3E2fxHw==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Fz/qXC52VXXopzHj7v2reCKcCqSxkTDCkEDfkNAH0vni/7qK/KLMiEYtRmnUanxO2F2g2zZZ60qCpxF0AF7URA==" + "resolved": "18.10.1", + "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Oq+Pma/J86aZL72t71bcESvDszDsTjUfl6PIsuDdPoKTHZfNMhKamCfLD5fKx51W/u0KozXtJo2/3fnt0sgPxg==", + "resolved": "18.10.1", + "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.9.0" + "Microsoft.TestPlatform.ObjectModel": "18.10.1" } }, "Microsoft.Win32.SystemEvents": { diff --git a/tests/SolSharp.IntegrationTests/IntegrationEnvironment.cs b/tests/SolSharp.IntegrationTests/IntegrationEnvironment.cs index 4bfa46c..4738bb7 100644 --- a/tests/SolSharp.IntegrationTests/IntegrationEnvironment.cs +++ b/tests/SolSharp.IntegrationTests/IntegrationEnvironment.cs @@ -116,6 +116,18 @@ public static void RethrowOrInconclusive(Exception exception) ExceptionDispatchInfo.Capture(exception).Throw(); } + /// Reports missing live test data as inconclusive, or fails the strict integration gate. + /// Why the configured endpoint could not provide the required test data. + /// Strict integration mode requires the missing live test data. + /// The test data is unavailable in ordinary integration mode. + public static void ReportUnavailableData(string reason) + { + if (IsStrict) + throw new InvalidOperationException(reason); + + Assert.Inconclusive(reason); + } + private static string Resolve(string variable, string fallback) => Environment.GetEnvironmentVariable(variable) is { Length: > 0 } value ? value : fallback; diff --git a/tests/SolSharp.IntegrationTests/IntegrationEnvironmentTests.cs b/tests/SolSharp.IntegrationTests/IntegrationEnvironmentTests.cs index 5748a45..5a57654 100644 --- a/tests/SolSharp.IntegrationTests/IntegrationEnvironmentTests.cs +++ b/tests/SolSharp.IntegrationTests/IntegrationEnvironmentTests.cs @@ -13,6 +13,7 @@ public sealed class IsTransient [TestCase(-32602)] // Invalid params. [TestCase(-32002)] // Transaction simulation failed. [TestCase(-32003)] // Signature verification failure. + [TestCase(-32015)] // Unsupported transaction version. public void DeterministicRpcFailure_ReturnsFalse(int code) { // Act @@ -53,6 +54,40 @@ public void WrappedRpcFailure_UsesInnerRpcClassification(int code, bool expected } } + [TestFixture] + [NonParallelizable] + public sealed class ReportUnavailableData + { + [TestCase(null, false)] + [TestCase("false", false)] + [TestCase("1", true)] + [TestCase("TRUE", true)] + public void MissingData_RespectsStrictMode(string? strictMode, bool shouldFail) + { + // Arrange + const string variable = "SOLSHARP_INTEGRATION_STRICT"; + const string reason = "No V1 transaction was available in the bounded block sample."; + var previous = Environment.GetEnvironmentVariable(variable); + Environment.SetEnvironmentVariable(variable, strictMode); + + try + { + // Act + var act = () => IntegrationEnvironment.ReportUnavailableData(reason); + + // Assert + if (shouldFail) + act.Should().Throw().WithMessage(reason); + else + act.Should().Throw().WithMessage(reason); + } + finally + { + Environment.SetEnvironmentVariable(variable, previous); + } + } + } + [TestFixture] public sealed class ValidateDevnetGenesisHash { diff --git a/tests/SolSharp.IntegrationTests/RpcReadIntegrationTests.cs b/tests/SolSharp.IntegrationTests/RpcReadIntegrationTests.cs index e976183..ec33f00 100644 --- a/tests/SolSharp.IntegrationTests/RpcReadIntegrationTests.cs +++ b/tests/SolSharp.IntegrationTests/RpcReadIntegrationTests.cs @@ -1,8 +1,10 @@ +using System.Text.Json; using System.Threading.RateLimiting; using FluentAssertions; using Microsoft.Extensions.DependencyInjection; using NUnit.Framework; using SolSharp.Core.Primitives; +using SolSharp.Programs; using SolSharp.Rpc; using SolSharp.Rpc.Models; using SolSharp.Rpc.Models.Token2022; @@ -80,6 +82,92 @@ public async Task ReturnsCoreVersion() } } + [TestFixture] + [Category("Integration")] + public sealed class GetTransactionAsync + { + [Test] + public async Task DefaultReads_DecodeAndVerifyALiveV1Transaction() + { + // Arrange + using var provider = CreateProvider(); + var client = provider.GetRequiredService(); + var signature = await FindV1SignatureAsync(client); + + // Act + var raw = await IntegrationEnvironment.CallAsync( + () => client.GetTransactionAsync(signature, Commitment.Finalized)); + var parsed = await IntegrationEnvironment.CallAsync( + () => client.GetParsedTransactionAsync(signature, Commitment.Finalized)); + + // Assert + raw.Should().NotBeNull("the selected V1 transaction must remain available during the test"); + parsed.Should().NotBeNull(); + raw.Version.Should().Be(RpcTransactionVersion.FromNumber(1)); + parsed.Version.Should().Be(raw.Version); + parsed.Slot.Should().Be(raw.Slot); + raw.Transaction[0].Should().Be(MessageV1.VersionPrefix); + + var transaction = Transaction.Deserialize(raw.Transaction); + transaction.Version.Should().Be(TransactionVersion.V1); + transaction.Signatures[0].ToString().Should().Be(signature); + transaction.Serialize().Should().Equal(raw.Transaction); + transaction.VerifySignatures().Should().BeTrue(); + + var message = transaction.Message.Should().BeOfType().Subject; + parsed.Signatures.Should().Equal(transaction.Signatures.Select(static value => value.ToString())); + parsed.Message.AccountKeys.Select(static account => account.Pubkey).Should().Equal(message.AccountKeys); + parsed.Message.RecentBlockhash.Should().Be(message.LifetimeSpecifier.ToString()); + parsed.Message.AddressTableLookups.Should().BeNull(); + parsed.Message.Instructions.Should().HaveCount(message.Instructions.Count); + parsed.Message.TransactionConfig.Should().NotBeNull(); + var config = parsed.Message.TransactionConfig!; + config.PriorityFee.Should().Be(message.Config.PriorityFee); + config.ComputeUnitLimit.Should().Be(message.Config.ComputeUnitLimit); + config.LoadedAccountsDataSizeLimit.Should().Be(message.Config.LoadedAccountsDataSizeLimit); + config.HeapSize.Should().Be(message.Config.HeapSize); + } + + private static async Task FindV1SignatureAsync(SolanaRpcClient client) + { + if (Environment.GetEnvironmentVariable("SOLSHARP_V1_TRANSACTION_SIGNATURE") is { Length: > 0 } configured) + return configured; + + var slot = await IntegrationEnvironment.CallAsync(() => client.GetSlotAsync(Commitment.Finalized)); + var startSlot = slot > 32 ? slot - 32 : 0; + var blocks = await IntegrationEnvironment.CallAsync( + () => client.GetBlocksWithLimitAsync(startSlot, 3, Commitment.Finalized)); + + // Bound discovery to three blocks and omit instructions; no cluster-specific address is needed. + foreach (var blockSlot in blocks.Take(3)) + { + var block = await IntegrationEnvironment.CallAsync(() => client.GetBlockWithOptionsAsync(blockSlot, new() + { + Commitment = Commitment.Finalized, + Encoding = RpcTransactionEncoding.Json, + TransactionDetails = RpcTransactionDetails.Accounts, + Rewards = false, + MaxSupportedTransactionVersion = 1, + })); + + if (block is not { } value) + continue; + + foreach (var transaction in value.GetProperty("transactions").EnumerateArray()) + { + var version = transaction.GetProperty("version"); + if (version.ValueKind == JsonValueKind.Number && version.GetByte() == 1) + return transaction.GetProperty("transaction").GetProperty("signatures")[0].GetString()!; + } + } + + IntegrationEnvironment.ReportUnavailableData( + "No V1 transaction was found in at most three recent finalized blocks. " + + "Set SOLSHARP_V1_TRANSACTION_SIGNATURE to a V1 signature available on the configured cluster."); + throw new InvalidOperationException("The missing-data handler must end the test."); + } + } + [TestFixture] [Category("Integration")] public sealed class GetParsedTransactionAsync diff --git a/tests/SolSharp.IntegrationTests/SolSharp.IntegrationTests.csproj b/tests/SolSharp.IntegrationTests/SolSharp.IntegrationTests.csproj index 9c6106a..4c10c26 100644 --- a/tests/SolSharp.IntegrationTests/SolSharp.IntegrationTests.csproj +++ b/tests/SolSharp.IntegrationTests/SolSharp.IntegrationTests.csproj @@ -7,11 +7,11 @@ - + - + - + diff --git a/tests/SolSharp.IntegrationTests/packages.lock.json b/tests/SolSharp.IntegrationTests/packages.lock.json index e1f9bc1..048b184 100644 --- a/tests/SolSharp.IntegrationTests/packages.lock.json +++ b/tests/SolSharp.IntegrationTests/packages.lock.json @@ -13,27 +13,27 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.9.0, )", - "resolved": "18.9.0", - "contentHash": "xIzVXa/VpKXqDWzyC/5Hw8JbFY5u9k3Jc53CpcjBiOXvkQGio484LD9FNwOiGUSMDcYL3Rcw9sNgGi5WrswlPQ==", + "requested": "[18.10.1, )", + "resolved": "18.10.1", + "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", "dependencies": { - "Microsoft.CodeCoverage": "18.9.0", - "Microsoft.TestPlatform.TestHost": "18.9.0" + "Microsoft.CodeCoverage": "18.10.1", + "Microsoft.TestPlatform.TestHost": "18.10.1" } }, "NUnit": { @@ -44,13 +44,13 @@ }, "NUnit3TestAdapter": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==", + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "8ZD+0dIfDHsL4w4Gl/LPxWH0O4ky3hFXqTZjY+ry0ThI3cMVErr9Tjxal5O5wJxGXh50a9qkDEAWVca8KQYCEw==", "dependencies": { "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0", - "Microsoft.Testing.Platform.MSBuild": "2.1.0" + "Microsoft.Testing.Extensions.VSTestBridge": "2.3.3", + "Microsoft.Testing.Platform.MSBuild": "2.3.3" } }, "StyleCop.Analyzers": { @@ -74,65 +74,65 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "MtegCIKGuG0r/LCdIjoR1HgzCGIUBhR3aNdbtQpts5vMXQuqBDZ2Jsd2uFKoHFM2XrQV6ZrDf3F5oLi3SLTp8w==" + "resolved": "18.10.1", + "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyModel": { @@ -142,235 +142,235 @@ }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==", + "resolved": "2.3.3", + "contentHash": "nY8ceQyPWB9TRE1WE5Oe/sks2e10SxgPv61vBHsFYpgCeDtNwhpMZwmL29GklO3/etTdOsLdrCmNr4zJWaR2fg==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==", + "resolved": "2.3.3", + "contentHash": "dceVNxnfTEjKnrIreLcMfkgrzzBY8kgCCJX5NAv7Lq/6vPlTP4VB5zxKeuYy0yfCoBtWuPkLjUG6qtOBMfpypA==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==", + "resolved": "2.3.3", + "contentHash": "JLovZjH6K10YiHO/BcidsaSHo/M2DfOe9FDjxjFdV6aoHO6VYTTYlLBNcyLJSo20q5gDTmNvmxYVH39A942aJA==", "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.TestPlatform.ObjectModel": "18.4.0", + "Microsoft.Testing.Extensions.Telemetry": "2.3.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.3.3", + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg==" + "resolved": "2.3.3", + "contentHash": "ENbH4BQh9riXtOKc25KKITfiGGWhWMBJA7pZuNaF9zxzzSaVkp5AMeZxGQ6sXYaR6xb724NLz985Is6XIYqLSg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==", + "resolved": "2.3.3", + "contentHash": "iVAvNbZ5JPDZSrTcIrCDoCsAkzjDxwDEt2mDuMd8ng1P6e2P2NCd0g0BsoBVG+nJLSmK//V+yeEvjCa3E2fxHw==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Fz/qXC52VXXopzHj7v2reCKcCqSxkTDCkEDfkNAH0vni/7qK/KLMiEYtRmnUanxO2F2g2zZZ60qCpxF0AF7URA==" + "resolved": "18.10.1", + "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Oq+Pma/J86aZL72t71bcESvDszDsTjUfl6PIsuDdPoKTHZfNMhKamCfLD5fKx51W/u0KozXtJo2/3fnt0sgPxg==", + "resolved": "18.10.1", + "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.9.0" + "Microsoft.TestPlatform.ObjectModel": "18.10.1" } }, "Microsoft.Win32.SystemEvents": { @@ -469,17 +469,17 @@ "solsharp.programs": { "type": "Project", "dependencies": { - "SolSharp.Core": "[3.2.0, )", - "SolSharp.Wallet": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )", + "SolSharp.Wallet": "[4.0.0, )" } }, "solsharp.rpc": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Http": "[10.0.10, )", - "Microsoft.Extensions.Http.Resilience": "[10.8.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.10, )", - "SolSharp.Core": "[3.2.0, )" + "Microsoft.Extensions.Http": "[10.0.12, )", + "Microsoft.Extensions.Http.Resilience": "[10.10.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", + "SolSharp.Core": "[4.0.0, )" } }, "solsharp.wallet": { @@ -487,7 +487,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/tests/SolSharp.Programs.Tests/LoaderProgramParityTests.cs b/tests/SolSharp.Programs.Tests/LoaderProgramParityTests.cs index 92ab3dd..560579c 100644 --- a/tests/SolSharp.Programs.Tests/LoaderProgramParityTests.cs +++ b/tests/SolSharp.Programs.Tests/LoaderProgramParityTests.cs @@ -427,7 +427,7 @@ public void ValidUninitialized_ReturnsState() // Assert parsed.Should().BeTrue(); state.Should().NotBeNull(); - state!.Kind.Should().Be(UpgradeableBpfLoaderStateKind.Uninitialized); + state.Kind.Should().Be(UpgradeableBpfLoaderStateKind.Uninitialized); } [Test] @@ -603,7 +603,7 @@ public void ValidHeader_ReturnsState() // Assert parsed.Should().BeTrue(); state.Should().NotBeNull(); - state!.Status.Should().Be(LoaderV4Status.Finalized); + state.Status.Should().Be(LoaderV4Status.Finalized); } [Test] diff --git a/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj b/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj index 9e72b85..f444003 100644 --- a/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj +++ b/tests/SolSharp.Programs.Tests/SolSharp.Programs.Tests.csproj @@ -7,9 +7,9 @@ - + - + diff --git a/tests/SolSharp.Programs.Tests/TransferHookProgramTests.cs b/tests/SolSharp.Programs.Tests/TransferHookProgramTests.cs index 73757ed..d9482c6 100644 --- a/tests/SolSharp.Programs.Tests/TransferHookProgramTests.cs +++ b/tests/SolSharp.Programs.Tests/TransferHookProgramTests.cs @@ -163,7 +163,7 @@ public void ListValueWithWholeSpareCapacityEntry_IsAccepted() // Assert decoded.Should().ContainSingle(); - decoded![0].Encode().Should().Equal(meta.Encode()); + decoded[0].Encode().Should().Equal(meta.Encode()); } } diff --git a/tests/SolSharp.Programs.Tests/packages.lock.json b/tests/SolSharp.Programs.Tests/packages.lock.json index e78b727..f61f0cd 100644 --- a/tests/SolSharp.Programs.Tests/packages.lock.json +++ b/tests/SolSharp.Programs.Tests/packages.lock.json @@ -29,18 +29,18 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.9.0, )", - "resolved": "18.9.0", - "contentHash": "xIzVXa/VpKXqDWzyC/5Hw8JbFY5u9k3Jc53CpcjBiOXvkQGio484LD9FNwOiGUSMDcYL3Rcw9sNgGi5WrswlPQ==", + "requested": "[18.10.1, )", + "resolved": "18.10.1", + "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", "dependencies": { - "Microsoft.CodeCoverage": "18.9.0", - "Microsoft.TestPlatform.TestHost": "18.9.0" + "Microsoft.CodeCoverage": "18.10.1", + "Microsoft.TestPlatform.TestHost": "18.10.1" } }, "NSubstitute": { @@ -60,13 +60,13 @@ }, "NUnit3TestAdapter": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==", + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "8ZD+0dIfDHsL4w4Gl/LPxWH0O4ky3hFXqTZjY+ry0ThI3cMVErr9Tjxal5O5wJxGXh50a9qkDEAWVca8KQYCEw==", "dependencies": { "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0", - "Microsoft.Testing.Platform.MSBuild": "2.1.0" + "Microsoft.Testing.Extensions.VSTestBridge": "2.3.3", + "Microsoft.Testing.Platform.MSBuild": "2.3.3" } }, "StyleCop.Analyzers": { @@ -111,8 +111,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "MtegCIKGuG0r/LCdIjoR1HgzCGIUBhR3aNdbtQpts5vMXQuqBDZ2Jsd2uFKoHFM2XrQV6ZrDf3F5oLi3SLTp8w==" + "resolved": "18.10.1", + "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", @@ -121,56 +121,56 @@ }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==", + "resolved": "2.3.3", + "contentHash": "nY8ceQyPWB9TRE1WE5Oe/sks2e10SxgPv61vBHsFYpgCeDtNwhpMZwmL29GklO3/etTdOsLdrCmNr4zJWaR2fg==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==", + "resolved": "2.3.3", + "contentHash": "dceVNxnfTEjKnrIreLcMfkgrzzBY8kgCCJX5NAv7Lq/6vPlTP4VB5zxKeuYy0yfCoBtWuPkLjUG6qtOBMfpypA==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==", + "resolved": "2.3.3", + "contentHash": "JLovZjH6K10YiHO/BcidsaSHo/M2DfOe9FDjxjFdV6aoHO6VYTTYlLBNcyLJSo20q5gDTmNvmxYVH39A942aJA==", "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.TestPlatform.ObjectModel": "18.4.0", + "Microsoft.Testing.Extensions.Telemetry": "2.3.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.3.3", + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg==" + "resolved": "2.3.3", + "contentHash": "ENbH4BQh9riXtOKc25KKITfiGGWhWMBJA7pZuNaF9zxzzSaVkp5AMeZxGQ6sXYaR6xb724NLz985Is6XIYqLSg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==", + "resolved": "2.3.3", + "contentHash": "iVAvNbZ5JPDZSrTcIrCDoCsAkzjDxwDEt2mDuMd8ng1P6e2P2NCd0g0BsoBVG+nJLSmK//V+yeEvjCa3E2fxHw==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Fz/qXC52VXXopzHj7v2reCKcCqSxkTDCkEDfkNAH0vni/7qK/KLMiEYtRmnUanxO2F2g2zZZ60qCpxF0AF7URA==" + "resolved": "18.10.1", + "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Oq+Pma/J86aZL72t71bcESvDszDsTjUfl6PIsuDdPoKTHZfNMhKamCfLD5fKx51W/u0KozXtJo2/3fnt0sgPxg==", + "resolved": "18.10.1", + "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.9.0" + "Microsoft.TestPlatform.ObjectModel": "18.10.1" } }, "Microsoft.Win32.SystemEvents": { @@ -245,8 +245,8 @@ "solsharp.programs": { "type": "Project", "dependencies": { - "SolSharp.Core": "[3.2.0, )", - "SolSharp.Wallet": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )", + "SolSharp.Wallet": "[4.0.0, )" } }, "solsharp.wallet": { @@ -254,7 +254,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/tests/SolSharp.Rpc.Tests/SolSharp.Rpc.Tests.csproj b/tests/SolSharp.Rpc.Tests/SolSharp.Rpc.Tests.csproj index b249103..66cf691 100644 --- a/tests/SolSharp.Rpc.Tests/SolSharp.Rpc.Tests.csproj +++ b/tests/SolSharp.Rpc.Tests/SolSharp.Rpc.Tests.csproj @@ -7,16 +7,16 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + diff --git a/tests/SolSharp.Rpc.Tests/SolanaRpcClientChainTests.cs b/tests/SolSharp.Rpc.Tests/SolanaRpcClientChainTests.cs index 6e3ed06..db9b6df 100644 --- a/tests/SolSharp.Rpc.Tests/SolanaRpcClientChainTests.cs +++ b/tests/SolSharp.Rpc.Tests/SolanaRpcClientChainTests.cs @@ -133,6 +133,7 @@ public async Task ParsesBlock() block.Signatures.Should().Equal("sig1", "sig2"); handler.CapturedRequestBody.Should().Contain("\"getBlock\""); handler.CapturedRequestBody.Should().Contain("\"transactionDetails\":\"signatures\""); + handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); } [Test] @@ -165,20 +166,23 @@ public async Task MissingMandatoryBlockFields_ThrowsJsonException() [TestFixture] public sealed class GetBlockWithMaxVersionAsync { - [Test] - public async Task ExplicitVersionOptIn_SendsVersionOne() + [TestCase((byte)0)] + [TestCase((byte)1)] + [TestCase(byte.MaxValue)] + public async Task ExplicitVersion_IsSentUnchanged(byte version) { // Arrange var (client, handler) = Make( """{"jsonrpc":"2.0","result":{"blockhash":"Ckt","previousBlockhash":"Prev","parentSlot":99,"blockHeight":null,"blockTime":null,"signatures":[]},"id":1}"""); // Act - var block = await client.GetBlockWithMaxVersionAsync(100, maxSupportedTransactionVersion: 1); + var block = await client.GetBlockWithMaxVersionAsync(100, version); // Assert block.Should().NotBeNull(); handler.CapturedRequestBody.Should().Contain("\"transactionDetails\":\"signatures\""); - handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); + using var request = System.Text.Json.JsonDocument.Parse(handler.CapturedRequestBody!); + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetByte().Should().Be(version); } } } diff --git a/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfigParityTests.cs b/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfigParityTests.cs index eaa5786..76ff420 100644 --- a/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfigParityTests.cs +++ b/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfigParityTests.cs @@ -1,6 +1,7 @@ using FluentAssertions; using NUnit.Framework; using SolSharp.Core.Primitives; +using SolSharp.Rpc.Protocol; namespace SolSharp.Rpc.Tests; @@ -599,6 +600,51 @@ public async Task IncludedList_ParsesPublicKeysAndSendsFalse() [TestFixture] public sealed class GetBlockWithOptionsAsync { + [Test] + public async Task DefaultOptions_AdvertiseVersionOne() + { + // Arrange + var (client, handler) = Make("null"); + + // Act + var block = await client.GetBlockWithOptionsAsync(5, new()); + + // Assert + block.Should().BeNull(); + handler.CapturedRequestBody.Should().Be( + """{"jsonrpc":"2.0","id":1,"method":"getBlock","params":[5,{"maxSupportedTransactionVersion":1}]}"""); + } + + [TestCase(RpcTransactionEncoding.Base58, (byte)0, """{"maxSupportedTransactionVersion":0,"encoding":"base58"}""")] + [TestCase(RpcTransactionEncoding.Binary, null, """{"encoding":"binary"}""")] + public async Task ExplicitVersionAndEncoding_ArePreserved( + RpcTransactionEncoding encoding, byte? version, string expectedConfig) + { + // Arrange + var (client, handler) = Make("null"); + + // Act + await client.GetBlockWithOptionsAsync(5, new() { Encoding = encoding, MaxSupportedTransactionVersion = version }); + + // Assert + handler.CapturedRequestBody.Should().Be( + $$"""{"jsonrpc":"2.0","id":1,"method":"getBlock","params":[5,{{expectedConfig}}]}"""); + } + + [Test] + public async Task NullOptions_ThrowsBeforeTransport() + { + // Arrange + var (client, handler) = Make("null"); + + // Act + var act = () => client.GetBlockWithOptionsAsync(5, null!); + + // Assert + await act.Should().ThrowAsync().WithParameterName("options"); + handler.CapturedRequestBody.Should().BeNull(); + } + [Test] public async Task ExactConfig_ReturnsUnprojectedResponseKat() { @@ -627,6 +673,83 @@ public async Task ExactConfig_ReturnsUnprojectedResponseKat() [TestFixture] public sealed class GetTransactionWithOptionsAsync { + [Test] + public async Task DefaultOptions_AdvertiseVersionOneAndOmitFreshnessFields() + { + // Arrange + var (client, handler) = Make("null"); + + // Act + var transaction = await client.GetTransactionWithOptionsAsync("signature", new()); + + // Assert + transaction.Should().BeNull(); + handler.CapturedRequestBody.Should().Be( + """{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["signature",{"maxSupportedTransactionVersion":1}]}"""); + } + + [TestCase(RpcTransactionEncoding.Base58, (byte)0, """{"maxSupportedTransactionVersion":0,"encoding":"base58"}""")] + [TestCase(RpcTransactionEncoding.Binary, null, """{"encoding":"binary"}""")] + public async Task ExplicitVersionAndEncoding_ArePreserved( + RpcTransactionEncoding encoding, byte? version, string expectedConfig) + { + // Arrange + var (client, handler) = Make("null"); + + // Act + await client.GetTransactionWithOptionsAsync("signature", new() { Encoding = encoding, MaxSupportedTransactionVersion = version }); + + // Assert + handler.CapturedRequestBody.Should().Be( + $$"""{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["signature",{{expectedConfig}}]}"""); + } + + [TestCase(Commitment.Confirmed, 0ul)] + [TestCase(Commitment.Finalized, ulong.MaxValue)] + public async Task MinContextSlot_IsSentWithoutTruncation(Commitment commitment, ulong minContextSlot) + { + // Arrange + var (client, handler) = Make("null"); + + // Act + await client.GetTransactionWithOptionsAsync("signature", new() { Commitment = commitment, MinContextSlot = minContextSlot }); + + // Assert + using var request = System.Text.Json.JsonDocument.Parse(handler.CapturedRequestBody!); + request.RootElement.GetProperty("params")[1].GetProperty("minContextSlot").GetUInt64().Should().Be(minContextSlot); + } + + [Test] + public async Task MinContextSlotNotReached_PreservesNodeError() + { + // Arrange + var handler = new FakeHttpMessageHandler( + """{"jsonrpc":"2.0","error":{"code":-32016,"message":"Minimum context slot has not been reached","data":{"contextSlot":41}},"id":1}"""); + var client = new SolanaRpcClient(new(handler) { BaseAddress = new("http://localhost") }); + + // Act + var act = () => client.GetTransactionWithOptionsAsync("signature", new() { MinContextSlot = 42 }); + + // Assert + var error = (await act.Should().ThrowAsync()).Which; + error.Code.Should().Be(-32016); + error.ErrorData!.Value.GetProperty("contextSlot").GetUInt64().Should().Be(41); + } + + [Test] + public async Task NullOptions_ThrowsBeforeTransport() + { + // Arrange + var (client, handler) = Make("null"); + + // Act + var act = () => client.GetTransactionWithOptionsAsync("signature", null!); + + // Assert + await act.Should().ThrowAsync().WithParameterName("options"); + handler.CapturedRequestBody.Should().BeNull(); + } + [Test] public async Task ExactEncoding_ReturnsUnprojectedResponseKat() { @@ -636,7 +759,8 @@ public async Task ExactEncoding_ReturnsUnprojectedResponseKat() { Encoding = RpcTransactionEncoding.Json, Commitment = Commitment.Confirmed, - MaxSupportedTransactionVersion = 1 + MaxSupportedTransactionVersion = 1, + MinContextSlot = 42 }; // Act @@ -645,7 +769,7 @@ public async Task ExactEncoding_ReturnsUnprojectedResponseKat() // Assert result!.Value.GetProperty("transaction").GetProperty("message").GetProperty("opaque").GetInt32().Should().Be(7); handler.CapturedRequestBody.Should().Be( - """{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["signature",{"commitment":"confirmed","maxSupportedTransactionVersion":1,"encoding":"json"}]}"""); + """{"jsonrpc":"2.0","id":1,"method":"getTransaction","params":["signature",{"commitment":"confirmed","maxSupportedTransactionVersion":1,"encoding":"json","minContextSlot":42}]}"""); } [Test] diff --git a/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfirmTests.cs b/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfirmTests.cs index dc09a19..ac94460 100644 --- a/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfirmTests.cs +++ b/tests/SolSharp.Rpc.Tests/SolanaRpcClientConfirmTests.cs @@ -50,7 +50,8 @@ public async Task ParsesStatusesAndPreservesNulls() statuses[0]!.ConfirmationStatus.Should().Be("confirmed"); statuses[0]!.IsError.Should().BeFalse(); statuses[1].Should().BeNull(); - handler.CapturedRequestBody.Should().Contain("\"getSignatureStatuses\""); + handler.CapturedRequestBody.Should().Be( + """{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["Sig111","Sig222"],{"searchTransactionHistory":false}]}"""); } [TestCase("{}")] @@ -75,6 +76,123 @@ public async Task MalformedStatus_ThrowsJsonException(string status) } } + [TestFixture] + public sealed class GetSignatureStatusesWithOptionsAsync + { + [Test] + public async Task DefaultOptions_PreserveProcessedBankRequestAndNullStatuses() + { + // Arrange + var (client, handler) = Make( + """{"jsonrpc":"2.0","result":{"context":{"slot":1},"value":[null]},"id":1}"""); + + // Act + var statuses = await client.GetSignatureStatusesWithOptionsAsync(["signature"], new()); + + // Assert + statuses.Should().ContainSingle().Which.Should().BeNull(); + handler.CapturedRequestBody.Should().Be( + """{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["signature"],{"searchTransactionHistory":false}]}"""); + } + + [TestCase(Commitment.Processed, "processed")] + [TestCase(Commitment.Confirmed, "confirmed")] + [TestCase(Commitment.Finalized, "finalized")] + public async Task ExplicitOptions_SendExactConfigAndParseStatuses(Commitment commitment, string wireCommitment) + { + // Arrange + var (client, handler) = Make(ConfirmedStatus); + var options = new GetSignatureStatusesOptions + { + SearchTransactionHistory = true, + Commitment = commitment, + MinContextSlot = 42 + }; + + // Act + var statuses = await client.GetSignatureStatusesWithOptionsAsync(["signature"], options); + + // Assert + statuses.Should().ContainSingle().Which!.ConfirmationStatus.Should().Be("confirmed"); + handler.CapturedRequestBody.Should().Be( + $$"""{"jsonrpc":"2.0","id":1,"method":"getSignatureStatuses","params":[["signature"],{"searchTransactionHistory":true,"commitment":"{{wireCommitment}}","minContextSlot":42}]}"""); + } + + [TestCase(0ul)] + [TestCase(ulong.MaxValue)] + public async Task MinContextSlot_IsSentWithoutTruncationOrImplicitCommitment(ulong minContextSlot) + { + // Arrange + var (client, handler) = Make(ConfirmedStatus); + + // Act + await client.GetSignatureStatusesWithOptionsAsync(["signature"], new() { MinContextSlot = minContextSlot }); + + // Assert + using var request = JsonDocument.Parse(handler.CapturedRequestBody!); + var config = request.RootElement.GetProperty("params")[1]; + config.GetProperty("minContextSlot").GetUInt64().Should().Be(minContextSlot); + config.TryGetProperty("commitment", out _).Should().BeFalse(); + } + + [Test] + public async Task MinContextSlotNotReached_PreservesNodeError() + { + // Arrange + var (client, _) = Make( + """{"jsonrpc":"2.0","error":{"code":-32016,"message":"Minimum context slot has not been reached","data":{"contextSlot":41}},"id":1}"""); + + // Act + var act = () => client.GetSignatureStatusesWithOptionsAsync(["signature"], new() { MinContextSlot = 42 }); + + // Assert + var error = (await act.Should().ThrowAsync()).Which; + error.Code.Should().Be(-32016); + error.ErrorData!.Value.GetProperty("contextSlot").GetUInt64().Should().Be(41); + } + + [Test] + public async Task MissingContextValue_ThrowsJsonException() + { + // Arrange + var (client, _) = Make("""{"jsonrpc":"2.0","result":{"context":{"slot":1}},"id":1}"""); + + // Act + var act = () => client.GetSignatureStatusesWithOptionsAsync(["signature"], new()); + + // Assert + await act.Should().ThrowAsync(); + } + + [Test] + public async Task NullSignatures_ThrowsBeforeTransport() + { + // Arrange + var (client, handler) = Make(ConfirmedStatus); + + // Act + var act = () => client.GetSignatureStatusesWithOptionsAsync(null!, new()); + + // Assert + await act.Should().ThrowAsync().WithParameterName("signatures"); + handler.CapturedRequestBody.Should().BeNull(); + } + + [Test] + public async Task NullOptions_ThrowsBeforeTransport() + { + // Arrange + var (client, handler) = Make(ConfirmedStatus); + + // Act + var act = () => client.GetSignatureStatusesWithOptionsAsync(["signature"], null!); + + // Assert + await act.Should().ThrowAsync().WithParameterName("options"); + handler.CapturedRequestBody.Should().BeNull(); + } + } + [TestFixture] public sealed class ConfirmTransactionAsync { diff --git a/tests/SolSharp.Rpc.Tests/SolanaRpcClientGetTransactionTests.cs b/tests/SolSharp.Rpc.Tests/SolanaRpcClientGetTransactionTests.cs index b4b388e..d7c8ba6 100644 --- a/tests/SolSharp.Rpc.Tests/SolanaRpcClientGetTransactionTests.cs +++ b/tests/SolSharp.Rpc.Tests/SolanaRpcClientGetTransactionTests.cs @@ -47,7 +47,7 @@ public async Task ParsesSlotBlockTimeAndMeta() handler.CapturedRequestBody.Should().Contain("\"getTransaction\""); handler.CapturedRequestBody.Should().Contain("Sig1111"); - handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":0"); + handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); } [Test] @@ -64,15 +64,14 @@ public async Task ReturnsNullWhenNotFound() } [Test] - public async Task ExplicitVersionOptIn_SendsVersionOneAndPreservesOpaqueBytes() + public async Task DefaultVersionOne_PreservesOpaqueBytes() { // Arrange var (client, handler) = Make( """{"jsonrpc":"2.0","result":{"slot":101,"blockTime":null,"transaction":["gQECAw==","base64"],"meta":null,"version":1},"id":1}"""); // Act - var transaction = await client.GetTransactionWithMaxVersionAsync( - "SigV1", maxSupportedTransactionVersion: 1); + var transaction = await client.GetTransactionAsync("SigV1"); // Assert transaction!.Version.Should().Be(RpcTransactionVersion.FromNumber(1)); @@ -187,4 +186,25 @@ public async Task ParsesCurrentMetadataAndLegacyVersion() reward.CommissionBps.Should().Be(725); } } + + [TestFixture] + public sealed class GetTransactionWithMaxVersionAsync + { + [TestCase((byte)0)] + [TestCase((byte)1)] + [TestCase(byte.MaxValue)] + public async Task ExplicitVersion_IsSentUnchanged(byte version) + { + // Arrange + var (client, handler) = Make("""{"jsonrpc":"2.0","result":null,"id":1}"""); + + // Act + var transaction = await client.GetTransactionWithMaxVersionAsync("signature", version); + + // Assert + transaction.Should().BeNull(); + using var request = JsonDocument.Parse(handler.CapturedRequestBody!); + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetByte().Should().Be(version); + } + } } diff --git a/tests/SolSharp.Rpc.Tests/SolanaRpcClientParsedTransactionTests.cs b/tests/SolSharp.Rpc.Tests/SolanaRpcClientParsedTransactionTests.cs index a5d2315..8e89f6e 100644 --- a/tests/SolSharp.Rpc.Tests/SolanaRpcClientParsedTransactionTests.cs +++ b/tests/SolSharp.Rpc.Tests/SolanaRpcClientParsedTransactionTests.cs @@ -57,6 +57,29 @@ private static (SolanaRpcClient Client, FakeHttpMessageHandler Handler) Make(str [TestFixture] public sealed class GetParsedTransactionAsync { + [Test] + public async Task DefaultVersionOne_PreservesV1TransactionConfig() + { + // Arrange + var (client, handler) = Make( + """{"jsonrpc":"2.0","result":{"slot":10,"blockTime":null,"transaction":{"signatures":["sig-v1"],"message":{"accountKeys":[],"instructions":[],"recentBlockhash":"CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8","transactionConfig":{"priorityFee":9000,"computeUnitLimit":200000,"loadedAccountsDataSizeLimit":65536,"heapSize":32768}}},"meta":null,"version":1},"id":1}"""); + + // Act + var transaction = await client.GetParsedTransactionAsync("sig-v1"); + + // Assert + transaction!.Version.Should().Be(RpcTransactionVersion.FromNumber(1)); + transaction.Message.AddressTableLookups.Should().BeNull(); + transaction.Message.TransactionConfig.Should().NotBeNull(); + var config = transaction.Message.TransactionConfig!; + config.PriorityFee.Should().Be(9000); + config.ComputeUnitLimit.Should().Be(200000); + config.LoadedAccountsDataSizeLimit.Should().Be(65536); + config.HeapSize.Should().Be(32768); + handler.CapturedRequestBody.Should().Contain("\"encoding\":\"jsonParsed\""); + handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); + } + [Test] public async Task ParsesSystemTransfer() { @@ -274,35 +297,56 @@ public async Task ParsesMemoInvokedAsInnerInstruction() [TestFixture] public sealed class GetParsedTransactionWithMaxVersionAsync + { + [TestCase((byte)0)] + [TestCase((byte)1)] + [TestCase(byte.MaxValue)] + public async Task ExplicitVersion_IsSentUnchanged(byte version) + { + // Arrange + var (client, handler) = Make(Transfer); + + // Act + var transaction = await client.GetParsedTransactionWithMaxVersionAsync("sig1aaaa", version); + + // Assert + transaction.Should().NotBeNull(); + using var request = System.Text.Json.JsonDocument.Parse(handler.CapturedRequestBody!); + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetByte().Should().Be(version); + } + } + + [TestFixture] + public sealed class GetParsedBlockAsync { [Test] - public async Task ParsesV1TransactionConfigAndSendsExplicitOptIn() + public async Task DefaultVersionOne_PreservesMixedBlockAndV1TransactionConfig() { // Arrange - var (client, handler) = Make( - """{"jsonrpc":"2.0","result":{"slot":10,"blockTime":null,"transaction":{"signatures":["sig-v1"],"message":{"accountKeys":[],"instructions":[],"recentBlockhash":"CktRuQ2mttgRGkXJtyksdKHjUdc2C4TgDzyB98oEzy8","transactionConfig":{"priorityFee":9000,"computeUnitLimit":200000,"loadedAccountsDataSizeLimit":65536,"heapSize":32768}}},"meta":null,"version":1},"id":1}"""); + var blockJson = BlockJson.Replace( + "\"recentBlockhash\":\"RBh8blktx211111111111111111111111111111111\"", + "\"recentBlockhash\":\"RBh8blktx211111111111111111111111111111111\",\"transactionConfig\":{\"priorityFee\":9000,\"computeUnitLimit\":200000,\"loadedAccountsDataSizeLimit\":65536,\"heapSize\":32768}", + StringComparison.Ordinal) + .Replace("\"meta\":null,\"version\":0", "\"meta\":null,\"version\":1", StringComparison.Ordinal); + var (client, handler) = Make(blockJson); // Act - var transaction = await client.GetParsedTransactionWithMaxVersionAsync( - "sig-v1", maxSupportedTransactionVersion: 1); + var block = await client.GetParsedBlockAsync(250000000); // Assert - transaction!.Version.Should().Be(RpcTransactionVersion.FromNumber(1)); - transaction.Message.AddressTableLookups.Should().BeNull(); - transaction.Message.TransactionConfig.Should().NotBeNull(); + block!.Transactions[0].Version.Should().Be(RpcTransactionVersion.Legacy); + var transaction = block.Transactions[1]; + transaction.Version.Should().Be(RpcTransactionVersion.FromNumber(1)); + transaction.Slot.Should().Be(250000000); + transaction.BlockTime.Should().Be(1700000005); var config = transaction.Message.TransactionConfig!; config.PriorityFee.Should().Be(9000); config.ComputeUnitLimit.Should().Be(200000); config.LoadedAccountsDataSizeLimit.Should().Be(65536); config.HeapSize.Should().Be(32768); - handler.CapturedRequestBody.Should().Contain("\"encoding\":\"jsonParsed\""); handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); } - } - [TestFixture] - public sealed class GetParsedBlockAsync - { [Test] public async Task ParsesTransactionsAndFillsSlotAndBlockTime() { @@ -333,26 +377,30 @@ public async Task ParsesTransactionsAndFillsSlotAndBlockTime() handler.CapturedRequestBody.Should().Contain("getBlock"); handler.CapturedRequestBody.Should().Contain("jsonParsed"); handler.CapturedRequestBody.Should().Contain("full"); + handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); } } [TestFixture] public sealed class GetParsedBlockWithMaxVersionAsync { - [Test] - public async Task ExplicitVersionOptIn_SendsVersionOne() + [TestCase((byte)0)] + [TestCase((byte)1)] + [TestCase(byte.MaxValue)] + public async Task ExplicitVersion_IsSentUnchanged(byte version) { // Arrange var (client, handler) = Make(BlockJson); // Act var block = await client.GetParsedBlockWithMaxVersionAsync( - 250000000, maxSupportedTransactionVersion: 1); + 250000000, version); // Assert block.Should().NotBeNull(); handler.CapturedRequestBody.Should().Contain("\"encoding\":\"jsonParsed\""); - handler.CapturedRequestBody.Should().Contain("\"maxSupportedTransactionVersion\":1"); + using var request = System.Text.Json.JsonDocument.Parse(handler.CapturedRequestBody!); + request.RootElement.GetProperty("params")[1].GetProperty("maxSupportedTransactionVersion").GetByte().Should().Be(version); } } } diff --git a/tests/SolSharp.Rpc.Tests/Streaming/SolanaWsClientTests.cs b/tests/SolSharp.Rpc.Tests/Streaming/SolanaWsClientTests.cs index 42d1c67..dedb987 100644 --- a/tests/SolSharp.Rpc.Tests/Streaming/SolanaWsClientTests.cs +++ b/tests/SolSharp.Rpc.Tests/Streaming/SolanaWsClientTests.cs @@ -7,6 +7,7 @@ using NUnit.Framework; using SolSharp.Core.Constants; using SolSharp.Core.Primitives; +using SolSharp.Rpc.Models; using SolSharp.Rpc.Protocol; using SolSharp.Rpc.Streaming; @@ -2218,6 +2219,108 @@ public async Task NegativeFiniteTimeout_ThrowsArgumentOutOfRange() [TestFixture] public sealed class SubscribeBlocksWithOptionsAsync { + [TestCase((byte)0)] + [TestCase(null)] + public async Task ExplicitVersionOverride_PreservesZeroOrOmission(byte? version) + { + // Arrange + var fake = new FakeWebSocketConnection(); + await using var client = new SolanaWsClient(fake); + await client.ConnectAsync(new("wss://localhost")); + + // Act + var subscribe = client.SubscribeBlocksWithOptionsAsync( + BlockSubscriptionFilter.All, + new() { MaxSupportedTransactionVersion = version }); + await WaitUntil(() => fake.SentCount == 1); + var request = fake.SentSnapshot()[0]; + fake.PushFromServer(Acknowledgement(RequestId(request), subscriptionId: 45)); + _ = await subscribe; + + // Assert + using var document = JsonDocument.Parse(request); + var config = document.RootElement.GetProperty("params")[1]; + if (version.HasValue) + config.GetProperty("maxSupportedTransactionVersion").GetByte().Should().Be(version.Value); + else + config.TryGetProperty("maxSupportedTransactionVersion", out _).Should().BeFalse(); + } + + [Test] + public async Task DefaultAndExplicitOptions_CoalesceWhileVersionOverridesRemainSeparateAfterReconnect() + { + // Arrange + var first = new FakeWebSocketConnection(); + var second = new FakeWebSocketConnection(); + var connections = new[] { first, second }; + var index = -1; + var reconnect = new SolanaWsClientOptions + { + ReconnectInitialDelay = TimeSpan.FromMilliseconds(1), + ReconnectMaxDelay = TimeSpan.FromMilliseconds(1) + }; + await using var client = new SolanaWsClient( + () => connections[Interlocked.Increment(ref index)], reconnect); + await client.ConnectAsync(new("wss://localhost")); + var defaults = client.SubscribeBlocksWithOptionsAsync(BlockSubscriptionFilter.All, new()); + await WaitUntil(() => first.SentCount == 1); + var explicitDefaults = client.SubscribeBlocksWithOptionsAsync( + BlockSubscriptionFilter.All, + new() + { + Commitment = Commitment.Finalized, + Encoding = RpcTransactionEncoding.Base64, + TransactionDetails = RpcTransactionDetails.Full, + ShowRewards = false, + MaxSupportedTransactionVersion = 1 + }); + await WaitUntil(() => client.RetainedPendingSubscriptionReferenceCount == 2); + first.SentCount.Should().Be(1); + first.PushFromServer(Acknowledgement(RequestId(first.SentSnapshot()[0]), subscriptionId: 41)); + var readers = new[] { await defaults, await explicitDefaults }; + + foreach (var version in new byte?[] { 0, null }) + { + var expectedCount = first.SentCount + 1; + var subscribe = client.SubscribeBlocksWithOptionsAsync( + BlockSubscriptionFilter.All, + new() { MaxSupportedTransactionVersion = version }); + await WaitUntil(() => first.SentCount == expectedCount); + first.PushFromServer(Acknowledgement(RequestId(first.SentSnapshot()[^1]), (ulong)(40 + expectedCount))); + _ = await subscribe; + } + + // Act + first.Drop(); + for (var count = 1; count <= 3; count++) + { + var expectedCount = count; + await WaitUntil(() => second.SentCount == expectedCount); + var request = second.SentSnapshot()[^1]; + second.PushFromServer(Acknowledgement(RequestId(request), (ulong)(50 + count))); + } + + // Assert + var replayVersions = second.SentSnapshot().Select(static request => + { + using var document = JsonDocument.Parse(request); + return document.RootElement.GetProperty("params")[1] + .TryGetProperty("maxSupportedTransactionVersion", out var version) + ? version.GetInt32() + : (int?)null; + }); + replayVersions.Should().BeEquivalentTo(new int?[] { 1, 0, null }); + var defaultReplay = second.SentSnapshot().Single(static request => + request.Contains("\"maxSupportedTransactionVersion\":1", StringComparison.Ordinal)); + var defaultReplayIndex = Array.IndexOf(second.SentSnapshot(), defaultReplay); + second.PushFromServer( + """{"jsonrpc":"2.0","method":"blockNotification","params":{"subscription":__SUB__,"result":{"context":{"slot":22},"value":{"slot":22,"err":null,"block":{"opaque":2}}}}}""" + .Replace("__SUB__", (51 + defaultReplayIndex).ToString(CultureInfo.InvariantCulture), StringComparison.Ordinal)); + foreach (var reader in readers) + (await reader.ReadAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(1))) + .Value!.Block!.Value.GetProperty("opaque").GetInt32().Should().Be(2); + } + [Test] public async Task AllFilter_SendsExactPinnedUnionBranch() { @@ -2236,7 +2339,7 @@ public async Task AllFilter_SendsExactPinnedUnionBranch() // Assert await WaitUntil(() => fake.SentCount == 1); fake.SentSnapshot()[0].Should().Be( - """{"jsonrpc":"2.0","id":1,"method":"blockSubscribe","params":["all",{}]}"""); + """{"jsonrpc":"2.0","id":1,"method":"blockSubscribe","params":["all",{"maxSupportedTransactionVersion":1}]}"""); await cancellation.CancelAsync(); } @@ -2327,8 +2430,7 @@ public async Task SharedRouteDecodeFailure_FaultsOnlyTypedSinkAndKeepsRawSinkLiv Commitment = Commitment.Confirmed, Encoding = RpcTransactionEncoding.Json, TransactionDetails = RpcTransactionDetails.Signatures, - ShowRewards = false, - MaxSupportedTransactionVersion = 0 + ShowRewards = false }, rawCancellation.Token); await WaitUntil(() => client.RetainedPendingSubscriptionReferenceCount == 2); @@ -2363,8 +2465,9 @@ await WaitUntil(() => fake.SentSnapshot().Count(static message => [TestFixture] public sealed class SubscribeBlocksWithMaxVersionAsync { - [Test] - public async Task ExplicitVersionOptIn_SendsVersionOne() + [TestCase((byte)0)] + [TestCase((byte)1)] + public async Task ExplicitVersion_SendsRequestedVersion(byte version) { // Arrange var fake = new FakeWebSocketConnection(); @@ -2375,12 +2478,12 @@ public async Task ExplicitVersionOptIn_SendsVersionOne() // Act _ = client.SubscribeBlocksWithMaxVersionAsync( - maxSupportedTransactionVersion: 1, cancellationToken: cts.Token); + maxSupportedTransactionVersion: version, cancellationToken: cts.Token); // Assert await WaitUntil(() => fake.Sent.Count > 0); fake.Sent[0].Should().Contain("\"transactionDetails\":\"signatures\""); - fake.Sent[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); + fake.Sent[0].Should().Contain($"\"maxSupportedTransactionVersion\":{version}"); await cts.CancelAsync(); } @@ -2406,6 +2509,7 @@ public async Task DeliversBlock_ThenUnsubscribesOnCancel() fake.Sent[0].Should().Contain("\"method\":\"blockSubscribe\""); fake.Sent[0].Should().Contain("\"all\""); fake.Sent[0].Should().Contain("\"transactionDetails\":\"signatures\""); + fake.Sent[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); fake.PushFromServer("""{"jsonrpc":"2.0","result":8,"id":1}"""); var reader = await subscribe; @@ -2441,6 +2545,7 @@ public async Task MentionsFilter_SendsAccount() fake.Sent[0].Should().Contain("\"method\":\"blockSubscribe\""); fake.Sent[0].Should().Contain("\"mentionsAccountOrProgram\""); fake.Sent[0].Should().Contain(SolanaProgramIds.TokenProgram); + fake.Sent[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); await cts.CancelAsync(); } @@ -2449,8 +2554,9 @@ public async Task MentionsFilter_SendsAccount() [TestFixture] public sealed class SubscribeParsedBlocksWithMaxVersionAsync { - [Test] - public async Task ExplicitVersionOptIn_SendsVersionOne() + [TestCase((byte)0)] + [TestCase((byte)1)] + public async Task ExplicitVersion_SendsRequestedVersion(byte version) { // Arrange var fake = new FakeWebSocketConnection(); @@ -2461,12 +2567,12 @@ public async Task ExplicitVersionOptIn_SendsVersionOne() // Act _ = client.SubscribeParsedBlocksWithMaxVersionAsync( - maxSupportedTransactionVersion: 1, cancellationToken: cts.Token); + maxSupportedTransactionVersion: version, cancellationToken: cts.Token); // Assert await WaitUntil(() => fake.Sent.Count > 0); fake.Sent[0].Should().Contain("\"encoding\":\"jsonParsed\""); - fake.Sent[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); + fake.Sent[0].Should().Contain($"\"maxSupportedTransactionVersion\":{version}"); await cts.CancelAsync(); } @@ -2475,9 +2581,89 @@ public async Task ExplicitVersionOptIn_SendsVersionOne() [TestFixture] public sealed class SubscribeParsedBlocks { + private const string MixedVersionsNotificationJson = + """ + {"jsonrpc":"2.0","method":"blockNotification","params":{"subscription":9,"result":{"context":{"slot":120},"value":{"slot":120,"err":null,"block":{ + "blockhash":"11111111111111111111111111111111","previousBlockhash":"11111111111111111111111111111111", + "parentSlot":119,"blockHeight":100,"blockTime":1700000010,"transactions":[ + {"transaction":{"signatures":["legacy"],"message":{"accountKeys":[],"instructions":[],"recentBlockhash":"11111111111111111111111111111111"}},"meta":null,"version":"legacy"}, + {"transaction":{"signatures":["v0"],"message":{"accountKeys":[],"instructions":[],"recentBlockhash":"11111111111111111111111111111111","addressTableLookups":[]}},"meta":null,"version":0}, + {"transaction":{"signatures":["v1"],"message":{"accountKeys":[],"instructions":[],"recentBlockhash":"11111111111111111111111111111111","transactionConfig":{"priorityFee":5000,"computeUnitLimit":200000,"loadedAccountsDataSizeLimit":65536,"heapSize":null}}},"meta":null,"version":1} + ] + }}}}} + """; + private const string NotificationJson = """{"jsonrpc":"2.0","method":"blockNotification","params":{"subscription":9,"result":{"context":{"slot":120},"value":{"slot":120,"err":null,"block":{"blockhash":"Pblk1111111111111111111111111111111111111111","previousBlockhash":"Pprev111111111111111111111111111111111111111","parentSlot":119,"blockHeight":100,"blockTime":1700000010,"transactions":[{"transaction":{"signatures":["psig1"],"message":{"accountKeys":[{"pubkey":"3x9az88Dkbxa6tkKByxqEn7jBTJCJCD4dVvou49L24ET","signer":true,"writable":true,"source":"transaction"},{"pubkey":"11111111111111111111111111111111","signer":false,"writable":false,"source":"transaction"}],"instructions":[{"program":"system","programId":"11111111111111111111111111111111","parsed":{"type":"transfer","info":{"lamports":7}},"stackHeight":null}],"recentBlockhash":"Prbh1111111111111111111111111111111111111111"}},"meta":null,"version":"legacy"}]}}}}}"""; + [TestCase(false)] + [TestCase(true)] + public async Task DefaultVersion_DeliversMixedVersionsAndV1ConfigAlongsideEquivalentRawOptions(bool mentions) + { + // Arrange + var fake = new FakeWebSocketConnection(); + await using var client = new SolanaWsClient(fake); + await client.ConnectAsync(new("wss://localhost")); + var account = PublicKey.Parse(SolanaProgramIds.TokenProgram); + var typedSubscribe = mentions + ? client.SubscribeParsedBlocksAsync(account) + : client.SubscribeParsedBlocksAsync(); + await WaitUntil(() => fake.SentCount == 1); + var rawSubscribe = client.SubscribeBlocksWithOptionsAsync( + mentions ? BlockSubscriptionFilter.Mentions(account) : BlockSubscriptionFilter.All, + new() { Commitment = Commitment.Confirmed, Encoding = RpcTransactionEncoding.JsonParsed }); + await WaitUntil(() => client.RetainedPendingSubscriptionReferenceCount == 2); + fake.SentCount.Should().Be(1); + fake.SentSnapshot()[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); + fake.PushFromServer(Acknowledgement(RequestId(fake.SentSnapshot()[0]), subscriptionId: 9)); + var typed = await typedSubscribe; + var raw = await rawSubscribe; + + // Act + fake.PushFromServer(MixedVersionsNotificationJson); + var notification = await typed.ReadAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(1)); + var rawNotification = await raw.ReadAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(1)); + + // Assert + notification.Value!.IsError.Should().BeFalse(); + var transactions = notification.Value.Block!.Transactions; + transactions.Select(static transaction => transaction.Version).Should().Equal( + RpcTransactionVersion.Legacy, RpcTransactionVersion.FromNumber(0), RpcTransactionVersion.FromNumber(1)); + transactions[0].Message.TransactionConfig.Should().BeNull(); + transactions[1].Message.TransactionConfig.Should().BeNull(); + var config = transactions[2].Message.TransactionConfig!; + config.PriorityFee.Should().Be(5_000); + config.ComputeUnitLimit.Should().Be(200_000); + config.LoadedAccountsDataSizeLimit.Should().Be(65_536); + config.HeapSize.Should().BeNull(); + rawNotification.Value!.Block!.Value.GetProperty("transactions")[2] + .GetProperty("transaction").GetProperty("message").GetProperty("transactionConfig") + .GetProperty("priorityFee").GetUInt64().Should().Be(5_000); + } + + [Test] + public async Task UnsupportedVersionNotification_PreservesErrorAndNullBlock() + { + // Arrange + var fake = new FakeWebSocketConnection(); + await using var client = new SolanaWsClient(fake); + await client.ConnectAsync(new("wss://localhost")); + var subscribe = client.SubscribeParsedBlocksWithMaxVersionAsync(0); + await WaitUntil(() => fake.SentCount == 1); + fake.PushFromServer(Acknowledgement(RequestId(fake.SentSnapshot()[0]), subscriptionId: 9)); + var reader = await subscribe; + + // Act + fake.PushFromServer( + """{"jsonrpc":"2.0","method":"blockNotification","params":{"subscription":9,"result":{"context":{"slot":120},"value":{"slot":120,"err":{"UnsupportedTransactionVersion":1},"block":null}}}}"""); + var notification = await reader.ReadAsync().AsTask().WaitAsync(TimeSpan.FromSeconds(1)); + + // Assert + notification.Value!.IsError.Should().BeTrue(); + notification.Value.Block.Should().BeNull(); + notification.Value.Err!.Value.GetProperty("UnsupportedTransactionVersion").GetInt32().Should().Be(1); + } + [Test] public async Task DeliversParsedBlock_WithDecodedInstructions() { @@ -2495,6 +2681,7 @@ public async Task DeliversParsedBlock_WithDecodedInstructions() fake.Sent[0].Should().Contain("\"method\":\"blockSubscribe\""); fake.Sent[0].Should().Contain("\"encoding\":\"jsonParsed\""); fake.Sent[0].Should().Contain("\"transactionDetails\":\"full\""); + fake.Sent[0].Should().Contain("\"maxSupportedTransactionVersion\":1"); fake.PushFromServer("""{"jsonrpc":"2.0","result":9,"id":1}"""); var reader = await subscribe; diff --git a/tests/SolSharp.Rpc.Tests/packages.lock.json b/tests/SolSharp.Rpc.Tests/packages.lock.json index 4aec4de..b658967 100644 --- a/tests/SolSharp.Rpc.Tests/packages.lock.json +++ b/tests/SolSharp.Rpc.Tests/packages.lock.json @@ -19,27 +19,27 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.Extensions.DependencyInjection": { "type": "Direct", - "requested": "[10.0.10, )", - "resolved": "10.0.10", - "contentHash": "ANyvsgkNBRvcJh2XLgn8veGmajf+8m0AbKK+HPWdRL1yraSNVVSmQhFntLtdz/C795jxqqup+k05cs/3jZQPOA==", + "requested": "[10.0.12, )", + "resolved": "10.0.12", + "contentHash": "lXyK2O5GoYvfxW8eCFcD16JFbcoSTM1sJkAM0UHS1jZyl9NYMW64Tqm6OQFT0IDBjZi+xHt95/Zg+nxZhGFhZg==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.9.0, )", - "resolved": "18.9.0", - "contentHash": "xIzVXa/VpKXqDWzyC/5Hw8JbFY5u9k3Jc53CpcjBiOXvkQGio484LD9FNwOiGUSMDcYL3Rcw9sNgGi5WrswlPQ==", + "requested": "[18.10.1, )", + "resolved": "18.10.1", + "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", "dependencies": { - "Microsoft.CodeCoverage": "18.9.0", - "Microsoft.TestPlatform.TestHost": "18.9.0" + "Microsoft.CodeCoverage": "18.10.1", + "Microsoft.TestPlatform.TestHost": "18.10.1" } }, "NSubstitute": { @@ -59,13 +59,13 @@ }, "NUnit3TestAdapter": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==", + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "8ZD+0dIfDHsL4w4Gl/LPxWH0O4ky3hFXqTZjY+ry0ThI3cMVErr9Tjxal5O5wJxGXh50a9qkDEAWVca8KQYCEw==", "dependencies": { "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0", - "Microsoft.Testing.Platform.MSBuild": "2.1.0" + "Microsoft.Testing.Extensions.VSTestBridge": "2.3.3", + "Microsoft.Testing.Platform.MSBuild": "2.3.3" } }, "StyleCop.Analyzers": { @@ -92,65 +92,65 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "MtegCIKGuG0r/LCdIjoR1HgzCGIUBhR3aNdbtQpts5vMXQuqBDZ2Jsd2uFKoHFM2XrQV6ZrDf3F5oLi3SLTp8w==" + "resolved": "18.10.1", + "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" }, "Microsoft.Extensions.AmbientMetadata.Application": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "/FYCIyhRLrDwIg29tB/21/Rp7XMaEP/gWR5Cxyi4GgWcN/v/XXUpU52yhQux0s2SQy1Z0C1wnhptCMvLaaT45Q==", + "resolved": "10.10.0", + "contentHash": "Sa4xD2ab5yNRJYt4piS05C9b5Gpd1G3TZpvVJFgHyqLYdRThUNLcLHpREI4yjkmElCjHXoPcF+SHUim9cZ8cvQ==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Compliance.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "7I0DXMTCqpXpXg+SLLDlfedtv6DN5Lgiv+PR3MclzqKPOHNB17YP42KMNI61ckSrffh0xsuIqQyCIjvWc6vUuw==", + "resolved": "10.10.0", + "contentHash": "Sh3ujDRJpCMNY4x+43ljCROt4qBOoWfsL8l816RPYZS1S+Tw277r5002rbB15Sh6hFcCT8mGYBO7NtpfSYrQ0Q==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12" } }, "Microsoft.Extensions.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "plJWK2zpWuuyxI8F8s2scx6Je7N1Ajjs6HvYUGKwRnDMWIVIz9FHwAkiT7ASgrvAOd10T0FPVlh9BzAJJME+jg==", + "resolved": "10.0.12", + "contentHash": "e3IPP32CRNL031VZJAUTlCTG0YN7WFh4mN3fsSHTDQCJB+3+f0jGycv4fXk3rrftaY3B85XrQaj7sRthrOsavg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5Vnd2I75DmZCVEjSynIdJ/0EGafgnLQwgR3t2C2/fkjx/nRG+cLwxLLdInoHeCEpkD5K4Ov/g9ZCRYrl4TRsaA==", + "resolved": "10.0.12", + "contentHash": "8xaGcvS/qZ1otoxPQCEJkNva389CVL/plNcvIETZhQTETYdRkYDPEYhUMoAGONo4FU45ufdfE0j29AfWVVj0wA==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Configuration.Binder": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "GqmN2o1CkJvk7uWp+p4CwBYW0w/zfoEbvsiFDbO2G8l1Uz+mrDAbAcZiXhU2lufKPby1cjAUdd5GTWpebYOkOA==", + "resolved": "10.0.12", + "contentHash": "dAgIf1TOr8KLs+aBRIbXUZBjHoSH4rDG8+XkX/Q6AZwkQdMA0+yPDKTHsieeXdZDfpOpZVHzOnuAb5Z2nX3KsA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyInjection.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "z/2xXlFw2aLGjHyEm6E0tQ+In6VfzQzTrtArbQ2c0TQE16ZbyDCMGPvaUT9I0s8rgy9sRWlU2P9waW37qV04qA==" + "resolved": "10.0.12", + "contentHash": "9/qymSh7hVDMGTGwrLz8MRp5zRyXy9adGDOs4HwRdnLil3oZGYuWeZjbmHgCQ9BL1qBroVfgUK3U/nb61617Cw==" }, "Microsoft.Extensions.DependencyInjection.AutoActivation": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "LXwOAsnrflu2ln+Bxj7y3Zc/Pn4HquCCRzW81oOIuRsM8F75TxwA/ZpSFZ5E1+YkVpndz7BcHY4ThFSjjA4vbQ==", + "resolved": "10.10.0", + "contentHash": "AJ2lFnzzJkN2ZRvfPBKQ5k3EJFkhmsm1tEhWzK58KsxU+WK3GVOh/5WHUhQ56TWjnxGZCGgr0+U1QUuJ4rJVuA==", "dependencies": { - "Microsoft.Extensions.Hosting.Abstractions": "10.0.10" + "Microsoft.Extensions.Hosting.Abstractions": "10.0.12" } }, "Microsoft.Extensions.DependencyModel": { @@ -160,235 +160,235 @@ }, "Microsoft.Extensions.Diagnostics": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Kr/e7lUf4+N8tacbqJ2Ctwe/HarKdAc9ZkgKVVqvtJDBKbez+T/KnUwu82KSlnBp/SrpBcxc7u7xkE2oUZT/5Q==", + "resolved": "10.0.12", + "contentHash": "amx0O/R4dReqKlC3T740+CHpX8D8tAIV0f5kAPfFi4XK9jYo9BSepGt9/rWfvvCoSMaZ1+XvnqPp/Vv2fmTdAg==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "9uWiKpeOVac355STyChWR/pliFX/5CeLqChW9kKsaxyDH4EUTZxMkT4Jwp/J/peLm0GBFmSX5c0WCse3yCnq1Q==", + "resolved": "10.0.12", + "contentHash": "fMp91qlRlMOuHfMyp7LuAnOS+MOeWTF1obJmyFcs4nZCXu6pr+QB1AbFJcl2qpBltBrqF/Y7+Rn9IuNcSuctig==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Diagnostics.ExceptionSummarization": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "tXmzwQeWgiycaLOtvSFnz0TPkJxXTyZrkwSVPTr83FgSiMj3BD/8eIbvrpGi5rzc2AgfKyegKo1ntJlJFey1Zg==", + "resolved": "10.10.0", + "contentHash": "/6C1XjuRYRXst3QUoFnQdL0Q2ZihDlxr8PQ4jei8MyjVRZEGFg+le6N90d/CdpdgIbDz/h8JIKY1psACYDhPRQ==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.FileProviders.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "c5zqFCY9DiIpMovLd7/d/CTiEtrMOuQ639dhv3PABtKQIKNQikSHwQt8+N679uii9q+B55lgK28Uv64FOwEu8w==", + "resolved": "10.0.12", + "contentHash": "iQseV6HixWzEYQH4i++84ToIroXnM5jC1TJF4EqBz3lWNG1HBTMYDLkRb6Wm3wk5V6WqSfl7NukO/LYsloGyfg==", "dependencies": { - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Hosting.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5LugpYGHk+mkn0a8IZgcyfBca8PCTAU9RQFoMrTdtOOidq88M2SI5f3px6ugnzgxC+eTkvYYJi8pzlUnG5xdAQ==", + "resolved": "10.0.12", + "contentHash": "ZlIxIJtWmrph0Ikj0svSaTkZ+d+ZYpTAhazpf1b3aoFRmlNnNWwkcvqnqT9yKHjKvfBRthvUrkq11OxfItOhpg==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.10", - "Microsoft.Extensions.FileProviders.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics.Abstractions": "10.0.12", + "Microsoft.Extensions.FileProviders.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Http": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "DuEBLw2y7ZBfilnaJtlge8f2M49932v43t7j1InceXVjcZzxNrSEkobYXdgZkXuPFnFbKcbWpAS+fZgYEW1BhA==", + "resolved": "10.0.12", + "contentHash": "x/fnoUGgmIUjSgLR1p6Mpi/vXc1Xe0xDPJnggPp23I6vwM/kY4nxyOjo8i6G5KPVw+esJM+rJsqnHbdjasvCBw==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Http.Diagnostics": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "2pYnolFkigH7N6A5WHdGx93iZ8dIhrBnu4ZkjvB6RwbHzYmIy/iXVe12pdrViNDdeBSmKZ5FA9YP/xhwLT7q7A==", + "resolved": "10.10.0", + "contentHash": "yt9uQJSwh3hJag5NSDGEyWFbPKHaYem0w17TlSgv533NP8Kn56c5si870grJWGSL7aQyeUqxfKvDZxZpFaQUhw==", "dependencies": { - "Microsoft.Extensions.Http": "10.0.10", - "Microsoft.Extensions.Telemetry": "10.8.0" + "Microsoft.Extensions.Http": "10.0.12", + "Microsoft.Extensions.Telemetry": "10.10.0" } }, "Microsoft.Extensions.Http.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XtbZyYVxSNn1Aj2Z0PA8yauS12hPszTWDZ3GtZ5Vww7Ai3d8Pm841jMBnTvoTf1t9mRf3eSB38V5KUWxH6/4oQ==", + "resolved": "10.10.0", + "contentHash": "KZw4jCU4RxHwjOXS7BUal3CnaupEJdGkJ9tPzE1Y2CR5x6IHMuxc6vNNWDiFIlnMa1TKGkta/Dfz3DQiFF1fxQ==", "dependencies": { - "Microsoft.Extensions.Http.Diagnostics": "10.8.0", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Resilience": "10.8.0" + "Microsoft.Extensions.Http.Diagnostics": "10.10.0", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Resilience": "10.10.0" } }, "Microsoft.Extensions.Logging": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tf6z5HsL0VDYRTfvsoNrTGHGheCwkTsZBA2FFh5ATJUbkAwug+FFNISJK2gjpUNemlAOoWllAK52HOWCjto3EQ==", + "resolved": "10.0.12", + "contentHash": "6I46fTPfgYkrjRYfRXbho9WOvOelTnNjWuZws/hzGHDASH1LEJeA4VKK9k3wJvido8o7jJSB5WkMTonX7HM1bA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.DependencyInjection": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "zkFxGYUvdxAvIKTyXHrmW+Sux53D4SezD9dMyZ6hrwwzPQJNuwCRy1f5W7AvYTqacEGhWF2XderRQG1OvbV8og==", + "resolved": "10.0.12", + "contentHash": "+24lC4plfbEDNfLAdTV/SWKS7dW+16X4HdydO3R++134kSNTzcbYA4KpR1Hdh6uWisB8Za3AzwyOn+K+NxWIug==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12" } }, "Microsoft.Extensions.Logging.Configuration": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "cLrqxkuEfcilZ8SjK+9KAnpLk9lOoMPaOokF+wRUYie+iUEcdX4/p/+gJkt0BYgWLthjpBUCkVTBI6Kxg0nsOw==", + "resolved": "10.0.12", + "contentHash": "CLHWfKQZWFE6fSzRXfjd4UlGveckkfPtwx/p5yF/o3hEkMSzGsl7MSxNAkI19hjw0rprBqrQC09Dwy6Lh6kweA==", "dependencies": { - "Microsoft.Extensions.Configuration": "10.0.10", - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Logging": "10.0.10", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10" + "Microsoft.Extensions.Configuration": "10.0.12", + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Logging": "10.0.12", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12" } }, "Microsoft.Extensions.ObjectPool": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "Tx0R6PY9MNSh0mDKSxbpHLuuec93IxF1cel+1ithQnMNr/vbfLSSHOQHGHIppAJCGfPcEo/wO1Ylj+QpXtzo3A==" + "resolved": "10.0.12", + "contentHash": "opBULzn9F7ZOL8EoFuqM2QjI6x9AG04DFNdnU2ky/kI4aUzbiXEfuy9jvCuu3D/ieccuDHTlalyC62esPD8wGg==" }, "Microsoft.Extensions.Options": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "srnhnk7nE8krBiIXp71LvBmKBtraBONWSRzdjJgRv1Ko9Mp8IVNqv4vIS9hGeVteBig8aQkva9ZG+sC+o5sVcA==", + "resolved": "10.0.12", + "contentHash": "TDYD33TSRpXKZWlmTXNlj5kCihxatmv2Ec1u6C+bMYLphCS7PoSLE9Pjd/nunDoE7yETk+LLKjVJX78HYtWjpA==", "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Options.ConfigurationExtensions": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "tnBmu/LwF25ZQK+HBNCu2xrwnkKoB/XEbJyooGGoYxHrhvxbSKi7eOFiJ4AXBy/QU4vtCvCJfoi8k9Ej72qzOQ==", + "resolved": "10.0.12", + "contentHash": "rqpu4qj5WE9x1IHGXSIgHBKi7IUlQaHyp4aXCYIanG2OghlUMFZpZTgExaXwcvmLAJHsxKQWMPpc7D2WIbCVtA==", "dependencies": { - "Microsoft.Extensions.Configuration.Abstractions": "10.0.10", - "Microsoft.Extensions.Configuration.Binder": "10.0.10", - "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10", - "Microsoft.Extensions.Primitives": "10.0.10" + "Microsoft.Extensions.Configuration.Abstractions": "10.0.12", + "Microsoft.Extensions.Configuration.Binder": "10.0.12", + "Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12", + "Microsoft.Extensions.Primitives": "10.0.12" } }, "Microsoft.Extensions.Primitives": { "type": "Transitive", - "resolved": "10.0.10", - "contentHash": "5wu/GrYVd8mG2DVUw3vFJzF+O336TyTGg/Kmcgw9bfwYhCoFiV5lR5QeEmKecJyrW4W54nMfD3p3589E8a7czQ==" + "resolved": "10.0.12", + "contentHash": "dYfCLR52UA+3DL7C4I/pvSaRPkNqxrUAQmbFL2u0zvYKKzqgrFCJl08Df+F1aYc8leu9JvpC9bsURUdpExcBXQ==" }, "Microsoft.Extensions.Resilience": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "RH/gv0ZcCnQ3d30lxb8+T2o661TwZq/K5eMwp488goQLX1QYqWN3i8L8XlN9DhrqP2Zcf0EtsWaKpJO3yHDUTw==", + "resolved": "10.10.0", + "contentHash": "aYIiuCSqsIqpaqya2JchArkaWibMhiXTNj4+wkjv0s7A/Uy1dvc4MsCPTOtvOU3ffz0+vYRHi7GHcXqynZfdbQ==", "dependencies": { - "Microsoft.Extensions.Diagnostics": "10.0.10", - "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.8.0", - "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0", + "Microsoft.Extensions.Diagnostics": "10.0.12", + "Microsoft.Extensions.Diagnostics.ExceptionSummarization": "10.10.0", + "Microsoft.Extensions.Options.ConfigurationExtensions": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0", "Polly.Extensions": "8.4.2", "Polly.RateLimiting": "8.4.2" } }, "Microsoft.Extensions.Telemetry": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "IIWjDZguUJt6yNld9J4V88xuOUzpC76wBwfnRJLRmacmyTTl9jA8+KP5PuHPi7CKz/Vk/q+lQYmobiopuzapzA==", + "resolved": "10.10.0", + "contentHash": "GeJofTliWSVoYAeTfRbnp+TaOUl502yZIcZ+qHFiyOoAIzwTk12eKypnSR9uN2oiHgGW32Y0XN1i+VaQizl0IQ==", "dependencies": { - "Microsoft.Extensions.AmbientMetadata.Application": "10.8.0", - "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.8.0", - "Microsoft.Extensions.Logging.Configuration": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Telemetry.Abstractions": "10.8.0" + "Microsoft.Extensions.AmbientMetadata.Application": "10.10.0", + "Microsoft.Extensions.DependencyInjection.AutoActivation": "10.10.0", + "Microsoft.Extensions.Logging.Configuration": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Telemetry.Abstractions": "10.10.0" } }, "Microsoft.Extensions.Telemetry.Abstractions": { "type": "Transitive", - "resolved": "10.8.0", - "contentHash": "XHlOerNKjVrPJqbuFi196tyFhS7eNMoPUC800xJmCGsSiruE/goGoKyBKzS1HeelAGnoFPFrS+LgNitXNeEYRQ==", + "resolved": "10.10.0", + "contentHash": "I76SAZ95I5lYh4whVZvLpKhpvHI1o21FfGqiASU85GtIVA4ULv+TVIE5+swKhnC63+xI4XjCcIWa9LbyR3pFNw==", "dependencies": { - "Microsoft.Extensions.Compliance.Abstractions": "10.8.0", - "Microsoft.Extensions.Logging.Abstractions": "10.0.10", - "Microsoft.Extensions.ObjectPool": "10.0.10", - "Microsoft.Extensions.Options": "10.0.10" + "Microsoft.Extensions.Compliance.Abstractions": "10.10.0", + "Microsoft.Extensions.Logging.Abstractions": "10.0.12", + "Microsoft.Extensions.ObjectPool": "10.0.12", + "Microsoft.Extensions.Options": "10.0.12" } }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==", + "resolved": "2.3.3", + "contentHash": "nY8ceQyPWB9TRE1WE5Oe/sks2e10SxgPv61vBHsFYpgCeDtNwhpMZwmL29GklO3/etTdOsLdrCmNr4zJWaR2fg==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==", + "resolved": "2.3.3", + "contentHash": "dceVNxnfTEjKnrIreLcMfkgrzzBY8kgCCJX5NAv7Lq/6vPlTP4VB5zxKeuYy0yfCoBtWuPkLjUG6qtOBMfpypA==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==", + "resolved": "2.3.3", + "contentHash": "JLovZjH6K10YiHO/BcidsaSHo/M2DfOe9FDjxjFdV6aoHO6VYTTYlLBNcyLJSo20q5gDTmNvmxYVH39A942aJA==", "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.TestPlatform.ObjectModel": "18.4.0", + "Microsoft.Testing.Extensions.Telemetry": "2.3.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.3.3", + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg==" + "resolved": "2.3.3", + "contentHash": "ENbH4BQh9riXtOKc25KKITfiGGWhWMBJA7pZuNaF9zxzzSaVkp5AMeZxGQ6sXYaR6xb724NLz985Is6XIYqLSg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==", + "resolved": "2.3.3", + "contentHash": "iVAvNbZ5JPDZSrTcIrCDoCsAkzjDxwDEt2mDuMd8ng1P6e2P2NCd0g0BsoBVG+nJLSmK//V+yeEvjCa3E2fxHw==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Fz/qXC52VXXopzHj7v2reCKcCqSxkTDCkEDfkNAH0vni/7qK/KLMiEYtRmnUanxO2F2g2zZZ60qCpxF0AF7URA==" + "resolved": "18.10.1", + "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Oq+Pma/J86aZL72t71bcESvDszDsTjUfl6PIsuDdPoKTHZfNMhKamCfLD5fKx51W/u0KozXtJo2/3fnt0sgPxg==", + "resolved": "18.10.1", + "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.9.0" + "Microsoft.TestPlatform.ObjectModel": "18.10.1" } }, "Microsoft.Win32.SystemEvents": { @@ -487,10 +487,10 @@ "solsharp.rpc": { "type": "Project", "dependencies": { - "Microsoft.Extensions.Http": "[10.0.10, )", - "Microsoft.Extensions.Http.Resilience": "[10.8.0, )", - "Microsoft.Extensions.Logging.Abstractions": "[10.0.10, )", - "SolSharp.Core": "[3.2.0, )" + "Microsoft.Extensions.Http": "[10.0.12, )", + "Microsoft.Extensions.Http.Resilience": "[10.10.0, )", + "Microsoft.Extensions.Logging.Abstractions": "[10.0.12, )", + "SolSharp.Core": "[4.0.0, )" } } } diff --git a/tests/SolSharp.Wallet.Tests/SolSharp.Wallet.Tests.csproj b/tests/SolSharp.Wallet.Tests/SolSharp.Wallet.Tests.csproj index 29aa117..dcc0ffd 100644 --- a/tests/SolSharp.Wallet.Tests/SolSharp.Wallet.Tests.csproj +++ b/tests/SolSharp.Wallet.Tests/SolSharp.Wallet.Tests.csproj @@ -7,9 +7,9 @@ - + - + diff --git a/tests/SolSharp.Wallet.Tests/packages.lock.json b/tests/SolSharp.Wallet.Tests/packages.lock.json index 6e5230f..fb53646 100644 --- a/tests/SolSharp.Wallet.Tests/packages.lock.json +++ b/tests/SolSharp.Wallet.Tests/packages.lock.json @@ -19,18 +19,18 @@ }, "Microsoft.CodeAnalysis.BannedApiAnalyzers": { "type": "Direct", - "requested": "[4.14.0, )", - "resolved": "4.14.0", - "contentHash": "gSWJlDWwmDhtbrEJGiHqvEjz9KthIiFD0qYB8zZ6a7z+xpMSPEtM9yTYELSa58iFWYlzSRqP9FXO6KoT3+ZMtg==" + "requested": "[5.6.0, )", + "resolved": "5.6.0", + "contentHash": "Kcobt3pnOdO0A+6CKiMHZdTEluJpsfxiV20axtZdmfBQnDmiWTKPJADlgAfdTuKNAnVarrkJa0UEGwuOo91muw==" }, "Microsoft.NET.Test.Sdk": { "type": "Direct", - "requested": "[18.9.0, )", - "resolved": "18.9.0", - "contentHash": "xIzVXa/VpKXqDWzyC/5Hw8JbFY5u9k3Jc53CpcjBiOXvkQGio484LD9FNwOiGUSMDcYL3Rcw9sNgGi5WrswlPQ==", + "requested": "[18.10.1, )", + "resolved": "18.10.1", + "contentHash": "SxCFvJE/2ltUQgCgv6+Ixagohw4sZc9hM7Wid2foaNM7paBscktoHLoRDz91fW8wbHG87Rg9Ku59/8PXumqUrA==", "dependencies": { - "Microsoft.CodeCoverage": "18.9.0", - "Microsoft.TestPlatform.TestHost": "18.9.0" + "Microsoft.CodeCoverage": "18.10.1", + "Microsoft.TestPlatform.TestHost": "18.10.1" } }, "NSubstitute": { @@ -50,13 +50,13 @@ }, "NUnit3TestAdapter": { "type": "Direct", - "requested": "[6.2.0, )", - "resolved": "6.2.0", - "contentHash": "8PMJB8za2u8S0ey/nEtvh9BHjLhv5yzUEMCmA0+VIPLKSeOAZ3TEHWDyAp0+iPQb3jnBH1o8k0PoU2FgzXLRnQ==", + "requested": "[6.3.0, )", + "resolved": "6.3.0", + "contentHash": "8ZD+0dIfDHsL4w4Gl/LPxWH0O4ky3hFXqTZjY+ry0ThI3cMVErr9Tjxal5O5wJxGXh50a9qkDEAWVca8KQYCEw==", "dependencies": { "Microsoft.Extensions.DependencyModel": "8.0.2", - "Microsoft.Testing.Extensions.VSTestBridge": "2.1.0", - "Microsoft.Testing.Platform.MSBuild": "2.1.0" + "Microsoft.Testing.Extensions.VSTestBridge": "2.3.3", + "Microsoft.Testing.Platform.MSBuild": "2.3.3" } }, "StyleCop.Analyzers": { @@ -88,8 +88,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "MtegCIKGuG0r/LCdIjoR1HgzCGIUBhR3aNdbtQpts5vMXQuqBDZ2Jsd2uFKoHFM2XrQV6ZrDf3F5oLi3SLTp8w==" + "resolved": "18.10.1", + "contentHash": "tV7tCyp/t+DuwQugLkCeUN7NBFFB4fEGRPr0gkMQ2nQgAvQQjmGlZZi1dsLzbyoe/A0mbnKybmkIh8qhT9p4Zw==" }, "Microsoft.Extensions.DependencyModel": { "type": "Transitive", @@ -98,56 +98,56 @@ }, "Microsoft.Testing.Extensions.Telemetry": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "5TwgTx2u7k9Al/xbZ18QXq4Hdy2xewkVTI6K3sk+jY2ykqUkIKNuj7rFu3GOV5KnEUkevhw6eZcyZs77STHJIA==", + "resolved": "2.3.3", + "contentHash": "nY8ceQyPWB9TRE1WE5Oe/sks2e10SxgPv61vBHsFYpgCeDtNwhpMZwmL29GklO3/etTdOsLdrCmNr4zJWaR2fg==", "dependencies": { "Microsoft.ApplicationInsights": "2.23.0", - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.TrxReport.Abstractions": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "D8xmIJYQFJ6D49Rx5/vPrkZZxb338Jkew+eSqZLBfBiWKw4QZKy3i1BOXiLfz0lOmaNErwDz/YWRojCdNl+B9Q==", + "resolved": "2.3.3", + "contentHash": "dceVNxnfTEjKnrIreLcMfkgrzzBY8kgCCJX5NAv7Lq/6vPlTP4VB5zxKeuYy0yfCoBtWuPkLjUG6qtOBMfpypA==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Extensions.VSTestBridge": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "bNRIEA2YoGr+Y+7LHdA7i1U80+7BAdf4K4Qh4Kx6eKkoBK/NV7QpoMg+GWPP0/eqAFzuUmUOIPVZ87Oo0Vyxmw==", + "resolved": "2.3.3", + "contentHash": "JLovZjH6K10YiHO/BcidsaSHo/M2DfOe9FDjxjFdV6aoHO6VYTTYlLBNcyLJSo20q5gDTmNvmxYVH39A942aJA==", "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.TestPlatform.ObjectModel": "18.4.0", + "Microsoft.Testing.Extensions.Telemetry": "2.3.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "2.3.3", + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.Testing.Platform": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "aHkjNTGIA+Zbdw6RJgSFrbDrCjO0CgqpElqYcvkRSeUhBv2bKarnvU3ep786U7UqrPlArT/B7VmImRibJD0Zrg==" + "resolved": "2.3.3", + "contentHash": "ENbH4BQh9riXtOKc25KKITfiGGWhWMBJA7pZuNaF9zxzzSaVkp5AMeZxGQ6sXYaR6xb724NLz985Is6XIYqLSg==" }, "Microsoft.Testing.Platform.MSBuild": { "type": "Transitive", - "resolved": "2.1.0", - "contentHash": "UpfPebXQtHGrWz21+YLHmJSm+5zsuPE9U9pfdCtoB+67g75fDmWlNgpkH2ZmdVhSwkjNIed9Icg8Iu63z2ei5Q==", + "resolved": "2.3.3", + "contentHash": "iVAvNbZ5JPDZSrTcIrCDoCsAkzjDxwDEt2mDuMd8ng1P6e2P2NCd0g0BsoBVG+nJLSmK//V+yeEvjCa3E2fxHw==", "dependencies": { - "Microsoft.Testing.Platform": "2.1.0" + "Microsoft.Testing.Platform": "2.3.3" } }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Fz/qXC52VXXopzHj7v2reCKcCqSxkTDCkEDfkNAH0vni/7qK/KLMiEYtRmnUanxO2F2g2zZZ60qCpxF0AF7URA==" + "resolved": "18.10.1", + "contentHash": "o+PuLDRVp1iwiVAPBADZItXgm9Ck23XtPhE4kZtZVi0uYnMiiz1Dx9Cjh75kJ+ijfqnORL3VOTOaQVKi0f/ixg==" }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "18.9.0", - "contentHash": "Oq+Pma/J86aZL72t71bcESvDszDsTjUfl6PIsuDdPoKTHZfNMhKamCfLD5fKx51W/u0KozXtJo2/3fnt0sgPxg==", + "resolved": "18.10.1", + "contentHash": "KYz2omqkoz9E2mWa4fdgT+Ycie1wi5968EmyJlusjlp87RxxtA2FvDm8tcBEYIDzLnkWGnsKjE4d13Z7/rxkQA==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "18.9.0" + "Microsoft.TestPlatform.ObjectModel": "18.10.1" } }, "Microsoft.Win32.SystemEvents": { @@ -224,7 +224,7 @@ "dependencies": { "BouncyCastle.Cryptography": "[2.7.0, )", "Nethermind.Crypto.Bls": "[1.1.0, )", - "SolSharp.Core": "[3.2.0, )" + "SolSharp.Core": "[4.0.0, )" } } }