Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
86db36b
feat: use multisig sdk instead of the base http client
0xnullifier Mar 5, 2026
b8a46a2
fix: address PSM integration review findings (#155)
WiktorStarczewski Mar 11, 2026
08ab29e
feat: use the new `createTransactionProposalRequest` method for creat…
0xnullifier Mar 12, 2026
0009fb7
chore: use deployed psm url
0xnullifier Mar 13, 2026
08346ab
feat: add a option to choose recovery type during onboarding
0xnullifier Mar 16, 2026
71d8212
chore: merge conflicts
0xnullifier Mar 19, 2026
2b00a3e
feat: make onboarding screen for gaurdian aligned with the rest of th…
0xnullifier Mar 19, 2026
c015b44
chore: changelog
0xnullifier Mar 19, 2026
405bfd0
chore: update translation files
github-actions[bot] Mar 19, 2026
ed288d9
feat: add psm account provider to properly handle service worker tran…
0xnullifier Mar 19, 2026
bca5958
feat: add account recovery flow for gaurdian backed accounts
0xnullifier Mar 20, 2026
d7a5a4f
feat: wip
0xnullifier Mar 23, 2026
39eba6b
chore: bump up versions
0xnullifier Mar 24, 2026
2c31050
fix: move psm sync to frontend
0xnullifier Mar 25, 2026
8950d20
chore: update translation files
github-actions[bot] Mar 25, 2026
208aef6
Merge branch 'main' into utk-psm-integration
0xnullifier Apr 16, 2026
79074fe
feat: bump up deps, make guardian work on mobile, make sync work for …
0xnullifier Apr 19, 2026
934f575
Merge remote-tracking branch 'origin/main' into utk-psm-integration
0xnullifier Apr 20, 2026
2a7b723
chore: drop verbose debug logs in intercom and miden-client
0xnullifier Apr 20, 2026
cf19fe3
feat: guardian switch transaction for PSM accounts
0xnullifier Apr 20, 2026
0f30153
feat: per-stage label for PSM/guardian transactions
0xnullifier Apr 21, 2026
e1c076d
Merge remote-tracking branch 'origin/main' into utk-psm-integration
0xnullifier Apr 21, 2026
473ceda
chore: update translation files
github-actions[bot] Apr 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@

### Features

* [FEATURE][all] Per-stage label in the transaction progress modal. Each observable phase boundary (`syncing`, `sending`, `confirming`, `delivering`) writes a stage marker during tx processing, and the modal renders a stage-specific title + description instead of a single opaque "Generating Transaction" for the whole 3-8s spinner window. Send-type sub-label varies by tx type (claim / execute / send), and the batch subtitle surfaces a remaining-count when more than one tx is in flight.
* [FEATURE][all] Guardian switch for PSM accounts. Settings → Guardian Settings lets the user point a PSM account at a new guardian endpoint; the switch is a signed on-chain proposal that waits for inclusion, registers the post-switch account state with the new guardian, then flips the cached `PSM_URL_STORAGE_KEY` so subsequent syncs hit the new endpoint. The frontend cache self-heals when the stored endpoint drifts, so the popup stops syncing against the old guardian across the SW/frontend realm boundary.
* [FEATURE][all] Per-stage label in the transaction progress modal. Each observable phase boundary (`syncing`, `sending`, `confirming`, `delivering`) writes a stage marker during tx processing, and the modal renders a stage-specific title + description instead of a single opaque "Generating Transaction" for the whole 3-8s spinner window. Send-type sub-label varies by tx type (claim / execute / send), and the batch subtitle surfaces a remaining-count when more than one tx is in flight. PSM/guardian-backed accounts also now surface their own phase boundaries (`creating-proposal`, `signing-proposal`, `submitting`, `registering-guardian`) so guardian-sign / submit / on-chain-confirm / guardian-re-register all render distinct labels instead of a single opaque spinner — switch-guardian in particular now walks the user through every step.

---

Expand Down Expand Up @@ -68,6 +69,7 @@
* [FIX][all] Removed stale "Download Generated Files" button and output notes storage. The `useExportNotes` hook, `registerOutputNote`, and related storage key were unused dead code. Simplifies the transaction completion screen and its auto-close logic. (#160)
* [FIX][all] Removed the "Upload File" button and drag-and-drop note import from the Receive page. The freed space is now used by the notes list, making it taller. (#161)
* [FEATURE][all] Complete UI revamp across the wallet.
* [FEATURE][all] Integrate gaurdian for private state management for the wallet.

---

Expand Down
1,223 changes: 112 additions & 1,111 deletions CLAUDE.md

Large diffs are not rendered by default.

8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
"scripts": {
"postinstall": "rimraf node_modules/@miden-sdk/react/node_modules",
"start": "yarn watch:src",
"dev": "rimraf ./dist && concurrently yarn:watch:*",
"dev": "rimraf ./dist && cross-env TARGET_BROWSER=chrome MODE_ENV=development NODE_ENV=development yarn build:bg && concurrently -n bg,ext -c blue,green \"cross-env TARGET_BROWSER=chrome MODE_ENV=development NODE_ENV=development vite build --config vite.background.config.ts --watch\" \"cross-env TARGET_BROWSER=chrome MANIFEST_VERSION=3 MODE_ENV=development NODE_ENV=development vite build --config vite.extension.config.ts --watch\"",
"dev-clean": "rimraf node_modules && yarn cache clean && yarn install && yarn dev",
"watch:src": "echo 'Use vite dev instead'",
"watch:src": "vite run --config vite.extension.config.ts",
"watch:dist": "mv3-hot-reload",
"build": "yarn build:extension && yarn build:mobile",
"build:extension": "cross-env TARGET_BROWSER=chrome yarn build:bg && cross-env TARGET_BROWSER=chrome MANIFEST_VERSION=3 yarn build:ext",
Expand Down Expand Up @@ -88,7 +88,7 @@
"desktop:build": "yarn build:desktop && yarn tauri build",
"desktop:reset": "rm -rf ~/Library/WebKit/com.miden.wallet ~/Library/Caches/com.miden.wallet ~/Library/Application\\ Support/com.miden.wallet",
"build:devnet": "rimraf ./dist && yarn clear:webpack-cache && cross-env MIDEN_NETWORK=devnet DISABLE_TS_CHECKER=true NODE_ENV=development MODE_ENV=production MANIFEST_VERSION=3 webpack",
"dev:devnet": "cross-env MIDEN_NETWORK=devnet DISABLE_TS_CHECKER=true NODE_ENV=development MODE_ENV=development MANIFEST_VERSION=3 webpack --watch --progress",
"dev:devnet": "cross-env MIDEN_NETWORK=devnet yarn dev",
"build:desktop:devnet": "rimraf ./dist/desktop && cross-env MIDEN_NETWORK=devnet DISABLE_TS_CHECKER=true NODE_ENV=development MODE_ENV=production webpack --config webpack.desktop.config.js",
"tauri": "tauri"
},
Expand Down Expand Up @@ -117,6 +117,8 @@
"@miden/dapp-browser": "link:./packages/dapp-browser",
"@newhighsco/storybook-addon-svgr": "^2.0.7",
"@noble/hashes": "^1.4.0",
"@openzeppelin/guardian-client": "^0.14.3",
"@openzeppelin/miden-multisig-client": "^0.14.3",
"@peculiar/webcrypto": "1.1.6",
"@radix-ui/react-slot": "^1.2.3",
"@segment/analytics-node": "^2.3.0",
Expand Down
108 changes: 108 additions & 0 deletions public/_locales/de/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -422,6 +422,34 @@
"message": "Transaktion wird ausgeführt",
"englishSource": "Executing transaction"
},
"transactionStageSwitching": {
"message": "Vormund wechseln",
"englishSource": "Switching guardian"
},
"transactionStageCreatingProposal": {
"message": "Angebot erstellen",
"englishSource": "Creating proposal"
},
"transactionStageCreatingProposalDescription": {
"message": "Erstellen Sie den Transaktionsvorschlag für Ihren Vormund.",
"englishSource": "Building the transaction proposal for your guardian."
},
"transactionStageSigningProposal": {
"message": "Unterzeichnung mit Vormund",
"englishSource": "Signing with guardian"
},
"transactionStageSigningProposalDescription": {
"message": "Ihr Vormund unterzeichnet den Vorschlag.",
"englishSource": "Your guardian is signing the proposal."
},
"transactionStageSubmitting": {
"message": "Submitting transaction",
"englishSource": "Submitting transaction"
},
"transactionStageSubmittingDescription": {
"message": "Senden Sie Ihre signierte Transaktion an das Netzwerk.",
"englishSource": "Sending your signed transaction to the network."
},
"transactionStageConfirming": {
"message": "Bestätigung an der Kette",
"englishSource": "Confirming on chain"
Expand All @@ -430,6 +458,14 @@
"message": "Warten auf Netzwerkbestätigung.",
"englishSource": "Waiting for network confirmation."
},
"transactionStageRegisteringGuardian": {
"message": "Anmeldung beim Vormund",
"englishSource": "Registering with guardian"
},
"transactionStageRegisteringGuardianDescription": {
"message": "Registrieren Sie Ihren Kontostatus beim neuen Vormund.",
"englishSource": "Registering your account state with the new guardian."
},
"transactionStageDelivering": {
"message": "Lieferung von note",
"englishSource": "Delivering note"
Expand Down Expand Up @@ -1562,6 +1598,42 @@
"message": "Verschlüsselte Wallet-Datei",
"englishSource": "Encrypted Wallet File"
},
"guardianSettings": {
"message": "Wächtereinstellungen",
"englishSource": "Guardian Settings"
},
"currentGuardianEndpoint": {
"message": "Aktueller Wächter",
"englishSource": "Current Guardian"
},
"newGuardianEndpoint": {
"message": "Neuer Guardian-Endpunkt",
"englishSource": "New Guardian Endpoint"
},
"switchGuardian": {
"message": "Wächter wechseln",
"englishSource": "Switch Guardian"
},
"switchGuardianDescription": {
"message": "Richten Sie Ihr PSM-Konto auf einen neuen Guardian-Endpunkt. Der Wechsel wird als On-Chain-Vorschlag signiert.",
"englishSource": "Point your PSM account at a new guardian endpoint. The switch is signed as an on-chain proposal."
},
"switchingGuardian": {
"message": "Vormund wechseln...",
"englishSource": "Switching guardian..."
},
"guardianSwitched": {
"message": "Guardian hat erfolgreich gewechselt.",
"englishSource": "Guardian switched successfully."
},
"guardianEndpointUnchanged": {
"message": "Das ist bereits Ihr aktueller Vormund.",
"englishSource": "That's already your current guardian."
},
"invalidUrl": {
"message": "Geben Sie eine gültige URL ein, die mit http:// oder https:// beginnt.",
"englishSource": "Enter a valid URL starting with http:// or https://"
},
"encryptedWalletFileDescription": {
"message": "Geben Sie Ihr Passwort ein, um auf Ihre verschlüsselte Wallet-Datei zuzugreifen.",
"englishSource": "Enter your password to access your Encrypted Wallet File."
Expand Down Expand Up @@ -1828,6 +1900,42 @@
"message": "Sie können später im Wallet mehrere Kontotypen hinzufügen und verwalten.",
"englishSource": "You can add and manage multiple account types later within the wallet."
},
"chooseRecoveryMethod": {
"message": "Richten Sie die Kontowiederherstellung ein",
"englishSource": "Set Up Account Recovery"
},
"chooseRecoveryMethodDescription": {
"message": "Wählen Sie aus, wie Sie Ihr Konto wiederherstellen möchten, wenn Sie den Zugriff verlieren.",
"englishSource": "Choose how you want to recover your account if you lose access."
},
"guardianRecovery": {
"message": "Wächter",
"englishSource": "Guardian"
},
"guardianRecoveryDescription": {
"message": "Empfohlen. Wächterbasierte Wiederherstellung für Ihr Konto, aber der Wächterbetreiber kann Ihren Status sehen.",
"englishSource": "Recommended. Guardian-based recovery for your account but gaurdian operator can see your state."
},
"fullyPrivateRecovery": {
"message": "Völlig privat",
"englishSource": "Fully Private"
},
"fullyPrivateRecoveryDescription": {
"message": "Nur lokal, niemand außer Ihnen sieht Ihren Status, aber keine Wiederherstellung. Der Verlust Ihres Geräts führt zum dauerhaften Verlust Ihres Geldes.",
"englishSource": "Local only, no one sees your state except you but no recovery, losing your device will result in permanent loss of your funds."
},
"publicAccountRecovery": {
"message": "Öffentlich",
"englishSource": "Public"
},
"publicAccountRecoveryDescription": {
"message": "Stellen Sie ein öffentliches On-Chain-Konto wieder her.",
"englishSource": "Recover a public on-chain account."
},
"default": {
"message": "Standard",
"englishSource": "Default"
},
"transactionFile": {
"message": "Transaktionsdatei",
"englishSource": "Transaction file"
Expand Down
27 changes: 27 additions & 0 deletions public/_locales/en/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,17 @@
"transactionStageSendingDescription": "Building and proving your transaction.",
"transactionStageClaiming": "Claiming note",
"transactionStageExecuting": "Executing transaction",
"transactionStageSwitching": "Switching guardian",
"transactionStageCreatingProposal": "Creating proposal",
"transactionStageCreatingProposalDescription": "Building the transaction proposal for your guardian.",
"transactionStageSigningProposal": "Signing with guardian",
"transactionStageSigningProposalDescription": "Your guardian is signing the proposal.",
"transactionStageSubmitting": "Submitting transaction",
"transactionStageSubmittingDescription": "Sending your signed transaction to the network.",
"transactionStageConfirming": "Confirming on chain",
"transactionStageConfirmingDescription": "Waiting for network confirmation.",
"transactionStageRegisteringGuardian": "Registering with guardian",
"transactionStageRegisteringGuardianDescription": "Registering your account state with the new guardian.",
"transactionStageDelivering": "Delivering note",
"transactionStageDeliveringDescription": "Securely sending the note to the recipient.",
"transactionsRemainingInBatch": "$count$ transactions in progress",
Expand Down Expand Up @@ -357,6 +366,15 @@
"importWithEncryptedWalletFileDescription": "Upload your encrypted wallet file to securely import your account. Your data remains private, with only hashed information stored on-chain",
"twitter": "X (Twitter)",
"encryptedWalletFile": "Encrypted Wallet File",
"guardianSettings": "Guardian Settings",
"currentGuardianEndpoint": "Current Guardian",
"newGuardianEndpoint": "New Guardian Endpoint",
"switchGuardian": "Switch Guardian",
"switchGuardianDescription": "Point your PSM account at a new guardian endpoint. The switch is signed as an on-chain proposal.",
"switchingGuardian": "Switching guardian...",
"guardianSwitched": "Guardian switched successfully.",
"guardianEndpointUnchanged": "That's already your current guardian.",
"invalidUrl": "Enter a valid URL starting with http:// or https://",
"encryptedWalletFileDescription": "Enter your password to access your Encrypted Wallet File.",
"encryptedWalletFileDescriptionHardware": "Unlock with your passcode to access your Encrypted Wallet File.",
"encryptedWalletFileConfirmation": "I will not share my Encrypted Wallet File with anyone, including Miden Wallet.",
Expand Down Expand Up @@ -421,6 +439,15 @@
"chooseYourAccountType": "Choose Your Account Type",
"chooseAccountTypeDescription": "Select how you want to interact with the blockchain -- on-chain or off-chain.",
"canAddMultipleAccountsLater": "You can add and manage multiple account types later within the wallet.",
"chooseRecoveryMethod": "Set Up Account Recovery",
"chooseRecoveryMethodDescription": "Choose how you want to recover your account if you lose access.",
"guardianRecovery": "Guardian",
"guardianRecoveryDescription": "Recommended. Guardian-based recovery for your account but gaurdian operator can see your state.",
"fullyPrivateRecovery": "Fully Private",
"fullyPrivateRecoveryDescription": "Local only, no one sees your state except you but no recovery, losing your device will result in permanent loss of your funds.",
"publicAccountRecovery": "Public",
"publicAccountRecoveryDescription": "Recover a public on-chain account.",
"default": "Default",
"transactionFile": "Transaction file",
"verificationFailed": "Verification Failed",
"transactionVerifiedSuccessfully": "The transaction has been successfully verified. You can now claim your tokens.",
Expand Down
108 changes: 108 additions & 0 deletions public/_locales/en/messages.json
Original file line number Diff line number Diff line change
Expand Up @@ -406,6 +406,34 @@
"message": "Executing transaction",
"englishSource": "Executing transaction"
},
"transactionStageSwitching": {
"message": "Switching guardian",
"englishSource": "Switching guardian"
},
"transactionStageCreatingProposal": {
"message": "Creating proposal",
"englishSource": "Creating proposal"
},
"transactionStageCreatingProposalDescription": {
"message": "Building the transaction proposal for your guardian.",
"englishSource": "Building the transaction proposal for your guardian."
},
"transactionStageSigningProposal": {
"message": "Signing with guardian",
"englishSource": "Signing with guardian"
},
"transactionStageSigningProposalDescription": {
"message": "Your guardian is signing the proposal.",
"englishSource": "Your guardian is signing the proposal."
},
"transactionStageSubmitting": {
"message": "Submitting transaction",
"englishSource": "Submitting transaction"
},
"transactionStageSubmittingDescription": {
"message": "Sending your signed transaction to the network.",
"englishSource": "Sending your signed transaction to the network."
},
"transactionStageConfirming": {
"message": "Confirming on chain",
"englishSource": "Confirming on chain"
Expand All @@ -414,6 +442,14 @@
"message": "Waiting for network confirmation.",
"englishSource": "Waiting for network confirmation."
},
"transactionStageRegisteringGuardian": {
"message": "Registering with guardian",
"englishSource": "Registering with guardian"
},
"transactionStageRegisteringGuardianDescription": {
"message": "Registering your account state with the new guardian.",
"englishSource": "Registering your account state with the new guardian."
},
"transactionStageDelivering": {
"message": "Delivering note",
"englishSource": "Delivering note"
Expand Down Expand Up @@ -1531,6 +1567,42 @@
"message": "Encrypted Wallet File",
"englishSource": "Encrypted Wallet File"
},
"guardianSettings": {
"message": "Guardian Settings",
"englishSource": "Guardian Settings"
},
"currentGuardianEndpoint": {
"message": "Current Guardian",
"englishSource": "Current Guardian"
},
"newGuardianEndpoint": {
"message": "New Guardian Endpoint",
"englishSource": "New Guardian Endpoint"
},
"switchGuardian": {
"message": "Switch Guardian",
"englishSource": "Switch Guardian"
},
"switchGuardianDescription": {
"message": "Point your PSM account at a new guardian endpoint. The switch is signed as an on-chain proposal.",
"englishSource": "Point your PSM account at a new guardian endpoint. The switch is signed as an on-chain proposal."
},
"switchingGuardian": {
"message": "Switching guardian...",
"englishSource": "Switching guardian..."
},
"guardianSwitched": {
"message": "Guardian switched successfully.",
"englishSource": "Guardian switched successfully."
},
"guardianEndpointUnchanged": {
"message": "That's already your current guardian.",
"englishSource": "That's already your current guardian."
},
"invalidUrl": {
"message": "Enter a valid URL starting with http:// or https://",
"englishSource": "Enter a valid URL starting with http:// or https://"
},
"encryptedWalletFileDescription": {
"message": "Enter your password to access your Encrypted Wallet File.",
"englishSource": "Enter your password to access your Encrypted Wallet File."
Expand Down Expand Up @@ -1792,6 +1864,42 @@
"message": "You can add and manage multiple account types later within the wallet.",
"englishSource": "You can add and manage multiple account types later within the wallet."
},
"chooseRecoveryMethod": {
"message": "Set Up Account Recovery",
"englishSource": "Set Up Account Recovery"
},
"chooseRecoveryMethodDescription": {
"message": "Choose how you want to recover your account if you lose access.",
"englishSource": "Choose how you want to recover your account if you lose access."
},
"guardianRecovery": {
"message": "Guardian",
"englishSource": "Guardian"
},
"guardianRecoveryDescription": {
"message": "Recommended. Guardian-based recovery for your account but gaurdian operator can see your state.",
"englishSource": "Recommended. Guardian-based recovery for your account but gaurdian operator can see your state."
},
"fullyPrivateRecovery": {
"message": "Fully Private",
"englishSource": "Fully Private"
},
"fullyPrivateRecoveryDescription": {
"message": "Local only, no one sees your state except you but no recovery, losing your device will result in permanent loss of your funds.",
"englishSource": "Local only, no one sees your state except you but no recovery, losing your device will result in permanent loss of your funds."
},
"publicAccountRecovery": {
"message": "Public",
"englishSource": "Public"
},
"publicAccountRecoveryDescription": {
"message": "Recover a public on-chain account.",
"englishSource": "Recover a public on-chain account."
},
"default": {
"message": "Default",
"englishSource": "Default"
},
"transactionFile": {
"message": "Transaction file",
"englishSource": "Transaction file"
Expand Down
Loading
Loading