Skip to content

fix(v3)!: nullable hardening + repair the broken input-token-permit path - #80

Merged
grinidx merged 1 commit into
mainfrom
chore/nullable-hardening
Jul 13, 2026
Merged

fix(v3)!: nullable hardening + repair the broken input-token-permit path#80
grinidx merged 1 commit into
mainfrom
chore/nullable-hardening

Conversation

@grinidx

@grinidx grinidx commented Jul 13, 2026

Copy link
Copy Markdown
Owner

Pre-1.0.0 hardening pass. Solution now builds with zero compiler warnings (was 106). 1,695 tests green, dotnet format clean.

The headline: a real, fully-broken public API path

The pass surfaced that V3 SwapRouter's input-token-permit feature could never work:

  • Staker.SwapOptions.InputTokenPermit was typed as Staker.PermitOptions — an empty stub class (// Implement PermitOptions).
  • SelfPermit.EncodePermit took object and runtime-tested for IStandardPermitArguments/IAllowedPermitArguments.
  • An empty PermitOptions satisfies neither → falls to elsealways throws "Invalid permit options".
  • And the valid types couldn't even be assigned to the property (CS0029), so there was no way to use it correctly.

The object parameter is what hid this from the compiler. Upstream ships no test for this path, which is why the port inherited the gap.

Fix: model the upstream union PermitOptions = StandardPermitArguments | AllowedPermitArguments as a marker interface SelfPermit.IPermitOptions, implemented by both argument interfaces. Every permit option is now typed against it instead of objectStaker.SwapOptions.InputTokenPermit, NonfungiblePositionManager.AddLiquidityOptions.Token0Permit/Token1Permit, Router.SwapOptions.InputTokenPermit, SwapAndAddOptions.OutputTokenPermit — so misuse is a compile error. Empty stub deleted. Pinned by a new regression test (V3/SwapRouterPermitTests.cs).

Nullable hardening

Null contracts derived from the upstream TS interfaces: upstream-required (x: T) → required; upstream-optional (x?: T) → nullable. Applied across NonfungiblePositionManager (24), Staker (11), SelfPermit (4), Payments (2).

Two root causes fixed rather than suppressed:

  • CurrencyAmount.Wrapped() / .AsBaseCurrency() were declared nullable but provably never return null (every path constructs via the non-nullable FromFractionalAmount; BaseCurrency.Wrapped() returns a non-nullable Token). Tightening them cleared all five downstream CS8601/CS8602 warnings at once and strengthens the contract for callers.
  • Route._midPrice is a genuine lazy cache → now Price<,>?.

A test that could pass vacuously

PoolTests.BigNums_CorrectlyHandlesTwoBigIntegers called GetInputAmount without awaiting (faithfully copying upstream). In C# an unawaited Task swallows exceptions — so the test would have gone green even if GetInputAmount threw on the very big numbers it's named for. Now awaited; it passes, which actually proves the behaviour.

⚠️ Breaking (deliberate, pre-stable)

  • Object initializers must now supply fields marked required.
  • Permit options are typed SelfPermit.IPermitOptions instead of object.

Both are source-level tightenings that are far cheaper now than after 1.0.0 — which is exactly why this ran before cutting stable.

Nullable-reference hardening ahead of 1.0.0. Option/params types now carry explicit
null contracts derived from the upstream TS interfaces (required field -> 'required',
'x?: T' -> nullable). Solution now builds with ZERO compiler warnings (was 106).

Root causes fixed, not suppressed:
- CurrencyAmount.Wrapped()/.AsBaseCurrency() were declared nullable but provably never
  return null; tightening them cleared all 5 downstream CS8601/CS8602 flow warnings at once.
- Route._midPrice is a genuine lazy cache -> now Price<,>?.

Real bug found by the pass: V3 SwapRouter's input-token-permit path was UNUSABLE.
Staker.SwapOptions.InputTokenPermit was typed to an empty stub class, so the only
assignable value failed SelfPermit.EncodePermit's type tests and always threw
'Invalid permit options' -- and the valid permit types couldn't be assigned at all.
Upstream ships no test for this path, so the port inherited the gap. Modelled the
upstream 'PermitOptions = StandardPermitArguments | AllowedPermitArguments' union as
SelfPermit.IPermitOptions and typed every permit option against it (was 'object?'),
making misuse a compile error. Pinned by a new regression test.

Also: PoolTests.BigNums_CorrectlyHandlesTwoBigIntegers now awaits GetInputAmount --
the unawaited Task swallowed exceptions, so it could pass vacuously.

1695 tests green; dotnet format clean.

BREAKING: option initializers must supply now-'required' fields; permit options are
typed as SelfPermit.IPermitOptions instead of object.
@github-actions

Copy link
Copy Markdown

Test Results

1 695 tests  +1   1 695 ✅ +1   19s ⏱️ -1s
    1 suites ±0       0 💤 ±0 
    1 files   ±0       0 ❌ ±0 

Results for commit 4e4518b. ± Comparison against base commit 36ffbb1.

@github-actions

Copy link
Copy Markdown

Summary

Summary
Generated on: 07/13/2026 - 12:15:57
Coverage date: 07/13/2026 - 12:15:46
Parser: MultiReport (2x Cobertura)
Assemblies: 1
Classes: 440
Files: 203
Line coverage: 85.2% (10804 of 12668)
Covered lines: 10804
Uncovered lines: 1864
Coverable lines: 12668
Total lines: 27425
Branch coverage: 71.2% (3301 of 4634)
Covered branches: 3301
Total branches: 4634
Method coverage: Feature is only available for sponsors
Tag: 164_29249100872

Coverage

UniswapSharp - 85.2%
Name Line Branch
UniswapSharp 85.2% 71.2%
System.Text.RegularExpressions.Generated 90% 67.3%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F23DA395930C475E
BA09A06A24B367F10A3520CD5632595F85885A362B583E680__ContentTypeRegex_1
90.2% 70.8%
System.Text.RegularExpressions.Generated.<RegexGenerator_g>F23DA395930C475E
BA09A06A24B367F10A3520CD5632595F85885A362B583E680__HexRegex_0
88.8% 65%
UniswapSharp.Core.Addresses 99.6% 85.7%
UniswapSharp.Core.ChainAddresses 100%
UniswapSharp.Core.Constants 100% 100%
UniswapSharp.Core.Entities.BaseCurrency 90.9% 100%
UniswapSharp.Core.Entities.Ether 100% 75%
UniswapSharp.Core.Entities.Fractions.CurrencyAmount`1 92.8% 83.3%
UniswapSharp.Core.Entities.Fractions.Fraction 92.9% 76.9%
UniswapSharp.Core.Entities.Fractions.Percent 93.3%
UniswapSharp.Core.Entities.Fractions.Price`2 94.4% 50%
UniswapSharp.Core.Entities.NativeCurrency 100%
UniswapSharp.Core.Entities.Token 100% 100%
UniswapSharp.Core.Entities.Weth9 100%
UniswapSharp.Core.Utils.AddressValidator 60.2% 60.5%
UniswapSharp.Core.Utils.MathUtils 92.8% 83.3%
UniswapSharp.Core.Utils.PriceImpact 100%
UniswapSharp.Core.Utils.RlpEncoder 0% 0%
UniswapSharp.Core.Utils.SortedInsert 100% 100%
UniswapSharp.Core.Utils.ZksyncAddressComputer 95.6% 75%
UniswapSharp.Flashtestations.Config.Chains 100% 90%
UniswapSharp.Flashtestations.Crypto.Workload 97.8% 91.6%
UniswapSharp.Flashtestations.Rpc.BlockBuilderProofVerifiedArgs 100%
UniswapSharp.Flashtestations.Rpc.BlockBuilderProofVerifiedEventDTO 0%
UniswapSharp.Flashtestations.Rpc.BlockSelector 100%
UniswapSharp.Flashtestations.Rpc.ContractWorkloadMetadata 100%
UniswapSharp.Flashtestations.Rpc.EvmBlock 100%
UniswapSharp.Flashtestations.Rpc.EvmLog 0%
UniswapSharp.Flashtestations.Rpc.EvmTransactionReceipt 100%
UniswapSharp.Flashtestations.Rpc.GetWorkloadMetadataFunction 0%
UniswapSharp.Flashtestations.Rpc.NethereumEvmRpcClient 0% 0%
UniswapSharp.Flashtestations.Rpc.NethereumEvmRpcClientFactory 0%
UniswapSharp.Flashtestations.Rpc.ParsedFlashtestationLog 100%
UniswapSharp.Flashtestations.Rpc.ParseEventLogsRequest 100%
UniswapSharp.Flashtestations.Rpc.ReadContractRequest 100%
UniswapSharp.Flashtestations.Rpc.RpcClient 96.9% 76.6%
UniswapSharp.Flashtestations.Rpc.RpcClientConfig 100%
UniswapSharp.Flashtestations.Rpc.RpcClientFactory 0%
UniswapSharp.Flashtestations.Rpc.RpcClients 100%
UniswapSharp.Flashtestations.Rpc.WorkloadMetadataOutputDto 0%
UniswapSharp.Flashtestations.Types.BlockNotFoundError 75%
UniswapSharp.Flashtestations.Types.BlockParameter 83.3% 55.5%
UniswapSharp.Flashtestations.Types.ChainConfig 100%
UniswapSharp.Flashtestations.Types.ChainNotSupportedError 83.3%
UniswapSharp.Flashtestations.Types.ClientConfig 100%
UniswapSharp.Flashtestations.Types.FlashtestationEvent 100%
UniswapSharp.Flashtestations.Types.HexValues 48% 25%
UniswapSharp.Flashtestations.Types.NetworkError 100%
UniswapSharp.Flashtestations.Types.SingularWorkloadMeasurementRegisters 100%
UniswapSharp.Flashtestations.Types.Validation 95.3% 93.7%
UniswapSharp.Flashtestations.Types.ValidationError 75%
UniswapSharp.Flashtestations.Types.VerificationResult 100%
UniswapSharp.Flashtestations.Types.WorkloadMeasurementRegisters 100%
UniswapSharp.Flashtestations.Types.WorkloadMetadata 100%
UniswapSharp.Flashtestations.Verification.FlashtestationService 87.9% 87.5%
UniswapSharp.LiquidityLauncher.Addresses 100% 100%
UniswapSharp.LiquidityLauncher.AuctionFactoryDeployment 100%
UniswapSharp.LiquidityLauncher.AuctionParameters 0%
UniswapSharp.LiquidityLauncher.AuctionStepInput 100%
UniswapSharp.LiquidityLauncher.Build 88.2% 100%
UniswapSharp.LiquidityLauncher.BuildLaunchParams 100%
UniswapSharp.LiquidityLauncher.BuybackBurnLockRecipientInput 100%
UniswapSharp.LiquidityLauncher.Chains 0%
UniswapSharp.LiquidityLauncher.Config.AuctionScheduleOptions 100%
UniswapSharp.LiquidityLauncher.Config.Blocks 72.7% 58.3%
UniswapSharp.LiquidityLauncher.Config.CustomRangeInput 0%
UniswapSharp.LiquidityLauncher.Config.DeriveBlocksInput 100%
UniswapSharp.LiquidityLauncher.Config.DerivedBlocks 80%
UniswapSharp.LiquidityLauncher.Config.Emission 75.4% 59.3%
UniswapSharp.LiquidityLauncher.Config.Fees 0% 0%
UniswapSharp.LiquidityLauncher.Config.LpAllocation 0% 0%
UniswapSharp.LiquidityLauncher.Config.MathJs 100%
UniswapSharp.LiquidityLauncher.Config.Positions 0% 0%
UniswapSharp.LiquidityLauncher.Config.Price 87.5% 60%
UniswapSharp.LiquidityLauncher.Config.SingleLpAllocationInput 0%
UniswapSharp.LiquidityLauncher.Config.TieredLpAllocationInput 0%
UniswapSharp.LiquidityLauncher.Config.TieredLpAllocationTier 0%
UniswapSharp.LiquidityLauncher.Constants 100%
UniswapSharp.LiquidityLauncher.CreateTokenAcquisition 100%
UniswapSharp.LiquidityLauncher.CreateTokenArgs 100%
UniswapSharp.LiquidityLauncher.DepositTokenAcquisition 100%
UniswapSharp.LiquidityLauncher.Distribution 100%
UniswapSharp.LiquidityLauncher.Encode 39.2% 56.2%
UniswapSharp.LiquidityLauncher.FeesForwarderLockRecipientInput 100%
UniswapSharp.LiquidityLauncher.Format 0% 0%
UniswapSharp.LiquidityLauncher.LauncherAddresses 88.2%
UniswapSharp.LiquidityLauncher.LauncherErrors 100%
UniswapSharp.LiquidityLauncher.LauncherSdkError 100%
UniswapSharp.LiquidityLauncher.LiquidityAllocationBracket 0%
UniswapSharp.LiquidityLauncher.Lock 95.2% 70%
UniswapSharp.LiquidityLauncher.LockRecipient 100%
UniswapSharp.LiquidityLauncher.LockRecipientInput 100%
UniswapSharp.LiquidityLauncher.MigratorParameters 0%
UniswapSharp.LiquidityLauncher.PoolId 100% 66.6%
UniswapSharp.LiquidityLauncher.PoolParameters 0%
UniswapSharp.LiquidityLauncher.PositionDefinition 0%
UniswapSharp.LiquidityLauncher.Salts 0%
UniswapSharp.LiquidityLauncher.SelectedTokenFactory 100%
UniswapSharp.LiquidityLauncher.Split 0%
UniswapSharp.LiquidityLauncher.TimelockLockRecipientInput 100%
UniswapSharp.LiquidityLauncher.TransactionRequest 100%
UniswapSharp.LiquidityLauncher.Uerc20Metadata 0%
UniswapSharp.Permit2.AllowanceTransfer 100% 100%
UniswapSharp.Permit2.Constants 100% 100%
UniswapSharp.Permit2.Domain 100%
UniswapSharp.Permit2.Eip712Domain 88.2% 50%
UniswapSharp.Permit2.Eip712TypedDataEncoder 79.1% 60.7%
UniswapSharp.Permit2.PermitBatch 100%
UniswapSharp.Permit2.PermitBatchTransferFrom 100%
UniswapSharp.Permit2.PermitData 100%
UniswapSharp.Permit2.PermitDetails 100%
UniswapSharp.Permit2.PermitSingle 100%
UniswapSharp.Permit2.PermitTransferFrom 100%
UniswapSharp.Permit2.SignatureTransfer 100% 100%
UniswapSharp.Permit2.TokenPermissions 100%
UniswapSharp.Permit2.TypedDataField 100%
UniswapSharp.Permit2.Witness 100%
UniswapSharp.Router.ApproveAndCall 38.5% 20%
UniswapSharp.Router.CondensedAddLiquidityOptions 50%
UniswapSharp.Router.Constants 100%
UniswapSharp.Router.Entities.MixedRoute.MixedRouteSDK`2 86.8% 81%
UniswapSharp.Router.Entities.MixedRoute.MixedRouteSwap`2 100%
UniswapSharp.Router.Entities.MixedRoute.MixedRouteTrade`2 95.9% 87.2%
UniswapSharp.Router.Entities.MixedRoute`2 100%
UniswapSharp.Router.Entities.MixedRouteAmounts`2 100%
UniswapSharp.Router.Entities.RouteHelpers 85.7% 75%
UniswapSharp.Router.Entities.RouterSwap`2 100%
UniswapSharp.Router.Entities.RouteV2`2 100%
UniswapSharp.Router.Entities.RouteV3`2 100%
UniswapSharp.Router.Entities.RouteV4`2 86.6%
UniswapSharp.Router.Entities.Trade`2 88.1% 82%
UniswapSharp.Router.Entities.V2RouteAmounts`2 100%
UniswapSharp.Router.Entities.V3RouteAmounts`2 100%
UniswapSharp.Router.Entities.V4RouteAmounts`2 100%
UniswapSharp.Router.MulticallExtended 75.8% 72.7%
UniswapSharp.Router.PaymentsExtended 96.5% 100%
UniswapSharp.Router.SwapAndAddOptions 100%
UniswapSharp.Router.SwapOptions 100%
UniswapSharp.Router.SwapRouter 87.9% 72.5%
UniswapSharp.Router.Utils.EncodeMixedRouteToPath 95.3% 83.3%
UniswapSharp.Router.Utils.MixedRouteUtils 94.7% 95.4%
UniswapSharp.Router.Utils.PathCurrency 50% 30%
UniswapSharp.Router.Utils.TPool 77.1% 75%
UniswapSharp.SmartWallet.BatchedCall 0%
UniswapSharp.SmartWallet.Call 100%
UniswapSharp.SmartWallet.Constants 95.7% 79.1%
UniswapSharp.SmartWallet.ExecuteOptions 100%
UniswapSharp.SmartWallet.MethodParameters 100%
UniswapSharp.SmartWallet.SmartWallet 100% 85.7%
UniswapSharp.SmartWallet.SmartWalletVersionMap 100%
UniswapSharp.SmartWallet.Utils.BatchedCallPlanner 92.3%
UniswapSharp.SmartWallet.Utils.CallPlanner 100% 100%
UniswapSharp.SmartWallet.Utils.Delegation 100% 100%
UniswapSharp.Tamperproof.Algorithms 100% 50%
UniswapSharp.Tamperproof.Constants.Errors 100%
UniswapSharp.Tamperproof.Constants.TamperproofException 100%
UniswapSharp.Tamperproof.DohAnswer 100%
UniswapSharp.Tamperproof.DohResponse 100%
UniswapSharp.Tamperproof.Generator 100% 100%
UniswapSharp.Tamperproof.HttpManifestFetcher 0% 0%
UniswapSharp.Tamperproof.ManifestFetchOptions 100%
UniswapSharp.Tamperproof.ManifestResponse 100%
UniswapSharp.Tamperproof.PublicKey 100%
UniswapSharp.Tamperproof.PublicKeyEntry 100%
UniswapSharp.Tamperproof.PublicKeyManifest 100%
UniswapSharp.Tamperproof.Signer 100% 83.3%
UniswapSharp.Tamperproof.SigningAlgorithmConfig 80%
UniswapSharp.Tamperproof.Utils.CanonicalJson 67.5% 65.7%
UniswapSharp.Tamperproof.Utils.Hex 100% 98%
UniswapSharp.Tamperproof.Utils.SigningCrypto 95.1% 85.7%
UniswapSharp.Tamperproof.Utils.TxtRecord 100% 90%
UniswapSharp.Tamperproof.Verifier 97.3% 92.8%
UniswapSharp.UniswapX.Builder.BuilderInvariant 75% 50%
UniswapSharp.UniswapX.Builder.DutchOrderBuilder 70.7% 33.3%
UniswapSharp.UniswapX.Builder.HybridOrderBuilder 69.4% 25%
UniswapSharp.UniswapX.Builder.PriorityOrderBuilder 75% 33.3%
UniswapSharp.UniswapX.Builder.RelayOrderBuilder 73.1% 42.8%
UniswapSharp.UniswapX.Builder.V2DutchOrderBuilder 72.5% 33.3%
UniswapSharp.UniswapX.Builder.V3DutchOrderBuilder 71.6% 28.5%
UniswapSharp.UniswapX.Constants 97% 85.7%
UniswapSharp.UniswapX.ConstantsV4 100%
UniswapSharp.UniswapX.MissingConfiguration 100%
UniswapSharp.UniswapX.Order.BlockOverrides 100%
UniswapSharp.UniswapX.Order.CosignedPriorityOrder 60.6% 83.3%
UniswapSharp.UniswapX.Order.CosignedPriorityOrderInfo 100%
UniswapSharp.UniswapX.Order.CosignedV2DutchOrder 100%
UniswapSharp.UniswapX.Order.CosignedV2DutchOrderInfo 100%
UniswapSharp.UniswapX.Order.CosignedV3DutchOrder 100%
UniswapSharp.UniswapX.Order.CosignedV3DutchOrderInfo 100%
UniswapSharp.UniswapX.Order.CosignerData 100%
UniswapSharp.UniswapX.Order.CosignerDataJSON 0%
UniswapSharp.UniswapX.Order.CustomOrderValidation 100%
UniswapSharp.UniswapX.Order.DutchInput 100%
UniswapSharp.UniswapX.Order.DutchInputJSON 100%
UniswapSharp.UniswapX.Order.DutchOrder 90.3% 75%
UniswapSharp.UniswapX.Order.DutchOrderInfo 100%
UniswapSharp.UniswapX.Order.DutchOutput 100%
UniswapSharp.UniswapX.Order.DutchOutputJSON 100%
UniswapSharp.UniswapX.Order.ExclusiveFillerData 100%
UniswapSharp.UniswapX.Order.NonlinearDutchDecay 100%
UniswapSharp.UniswapX.Order.OrderEncoding 100%
UniswapSharp.UniswapX.Order.OrderInfo 100%
UniswapSharp.UniswapX.Order.OrderNotFillable 100%
UniswapSharp.UniswapX.Order.OrderResolutionOptions 100%
UniswapSharp.UniswapX.Order.PriorityCosignerData 100%
UniswapSharp.UniswapX.Order.PriorityInput 100%
UniswapSharp.UniswapX.Order.PriorityOrderResolutionOptions 100%
UniswapSharp.UniswapX.Order.PriorityOutput 100%
UniswapSharp.UniswapX.Order.RelayFee 100%
UniswapSharp.UniswapX.Order.RelayInput 100%
UniswapSharp.UniswapX.Order.RelayOrder 96.8% 50%
UniswapSharp.UniswapX.Order.RelayOrderInfo 100%
UniswapSharp.UniswapX.Order.ResolvedRelayFee 100%
UniswapSharp.UniswapX.Order.ResolvedRelayOrder 100%
UniswapSharp.UniswapX.Order.ResolvedUniswapXOrder 100%
UniswapSharp.UniswapX.Order.TokenAmount 100%
UniswapSharp.UniswapX.Order.UnsignedPriorityOrder 82.8%
UniswapSharp.UniswapX.Order.UnsignedPriorityOrderInfo 100%
UniswapSharp.UniswapX.Order.UnsignedV2DutchOrder 93.7%
UniswapSharp.UniswapX.Order.UnsignedV2DutchOrderInfo 100%
UniswapSharp.UniswapX.Order.UnsignedV3DutchOrder 99.5% 100%
UniswapSharp.UniswapX.Order.UnsignedV3DutchOrderInfo 100%
UniswapSharp.UniswapX.Order.V3CosignerData 100%
UniswapSharp.UniswapX.Order.V3DutchInput 100%
UniswapSharp.UniswapX.Order.V3DutchOutput 100%
UniswapSharp.UniswapX.Order.V3OrderResolutionOptions 100%
UniswapSharp.UniswapX.Order.V4.CosignedHybridOrder 56.1% 29.7%
UniswapSharp.UniswapX.Order.V4.CosignedHybridOrderInfo 100%
UniswapSharp.UniswapX.Order.V4.CosignedHybridOrderInfoJSON 100%
UniswapSharp.UniswapX.Order.V4.Hashing 99.2% 80%
UniswapSharp.UniswapX.Order.V4.HybridCosignerData 100%
UniswapSharp.UniswapX.Order.V4.HybridCosignerDataJSON 100%
UniswapSharp.UniswapX.Order.V4.HybridInput 100%
UniswapSharp.UniswapX.Order.V4.HybridInputJSON 100%
UniswapSharp.UniswapX.Order.V4.HybridOrderCosignatureError 0%
UniswapSharp.UniswapX.Order.V4.HybridOrderPriceCurveError 0%
UniswapSharp.UniswapX.Order.V4.HybridOrderResolutionOptions 100%
UniswapSharp.UniswapX.Order.V4.HybridOutput 100%
UniswapSharp.UniswapX.Order.V4.HybridOutputJSON 100%
UniswapSharp.UniswapX.Order.V4.OrderResolutionError 100%
UniswapSharp.UniswapX.Order.V4.UnsignedHybridOrder 86.7% 0%
UniswapSharp.UniswapX.Order.V4.UnsignedHybridOrderInfo 100%
UniswapSharp.UniswapX.Order.Validation 88.8% 50%
UniswapSharp.UniswapX.Order.ValidationInfo 100%
UniswapSharp.UniswapX.OrderTypeMapping 100%
UniswapSharp.UniswapX.PermissionedToken 33.3%
UniswapSharp.UniswapX.Trade.DutchOrderTrade`2 63.8% 42.8%
UniswapSharp.UniswapX.Trade.ExpectedAmounts 100%
UniswapSharp.UniswapX.Trade.HybridOrderTrade`2 0% 0%
UniswapSharp.UniswapX.Trade.PriorityOrderTrade`2 70.7% 60%
UniswapSharp.UniswapX.Trade.RelayOrderTrade`2 90.9% 70%
UniswapSharp.UniswapX.Trade.TradeUtils 66.6% 64.2%
UniswapSharp.UniswapX.Trade.V2DutchOrderTrade`2 69.6% 42.8%
UniswapSharp.UniswapX.Trade.V3DutchOrderTrade`2 81.5% 67.8%
UniswapSharp.UniswapX.Utils.CancelParams 100%
UniswapSharp.UniswapX.Utils.DutchBlockDecay 88.8% 50%
UniswapSharp.UniswapX.Utils.DutchBlockDecayConfig 100%
UniswapSharp.UniswapX.Utils.DutchDecay 94.4% 80%
UniswapSharp.UniswapX.Utils.DutchDecayConfig 100%
UniswapSharp.UniswapX.Utils.NonceManager 51.9% 70%
UniswapSharp.UniswapX.Utils.NonLinearDutchDecayLib 97.2% 93.7%
UniswapSharp.UniswapX.Utils.OrderParser 91.6% 78.5%
UniswapSharp.UniswapX.Utils.OrderSigning 100%
UniswapSharp.UniswapX.Utils.OrderUtils 81.8% 63.6%
UniswapSharp.UniswapX.Utils.RelayOrderParser 50%
UniswapSharp.UniswapX.Utils.SplitNonce 100%
UniswapSharp.UniswapX.Utils.UniswapXOrderParser 94.2% 87%
UniswapSharp.UniversalRouter.EIP712Payload 75%
UniswapSharp.UniversalRouter.EIP712PayloadValue 100%
UniswapSharp.UniversalRouter.Entities.Actions.AcrossV4DepositV3Params 100%
UniswapSharp.UniversalRouter.Entities.Actions.FlatFeeOptions 100%
UniswapSharp.UniversalRouter.Entities.Actions.SwapOptions 100%
UniswapSharp.UniversalRouter.Entities.Actions.UniswapTrade 71.6% 57.5%
UniswapSharp.UniversalRouter.Entities.TradeConfig 100%
UniswapSharp.UniversalRouter.ExecuteSignedDecoded 44.4%
UniswapSharp.UniversalRouter.SignedRouteOptions 100%
UniswapSharp.UniversalRouter.SwapRouter 82.7% 68%
UniswapSharp.UniversalRouter.SwapRouterConfig 0%
UniswapSharp.UniversalRouter.Types.FlatFee 100%
UniswapSharp.UniversalRouter.Types.NormalizedSwapSpecification 100%
UniswapSharp.UniversalRouter.Types.PortionFee 100%
UniswapSharp.UniversalRouter.Types.SwapRouting 100%
UniswapSharp.UniversalRouter.Types.SwapSpecification 100%
UniswapSharp.UniversalRouter.Types.UnwrapWeth 100%
UniswapSharp.UniversalRouter.Types.V2SwapExactIn 100%
UniswapSharp.UniversalRouter.Types.V2SwapExactOut 0%
UniswapSharp.UniversalRouter.Types.V3SwapExactIn 100%
UniswapSharp.UniversalRouter.Types.V3SwapExactOut 100%
UniswapSharp.UniversalRouter.Types.V4Settle 100%
UniswapSharp.UniversalRouter.Types.V4SettleAll 0%
UniswapSharp.UniversalRouter.Types.V4Swap 100%
UniswapSharp.UniversalRouter.Types.V4SwapExactIn 100%
UniswapSharp.UniversalRouter.Types.V4SwapExactInSingle 0%
UniswapSharp.UniversalRouter.Types.V4SwapExactOut 0%
UniswapSharp.UniversalRouter.Types.V4SwapExactOutSingle 100%
UniswapSharp.UniversalRouter.Types.V4Take 100%
UniswapSharp.UniversalRouter.Types.V4TakeAll 0%
UniswapSharp.UniversalRouter.Types.V4TakePortion 0%
UniswapSharp.UniversalRouter.Types.WrapEth 100%
UniswapSharp.UniversalRouter.Utils.ChainConfig 100%
UniswapSharp.UniversalRouter.Utils.CommandDefinition 100%
UniswapSharp.UniversalRouter.Utils.CommandParser 95.8% 75%
UniswapSharp.UniversalRouter.Utils.ComputeEncodeSwapsAmounts 73.6% 50%
UniswapSharp.UniversalRouter.Utils.Constants 98.5% 85%
UniswapSharp.UniversalRouter.Utils.CurrencyAddress 100% 100%
UniswapSharp.UniversalRouter.Utils.Eip712 100%
UniswapSharp.UniversalRouter.Utils.EncodeSwapsAmounts 100%
UniswapSharp.UniversalRouter.Utils.EncodeSwapStep 57.5% 57.6%
UniswapSharp.UniversalRouter.Utils.EncodeV4Action 24.3% 25%
UniswapSharp.UniversalRouter.Utils.GenericCommandParser 88.6% 81.8%
UniswapSharp.UniversalRouter.Utils.InputTokenOptions 0%
UniswapSharp.UniversalRouter.Utils.InputTokens 48% 25%
UniswapSharp.UniversalRouter.Utils.NormalizeEncodeSwapsSpec 100% 50%
UniswapSharp.UniversalRouter.Utils.Numbers 100%
UniswapSharp.UniversalRouter.Utils.Param 100%
UniswapSharp.UniversalRouter.Utils.ParamType 100%
UniswapSharp.UniversalRouter.Utils.PartialClassicQuote 100%
UniswapSharp.UniversalRouter.Utils.PathCurrency 20% 8.3%
UniswapSharp.UniversalRouter.Utils.Permit2Permit 100%
UniswapSharp.UniversalRouter.Utils.Permit2TransferFrom 0%
UniswapSharp.UniversalRouter.Utils.PoolInRoute 100%
UniswapSharp.UniversalRouter.Utils.RoutePlanner 94.7% 58.3%
UniswapSharp.UniversalRouter.Utils.RouterCommand 100%
UniswapSharp.UniversalRouter.Utils.RouterConfig 100%
UniswapSharp.UniversalRouter.Utils.RouterTradeAdapter 97.5% 85.7%
UniswapSharp.UniversalRouter.Utils.Signatures 90.4% 66.6%
UniswapSharp.UniversalRouter.Utils.SplitSig 100%
UniswapSharp.UniversalRouter.Utils.TokenInRoute 100%
UniswapSharp.UniversalRouter.Utils.UniversalRouterCall 100%
UniswapSharp.UniversalRouter.Utils.UniversalRouterCommand 100%
UniswapSharp.UniversalRouter.Utils.UniversalRouterVersionExtensions 100% 100%
UniswapSharp.UniversalRouter.Utils.V2PoolInRoute 75%
UniswapSharp.UniversalRouter.Utils.V2Reserve 100%
UniswapSharp.UniversalRouter.Utils.V3PathItem 100%
UniswapSharp.UniversalRouter.Utils.V3PoolInRoute 83.3%
UniswapSharp.UniversalRouter.Utils.V4PoolInRoute 87.5%
UniswapSharp.UniversalRouter.Utils.V4URVersion 100% 100%
UniswapSharp.UniversalRouter.Utils.ValidateEncodeSwaps 78.3% 75%
UniswapSharp.V2.Constants 100%
UniswapSharp.V2.Entities.BestTradeOptions 100%
UniswapSharp.V2.Entities.Pair 91.8% 81.3%
UniswapSharp.V2.Entities.Route`2 87.8% 79.1%
UniswapSharp.V2.Entities.Trade`2 95.2% 84.9%
UniswapSharp.V2.InsufficientInputAmountError 0%
UniswapSharp.V2.InsufficientReservesError 0%
UniswapSharp.V2.Router 96% 85.2%
UniswapSharp.V2.SwapParameters 100%
UniswapSharp.V2.TradeOptions 100%
UniswapSharp.V3.Constants 93.3% 50%
UniswapSharp.V3.Entities.NoTickDataProvider 100%
UniswapSharp.V3.Entities.Pool 96.8% 87.5%
UniswapSharp.V3.Entities.Position 87% 68.7%
UniswapSharp.V3.Entities.Route`2 92.8% 84.6%
UniswapSharp.V3.Entities.RouteInput`2 100%
UniswapSharp.V3.Entities.Swap`2 100%
UniswapSharp.V3.Entities.Tick 100% 100%
UniswapSharp.V3.Entities.TickListDataProvider 100% 100%
UniswapSharp.V3.Entities.Trade`2 93.3% 88.8%
UniswapSharp.V3.Multicall 92.8% 66.6%
UniswapSharp.V3.NonfungiblePositionManager 92.5% 78.2%
UniswapSharp.V3.Payments 93.7% 100%
UniswapSharp.V3.SelfPermit 96.2% 75%
UniswapSharp.V3.Staker 100% 85.7%
UniswapSharp.V3.SwapQuoter 97.6% 93.7%
UniswapSharp.V3.SwapRouter 95.6% 92.5%
UniswapSharp.V3.Utils.AbiFunctionEncoder 90% 75%
UniswapSharp.V3.Utils.ComputePoolAddress 100% 75%
UniswapSharp.V3.Utils.EncodeRouteToPath 100% 100%
UniswapSharp.V3.Utils.EncodeSqrtRatioX96 93.7% 75%
UniswapSharp.V3.Utils.FullMath 100% 100%
UniswapSharp.V3.Utils.LiquidityMath 80% 50%
UniswapSharp.V3.Utils.ListExtensions 100% 100%
UniswapSharp.V3.Utils.MaxLiquidity 82.6% 75%
UniswapSharp.V3.Utils.MostSignificantBitCalculator 100% 100%
UniswapSharp.V3.Utils.NearestUsableTick 100% 100%
UniswapSharp.V3.Utils.PositionLibrary 100% 100%
UniswapSharp.V3.Utils.PriceTick 88.8% 80%
UniswapSharp.V3.Utils.SqrtPriceMath 86% 68.4%
UniswapSharp.V3.Utils.SwapMath 96.6% 96.8%
UniswapSharp.V3.Utils.TickLibrary 65% 50%
UniswapSharp.V3.Utils.TickList 95% 92.5%
UniswapSharp.V3.Utils.TickMath 98.3% 96.8%
UniswapSharp.V3.Utils.Utilities 100% 100%
UniswapSharp.V3.Utils.V3Swap 94% 82.6%
UniswapSharp.V4.AddLiquidityOptions 100%
UniswapSharp.V4.AllowanceTransferPermitBatch 100%
UniswapSharp.V4.AllowanceTransferPermitSingle 0%
UniswapSharp.V4.BatchPermitOptions 100%
UniswapSharp.V4.CollectOptions 100%
UniswapSharp.V4.CommonOptions 100%
UniswapSharp.V4.Constants 100%
UniswapSharp.V4.Entities.Pool 97.1% 87%
UniswapSharp.V4.Entities.PoolKey 100%
UniswapSharp.V4.Entities.Position 59.2% 53.3%
UniswapSharp.V4.Entities.Route`2 95.3% 94.1%
UniswapSharp.V4.Entities.RouteInput`2 100%
UniswapSharp.V4.Entities.Swap`2 100%
UniswapSharp.V4.Entities.Trade`2 93.6% 90.6%
UniswapSharp.V4.IncreaseLiquidityOptions 100%
UniswapSharp.V4.MethodParameters 100%
UniswapSharp.V4.MintOptions 100%
UniswapSharp.V4.NFTPermitData 100%
UniswapSharp.V4.NFTPermitOptions 100%
UniswapSharp.V4.NFTPermitValues 100%
UniswapSharp.V4.PermitDetails 0%
UniswapSharp.V4.RemoveLiquidityOptions 100%
UniswapSharp.V4.TypedDataDomain 100%
UniswapSharp.V4.TypedDataField 100%
UniswapSharp.V4.Utils.AbiParamDecoder 95.2% 92.3%
UniswapSharp.V4.Utils.AbiParamEncoder 87% 71.7%
UniswapSharp.V4.Utils.AbiType 100%
UniswapSharp.V4.Utils.AbiTypeParser 96.6% 91.6%
UniswapSharp.V4.Utils.AddressType 100%
UniswapSharp.V4.Utils.ArrayType 75% 25%
UniswapSharp.V4.Utils.BoolType 100%
UniswapSharp.V4.Utils.BytesType 100%
UniswapSharp.V4.Utils.CurrencyMap 100% 100%
UniswapSharp.V4.Utils.CurrencyOrder 100% 100%
UniswapSharp.V4.Utils.EncodeRouteToPath 100% 100%
UniswapSharp.V4.Utils.FixedBytesType 100%
UniswapSharp.V4.Utils.Hook 100% 95%
UniswapSharp.V4.Utils.HookPermissions 100%
UniswapSharp.V4.Utils.NumberType 100%
UniswapSharp.V4.Utils.Param 100%
UniswapSharp.V4.Utils.ParamType 100%
UniswapSharp.V4.Utils.PathCurrency 90% 87.5%
UniswapSharp.V4.Utils.PathKey 100%
UniswapSharp.V4.Utils.PriceTick 88.2% 80%
UniswapSharp.V4.Utils.SwapExactIn 100%
UniswapSharp.V4.Utils.SwapExactInSingle 100%
UniswapSharp.V4.Utils.SwapExactOut 100%
UniswapSharp.V4.Utils.SwapExactOutSingle 42.8%
UniswapSharp.V4.Utils.TupleType 100%
UniswapSharp.V4.Utils.V4BaseActionsParser 96.3% 96.1%
UniswapSharp.V4.Utils.V4Planner 99% 90.4%
UniswapSharp.V4.Utils.V4PositionPlanner 100%
UniswapSharp.V4.Utils.V4RouterAction 100%
UniswapSharp.V4.Utils.V4RouterCall 100%
UniswapSharp.V4.V4PositionManager 99.4% 90.3%

@grinidx
grinidx merged commit 2d367ed into main Jul 13, 2026
6 checks passed
@grinidx
grinidx deleted the chore/nullable-hardening branch July 13, 2026 12:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant