diff --git a/packages/neuron-wallet/src/block-sync-renderer/sync/light-synchronizer.ts b/packages/neuron-wallet/src/block-sync-renderer/sync/light-synchronizer.ts index 00ad630bea..5baaf8c101 100644 --- a/packages/neuron-wallet/src/block-sync-renderer/sync/light-synchronizer.ts +++ b/packages/neuron-wallet/src/block-sync-renderer/sync/light-synchronizer.ts @@ -231,7 +231,7 @@ export default class LightSynchronizer extends Synchronizer { const deleteScript = syncScripts.filter(v => !allScriptHashes.has(scriptToHash(v.script))) await this.lightRpc.setScripts(deleteScript, 'delete') const walletIds = [...new Set(this.addressMetas.map(v => v.walletId))] - await SyncProgressService.resetSyncProgress(addScripts) + await SyncProgressService.initSyncProgress(addScripts) await SyncProgressService.updateSyncProgressFlag(walletIds) await SyncProgressService.removeByHashesAndAddressType( SyncAddressType.Multisig, diff --git a/packages/neuron-wallet/src/services/sync-progress.ts b/packages/neuron-wallet/src/services/sync-progress.ts index 2d42843bab..747746d718 100644 --- a/packages/neuron-wallet/src/services/sync-progress.ts +++ b/packages/neuron-wallet/src/services/sync-progress.ts @@ -4,7 +4,7 @@ import SyncProgress, { SyncAddressType } from '../database/chain/entities/sync-p import WalletService from './wallets' export default class SyncProgressService { - static async resetSyncProgress( + static async initSyncProgress( params: { script: CKBComponents.Script scriptType: CKBRPC.ScriptType @@ -13,13 +13,15 @@ export default class SyncProgressService { blockNumber: string }[] ) { - await getConnection() + const syncProgresses = params.map(v => SyncProgress.fromObject(v)) + const existProgresses = await getConnection() .getRepository(SyncProgress) - .createQueryBuilder() - .insert() - .orIgnore() - .values(params.map(v => SyncProgress.fromObject(v))) - .execute() + .find({ + select: ['hash'], + }) + const existHashes = new Set(existProgresses.map(v => v.hash)) + const newSyncProgreses = syncProgresses.filter(v => !existHashes.has(v.hash)) + await getConnection().manager.save(newSyncProgreses, { chunk: 100 }) } static async updateSyncProgressFlag(existWalletIds: string[]) { diff --git a/packages/neuron-wallet/tests/block-sync-renderer/light-synchronizer.test.ts b/packages/neuron-wallet/tests/block-sync-renderer/light-synchronizer.test.ts index 4b23436501..8e3b83be0c 100644 --- a/packages/neuron-wallet/tests/block-sync-renderer/light-synchronizer.test.ts +++ b/packages/neuron-wallet/tests/block-sync-renderer/light-synchronizer.test.ts @@ -5,7 +5,7 @@ import AddressMeta from '../../src/database/address/meta' const getSyncStatusMock = jest.fn() const getCurrentWalletMinSyncedBlockNumberMock = jest.fn() const getAllSyncStatusToMapMock = jest.fn() -const resetSyncProgressMock = jest.fn() +const initSyncProgressMock = jest.fn() const updateSyncStatusMock = jest.fn() const updateSyncProgressFlagMock = jest.fn() const getWalletMinLocalSavedBlockNumberMock = jest.fn() @@ -28,7 +28,7 @@ function mockReset() { getSyncStatusMock.mockReset() getCurrentWalletMinSyncedBlockNumberMock.mockReset() getAllSyncStatusToMapMock.mockReset() - resetSyncProgressMock.mockReset() + initSyncProgressMock.mockReset() updateSyncStatusMock.mockReset() getWalletMinLocalSavedBlockNumberMock.mockReset() getOtherTypeSyncProgressMock.mockReset() @@ -52,7 +52,7 @@ jest.mock('../../src/services/sync-progress', () => { static getSyncStatus: any = () => getSyncStatusMock() static getCurrentWalletMinSyncedBlockNumber: any = () => getCurrentWalletMinSyncedBlockNumberMock() static getAllSyncStatusToMap: any = () => getAllSyncStatusToMapMock() - static resetSyncProgress: any = (arg: any) => resetSyncProgressMock(arg) + static initSyncProgress: any = (arg: any) => initSyncProgressMock(arg) static updateSyncStatus: any = (hash: string, update: any) => updateSyncStatusMock(hash, update) static updateSyncProgressFlag: any = (walletIds: string[]) => updateSyncProgressFlagMock(walletIds) static getWalletMinLocalSavedBlockNumber: any = () => getWalletMinLocalSavedBlockNumberMock() @@ -166,7 +166,7 @@ describe('test light synchronizer', () => { 'partial' ) expect(setScriptsMock).toHaveBeenLastCalledWith([], 'delete') - expect(resetSyncProgressMock).toBeCalledWith([ + expect(initSyncProgressMock).toBeCalledWith([ { script: addressMeta.generateACPLockScript().toSDK(), scriptType: 'lock',