diff --git a/lib/primitives/keyring.js b/lib/primitives/keyring.js index 5c3f6ed8..f657bf5b 100644 --- a/lib/primitives/keyring.js +++ b/lib/primitives/keyring.js @@ -251,6 +251,37 @@ class KeyRing { return new this().fromScript(key, script, compress); } + /** + * Get ith public key from multisig script. + * @private + * @param {Script} script + * @param {Number} i + * @returns {KeyRing} + */ + + fromMultisigScript(script, i) { + assert(script instanceof Script, 'Non-script passed.'); + assert(script.isMultisig(), 'Script must be multisig'); + + const n = script.getSmall(-2); + assert(i >= 1 && i <= n, 'Requested `i`th key, `n` available'); + + this.fromKey(script.code[i].toData()); + + return this; + } + + /** + * Instantiate keyring from ith key in multisig script. + * @param {Script} script + * @param {Number} i + * @returns {KeyRing} + */ + + static fromMultisigScript(script, i) { + return new this().fromMultisigScript(script, i); + } + /** * Calculate WIF serialization size. * @returns {Number} diff --git a/test/keyring-test.js b/test/keyring-test.js index 9f37701d..b0d951b0 100644 --- a/test/keyring-test.js +++ b/test/keyring-test.js @@ -5,6 +5,7 @@ const assert = require('./util/assert'); const KeyRing = require('../lib/primitives/keyring'); +const Script = require('../lib/script/script'); const uncompressed = KeyRing.fromSecret( '5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss', 'main'); @@ -49,4 +50,17 @@ describe('KeyRing', function() { 'L4rK1yDtCWekvXuE6oXD9jCYfFNV2cWRpVuPLBcCU2z8TrisoyY1', compressed.toSecret('main')); }); + + it('should get keys from multisig', () => { + const script = Script.fromMultisig(1, 2, [ + compressed.getPublicKey(), + uncompressed.getPublicKey()]); + + assert.strictEqual( + compressed.getPublicKey(), + KeyRing.fromMultisigScript(script, 1).getPublicKey()); + assert.strictEqual( + uncompressed.getPublicKey(), + KeyRing.fromMultisigScript(script, 2).getPublicKey()); + }); });