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.open();
    await node.connect();
    await walletdb.open();
    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) => {

1 Answer 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().

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.