Project Name: Syrius Extension Wallet: refactoring, reskinning, and new features
Description: The Syrius browser extension is Zenon’s non-custodial browser wallet. This project took the published 0.1.10 build and produced 0.3.3:
- It fixes live wallet defects that affected funds. Sends were signed with the wrong address, amounts lost a base unit, and a mistyped recovery word silently imported a different wallet.
- It rebuilds the codebase and UI. The popup bundle went from 7.95 MiB to 146 KiB.
- It adds what dApps on Zenon need: a
window.zenonprovider on every site, per-origin permissions, message signing byte-compatible with desktop Syrius, and arbitrary account-block signing.
Why it matters for Zenon: a browser wallet is how most people first touch a chain, and every Zenon web dApp depends on one. Ferry and the Zenon Faucet already run HTLC flows through this extension that desktop Syrius can’t do.
URL: https://github.com/sol-znn/syrius-extension (a fork of MichZNN/Syrius-Extension)
Team:
- sol: Phase 1 design, implementation, testing, documentation
- @MichZNN: the Manifest V3 port and published 0.1.x build this work is based on, which kept the extension installable, plus ongoing support and review.
Phases
Phase 1: Refactor, reskin, and new features (delivered)
High-level overview of main tasks:
- Correctness fixes, all live defects in 0.1.10:
- Sends signed with the wrong address (six call sites)
- Amounts losing a base unit: 4.35 ZNN sent 434,999,999 base units, and staking 1.5 ZNN staked 1.0
- No BIP-39 checksum on import
- Unawaited key-store saves
- Address 0 reset to defaults on every load
- A password prompt reappearing when MV3 discarded the credential cache
- A dead message channel hanging the wallet on a blank splash screen
- Unparsed recipient addresses and a hardcoded 999 max send
- Wrong-decimals delegate rewards
- Refactor:
- Popup bundle 7.95 MiB → 146 KiB, entry point 14.9 → 6.1 MiB, build 33 s → about 21 s
- Zero Argon2id decryptions per navigation (previously one, at 64 MiB)
- The service worker rewritten as a router with sender validation, holding no key material
- One signing path instead of six, one list instead of four, one error formatter instead of ten, one toast helper instead of twenty
- Sessions kept in
chrome.storage.sessionwith a real auto-lock, and the plaintext-password oracle removed
- Reskin: a token-driven design system replaces 1,801 lines of
!importantutilities. The popup is a fixed 360×600 shell whose header no longer slides away mid-transaction, and the intro animation and 3D ball are gone. - New features:
- A Tokens screen listing every ZTS
- Readable history (Fused / Staked / Delegated / Swap created, unlocked, reclaimed), with HTLC selectors re-derived from go-zenon’s ABIs in
npm test - The
window.zenonprovider with EIP-1193 errors, events, per-origin permissions, and a Connected Sites screen signMessage/znn_sign- Change password, remove wallet, address labels, auto-receive, auto-lock, explorer choice, and node list with chain-id detection
- Release engineering:
- GitHub Actions publishes the Chrome/Brave ZIP and SHA-256 for every version, refusing tag and manifest mismatches
- A dev harness runs the extension in a separate Chrome with a self-unlocking devnet wallet
- An end-to-end dApp test is included
Completion of Phase 1 will be measured by:
0.3.3 released with the ZIP and checksum published by CI
The amount fixes confirmed against a devnet node, and npm testre-deriving all embedded-call selectors from go-zenon
utils/dapp-test.jsdriving a real page against the provider end to end, including message signing
Ferry and the Zenon Faucet running HTLC flows through the extension on devnet
Phase 2: Community-requested features and bug fixes (open for suggestions)
High-level overview of candidate tasks, all out of scope for Phase 1:
- P2P / HTLC swaps in the wallet, with arbitrary hash types and expiries (desktop Syrius is SHA3-only with a 24-hour cap)
- Accelerator-Z: browse, vote, create
- Sentinel support
- WalletConnect
- Hardware wallets (Ledger)
- Chrome Web Store and Firefox listings
- Bugs reported against 0.3.x
Completion of Phase 2 will be measured by:
- Deliverables agreed per item in this thread before any funding is requested
Funding
Total Requested Funding = 4,000 ZNN and 40,000 QSR (Phase 1). Phase 2 depends on feature complexity and is filed separately.
Project Duration = 1 week: Phase 1 delivered
How did you calculate your budget?
- Scope. A full correctness, refactor and reskin pass over the wallet plus three new capabilities: the dApp provider, message signing, and the release pipeline.
- Comparable proposals. AZ for SYRIUS v0.2.0 asked 4,000 ZNN + 35,000 QSR, and Syrius Wallet Website for iOS/Android asked 5,000 ZNN + 40,000 QSR.
- Split.
- sol 3,000 ZNN / 30,000 QSR
- @MichZNN 1,000 ZNN / 10,000 QSR
Project and Payment Milestones:
Phase 1
Funding Request: 100% (4,000 ZNN and 40,000 QSR)
Duration: delivered
Phase 2
Funding Request: filed as new projects, one per agreed scope. A project’s total can’t be raised after creation, so Phase 2 can’t be added to this one.
Duration: per item
Other Information
Risks, Assumptions, Known Issues, Dependencies:
- Dependency on
znn-ts-sdk(npm0.1.3), which has no HTLC support. HTLC decoding is therefore checked against go-zenon directly. - Signing is deliberately conservative. Every signature is prompted, and a message of exactly 32 bytes is refused so a site can’t pass off a block hash as a message. The trade-off is that message signing uses UTF-8 rather than desktop Syrius’s narrowed UTF-16, which is identical for ASCII.
- The extension isn’t updated on the Chrome Web Store yet. It installs from the release ZIP in developer mode.
Have you previously submitted a proposal (either in Accelerator-Z or Incubator)?
-
In progress (submitted alongside this one)
On-chain filing:
| Project name | Funds |
|---|---|
Syrius Extension Wallet v0.3.3 |
4,000 ZNN / 40,000 QSR, one phase |
Documentation (in the repository):
CHANGELOG.md: every change against 0.1.10REFACTOR.md: the reasoning behind each change, and what was measuredSETUP.md
