scpx-wallet
Version:
Scoop Core Wallet: dual-signature timelock crypto wallet - multi-asset, cross-platform and open-source
106 lines (85 loc) • 4.24 kB
JavaScript
// Distributed under AGPLv3 license: see /LICENSE for terms. Copyright 2019-2021 Dominic Morris.
const Eos = require('eosjs')
const Keygen = require('eosjs-keygen').Keygen
const scpEosConfig = require('../config/eos').scpEosConfig
const BigNumber = require('bignumber.js')
const _ = require('lodash')
const configWallet = require('../config/wallet')
const utilsWallet = require('../utils')
const opsWallet = require('../actions/wallet')
const functions = require('./sw-functions')
const log = require('../sw-cli-log')
//
// handles in-memory creation of new wallets and sub-asset private keys
//
module.exports = {
walletNew: (appWorker, store) => {
//const emailEntropyBase36 = new BigNumber(BigNumber.random(80).times(1e80).toFixed()).toString(36)
log.cmd('walletNew')
return Keygen.generateMasterKeys()
.then(async keys => {
const res = await module.exports.walletInit(appWorker, store, {
mpk: keys.masterPrivateKey,
//email: `s+${emailEntropyBase36}@scoop.tech`
})
return res
})
},
walletInit: async (appWorker, store, p, e_storedAssetsRaw) => {
var { mpk } = p
log.cmd('walletInit')
// validate
const svrWallet = require('./sw-router')
const invalidMpk = await svrWallet.validateMpk(mpk)
if (invalidMpk.err) return invalidMpk
log.param('mpk', configWallet.IS_TEST ? '[secure]' : mpk)
var keys = await Keygen.generateMasterKeys(mpk)
const apk = keys.publicKeys.active
log.param('apk', apk)
const h_mpk = utilsWallet.pbkdf2(apk, mpk)
//const e_email = utilsWallet.aesEncryption(apk, h_mpk, email)
//const md5_email = MD5(email).toString()
// exec
return opsWallet.generateWallets({
store: store,
apk: apk,
h_mpk: h_mpk,
userAccountName: undefined, // no default DSC persistence for server wallets - not required
e_email: undefined, // "
e_storedAssetsRaw: e_storedAssetsRaw, // undefined for a new wallet, otherwise supplied by wallet-load or by wallet-server-load
eosActiveWallet: undefined,
callbackProcessed: (ret, totalReqCount) => {}
})
.then(async (generateWalletsResult) => {
if (!generateWalletsResult && e_storedAssetsRaw) {
return Promise.resolve({ err: `Decrypt failed - MPK is probably incorrect` })
}
// default in-memory wallet; clear server and file wallet fields
global.loadedWallet.file = undefined
global.loadedServerWallet = {}
// save MPK if in dev mode, or we're running in RPC mode
if (configWallet.CLI_SAVE_KEY === true || configWallet.get_RPC_MODE() == true) {
global.loadedWallet.keys = { mpk }
}
// setup storage context
if (!global.storageContext) global.storageContext = {}
const config = Object.assign({ keyProvider: [keys.privateKeys.owner, keys.privateKeys.active] }, scpEosConfig)
const eos = Eos(config)
const keyAccounts = await eos.getKeyAccounts(keys.publicKeys.owner)
const owner = keyAccounts.account_names[0]
global.storageContext.owner = owner
global.storageContext.apk = keys.publicKeys.active
global.storageContext.opk = keys.publicKeys.owner
global.storageContext.PATCH_H_MPK = utilsWallet.pbkdf2(keys.publicKeys.active, keys.masterPrivateKey)
utilsWallet.softNuke(keys)
// (re)connect addr monitors
const walletConnect = await functions.walletConnect(appWorker, store, {})
utilsWallet.setTitle(`${apk}`)
return { ok: { mpk, apk, h_mpk, walletConnect }}
})
.catch(err => {
utilsWallet.softNuke(keys)
return { err: err.message || err.toString() }
})
},
}