Add toAddress(network) functionality to scripts
This commit is contained in:
parent
98fe6b2abd
commit
d688222769
|
@ -234,9 +234,17 @@ Address._transformScript = function(script, network){
|
||||||
if (!script.constructor || (script.constructor.name && script.constructor.name !== 'Script')) {
|
if (!script.constructor || (script.constructor.name && script.constructor.name !== 'Script')) {
|
||||||
throw new TypeError('Address must be an instance of Script.');
|
throw new TypeError('Address must be an instance of Script.');
|
||||||
}
|
}
|
||||||
info.network = network || Networks.defaultNetwork;
|
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.hashBuffer = Hash.sha256ripemd160(script.toBuffer());
|
||||||
info.type = Address.PayToScriptHash;
|
info.type = Address.PayToScriptHash;
|
||||||
|
}
|
||||||
|
info.network = network || Networks.defaultNetwork;
|
||||||
return info;
|
return info;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@ var Hash = require('../crypto/hash');
|
||||||
var Opcode = require('../opcode');
|
var Opcode = require('../opcode');
|
||||||
var PublicKey = require('../publickey');
|
var PublicKey = require('../publickey');
|
||||||
var Signature = require('../crypto/signature');
|
var Signature = require('../crypto/signature');
|
||||||
|
var Networks = require('../networks');
|
||||||
|
|
||||||
var $ = require('../util/preconditions');
|
var $ = require('../util/preconditions');
|
||||||
var _ = require('lodash');
|
var _ = require('lodash');
|
||||||
|
@ -700,6 +701,21 @@ Script.fromAddress = function(address) {
|
||||||
throw new errors.Script.UnrecognizedAddress(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,
|
* Analagous to bitcoind's FindAndDelete. Find and delete equivalent chunks,
|
||||||
* typically used with push data chunks. Note that this will find and delete
|
* typically used with push data chunks. Note that this will find and delete
|
||||||
|
|
|
@ -320,6 +320,7 @@ describe('Address', function() {
|
||||||
b.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
|
b.toString().should.equal('16JXnhxjJUhxfyx4y6H4sFcxrgt8kQ8ewX');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('from a script', function() {
|
||||||
it('should make this address from a script', function() {
|
it('should make this address from a script', function() {
|
||||||
var s = Script.fromString('OP_CHECKMULTISIG');
|
var s = Script.fromString('OP_CHECKMULTISIG');
|
||||||
var buf = s.toBuffer();
|
var buf = s.toBuffer();
|
||||||
|
@ -339,6 +340,18 @@ describe('Address', function() {
|
||||||
b.toString().should.equal('347iRqVwks5r493N1rsLN4k9J7Ljg488W7');
|
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() {
|
it('should derive from this known address string livenet', function() {
|
||||||
var address = new Address(str);
|
var address = new Address(str);
|
||||||
var buffer = address.toBuffer();
|
var buffer = address.toBuffer();
|
||||||
|
|
|
@ -6,6 +6,7 @@ var bitcore = require('../..');
|
||||||
|
|
||||||
var BufferUtil = bitcore.util.buffer;
|
var BufferUtil = bitcore.util.buffer;
|
||||||
var Script = bitcore.Script;
|
var Script = bitcore.Script;
|
||||||
|
var Networks = bitcore.Networks;
|
||||||
var Opcode = bitcore.Opcode;
|
var Opcode = bitcore.Opcode;
|
||||||
var PublicKey = bitcore.PublicKey;
|
var PublicKey = bitcore.PublicKey;
|
||||||
var Address = bitcore.Address;
|
var Address = bitcore.Address;
|
||||||
|
@ -584,9 +585,37 @@ describe('Script', function() {
|
||||||
expect(BufferUtil.equal(Script('OP_RETURN 1 0xFF').getData(), new Buffer([255]))).to.be.true();
|
expect(BufferUtil.equal(Script('OP_RETURN 1 0xFF').getData(), new Buffer([255]))).to.be.true();
|
||||||
});
|
});
|
||||||
it('fails if content is not recognized', function() {
|
it('fails if content is not recognized', function() {
|
||||||
expect(function() {
|
var failed = false;
|
||||||
return Script('1 0xFF').getData();
|
try {
|
||||||
}).to.throw();
|
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);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue