diff --git a/lib/api_client.js b/lib/api_client.js index 02ae474..8431793 100644 --- a/lib/api_client.js +++ b/lib/api_client.js @@ -16,6 +16,19 @@ var _ = require('lodash'), var useWebWorker = require('./use-webworker')(); +var regtest = { + magicPrefix: '\x18Bitcoin Signed Message:\n', + bip32: { + public: 0x043587cf, + private: 0x04358394 + }, + pubKeyHash: 0x6f, + scriptHash: 0xc4, + wif: 0xef, + dustThreshold: 546, + feePerKb: 10000 +}; + /** * Bindings to conssume the BlockTrail API * @@ -23,8 +36,8 @@ var useWebWorker = require('./use-webworker')(); * apiKey: 'API_KEY', * apiSecret: 'API_SECRET', * host: 'defaults to api.blocktrail.com', - * network: 'BTC|LTC', - * testnet: true|false + * network: 'BTC|TBTC|RBTC', // specific network + * testnet: true|false // assumes network == 'btc' * } * @constructor */ @@ -58,21 +71,16 @@ var APIClient = function(options) { options.host = 'api.blocktrail.com'; } + self.initNetwork(options); + if (!options.port) { options.port = options.https ? 443 : 80; } - self.testnet = options.testnet = options.testnet || false; - if (self.testnet) { - self.network = bitcoin.networks.testnet; - } else { - self.network = bitcoin.networks.bitcoin; - } - self.bitcoinCash = options.network && options.network === "BCC"; if (!options.endpoint) { - options.endpoint = "/" + (options.apiVersion || "v1") + "/" + (self.testnet ? "t" : "") + (options.network || 'BTC').toUpperCase(); + options.endpoint = "/" + (options.apiVersion || "v1") + "/" + (options.network || 'BTC').toUpperCase(); } /** @@ -81,6 +89,33 @@ var APIClient = function(options) { self.client = new RestClient(options); }; +APIClient.prototype.initNetwork = function(options) { + if (options.network) { + var upper = options.network.toUpperCase(); + if (upper === 'RBTC') { + options.network = 'rBTC'; + this.network = regtest; + this.testnet = false; + return; + } else if (upper === 'TBTC') { + options.network = 'tBTC'; + this.network = bitcoin.networks.testnet; + this.testnet = true; + return; + } + } + + if (options.testnet) { + options.network = 'tBTC'; + this.network = bitcoin.networks.testnet; + this.testnet = true; + } else { + options.network = 'BTC'; + this.network = bitcoin.networks.bitcoin; + this.testnet = false; + } +}; + var determineDataStorageV2_3 = function(options) { return q.when(options) .then(function(options) { @@ -272,7 +307,7 @@ APIClient.prototype.mnemonicToPrivateKey = function(mnemonic, passphrase, cb) { var deferred = q.defer(); deferred.promise.spreadNodeify(cb); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; deferred.resolve(q.fcall(function() { return self.mnemonicToSeedHex(mnemonic, passphrase).then(function(seedHex) { @@ -308,7 +343,7 @@ APIClient.prototype.resolvePrimaryPrivateKeyFromOptions = function(options, cb) var deferred = q.defer(); deferred.promise.nodeify(cb); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; try { // avoid conflicting options @@ -369,7 +404,7 @@ APIClient.prototype.resolveBackupPublicKeyFromOptions = function(options, cb) { var deferred = q.defer(); deferred.promise.nodeify(cb); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; try { // avoid conflicting options @@ -869,7 +904,7 @@ APIClient.prototype.initWallet = function(options, cb) { var deferred = q.defer(); deferred.promise.spreadNodeify(cb); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; var identifier = options.identifier; @@ -904,7 +939,7 @@ APIClient.prototype.initWallet = function(options, cb) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, result.checksum, result.upgrade_key_index, options.bypassNewAddressCheck @@ -1087,7 +1122,7 @@ APIClient.prototype._createNewWalletV1 = function(options) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, checksum, result.upgrade_key_index, options.bypassNewAddressCheck @@ -1136,7 +1171,7 @@ APIClient.prototype._createNewWalletV2 = function(options) { // avoid modifying passed options options = _.merge({}, options); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; determineDataStorageV2_3(options) .then(function(options) { @@ -1196,7 +1231,7 @@ APIClient.prototype._createNewWalletV2 = function(options) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, checksum, result.upgrade_key_index, options.bypassNewAddressCheck @@ -1244,7 +1279,7 @@ APIClient.prototype._createNewWalletV3 = function(options) { // avoid modifying passed options options = _.merge({}, options); - var network = self.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = self.network; determineDataStorageV2_3(options) .then(function(options) { @@ -1306,7 +1341,7 @@ APIClient.prototype._createNewWalletV3 = function(options) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, checksum, result.upgrade_key_index, options.bypassNewAddressCheck diff --git a/lib/backup_generator-browser.js b/lib/backup_generator-browser.js index e164c45..14eeb0c 100644 --- a/lib/backup_generator-browser.js +++ b/lib/backup_generator-browser.js @@ -155,7 +155,7 @@ BackupGenerator.prototype.generatePDF = function(callback) { function(callback) { if (self.options.page1) { pdf.FONT_SIZE_HEADER(function() { - pdf.TEXT(self.network + "Wallet Recovery Data Sheet"); + pdf.TEXT(self.network + " Wallet Recovery Data Sheet"); }); pdf.TEXT( diff --git a/lib/services/blocktrail_bitcoin_service.js b/lib/services/blocktrail_bitcoin_service.js index 9315cc8..c0cf401 100644 --- a/lib/services/blocktrail_bitcoin_service.js +++ b/lib/services/blocktrail_bitcoin_service.js @@ -43,6 +43,9 @@ BlocktrailBitcoinService.prototype.normaliseNetwork = function(network, testnet case 'tbtc': case 'bitcoin-testnet': return {network: "BTC", testnet: true}; + case 'rbtc': + case 'bitcoin-regtest': + return {network: "rBTC", testnet: false}; default: throw new Error("Unknown network " + network); } diff --git a/lib/wallet.js b/lib/wallet.js index 22b07f9..60acf2e 100644 --- a/lib/wallet.js +++ b/lib/wallet.js @@ -28,7 +28,7 @@ var SignMode = { * @param blocktrailPublicKeys array list of blocktrail pubKeys indexed by keyIndex * @param keyIndex int key index to use * @param chain int chain to use - * @param testnet bool testnet + * @param network object network * @param checksum string * @param upgradeToKeyIndex int * @param bypassNewAddressCheck bool flag to indicate if wallet should/shouldn't derive new address locally to verify api @@ -47,7 +47,7 @@ var Wallet = function( blocktrailPublicKeys, keyIndex, chain, - testnet, + network, checksum, upgradeToKeyIndex, bypassNewAddressCheck @@ -62,12 +62,7 @@ var Wallet = function( self.bypassNewAddressCheck = !!bypassNewAddressCheck; self.bitcoinCash = self.sdk.bitcoinCash; - self.testnet = testnet; - if (self.testnet) { - self.network = bitcoin.networks.testnet; - } else { - self.network = bitcoin.networks.bitcoin; - } + self.network = network; assert(backupPublicKey instanceof bitcoin.HDNode); assert(_.every(primaryPublicKeys, function(primaryPublicKey) { return primaryPublicKey instanceof bitcoin.HDNode; })); diff --git a/test/wallet.test.js b/test/wallet.test.js index 62b8f56..ccb7fdd 100644 --- a/test/wallet.test.js +++ b/test/wallet.test.js @@ -23,7 +23,7 @@ var TRANSACTION_TEST_WALLET_PRIMARY_MNEMONIC = "give pause forget seed dance cra var _createTestWallet = function(identifier, passphrase, primaryMnemonic, backupMnemonic, cb) { var keyIndex = 9999; - var network = client.testnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin; + var network = client.network; var primarySeed = bip39.mnemonicToSeed(primaryMnemonic, passphrase); var primaryPrivateKey = bitcoin.HDNode.fromSeedBuffer(primarySeed, network); @@ -63,7 +63,7 @@ var _createTestWallet = function(identifier, passphrase, primaryMnemonic, backup blocktrailPublicKeys, keyIndex, 0, - client.testnet, + client.network, checksum );