2 Commits
Author SHA1 Message Date
TZGyn c61fea938a bump version to 0.0.8 2026-08-02 15:09:28 +08:00
TZGyn bdfee2a553 log monero sync state and refresh failures 2026-08-02 15:09:28 +08:00
3 changed files with 63 additions and 29 deletions
+1 -1
View File
@@ -4,7 +4,7 @@ export default {
app: {
name: 'koins',
identifier: 'koins.tzgyn.com',
version: '0.0.7',
version: '0.0.8',
},
build: {
// Vite builds to dist/, we copy from there
+35 -25
View File
@@ -151,25 +151,30 @@ export function createMoneroHandlers(state: {
console.log('[rpc] moneroGetBalance')
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const { balance, unlocked } = await walletGetBalance(
state.manager,
)
const address = await walletGetAddress(state.manager)
const height = await walletGetHeight(state.manager)
const daemonHeight = await walletGetDaemonHeight(state.manager)
console.log('[rpc] balance:', {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
})
return {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
try {
const { balance, unlocked } = await walletGetBalance(
state.manager,
)
const address = await walletGetAddress(state.manager)
const height = await walletGetHeight(state.manager)
const daemonHeight = await walletGetDaemonHeight(state.manager)
console.log('[rpc] balance:', {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
})
return {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
}
} catch (e) {
logError('[rpc] moneroGetBalance failed', e)
throw e
}
},
moneroGetTransactions: async ({
@@ -180,12 +185,17 @@ export function createMoneroHandlers(state: {
console.log('[rpc] moneroGetTransactions', { accountIndex })
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const txs = await walletGetTransactions(
state.manager,
accountIndex,
)
console.log(`[rpc] moneroGetTransactions: ${txs.length} txs`)
return txs
try {
const txs = await walletGetTransactions(
state.manager,
accountIndex,
)
console.log(`[rpc] moneroGetTransactions: ${txs.length} txs`)
return txs
} catch (e) {
logError('[rpc] moneroGetTransactions failed', e)
throw e
}
},
moneroWalletStatus: async () => {
if (!state.manager) {
@@ -1,5 +1,7 @@
import {
electrobun,
frontendLog,
frontendLogError,
type MoneroTxEntry,
type MoneroAccountEntry,
type MoneroSendResult,
@@ -406,6 +408,8 @@ export const MoneroWallet = () => {
refreshInFlight = (async () => {
loading = true
let failed = false
const wasSyncing = syncing
let lastError: unknown = null
try {
const [bal, balErr] = await tryCatch(
rpcTimeout(
@@ -414,7 +418,10 @@ export const MoneroWallet = () => {
'moneroGetBalance',
),
)
if (balErr) failed = true
if (balErr) {
failed = true
lastError = balErr
}
if (bal) {
balAtomic = bal.balance
unlockedAtomic = bal.unlocked
@@ -431,21 +438,38 @@ export const MoneroWallet = () => {
'moneroGetTransactions',
),
)
if (txErr) failed = true
if (txErr) {
failed = true
lastError = txErr
}
txs = result ?? []
const ok = await fetchAccounts()
if (!ok) failed = true
if (!ok) {
failed = true
lastError = new Error('moneroGetAccounts failed')
}
if (failed) {
// The wallet-rpc is likely busy syncing; keep the stale
// balance and retry shortly instead of showing an error.
syncing = true
scheduleSyncRetry()
frontendLogError(
`monero refresh failed (height ${height}/${daemonHeight})`,
lastError,
)
} else {
if (wasSyncing) {
frontendLog(`monero sync complete at height ${height}`)
}
syncing = false
}
} catch (e) {
syncing = true
scheduleSyncRetry()
frontendLogError(
`monero refresh failed (height ${height}/${daemonHeight})`,
e,
)
} finally {
loading = false
refreshInFlight = null