From d66466f8aca5f917307d64bf7cd71801dabee8d5 Mon Sep 17 00:00:00 2001 From: Ruben de Vries Date: Mon, 7 Aug 2017 16:45:39 +0200 Subject: [PATCH 1/4] fixed typo --- lib/backup_generator-browser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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( From 4f1bc927529e4f8f1070545f20c4b27877950a66 Mon Sep 17 00:00:00 2001 From: Thomas Kerin Date: Thu, 6 Jul 2017 22:30:28 +0200 Subject: [PATCH 2/4] allow regtest --- lib/api_client.js | 43 +++++++++++++++++++++++++++++++++++-------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/lib/api_client.js b/lib/api_client.js index 02ae474..833d828 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 * @@ -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,25 @@ var APIClient = function(options) { self.client = new RestClient(options); }; +APIClient.prototype.initNetwork = function(options) { + this.testnet = options.testnet = options.testnet || false; + if (options.network === 'RBTC') { + options.network = 'rBTC'; + this.network = regtest; + } else if (options.network === 'TBTC') { + options.network = 'tBTC'; + this.network = bitcoin.networks.testnet; + } else { + if (options.testnet) { + options.network = 'tBTC'; + this.network = bitcoin.networks.testnet; + } else { + options.network = 'BTC'; + this.network = bitcoin.networks.bitcoin; + } + } +}; + var determineDataStorageV2_3 = function(options) { return q.when(options) .then(function(options) { From 45a9b2b7c1b0a425f3013c269be33d3c4f8a47d9 Mon Sep 17 00:00:00 2001 From: Thomas Kerin Date: Thu, 6 Jul 2017 23:10:29 +0200 Subject: [PATCH 3/4] use toUpperCase in initNetwork --- lib/api_client.js | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lib/api_client.js b/lib/api_client.js index 833d828..d9a388a 100644 --- a/lib/api_client.js +++ b/lib/api_client.js @@ -91,21 +91,27 @@ var APIClient = function(options) { APIClient.prototype.initNetwork = function(options) { this.testnet = options.testnet = options.testnet || false; - if (options.network === 'RBTC') { - options.network = 'rBTC'; - this.network = regtest; - } else if (options.network === 'TBTC') { - options.network = 'tBTC'; - this.network = bitcoin.networks.testnet; - } else { - if (options.testnet) { + + if (options.network) { + var upper = options.network.toUpperCase(); + if (upper === 'RBTC') { + options.network = 'rBTC'; + this.network = regtest; + return; + } else if (upper === 'TBTC') { options.network = 'tBTC'; this.network = bitcoin.networks.testnet; - } else { - options.network = 'BTC'; - this.network = bitcoin.networks.bitcoin; + return; } } + + if (options.testnet) { + options.network = 'tBTC'; + this.network = bitcoin.networks.testnet; + } else { + options.network = 'BTC'; + this.network = bitcoin.networks.bitcoin; + } }; var determineDataStorageV2_3 = function(options) { From fbb27d08fe01529a09938f8eeb7a051dd86b177b Mon Sep 17 00:00:00 2001 From: Thomas Kerin Date: Fri, 7 Jul 2017 01:19:14 +0200 Subject: [PATCH 4/4] BC BREAK: Wallet constructor signature, pass network instead of 'testnet' --- lib/api_client.js | 30 ++++++++++++---------- lib/services/blocktrail_bitcoin_service.js | 3 +++ lib/wallet.js | 11 +++----- test/wallet.test.js | 4 +-- 4 files changed, 24 insertions(+), 24 deletions(-) diff --git a/lib/api_client.js b/lib/api_client.js index d9a388a..8431793 100644 --- a/lib/api_client.js +++ b/lib/api_client.js @@ -36,8 +36,8 @@ var regtest = { * 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 */ @@ -90,17 +90,17 @@ var APIClient = function(options) { }; APIClient.prototype.initNetwork = function(options) { - this.testnet = options.testnet = options.testnet || false; - 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; } } @@ -108,9 +108,11 @@ APIClient.prototype.initNetwork = function(options) { 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; } }; @@ -305,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) { @@ -341,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 @@ -402,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 @@ -902,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; @@ -937,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 @@ -1120,7 +1122,7 @@ APIClient.prototype._createNewWalletV1 = function(options) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, checksum, result.upgrade_key_index, options.bypassNewAddressCheck @@ -1169,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) { @@ -1229,7 +1231,7 @@ APIClient.prototype._createNewWalletV2 = function(options) { blocktrailPublicKeys, keyIndex, result.chain || 0, - self.testnet, + self.network, checksum, result.upgrade_key_index, options.bypassNewAddressCheck @@ -1277,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) { @@ -1339,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/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 );