Repository navigation
What's new in 1.2.0
Clearer sends and app approvals, a recovery phrase check for new wallets, and a new default Testnet node.
- Testnet connects through a new default node. A wallet still on the old default moves to it at its next unlock; a node address you set yourself stays.
- Send: the token picker lists what you hold and adds a token from a pasted address, a zero balance reads 0, sends in progress show in a toast and in History, and a refusal shows beside the balance.
- App approval windows list what leaves your account with the fee, say which calls Nulo cannot check, and name another of your accounts when a send uses its authorization. A failed fee or authorization preview can be retried, and a fee estimate waits behind a send in progress instead of failing.
- Setting up a wallet checks three words of the recovery phrase before Ready, and the phrase step closes itself after 5 minutes.
- The lock screen offers "Forgot your password?" or "Lost your passkey?", and a full backup downloads protected in one step.
- Receive and the Send review show the whole address, and Receive names the network.
- Long forms show a round "more below" button.
- The token list refreshes about every six hours, and on request in Settings → Tokens. Dollar values come from the signed list, so a token it prices shows one without a wallet update.
- The sponsored fee payer is offered only on Testnet and the local network.
- Also: a Switch button on each network in Manage networks, a password hint that judges how guessable a password is, ten new glossary entries, and a question before auto-lock is set to never.
- The Privacy Policy (1.2.9) describes the token list's refresh and the price requests. Nothing needs accepting again.
- Over 60 fixes across send, fees, app windows, onboarding, backup, import and storage.
1.2.0
Install
- Chrome: Chrome Web Store
- Firefox: Firefox Add-ons
The stores review each version, so they can trail this release by a few days.
Verify or load by hand
The zips below are the same builds. Verify them with shasum -a 256 -c SHASUMS256.txt. To check that this repository's release workflow built them from this commit, run gh attestation verify nulo-chrome-1.2.0.zip --repo nulo-sh/nulo --signer-workflow nulo-sh/nulo/.github/workflows/release.yml --source-digest 7793112bc70849bc3817e468b3862294bc1b3522 --deny-self-hosted-runners, and the same for the Firefox zip. To load the Chrome zip by hand, unzip it, open chrome://extensions, turn on Developer mode and click Load unpacked. The Firefox zip is unsigned; the signed build comes from Firefox Add-ons.
Bug Fixes
- No client batch cap on the free node endpoints (#1660) (network)
25a08e0 - Name authorizations a send consumes for another approved account (#1649) (execution)
040334f - Offer the sponsored fee payer only on testnet and the local network (#1652) (fees)
5d41de8 - Recovery link, delete checks, password toast, connect window words (#1640) (security)
66f762b - A call string the card cannot print whole says so; utf-8 text prints (#1646) (execute)
3174dd4 - Raise the free node endpoints' batch cap from 3 to 25 (#1643) (network)
df26e45 - The refreshing dot stays lit while a newer refresh of the same row runs (#1637) (home)
0861ade - Keyless dRPC defaults with a batch cap of 3, old testnet rows moved (#1622) (network)
3b845ef - An address pasted with invisible characters at its ends reads as the address (#1617) (send)
e5cffd8 - E2e lane filters name what each lane runs; the docker runner reaches its tests (#1583) (ci)
a0458e2 - A failed read or write never overwrites, strands or wipes what is stored (#1576) (storage)
846030f - An app page's late read, new sender's enter, invisible characters in searches (#1580) (popup)
038901c - A locked Connect retry drains on unlock, and an early window close settles (#1573) (dapp)
5b3b05a - Keep a live account's key, fence a departed import, export no pending send (#1570) (import)
93b9a2d - The receipt page follows its link, and a failed read is not "not found" (#1558) (received)
2575c86 - One-step full backup, described modes, a named risk, a profile-free file name (#1559) (backup)
ed30c25 - Send's first load keeps a balance update that lands during it (#1551) (send)
b21fcda - Sign and list only authorizations on behalf of the sending account (#1552) (execution)
f6d96be - A long network name wraps inside the takeover and the network arrival (#1550) (ui)
6509f2f - Open on the funded side, show a pasted address's start, outline one priority (#1544) (send)
9348b85 - Plural helper, "already exists", strict mode's line and the store's audit note (#1543) (copy)
9cb3403 - Ready's line in plain words, and back stays on ready (#1542) (onboarding)
c4173bb - Fee payer, token and sender popups refuse an address at or above the modulus (#1500) (popups)
d64f317 - The detail page closes the network and account clients it opens (#1497) (connected-apps)
ed1150a - A dapp send waits as asked and keeps its additional and capsule scopes (#1485) (execution)
60e0ef1 - Disconnecting an app also cancels its send's open fee question (#1489) (dapp)
a39d1b2 - A long network name wraps in the dapp windows and the backup reset notice (#1498) (ui)
f94e500 - The tx page shows when a send was made, and a failed fee estimate offers a retry (#1496)
902b158 - A deleted token's id is never given to another token (#1487) (tokens)
3af5f78 - A dapp send's public authwits are listed once the network took the send (#1483) (authwit)
dfa3d64 - A boot resume erases only its own deletions, and no listener is skipped (#1484) (profiles)
f8a7b7b - A refused log page ends the scan tick, backs off and shows the stall (#1482) (incoming)
fcc4da2 - A cancelled dapp send never restarts when its queued row cannot be read (#1481) (execution)
f738cba - A dapp send's public authwits are indexed when its history write fails (#1424) (authwit)
cadc6f8 - The unlock method is fixed at submit and an empty password is refused (#1423) (profiles)
d5d8fda - A disconnect ends its requests, a restart reads interrupted, latest connect wins (#1414) (dapp)
cdb61d0 - History orders sends by when they were sent, and a failed fee estimate offers a retry (#1415)
a89db85 - Typed addresses, app aliases and settings searches drop invisible characters (#1409) (ui)
a463950 - Sign refused keys, count password characters, clear a stale token refusal (#1403) (inputs)
7bde519 - Render the duplicate confirm and keep a reload off a false ready (#1400) (onboarding)
eec97bd - The takeovers' lock chip is its padlock, and the terms box says alpha (#1399) (ui)
13bb213 - A long network name wraps inside the chain banner (#1398) (capabilities)
c9cf614 - Name the default network alpha and give the header's chips room (#1369) (ui)
9fba3c2 - A long name wraps inside the restore texts (#1366) (restore)
88633a4 - A fee method switched while queued reads estimating until the wallet answers (#1362) (execute)
a4da1f3 - Estimates queue behind a send, report their run, and outlive 60 s (#1351) (fees)
3d7611c - A token imported from the picker keeps the sides the person had (#1346) (send)
87d0411 - Confirm waits for the fee estimate, and its authorizations outlive the queue (#1344) (execute)
f11178b - Disable auto-close on the phrase screen hands focus to close (#1321) (settings)
4aa5fd4 - A settle keeps the selection a newer pick in another window names (#1320) (lock)
2914b96 - A stale-network or arrival read that a lock ends logs at debug (#1319) (popup)
49b5732 - A string wider than the notice card breaks inside it (#1277) (ui)
f1b0c9c - Wrong passwords and refused passkeys log at debug (#1302) (logs)
756ad00 - Handle lock refusals at their calls, and vue's disconnect errors at debug (#1297) (popup)
ee45a7f - An account file once saved says so (#1286) (backup)
2ecbc33 - The duplicate-phrase confirm names every profile on it (#1285) (profiles)
da2d472 - Ask before auto-lock is set to never (#1283) (settings)
0d14303 - An address edit re-reads its fee payer; a reset discovery logs at debug (#1291) (fpc)
c2852ea - An import or a new profile a restart overtook lands on the lock screen (#1289) (popup)
ea144d5 - The lock screen and export pages drop what a session left typed (#1272) (popup)
d116546 - Stop a cancelled send before its proof; close three test races (#1271) (execution)
146f2d8 - A gas retry or a pxe read that a lock or purge ends logs at debug (#1268) (logs)
2e524ef
Build / CI
Chore
- Release 1.2.0 (#1601) (main)
7793112 - Release 1.2.0 (main)
0b70b8d - Re-render the listing images from the current build (#1377) (store)
797a2c2 - Sync main → dev (#1248)
7506f77
Documentation
- Retire, route and promote lessons.md entries in one pass (#1350) (plans)
94ac9cf - The 1.1.0 release notes cover 0.31.0 to 1.1.0 (#1251) (store)
232b00c
Features
- A "more below" button on screens whose content runs past the fold (#1666) (popup)
1a46f99 - Refresh every six hours, and a manual refresh on settings → tokens (#1625) (token-list)
ea282b7 - The shared password pair on "Create profile", two config reads on
useConfigRead(#1621) (ui)250cec0 - The signed list carries each token's price feed (#1612) (token-list)
67c1ac5 - The chip says its status, 240 px fits, full addresses, holdings refresh dot (#1581) (ui)
6c7ba28 - Sends in progress in a toast and history, refusals by the balance (#1572) (send)
1b09f04 - A phrase check before ready, create profile, a popup pointing to the tab (#1567) (onboarding)
51a6924 - Retry a failed app fee or authorization preview, total what leaves (#1568) (execute)
00895db - Ten first-path entries, proof dotted, how aztec works says website (#1560) (glossary)
b243579 - The new-password hint measures guessability, not only length (#1503) (password)
baec793 - Name the network where an address changes, toast a new account, hold get started (#1545) (ui)
c17dfc1 - Ready names a created wallet's unsaved recovery phrase (#1480) (onboarding)
8bb36c3 - The token picker lists holdings and adds a pasted token; the corner shows 0 (#1342) (send)
af025cf - A switch button on each inactive row of manage networks (#1334) (networks)
b036edb - One line under the calls says which ones nulo cannot check (#1332) (execute)
beb6355 - After a delete, the lock screen selects a profile (#1287) (lock)
50baa40 - The phrase step closes itself after 5 minutes (#1284) (onboarding)
d4eb7ec
Other
- Promote dev → main (clearer sends and approvals, phrase check, new Testnet node) (#1671)
7d2ac6c - Promote dev → main (launch email asset, store release notes) (#1255)
c969a21 - Merge remote-tracking branch 'origin/dev' into chore/sync-main-dev-2
e6af626
Refactor
- One new-password pair, one current-password field, one length cap (#1600) (ui)
c77e77f - One stored-passkey ask, and leavePanelFor on the four passkey pages (#1599) (popup)
b20da9b - One reveal frame and credential check in
ProfileService, one pxe log router (#1597)ad57a13 - One helper for deadline and abort races, in place of seventeen copies (#1598)
cca0a7f - One row card, named amount widths, task and re-ask hooks off the feed (#1596) (activity)
422e229 - The trust gate in the wallet layer, one pick and decrypt classifier (#1595) (backup)
aaaf927 - One copy of each send step, one confirm list in the execute window (#1591) (execution)
78815e9 - Move the slot codec out of
ProfileService(#1589) (profile)88dfdcd - Background.ts in three modules, and a test that the edge headers agree (#1587)
1373308 - The managers registry's client slots get owned writers and go read-only (#1588) (popup)
0b14e59 - One lane surface, a registration executor, no registry import cycle (#1585) (execution)
cf9ed1e - One owner each for unlock sealing, fenced creates, purge match, seams (#1584) (services)
5bb2593 - One private-fetch recipe, and the fee window shares execute's prelude (#1501)
85b783d
Tests
- The update test expects the sponsor's removal where its chain offers none (#1665) (e2e)
5e3d7bd - The egress guard declares each release's Testnet host for the update scenarios (#1650) (e2e)
8ad61eb - The v1.1.0 recording refreshed for the 1.2.0 candidate (#1641) (e2e)
6bef2ce - The sandbox node's admin rpc takes a per-run key (#1422) (e2e)
3e8b8f6 - The firefox driver answers the file picker instead of racing it (#1411) (e2e)
57162aa - The passkey window's discovery and refusal on Firefox, concurrent restores (#1378) (profile)
9ce6bb0 - The chaos model races a delete or a method change against an open page (#1367) (profile)
8046c9e - A seeded sequence test over fee estimates, queue and confirm timing (#1361) (execution)
15a9bd9 - The flag-on-paste check runs only in source runs, so the nightly smoke passes (#1352) (e2e)
25fe44c - Run the firefox suite on puppeteer's firefox 158 (#1338) (e2e)
c0ead8b - In-process sequences for the profile chaos scenario list (#1331) (profile)
b7cd053 - The reopen and re-ask failures name what they saw (#1326) (e2e)
0a65972 - A seeded in-process sequence drives the profile chaos catalog (#1324) (profile)
843d27f - The profile chaos pre-update start runs from every reviewed release (#1322) (e2e)
5ef0c11 - The update scenarios run from v1.1.0 (#1314) (e2e)
210d02f - BringToFront and setViewport go through the driver (#1309) (e2e)
89b07a0 - Profile chaos drives passkey imports, method changes and shared passkeys (#1301) (e2e)
dda8023 - Wait for the terms verdict and the fee read (#1298) (e2e)
0d5b196 - Four whole-tree guards parse only the files that can hold a finding (#1280)
c08c2b2 - Three unit tests stop depending on host speed and the runner's git (#1269)
8017e3f