From 5b1d443bf144d9cafd4ac610a33223c3cc400b3e Mon Sep 17 00:00:00 2001 From: Daniel Cousens <github@dcousens.com> Date: Mon, 21 Aug 2017 11:34:57 +1000 Subject: [PATCH] README/tests: add BIP173/BIP16 SegWit address examples --- README.md | 4 +++ test/integration/addresses.js | 54 +++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 0efaf67..5213db6 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,10 @@ Some examples interact (via HTTPS) with a 3rd Party Blockchain Provider (3PBP). - [Generate an address from a SHA256 hash](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L19) - [Import an address via WIF](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L29) - [Generate a 2-of-3 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L36) +- [Generate a SegWit address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:61) +- [Generate a SegWit address (via P2SH)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:50) +- [Generate a SegWit 3-of-4 multisig address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:85) +- [Generate a SegWit 2-of-2 multisig address (via P2SH)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:71) - [Support the retrieval of transactions for an address (3rd party blockchain)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L52) - [Generate a Testnet address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L73) - [Generate a Litecoin address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L83) diff --git a/test/integration/addresses.js b/test/integration/addresses.js index ad8ad97..9a132f2 100644 --- a/test/integration/addresses.js +++ b/test/integration/addresses.js @@ -38,9 +38,7 @@ describe('bitcoinjs-lib (addresses)', function () { '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9', '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9' - ].map(function (hex) { - return Buffer.from(hex, 'hex') - }) + ].map(function (hex) { return Buffer.from(hex, 'hex') }) var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys) // 2 of 3 var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(redeemScript)) @@ -49,6 +47,56 @@ describe('bitcoinjs-lib (addresses)', function () { assert.strictEqual(address, '36NUkt6FWUi3LAWBqWRdDmdTWbt91Yvfu7') }) + it('can generate a SegWit address', function () { + var keyPair = bitcoin.ECPair.fromWIF('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct') + var pubKey = keyPair.getPublicKeyBuffer() + + var scriptPubKey = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(pubKey)) + var address = bitcoin.address.fromOutputScript(scriptPubKey) + + assert.strictEqual(address, 'bc1qt97wqg464zrhnx23upykca5annqvwkwujjglky') + }) + + it('can generate a SegWit address (via P2SH)', function () { + var keyPair = bitcoin.ECPair.fromWIF('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct') + var pubKey = keyPair.getPublicKeyBuffer() + + var witnessScript = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(pubKey)) + var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(witnessScript)) + var address = bitcoin.address.fromOutputScript(scriptPubKey) + + assert.strictEqual(address, '34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53') + }) + + it('can generate a SegWit 3-of-4 multisig address', function () { + var pubKeys = [ + '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', + '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9', + '023e4740d0ba639e28963f3476157b7cf2fb7c6fdf4254f97099cf8670b505ea59', + '03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9' + ].map(function (hex) { return Buffer.from(hex, 'hex') }) + + var witnessScript = bitcoin.script.multisig.output.encode(3, pubKeys) // 3 of 4 + var scriptPubKey = bitcoin.script.witnessScriptHash.output.encode(bitcoin.crypto.sha256(witnessScript)) + var address = bitcoin.address.fromOutputScript(scriptPubKey) + + assert.strictEqual(address, 'bc1q75f6dv4q8ug7zhujrsp5t0hzf33lllnr3fe7e2pra3v24mzl8rrqtp3qul') + }) + + it('can generate a SegWit 2-of-2 multisig address (via P2SH)', function () { + var pubKeys = [ + '026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01', + '02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9' + ].map(function (hex) { return Buffer.from(hex, 'hex') }) + + var witnessScript = bitcoin.script.multisig.output.encode(2, pubKeys) // 2 of 2 + var redeemScript = bitcoin.script.witnessScriptHash.output.encode(bitcoin.crypto.sha256(witnessScript)) + var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(redeemScript)) + var address = bitcoin.address.fromOutputScript(scriptPubKey) + + assert.strictEqual(address, '3P4mrxQfmExfhxqjLnR2Ah4WES5EB1KBrN') + }) + it('can support the retrieval of transactions for an address (3rd party blockchain)', function (done) { var keyPair = bitcoin.ECPair.makeRandom() var address = keyPair.getAddress()