wative-core 2.5.2 → 2.5.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -55
- package/dist/artifacts/evm/index.cjs +1 -1
- package/dist/artifacts/evm/index.d.cts +2 -2
- package/dist/artifacts/evm/index.d.ts +2 -2
- package/dist/artifacts/evm/index.js +1 -1
- package/dist/artifacts/svm/index.cjs +1 -1
- package/dist/artifacts/svm/index.d.cts +3 -3
- package/dist/artifacts/svm/index.d.ts +3 -3
- package/dist/artifacts/svm/index.js +1 -1
- package/dist/{container-provider-CwaWx7dP.d.cts → container-provider-B_TXusVF.d.cts} +4 -2
- package/dist/{container-provider-CH6Xg37M.d.ts → container-provider-C0dZf8jA.d.ts} +4 -2
- package/dist/{evm-YfBR8PgX.d.ts → evm-CsdcpuSb.d.ts} +1 -1
- package/dist/{evm-CNVThs9s.d.cts → evm-DjRcWpHv.d.cts} +1 -1
- package/dist/{file-sink-WkxXiVRr.d.cts → file-sink-B_Ng4V0f.d.cts} +2 -2
- package/dist/{file-sink-C0gUIm1T.d.ts → file-sink-gFMJnV3R.d.ts} +2 -2
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +67 -7
- package/dist/index.d.ts +67 -7
- package/dist/index.js +1 -1
- package/dist/index.node.cjs +1 -1
- package/dist/index.node.d.cts +6 -6
- package/dist/index.node.d.ts +6 -6
- package/dist/index.node.js +1 -1
- package/dist/node/index.cjs +1 -1
- package/dist/node/index.d.cts +3 -3
- package/dist/node/index.d.ts +3 -3
- package/dist/node/index.js +1 -1
- package/dist/{svm-DF7cHWms.d.cts → svm-B7qJlwaU.d.cts} +3 -2
- package/dist/{svm-CK_DQNIq.d.ts → svm-BZlfBFcJ.d.ts} +3 -2
- package/dist/{workspace-CFDXsaHa.d.cts → workspace-kmsiTC-d.d.cts} +278 -23
- package/dist/{workspace-CFDXsaHa.d.ts → workspace-kmsiTC-d.d.ts} +278 -23
- package/examples/14-esm-runtime.test.mjs +0 -3
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `wative-core` are documented here. The format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
4
4
|
|
|
5
|
+
## [2.5.4] — 2026-09-29
|
|
6
|
+
|
|
7
|
+
Reworks disabling wallet slots, adds a filtered wallet list, and improves mnemonic generation.
|
|
8
|
+
|
|
9
|
+
### Added
|
|
10
|
+
- Disable and re-enable derivation slots with `disableSlots`/`disableAddressNos`, `enableSlots`/`enableAddressNos` and `getDisabledSlots`; `getWalletList(force?)` returns enabled wallets by default (natural ids kept) or all of them with a `wallet.disabled` flag. `newMnemonic(wordCount?)` now generates any standard BIP-39 length, still defaulting to 12.
|
|
11
|
+
|
|
12
|
+
### Changed
|
|
13
|
+
- BREAKING: `setDisabledSlots`, `setDisabledAddressNos` and the `disabledSlots` property are removed — use the add/remove/read methods above. Disabling is now a reversible marker that hides a wallet from `getWalletList()` and blocks its signing, sending and key export with the new `WALLET_DISABLED` error, without changing which indices `deriveWallets` produces.
|
|
14
|
+
|
|
15
|
+
### Fixed
|
|
16
|
+
- Invalid-mnemonic errors now name the real defect — bad checksum, unknown word, or wrong length — instead of sometimes reporting a checksum failure as an unknown word.
|
|
17
|
+
|
|
18
|
+
## [2.5.3] — 2026-09-19
|
|
19
|
+
|
|
20
|
+
Adds foreign-transaction signing, sign-in, a keyless chain client, and Solana versioned transactions.
|
|
21
|
+
|
|
22
|
+
### Added
|
|
23
|
+
- Sign a transaction you did not build with `address.signRawTransaction(...)` (behind a confirm step, with explicit opt-in for the riskiest kinds), preview one with `address.estimate(...)`, sign in to a site with `address.signIn(...)`, and sign several at once with `address.signAll(...)`.
|
|
24
|
+
- `ChainClient` reads balances, simulates, and broadcasts on a network with no account or key; `address.checkDestination(...)` reports whether a recipient is safe, and transfers now refuse an irreversible-loss recipient unless you override.
|
|
25
|
+
- Solana transactions support address lookup tables and versioned (v0) transactions; `send(...)` takes per-send options — confirmation level, timeout, and endpoint route.
|
|
26
|
+
|
|
27
|
+
### Changed
|
|
28
|
+
- `Contract` and `Program` are no longer added to a shared registry on construction; `Contract.load(name)` / `Program.load(name)` return the built-ins only.
|
|
29
|
+
|
|
5
30
|
## [2.5.2] — 2026-09-18
|
|
6
31
|
|
|
7
32
|
Adds two methods for signing bytes you built yourself.
|
|
@@ -752,67 +777,54 @@ Unlocking is much faster. Drop-in from 2.2.x; wallets from 1.x need a manual ste
|
|
|
752
777
|
|
|
753
778
|
## [2.2.1] — 2026-07-29
|
|
754
779
|
|
|
755
|
-
Documentation and packaging only.
|
|
780
|
+
Documentation and packaging only. The code is identical to 2.2.0.
|
|
756
781
|
|
|
757
782
|
### Changed
|
|
758
|
-
- **The runnable examples ship as `examples/` instead of `tests/`.**
|
|
759
|
-
- **README** gains npm / CI / node / license badges,
|
|
783
|
+
- **The runnable examples ship as `examples/` instead of `tests/`.** If you referenced `wative-core/tests/...` by path, update it; nothing importable from the package entry changed.
|
|
784
|
+
- **README** gains npm / CI / node / license badges, a diagram of how `Workspace > Account > Wallet > Address` nest, and a section on the two account kinds. Under HD a `Wallet` is a derivation slot holding both an EVM and a Solana key; under PK it is a single imported key on one chain.
|
|
760
785
|
|
|
761
786
|
### Fixed
|
|
762
|
-
-
|
|
763
|
-
|
|
764
|
-
### Internal
|
|
765
|
-
- `.github/workflows/ci.yml`: runs the examples against this build on Node 22.12 and 24, and separately installs `wative-core` from the registry into a clean directory and runs the same files against it — exercising the real tarball's `files` list, `exports` map and dependency resolution. Runs weekly as well, since a published package sits on a moving dependency graph.
|
|
766
|
-
- The private development repo is now guarded against reaching npm (`private`, a `prepublishOnly` refusal, and a `publishConfig` registry pointing nowhere). It shares a package name with the public repo, so a stray publish there would have succeeded and replaced the package.
|
|
787
|
+
- **The `11-subpath-imports` example** now imports the chain artifacts through their subpaths, as its header documents. It previously failed in a real installation.
|
|
767
788
|
|
|
768
789
|
## [2.2.0] — 2026-07-28
|
|
769
790
|
|
|
770
|
-
> **The browser entry is here.** The main entry now
|
|
791
|
+
> **The browser entry is here.** The main entry now bundles for a browser with **zero** unresolvable Node builtins, and ships an IndexedDB storage backend. **No public API was removed** — existing Node imports keep working unchanged, so this remains a minor.
|
|
771
792
|
|
|
772
793
|
### Added
|
|
773
|
-
- **`IdbProvider` — IndexedDB storage backend.** Created via the async factory `IdbProvider.create(name, opts)`, which
|
|
774
|
-
- **`ContainerProvider`** —
|
|
775
|
-
- **`exportContainer()` / `importContainer()`** on `ContainerProvider`. Both require an unlocked workspace and throw `WORKSPACE_LOCKED` otherwise
|
|
794
|
+
- **`IdbProvider` — IndexedDB storage backend.** Created via the async factory `IdbProvider.create(name, opts)`, which requests durable storage before returning. Exposes `durability` (`"persistent" | "best-effort"`) and a `quota` snapshot.
|
|
795
|
+
- **`ContainerProvider`** — a base class for custom storage backends. A backend implements six methods (`_exist`, `_listItems`, `_read`, `_write`, `_remove`, `_ensureDir`) and inherits encryption and the workspace layout, so it no longer has to implement encryption itself.
|
|
796
|
+
- **`exportContainer()` / `importContainer()`** on `ContainerProvider`. Both require an unlocked workspace and throw `WORKSPACE_LOCKED` otherwise. Records move still encrypted and are never decrypted on the way. A container exported from one backend imports into another (IndexedDB ⇄ filesystem) and opens with the same password. Import refuses a non-empty target without `{ overwrite: true }` and rejects entries that do not belong to a container.
|
|
776
797
|
- **`wative-core/node` subpath** — `HybridProvider`, `FileSink` and the default-workspace-path resolver.
|
|
777
798
|
- **`STORAGE_NOT_DURABLE`** error code.
|
|
778
799
|
|
|
779
800
|
### Changed
|
|
780
|
-
- **The root entry
|
|
781
|
-
- `tsconfig` `lib` gains `DOM`; the browser is now a real target.
|
|
801
|
+
- **The root entry has separate browser and Node builds.** A browser bundler picks the browser build; Node picks one that still re-exports `HybridProvider` and `FileSink`, so `import { Workspace, HybridProvider } from "wative-core"` compiles and runs exactly as before. Those two re-exports are **deprecated** in favour of `wative-core/node` and will be removed in a future major.
|
|
782
802
|
|
|
783
803
|
### Browser notes
|
|
784
804
|
- Creating a **new** workspace in evictable storage is **refused** with `STORAGE_NOT_DURABLE` unless `{ acknowledgeEvictionRisk: true }` is passed. Opening an existing workspace is never blocked. Browser storage is evictable and this library holds private keys: Chrome and Firefox treat IndexedDB as best-effort unless `navigator.storage.persist()` is granted, Safari caps script-writable storage at roughly 7 days without user interaction, and private-mode windows may have no IndexedDB at all. Request persistence from a user gesture, and use `exportContainer()` for a durable backup.
|
|
785
805
|
- A **`Buffer` polyfill is still required** — `@solana/web3.js` and `@coral-xyz/anchor` read the global. Standard for any Solana dapp.
|
|
786
806
|
|
|
787
|
-
### Internal
|
|
788
|
-
- `scripts/browser-e2e.mjs` (`pnpm test:browser`) bundles the real dist through the `browser` condition, loads it into headless Chromium and drives a full lifecycle against the browser's own IndexedDB, asserting the same published BIP-44 vectors the Node suite pins. Resolving is not the same as running — a build can resolve cleanly and still fail at runtime, as a 2.1.0 regression showed. Wired into `prepublishOnly`.
|
|
789
|
-
- The published bundle is exercised under each platform to prove the export map lands where intended; asserting its shape is not the same as asserting a resolver's behaviour.
|
|
790
|
-
|
|
791
807
|
## [2.1.0] — 2026-07-28
|
|
792
808
|
|
|
793
|
-
> **Browser groundwork.**
|
|
809
|
+
> **Browser groundwork.** `wative-core/artifacts/evm` and `wative-core/artifacts/svm` now bundle for the browser with **zero** unresolvable Node builtins; the main entry is down to four (`fs`, `fs/promises`, `os`, `path`), all used by the filesystem storage backend. **No public API changed** — this is a drop-in upgrade from 2.0.7.
|
|
794
810
|
|
|
795
811
|
### License
|
|
796
812
|
- **Relicensed to a Modified MIT License** (previously BUSL-1.1). The library is now free for any use, including commercial. The sole added condition: a product or service generating more than 50,000 USD in monthly revenue must prominently display "Wative" on its user interface. Measured per product, not per company. `package.json` declares `"license": "SEE LICENSE IN LICENSE"`, the npm convention for a non-standard licence.
|
|
797
813
|
|
|
798
814
|
### Changed
|
|
799
|
-
- **`web3` 1.7.3 and `ethereumjs-wallet` 1.0.2 replaced by `ethers` 6.**
|
|
800
|
-
- **
|
|
801
|
-
-
|
|
802
|
-
- **
|
|
815
|
+
- **`web3` 1.7.3 and `ethereumjs-wallet` 1.0.2 replaced by `ethers` 6.** Their dependencies pulled in Node builtins that kept the package from bundling for a browser, and web3 1.x is end-of-life.
|
|
816
|
+
- **Encryption and hashing no longer depend on `node:crypto`**, so they run in the browser. Results are byte-identical, and `Cipher.encrypt`/`decrypt` stay synchronous.
|
|
817
|
+
- **IP-address validation no longer depends on `node:net`.**
|
|
818
|
+
- **Workspaces are unchanged.** A workspace written by 2.0.7 opens under 2.1.0, and derived addresses and signatures are identical.
|
|
803
819
|
|
|
804
820
|
### Fixed
|
|
805
|
-
- **EIP-712 with an empty `bytes` field no longer crashes
|
|
806
|
-
- **
|
|
821
|
+
- **EIP-712 with an empty `bytes` field no longer crashes**; it now signs as EIP-712 specifies.
|
|
822
|
+
- **A `gasLimit` too low for the transaction is still refused before signing**, so a transaction that can never execute is not broadcast.
|
|
807
823
|
|
|
808
824
|
### Notes for browser consumers
|
|
809
825
|
- `wative-core/artifacts/evm` and `wative-core/artifacts/svm` bundle cleanly today (the EVM artifact is ~128 KB min+gzip).
|
|
810
826
|
- A **`Buffer` polyfill is still required**, because `@solana/web3.js` and `@coral-xyz/anchor` depend on the global. This is standard for any Solana dapp.
|
|
811
|
-
- The main entry still requires the filesystem builtins listed above.
|
|
812
|
-
|
|
813
|
-
### Internal
|
|
814
|
-
- `scripts/check-browser-bundle.mjs` bundles every published entry for `platform=browser` and ratchets the set of unresolvable Node builtins — failing both on a regression and on a stale baseline, so browser compatibility can only improve. Wired into `prepublishOnly`.
|
|
815
|
-
- Known-answer vectors (`tests/kat/`) pin exact bytes for HD derivation, EIP-191/712 signing, ed25519, the ABI codec, all three EVM transaction types, both KDFs and the envelope wire format; a committed v2.0.7 workspace fixture is opened on every run.
|
|
827
|
+
- The main entry still requires the filesystem builtins listed above. A `wative-core/node` subpath for the Node-only parts (`HybridProvider`, `FileSink`) and an IndexedDB storage backend are planned for 2.2.0.
|
|
816
828
|
|
|
817
829
|
## [2.0.7] — 2026-07-21
|
|
818
830
|
|
|
@@ -820,44 +832,43 @@ Documentation and packaging only. `dist/` is byte-identical to 2.2.0 — no sour
|
|
|
820
832
|
|
|
821
833
|
### Added
|
|
822
834
|
- **`Workspace.open()` options object.** `open()` now accepts `{ provider?, path?, password? }` alongside the existing positional form, so the default location no longer needs an `undefined` placeholder: `await Workspace.open({ password })`. Passing both `provider` and `path` is rejected.
|
|
823
|
-
- **Automatic create-vs-open with folder validation.** `open()` decides for itself: an existing workspace is opened, an empty or absent location is created, and a **non-empty location that is not a wative workspace is refused** — so a mistyped path can no longer write a workspace into unrelated files.
|
|
835
|
+
- **Automatic create-vs-open with folder validation.** `open()` decides for itself: an existing workspace is opened, an empty or absent location is created, and a **non-empty location that is not a wative workspace is refused** — so a mistyped path can no longer write a workspace into unrelated files. Custom providers can override `Provider.inspectContainer()`; by default it accepts any location, so existing custom providers are unaffected.
|
|
824
836
|
|
|
825
837
|
### Changed
|
|
826
838
|
- **`create` parameter is deprecated and ignored.** The third positional argument to `open()` still type-checks so existing calls compile, but create-vs-open is now automatic. The former `"Workspace is not initialized. Pass create=true"` error is gone.
|
|
827
|
-
- **Dependencies.** `@solana/web3.js` 1.91.8 → **1.98.4**.
|
|
839
|
+
- **Dependencies.** `@solana/web3.js` 1.91.8 → **1.98.4**. With 1.91.8 the published package could no longer be loaded under plain Node after a change in one of its dependencies. 1.98.4 needs Node **22.12** or later, which is why the minimum Node version moves.
|
|
828
840
|
|
|
829
841
|
### Fixed
|
|
830
842
|
- **Signing.** `signTypedData` rejects a malformed `domain.chainId` with `PARAMETER_ERROR` instead of leaking a raw `SyntaxError`.
|
|
831
|
-
- **Transactions.** EIP-1559 auto-fill clamps a defaulted priority fee to a user-supplied sub-gwei `maxFeePerGas` (previously produced an invalid tip-over-cap pair); receipt
|
|
843
|
+
- **Transactions.** EIP-1559 auto-fill clamps a defaulted priority fee to a user-supplied sub-gwei `maxFeePerGas` (previously produced an invalid tip-over-cap pair); a receipt that reports its status as `0x01` is no longer misread as a revert; an auto-estimated `gasLimit` gets a 1.2x safety buffer.
|
|
832
844
|
- **Transaction tracker.** `abort()` now wakes pending `whenMined`/`whenConfirmed`/`whenFinalized` awaiters instead of hanging them forever; a failed send rejects those awaiters with the real cause rather than a misleading `TX_TIMEOUT`; `whenConfirmed(n)` with `n > 1` fails loudly instead of silently resolving at first inclusion.
|
|
833
845
|
- **Solana.** Anchor instruction accounts now take their signer/writable flags from the IDL instead of being forced to writable non-signer; `memo` is encoded as a real Memo-program instruction; `addressLookupTables` are rejected rather than silently dropped.
|
|
834
|
-
- **Workspace.** A network can no longer be dropped while a user-asset still references it, and
|
|
835
|
-
- **Accounts & wallets.** A forced `kind: "HD"` now validates the mnemonic checksum at create time;
|
|
846
|
+
- **Workspace.** A network can no longer be dropped while a user-asset still references it, and concurrent changes can no longer leave an asset or an account's default network pointing at a network that is gone.
|
|
847
|
+
- **Accounts & wallets.** A forced `kind: "HD"` now validates the mnemonic checksum at create time; concurrent tag changes on one wallet no longer overwrite each other; invisible Hangul filler characters are rejected in validated text; `formatUnits` no longer emits a misleading `"-0"`.
|
|
836
848
|
|
|
837
849
|
### Packaging
|
|
838
|
-
-
|
|
839
|
-
- The
|
|
850
|
+
- CommonJS TypeScript projects now resolve the `.d.cts` declarations.
|
|
851
|
+
- The package no longer includes a `tests/` directory.
|
|
840
852
|
|
|
841
853
|
## [2.0.5] — 2026-05-04
|
|
842
854
|
|
|
843
855
|
### Added
|
|
844
856
|
- **`EvmTransaction.toRawTx()` and `SvmTransaction.toRawTx()`.** Hand-off accessors that return the lowest-level transaction representation each chain ecosystem already understands, so callers can route a wative-core transaction through any external signer / RPC client without re-deriving the inputs.
|
|
845
857
|
- **`EvmTransaction.toRawTx(): EvmRawTx`** — synchronous. Returns a plain `{ from, to, value, data, type, chainId, nonce?, gasLimit?, gasPrice?, maxFeePerGas?, maxPriorityFeePerGas?, accessList? }` object matching the `web3.js` / `ethers` / `viem` `TransactionRequest` shape. Unset autofill fields are simply omitted, leaving the consumer's provider to fill them in. Does not sign or hit the network.
|
|
846
|
-
- **`SvmTransaction.toRawTx(): Promise<unknown>`** — async. Returns the underlying `@solana/web3.js` `Transaction` instance with `instructions`, `feePayer`, and `recentBlockhash` populated.
|
|
847
|
-
-
|
|
858
|
+
- **`SvmTransaction.toRawTx(): Promise<unknown>`** — async. Returns the underlying `@solana/web3.js` `Transaction` instance with `instructions`, `feePayer`, and `recentBlockhash` populated. Repeated calls return the same instance, and a subsequent `.sign()` reuses it.
|
|
859
|
+
- **`SvmTransaction` no longer needs an `Address` just to build.** If `recentBlockhash` is supplied at construction, `toRawTx()` builds without one. An Address is still required when the blockhash has to be fetched over RPC.
|
|
848
860
|
- **`EvmRawTx`** type exported from the package entry.
|
|
849
861
|
|
|
850
862
|
### Changed
|
|
851
|
-
- **
|
|
852
|
-
-
|
|
853
|
-
- **Per-process KDF cache HMAC secret is lazy-initialized.** No `crypto.randomBytes` call at module load time, removing one pre-condition for browser/Edge runtimes.
|
|
863
|
+
- **More robust file storage across operating systems.** `HybridProvider` handles long Windows paths, refuses to write through a symlinked parent directory, and cleans up temporary files left behind by an interrupted write. Log files that already exist are made owner-only (`0600`) when opened.
|
|
864
|
+
- **Importing the package no longer generates random bytes at load time**, which some edge runtimes forbid.
|
|
854
865
|
|
|
855
866
|
### Security
|
|
856
|
-
- **Passwords are normalized to NFC
|
|
857
|
-
-
|
|
858
|
-
- **
|
|
867
|
+
- **Passwords are normalized to NFC.** Clipboard managers and OS input methods occasionally hand back equivalent strings in different Unicode normalization forms; without normalization, a workspace created on one host would refuse to unlock on another. ASCII passwords are unaffected.
|
|
868
|
+
- **Malformed text in stored data fails with `DECRYPT_FAILED`** instead of being silently replaced with `U+FFFD`.
|
|
869
|
+
- **Reserved account names are matched case-insensitively.** Windows resolves `CON`/`con`/`Con` to the same device, so all three are reserved.
|
|
859
870
|
- **Workspace path resolver throws clearly when no home is available.** Containers and jails without `HOME` / `USERPROFILE` previously fell through to a malformed path; now `Workspace.open()` surfaces a `PARAMETER_ERROR` directing the caller to set `WATIVE_WORKSPACE_PATH` or pass an explicit path.
|
|
860
|
-
-
|
|
871
|
+
- **A workspace path too long for the OS now returns `PROVIDER_IO`** with an actionable "relocate workspace closer to root" message.
|
|
861
872
|
|
|
862
873
|
## [2.0.3] — 2026-05-04
|
|
863
874
|
|
|
@@ -865,16 +876,15 @@ Documentation and packaging only. `dist/` is byte-identical to 2.2.0 — no sour
|
|
|
865
876
|
- **Default workspace path renamed** from `<cwd>/.wative` to `<cwd>/.wative2`. Existing on-disk workspaces under `.wative/` are not migrated automatically — pass the old path explicitly to `Workspace.open()` if you want to keep using one, or rename the directory.
|
|
866
877
|
- **`Workspace.open()` no-arg path now resolves through a 3-tier strategy:**
|
|
867
878
|
1. `WATIVE_WORKSPACE_PATH` env var (if set & non-empty) — wins unconditionally. `~` is expanded.
|
|
868
|
-
2. `<process.cwd()>/.wative2` — used when the env var is unset and the directory already exists on disk.
|
|
879
|
+
2. `<process.cwd()>/.wative2` — used when the env var is unset and the directory already exists on disk. A symlink at this path is refused and resolution falls through to the home directory.
|
|
869
880
|
3. `<os.homedir()>/.wative2` — last-resort fallback. Where `create=true` lands on a fresh machine when no env var is set and there's no project-local `.wative2/`.
|
|
870
881
|
|
|
871
882
|
Calls that pass an explicit path or `Provider` instance are unaffected — those short-circuit before any resolution.
|
|
872
883
|
|
|
873
884
|
### Security
|
|
874
|
-
- **
|
|
875
|
-
- **
|
|
876
|
-
-
|
|
877
|
-
- **`useTestKdfIterations` Jest auto-detect removed.** The `typeof globalThis.expect !== "undefined"` opt-in arm fired in any downstream consumer using Jest, not just our own test process. Now requires explicit `WATIVE_ALLOW_TEST_KDF=1` (or `NODE_ENV=test`). Internal-only function; not on the package surface.
|
|
885
|
+
- **Passwords are stretched with Argon2id, and stored records can no longer be swapped.** Each stored record is now bound to where it lives, so someone who can write to the workspace folder but does not know the password can no longer substitute one record's contents for another's. Workspaces written by 2.0.1 still open; everything written from this release on uses the new format.
|
|
886
|
+
- **The suffix added to a duplicate account name is now unpredictable.**
|
|
887
|
+
- **`Account.lock()` now wipes the derived seed from memory.** Mnemonics and private keys held as JavaScript strings cannot be wiped the same way (see `Workspace.lock()`).
|
|
878
888
|
|
|
879
889
|
## [2.0.1] — 2026-04-29
|
|
880
890
|
|
|
@@ -894,12 +904,12 @@ First release of the v2 line.
|
|
|
894
904
|
|
|
895
905
|
### Security
|
|
896
906
|
- Built-in networks and tokens cannot be dropped from the workspace (they would orphan accounts that reference them by default).
|
|
897
|
-
- Concurrent `addAsset` / `dropAsset` and network
|
|
898
|
-
-
|
|
907
|
+
- Concurrent `addAsset` / `dropAsset` and network changes can no longer produce duplicate asset ids or network slugs.
|
|
908
|
+
- A workspace whose stored data holds duplicate asset ids or network slugs fails to open with an error instead of loading.
|
|
899
909
|
|
|
900
910
|
### Notes
|
|
901
|
-
- Requires Node.js 18.18+.
|
|
902
|
-
- Source maps are not published. The npm package contains only compiled JavaScript and TypeScript declaration files.
|
|
911
|
+
- Requires Node.js 18.18+. Installation needs no native build step. Deno, Bun and browser support is partial.
|
|
912
|
+
- Source maps are not published. The npm package contains only compiled JavaScript and TypeScript declaration files.
|
|
903
913
|
|
|
904
914
|
[2.0.7]: https://github.com/braady/wative-core/releases/tag/v2.0.7
|
|
905
915
|
[2.0.3]: https://github.com/braady/wative-core/releases/tag/v2.0.3
|