Skip to content

Commit

Permalink
Add toAddress(network) functionality to scripts
Browse files Browse the repository at this point in the history
  • Loading branch information
eordano committed Dec 30, 2014
1 parent 98fe6b2 commit d688222
Show file tree
Hide file tree
Showing 4 changed files with 88 additions and 22 deletions.
12 changes: 10 additions & 2 deletions lib/address.js
Expand Up @@ -234,9 +234,17 @@ Address._transformScript = function(script, network){
if (!script.constructor || (script.constructor.name && script.constructor.name !== 'Script')) {
throw new TypeError('Address must be an instance of Script.');
}
if (script.isScriptHashOut()) {
info.hashBuffer = script.getData();
info.type = Address.PayToScriptHash;
} else if (script.isPublicKeyHashOut()) {
info.hashBuffer = script.getData();
info.type = Address.PayToPublicKeyHash;
} else {
info.hashBuffer = Hash.sha256ripemd160(script.toBuffer());
info.type = Address.PayToScriptHash;
}
info.network = network || Networks.defaultNetwork;
info.hashBuffer = Hash.sha256ripemd160(script.toBuffer());
info.type = Address.PayToScriptHash;
return info;
};

Expand Down
16 changes: 16 additions & 0 deletions lib/script/script.js
Expand Up @@ -8,6 +8,7 @@ var Hash = require('../crypto/hash');
var Opcode = require('../opcode');
var PublicKey = require('../publickey');
var Signature = require('../crypto/signature');
var Networks = require('../networks');

var $ = require('../util/preconditions');
var _ = require('lodash');
Expand Down Expand Up @@ -700,6 +701,21 @@ Script.fromAddress = function(address) {
throw new errors.Script.UnrecognizedAddress(address);
};

/**
* @return Address the associated address for this script
*/
Script.prototype.toAddress = function(network) {
network = Networks.get(network);
$.checkArgument(network, 'Must provide a network');
if (this.isPublicKeyHashOut()) {
return new Address(this.getData(), network, Address.PayToPublicKeyHash);
}
if (this.isScriptHashOut()) {
return new Address(this.getData(), network, Address.PayToScriptHash);
}
throw new Error('The script type needs to be PayToPublicKeyHash or PayToScriptHash');
};

/**
* Analagous to bitcoind's FindAndDelete. Find and delete equivalent chunks,
* typically used with push data chunks. Note that this will find and delete
Expand Down
47 changes: 30 additions & 17 deletions test/address.js
Expand Up @@ -320,23 +320,36 @@ describe('Address', function() {
b.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
});

it('should make this address from a script', function() {
var s = Script.fromString('OP_CHECKMULTISIG');
var buf = s.toBuffer();
var a = Address.fromScript(s);
a.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
var b = new Address(s);
b.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
var c = Address.fromScriptHash(bitcore.crypto.Hash.sha256ripemd160(buf));
c.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
});

it('should make this address from other script', function() {
var s = Script.fromString('OP_CHECKSIG OP_HASH160');
var a = Address.fromScript(s);
a.toString().should.equal('347iRqVwks5r493N1rsLN4k9J7Ljg488W7');
var b = new Address(s);
b.toString().should.equal('347iRqVwks5r493N1rsLN4k9J7Ljg488W7');
describe('from a script', function() {
it('should make this address from a script', function() {
var s = Script.fromString('OP_CHECKMULTISIG');
var buf = s.toBuffer();
var a = Address.fromScript(s);
a.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
var b = new Address(s);
b.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
var c = Address.fromScriptHash(bitcore.crypto.Hash.sha256ripemd160(buf));
c.toString().should.equal('3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm');
});

it('should make this address from other script', function() {
var s = Script.fromString('OP_CHECKSIG OP_HASH160');
var a = Address.fromScript(s);
a.toString().should.equal('347iRqVwks5r493N1rsLN4k9J7Ljg488W7');
var b = new Address(s);
b.toString().should.equal('347iRqVwks5r493N1rsLN4k9J7Ljg488W7');
});

it('returns the same address if the script is a pay to public key hash out', function() {
var address = '16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX';
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 = '3BYmEwgV2vANrmfRymr1mFnHXgLjD6gAWm';
var script = Script.buildScriptHashOut(new Address(address));
Address(script, Networks.livenet).toString().should.equal(address);
});
});

it('should derive from this known address string livenet', function() {
Expand Down
35 changes: 32 additions & 3 deletions test/script/script.js
Expand Up @@ -6,6 +6,7 @@ var bitcore = require('../..');

var BufferUtil = bitcore.util.buffer;
var Script = bitcore.Script;
var Networks = bitcore.Networks;
var Opcode = bitcore.Opcode;
var PublicKey = bitcore.PublicKey;
var Address = bitcore.Address;
Expand Down Expand Up @@ -584,9 +585,37 @@ describe('Script', function() {
expect(BufferUtil.equal(Script('OP_RETURN 1 0xFF').getData(), new Buffer([255]))).to.be.true();
});
it('fails if content is not recognized', function() {
expect(function() {
return Script('1 0xFF').getData();
}).to.throw();
var failed = false;
try {
Script('1 0xFF').getData();
} catch (e) {
failed = true;
}
failed.should.equal(true);
});
});

describe('toAddress', function() {
it('for a P2PKH address', function() {
var stringAddress = '1NaTVwXDDUJaXDQajoa9MqHhz4uTxtgK14';
var address = new Address(stringAddress);
var script = new Script(address);
script.toAddress(Networks.livenet).toString().should.equal(stringAddress);
});
it('for a P2SH address', function() {
var stringAddress = '3GhtMmAbWrUf6Y8vDxn9ETB14R6V7Br3mt';
var address = new Address(stringAddress);
var script = new Script(address);
script.toAddress(Networks.livenet).toString().should.equal(stringAddress);
});
it('fails if content is not recognized', function() {
var failed = false;
try {
Script().toAddress();
} catch (e) {
failed = true;
}
failed.should.equal(true);
});
});

Expand Down

0 comments on commit d688222

Please sign in to comment.