scpx-wallet
Version:
Scoop Core Wallet: dual-signature timelock crypto wallet - multi-asset, cross-platform and open-source
110 lines (89 loc) • 4.02 kB
JavaScript
// Distributed under AGPLv3 license: see /LICENSE for terms. Copyright 2019-2021 Dominic Morris.
const utilsWallet = require('../utils')
const svrWalletCreate = require('./sw-create')
const log = require('../sw-cli-log')
//
// wallet file persistence
//
module.exports = {
walletFileSave: (appWorker, store, p) => {
var { mpk, name, force } = p
log.cmd('walletFileSave')
const e_assetsRaw = store.getState().wallet.assetsRaw
// validate
var loadedFilename = undefined
if (global.loadedWallet.file && global.loadedWallet.file.name) {
loadedFilename = global.loadedWallet.file.name
}
if (name) {
if (name.toString().match(/^[a-z0-9_-]+$/i) == null) return Promise.resolve({ err: `Wallet name must be alphanumeric characters only` })
}
if (utilsWallet.isParamEmpty(name)) {
if (!loadedFilename) {
return Promise.resolve({ err: `Wallet name is required` })
}
else {
name = loadedFilename
}
}
const fileName = `./wallet_${name.toString()}.dat`
log.param('fileName', fileName)
var overwrite = false
if (utilsWallet.isParamTrue(force)) {
overwrite = true
}
// check overwrite
const fs = require('fs')
const exists = fs.existsSync(fileName)
if (exists && !overwrite) return Promise.resolve({ err: `File ${fileName} already exists. Use --force to overwrite.` })
// exec
return new Promise((resolve) => {
fs.writeFile(fileName, e_assetsRaw, function (err) {
if (err) resolve({ err })
else {
log.warn(`the MPK used to generate this wallet will be required to load it from file.`)
global.loadedWallet.file = { name }
global.loadedWallet.dirty = false
utilsWallet.setTitle(`FILE WALLET - ${fileName}`)
resolve({ ok: { fileName, mpk } })
}
})
})
},
walletFileLoad: (appWorker, store, p) => {
var { mpk, name } = p
log.cmd('walletFileLoad')
// validate
if (utilsWallet.isParamEmpty(name)) return Promise.resolve({ err: `Wallet name is required` })
if (name.toString().match(/^[a-z0-9_-]+$/i) == null) return Promise.resolve({ err: `Wallet name must be alphanumeric characters only` })
const fileName = `./wallet_${name.toString()}.dat`
// check exists
const fs = require('fs')
const exists = fs.existsSync(fileName)
if (!exists) return Promise.resolve({ err: `File ${fileName} not found.` })
// exec
return new Promise((resolve) => {
fs.readFile(fileName, "utf8", function (err, data) {
if (err) resolve({ err })
else {
if (!data || data.length == 0) {
resolve({ err: `No data in file ${fileName}.` })
return
}
const e_storedAssetsRaw = data.toString()
log.info(`Read wallet ${fileName} data OK - length=`, e_storedAssetsRaw.length)
svrWalletCreate.walletInit(appWorker, store, { mpk }, e_storedAssetsRaw)
.then(walletInit => {
if (walletInit.err) resolve(walletInit)
if (walletInit.ok) {
global.loadedWallet.file = { name }
global.loadedWallet.dirty = false
utilsWallet.setTitle(`FILE WALLET - ${fileName}`)
}
resolve({ ok: { fileName, walletInit } })
})
}
})
})
},
}