fix(deps): move chia-wallet-sdk 0.34.0 -> 0.36.0 to heal the internal chia split - #36
Conversation
Refs: DIG-Network/dig_ecosystem#3161 Co-Authored-By: Claude <noreply@anthropic.com>
PARKED — resume-ready. Stub only; the adaptation work was not pushed.A lane stalled at the 600s watchdog part-way through The task, restated so it needs no re-derivationMove
chia-protocol = "0.36.1" # already correct
chia-bls = "0.36.1" # already correct
chia-consensus = "0.36.1" # already correct
chia-traits = "0.36.1" # already correct
chia-puzzles = "0.20.3" # already correct
chia-puzzle-types = "0.36.1" # already correct
chia-wallet-sdk = { version = "0.34.0", features = [...] } # <-- the only line to moveBecause the split lives inside the published manifest, consumers cannot escape it by bumping. Identical shape to Why it is worth a laneIt is the sole holdout blocking two ready adoptions:
The rest of the family already moved: The API deltas, already measured from the consumer side — expect real churn
Adapt the call sites; never bridge two versions with a shim (§4.1 byte-drift). If Check all four feature flags still exist in 0.36.0 — Traps that cost time elsewhere in this epic today
Parent epic: https://github.com/DIG-Network/dig_ecosystem/issues/3161 |
Salvaged from a stalled lane's worktree. Not yet compiled; pushed immediately so the adaptation cannot be lost a second time. Co-Authored-By: Claude <noreply@anthropic.com>
The two call sites the stalled lane had not reached. `cargo check --locked --all-targets` is now clean. Co-Authored-By: Claude <noreply@anthropic.com>
The 4.0.0 split was a manifest-coherence defect, which no behavioural test can see: both halves of a split run correctly in isolation. Pins per-family MAJOR.MINOR agreement, pooling Cargo.toml and napi/Cargo.toml so a split cannot hide in the bindings half. Co-Authored-By: Claude <noreply@anthropic.com>
The JS-facing `DataStore`/`DataStoreMetadata` structs keep their names on purpose: they are the published npm/TypeScript surface, and an upstream capitalisation change is not observable to a JS consumer. Co-Authored-By: Claude <noreply@anthropic.com>
Resumed and COMPLETE — ready for the gate. Do not undraft, do not merge.Branch Correction to the parked note: the work was NOT goneThe note said the stalled lane's source changes "must be redone". They were recoverable — the lane's worktree survived on disk with all of it uncommitted ( Worth recording for the loop generally: a dead lane's absence of pushed commits does not prove its work is gone — check its worktree before redoing anything. Redoing it would have cost a full re-derivation of ~40 adapted call sites that were already correct. What is done
Gate evidence
Full evidence, the traced lock analysis, the blast-radius table and the revert-proof transcripts are in the PR body. Flagged for the gate
Parent epic: https://github.com/DIG-Network/dig_ecosystem/issues/3161 |
|
Correction to my parked note above: it was wrong. It said the stalled lane's work "is gone and must be redone". It was not gone — the worktree survived on disk with every source change uncommitted, and only two call sites in I inferred "lost" from |
loop-security — interim findings (audit in progress)Head audited: Verdict not yet formed. Posting as findings land, per the loop's post-as-you-go rule. 1. The rename dispute is SETTLED — no generic was added. Lane's account is correct.The PR's own pre-image proves it. At base, The
Same arity, same default. Nothing is hiding behind a defaulted type parameter. 2.
|
loop-security — STOP. The stated merge consequence is wrong, in both directions.Head audited: The gate brief says a squash-merge "immediately publishes crate 5.0.0 to crates.io
Both publish jobs run, the workflow goes green, and the crates.io step prints The mechanism
It requires a line that is exactly a bare semver. I ran that regex against the six
That line begins with This is corroborated three ways, not just by my reading of the regex
Why this gates rather than being a noteNot because the code is unsafe — the diff is clean and I will say so separately. It gates
What would make this land as intendedCheapest correct fix, and it matches every prior release in this repo: land the version Whatever is chosen, please also reword Remaining checks (major-bump justification, |
bee1976 to
3cc1ae9
Compare
…plit datalayer-driver 4.0.0 shipped internally split: every chia primitive sat at the 0.36.1 ceiling while chia-wallet-sdk stayed on the 0.34 line. Because the split lived inside the published manifest, no consumer could escape it by bumping, which blocked digs/digstore-chain and dig-wallet-backend simultaneously. BREAKING CHANGE: the re-exported driver types follow chia-wallet-sdk 0.36's rename -- `DataStore`, `DataStoreInfo` and `DataStoreMetadata` are now `Datastore`, `DatastoreInfo` and `DatastoreMetadata`. The published npm/TypeScript surface is UNCHANGED: the rename is absorbed at the NAPI alias boundary, so `DataStore` remains the JS interface name. Note for anyone editing this message: no line of this body may BEGIN with a version string. CI.yml's publish-npm step greps the squash body line-by-line with an unanchored pattern, so a wrapped sentence starting "0.36.1" fires an unintended npm publish. That is not hypothetical -- it was the state of this commit until the gate on PR#36 measured it. Co-Authored-By: Claude <noreply@anthropic.com>
3cc1ae9 to
463680d
Compare
loop-security VERDICT: PASS (with two RELEASE-time conditions)Head audited: Why the earlier probes still hold at the new head
Re-measured trigger at
|
| job | regex it uses | at bee1976 |
at 463680d |
|---|---|---|---|
publish-crates |
bare-semver, anchored both ends | 0 matches | 0 matches |
publish-npm elif |
bare-semver, anchored at start ONLY | 1 match | 0 matches |
The only body line still starting with a digit is the one beginning 0.36's rename, which cannot
match: after 0.36 comes an apostrophe, not a second dot, so there is no third numeric group.
Merging 463680d publishes NOTHING. Both jobs run and skip. That removes the irreversible
action I gated on - the unintended @dignetwork/datalayer-driver@3.0.1 npm publish will not happen.
The crates.io half still will not fire, now correctly tracked as DataLayer-Driver#37 rather than
papered over; keeping a release-control change out of a dependency PR is the right call.
CI at this head is terminal and green: 18 SUCCESS, 2 SKIPPED (Publish to NPM,
Publish to Crates.io), asserted by name since there is no branch protection to read a required set
from.
The eight brief items - all verified
1. Rename vs added generic - SETTLED: pure capitalisation rename, no generic added.
The PR's own pre-image proves it: at base, src/wallet.rs:526 already read
DataStore::<DataStoreMetadata>::from_spend. Both published sources agree - 0.34 declares
pub struct DataStore<M = DataStoreMetadata>, 0.36 declares
pub struct Datastore<M = DatastoreMetadata>. Same arity, same default.
The earlier consumer-side measurement claiming the generic was ADDED is wrong, and nothing is
hiding behind a defaulted type parameter.
2. Verification / VerificationAsserter / VerifiedData - zero occurrences repo-wide
(.rs/.ts/.js/.json, excluding target/ and node_modules). Their upstream removal is a non-event
here and is correctly NOT used to justify the major bump.
3. Major 4.0.0 -> 5.0.0 - correct; neither over- nor under-bump.
Public-surface diff across lib.rs + types.rs + wallet.rs: 3 items removed, 3 added, all
rename pairs - zero genuine removals or additions. Confirmed individually: 3 renamed re-exports
(src/lib.rs:31-33); SuccessResponse::new_datastore retyped (src/types.rs:21); 5 public fns in
lib.rs - oracle_spend:276, update_store_metadata:290, update_store_ownership:311,
melt_store:325, async_api::sync_store:554; plus SyncStoreResponse::latest_store
(src/wallet.rs:477) and the wallet:: equivalents, which the lane's count of five understates in
the safe direction. use datalayer_driver::DataStore no longer compiles, so major is required.
4. npm .d.ts byte-identity - CONFIRMED; the PATCH is justified.
napi/index.d.ts and napi/index.js are tracked and unchanged in the diff. The sole
napi_lib.rs hunk is the use block only - no #[napi] item touched. The JS-facing structs
deliberately keep their names (napi/src/napi_lib.rs:106,237), so the generator's input is
unchanged too.
5. Melt KAT - non-vacuous, mutation-proved in BOTH directions.
It recomputes from a live Simulator mint -> melt with both spends landed on chain: no fixtures, no
reloading. "Expected values untouched" is true because there are NO pinned values - only pinned
signals, which is the right shape for what digstore-chain's classifier depends on.
- Probe 1: melt assertion changed to
InvalidMemo-> RED, reportinggot Err(MissingChild). - Probe 2: positive control changed to
is_none()-> RED.
It would have gone red had 0.36 moved the melt signal.
6. #![allow(clippy::result_large_err)] - acceptable in a dependency move.
It is a clippy perf lint with no security meaning, names exactly one lint, and masks nothing else
(cargo clippy --all-targets --all-features -D warnings is green). It is also pre-existing, not
introduced here: src/wallet.rs:1 already carried the module-level allow, and
src/dig_collateral_coin.rs:152,177,213,266 carry four more, from f6cd59b in 2025-12.
src/lib.rs:24 widens it to crate scope and documents why. Boxing would reshape a public error enum
inside a dependency PR; deferring it is right.
7. Feature flags - all four present in published 0.36.0: action-layer, chip-0035,
native-tls, peer-simulator. Verified from two independent sources (the vendored
chia-wallet-sdk-0.36.0/Cargo.toml and the crates.io index). The feature set is identical
between 0.34.0 and 0.36.0 - nothing silently dropped.
8. Blast radius - pins confirmed safe; nothing breaks on merge.
digstore-chain "4", dig-collateral-coin "3.0.0", npm chia-block-listener ^0.1.35. None
admits 5.0.0 or 3.0.1 automatically.
Correction to item 8: adoption is a two-level cascade, not a three-line edit
The brief cites only src/singleton.rs:13,21,100. In fact digstore-chain/src/singleton.rs names
DataStore/DataStoreMetadata at ~13 sites, and line 21 is load-bearing - it re-exports the
renamed type:
pub use datalayer_driver::{DataStore, DelegatedPuzzle, PublicKey};
So the rename propagates into digstore-chain's OWN public API - it needs its own major bump, and its
consumers (hub.dig.net anchor-watcher) inherit it.
modules/crates/00-foundation/dig-collateral-coin/src/lib.rs:1 is a second re-export layer, pinned
at datalayer-driver = "3.0.0". Plan the epic for two levels.
Additional security checks beyond the brief
-
The on-chain custody surface is byte-identical across 0.34 -> 0.36. This was the question that
actually mattered - whether a "capitalisation rename" carried a spend-encoding change with it. It
does not.chia-sdk-types/src/condition.rsdiffers by exactly four diff lines, the rename
alone.UpdateDatastoreMerkleRootkeeps opcode -13,new_merkle_root: Bytes32and its
trailingmemos: Vec<Bytes>.DatastoreMetadata'sToClvm/FromClvmare unchanged apart from
the type name, so metadata tree hashes are stable and a store minted under 4.0.0 stays updatable
under 5.0.0. -
0.36 CLOSES two upstream defects - both arguments FOR this move, neither claimed in the PR body:
- 0.34's
datastore_info.rs:79-81parsed the oracle fee by indexing element 0 of
to_u64_digits(), which panics on the canonical CLVM encoding of zero (an empty atom
yields an empty digit vector). That is a remote panic primitive, becausesync_storeparses
spends served by peers and NC-12 holds every dialled peer untrusted. 0.36 returns 0 for the
empty memo and errors on overflow instead of silently truncating. - 0.34's
from_spendran the metadata-updater puzzle revealed in the spend with no check that
it matched the updater hash committed in the state layer; 0.36'smetadata_update.rs:47-49
refuses on mismatch, so a hostile peer can no longer make the driver compute an arbitrary
root_hashand hand it back as the store's current state.
Both changes are fail-closed. Legitimate on-chain spends are unaffected.
- 0.34's
-
The split is genuinely healed. All ten
chia-sdk-*/chia-wallet-sdkcrates move uniformly
0.34.0 -> 0.36.0 with no half-move. Crates resolving to more than one version are identical
before and after (5 crates - the upstream-vendoredclvmr/chialisplines the new guard's own
doc comment documents). Two new packages,include_dir+include_dir_macros0.7.4, arrive
transitively viarue-compiler 0.8.5; both established and benign. -
The new 295-line coherence guard is real, mutation-proved. Reintroducing the exact 4.0.0 split
fires 2 of 4 tests with the intended message; a patch-level cross-manifest disagreement fires the
dedicated test. It carries its own anti-vacuity assertion
(tests/manifest_chia_coherence.rs:165-170) and pins exact membership, so a dropped dependency
cannot hide. -
Secrets: clean. No key, token, credential or projectId introduced, logged, or committed.
-
No new endpoint, RPC, permission, privilege elevation, deserialization, path, or amplification
surface; nothing peer-reachable is added..gitignoregains.gitnexus, which is correct.
TWO CONDITIONS ON THE RELEASE (not on this merge)
A. #37 does NOT cover the worst part of that job - fixing it narrowly ARMS an unverified publish
I checked #37's body: it does not mention --no-verify or --allow-dirty. But the publish step at
.github/workflows/CI.yml:359 runs cargo publish with both flags.
--no-verify means the crate is never built from its packaged tarball before it is published
irreversibly, and --allow-dirty packages whatever is in the working tree - while the immediately
preceding step (CI.yml:337-349) deliberately runs cargo update and commits Cargo.lock first. A
resolution that does not compile publishes anyway, with no recall.
This is dormant only because the trigger never fires. The moment #37 is fixed it becomes live
on the very next release. It is the same anti-pattern CLAUDE.md records as a durable guard REMOVED
from chia-l2-consensus after a P0 in which a published crate carried a different rule than its source.
Add this to #37 (or file a sibling) and fix both together. Fixing the trigger alone converts a
silent no-op into an unverified irreversible publish - strictly worse than today.
B. Nothing in this pipeline will ever check that 5.0.0 packages and builds
Because CI publishes with --no-verify, run cargo package --locked (or
cargo publish --dry-run) before the real 5.0.0 release. I did not run it, and no gate does.
Branch protection (dig_ecosystem#3164): recommend PROVISION-FIRST
Reasoning, not preference.
- The usual case for merge-then-provision is urgency: "this merge publishes irreversibly, do not
block it." That premise is now measured false - merging463680dpublishes nothing. There is
no race to win, so the strongest argument for merge-first has evaporated. - Merge-and-file is the weakest option: it leaves
mainunprotected on a repo whose publish jobs
fire on push tomain, with zero required checks, no conversation-resolution gate and no
force-push protection - contrary to section 3.6b - for as long as the ticket sits. CI.ymlmust be edited anyway to resolve npm prerelease match is unanchored (prose publishes), and crates.io publishes with --no-verify --allow-dirty #37, so provisioning in the same pass is nearly free.
The two caveats that make provision-first safe, and they are the part worth carrying into #3164:
- Derive required contexts from the checks that actually RAN on
463680d, never from
CI.yml's job keys. Matrix jobs report under expandedname:templates - for example
stable - x86_64-unknown-linux-gnu - node@20andTest bindings on Linux-x64-gnu - node@20-
which do not match the job keysbuildandtest-linux-x64-gnu-binding. Requiring a key
that never reports blocks every PR forever understrict=true. - Never require
Publish to NPMorPublish to Crates.io. Both reportSKIPPEDon pull
requests - confirmed on this PR's rollup at both heads - andSKIPPEDis notSUCCESS, so
requiring either deadlocks every future PR.
Safe minimal required set, taken from this head's rollup: rust-checks; the five
stable - <target> - node@20 contexts; the eight Test bindings on ... contexts; and CodeQL.
With strict=true, required_conversation_resolution=true, enforce_admins=false, squash-only,
required_linear_history=true, zero required approvals.
What I could NOT verify
- That 5.0.0 packages and builds from its own tarball - condition B above. Nothing checks it.
- Runtime behaviour of the npm native addon on any platform. The type surface is byte-identical
and the Rust-side behaviour changes are fail-closed, but I ran no JS consumer. Stated plainly: the
patch bump DOES carry a real behaviour change - asyncStorethat previously succeeded on a
malformed oracle memo (silently truncating) or on a mismatched metadata updater now throws. The
direction is safer, but it is more than "identical.d.ts" implies. - The claim that 0.36 grew
ClientErrorto ~136 bytes. Not measured; it is a clippy perf
threshold with no security consequence either way. - Whether GitHub renders squash bodies at column 0. Now moot: at
463680dzero lines match
either regex, so the outcome is publish-nothing under every possible formatting.
Acknowledgement
I understand a PASS authorises a squash-merge into an unprotected main on a repo whose publish
jobs fire on push to main, and that a crates.io or npm publish is irreversible with no recall. I
pass because I measured that this head publishes neither - not because I assume it is safe.
If the commit message is edited again before merge, the trigger measurement must be re-run,
because the message IS the trigger.
Probe disclosure
All mutation probes ran in a worktree I cut myself, C:\tmp\worktrees\dld-secaudit-36 (detached),
now removed. I mutated no shared checkout. The single command run inside the lane's worktree was
cargo test --locked --lib melt_kat, which writes target/ only, while the lane was idle (no cargo
or rustc processes). Its Cargo.lock md5 is ff0a3f66... before and after, and
git status --porcelain there shows only the pre-existing untracked .claude/, AGENTS.md and
CLAUDE.md. The coherence-guard probe deliberately ran the pre-built test binary against
mutated manifests, so Cargo.lock was never re-resolved at all.
WIP — DO NOT MERGE. Gate round pending.
Task
Move
chia-wallet-sdk0.34.0 → 0.36.0, healing the internal chia split indatalayer-driver.Parent epic: https://github.com/DIG-Network/dig_ecosystem/issues/3161
Published 4.0.0 ships internally split: every chia primitive at
0.36.1besidechia-wallet-sdkat0.34.0. Because the split lives inside the published manifest, no consumer can escape it by bumping — which is why this crate is the sole holdout blocking two ready adoptions (digs/digstore-chain,dig-wallet-backend).Same shape as
dig-chainsource-interface0.3.1, fixed in its #7; the manifest-coherence guard there is adapted here.The ceiling
chia-wallet-sdk0.36.0 is the newest published version — verified live againstindex.crates.io. The primitives publish at 0.48 and are unreachable while the SDK sits at 0.36, so0.36.1primitives beside0.36.0chia-wallet-sdkis the coherent maximum. The primitives were already at their ceiling and are deliberately left alone; bumping them to 0.48 would re-split the crate, not modernise it.Feature-flag check
All four declared features exist in 0.36.0 — read from the crates.io index, not assumed. A silently-dropped feature is a capability loss that compiles, so this was checked rather than inferred:
0.36.0publishesaction-layer,chip-0035,chip-0037,native-tls,offer-compression,peer-simulator,rustls— a superset of the four this crate declares (chip-0035,native-tls,peer-simulator,action-layer). Nothing dropped.API deltas adapted
The churn is a capitalisation rename, not a signature change.
DataStorealready carried its<M>metadata parameter in 0.34, so no generic parameter was added:DataStoreDatastoreDataStoreInfoDatastoreInfoDataStoreMetadataDatastoreMetadataUpdateDataStoreMerkleRootUpdateDatastoreMerkleRootAdapted across
src/lib.rs(public re-exports and five fn signatures),src/types.rs(SuccessResponse::new_datastore),src/wallet.rs(the bulk —from_spend,owner_create_coin_condition,get_recreation_memos,new_metadata_condition, the mint metadata literal and the KAT), andnapi/src/.No shim, no bridging. Every call site moved to the 0.36 spelling.
Verification/VerificationAsserter/VerifiedData— not applicable hereThese are removed in 0.36 and their removal is genuinely breaking in general, so it was checked rather than assumed. A repo-wide grep across
*.rs,*.toml,*.tsand*.jsreturns zero occurrences: this crate never referenced them, so their removal is a non-event for it and does not contribute to the bump rationale.The npm/TypeScript surface is UNCHANGED
The rename is absorbed at the NAPI alias boundary (
Datastore as RustDataStore). The JS-facingDataStore/DataStoreMetadatastructs deliberately keep their names, because an upstream Rust capitalisation change is not observable to a JS consumer and renaming them would break every one of them for nothing.napi/index.d.tsis byte-unchanged, and the threeDataStorementions inREADME.mdare all JavaScript examples that remain correct.Evidence
The KAT reproduces UNMODIFIED — this is the load-bearing result
wallet::melt_kat::from_spend_reports_owner_melt_as_missing_childis a real peer-simulator mint → melt that pins the custody-relevant signaldigstore-chain's melt classifier depends on: a childless datastore singleton spend surfaces asErr(DriverError::MissingChild), while a spend that recreates the datastore surfaces asOk(Some(_)).Its expected values were not touched. Only the type's spelling changed. Had either signal moved in 0.36 the test would have gone red rather than needing an edit — which is precisely the evidence that the downstream classifier is still safe. It carries its own positive control (the launcher spend), so it distinguishes the real property from an implementation that returns
MissingChildfor every datastore spend.Full suite,
--lockedcargo clippy --all-targets --all-features -- -D warnings→ exit 0 (read unpiped)cargo fmt --all -- --check→ exit 0cargo check --locked --workspace --all-targets→ clean, including thenapimemberCargo.lockupdated viacargo update -p, committed, and every run passes--lockedThe lock: what actually changed, and what legitimately did not
The
chia-sdk-*family moved0.34.0→0.36.0(10 entries). The crate's declared set is now one line per family:chia-protocol/chia-bls/chia-consensus/chia-traits/chia-puzzle-types/clvm-traits/clvm-utilsat0.36.1,chia-wallet-sdkat0.36.0,chia-puzzles0.20.3,clvmr0.16.2.Older chia lines remain in the resolved lock and are correct. Each was traced, not assumed:
chia-bls 0.28.2,chia-traits 0.28.2,chia_streamable_macro 0.28.2,chia-sha2 0.34.0— reached fromclvmr 0.16.4, internal to the CLVM evaluator.chia-bls 0.42.1,chia-traits 0.42.1,chia_streamable_macro 0.42.1,chia-ssl 0.42.1— reached fromchialisp 0.4.6, itself pulled bychia-sdk-typesandrue-lir.None is declared by this workspace and none reaches a public signature — proven by the fact that the crate compiles against the SDK's own types, which is what unification means.
cargo tree -dcannot be the gate here:chia-wallet-sdkfails it on its own vendored graph, so any correct implementation fails it.The regression guard
tests/manifest_chia_coherence.rsfails if this workspace ever again declares two minor lines of onechia-*family.No behavioural test can catch this defect — both halves of a split run correctly in isolation, which is exactly why 4.0.0 shipped. The defect was manifest coherence, and that is mechanically assertable.
It is extended beyond the
dig-chainsource-interfaceoriginal in one way that matters here: this workspace declares the chia set twice (Cargo.tomlandnapi/Cargo.toml), so the two manifests are pooled into one coherence judgement and a fourth test pins that they agree on every shared dependency. A guard reading only the root manifest would be blind to half the surface.Revert-proof
Committed first, and reverted by file copy (never
git checkout <path>).(a) A root-manifest split does not even compile. Setting
chia-wallet-sdkback to0.34.0inCargo.tomlfails the build, before any test runs — 5 errors, e.g.OracleLayer::newexpectingBytesImpl<32>and finding[u8]. That is stronger evidence than a red test: it proves the source adaptation is genuinely load-bearing rather than cosmetic.(b) So the guard was proven on the half that DOES compile silently — a split in
napi/Cargo.toml, which is a separate workspace member and builds fine while wrong. This is the real silent case, and two tests fired, each naming the defect:Restored, and green again at the real versions — the truthful control that the guard does not fire on the legitimate non-uniform ceiling (
0.36.0SDK beside0.36.1primitives):4 passed; 0 failed.The lock pollution the guard's own doc warns about happened, and was caught. The
--offlineproof run silently re-resolvedCargo.lock(md54da4235…→fd5cb67…). Restoring only the manifest would have shipped a two-line split created by the proof itself.--lockedrefused loudly on the next run; the lock was restored from its copy and verified byte-identical before committing.Which direction a wrong version fails in
Loudly, at compile time, in both directions — this adoption cannot fail silently:
cannot find typeerrors this branch started from.napi/compiles, and that is the silent case — which is exactly the hole the new guard closes.The one genuinely silent risk would have been a behavioural change in the melt signal, and the KAT covers it.
Blast radius checked
Within the crate, the Rust compiler is the exhaustive oracle for a type rename — every call site must compile, and
cargo check --locked --workspace --all-targetsis clean. Cross-repo, every consumer was grepped directly:digs/digstore-chaindatalayer-driver = "4"DataStoreand constructsDataStoreMetadata(src/singleton.rs:13,21,100). Two spellings to change when it adopts 5.x.dig-collateral-coin"3.0.0"dig-wallet-backendDigDataStoreMetadataisdig_merkle's own typeanchor-watcherdig-mirror-coinNothing breaks on merge: every consumer pins
^4or^3, so a5.0.0release cannot be picked up implicitly. Adoption is the deliberate follow-up this PR exists to unblock.Tooling note (§2.0 bound 2): gitnexus was not indexed for this worktree; blast radius was established by the compiler (exhaustive for a rename), plus ripgrep across all consuming manifests and sources. Stated rather than glossed.
Bump
Cargo
4.0.0→5.0.0(MAJOR). The public re-exportsDataStore/DataStoreInfo/DataStoreMetadataare renamed,SuccessResponse::new_datastorechanges type, and five public fn signatures change. A consumer writingdatalayer_driver::DataStorebreaks, so this is breaking and is labelled as such — theBREAKING CHANGE:footer is on the commit.npm
@dignetwork/datalayer-driver3.0.0→3.0.1(patch). The JS surface andindex.d.tsare unchanged; only the native addon is rebuilt against 0.36. The bump is required becausepublish-npmfires on push tomainand would otherwise fail on a duplicate version. The two artifacts are already independently versioned (Cargo 4.x vs npm 3.x), so they are bumped on their own merits.Also in this PR
#![allow(clippy::result_large_err)]with a WHY comment. 0.36 grewClientErrorto ~136 bytes, pushingWalletErrorpast clippy's 128-byte threshold and failing-D warningsat three sites. Boxing the variant would fix it properly but reshapes the crate's public error enum and every construction and match site — a deliberate refactor, not part of a dependency move. Suppressed explicitly and reported as a follow-up rather than silently widened or quietly ignored.napi/package-lock.jsonroot version corrected from0.1.38to matchpackage.json. Pre-existing drift, two lines, in a file this PR already touches.