wative-core 2.3.9 → 2.4.0

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +148 -0
  2. package/dist/artifacts/evm/index.cjs +1 -1
  3. package/dist/artifacts/evm/index.d.cts +2 -2
  4. package/dist/artifacts/evm/index.d.ts +2 -2
  5. package/dist/artifacts/evm/index.js +1 -1
  6. package/dist/artifacts/svm/index.cjs +1 -1
  7. package/dist/artifacts/svm/index.d.cts +3 -3
  8. package/dist/artifacts/svm/index.d.ts +3 -3
  9. package/dist/artifacts/svm/index.js +1 -1
  10. package/dist/{container-provider-D_557LVN.d.ts → container-provider-D2QluIe_.d.ts} +1 -1
  11. package/dist/{container-provider-CkKGyHis.d.cts → container-provider-DAUXclw_.d.cts} +1 -1
  12. package/dist/{evm-Xw4zBLUH.d.ts → evm-GxBuNjq7.d.ts} +1 -1
  13. package/dist/{evm-gsdoVj16.d.cts → evm-qXdZWugm.d.cts} +1 -1
  14. package/dist/{file-sink-D33jvque.d.ts → file-sink-B0EjCBvG.d.ts} +2 -2
  15. package/dist/{file-sink-C_SlT9IC.d.cts → file-sink-DSOZbsJM.d.cts} +2 -2
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.d.cts +12 -8
  18. package/dist/index.d.ts +12 -8
  19. package/dist/index.js +1 -1
  20. package/dist/index.node.cjs +1 -1
  21. package/dist/index.node.d.cts +6 -6
  22. package/dist/index.node.d.ts +6 -6
  23. package/dist/index.node.js +1 -1
  24. package/dist/node/index.cjs +1 -1
  25. package/dist/node/index.d.cts +3 -3
  26. package/dist/node/index.d.ts +3 -3
  27. package/dist/node/index.js +1 -1
  28. package/dist/{svm-CTCJsYri.d.cts → svm-B_c0L-rJ.d.cts} +1 -1
  29. package/dist/{svm-CUuqpl1h.d.ts → svm-Ca4Xyw0Y.d.ts} +1 -1
  30. package/dist/{workspace-Du_jy51u.d.cts → workspace-DdaY7sWa.d.cts} +5 -1
  31. package/dist/{workspace-Du_jy51u.d.ts → workspace-DdaY7sWa.d.ts} +5 -1
  32. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -2,6 +2,154 @@
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.4.0] — 2026-08-11
6
+
7
+ Six breaking items, each one an operation that reported success without having
8
+ done what it said. A broadcast whose reply never arrived was reported as one
9
+ that never went out — on both chains. Moving an account between workspaces saved
10
+ its later changes to the wrong place; changing a password could leave the old one
11
+ working; erasing a browser workspace could leave everything in it; and restoring
12
+ a backup over an existing workspace kept records the backup did not contain. The
13
+ rest either clears secrets from memory sooner, or accepts input that was being
14
+ refused for no reason.
15
+
16
+ ### Security
17
+ - **BREAKING. A broadcast whose outcome is unknown no longer reports as one that
18
+ was refused — on both chains.** When the connection to an endpoint died during
19
+ a broadcast, or the endpoint answered with an error status or something that
20
+ was not a reply, the send reported `failed`: the one status meaning "that never
21
+ went out, send it again". Those bytes may well have reached the network. On
22
+ EVM a rebuilt transaction takes a fresh position from a node whose count the
23
+ relayed one already advanced; on Solana there is no position to collide at all,
24
+ so a rebuild takes a fresh blockhash, becomes a different transaction, and
25
+ nothing dedupes the two. Either way both can land.
26
+
27
+ Such a send now reports `timeout`, meaning the outcome is unknown, and the
28
+ identifier of the transaction that was signed is reported so it can be looked
29
+ up before anything else is sent.
30
+
31
+ An endpoint that answers with a reason it refused still reports `failed`,
32
+ because nothing was sent and sending again is safe. That is the ordinary way a
33
+ send fails — an underpriced or badly-positioned transaction on EVM, an expired
34
+ blockhash or a failed simulation on Solana — and for an expired blockhash
35
+ rebuilding is exactly the right response.
36
+ - **BREAKING. An endpoint that refuses is reported differently from one that
37
+ never answered.** Every way a request could go wrong reported the same thing,
38
+ including the one case where the endpoint read the request and declined it.
39
+ Those are opposite facts for a broadcast, and a caller needs to tell them
40
+ apart to know whether sending again is safe. A refusal now carries its own
41
+ error code and the reason the endpoint gave; a lost connection, an error
42
+ status, or an unreadable reply still report the endpoint as unreachable. The
43
+ two chains previously disagreed about which code a refusal carried; they now
44
+ agree.
45
+ - **A value an endpoint sent is cleaned before it appears in an error.** Two
46
+ errors raised while reading a reply placed that reply into the message exactly
47
+ as received, so control characters chosen by the endpoint were reproduced into
48
+ whatever log the caller writes, and an overlong value was repeated in full.
49
+ The value is still shown, since for a number the rejected text is the
50
+ diagnosis, but it is cleaned and shortened.
51
+
52
+ ### Security
53
+ - **BREAKING. Changing an account's password now reports failure rather than a
54
+ success that did not happen.** If the account was locked between the moment
55
+ the change was requested and the moment it was carried out, the recovery
56
+ phrase was quietly left under the old password while everything else about the
57
+ change was saved. The account then reported that its password had been
58
+ changed, after which the new password failed and the old one still worked —
59
+ the exact reverse of the promise, in the situation you change a password for.
60
+ An account managed by its workspace was additionally recorded as having a
61
+ password of its own, which made it unopenable the next time it was loaded.
62
+ Two changes started at the same time could also both report success, with the
63
+ second overwriting the first using a password the first had already retired.
64
+ Both cases now report failure and leave the account exactly as it was.
65
+ - **BREAKING. Erasing a browser workspace now reports whether it happened.**
66
+ Erasing one while the same application still had it open reported success and
67
+ left every stored record in the browser. Because nothing released the
68
+ workspace, that was the ordinary outcome rather than a rare one. The workspace
69
+ is now closed first so the erase can finish. An erase that cannot be confirmed
70
+ is reported as unconfirmed rather than as failed — it may still complete on its
71
+ own, and erasing again is always safe. Erasing where the browser offers no
72
+ storage at all now reports that, instead of returning quietly.
73
+ - **Secrets are cleared from memory once they are no longer needed.** Several
74
+ intermediate values produced while deriving a key were left behind after use,
75
+ and a derived key dropped from the internal cache was discarded without being
76
+ cleared, putting it beyond the reach of the cleanup that runs when a workspace
77
+ locks. Unlocking an account whose recovery phrase could not be read also left
78
+ that phrase in memory although the account reported itself locked. Keys and
79
+ addresses are unchanged: derivation was checked byte for byte against the
80
+ previous release and against the published Argon2 test vectors.
81
+ - **An endpoint that is not text is refused rather than saved unchecked.**
82
+ `rpcUrl` was the only network field with no type check, so a value that was not
83
+ text skipped every endpoint check — including the one that refuses addresses on
84
+ your local network — and was stored anyway. Leaving the field out reported an
85
+ error from outside this library rather than its own, including while loading a
86
+ stored network. An empty endpoint still means no endpoint configured.
87
+ - **A rejected name or colour is quoted before it is reported.** Both were placed
88
+ into the error message exactly as supplied, so control characters in them were
89
+ reproduced into whatever log you write. A name is not always your own — it can
90
+ come from a filename on disk, or from a backup being restored.
91
+
92
+ ### Fixed
93
+ - **BREAKING. An account moved to another workspace now belongs to the workspace
94
+ holding it.** Moving one wrote a single record into the receiving workspace and
95
+ then kept sending every later change back to the workspace it came from.
96
+ Reopening the receiving workspace showed the account without those changes, and
97
+ closing the original one made the account unusable even though the receiving
98
+ workspace was open and still listed it. For an imported private key, discarding
99
+ the original workspace lost the key. The account now saves to the workspace
100
+ holding it, unlocks with that workspace's password, and is closed by it.
101
+ Locking the receiving workspace while the move is still going on now closes the
102
+ account rather than leaving it open and unreachable. Re-deleting an account
103
+ that was moved in reports that it is already gone, rather than reporting it as
104
+ belonging elsewhere.
105
+ - **BREAKING. Restoring a backup over an existing workspace now replaces it.**
106
+ Records the backup did not contain were left in place beside the restored ones,
107
+ still under the previous password. They could not be opened, could not be seen,
108
+ kept their names reserved, and made removing a network fail from then on. Only
109
+ what the backup carries is kept now, and anything it omits is removed. A backup
110
+ that cannot be restored in full is refused before anything changes, and a
111
+ backup carrying no configuration is refused outright rather than leaving a
112
+ workspace no password can open. The workspace is closed at the end, since the
113
+ password that opened it belonged to the workspace that was just replaced.
114
+ - **A wallet can be labelled in your own script.** Tags and token symbols
115
+ accepted the letters of every script but refused the marks that most of them
116
+ require, so Devanagari, Bengali, Tamil, Thai, Arabic and Hebrew could not be
117
+ used at all. They now are. A label that would display as blank, or as nothing
118
+ at all, is still refused. Token symbols containing `+` are also accepted, which
119
+ several real tokens need.
120
+ - **The two spellings of one password are one password.** The same password can
121
+ arrive in two forms depending on the keyboard, clipboard or operating system it
122
+ came from, and both have always unlocked a wallet. Several places compared the
123
+ forms directly instead, so a correct password could be reported as wrong when
124
+ re-entered on an already-open workspace or account, when confirming a record's
125
+ password, and when creating an account that shares the workspace password.
126
+ Checking a new password against previous ones now recognises the same password
127
+ in a different form as a reuse.
128
+ - **A deleted account's name can be used again.** Every account name seen when a
129
+ workspace opened was reserved for as long as it stayed open, and deleting the
130
+ account did not release it. Creating an account under that name again quietly
131
+ produced a numbered variant, and adding one back was refused with a message
132
+ asking you to restore a file that had just been deleted.
133
+ - **A token address pasted with a leading space is accepted.** It was refused
134
+ here while the same address was accepted everywhere else in the library.
135
+ - **A hex value carrying two prefixes is refused rather than decoded.**
136
+ `0x0x41` produced two bytes with a zero in front instead of an error.
137
+ - **Moving an account needs the networks it uses to exist in the receiving
138
+ workspace.** An account refers to its networks by name, so moving one into a
139
+ workspace that does not have a network it uses wrote a record that could not
140
+ be read back. The move reported success, and after reopening the account was
141
+ simply absent — not listed, not reported as held back, and not even holding
142
+ its name, while a record containing its recovery phrase and every key stayed
143
+ in the workspace, unreachable and impossible to remove. The move is now
144
+ refused before anything is written, naming the missing network.
145
+ - **An account cannot be left holding no keys.** Both ways of removing wallets
146
+ checked that at least one wallet remained, which does not mean at least one
147
+ key remains: a wallet can legitimately be added without addresses, so removing
148
+ the wallet carrying an account's only keys left an account with none. It still
149
+ reported itself as an account, and reopening it produced a shell with nothing
150
+ in it. Removing wallets that hold no keys is unaffected, as is removing an
151
+ account outright.
152
+
5
153
  ## [2.3.9] — 2026-08-10
6
154
 
7
155
  Three breaking items. Two are on paths that were producing results no