Skip to content

Release 11.5.1.0 - #188

Merged
Platonenkov merged 1 commit into
releasefrom
dev
Sep 15, 2026
Merged

Platonenkov merged 1 commit into
releasefrom
dev

Conversation

@Platonenkov

Copy link
Copy Markdown
Collaborator

Promotes dev to release. One commit since 11.5.0.0.

What ships

fix(validation)!: validators throw on the calling thread, so BatchUtils.Build validates (b73762a, #187)

BatchUtils.Build called Validation.Validate(...) without awaiting it, and Validation.Validate was declared async Task. An async method captures every exception into the task it returns — including the ones thrown before the first await — so the discarded task discarded the verdict. ValidateBatch ran, decided the batch was malformed, and reported it to nobody.

A Batch built around a single inner transaction, which rippled answers with temARRAY_EMPTY, came back from Build looking well formed. So did one with more than eight inners, with a Vault/Loan inner, with an inner missing tfInnerBatchTxn, or with an inner carrying a non-zero Fee — every rule in ValidateBatch was lost, not just the inner count. The compiler had been reporting it as CS4014 since the method was written.

The 86 validators now return void and throw on the calling thread. Conditions, exception types and messages are unchanged.

Packages

Package release this PR
Xrpl 11.5.0.0 11.5.1.0
Xrpl.AddressCodec 10.9.0.0 10.9.0.0 (untouched)
Xrpl.BinaryCodec 11.0.1.0 11.0.1.0 (untouched)
Xrpl.Keypairs 10.9.0.0 10.9.0.0 (untouched)

git diff origin/release...origin/dev -- Base/ is empty, so the three base packages keep their published versions and Xrpl continues to depend on them as they are.

Read this before merging

This is a breaking change released as a patch, deliberately. Semver would call it a major: the return type is part of a method's signature in IL, so an assembly built against 11.5.0.0 meets a MissingMethodException on 11.5.1.0 even where it never wrote await, and its sources need the await dropped before they compile again.

It is numbered a patch because the validators are opt-in — nothing inside the SDK calls them, and BatchUtils.Build, the one caller that did, is the method this release fixes. CHANGES.md states the deviation and tells anyone calling Validation.* or Common.ValidateBaseTransaction directly to treat the upgrade as a major one: rebuild, and drop the await.

Merging this publishes to NuGet.org and GitHub Packages, and republishes the docs.

Verification

…ls.Build validates (#187)

* fix(validation)!: validators throw on the calling thread, so BatchUtils.Build validates

Validation.Validate and the 86 validators behind it were declared async Task
without ever awaiting anything, and BatchUtils.Build called Validate without
awaiting the result. An async method captures every exception into the task it
returns, including the ones thrown before the first await, so a discarded task
is a discarded verdict: ValidateBatch ran, decided the batch was malformed and
reported it to nobody. A Batch built around a single inner transaction - which
rippled answers with temARRAY_EMPTY - came back from Build looking well formed,
and so did one with more than eight inners, with a Vault/Loan inner, with an
inner missing tfInnerBatchTxn, or with an inner carrying a non-zero Fee. The
compiler had been saying so as CS4014 since the method was written.

The validators now return void and throw on the calling thread. Conditions,
exception types and messages are unchanged; `await Validation.Validate(tx)` no
longer compiles - drop the await. Making the signature honest is the fix rather
than adding the missing await: Build is synchronous and public, so awaiting
would have meant Task<Batch> BuildAsync, and .GetAwaiter().GetResult() would
have left the next caller the same trap.

TestUCredentialsValidator wrapped the already-synchronous ValidateCredentialsList
in Task.Run to fit the async assertion helper's Func<Task>. That worked while the
helper awaited the task, and is exactly the shape that stops working once the
assertion is synchronous, since Action accepts a lambda whose value is discarded.
The nine tests call the validator directly now.

Released as 11.5.1.0 rather than a major: the validators are opt-in, nothing
inside the SDK calls them, and BatchUtils.Build - the one caller that did - is
what this release fixes. CHANGES.md states the deviation for anyone calling
Validation.* or Common.ValidateBaseTransaction directly.

* docs(batch): say what ValidateBatch enforces, on the validator this release fixes
@Platonenkov
Platonenkov merged commit bb6aea9 into release Sep 15, 2026
11 checks passed
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