How to make a persistent SPV wallet? (bcoin)


I created a wallet on a SPV node. The wallet is initialized from a mnemonic. After receiving some transactions, the wallet's balance looks like:

{ account: -1, tx: 3, coin: 3, unconfirmed: 136300, confirmed: 0 }

But when I re-initialize the wallet, it looks so:

{ account: -1, tx: 0, coin: 0, unconfirmed: 0, confirmed: 0 }

On the each initialization the wallet have the same address.

Here is my code:

const bcoin = require('bcoin');
const KeyRing = bcoin.keyring;
const Mnemonic = bcoin.hd.Mnemonic;
const HD = bcoin.hd;

const node = new bcoin.node.SPVNode({
    config: true,
    argv: true,
    env: true,
    logFile: true,
    logConsole: true,
    logLevel: 'debug',
    db: 'leveldb',
    memory: false,
    persistent: true,
    workers: true,
    listen: true,
    loader: require,
    network: 'testnet'

// Temporary hack
if (!node.has('walletdb')) {
    const plugin = require('./node_modules/bcoin/lib/wallet/plugin');

process.on('unhandledRejection', (err, promise) => {
  throw err;

const walletdb = new bcoin.wallet.WalletDB({ memory: false, network: 'testnet', prefix: '/Users/alestsurko/.bcoin/spvchain' });

(async () => {
    await node.ensure();
    await node.connect();
    const mnemonic = new Mnemonic('uncover cash coral neglect upon nurse argue deal right song hood tennis');
    const masterKey = HD.fromMnemonic(mnemonic);

    const wallet = await walletdb.create({master: masterKey});

    console.log('Created wallet with address %s', await wallet.receiveAddress());
    const bl = await wallet.getBalance();

    // Add our address to the spv filter.
    node.pool.watchAddress(await wallet.receiveAddress());


    node.on('error', async (err) => {

    node.pool.on('tx', async (tx) => {
        console.log('------ New tx. Adding to walletdb...');
        await walletdb.addTX(tx);

    wallet.on('balance', async (balance) => {
        console.log('Balance updated.');
})().catch((err) => {

Ales Tsurko

Posted 2018-08-16T11:21:25.260

Reputation: 1



As commented here, the cause of the problem is that I

sorta have created two wallets. The first is instantiated by the plugin statement towards the top, and then you also create a new walletDB right after.

So the solution is using WalletClient:

const {WalletClient} = require('bclient');
const {Network} = require('bcoin');
const network = Network.get('regtest');

const walletOptions = {
  network: network.type,
  port: network.walletPort,
  apiKey: 'api-key'

const walletClient = new WalletClient(walletOptions);
const id = 'primary'; // or whatever your wallet name is
const wallet = walletClient.wallet(id);

Instead of walletdb.create().

Ales Tsurko

Posted 2018-08-16T11:21:25.260

Reputation: 1