Skip to content
This repository has been archived by the owner on Apr 3, 2019. It is now read-only.

Commit

Permalink
Merge aab216b into 852e00d
Browse files Browse the repository at this point in the history
  • Loading branch information
nitsujlangston committed Apr 18, 2018
2 parents 852e00d + aab216b commit 359a10d
Show file tree
Hide file tree
Showing 12 changed files with 134 additions and 129 deletions.
60 changes: 34 additions & 26 deletions lib/address.js
Original file line number Diff line number Diff line change
Expand Up @@ -303,7 +303,7 @@ function decodeCashAddress(address) {

var prefix, encodedPayload;

if (pieces.length == 2) {
if (pieces.length === 2) {
prefix = pieces[0];
encodedPayload = pieces[1];
} else {
Expand Down Expand Up @@ -360,8 +360,7 @@ function decodeCashAddress(address) {
info.network = network;
info.type = type;
return info;
};

}



Expand All @@ -378,24 +377,30 @@ Address._transformString = function(data, network, type) {
if (typeof(data) !== 'string') {
throw new TypeError('data parameter supplied is not a string.');
}
if (data.length < 25){
throw new Error('Invalid Address string provided');
}
data = data.trim();
var addressBuffer;
var networkObj = Networks.get(network);
var info;

try {
addressBuffer = Base58Check.decode(data);
} catch (e) {
info = decodeCashAddress(data);
if (network && !networkObj) {
throw new TypeError('Unknown network');
}

if (data.length > 35){
var info = decodeCashAddress(data);
if (!info.network || (networkObj && networkObj.name !== info.network.name)) {
throw new TypeError('Address has mismatched network type.');
}
if (!info.type || (type && type !== info.type)) {
throw new TypeError('Address has mismatched type.');
}
return info;
} else {
var addressBuffer = Base58Check.decode(data);
// Legacy addr
return Address._transformBuffer(addressBuffer, network, type);
}

// Legacy addr
info = Address._transformBuffer(addressBuffer, network, type);
return info;
};


Expand Down Expand Up @@ -593,16 +598,6 @@ Address.prototype.toObject = Address.prototype.toJSON = function toObject() {
};
};

/**
* Will return a the base58 (legacy) string representation of the address
*
* @returns {string} Bitcoin address
*/
Address.prototype.toString = function() {
//console.log('Warning: Using deprecated bitcoin cash address type. Replace to .toCashAddress');
return Base58Check.encode(this.toBuffer());
};

/**
* Will return a string formatted for the console
*
Expand All @@ -626,7 +621,14 @@ Address.prototype.toCashBuffer = function() {
return buf;
};


/**
* Will return a the base58 (legacy) string representation of the address
*
* @returns {string} Bitcoin address
*/
Address.prototype.toLegacyAddress = function () {
return Base58Check.encode(this.toBuffer());
};

/**
* Will return a cashaddr representation of the address. Always return lower case
Expand Down Expand Up @@ -685,12 +687,18 @@ Address.prototype.toCashAddress = function(stripPrefix) {
}
};

/**
* Will return a string representation of the address (defaults to CashAddr format)
*
* @returns {string} address
*/
Address.prototype.toString = Address.prototype.toCashAddress;

/***
* Retrieves the the length in bits of the encoded hash from its bit
* representation within the version byte.
*
* @param {number} versionByte
* @param {number} versionByte
*/
function getHashSize(versionByte) {
switch (versionByte & 7) {
Expand Down Expand Up @@ -737,7 +745,7 @@ function checksumToArray(checksum) {
* @param {Array} data Array of 5-bit integers over which the checksum is to be computed.
*/
var GENERATOR = _.map(
[0x98f2bc8e61, 0x79b76d99e2, 0xf33e5fb3c4, 0xae2eabe2a8, 0x1e4f43e470], function(x){
[0x98f2bc8e61, 0x79b76d99e2, 0xf33e5fb3c4, 0xae2eabe2a8, 0x1e4f43e470], function(x){
return new BN(x);
}
);
Expand Down
2 changes: 1 addition & 1 deletion lib/uri.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ URI.prototype.toString = function() {

return URL.format({
protocol: 'bitcoincash:',
host: this.address,
host: this.address.toString(true),
query: query
});
};
Expand Down
2 changes: 1 addition & 1 deletion package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

55 changes: 27 additions & 28 deletions test/address.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
var chai = require('chai');
var should = chai.should();
var expect = chai.expect;
var _ = require('lodash');

var bitcore = require('..');
var PublicKey = bitcore.PublicKey;
Expand All @@ -20,7 +19,7 @@ describe('Address', function() {

var pubkeyhash = new Buffer('3c3fa3d4adcaf8f52d5b1843975e122548269937', 'hex');
var buf = Buffer.concat([new Buffer([28]), pubkeyhash]);
var str = 'CMxTMLHVazpmroYhw2bfXNJFyxLuX4srpv';
var str = 'bitcoincash:qq7rlg754h903afdtvvy8967zgj5sf5exueg36nyc7';

it('can\'t build without data', function() {
(function() {
Expand Down Expand Up @@ -97,7 +96,7 @@ describe('Address', function() {
var cashaddr = t[i][1];
it('should convert ' + cashaddr, function() {
var a = new Address(cashaddr);
a.toString().should.equal(legacyaddr);
a.toLegacyAddress().should.equal(legacyaddr);
});
}

Expand All @@ -106,7 +105,7 @@ describe('Address', function() {
var cashaddr2 = t[i][1].toUpperCase();
it('should convert UPPERCASE addresses ' + cashaddr2, function() {
var a = new Address(cashaddr2);
a.toString().should.equal(legacyaddr2);
a.toLegacyAddress().should.equal(legacyaddr2);
});
}

Expand All @@ -117,7 +116,7 @@ describe('Address', function() {
it('should convert no prefix addresses ' + cashaddr3, function() {
var a = new Address(cashaddr3);
a.toObject().network.should.equal('livenet');
a.toString().should.equal(legacyaddr3);
a.toLegacyAddress().should.equal(legacyaddr3);
});
}

Expand All @@ -134,7 +133,7 @@ describe('Address', function() {

it('should be able to convert a testnet address to a cashaddr with prefix', function() {
var a = new Address('mysKEM9kN86Nkcqwb4gw7RqtDyc552LQoq');
a.toCashAddress(true).should.equal('qry5cr6h2qe25pzwwfrz8m653fh2tf6nusj9dl0ujc');
a.toCashAddress().should.equal('bchtest:qry5cr6h2qe25pzwwfrz8m653fh2tf6nusj9dl0ujc');
});

it('should fail convert no prefix addresses bad checksum ', function() {
Expand All @@ -154,15 +153,15 @@ describe('Address', function() {
// livenet valid
var PKHLivenet = [
'CMPeBN1BZDzaqU5DF66X5QykLcS1voucT9',
'CRZoT4EafXoYLNJm3bPpTjK3h4q1FSxet4',
'bitcoincash:qp3awknl3dz8ezu3rmapff3phnzz95kansf0r3rs4x',
'CTHVPhghRAmiLHajoKYTGRyiU8RomQmAfZ',
'CaSvYEmgxVRYiAauWzW1XP4SHkyTiS78yy',
' CaSvYEmgxVRYiAauWzW1XP4SHkyTiS78yy \t\n'
];

// livenet p2sh
var P2SHLivenet = [
'H8rnMErHmZWKpp8H3beDwL8BsSEwzDFSjJ',
'bitcoincash:pqv60krfqv3k3lglrcnwtee6ftgwgaykpccr8hujjz',
'H8kzbJ9Mw46WdAxC8SAFadHn1oNqp6jEsu',
'HCGvZEM8pNyAFBfRrz9Eo4N4eGJPuFahd9',
'HVZezVtqnDwoTZTZ997fZUUGZMetDFUDLf',
Expand All @@ -171,7 +170,7 @@ describe('Address', function() {

// testnet p2sh
var P2SHTestnet = [
'2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C',
'bchtest:pzvmx80heyrg69ypkkt90rwmknfmmy96av8f02lrrf',
'2NEWDzHWwY5ZZp8CQWbB7ouNMLqCia6YRda',
'2MxgPqX1iThW3oZVk9KoFcE5M4JpiETssVN',
'2NB72XtkjpnATMggui83aEtPawyyKvnbX2o'
Expand All @@ -195,10 +194,10 @@ describe('Address', function() {

//testnet valid
var PKHTestnet = [
'n28S35tqEMbt6vNad7A5K3mZ7vdn8dZ86X',
'bchtest:qr3pswmv0t332gwaedmuhqcp59gswsu2ysdn664dvs',
'n45x3R2w2jaSC62BMa9MeJCd3TXxgvDEmm',
'mursDVxqNQmmwWHACpM9VHwVVSfTddGsEM',
'mtX8nPZZdJ8d3QNLRJ1oJTiEi26Sj6LQXS'
'bchtest:qz82yclajj49kq3cnqk5khs9h2qx5drfruglvwmnac'
];

describe('validation', function() {
Expand Down Expand Up @@ -285,7 +284,7 @@ describe('Address', function() {
for (var i = 0; i < badChecksums.length; i++) {
var error = Address.getValidationError(badChecksums[i], 'livenet', 'pubkeyhash');
should.exist(error);
error.message.should.match(/Invalid/);
error.message.should.match(/Checksum mismatch/);
}
});

Expand Down Expand Up @@ -316,7 +315,7 @@ describe('Address', function() {
for (var i = 0; i < nonBase58.length; i++) {
var error = Address.getValidationError(nonBase58[i], 'livenet', 'pubkeyhash');
should.exist(error);
error.message.should.match(/Invalid/);
error.message.should.match(/Non-base58/);
}
});

Expand All @@ -328,10 +327,10 @@ describe('Address', function() {
});

it('addresses with whitespace are validated correctly', function() {
var ws = ' \r \t \n CRZoT4EafXoYLNJm3bPpTjK3h4q1FSxet4 \t \n \r';
var ws = ' \r \t \n bitcoincash:qp3awknl3dz8ezu3rmapff3phnzz95kansf0r3rs4x \t \n \r';
var error = Address.getValidationError(ws);
should.not.exist(error);
Address.fromString(ws).toString().should.equal('CRZoT4EafXoYLNJm3bPpTjK3h4q1FSxet4');
Address.fromString(ws).toString().should.equal('bitcoincash:qp3awknl3dz8ezu3rmapff3phnzz95kansf0r3rs4x');
});
});

Expand Down Expand Up @@ -452,7 +451,7 @@ describe('Address', function() {
it('should make this address from a compressed pubkey', function() {
var pubkey = new PublicKey('0285e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b004');
var address = Address.fromPublicKey(pubkey, 'livenet');
address.toString().should.equal('CR9Aex3uR9Brm2etmqio8u6bG7g2uF5ewo');
address.toString().should.equal('bitcoincash:qp0jaf7jwcf0zlxguv7kcaj05hsxz2lcquxxcxmxtv');
});

it('should use the default network for pubkey', function() {
Expand All @@ -465,9 +464,9 @@ describe('Address', function() {
var pubkey = new PublicKey('0485e9737a74c30a873f74df05124f2aa6f53042c2fc0a130d6cbd7d16b944b00' +
'4833fef26c8be4c4823754869ff4e46755b85d851077771c220e2610496a29d98');
var a = Address.fromPublicKey(pubkey, 'livenet');
a.toString().should.equal('CMmRMkJoBXgVa7rVeqbzSmEzUp6YgVBuaV');
a.toString().should.equal('bitcoincash:qqazje5ucx2l672lc8cundsa5q9lwdm3rcknh40sxg');
var b = new Address(pubkey, 'livenet', 'pubkeyhash');
b.toString().should.equal('CMmRMkJoBXgVa7rVeqbzSmEzUp6YgVBuaV');
b.toString().should.equal('bitcoincash:qqazje5ucx2l672lc8cundsa5q9lwdm3rcknh40sxg');
});

it('should classify from a custom network', function() {
Expand Down Expand Up @@ -501,26 +500,26 @@ describe('Address', function() {
var s = new Script('OP_DUP OP_HASH160 20 ' +
'0xc8e11b0eb0d2ad5362d894f048908341fa61b6e1 OP_EQUALVERIFY OP_CHECKSIG');
var a = Address.fromScript(s, 'livenet');
a.toString().should.equal('Can3P2Qf8L78v1zmTU1cs6RTrQATGLYZY4');
a.toString().should.equal('bitcoincash:qrywzxcwkrf265mzmz20qjyssdql5cdkuyz47850l7');
var b = new Address(s, 'livenet');
b.toString().should.equal('Can3P2Qf8L78v1zmTU1cs6RTrQATGLYZY4');
b.toString().should.equal('bitcoincash:qrywzxcwkrf265mzmz20qjyssdql5cdkuyz47850l7');
});

it('should make this address from a p2sh input script', function() {
var s = Script.fromString('OP_HASH160 20 0xa6ed4af315271e657ee307828f54a4365fa5d20f OP_EQUAL');
var a = Address.fromScript(s, 'livenet');
a.toString().should.equal('HMjkpaXwkpiL2dF6NzqRCyj8HzxSEGPGr3');
a.toString().should.equal('bitcoincash:pznw6jhnz5n3uet7uvrc9r655sm9lfwjpu4ufgvysw');
var b = new Address(s, 'livenet');
b.toString().should.equal('HMjkpaXwkpiL2dF6NzqRCyj8HzxSEGPGr3');
b.toString().should.equal('bitcoincash:pznw6jhnz5n3uet7uvrc9r655sm9lfwjpu4ufgvysw');
});

it('returns the same address if the script is a pay to public key hash out', function() {
var address = 'CMmRMkJoBXgVa7rVeqbzSmEzUp6YgVBuaV';
var address = 'bitcoincash:qqazje5ucx2l672lc8cundsa5q9lwdm3rcknh40sxg';
var script = Script.buildPublicKeyHashOut(new Address(address));
Address(script, Networks.livenet).toString().should.equal(address);
});
it('returns the same address if the script is a pay to script hash out', function() {
var address = 'HGNshk7ZtEP3UwYTqTWAjeJpZLMk3BWkJt';
var address = 'bitcoincash:ppkzrtrs0jeheyreg222ekspzpsw7r7qzykvzs4uxh';
var script = Script.buildScriptHashOut(new Address(address));
Address(script, Networks.livenet).toString().should.equal(address);
});
Expand Down Expand Up @@ -606,7 +605,7 @@ describe('Address', function() {
describe('#inspect', function() {
it('should output formatted output correctly', function() {
var address = new Address(str);
var output = '<Address: CMxTMLHVazpmroYhw2bfXNJFyxLuX4srpv, type: pubkeyhash, network: livenet>';
var output = '<Address: bitcoincash:qq7rlg754h903afdtvvy8967zgj5sf5exueg36nyc7, type: pubkeyhash, network: livenet>';
address.inspect().should.equal(output);
});
});
Expand Down Expand Up @@ -654,14 +653,14 @@ describe('Address', function() {

it('can create an address from a set of public keys', function() {
var address = Address.createMultisig(publics, 2, Networks.livenet);
address.toString().should.equal('HLiwrE9wYi9XHHeXL8R8fN5cWZpBUN8Kme');
address.toString().should.equal('bitcoincash:pzdumagr7ru8w46s8alws4lzruv2c75vsuulp7g59n');
address = new Address(publics, 2, Networks.livenet);
address.toString().should.equal('HLiwrE9wYi9XHHeXL8R8fN5cWZpBUN8Kme');
address.toString().should.equal('bitcoincash:pzdumagr7ru8w46s8alws4lzruv2c75vsuulp7g59n');
});

it('works on testnet also', function() {
var address = Address.createMultisig(publics, 2, Networks.testnet);
address.toString().should.equal('2N7T3TAetJrSCruQ39aNrJvYLhG1LJosujf');
address.toString().should.equal('bchtest:pzdumagr7ru8w46s8alws4lzruv2c75vsucd9e2rz0');
});

it('can also be created by Address.createMultisig', function() {
Expand Down
2 changes: 1 addition & 1 deletion test/data/bitcoind/base58_keys_valid.json
Original file line number Diff line number Diff line change
Expand Up @@ -387,7 +387,7 @@
}
],
[
"2N7FuwuUuoTBrDFdrAZ9KxBmtqMLxce9i1C",
"bchtest:pzvmx80heyrg69ypkkt90rwmknfmmy96av8f02lrrf",
"99b31df7c9068d1481b596578ddbb4d3bd90baeb",
{
"addrType": "script",
Expand Down
8 changes: 4 additions & 4 deletions test/privatekey.js
Original file line number Diff line number Diff line change
Expand Up @@ -256,13 +256,13 @@ describe('PrivateKey', function() {
it('should output this known livenet address correctly', function() {
var privkey = PrivateKey.fromWIF('L3T1s1TYP9oyhHpXgkyLoJFGniEgkv2Jhi138d7R2yJ9F4QdDU2m');
var address = privkey.toAddress();
address.toString().should.equal('CRZoT4EafXoYLNJm3bPpTjK3h4q1FSxet4');
address.toString().should.equal('bitcoincash:qp3awknl3dz8ezu3rmapff3phnzz95kansf0r3rs4x');
});

it('should output this known testnet address correctly', function() {
var privkey = PrivateKey.fromWIF('cR4qogdN9UxLZJXCNFNwDRRZNeLRWuds9TTSuLNweFVjiaE4gPaq');
var address = privkey.toAddress();
address.toString().should.equal('mtX8nPZZdJ8d3QNLRJ1oJTiEi26Sj6LQXS');
address.toString().should.equal('bchtest:qz82yclajj49kq3cnqk5khs9h2qx5drfruglvwmnac');
});

it('creates network specific address', function() {
Expand Down Expand Up @@ -446,12 +446,12 @@ describe('PrivateKey', function() {

it('creates an address as expected from WIF, livenet', function() {
var privkey = new PrivateKey('5J2NYGstJg7aJQEqNwYp4enG5BSfFdKXVTtBLvHicnRGD5kjxi6');
privkey.publicKey.toAddress().toString().should.equal('CJYVWx2K5pgJGbwsKxCEDyTxRCi8qfAXxE');
privkey.publicKey.toAddress().toString().should.equal('bitcoincash:qqtv79nz6p246lxt6ja526nhmgdk5qtn9gdc6kt4us');
});

it('creates an address as expected from WIF, testnet', function() {
var privkey = new PrivateKey('92VYMmwFLXRwXn5688edGxYYgMFsc3fUXYhGp17WocQhU6zG1kd');
privkey.publicKey.toAddress().toString().should.equal('moiAvLUw16qgrwhFGo1eDnXHC2wPMYiv7Y');
privkey.publicKey.toAddress().toString().should.equal('bchtest:qpv7q8crqr6872wprm7626kzkt4gafx8gc2x9ecrpr');
});

});

0 comments on commit 359a10d

Please sign in to comment.