Browse Source

Merge pull request #1491 from gre/migration-of-dgb-accounts

add migrationNonce mecanism in the walletName generation
master
Gaëtan Renaudeau 6 years ago
committed by GitHub
parent
commit
bd32aaafee
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 45
      src/helpers/libcore.js

45
src/helpers/libcore.js

@ -29,6 +29,15 @@ const SPLITTED_CURRENCIES = {
}, },
} }
// each time there is a breaking change that needs use to clear cache on both libcore and js side,
// we should bump a nonce in this map
// tech notes:
// - this is used to generate walletName for libcore to completely re-sync to a new wallet.
// - by changing walletName we also make the JS db refresh because we handle the accountId changes (walletName is in accountId).
const migrationNonceByCurrency = {
digibyte: 1,
}
export function isValidAddress(core: *, currency: *, address: string): boolean { export function isValidAddress(core: *, currency: *, address: string): boolean {
const addr = new core.NJSAddress(address, currency) const addr = new core.NJSAddress(address, currency)
return addr.isValid(address, currency) return addr.isValid(address, currency)
@ -155,6 +164,7 @@ async function scanAccountsOnDeviceBySegwit({
const accounts = await scanNextAccount({ const accounts = await scanNextAccount({
core, core,
wallet, wallet,
walletName,
devicePath, devicePath,
currencyId, currencyId,
accountsCount, accountsCount,
@ -232,6 +242,7 @@ const coreSyncAccount = (core, account) =>
async function scanNextAccount(props: { async function scanNextAccount(props: {
// $FlowFixMe // $FlowFixMe
wallet: NJSWallet, wallet: NJSWallet,
walletName: string,
core: *, core: *,
devicePath: string, devicePath: string,
currencyId: string, currencyId: string,
@ -247,6 +258,7 @@ async function scanNextAccount(props: {
const { const {
core, core,
wallet, wallet,
walletName,
devicePath, devicePath,
currencyId, currencyId,
accountsCount, accountsCount,
@ -285,6 +297,7 @@ async function scanNextAccount(props: {
isUnsplit, isUnsplit,
accountIndex, accountIndex,
wallet, wallet,
walletName,
currencyId, currencyId,
core, core,
ops, ops,
@ -319,14 +332,16 @@ const createWalletConfig = (core, configMap = {}) => {
async function getOrCreateWallet( async function getOrCreateWallet(
core: *, core: *,
WALLET_IDENTIFIER: string, walletName: string,
currencyId: string, currencyId: string,
isSegwit: boolean, isSegwit: boolean,
isUnsplit: boolean, isUnsplit: boolean,
): NJSWallet { ): NJSWallet {
const migrationNonce = migrationNonceByCurrency[currencyId]
const walletId = walletName + (migrationNonce ? `_${migrationNonce}` : '')
const pool = core.getPoolInstance() const pool = core.getPoolInstance()
try { try {
const wallet = await timeoutTagged('getWallet', 5000, pool.getWallet(WALLET_IDENTIFIER)) const wallet = await timeoutTagged('getWallet', 5000, pool.getWallet(walletId))
return wallet return wallet
} catch (err) { } catch (err) {
const currency = await timeoutTagged('getCurrency', 5000, pool.getCurrency(currencyId)) const currency = await timeoutTagged('getCurrency', 5000, pool.getCurrency(currencyId))
@ -346,7 +361,7 @@ async function getOrCreateWallet(
const wallet = await timeoutTagged( const wallet = await timeoutTagged(
'createWallet', 'createWallet',
10000, 10000,
core.getPoolInstance().createWallet(WALLET_IDENTIFIER, currency, njsWalletConfig), core.getPoolInstance().createWallet(walletId, currency, njsWalletConfig),
) )
return wallet return wallet
} }
@ -357,6 +372,7 @@ async function buildAccountRaw({
isSegwit, isSegwit,
isUnsplit, isUnsplit,
wallet, wallet,
walletName,
currencyId, currencyId,
core, core,
accountIndex, accountIndex,
@ -366,6 +382,7 @@ async function buildAccountRaw({
isSegwit: boolean, isSegwit: boolean,
isUnsplit: boolean, isUnsplit: boolean,
wallet: NJSWallet, wallet: NJSWallet,
walletName: string,
currencyId: string, currencyId: string,
accountIndex: number, accountIndex: number,
core: *, core: *,
@ -430,7 +447,7 @@ async function buildAccountRaw({
type: 'libcore', type: 'libcore',
version: '1', version: '1',
xpub, xpub,
walletName: wallet.getName(), walletName,
}), }),
xpub, xpub,
path: walletPath, path: walletPath,
@ -511,25 +528,10 @@ export async function syncAccount({
index: number, index: number,
}) { }) {
const decodedAccountId = accountIdHelper.decode(accountId) const decodedAccountId = accountIdHelper.decode(accountId)
const { walletName } = decodedAccountId
const isSegwit = isSegwitPath(freshAddressPath) const isSegwit = isSegwitPath(freshAddressPath)
const isUnsplit = isUnsplitPath(freshAddressPath, SPLITTED_CURRENCIES[currencyId]) const isUnsplit = isUnsplitPath(freshAddressPath, SPLITTED_CURRENCIES[currencyId])
let njsWallet const njsWallet = await getOrCreateWallet(core, walletName, currencyId, isSegwit, isUnsplit)
try {
njsWallet = await timeoutTagged(
'getWallet',
10000,
core.getPoolInstance().getWallet(decodedAccountId.walletName),
)
} catch (e) {
logger.warn(`Have to reimport the account... (${e})`)
njsWallet = await getOrCreateWallet(
core,
decodedAccountId.walletName,
currencyId,
isSegwit,
isUnsplit,
)
}
let njsAccount let njsAccount
try { try {
@ -562,6 +564,7 @@ export async function syncAccount({
isUnsplit, isUnsplit,
accountIndex: index, accountIndex: index,
wallet: njsWallet, wallet: njsWallet,
walletName,
currencyId, currencyId,
core, core,
ops, ops,

Loading…
Cancel
Save