From 50d12f8b1e8f3c3103224218b1fcecb9d0acfbab Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Wed, 11 Feb 2026 16:40:47 +0200 Subject: [PATCH 1/6] fix: reset stale balance when adding or importing a wallet --- src/components/index/CreateModal.vue | 1 + src/components/index/RestoreModal.vue | 1 + src/store.js | 9 +++++++++ 3 files changed, 11 insertions(+) diff --git a/src/components/index/CreateModal.vue b/src/components/index/CreateModal.vue index 08528cf..aa59473 100644 --- a/src/components/index/CreateModal.vue +++ b/src/components/index/CreateModal.vue @@ -213,6 +213,7 @@ export default { }, this.sessionPassword) await this.$store.dispatch('loadWallets', this.sessionPassword) + this.$store.dispatch('refresh') this.$emit('created') this.reset() this.close() diff --git a/src/components/index/RestoreModal.vue b/src/components/index/RestoreModal.vue index cc7342d..96a04bb 100644 --- a/src/components/index/RestoreModal.vue +++ b/src/components/index/RestoreModal.vue @@ -177,6 +177,7 @@ export default { }, this.sessionPassword) await this.$store.dispatch('loadWallets', this.sessionPassword) + this.$store.dispatch('refresh') this.$emit('imported') this.reset() this.close() diff --git a/src/store.js b/src/store.js index f938645..42d2f68 100644 --- a/src/store.js +++ b/src/store.js @@ -262,6 +262,15 @@ const init = async () => { if (activeWallet) { commit('setActiveWalletId', activeWallet.id) commit('setAddress', activeWallet.address) + // Reset balance state so stale values from a previous wallet don't linger + const cachedBalance = state.walletBalances[activeWallet.id] + commit('setBalance', cachedBalance != null ? cachedBalance : 0) + commit('setNextNonce', 0) + if (cachedBalance != null && state.usdPerXE != null) { + commit('setUSDBalance', state.usdPerXE * (cachedBalance / 1e6)) + } else { + commit('setUSDBalance', undefined) + } await storage.setActiveWalletId(activeWallet.id) } } catch (err) { From 672b256c84dcbbab887abecdbddd56e2c18a4fed Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Wed, 11 Feb 2026 17:14:52 +0200 Subject: [PATCH 2/6] fix: eliminate duplicate network requests on overview page --- src/components/Overviews.vue | 16 +------ src/components/TransactionsTable.vue | 2 +- src/store.js | 5 ++- src/views/Overview.vue | 63 +--------------------------- 4 files changed, 8 insertions(+), 78 deletions(-) diff --git a/src/components/Overviews.vue b/src/components/Overviews.vue index 632b6d8..64d05e0 100644 --- a/src/components/Overviews.vue +++ b/src/components/Overviews.vue @@ -1,31 +1,19 @@ diff --git a/src/components/TransactionsTable.vue b/src/components/TransactionsTable.vue index c1a47eb..023e4b7 100644 --- a/src/components/TransactionsTable.vue +++ b/src/components/TransactionsTable.vue @@ -118,7 +118,7 @@ export default { addr, { limit: this.limit, - page: this.page, + page: this.page || 1, sort: sortQuery } ) diff --git a/src/store.js b/src/store.js index 42d2f68..f18ed28 100644 --- a/src/store.js +++ b/src/store.js @@ -284,11 +284,12 @@ const init = async () => { const walletIds = state.wallets.map(w => w.id) commit('setWalletBalancesLoading', walletIds) - // Fetch balances in parallel + // Fetch balances in parallel (uses info, not infoWithNextNonce, + // to avoid unnecessary pending transaction requests for non-active wallets) const results = await Promise.allSettled( state.wallets.map(async (wallet) => { try { - const info = await xe.wallet.infoWithNextNonce(state.config.blockchain.baseURL, wallet.address) + const info = await xe.wallet.info(state.config.blockchain.baseURL, wallet.address) return { walletId: wallet.id, balance: info.balance } } catch (err) { console.error(`Failed to fetch balance for ${wallet.address}:`, err) diff --git a/src/views/Overview.vue b/src/views/Overview.vue index 7104d43..f7d8746 100644 --- a/src/views/Overview.vue +++ b/src/views/Overview.vue @@ -16,12 +16,11 @@

Recent transactions

-

{{error}}

- +
-
+
View all
@@ -36,26 +35,11 @@ import NewsPromo from '@/components/NewsPromo.vue' import Overviews from '@/components/Overviews.vue' import RecentBlocks from '@/components/RecentBlocks.vue' import TestnetFaucet from '@/components/Faucet.vue' -import dayjs from 'dayjs' -import { fetchTransactions } from '../utils/api' -import { mapState } from 'vuex' -import relativeTime from 'dayjs/plugin/relativeTime' - -dayjs.extend(relativeTime) - -const txCache = {} - export default { name: 'ViewOverview', title: 'Overview', data: function () { return { - transactions: [], - loading: true, - error: '', - polling: null, - overviews: [], - transactionRefreshInterval: 5000, isTestnet: import.meta.env.VITE_IS_TESTNET === 'true' } }, @@ -66,49 +50,6 @@ export default { NewsPromo, RecentBlocks, TestnetFaucet - }, - computed: mapState(['address']), - watch: { - address(newAddr) { - const cached = txCache[newAddr] - if (cached) { - this.transactions = cached.transactions - this.metadata = cached.metadata - } else { - this.transactions = [] - } - this.updateTransactions() - } - }, - mounted() { - this.initialise() - }, - unmounted() { - clearInterval(this.polling) - }, - methods: { - async initialise() { - await this.updateTransactions() - this.pollData() - }, - async updateTransactions() { - const addr = this.address - if (!addr) return - const { transactions, metadata } = await fetchTransactions(addr, { limit: 5 }) - - txCache[addr] = { transactions, metadata } - // Only update display if address hasn't changed during fetch - if (this.address === addr) { - this.transactions = transactions - this.metadata = metadata - this.loading = false - } - }, - pollData() { - this.polling = setInterval(() => { - this.updateTransactions() - }, this.transactionRefreshInterval) - } } } From b1d68871b9cd88432202b77c469b7774481d8486 Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Wed, 11 Feb 2026 17:41:26 +0200 Subject: [PATCH 3/6] fix: clear RecentBlocks polling interval on unmount --- src/components/RecentBlocks.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/components/RecentBlocks.vue b/src/components/RecentBlocks.vue index 6e91402..c08f662 100644 --- a/src/components/RecentBlocks.vue +++ b/src/components/RecentBlocks.vue @@ -76,6 +76,9 @@ export default { this.fetchBlocks() this.pollData() }, + unmounted() { + clearInterval(this.polling) + }, methods: { async fetchBlocks() { const limit = this.isTestnet ? 5 : 7 From a3b4029d50ba1e33bb0f296d3b2a2bb7eb1d13b5 Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Wed, 11 Feb 2026 17:51:34 +0200 Subject: [PATCH 4/6] fix: remove redundant vars fetch on staking modal mount --- src/components/stakes/CreateStakeModal.vue | 9 ++++++--- src/components/stakes/ReleaseStakeModal.vue | 7 ++----- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/components/stakes/CreateStakeModal.vue b/src/components/stakes/CreateStakeModal.vue index 273f114..f1ec327 100644 --- a/src/components/stakes/CreateStakeModal.vue +++ b/src/components/stakes/CreateStakeModal.vue @@ -191,6 +191,7 @@ export default { computed: { ...mapState(['address', 'balance', 'nextNonce']), canAffordStake() { + if (!this.vars) return false return this.balance >= this.vars.host_stake_amount }, canCreate() { @@ -200,15 +201,19 @@ export default { return (this.balance - this.stakeAmount) / 1e6 }, shortHostStakeAmount() { + if (!this.vars) return '' return this.formatShortAmount(this.vars.host_stake_amount) }, shortGatewayStakeAmount() { + if (!this.vars) return '' return this.formatShortAmount(this.vars.gateway_stake_amount) }, shortStargateStakeAmount() { + if (!this.vars) return '' return this.formatShortAmount(this.vars.stargate_stake_amount) }, stakeAmount() { + if (!this.vars) return 0 switch (this.stakeType) { case 'host': return this.vars.host_stake_amount @@ -294,6 +299,7 @@ export default { this.vars = await xe.vars(import.meta.env.VITE_BLOCKCHAIN_API_URL) }, isStakeAffordable(type) { + if (!this.vars) return false return this.balance - this.vars[type + '_stake_amount'] > 0 }, reset() { @@ -313,9 +319,6 @@ export default { } } }, - mounted() { - this.updateVars() - }, setup() { return { v$: useVuelidate() diff --git a/src/components/stakes/ReleaseStakeModal.vue b/src/components/stakes/ReleaseStakeModal.vue index 6eec218..861f9e9 100644 --- a/src/components/stakes/ReleaseStakeModal.vue +++ b/src/components/stakes/ReleaseStakeModal.vue @@ -273,11 +273,11 @@ export default { return this.unlocksAt < this.currentTime }, releaseFeeParsed() { - if (this.isUnlocked) return 0 + if (this.isUnlocked || !this.vars) return 0 else return this.stake.amount * this.vars.stake_express_release_fee / 1e6 }, releasePc() { - if (this.isUnlocked) return 0 + if (this.isUnlocked || !this.vars) return 0 else return this.vars.stake_express_release_fee * 100 }, returnAmountParsed() { @@ -407,9 +407,6 @@ export default { } } }, - mounted() { - this.updateVars() - }, setup() { return { v$: useVuelidate() From fe3d6481e314b9ec34127dd3d481bb4cfc3d88e8 Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Wed, 11 Feb 2026 18:28:02 +0200 Subject: [PATCH 5/6] refactor: move blockchain vars to vuex store --- src/components/stakes/CreateStakeModal.vue | 11 +++-------- src/components/stakes/ReleaseStakeModal.vue | 11 +++-------- src/main.js | 1 + src/store.js | 8 ++++++++ 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/src/components/stakes/CreateStakeModal.vue b/src/components/stakes/CreateStakeModal.vue index f1ec327..60ea2c7 100644 --- a/src/components/stakes/CreateStakeModal.vue +++ b/src/components/stakes/CreateStakeModal.vue @@ -174,9 +174,7 @@ export default { stakeType: '', completedTx: null, - submitError: '', - - vars: null + submitError: '' } }, validations() { @@ -189,7 +187,7 @@ export default { } }, computed: { - ...mapState(['address', 'balance', 'nextNonce']), + ...mapState(['address', 'balance', 'nextNonce', 'vars']), canAffordStake() { if (!this.vars) return false return this.balance >= this.vars.host_stake_amount @@ -295,9 +293,6 @@ export default { goto(step) { this.step = step }, - async updateVars() { - this.vars = await xe.vars(import.meta.env.VITE_BLOCKCHAIN_API_URL) - }, isStakeAffordable(type) { if (!this.vars) return false return this.balance - this.vars[type + '_stake_amount'] > 0 @@ -329,7 +324,7 @@ export default { if (v === oldv) return if (v) { this.$store.dispatch('refresh') - this.updateVars() + this.$store.dispatch('refreshVars') this.stakeType = 'host' } } diff --git a/src/components/stakes/ReleaseStakeModal.vue b/src/components/stakes/ReleaseStakeModal.vue index 861f9e9..68e4583 100644 --- a/src/components/stakes/ReleaseStakeModal.vue +++ b/src/components/stakes/ReleaseStakeModal.vue @@ -242,9 +242,7 @@ export default { confirmPhrase: '', completedTx: null, - submitError: '', - - vars: null + submitError: '' } }, validations() { @@ -260,7 +258,7 @@ export default { } }, computed: { - ...mapState(['address', 'nextNonce']), + ...mapState(['address', 'nextNonce', 'vars']), canRelease() { if (this.isUnlocked) return !this.v$.password.$invalid else return !this.v$.$invalid @@ -335,9 +333,6 @@ export default { return false } }, - async updateVars() { - this.vars = await xe.vars(import.meta.env.VITE_BLOCKCHAIN_API_URL) - }, goto(step) { this.step = step }, @@ -417,7 +412,7 @@ export default { if (v === oldv) return if (v) { this.$store.dispatch('refresh') - this.updateVars() + this.$store.dispatch('refreshVars') } }, stake() { diff --git a/src/main.js b/src/main.js index a0cce73..2c319e3 100644 --- a/src/main.js +++ b/src/main.js @@ -35,6 +35,7 @@ const init = async () => { if (store.state.address) store.dispatch('refresh') store.dispatch('refreshIndexConfig') + store.dispatch('refreshVars') setInterval(() => store.dispatch('backgroundRefresh'), WALLET_REFRESH_INTERVAL) } diff --git a/src/store.js b/src/store.js index f18ed28..54aa765 100644 --- a/src/store.js +++ b/src/store.js @@ -58,6 +58,7 @@ const init = async () => { }, bridgeOnline: false, + vars: null, // Multi-wallet support wallets: [], @@ -93,6 +94,9 @@ const init = async () => { setBridgeOnline(state, online) { state.bridgeOnline = online }, + setVars(state, vars) { + state.vars = vars + }, setNextNonce(state, nextNonce) { state.nextNonce = nextNonce }, @@ -183,6 +187,10 @@ const init = async () => { console.error('Refresh failed:', err) } }, + async refreshVars({ commit, state }) { + const vars = await xe.vars(state.config.blockchain.baseURL) + commit('setVars', vars) + }, async refreshIndexConfig({ commit, state }) { const res = await fetch(`${state.config.index.baseURL}/v2/config`) if (!res.ok) { From 165280e2979b7425b8522f43b8a56d19cecfeccd Mon Sep 17 00:00:00 2001 From: Andrei Radulescu Date: Thu, 12 Feb 2026 15:15:03 +0200 Subject: [PATCH 6/6] chore: bump version to 1.23.4 --- package-lock.json | 4 ++-- package.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe45d89..8ffdde0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "wallet", - "version": "1.23.3", + "version": "1.23.4", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "wallet", - "version": "1.23.3", + "version": "1.23.4", "license": "GPL", "dependencies": { "@chenfengyuan/vue-qrcode": "^2.0.0", diff --git a/package.json b/package.json index 1df96a5..d8e093c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "wallet", - "version": "1.23.3", + "version": "1.23.4", "description": "Web wallet for managing $EDGE", "private": true, "license": "GPL",