refactor MoneroWalletManager class to function module; fix settings page imports

This commit is contained in:
2026-05-26 03:08:58 +08:00
parent b5f4a80f5c
commit 6fe9e6306b
7 changed files with 575 additions and 613 deletions
+65 -146
View File
@@ -1,20 +1,30 @@
import {
isBinaryInstalled,
downloadBinary,
MoneroWalletManager,
createMoneroWalletState,
start as walletStart,
stop as walletStop,
createWallet as walletCreate,
restoreWallet as walletRestore,
openWallet as walletOpen,
getBalance as walletGetBalance,
getTransactions as walletGetTransactions,
getAccounts as walletGetAccounts,
listWallets,
getTransferDetails as walletGetTransferDetails,
getHeight as walletGetHeight,
getDaemonHeight as walletGetDaemonHeight,
getFeeEstimate as walletGetFeeEstimate,
transfer as walletTransfer,
isWalletOpen,
isConnected,
} from '../../lib/monero'
import type { MoneroWalletState } from '../../lib/monero'
export function createMoneroHandlers(state: {
manager: MoneroWalletManager | null
downloading: boolean
}) {
export function createMoneroHandlers(state: { manager: MoneroWalletState | null; downloading: boolean }) {
return {
moneroBinaryStatus: async () => {
const status = {
installed: isBinaryInstalled(),
downloading: state.downloading,
error: undefined,
}
const status = { installed: isBinaryInstalled(), downloading: state.downloading }
console.log('[rpc] moneroBinaryStatus:', status)
return status
},
@@ -31,117 +41,62 @@ export function createMoneroHandlers(state: {
state.downloading = false
}
},
moneroStart: async ({
daemonAddress,
}: {
daemonAddress?: string
}) => {
moneroStart: async ({ daemonAddress }: { daemonAddress?: string }) => {
console.log('[rpc] moneroStart:', { daemonAddress })
if (!state.manager) {
state.manager = new MoneroWalletManager()
state.manager = createMoneroWalletState()
}
try {
await state.manager.start(daemonAddress)
await walletStart(state.manager, daemonAddress)
} catch (e) {
console.log('[rpc] moneroStart error:', e)
return { running: false, walletOpen: false, connected: false }
}
const connected = await state.manager.isConnected()
const connected = await isConnected(state.manager)
console.log('[rpc] moneroStart complete, connected:', connected)
return { running: true, walletOpen: false, connected }
},
moneroStop: async () => {
console.log('[rpc] moneroStop')
if (state.manager) {
await state.manager.stop()
await walletStop(state.manager)
state.manager = null
}
},
moneroCreateWallet: async ({
name,
password,
}: {
name: string
password: string
}) => {
moneroCreateWallet: async ({ name, password }: { name: string; password: string }) => {
console.log('[rpc] moneroCreateWallet:', name)
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const result = await state.manager.createWallet(name, password)
if (!state.manager) throw new Error('Monero wallet RPC not started')
const result = await walletCreate(state.manager, name, password)
console.log('[rpc] moneroCreateWallet complete')
return result
},
moneroRestoreWallet: async ({
name,
password,
mnemonic,
restoreHeight,
}: {
name: string
password: string
mnemonic: string
restoreHeight?: number
}) => {
moneroRestoreWallet: async ({ name, password, mnemonic, restoreHeight }: { name: string; password: string; mnemonic: string; restoreHeight?: number }) => {
console.log('[rpc] moneroRestoreWallet:', name)
if (!state.manager)
throw new Error('Monero wallet RPC not started')
await state.manager.restoreWallet(
name,
password,
mnemonic,
restoreHeight,
)
const address = await state.manager.getAddress()
console.log(
'[rpc] moneroRestoreWallet complete, address:',
address,
)
if (!state.manager) throw new Error('Monero wallet RPC not started')
await walletRestore(state.manager, name, password, mnemonic, restoreHeight)
const address = await walletGetAddress(state.manager)
console.log('[rpc] moneroRestoreWallet complete, address:', address)
return { address }
},
moneroOpenWallet: async ({
name,
password,
}: {
name: string
password: string
}) => {
moneroOpenWallet: async ({ name, password }: { name: string; password: string }) => {
console.log('[rpc] moneroOpenWallet:', name)
if (!state.manager)
throw new Error('Monero wallet RPC not started')
await state.manager.openWallet(name, password)
if (!state.manager) throw new Error('Monero wallet RPC not started')
await walletOpen(state.manager, name, password)
},
moneroGetBalance: async () => {
console.log('[rpc] moneroGetBalance')
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const { balance, unlocked } = await state.manager.getBalance()
const address = await state.manager.getAddress()
const height = await state.manager.getHeight()
const daemonHeight = await state.manager.getDaemonHeight()
console.log('[rpc] balance:', {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
})
return {
balance: balance.toString(),
unlocked: unlocked.toString(),
address,
height,
daemonHeight,
}
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 }
},
moneroGetTransactions: async ({
accountIndex,
}: {
accountIndex?: number
}) => {
moneroGetTransactions: async ({ accountIndex }: { accountIndex?: number }) => {
console.log('[rpc] moneroGetTransactions', { accountIndex })
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const txs = await state.manager.getTransactions(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
},
@@ -150,85 +105,49 @@ export function createMoneroHandlers(state: {
console.log('[rpc] moneroWalletStatus: not running')
return { running: false, walletOpen: false, connected: false }
}
const connected = await state.manager.isConnected()
const walletOpen = await state.manager.isWalletOpen()
console.log(
'[rpc] moneroWalletStatus: running, walletOpen:',
walletOpen,
'connected:',
connected,
)
const connected = await isConnected(state.manager)
const walletOpen = await isWalletOpen(state.manager)
console.log('[rpc] moneroWalletStatus: running, walletOpen:', walletOpen, 'connected:', connected)
return { running: true, walletOpen, connected }
},
moneroGetAccounts: async () => {
console.log('[rpc] moneroGetAccounts')
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const accounts = await state.manager.getAccounts()
console.log(
`[rpc] moneroGetAccounts: ${accounts.length} accounts`,
)
if (!state.manager) throw new Error('Monero wallet RPC not started')
const accounts = await walletGetAccounts(state.manager)
console.log(`[rpc] moneroGetAccounts: ${accounts.length} accounts`)
return accounts
},
moneroListWallets: async () => {
console.log('[rpc] moneroListWallets')
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const wallets = state.manager.listWallets()
console.log(
`[rpc] moneroListWallets: ${wallets.join(', ') || 'none'}`,
)
if (!state.manager) throw new Error('Monero wallet RPC not started')
const wallets = listWallets()
console.log(`[rpc] moneroListWallets: ${wallets.join(', ') || 'none'}`)
return wallets
},
moneroTransfer: async ({
address,
amount,
priority,
accountIndex,
}: {
address: string
amount: string
priority?: number
accountIndex?: number
}) => {
console.log('[rpc] moneroTransfer:', {
address,
amount,
priority,
})
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const result = await state.manager.transfer(
address,
BigInt(amount),
priority ?? 0,
accountIndex ?? 0,
)
moneroTransfer: async ({ address, amount, priority, accountIndex }: { address: string; amount: string; priority?: number; accountIndex?: number }) => {
console.log('[rpc] moneroTransfer:', { address, amount, priority })
if (!state.manager) throw new Error('Monero wallet RPC not started')
const result = await walletTransfer(state.manager, address, BigInt(amount), priority ?? 0, accountIndex ?? 0)
console.log('[rpc] moneroTransfer complete:', result.txHash)
return result
},
moneroGetTransferDetails: async ({ txid }: { txid: string }) => {
console.log('[rpc] moneroGetTransferDetails:', txid)
if (!state.manager)
throw new Error('Monero wallet RPC not started')
const details = await state.manager.getTransferDetails(txid)
console.log(
'[rpc] moneroGetTransferDetails complete:',
details?.hash,
)
if (!state.manager) throw new Error('Monero wallet RPC not started')
const details = await walletGetTransferDetails(state.manager, txid)
console.log('[rpc] moneroGetTransferDetails complete:', details?.hash)
return details
},
moneroGetFeeEstimate: async () => {
console.log('[rpc] moneroGetFeeEstimate')
if (!state.manager)
throw new Error('Monero wallet RPC not started')
if (!state.manager) throw new Error('Monero wallet RPC not started')
try {
const fee = await state.manager.getFeeEstimate()
const fee = await walletGetFeeEstimate(state.manager)
console.log('[monero][gas][fee]', fee)
return fee
} catch (error) {
console.log('[monero][gas][error]', error)
return null
return
}
},
}