I've generated a testnet address like this:

const btc = require('bitcoinjs-lib');
const bip32 = require('bip32');
const bip39 = require('bip39');

var root = bip32.fromSeed(
var pubkey = root.derivePath("m/44'/1'/0'/0/0").publicKey;

and for my troubles I end up with this value: 14kwGTShacA5hT4uAes7dkNvreuHXuRRf7

however, when I test that with BlockCypher (or Blockchain.com or some other explorer), it doesn't seem to recognise it:

curl https://api.blockcypher.com/v1/btc/test3/addrs/14kwGTShacA5hT4uAes7dkNvreuHXuRRf7/balance


{"error": "Address 14kwGTShacA5hT4uAes7dkNvreuHXuRRf7 incompatible with current block chain: BTC.test3"}

notice that according to BIP44 the derivation path for testnet coins is m/44'/1' vs. m/44/0' for mainnet

so what is wrong here?

  • A chain explorer can only know about addresses which have actually been used in a transaction which has been broadcast over the network. Have you tried sending some testnet coins to the address you generated?
    – Mark H
    Jan 9, 2020 at 8:13
  • no, but I should be able to get a zero balance. the problem isn't with whether the address has been used. it's a format problem
    – ekkis
    Jan 9, 2020 at 21:29

1 Answer 1


You are on the right track. The address is derived correctly, it is just not encoded with the right version.

You need to add the testnet network version to the btc.payments.p2pkh call as well.

Something like this should work:

console.log(btc.payments.p2pkh({pubkey, network: btc.networks.testnet}).address);

The address should then start with m... instead of 1....

More information about the available parameters can be found here: https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/src/payments/p2pkh.js

  • ecco! a million thanks. right on point
    – ekkis
    Jan 9, 2020 at 21:38

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.