= {}
+ res.result.forEach(v => {
+ if (hashToPayload[v.hash]) {
+ tmp[hashToPayload[v.hash]] = v.blockStartNumber
+ }
+ })
+ setMultisigSyncProgress(tmp)
+ }
+ })
+ }, [hashToPayload])
useEffect(() => {
const dataUpdateSubscription = MultisigOutputUpdate.subscribe(() => {
getAndSaveMultisigBalances()
+ if (isLightClient) {
+ getAndSaveMultisigSyncProgress()
+ }
})
getAndSaveMultisigBalances()
+ if (isLightClient) {
+ getAndSaveMultisigSyncProgress()
+ }
return () => {
dataUpdateSubscription.unsubscribe()
}
}, [walletId, getAndSaveMultisigBalances])
- return multisigBanlances
+ return { multisigBanlances, multisigSyncProgress }
}
diff --git a/packages/neuron-ui/src/components/MultisigAddress/index.tsx b/packages/neuron-ui/src/components/MultisigAddress/index.tsx
index 68e95209ea..54b8aab62a 100644
--- a/packages/neuron-ui/src/components/MultisigAddress/index.tsx
+++ b/packages/neuron-ui/src/components/MultisigAddress/index.tsx
@@ -20,6 +20,7 @@ import { EditTextField } from 'widgets/TextField'
import { MultisigConfig } from 'services/remote'
import PasswordRequest from 'components/PasswordRequest'
import ApproveMultisigTx from 'components/ApproveMultisigTx'
+import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
import { useSearch, useConfigManage, useExportConfig, useActions, useSubscription } from './hooks'
import styles from './multisigAddress.module.scss'
@@ -52,6 +53,10 @@ const MultisigAddress = () => {
// eslint-disable-next-line
}, [i18n.language])
const isMainnet = isMainnetUtil(networks, networkID)
+ const isLightClient = useMemo(() => networks.find(n => n.id === networkID)?.remote === BUNDLED_LIGHT_CKB_URL, [
+ networks,
+ networkID,
+ ])
const { openDialog, closeDialog, dialogRef, isDialogOpen } = useDialogWrapper()
const {
allConfigs,
@@ -65,7 +70,12 @@ const MultisigAddress = () => {
walletId,
isMainnet,
})
- const multisigBanlances = useSubscription({ walletId, isMainnet, configs: allConfigs })
+ const { multisigBanlances, multisigSyncProgress } = useSubscription({
+ walletId,
+ isMainnet,
+ configs: allConfigs,
+ isLightClient,
+ })
const { deleteAction, infoAction, sendAction, approveAction } = useActions({ deleteConfigById })
const onClickItem = useCallback(
(multisigConfig: MultisigConfig) => (option: { key: string }) => {
@@ -138,8 +148,10 @@ const MultisigAddress = () => {
|
|
- {['address', 'alias', 'type', 'balance'].map(field => (
- {t(`multisig-address.table.${field}`)} |
+ {['address', 'alias', 'type', ...(isLightClient ? ['sync-block'] : []), 'balance'].map(field => (
+
+ {t(`multisig-address.table.${field}`)}
+ |
))}
@@ -173,6 +185,7 @@ const MultisigAddress = () => {
of
{v.n}
+ {isLightClient ? {multisigSyncProgress?.[v.fullPayload] ?? 0} | : null}
{shannonToCKBFormatter(multisigBanlances[v.fullPayload])}
CKB
diff --git a/packages/neuron-ui/src/components/MultisigAddress/multisigAddress.module.scss b/packages/neuron-ui/src/components/MultisigAddress/multisigAddress.module.scss
index adc8839afe..f3a0a2baa9 100644
--- a/packages/neuron-ui/src/components/MultisigAddress/multisigAddress.module.scss
+++ b/packages/neuron-ui/src/components/MultisigAddress/multisigAddress.module.scss
@@ -55,6 +55,10 @@
padding: 8px;
min-width: 40px;
text-align: left;
+
+ &[data-field="sync-block"] {
+ min-width: 70px;
+ }
}
.checkBoxTh {
diff --git a/packages/neuron-ui/src/locales/en.json b/packages/neuron-ui/src/locales/en.json
index 7052d4eb0f..5360f0e6c2 100644
--- a/packages/neuron-ui/src/locales/en.json
+++ b/packages/neuron-ui/src/locales/en.json
@@ -924,6 +924,7 @@
"type": "type",
"balance": "balance",
"copy-address": "Copy Address",
+ "sync-block": "Synced Block",
"actions": {
"info": "Info",
"send": "Send",
diff --git a/packages/neuron-ui/src/locales/zh-tw.json b/packages/neuron-ui/src/locales/zh-tw.json
index f92e77e793..f052facf08 100644
--- a/packages/neuron-ui/src/locales/zh-tw.json
+++ b/packages/neuron-ui/src/locales/zh-tw.json
@@ -915,6 +915,7 @@
"type": "類型",
"balance": "余额",
"copy-address": "復製地址",
+ "sync-block": "同步高度",
"actions": {
"info": "詳情",
"send": "轉賬",
diff --git a/packages/neuron-ui/src/locales/zh.json b/packages/neuron-ui/src/locales/zh.json
index fde5ff1e56..347753804b 100644
--- a/packages/neuron-ui/src/locales/zh.json
+++ b/packages/neuron-ui/src/locales/zh.json
@@ -916,6 +916,7 @@
"type": "类型",
"balance": "余额",
"copy-address": "复制地址",
+ "sync-block": "同步高度",
"actions": {
"info": "详情",
"send": "转账",
diff --git a/packages/neuron-ui/src/services/remote/multisig.ts b/packages/neuron-ui/src/services/remote/multisig.ts
index 89ac83f02e..5c1839325d 100644
--- a/packages/neuron-ui/src/services/remote/multisig.ts
+++ b/packages/neuron-ui/src/services/remote/multisig.ts
@@ -51,3 +51,6 @@ export const generateMultisigSendAllTx = remoteApi<{
multisigConfig: MultisigConfig
}>('generate-multisig-send-all-tx')
export const loadMultisigTxJson = remoteApi('load-multisig-tx-json')
+export const getMultisigSyncProgress = remoteApi(
+ 'get-sync-progress-by-addresses'
+)
diff --git a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts
index 36081059cd..bf8b71e385 100644
--- a/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts
+++ b/packages/neuron-ui/src/services/remote/remoteApiWrapper.ts
@@ -146,6 +146,7 @@ type Action =
| 'load-multisig-tx-json'
| 'get-hold-sudt-cell-capacity'
| 'start-migrate'
+ | 'get-sync-progress-by-addresses'
export const remoteApi = (action: Action) => async (params: P): Promise> => {
const res: SuccessFromController | FailureFromController = await ipcRenderer.invoke(action, params).catch(() => ({
diff --git a/packages/neuron-ui/src/utils/const.ts b/packages/neuron-ui/src/utils/const.ts
index 66fdd832f2..8713b14b47 100644
--- a/packages/neuron-ui/src/utils/const.ts
+++ b/packages/neuron-ui/src/utils/const.ts
@@ -65,3 +65,4 @@ export const DEPRECATED_CODE_HASH: Record = {
}
export const LIGHT_CLIENT_TESTNET = 'light_client_testnet'
+export const BUNDLED_LIGHT_CKB_URL = 'http://localhost:9000'
diff --git a/packages/neuron-ui/src/widgets/InputSelect/index.tsx b/packages/neuron-ui/src/widgets/InputSelect/index.tsx
index 5d924b64d1..bc7728a98e 100644
--- a/packages/neuron-ui/src/widgets/InputSelect/index.tsx
+++ b/packages/neuron-ui/src/widgets/InputSelect/index.tsx
@@ -34,7 +34,7 @@ const Select = ({ value, options, placeholder, disabled, onChange, className }:
const onDocumentClick = useCallback(
(e: any) => {
- if (mounted.current && !root.current!.contains(e.target) && openRef.current) {
+ if (mounted.current && !root.current?.contains(e.target) && openRef.current) {
setOpen(false)
}
},
diff --git a/packages/neuron-wallet/src/block-sync-renderer/index.ts b/packages/neuron-wallet/src/block-sync-renderer/index.ts
index 59fa02fc75..47076b1a6a 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/index.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/index.ts
@@ -15,6 +15,10 @@ import logger from 'utils/logger'
import CommonUtils from 'utils/common'
import queueWrapper from 'utils/queue'
import env from 'env'
+import MultisigConfigDbChangedSubject from 'models/subjects/multisig-config-db-changed-subject'
+import Multisig from 'services/multisig'
+import { SyncAddressType } from 'database/chain/entities/sync-progress'
+import { debounceTime } from 'rxjs/operators'
let network: Network | null
let child: ChildProcess | null = null
@@ -193,3 +197,17 @@ export const registerRequest = (c: ChildProcess, msg: Required) =
AddressCreatedSubject.getSubject().subscribe(() => resetSyncTaskQueue.asyncPush(true))
WalletDeletedSubject.getSubject().subscribe(() => resetSyncTaskQueue.asyncPush(true))
+MultisigConfigDbChangedSubject.getSubject()
+ .pipe(debounceTime(1000))
+ .subscribe(async () => {
+ if (!child) {
+ return
+ }
+ const appendScripts = await Multisig.getMultisigConfigForLight()
+ const msg: Required> = { type: 'call', channel: 'append_scripts', id: requestId++, message: appendScripts }
+ return registerRequest(child, msg).catch(err => {
+ logger.error(`Sync:\ffailed to append script to light client`, err)
+ })
+ })
diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/connector.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/connector.ts
index ae45229b73..06e6f5ceb9 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/sync/connector.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/sync/connector.ts
@@ -1,3 +1,4 @@
+import { SyncAddressType } from 'database/chain/entities/sync-progress'
import { Subject } from 'rxjs'
export interface BlockTips {
@@ -33,6 +34,13 @@ export interface LumosCell {
data?: string
}
+export interface AppendScript {
+ walletId: string
+ script: CKBComponents.Script
+ addressType: SyncAddressType
+ scriptType: CKBRPC.ScriptType
+}
+
export abstract class Connector {
abstract blockTipsSubject: Subject
abstract transactionsSubject: Subject<{ txHashes: CKBComponents.Hash[]; params: TransactionsSubjectParam }>
@@ -41,4 +49,7 @@ export abstract class Connector {
abstract notifyCurrentBlockNumberProcessed(param: TransactionsSubjectParam): void
abstract stop(): void
abstract getLiveCellsByScript(query: LumosCellQuery): Promise
+ async appendScript(_scripts: AppendScript[]) {
+ // do nothing
+ }
}
diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts
index 798664f17c..61affcacf7 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/sync/light-connector.ts
@@ -7,10 +7,13 @@ import { Address } from 'models/address'
import AddressMeta from 'database/address/meta'
import { scheduler } from 'timers/promises'
import SyncProgressService from 'services/sync-progress'
-import { BlockTips, LumosCellQuery, Connector } from './connector'
+import { BlockTips, LumosCellQuery, Connector, AppendScript } from './connector'
import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils'
import { LightRPC, LightScriptFilter } from '../../utils/ckb-rpc'
import HexUtils from 'utils/hex'
+import Multisig from 'services/multisig'
+import { SyncAddressType } from 'database/chain/entities/sync-progress'
+import WalletService from 'services/wallets'
interface SyncQueueParam {
script: CKBComponents.Script
@@ -84,7 +87,7 @@ export default class LightConnector extends Connector {
}
private async subscribeSync() {
- const minSyncBlockNumber = await SyncProgressService.getMinBlockNumber()
+ const minSyncBlockNumber = await SyncProgressService.getCurrentWalletMinBlockNumber()
const header = await this.lightRpc.getTipHeader()
this.blockTipsSubject.next({
cacheTipNumber: minSyncBlockNumber,
@@ -92,8 +95,8 @@ export default class LightConnector extends Connector {
})
}
- private async initSyncProgress() {
- if (!this.addressMetas.length) {
+ private async initSyncProgress(appendScripts?: AppendScript[]) {
+ if (!this.addressMetas.length && !appendScripts?.length) {
return
}
const sycnScripts = await this.lightRpc.getScripts()
@@ -101,7 +104,9 @@ export default class LightConnector extends Connector {
sycnScripts.forEach(v => {
existSyncscripts[scriptToHash(v.script)] = v
})
+ const currentWalletId = WalletService.getInstance().getCurrent()?.id
const allScripts = this.addressMetas
+ .filter(v => (currentWalletId ? v.walletId === currentWalletId : true))
.map(addressMeta => {
const lockScripts = [
addressMeta.generateDefaultLockScript(),
@@ -115,18 +120,33 @@ export default class LightConnector extends Connector {
}))
})
.flat()
+ .concat(appendScripts ?? [])
+ const walletMinBlockNumber = await SyncProgressService.getWalletMinBlockNumber()
+ const wallets = await WalletService.getInstance().getAll()
+ const walletStartBlockMap = wallets.reduce>(
+ (pre, cur) => ({ ...pre, [cur.id]: cur.startBlockNumberInLight }),
+ {}
+ )
const setScriptsParams = allScripts.map(v => ({
...v,
- blockNumber: existSyncscripts[scriptToHash(v.script)]?.blockNumber || '0x0'
+ blockNumber:
+ existSyncscripts[scriptToHash(v.script)]?.blockNumber ??
+ walletStartBlockMap[v.walletId] ??
+ `0x${(walletMinBlockNumber?.[v.walletId] ?? 0).toString(16)}`
}))
await this.lightRpc.setScripts(setScriptsParams)
await SyncProgressService.resetSyncProgress(allScripts)
const walletIds = [...new Set(this.addressMetas.map(v => v.walletId))]
await SyncProgressService.removeWalletsByExists(walletIds)
+ await SyncProgressService.removeByHashesAndAddressType(
+ SyncAddressType.Multisig,
+ appendScripts?.map(v => scriptToHash(v.script))
+ )
}
private async initSync() {
- await this.initSyncProgress()
+ const appendScripts = await Multisig.getMultisigConfigForLight()
+ await this.initSyncProgress(appendScripts)
while (this.pollingIndexer) {
await this.synchronize()
await scheduler.wait(5000)
@@ -224,4 +244,11 @@ export default class LightConnector extends Connector {
}
await this.subscribeSync()
}
+
+ async appendScript(scripts: AppendScript[]) {
+ if (!scripts.length) {
+ return
+ }
+ this.initSyncProgress(scripts)
+ }
}
diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/queue.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/queue.ts
index e02ce29c21..8d39e238ae 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/sync/queue.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/sync/queue.ts
@@ -16,7 +16,7 @@ import IndexerCacheService from './indexer-cache-service'
import logger from 'utils/logger'
import CommonUtils from 'utils/common'
import { ShouldInChildProcess } from 'exceptions'
-import { BlockTips, Connector } from './connector'
+import { AppendScript, BlockTips, Connector } from './connector'
import LightConnector from './light-connector'
import { generateRPC } from 'utils/ckb-rpc'
import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
@@ -106,6 +106,10 @@ export default class Queue {
}
}
+ async appendLightScript(scripts: AppendScript[]) {
+ await this.#indexerConnector?.appendScript(scripts)
+ }
+
private async fetchTxsWithStatus(txHashes: string[]) {
const rpc = generateRPC(this.#url)
const txsWithStatus = await rpc.createBatchRequest<'getTransaction', string[], CKBComponents.TransactionWithStatus[]>(
diff --git a/packages/neuron-wallet/src/block-sync-renderer/task.ts b/packages/neuron-wallet/src/block-sync-renderer/task.ts
index b56403dfa7..de1a97b63c 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/task.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/task.ts
@@ -12,7 +12,7 @@ let syncQueue: SyncQueue | null
export interface WorkerMessage {
type: 'call' | 'response' | 'kill',
id?: number,
- channel: 'start' | 'queryIndexer' | 'unmount' | 'cache-tip-block-updated' | 'tx-db-changed' | 'wallet-deleted' | 'address-created' | 'indexer-error' | 'check-and-save-wallet-address'
+ channel: 'start' | 'queryIndexer' | 'unmount' | 'cache-tip-block-updated' | 'tx-db-changed' | 'wallet-deleted' | 'address-created' | 'indexer-error' | 'check-and-save-wallet-address' | 'append_scripts'
message: T
}
@@ -74,6 +74,12 @@ export const listener = async ({ type, id, channel, message }: WorkerMessage) =>
res = message ? await syncQueue?.getIndexerConnector()?.getLiveCellsByScript(message) : []
break
}
+ case 'append_scripts': {
+ if (message && Array.isArray(message)) {
+ await syncQueue?.appendLightScript(message)
+ }
+ break
+ }
default: {
// ignore
}
diff --git a/packages/neuron-wallet/src/controllers/api.ts b/packages/neuron-wallet/src/controllers/api.ts
index 7931281f69..18c01f655c 100644
--- a/packages/neuron-wallet/src/controllers/api.ts
+++ b/packages/neuron-wallet/src/controllers/api.ts
@@ -57,6 +57,7 @@ import IndexerService from 'services/indexer'
import MultisigConfigModel from 'models/multisig-config'
import startMonitor, { stopMonitor } from 'services/monitor'
import { migrateCkbData } from 'services/ckb-runner'
+import SyncProgressService from 'services/sync-progress'
export type Command = 'export-xpubkey' | 'import-xpubkey' | 'delete-wallet' | 'backup-wallet' | 'migrate-acp'
// Handle channel messages from renderer process and user actions.
@@ -686,6 +687,14 @@ export default class ApiController {
status: ResponseCode.Success,
}
})
+
+ //light client
+ handle('get-sync-progress-by-addresses', async (_, hashes: string[]) => {
+ return {
+ result: (await SyncProgressService.getSyncProgressByHashes(hashes)),
+ status: ResponseCode.Success,
+ }
+ })
}
// Register handler, warp and serialize API response
diff --git a/packages/neuron-wallet/src/controllers/app/index.ts b/packages/neuron-wallet/src/controllers/app/index.ts
index 336dc88cba..a6a992efa1 100644
--- a/packages/neuron-wallet/src/controllers/app/index.ts
+++ b/packages/neuron-wallet/src/controllers/app/index.ts
@@ -15,6 +15,7 @@ import SyncApiController from 'controllers/sync-api'
import { SETTINGS_WINDOW_TITLE } from 'utils/const'
import { stopCkbNode } from 'services/ckb-runner'
import startMonitor from 'services/monitor'
+import { CKBLightRunner } from 'services/light-runner'
const app = electronApp
@@ -62,6 +63,7 @@ export default class AppController {
return
}
await stopCkbNode()
+ await CKBLightRunner.getInstance().stop()
}
public registerChannels(win: BrowserWindow, channels: string[]) {
diff --git a/packages/neuron-wallet/src/controllers/app/menu.ts b/packages/neuron-wallet/src/controllers/app/menu.ts
index 23fcad9d1d..408ccc15d0 100644
--- a/packages/neuron-wallet/src/controllers/app/menu.ts
+++ b/packages/neuron-wallet/src/controllers/app/menu.ts
@@ -12,10 +12,11 @@ import WalletsService from 'services/wallets'
import OfflineSignService from 'services/offline-sign'
import CommandSubject from 'models/subjects/command'
import logger from 'utils/logger'
-import { SETTINGS_WINDOW_TITLE, SETTINGS_WINDOW_WIDTH } from 'utils/const'
+import { BUNDLED_LIGHT_CKB_URL, SETTINGS_WINDOW_TITLE, SETTINGS_WINDOW_WIDTH } from 'utils/const'
import { OfflineSignJSON } from 'models/offline-sign'
import NetworksService from 'services/networks'
import { clearCkbNodeCache } from 'services/ckb-runner'
+import { CKBLightRunner } from 'services/light-runner'
enum URL {
Settings = '/settings/general',
@@ -116,7 +117,7 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
let isMainWindow = mainWindow === currentWindow
const walletsService = WalletsService.getInstance()
- const isMainnet = new NetworksService().getCurrent().chain === 'ckb'
+ const network = new NetworksService().getCurrent()
const wallets = walletsService.getAll().map(({ id, name }) => ({ id, name }))
const currentWallet = walletsService.getCurrent()
const hasCurrentWallet = currentWallet !== undefined
@@ -316,7 +317,7 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
`#/multisig-address/${currentWallet!.id}`,
t(`messageBox.multisig-address.title`),
{
- width: 900,
+ width: 1000,
maxWidth: 900,
minWidth: 900,
resizable: true
@@ -327,7 +328,7 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
},
{
label: t('application-menu.tools.clear-sync-data'),
- enabled: hasCurrentWallet && isMainnet,
+ enabled: hasCurrentWallet && (network.chain === 'ckb' || BUNDLED_LIGHT_CKB_URL === network.remote),
click: async () => {
const res = await dialog.showMessageBox({
type: 'warning',
@@ -338,7 +339,12 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
cancelId: 1
})
if (res.response === 0) {
- await clearCkbNodeCache()
+ const network = new NetworksService().getCurrent()
+ if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ await CKBLightRunner.getInstance().clearNodeCache()
+ } else {
+ await clearCkbNodeCache()
+ }
}
}
},
diff --git a/packages/neuron-wallet/src/controllers/export-debug.ts b/packages/neuron-wallet/src/controllers/export-debug.ts
index 2212595019..a1722eedd7 100644
--- a/packages/neuron-wallet/src/controllers/export-debug.ts
+++ b/packages/neuron-wallet/src/controllers/export-debug.ts
@@ -11,6 +11,7 @@ import AddressService from 'services/addresses'
import redistCheck from 'utils/redist-check'
import SettingsService from 'services/settings'
import { generateRPC } from 'utils/ckb-rpc'
+import { CKBLightRunner } from 'services/light-runner'
export default class ExportDebugController {
// eslint-disable-next-line prettier/prettier
@@ -37,7 +38,13 @@ export default class ExportDebugController {
return
}
this.archive.pipe(fs.createWriteStream(filePath))
- await Promise.all([this.addStatusFile(), this.addBundledCKBLog(), this.addLogFiles(), this.addHdPublicKeyInfoCsv()])
+ await Promise.all([
+ this.addStatusFile(),
+ this.addBundledCKBLog(),
+ this.addLogFiles(),
+ this.addHdPublicKeyInfoCsv(),
+ this.addBundledCKBLightClientLog()
+ ])
await this.archive.finalize()
dialog.showMessageBox({
type: 'info',
@@ -147,4 +154,10 @@ export default class ExportDebugController {
this.archive.file(path.join(logFile.path, '..', file), { name: file })
})
}
+
+ private addBundledCKBLightClientLog() {
+ const logPath = CKBLightRunner.getInstance().logPath
+ if (!fs.existsSync(logPath)) {return}
+ this.archive.file(logPath, { name: 'bundled-ckb-lignt-client.log' })
+ }
}
diff --git a/packages/neuron-wallet/src/controllers/wallets.ts b/packages/neuron-wallet/src/controllers/wallets.ts
index aa31beafc2..4bfa66325e 100644
--- a/packages/neuron-wallet/src/controllers/wallets.ts
+++ b/packages/neuron-wallet/src/controllers/wallets.ts
@@ -8,7 +8,7 @@ import Keychain from 'models/keys/keychain'
import { validateMnemonic, mnemonicToSeedSync } from 'models/keys/mnemonic'
import { AccountExtendedPublicKey, ExtendedPrivateKey, generateMnemonic } from 'models/keys/key'
import CommandSubject from 'models/subjects/command'
-import { ResponseCode } from 'utils/const'
+import { BUNDLED_LIGHT_CKB_URL, ResponseCode } from 'utils/const'
import {
CurrentWalletNotSet,
IsRequired,
@@ -31,6 +31,9 @@ import HardwareWalletService from 'services/hardware'
import { DeviceInfo, ExtendedPublicKey } from 'services/hardware/common'
import AddressParser from 'models/address-parser'
import MultisigConfigModel from 'models/multisig-config'
+import NodeService from 'services/node'
+import { generateRPC } from 'utils/ckb-rpc'
+import { resetSyncTaskQueue } from 'block-sync-renderer'
export default class WalletsController {
public async getAll(): Promise[]>> {
@@ -116,11 +119,13 @@ export default class WalletsController {
)
const walletsService = WalletsService.getInstance()
+ const rpc = generateRPC(NodeService.getInstance().nodeUrl)
const wallet = walletsService.create({
id: '',
name,
extendedKey: accountExtendedPublicKey.serialize(),
- keystore
+ keystore,
+ startBlockNumberInLight: isImporting ? undefined : await rpc.getTipBlockNumber()
})
wallet.checkAndGenerateAddresses(isImporting)
@@ -362,6 +367,10 @@ export default class WalletsController {
if (!currentWallet || id !== currentWallet.id) {
throw new CurrentWalletNotSet()
}
+ const network = NetworksService.getInstance().getCurrent()
+ if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ resetSyncTaskQueue.asyncPush(true)
+ }
return {
status: ResponseCode.Success,
result: currentWallet.toJSON()
diff --git a/packages/neuron-wallet/src/database/chain/entities/multisig-config.ts b/packages/neuron-wallet/src/database/chain/entities/multisig-config.ts
index aa90c8ab30..8b261c85c9 100644
--- a/packages/neuron-wallet/src/database/chain/entities/multisig-config.ts
+++ b/packages/neuron-wallet/src/database/chain/entities/multisig-config.ts
@@ -53,7 +53,7 @@ export default class MultisigConfig {
this.changed('AfterRemove')
}
- private changed = (event: string) => {
+ private changed = (event: 'AfterInsert' | 'AfterRemove') => {
MultisigConfigDbChangedSubject.getSubject().next(event)
}
}
diff --git a/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts b/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts
index 8ac3378e2a..1d6d2d27dc 100644
--- a/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts
+++ b/packages/neuron-wallet/src/database/chain/entities/sync-progress.ts
@@ -2,6 +2,11 @@ import { HexString } from '@ckb-lumos/base'
import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils'
import { Entity, PrimaryColumn, Column } from 'typeorm'
+export enum SyncAddressType {
+ Default,
+ Multisig
+}
+
@Entity({ name: 'sync_progress' })
export default class SyncProgress {
@PrimaryColumn({ type: 'varchar' })
@@ -34,7 +39,15 @@ export default class SyncProgress {
@Column({ type: 'boolean' })
delete: boolean = false
- static fromObject(obj: { script: CKBComponents.Script; scriptType: CKBRPC.ScriptType; walletId: string }) {
+ @Column()
+ addressType: SyncAddressType = SyncAddressType.Default
+
+ static fromObject(obj: {
+ script: CKBComponents.Script
+ scriptType: CKBRPC.ScriptType
+ walletId: string
+ addressType?: SyncAddressType
+ }) {
const res = new SyncProgress()
res.hash = scriptToHash(obj.script)
res.args = obj.script.args
@@ -43,6 +56,7 @@ export default class SyncProgress {
res.walletId = obj.walletId
res.scriptType = obj.scriptType
res.delete = false
+ res.addressType = obj.addressType ?? SyncAddressType.Default
return res
}
}
diff --git a/packages/neuron-wallet/src/database/chain/index.ts b/packages/neuron-wallet/src/database/chain/index.ts
index 9064392c87..5e29bfbffe 100644
--- a/packages/neuron-wallet/src/database/chain/index.ts
+++ b/packages/neuron-wallet/src/database/chain/index.ts
@@ -6,19 +6,18 @@ import TransactionEntity from './entities/transaction'
import SyncInfoEntity from './entities/sync-info'
import IndexerTxHashCache from './entities/indexer-tx-hash-cache'
import MultisigOutput from './entities/multisig-output'
-import SyncProgressService from 'services/sync-progress'
+import SyncProgress from './entities/sync-progress'
/*
* Clean local sqlite storage
*/
export const clean = async () => {
await Promise.all([
- ...[InputEntity, OutputEntity, TransactionEntity, IndexerTxHashCache, MultisigOutput].map(entity => {
+ ...[InputEntity, OutputEntity, TransactionEntity, IndexerTxHashCache, MultisigOutput, SyncProgress].map(entity => {
return getConnection()
.getRepository(entity)
.clear()
- }),
- SyncProgressService.clear()
+ })
])
MultisigOutputChangedSubject.getSubject().next('reset')
diff --git a/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts b/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts
new file mode 100644
index 0000000000..b1732607cd
--- /dev/null
+++ b/packages/neuron-wallet/src/database/chain/migrations/1681360188494-AddTypeSyncProgress.ts
@@ -0,0 +1,31 @@
+import { MigrationInterface, QueryRunner, TableColumn, TableIndex } from "typeorm"
+import Multisig from "models/multisig"
+import { scriptToHash } from "@nervosnetwork/ckb-sdk-utils"
+import { SyncAddressType } from "../entities/sync-progress"
+import MultisigConfig from "../entities/multisig-config"
+
+export class AddTypeSyncProgress1681360188494 implements MigrationInterface {
+ name = 'AddTypeSyncProgress1681360188494'
+
+ public async up(queryRunner: QueryRunner): Promise {
+ await queryRunner.addColumn('sync_progress', new TableColumn({
+ name: 'addressType',
+ type: 'INTEGER',
+ isNullable: false,
+ default: SyncAddressType.Default,
+ }))
+ await queryRunner.createIndex("sync_progress", new TableIndex({ columnNames: ["addressType"] }))
+ const multisigConfigs = await queryRunner.connection
+ .getRepository(MultisigConfig)
+ .createQueryBuilder()
+ .getMany()
+ const scriptHashes = multisigConfigs.map(v => scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n)))
+ await queryRunner.query(`UPDATE sync_progress set addressType=1 where hash in (${scriptHashes.map(v => `'${v}'`).join(',')})`)
+ }
+
+ public async down(queryRunner: QueryRunner): Promise {
+ await queryRunner.dropColumn('sync_progress', 'addressType')
+ await queryRunner.dropIndex("sync_progress", new TableIndex({ columnNames: ["addressType"] }))
+ }
+
+}
diff --git a/packages/neuron-wallet/src/database/chain/ormconfig.ts b/packages/neuron-wallet/src/database/chain/ormconfig.ts
index 53ce7606e8..87f4cc42d2 100644
--- a/packages/neuron-wallet/src/database/chain/ormconfig.ts
+++ b/packages/neuron-wallet/src/database/chain/ormconfig.ts
@@ -17,6 +17,7 @@ import TxDescription from './entities/tx-description'
import AddressDescription from './entities/address-description'
import MultisigConfig from './entities/multisig-config'
import MultisigOuput from './entities/multisig-output'
+import SyncProgress from './entities/sync-progress'
import { InitMigration1566959757554 } from './migrations/1566959757554-InitMigration'
import { AddTypeAndHasData1567144517514 } from './migrations/1567144517514-AddTypeAndHasData'
@@ -49,7 +50,7 @@ import { RemoveDuplicateBlake160s1656930265386 } from './migrations/165693026538
import { UpdateOutputChequeLockHash1652945662504 } from './migrations/1652945662504-UpdateOutputChequeLockHash'
import { RemoveAddressesMultisigConfig1651820157100 } from './migrations/1651820157100-RemoveAddressesMultisigConfig'
import { AddSyncProgress1676441837373 } from './migrations/1676441837373-AddSyncProgress'
-import SyncProgress from './entities/sync-progress'
+import { AddTypeSyncProgress1681360188494 } from './migrations/1681360188494-AddTypeSyncProgress'
export const CONNECTION_NOT_FOUND_NAME = 'ConnectionNotFoundError'
@@ -115,7 +116,8 @@ const connectOptions = async (genesisBlockHash: string): Promise {
MultisigConfigDbChangedSubject.getSubject()
.pipe(debounceTime(500))
- .subscribe(async (event: string) => {
+ .subscribe(async event => {
try {
if (event === 'AfterInsert') {
await MultisigService.saveLiveMultisigOutput()
diff --git a/packages/neuron-wallet/src/models/subjects/multisig-config-db-changed-subject.ts b/packages/neuron-wallet/src/models/subjects/multisig-config-db-changed-subject.ts
index 70dee07b78..fc8358a5e8 100644
--- a/packages/neuron-wallet/src/models/subjects/multisig-config-db-changed-subject.ts
+++ b/packages/neuron-wallet/src/models/subjects/multisig-config-db-changed-subject.ts
@@ -2,7 +2,7 @@ import { ReplaySubject } from 'rxjs'
// subscribe this Subject to monitor any transaction table changes
export class MultisigConfigDbChangedSubject {
- private static subject = new ReplaySubject(100)
+ private static subject = new ReplaySubject<'AfterInsert' | 'AfterRemove'>(100)
public static getSubject() {
return MultisigConfigDbChangedSubject.subject
diff --git a/packages/neuron-wallet/src/services/light-runner.ts b/packages/neuron-wallet/src/services/light-runner.ts
index bcdca0def1..6283aa72ff 100644
--- a/packages/neuron-wallet/src/services/light-runner.ts
+++ b/packages/neuron-wallet/src/services/light-runner.ts
@@ -5,6 +5,7 @@ import { ChildProcess, spawn } from 'child_process'
import logger from 'utils/logger'
import { resetSyncTaskQueue } from 'block-sync-renderer'
import SettingsService from 'services/settings'
+import { clean } from 'database/chain'
const { app } = env
@@ -66,6 +67,7 @@ abstract class NodeRunner {
export class CKBLightRunner extends NodeRunner {
protected networkType: NetworkType = NetworkType.Light
protected binaryName: string = 'ckb-light-client'
+ protected logStream?: fs.WriteStream
static getInstance(): CKBLightRunner {
if (!CKBLightRunner.instance) {
@@ -126,16 +128,28 @@ export class CKBLightRunner extends NodeRunner {
this.initConfig()
const options = ['run', '--config-file', this.configFile]
- const runnerProcess = spawn(this.binary, options, { stdio: ['ignore', 'pipe', 'pipe'] })
+ const runnerProcess = spawn(this.binary, options, {
+ stdio: ['ignore', 'pipe', 'pipe'],
+ env: { RUST_LOG: 'info', ckb_light_client: 'info' }
+ })
this.runnerProcess = runnerProcess
+ if (!this.logStream) {
+ this.logStream = fs.createWriteStream(this.logPath)
+ }
+
runnerProcess.stderr &&
runnerProcess.stderr.on('data', data => {
const dataString: string = data.toString()
logger.error('CKB Light Runner:\trun fail:', dataString)
this.runnerProcess = undefined
+ this.logStream?.write(data)
})
+ runnerProcess.stdout &&
+ runnerProcess.stdout.on('data', data => {
+ this.logStream?.write(data)
+ })
runnerProcess.on('error', error => {
logger.error('CKB Light Runner:\trun fail:', error)
this.runnerProcess = undefined
@@ -147,4 +161,15 @@ export class CKBLightRunner extends NodeRunner {
})
resetSyncTaskQueue.push(true)
}
+
+ get logPath() {
+ return path.join(logger.transports.file.getFile().path, '..', 'light_client_run.log')
+ }
+
+ async clearNodeCache(): Promise {
+ await this.stop()
+ fs.rmSync(SettingsService.getInstance().testnetLightDataPath, { recursive: true, force: true })
+ await clean()
+ await this.start()
+ }
}
diff --git a/packages/neuron-wallet/src/services/monitor/ckb-monitor.ts b/packages/neuron-wallet/src/services/monitor/ckb-monitor.ts
index eb3fccee85..97c931e6bc 100644
--- a/packages/neuron-wallet/src/services/monitor/ckb-monitor.ts
+++ b/packages/neuron-wallet/src/services/monitor/ckb-monitor.ts
@@ -1,4 +1,5 @@
import { stopCkbNode } from 'services/ckb-runner'
+import { CKBLightRunner } from 'services/light-runner'
import NodeService from '../node'
import BaseMonitor from './base'
@@ -13,6 +14,7 @@ export default class CkbMonitor extends BaseMonitor {
async stop(): Promise {
await stopCkbNode()
+ await CKBLightRunner.getInstance().stop()
}
name: string = 'ckb'
diff --git a/packages/neuron-wallet/src/services/multisig.ts b/packages/neuron-wallet/src/services/multisig.ts
index b2a2d73de8..94873dfe0b 100644
--- a/packages/neuron-wallet/src/services/multisig.ts
+++ b/packages/neuron-wallet/src/services/multisig.ts
@@ -9,6 +9,8 @@ import Transaction from 'models/chain/transaction'
import { OutputStatus } from 'models/chain/output'
import NetworksService from './networks'
import Multisig from 'models/multisig'
+import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
+import SyncProgress, { SyncAddressType } from 'database/chain/entities/sync-progress'
const max64Int = '0x' + 'f'.repeat(16)
export default class MultisigService {
@@ -248,14 +250,32 @@ export default class MultisigService {
MultisigOutputChangedSubject.getSubject().next('delete')
}
- static async syncMultisigOutput(lastestBlockNumber: string) {
- try {
- const multisigConfigs = await getConnection()
- .getRepository(MultisigConfig)
+ static async saveMultisigSyncBlockNumber(multisigConfigs: MultisigConfig[], lastestBlockNumber: string) {
+ const network = await NetworksService.getInstance().getCurrent()
+ if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ const multisigScriptHashList = multisigConfigs.map(v =>
+ scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))
+ )
+ const syncBlockNumbers = await getConnection()
+ .getRepository(SyncProgress)
.createQueryBuilder()
+ .where({ hash: In(multisigScriptHashList) })
.getMany()
- await MultisigService.saveLiveMultisigOutput()
- await MultisigService.deleteDeadMultisigOutput(multisigConfigs)
+ const syncBlockNumbersMap: Record = syncBlockNumbers.reduce(
+ (pre, cur) => ({ ...pre, [cur.hash]: cur.blockStartNumber }),
+ {}
+ )
+ await getConnection()
+ .getRepository(MultisigConfig)
+ .save(
+ multisigConfigs.map(v => {
+ const blockNumber =
+ syncBlockNumbersMap[scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))]
+ v.lastestBlockNumber = `0x${BigInt(blockNumber).toString(16)}`
+ return v
+ })
+ )
+ } else {
await getConnection()
.getRepository(MultisigConfig)
.save(
@@ -264,6 +284,19 @@ export default class MultisigService {
lastestBlockNumber
}))
)
+ }
+ }
+
+ static async syncMultisigOutput(lastestBlockNumber: string) {
+ try {
+ const multisigConfigs = await getConnection()
+ .getRepository(MultisigConfig)
+ .createQueryBuilder()
+ .getMany()
+ await MultisigService.saveLiveMultisigOutput()
+ await MultisigService.deleteDeadMultisigOutput(multisigConfigs)
+ await MultisigService.saveMultisigSyncBlockNumber(multisigConfigs, lastestBlockNumber)
+ MultisigOutputChangedSubject.getSubject().next('update')
} catch (error) {
// ignore error, if lastestBlockNumber not update, it will try next time
}
@@ -299,4 +332,17 @@ export default class MultisigService {
.execute()
MultisigOutputChangedSubject.getSubject().next('update')
}
+
+ static async getMultisigConfigForLight() {
+ const multisigConfigs = await getConnection()
+ .getRepository(MultisigConfig)
+ .createQueryBuilder()
+ .getMany()
+ return multisigConfigs.map(v => ({
+ walletId: v.walletId,
+ script: Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n),
+ addressType: SyncAddressType.Multisig,
+ scriptType: 'lock' as CKBRPC.ScriptType
+ }))
+ }
}
diff --git a/packages/neuron-wallet/src/services/sync-progress.ts b/packages/neuron-wallet/src/services/sync-progress.ts
index 95573f28f5..31d839de37 100644
--- a/packages/neuron-wallet/src/services/sync-progress.ts
+++ b/packages/neuron-wallet/src/services/sync-progress.ts
@@ -1,11 +1,17 @@
import { getConnection, In, Not } from 'typeorm'
-import SyncProgress from 'database/chain/entities/sync-progress'
+import SyncProgress, { SyncAddressType } from 'database/chain/entities/sync-progress'
import { scriptToHash } from '@nervosnetwork/ckb-sdk-utils'
import { HexString } from '@ckb-lumos/base'
+import WalletService from './wallets'
export default class SyncProgressService {
static async resetSyncProgress(
- params: { script: CKBComponents.Script; scriptType: CKBRPC.ScriptType; walletId: string }[]
+ params: {
+ script: CKBComponents.Script
+ scriptType: CKBRPC.ScriptType
+ walletId: string
+ addressType?: SyncAddressType
+ }[]
) {
await getConnection()
.getRepository(SyncProgress)
@@ -25,6 +31,15 @@ export default class SyncProgressService {
.execute()
}
+ static async removeByHashesAndAddressType(addressType: SyncAddressType, existHashes?: string[]) {
+ await getConnection()
+ .createQueryBuilder()
+ .update(SyncProgress)
+ .set({ delete: true })
+ .where({ ...(existHashes?.length ? { hash: Not(In(existHashes)) } : {}), addressType })
+ .execute()
+ }
+
static async updateBlockNumber(blake160s: string[], blockNumber: number) {
await getConnection()
.createQueryBuilder()
@@ -64,20 +79,33 @@ export default class SyncProgressService {
await getConnection().manager.update(SyncProgress, { hash }, { blockStartNumber, blockEndNumber, cursor })
}
- static async getMinBlockNumber() {
+ static async getCurrentWalletMinBlockNumber() {
+ const currentWallet = WalletService.getInstance().getCurrent()
const item = await getConnection()
.getRepository(SyncProgress)
.createQueryBuilder()
+ .where({ delete: false, ...(currentWallet ? { walletId: currentWallet.id } : {}) })
.orderBy('blockEndNumber', 'ASC')
.getOne()
return item?.blockEndNumber || 0
}
- static async clear() {
- await getConnection()
+ static async getWalletMinBlockNumber() {
+ const items = await getConnection()
+ .getRepository(SyncProgress)
.createQueryBuilder()
- .update(SyncProgress)
- .set({ blockStartNumber: 0, blockEndNumber: 0 })
- .execute()
+ .select('MIN(blockStartNumber) as blockStartNumber, walletId')
+ .where({ addressType: SyncAddressType.Default })
+ .groupBy('walletId')
+ .getMany()
+ return items.reduce>((pre, cur) => ({ ...pre, [cur.walletId]: cur.blockStartNumber }), {})
+ }
+
+ static async getSyncProgressByHashes(hashes: string[]) {
+ return await getConnection()
+ .getRepository(SyncProgress)
+ .createQueryBuilder()
+ .where({ hash: In(hashes) })
+ .getMany()
}
}
diff --git a/packages/neuron-wallet/src/services/wallets.ts b/packages/neuron-wallet/src/services/wallets.ts
index 1fa67d0362..00aa64e20c 100644
--- a/packages/neuron-wallet/src/services/wallets.ts
+++ b/packages/neuron-wallet/src/services/wallets.ts
@@ -24,6 +24,7 @@ export interface WalletProperties {
isHDWallet?: boolean
device?: DeviceInfo
keystore?: Keystore
+ startBlockNumberInLight?: string
}
export abstract class Wallet {
@@ -32,9 +33,10 @@ export abstract class Wallet {
public device?: DeviceInfo
protected extendedKey: string = ''
protected isHD: boolean
+ protected startBlockNumberInLight?: string
constructor(props: WalletProperties) {
- const { id, name, extendedKey, device, isHDWallet } = props
+ const { id, name, extendedKey, device, isHDWallet, startBlockNumberInLight } = props
if (id === undefined) {
throw new IsRequired('ID')
@@ -52,6 +54,7 @@ export abstract class Wallet {
this.extendedKey = extendedKey
this.device = device
this.isHD = isHDWallet ?? true
+ this.startBlockNumberInLight = startBlockNumberInLight
}
public toJSON = () => ({
@@ -138,7 +141,8 @@ export class FileKeystoreWallet extends Wallet {
name: this.name,
extendedKey: this.extendedKey,
device: this.device,
- isHD: this.isHD
+ isHD: this.isHD,
+ startBlockNumberInLight: this.startBlockNumberInLight
}
}
diff --git a/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts b/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts
index f693277c90..e4ab7fe851 100644
--- a/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts
+++ b/packages/neuron-wallet/tests/block-sync-renderer/light-connector.test.ts
@@ -5,11 +5,13 @@ import HexUtils from '../../src/utils/hex'
import AddressMeta from '../../src/database/address/meta'
const getSyncStatusMock = jest.fn()
-const getMinBlockNumberMock = jest.fn()
+const getCurrentWalletMinBlockNumberMock = jest.fn()
const getAllSyncStatusToMapMock = jest.fn()
const resetSyncProgressMock = jest.fn()
const updateSyncStatusMock = jest.fn()
const removeWalletsByExistsMock = jest.fn()
+const getWalletMinBlockNumberMock = jest.fn()
+const removeByHashesAndAddressType = jest.fn()
const setScriptsMock = jest.fn()
const getScriptsMock = jest.fn()
@@ -17,13 +19,17 @@ const getTipHeaderMock = jest.fn()
const getTransactionsMock = jest.fn()
const schedulerWaitMock = jest.fn()
+const getMultisigConfigForLightMock = jest.fn()
+const walletGetCurrentMock = jest.fn()
+const walletGetAllMock = jest.fn()
function mockReset() {
getSyncStatusMock.mockReset()
- getMinBlockNumberMock.mockReset()
+ getCurrentWalletMinBlockNumberMock.mockReset()
getAllSyncStatusToMapMock.mockReset()
resetSyncProgressMock.mockReset()
updateSyncStatusMock.mockReset()
+ getWalletMinBlockNumberMock.mockReset()
setScriptsMock.mockReset()
getScriptsMock.mockReset()
@@ -31,16 +37,22 @@ function mockReset() {
getTransactionsMock.mockReset()
schedulerWaitMock.mockReset()
+ getMultisigConfigForLightMock.mockReset()
+ removeByHashesAndAddressType.mockReset()
+ walletGetCurrentMock.mockReset()
+ walletGetAllMock.mockReset()
}
jest.mock('../../src/services/sync-progress', () => {
return class {
static getSyncStatus: any = () => getSyncStatusMock()
- static getMinBlockNumber: any = () => getMinBlockNumberMock()
+ static getCurrentWalletMinBlockNumber: any = () => getCurrentWalletMinBlockNumberMock()
static getAllSyncStatusToMap: any = () => getAllSyncStatusToMapMock()
static resetSyncProgress: any = (arg: any) => resetSyncProgressMock(arg)
static updateSyncStatus: any = (hash: string, update: any) => updateSyncStatusMock(hash, update)
static removeWalletsByExists: any = (walletIds: string[]) => removeWalletsByExistsMock(walletIds)
+ static getWalletMinBlockNumber: any = () => getWalletMinBlockNumberMock()
+ static removeByHashesAndAddressType: any = (type: number, scripts: CKBComponents.Script[]) => removeByHashesAndAddressType(type, scripts)
}
})
@@ -55,6 +67,19 @@ jest.mock('../../src/utils/ckb-rpc', () => ({
}
}))
+jest.mock('../../src/services/multisig', () => ({
+ getMultisigConfigForLight: () => getMultisigConfigForLightMock()
+}))
+
+jest.mock('../../src/services/wallets', () => ({
+ getInstance() {
+ return {
+ getCurrent: walletGetCurrentMock,
+ getAll: walletGetAllMock,
+ }
+ }
+}))
+
jest.mock('timers/promises', () => ({
scheduler: {
wait: (delay: number) => schedulerWaitMock(delay),
@@ -70,6 +95,9 @@ const scriptHash = scriptToHash(script)
const address = 'ckt1qzda0cr08m85hc8jlnfp3zer7xulejywt49kt2rr0vthywaa50xwsq2q8ux5aqem92xnwfmj5cl6e233phlwlysqhjx5w'
describe('test light connector', () => {
+ beforeEach(() => {
+ walletGetAllMock.mockReturnValue([])
+ })
afterEach(() => {
mockReset()
})
@@ -207,7 +235,7 @@ describe('test light connector', () => {
describe('test subscribeSync', () => {
it('run success', async () => {
- getMinBlockNumberMock.mockResolvedValue(100)
+ getCurrentWalletMinBlockNumberMock.mockResolvedValue(100)
getTipHeaderMock.mockResolvedValue({ number: '0xaa' })
const connector = new LightConnector([], '')
// @ts-ignore: private-method
@@ -229,6 +257,16 @@ describe('test light connector', () => {
await connect.initSyncProgress()
expect(getScriptsMock).toBeCalledTimes(0)
})
+ it('append multisig script', async () => {
+ getScriptsMock.mockResolvedValue([])
+ const connect = new LightConnector([], '')
+ //@ts-ignore
+ await connect.initSyncProgress([{ walletId: 'walletId', script, addressType: 1, scriptType: 'lock' }])
+ expect(getScriptsMock).toBeCalledTimes(1)
+ expect(setScriptsMock).toBeCalledWith([
+ { script, scriptType: 'lock', walletId: 'walletId', blockNumber: '0x0', addressType: 1, },
+ ])
+ })
it('there is not exist sync scripts with light client', async () => {
getScriptsMock.mockResolvedValue([{ script, blockNumber: '0xaa' }])
const addressMeta = AddressMeta.fromObject({ walletId: 'walletId', address, path: '', addressIndex: 10, addressType: 0, blake160: script.args })
@@ -247,6 +285,33 @@ describe('test light connector', () => {
])
expect(removeWalletsByExistsMock).toBeCalledWith(['walletId'])
})
+ it('set new script with the synced min block number', async () => {
+ getScriptsMock.mockResolvedValue([])
+ const addressMeta = AddressMeta.fromObject({ walletId: 'walletId', address, path: '', addressIndex: 10, addressType: 0, blake160: script.args })
+ getWalletMinBlockNumberMock.mockResolvedValue({ 'walletId': 170})
+ const connect = new LightConnector([addressMeta], '')
+ //@ts-ignore
+ await connect.initSyncProgress()
+ expect(setScriptsMock).toBeCalledWith([
+ { script: addressMeta.generateDefaultLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ { script: addressMeta.generateACPLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ { script: addressMeta.generateLegacyACPLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ ])
+ })
+ it('set new script with start block number in wallet', async () => {
+ getScriptsMock.mockResolvedValue([])
+ const addressMeta = AddressMeta.fromObject({ walletId: 'walletId', address, path: '', addressIndex: 10, addressType: 0, blake160: script.args })
+ getWalletMinBlockNumberMock.mockResolvedValue({})
+ walletGetAllMock.mockReturnValue([{ id: 'walletId', startBlockNumberInLight: '0xaa' }])
+ const connect = new LightConnector([addressMeta], '')
+ //@ts-ignore
+ await connect.initSyncProgress()
+ expect(setScriptsMock).toBeCalledWith([
+ { script: addressMeta.generateDefaultLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ { script: addressMeta.generateACPLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ { script: addressMeta.generateLegacyACPLockScript().toSDK(), scriptType: 'lock', walletId: 'walletId', blockNumber: '0xaa' },
+ ])
+ })
})
describe('test initSync', () => {
diff --git a/packages/neuron-wallet/tests/controllers/export-debug.test.ts b/packages/neuron-wallet/tests/controllers/export-debug.test.ts
index 9ab2b6b6d6..585a347659 100644
--- a/packages/neuron-wallet/tests/controllers/export-debug.test.ts
+++ b/packages/neuron-wallet/tests/controllers/export-debug.test.ts
@@ -73,6 +73,18 @@ jest.mock('../../src/services/settings', () => {
}
})
+jest.mock('../../src/services/light-runner', () => {
+ return {
+ CKBLightRunner: {
+ getInstance() {
+ return {
+ logPath: ''
+ }
+ }
+ }
+ }
+})
+
import { dialog } from 'electron'
import logger from '../../src/utils/logger'
import ExportDebugController from '../../src/controllers/export-debug'
@@ -86,6 +98,7 @@ describe('Test ExportDebugController', () => {
let showErrorBoxMock: any
// controller methods
let addBundledCKBLogMock: any
+ let addBundledCKBLightClientLogMock: any
let addLogFilesMock: any
let addStatusFileMock: any
let archiveAppendMock: any
@@ -95,10 +108,11 @@ describe('Test ExportDebugController', () => {
showMessageBoxMock = jest.spyOn(dialog, 'showMessageBox')
showErrorBoxMock = jest.spyOn(dialog, 'showErrorBox')
addBundledCKBLogMock = jest.spyOn(exportDebugController, 'addBundledCKBLog')
+ addBundledCKBLightClientLogMock = jest.spyOn(exportDebugController, 'addBundledCKBLightClientLog')
addLogFilesMock = jest.spyOn(exportDebugController, 'addLogFiles')
addStatusFileMock = jest.spyOn(exportDebugController, 'addStatusFile')
archiveAppendMock = jest.spyOn(exportDebugController.archive, 'append')
- jest.spyOn(exportDebugController.archive, 'file')
+ jest.spyOn(exportDebugController.archive, 'file').mockReturnValue(undefined)
jest.spyOn(exportDebugController.archive, 'pipe').mockImplementation(() => {})
jest.spyOn(logger, 'error')
})
@@ -118,10 +132,11 @@ describe('Test ExportDebugController', () => {
})
it('should call required methods', () => {
- expect.assertions(8)
+ expect.assertions(9)
expect(showSaveDialogMock).toHaveBeenCalled()
expect(addBundledCKBLogMock).toHaveBeenCalled()
+ expect(addBundledCKBLightClientLogMock).toHaveBeenCalled()
expect(addLogFilesMock).toHaveBeenCalled()
expect(addStatusFileMock).toHaveBeenCalled()
@@ -141,11 +156,12 @@ describe('Test ExportDebugController', () => {
})
it('should not call required methods', () => {
- expect.assertions(8)
+ expect.assertions(9)
expect(showSaveDialogMock).toHaveBeenCalled()
expect(addBundledCKBLogMock).not.toHaveBeenCalled()
+ expect(addBundledCKBLightClientLogMock).not.toHaveBeenCalled()
expect(addLogFilesMock).not.toHaveBeenCalled()
expect(addStatusFileMock).not.toHaveBeenCalled()
expect(archiveAppendMock).not.toHaveBeenCalled()
diff --git a/packages/neuron-wallet/tests/services/light-runner.test.ts b/packages/neuron-wallet/tests/services/light-runner.test.ts
index 20fe748070..f316f6ccc0 100644
--- a/packages/neuron-wallet/tests/services/light-runner.test.ts
+++ b/packages/neuron-wallet/tests/services/light-runner.test.ts
@@ -15,9 +15,11 @@ const existsSyncMock = jest.fn()
const readFileSyncMock = jest.fn()
const mkdirSyncMock = jest.fn()
const writeFileSyncMock = jest.fn()
+const createWriteStreamMock = jest.fn()
const spawnMock = jest.fn()
const loggerErrorMock = jest.fn()
const loggerInfoMock = jest.fn()
+const transportsGetFileMock = jest.fn()
function resetMock() {
mockFn.mockReset()
@@ -33,9 +35,11 @@ function resetMock() {
readFileSyncMock.mockReset()
mkdirSyncMock.mockReset()
writeFileSyncMock.mockReset()
+ createWriteStreamMock.mockReset()
spawnMock.mockReset()
loggerErrorMock.mockReset()
loggerInfoMock.mockReset()
+ transportsGetFileMock.mockReset()
}
jest.doMock('../../src/env', () => ({
@@ -50,6 +54,11 @@ jest.doMock('../../src/env', () => ({
jest.doMock('../../src/utils/logger', () => ({
info: loggerInfoMock,
error: loggerErrorMock,
+ transports: {
+ file: {
+ getFile: transportsGetFileMock
+ }
+ }
}))
jest.doMock('../../src/block-sync-renderer', () => ({
@@ -83,6 +92,7 @@ jest.doMock('fs', () => ({
readFileSync: readFileSyncMock,
mkdirSync: mkdirSyncMock,
writeFileSync: writeFileSyncMock,
+ createWriteStream: createWriteStreamMock
}))
jest.doMock('child_process', () => ({
@@ -92,6 +102,10 @@ jest.doMock('child_process', () => ({
const { CKBLightRunner } = require('../../src/services/light-runner')
describe('test light runner', () => {
+ beforeEach(() => {
+ transportsGetFileMock.mockReturnValue({ path: ''})
+ createWriteStreamMock.mockReturnValue({ write() {} })
+ })
afterEach(() => {
resetMock()
})
From 5eca1354f0f2df460f263a73e4031d4ed2225105 Mon Sep 17 00:00:00 2001
From: yanguoyu <841185308@qq.com>
Date: Thu, 13 Apr 2023 18:28:12 +0800
Subject: [PATCH 2/4] fix: We cannot direct set process null when stderr,
because it's output with error information, but process is not closed.
---
packages/neuron-wallet/src/services/ckb-runner.ts | 1 -
packages/neuron-wallet/src/services/light-runner.ts | 1 -
packages/neuron-wallet/tests/services/light-runner.test.ts | 2 +-
3 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/packages/neuron-wallet/src/services/ckb-runner.ts b/packages/neuron-wallet/src/services/ckb-runner.ts
index 20c24d05df..8b2c8fbc51 100644
--- a/packages/neuron-wallet/src/services/ckb-runner.ts
+++ b/packages/neuron-wallet/src/services/ckb-runner.ts
@@ -92,7 +92,6 @@ export const startCkbNode = async () => {
ckb.stderr.on('data', data => {
const dataString: string = data.toString()
logger.error('CKB:\trun fail:', dataString)
- ckb = null
if (dataString.includes('CKB wants to migrate the data into new format')) {
MigrateSubject.next({ type: 'need-migrate' })
}
diff --git a/packages/neuron-wallet/src/services/light-runner.ts b/packages/neuron-wallet/src/services/light-runner.ts
index 6283aa72ff..06f04fc59f 100644
--- a/packages/neuron-wallet/src/services/light-runner.ts
+++ b/packages/neuron-wallet/src/services/light-runner.ts
@@ -142,7 +142,6 @@ export class CKBLightRunner extends NodeRunner {
runnerProcess.stderr.on('data', data => {
const dataString: string = data.toString()
logger.error('CKB Light Runner:\trun fail:', dataString)
- this.runnerProcess = undefined
this.logStream?.write(data)
})
diff --git a/packages/neuron-wallet/tests/services/light-runner.test.ts b/packages/neuron-wallet/tests/services/light-runner.test.ts
index f316f6ccc0..9c9b8690dd 100644
--- a/packages/neuron-wallet/tests/services/light-runner.test.ts
+++ b/packages/neuron-wallet/tests/services/light-runner.test.ts
@@ -274,7 +274,7 @@ describe('test light runner', () => {
expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
eventEmitter.stderr.emit('data', 'error-data')
expect(loggerErrorMock).toBeCalledWith('CKB Light Runner:\trun fail:', 'error-data')
- expect(CKBLightRunner.getInstance().runnerProcess).toBeUndefined()
+ expect(CKBLightRunner.getInstance().runnerProcess).toBeDefined()
})
})
From 9762abc534c7b50d15a354c16e5b3d6930fb8f31 Mon Sep 17 00:00:00 2001
From: yanguoyu <841185308@qq.com>
Date: Sun, 16 Apr 2023 12:49:06 +0800
Subject: [PATCH 3/4] fix: Change localhost to 127.0.0.1 and use type to judge
light client.
---
.../neuron-ui/src/components/DataSetting/index.tsx | 4 ++--
.../src/components/MultisigAddress/index.tsx | 4 ++--
packages/neuron-ui/src/types/App/index.d.ts | 2 +-
packages/neuron-ui/src/utils/const.ts | 2 +-
.../neuron-wallet/src/block-sync-renderer/task.ts | 2 +-
packages/neuron-wallet/src/controllers/app/menu.ts | 11 ++++++-----
packages/neuron-wallet/src/controllers/wallets.ts | 5 +++--
packages/neuron-wallet/src/services/light-runner.ts | 3 ---
packages/neuron-wallet/src/services/multisig.ts | 4 ++--
packages/neuron-wallet/src/utils/const.ts | 2 +-
10 files changed, 19 insertions(+), 20 deletions(-)
diff --git a/packages/neuron-ui/src/components/DataSetting/index.tsx b/packages/neuron-ui/src/components/DataSetting/index.tsx
index 7b80a52ee7..82af58b639 100644
--- a/packages/neuron-ui/src/components/DataSetting/index.tsx
+++ b/packages/neuron-ui/src/components/DataSetting/index.tsx
@@ -8,7 +8,7 @@ import CopyZone from 'widgets/CopyZone'
import { OpenFolder, InfoCircleOutlined } from 'widgets/Icons/icon'
import { shell } from 'electron'
import Spinner from 'widgets/Spinner'
-import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
+import { LIGHT_NETWORK_TYPE } from 'utils/const'
import { useDataPath } from './hooks'
import styles from './index.module.scss'
@@ -92,7 +92,7 @@ const DataSetting = () => {
chain: { networkID },
settings: { networks = [] },
} = useGlobalState()
- const isLightClient = useMemo(() => networks.find(n => n.id === networkID)?.remote === BUNDLED_LIGHT_CKB_URL, [
+ const isLightClient = useMemo(() => networks.find(n => n.id === networkID)?.type === LIGHT_NETWORK_TYPE, [
networkID,
networks,
])
diff --git a/packages/neuron-ui/src/components/MultisigAddress/index.tsx b/packages/neuron-ui/src/components/MultisigAddress/index.tsx
index 54b8aab62a..65eced4cc8 100644
--- a/packages/neuron-ui/src/components/MultisigAddress/index.tsx
+++ b/packages/neuron-ui/src/components/MultisigAddress/index.tsx
@@ -20,7 +20,7 @@ import { EditTextField } from 'widgets/TextField'
import { MultisigConfig } from 'services/remote'
import PasswordRequest from 'components/PasswordRequest'
import ApproveMultisigTx from 'components/ApproveMultisigTx'
-import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
+import { LIGHT_NETWORK_TYPE } from 'utils/const'
import { useSearch, useConfigManage, useExportConfig, useActions, useSubscription } from './hooks'
import styles from './multisigAddress.module.scss'
@@ -53,7 +53,7 @@ const MultisigAddress = () => {
// eslint-disable-next-line
}, [i18n.language])
const isMainnet = isMainnetUtil(networks, networkID)
- const isLightClient = useMemo(() => networks.find(n => n.id === networkID)?.remote === BUNDLED_LIGHT_CKB_URL, [
+ const isLightClient = useMemo(() => networks.find(n => n.id === networkID)?.type === LIGHT_NETWORK_TYPE, [
networks,
networkID,
])
diff --git a/packages/neuron-ui/src/types/App/index.d.ts b/packages/neuron-ui/src/types/App/index.d.ts
index 9994a955ea..8634ad377e 100644
--- a/packages/neuron-ui/src/types/App/index.d.ts
+++ b/packages/neuron-ui/src/types/App/index.d.ts
@@ -146,7 +146,7 @@ declare namespace State {
name: string
remote: string
chain: 'ckb' | 'ckb_testnet' | 'ckb_dev' | string
- type: 0 | 1
+ type: 0 | 1 | 2
}
interface Network extends NetworkProperty {
diff --git a/packages/neuron-ui/src/utils/const.ts b/packages/neuron-ui/src/utils/const.ts
index 8713b14b47..99a29d2846 100644
--- a/packages/neuron-ui/src/utils/const.ts
+++ b/packages/neuron-ui/src/utils/const.ts
@@ -65,4 +65,4 @@ export const DEPRECATED_CODE_HASH: Record = {
}
export const LIGHT_CLIENT_TESTNET = 'light_client_testnet'
-export const BUNDLED_LIGHT_CKB_URL = 'http://localhost:9000'
+export const LIGHT_NETWORK_TYPE = 2
diff --git a/packages/neuron-wallet/src/block-sync-renderer/task.ts b/packages/neuron-wallet/src/block-sync-renderer/task.ts
index de1a97b63c..309b62e39f 100644
--- a/packages/neuron-wallet/src/block-sync-renderer/task.ts
+++ b/packages/neuron-wallet/src/block-sync-renderer/task.ts
@@ -75,7 +75,7 @@ export const listener = async ({ type, id, channel, message }: WorkerMessage) =>
break
}
case 'append_scripts': {
- if (message && Array.isArray(message)) {
+ if (Array.isArray(message)) {
await syncQueue?.appendLightScript(message)
}
break
diff --git a/packages/neuron-wallet/src/controllers/app/menu.ts b/packages/neuron-wallet/src/controllers/app/menu.ts
index 408ccc15d0..6c83e50f5f 100644
--- a/packages/neuron-wallet/src/controllers/app/menu.ts
+++ b/packages/neuron-wallet/src/controllers/app/menu.ts
@@ -12,11 +12,12 @@ import WalletsService from 'services/wallets'
import OfflineSignService from 'services/offline-sign'
import CommandSubject from 'models/subjects/command'
import logger from 'utils/logger'
-import { BUNDLED_LIGHT_CKB_URL, SETTINGS_WINDOW_TITLE, SETTINGS_WINDOW_WIDTH } from 'utils/const'
+import { SETTINGS_WINDOW_TITLE, SETTINGS_WINDOW_WIDTH } from 'utils/const'
import { OfflineSignJSON } from 'models/offline-sign'
import NetworksService from 'services/networks'
import { clearCkbNodeCache } from 'services/ckb-runner'
import { CKBLightRunner } from 'services/light-runner'
+import { NetworkType } from 'models/network'
enum URL {
Settings = '/settings/general',
@@ -318,8 +319,8 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
t(`messageBox.multisig-address.title`),
{
width: 1000,
- maxWidth: 900,
- minWidth: 900,
+ maxWidth: 1000,
+ minWidth: 1000,
resizable: true
},
['multisig-output-update']
@@ -328,7 +329,7 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
},
{
label: t('application-menu.tools.clear-sync-data'),
- enabled: hasCurrentWallet && (network.chain === 'ckb' || BUNDLED_LIGHT_CKB_URL === network.remote),
+ enabled: hasCurrentWallet && (network.chain === 'ckb' || NetworkType.Light === network.type),
click: async () => {
const res = await dialog.showMessageBox({
type: 'warning',
@@ -340,7 +341,7 @@ const updateApplicationMenu = (mainWindow: BrowserWindow | null) => {
})
if (res.response === 0) {
const network = new NetworksService().getCurrent()
- if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ if (network.type === NetworkType.Light) {
await CKBLightRunner.getInstance().clearNodeCache()
} else {
await clearCkbNodeCache()
diff --git a/packages/neuron-wallet/src/controllers/wallets.ts b/packages/neuron-wallet/src/controllers/wallets.ts
index 4bfa66325e..c2cbe6b251 100644
--- a/packages/neuron-wallet/src/controllers/wallets.ts
+++ b/packages/neuron-wallet/src/controllers/wallets.ts
@@ -8,7 +8,7 @@ import Keychain from 'models/keys/keychain'
import { validateMnemonic, mnemonicToSeedSync } from 'models/keys/mnemonic'
import { AccountExtendedPublicKey, ExtendedPrivateKey, generateMnemonic } from 'models/keys/key'
import CommandSubject from 'models/subjects/command'
-import { BUNDLED_LIGHT_CKB_URL, ResponseCode } from 'utils/const'
+import { ResponseCode } from 'utils/const'
import {
CurrentWalletNotSet,
IsRequired,
@@ -34,6 +34,7 @@ import MultisigConfigModel from 'models/multisig-config'
import NodeService from 'services/node'
import { generateRPC } from 'utils/ckb-rpc'
import { resetSyncTaskQueue } from 'block-sync-renderer'
+import { NetworkType } from 'models/network'
export default class WalletsController {
public async getAll(): Promise[]>> {
@@ -368,7 +369,7 @@ export default class WalletsController {
throw new CurrentWalletNotSet()
}
const network = NetworksService.getInstance().getCurrent()
- if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ if (network.type === NetworkType.Light) {
resetSyncTaskQueue.asyncPush(true)
}
return {
diff --git a/packages/neuron-wallet/src/services/light-runner.ts b/packages/neuron-wallet/src/services/light-runner.ts
index 06f04fc59f..f15379b531 100644
--- a/packages/neuron-wallet/src/services/light-runner.ts
+++ b/packages/neuron-wallet/src/services/light-runner.ts
@@ -3,7 +3,6 @@ import path from 'path'
import fs from 'fs'
import { ChildProcess, spawn } from 'child_process'
import logger from 'utils/logger'
-import { resetSyncTaskQueue } from 'block-sync-renderer'
import SettingsService from 'services/settings'
import { clean } from 'database/chain'
@@ -51,7 +50,6 @@ abstract class NodeRunner {
async stop() {
return new Promise(resolve => {
- resetSyncTaskQueue.push(false)
if (this.runnerProcess) {
logger.info('Runner:\tkilling node')
this.runnerProcess.once('close', () => resolve())
@@ -158,7 +156,6 @@ export class CKBLightRunner extends NodeRunner {
logger.info('CKB Light Runner:\tprocess closed')
this.runnerProcess = undefined
})
- resetSyncTaskQueue.push(true)
}
get logPath() {
diff --git a/packages/neuron-wallet/src/services/multisig.ts b/packages/neuron-wallet/src/services/multisig.ts
index 94873dfe0b..89012ff0ea 100644
--- a/packages/neuron-wallet/src/services/multisig.ts
+++ b/packages/neuron-wallet/src/services/multisig.ts
@@ -9,8 +9,8 @@ import Transaction from 'models/chain/transaction'
import { OutputStatus } from 'models/chain/output'
import NetworksService from './networks'
import Multisig from 'models/multisig'
-import { BUNDLED_LIGHT_CKB_URL } from 'utils/const'
import SyncProgress, { SyncAddressType } from 'database/chain/entities/sync-progress'
+import { NetworkType } from 'models/network'
const max64Int = '0x' + 'f'.repeat(16)
export default class MultisigService {
@@ -252,7 +252,7 @@ export default class MultisigService {
static async saveMultisigSyncBlockNumber(multisigConfigs: MultisigConfig[], lastestBlockNumber: string) {
const network = await NetworksService.getInstance().getCurrent()
- if (network.remote === BUNDLED_LIGHT_CKB_URL) {
+ if (network.type === NetworkType.Light) {
const multisigScriptHashList = multisigConfigs.map(v =>
scriptToHash(Multisig.getMultisigScript(v.blake160s, v.r, v.m, v.n))
)
diff --git a/packages/neuron-wallet/src/utils/const.ts b/packages/neuron-wallet/src/utils/const.ts
index 373c97f245..238a2393f1 100644
--- a/packages/neuron-wallet/src/utils/const.ts
+++ b/packages/neuron-wallet/src/utils/const.ts
@@ -1,7 +1,7 @@
export const MIN_PASSWORD_LENGTH = 8
export const MAX_PASSWORD_LENGTH = 50
export const BUNDLED_CKB_URL = 'http://localhost:8114'
-export const BUNDLED_LIGHT_CKB_URL = 'http://localhost:9000'
+export const BUNDLED_LIGHT_CKB_URL = 'http://127.0.0.1:9000'
export const LIGHT_CLIENT_TESTNET = 'light_client_testnet'
export const SETTINGS_WINDOW_TITLE = process.platform === 'darwin' ? 'settings.title.mac' : 'settings.title.normal'
export const SETTINGS_WINDOW_WIDTH = 900
From 89b53e5226e2e28b0e80f4bae98bdb1ec08eee1a Mon Sep 17 00:00:00 2001
From: yanguoyu <841185308@qq.com>
Date: Sun, 16 Apr 2023 14:33:21 +0800
Subject: [PATCH 4/4] fix: Fix test case
---
.../tests/services/light-runner.test.ts | 14 --------------
1 file changed, 14 deletions(-)
diff --git a/packages/neuron-wallet/tests/services/light-runner.test.ts b/packages/neuron-wallet/tests/services/light-runner.test.ts
index 9c9b8690dd..9f8c886ae7 100644
--- a/packages/neuron-wallet/tests/services/light-runner.test.ts
+++ b/packages/neuron-wallet/tests/services/light-runner.test.ts
@@ -9,7 +9,6 @@ const platformMock = jest.fn()
const joinMock = jest.fn()
const dirnameMock = jest.fn()
const resolveMock = jest.fn()
-const resetSyncTaskQueueMock = jest.fn()
const lightDataPathMock = jest.fn()
const existsSyncMock = jest.fn()
const readFileSyncMock = jest.fn()
@@ -29,7 +28,6 @@ function resetMock() {
joinMock.mockReset()
dirnameMock.mockReset()
resolveMock.mockReset()
- resetSyncTaskQueueMock.mockReset()
lightDataPathMock.mockReset()
existsSyncMock.mockReset()
readFileSyncMock.mockReset()
@@ -61,12 +59,6 @@ jest.doMock('../../src/utils/logger', () => ({
}
}))
-jest.doMock('../../src/block-sync-renderer', () => ({
- resetSyncTaskQueue: {
- push: resetSyncTaskQueueMock
- }
-}))
-
jest.doMock('../../src/services/settings', () => ({
getInstance() {
return {
@@ -221,7 +213,6 @@ describe('test light runner', () => {
existsSyncMock.mockReturnValue(true)
await CKBLightRunner.getInstance().start()
expect(mockFn).toBeCalledTimes(1)
- expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
CKBLightRunner.getInstance().stop = tmp
})
it('when runnerProcess is undefined', async () => {
@@ -233,7 +224,6 @@ describe('test light runner', () => {
existsSyncMock.mockReturnValue(true)
await CKBLightRunner.getInstance().start()
expect(mockFn).toBeCalledTimes(0)
- expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
CKBLightRunner.getInstance().stop = tmp
})
it('when runnerProcess is undefined and on error', async () => {
@@ -244,7 +234,6 @@ describe('test light runner', () => {
await CKBLightRunner.getInstance().start()
expect(CKBLightRunner.getInstance().runnerProcess).toBeDefined()
expect(mockFn).toBeCalledTimes(0)
- expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
eventEmitter.emit('error', 'errorInfo')
expect(loggerErrorMock).toBeCalledWith('CKB Light Runner:\trun fail:', 'errorInfo')
expect(CKBLightRunner.getInstance().runnerProcess).toBeUndefined()
@@ -257,7 +246,6 @@ describe('test light runner', () => {
await CKBLightRunner.getInstance().start()
expect(CKBLightRunner.getInstance().runnerProcess).toBeDefined()
expect(mockFn).toBeCalledTimes(0)
- expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
eventEmitter.emit('close', 'closeInfo')
expect(loggerInfoMock).toBeCalledWith('CKB Light Runner:\tprocess closed')
expect(CKBLightRunner.getInstance().runnerProcess).toBeUndefined()
@@ -271,7 +259,6 @@ describe('test light runner', () => {
await CKBLightRunner.getInstance().start()
expect(CKBLightRunner.getInstance().runnerProcess).toBeDefined()
expect(mockFn).toBeCalledTimes(0)
- expect(resetSyncTaskQueueMock).toHaveBeenLastCalledWith(true)
eventEmitter.stderr.emit('data', 'error-data')
expect(loggerErrorMock).toBeCalledWith('CKB Light Runner:\trun fail:', 'error-data')
expect(CKBLightRunner.getInstance().runnerProcess).toBeDefined()
@@ -282,7 +269,6 @@ describe('test light runner', () => {
it('runnerProcess is undefined', async () => {
CKBLightRunner.getInstance().runnerProcess = undefined
await CKBLightRunner.getInstance().stop()
- expect(resetSyncTaskQueueMock).toBeCalledWith(false)
})
it('runnerProcess is defined', async () => {
const emitter: EventEmitter & { kill?: Function } = new EventEmitter()
|