Skip to content

feat(xdr): add validateXdr static to every generated type - #1597

Merged
Ryang-21 merged 2 commits into
v17-feature-branchfrom
feat/validate-xdr
Aug 6, 2026
Merged

feat(xdr): add validateXdr static to every generated type#1597
Ryang-21 merged 2 commits into
v17-feature-branchfrom
feat/validate-xdr

Conversation

@Ryang-21

@Ryang-21 Ryang-21 commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

What

Adds a validateXdr static to XdrValue, so every generated XDR type (structs, unions, enums, byte aliases) can check whether input decodes as that type: xdr.TransactionEnvelope.validateXdr(str, "base64"). It accepts the same inputs as fromXdr (Uint8Array, or a string with "hex" | "base64"), returns a boolean, and never throws. Internally it delegates to js-xdr v5's schema-level validateXdr, so it skips building the class-instance tree. Includes tests and updates the migration guide and changelog to document this as a rename (validateXDRvalidateXdr) instead of a removal.

Why

The v17 rewrite dropped validateXDR and told users to wrap fromXdr in try/catch. People use this method, and adding it back is a low lift — one static on the shared base class covers all generated types. The only migration cost left is the casing change, which matches fromXdr/toXdr.

@github-project-automation github-project-automation Bot moved this to Backlog (Not Ready) in DevX Aug 6, 2026
@Ryang-21
Ryang-21 requested a balanced review from Copilot August 6, 2026 16:50

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds non-throwing XDR validation across generated value types via the shared base class.

Changes:

  • Adds static validateXdr with byte, hex, and base64 support.
  • Adds validation tests covering valid and malformed inputs.
  • Documents the validateXDRvalidateXdr migration.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
src/xdr/values/xdr-value.ts Implements shared schema-level validation.
test/unit/xdr/validate_xdr.test.ts Tests validation behavior and failure cases.
docs/XDR_MIGRATION.md Updates migration guidance and examples.
CHANGELOG.md Records the restored API under its new casing.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@Ryang-21
Ryang-21 merged commit 0853c39 into v17-feature-branch Aug 6, 2026
25 of 35 checks passed
@Ryang-21
Ryang-21 deleted the feat/validate-xdr branch August 6, 2026 23:23
@github-project-automation github-project-automation Bot moved this from Backlog (Not Ready) to Done in DevX Aug 6, 2026
Ryang-21 added a commit that referenced this pull request Aug 10, 2026
* Class XDR Implementation (#1422)

* feat(xdr): codegen tool + schema source

* feat(xdr): add class-based XDR runtime and sep51 JSON walker

* refactor(numbers): drop LargeInt classes, delegate to new XDR layer

* refactor(base): migrate src/base to new XDR layer; drop legacy xdr.ts + generated

* refactor: migrate downstream consumers (bindings/contract/horizon/rpc/webauth)

* feat(base/scval): add bool to ScValType

* allow opaque xdr types to be initalized via string

* refactor xdr strings to be represented soley via bytes with a dx friendly XdrString wrapper class

* generate a value getter function for void union cases

* add a is() function to the generated XDR union classes for instanceOf checks

* feat(xdr): regenerate schemas against @stellar/js-xdr and add CAP-71 credentials

* feat(xdr): wire the toJSON hook so JSON.stringify emits SEP-0051

* fix(bindings): emit Uint8Array for bytes/bytesN to match scValToNative

* refactor(contract): rename fromJSON to fromJson with deprecated aliases

* feat(xdr): accept ASCII asset codes with zero padding in constructors

* Migrate public API from Buffer to Uint8Array (#1564)

* feat(base): migrate crypto and strkey APIs to Uint8Array

* feat(base)!: migrate value types to Uint8Array

* feat(base)!: migrate transactions, operations, and auth to Uint8Array

* feat!: migrate contract, rpc, and webauth layers to Uint8Array

* build!: drop buffer polyfill and dependency

* fix(horizon): type manage_data value as string to match runtime API

* fix(xdr): emit SEP-51 key `type` instead of Rust-escaped `type_` (#1571)

* build(xdr): regenerate xdr.json via docker from pinned stellar-xdr commit (#1575)

* build(xdr): regenerate schema from stellar-xdr with CAP-83 and CAP-85 ungated (#1576)

* build(xdr): regenerate schema from stellar-xdr with CAP-83 and CAP-85 ungated

* fix(xdr): keep consumers compiling against the regenerated union arms

* fix(vitest): isolate browser dep cache per transport

* feat(xdr): support CAP-83 empty tx set values and CAP-85 external executables (#1577)

* build(xdr): fail the schema download instead of masking it in a pipe

* feat(xdr): support CAP-83 and CAP-85 protocol values

* fix(xdr): bound decimal string length before BigInt parse in JSON decode (#1581)

* fix(xdr): bound decimal string length before BigInt parse in json decode

* refactor(xdr): name the digit-budget constants in bigint-parts

* fix(xdr): restrict fromJson to SEP-0051 keys and reject unknown fields (#1582)

* fix(xdr): restrict fromJson to SEP-51 keys and reject unknown fields

* fix(test): correct horizon corpus fixture path so corpus tests run

* fix(strkey): bound decodeCheck input length before base32 decode (#1583)

* fix(xdr): reject AssetCode12 JSON codes shorter than 5 bytes (#1585)

* fix(horizon)!: make TransactionFailedExtras result_codes.operations optional (#1586)

* Fix: signed payload strkey framing (#1588)

* fix(strkey): validate signed payload framing in decodeCheck

* Fix: xdr json decode validation (#1592)

* fix(xdr): throw on unknown union discriminant in fromXdrObject

* fix(strkey): validate the claimable balance discriminant byte

* fix(xdr): reject non-decimal integer strings in JSON decoding

* V17.0.0 rc.1 (#1593)

* chore(release): cut v17.0.0-rc.1

* fix(spec): restore instanceof Map check lost in the v17 merge

* feat(xdr): add validateXdr static to every generated type (#1597)

* feat(xdr): add validateXdr static to every generated type

* fix(contract): declare error classes, make types self-contained (#1627)

* perf(strkey): reject by length and prefix before decodeCheck throws (#1629)

* fix: restore wide-int bounds statics, document Memo.text break (#1628)

* fix(xdr): restore wide-int MIN_VALUE/MAX_VALUE statics

---------

Co-authored-by: Iveta <quietbits@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants