Skip to content

Commit 5b1d443

Browse files
committed
README/tests: add BIP173/BIP16 SegWit address examples
1 parent b1272a1 commit 5b1d443

File tree

2 files changed

+55
-3
lines changed

2 files changed

+55
-3
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,10 @@ Some examples interact (via HTTPS) with a 3rd Party Blockchain Provider (3PBP).
9898
- [Generate an address from a SHA256 hash](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L19)
9999
- [Import an address via WIF](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L29)
100100
- [Generate a 2-of-3 multisig P2SH address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L36)
101+
- [Generate a SegWit address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:61)
102+
- [Generate a SegWit address (via P2SH)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:50)
103+
- [Generate a SegWit 3-of-4 multisig address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:85)
104+
- [Generate a SegWit 2-of-2 multisig address (via P2SH)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js:71)
101105
- [Support the retrieval of transactions for an address (3rd party blockchain)](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L52)
102106
- [Generate a Testnet address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L73)
103107
- [Generate a Litecoin address](https://github.com/bitcoinjs/bitcoinjs-lib/blob/ae8422d/test/integration/addresses.js#L83)

test/integration/addresses.js

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,7 @@ describe('bitcoinjs-lib (addresses)', function () {
3838
'026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
3939
'02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9',
4040
'03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9'
41-
].map(function (hex) {
42-
return Buffer.from(hex, 'hex')
43-
})
41+
].map(function (hex) { return Buffer.from(hex, 'hex') })
4442

4543
var redeemScript = bitcoin.script.multisig.output.encode(2, pubKeys) // 2 of 3
4644
var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(redeemScript))
@@ -49,6 +47,56 @@ describe('bitcoinjs-lib (addresses)', function () {
4947
assert.strictEqual(address, '36NUkt6FWUi3LAWBqWRdDmdTWbt91Yvfu7')
5048
})
5149

50+
it('can generate a SegWit address', function () {
51+
var keyPair = bitcoin.ECPair.fromWIF('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct')
52+
var pubKey = keyPair.getPublicKeyBuffer()
53+
54+
var scriptPubKey = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(pubKey))
55+
var address = bitcoin.address.fromOutputScript(scriptPubKey)
56+
57+
assert.strictEqual(address, 'bc1qt97wqg464zrhnx23upykca5annqvwkwujjglky')
58+
})
59+
60+
it('can generate a SegWit address (via P2SH)', function () {
61+
var keyPair = bitcoin.ECPair.fromWIF('Kxr9tQED9H44gCmp6HAdmemAzU3n84H3dGkuWTKvE23JgHMW8gct')
62+
var pubKey = keyPair.getPublicKeyBuffer()
63+
64+
var witnessScript = bitcoin.script.witnessPubKeyHash.output.encode(bitcoin.crypto.hash160(pubKey))
65+
var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(witnessScript))
66+
var address = bitcoin.address.fromOutputScript(scriptPubKey)
67+
68+
assert.strictEqual(address, '34AgLJhwXrvmkZS1o5TrcdeevMt22Nar53')
69+
})
70+
71+
it('can generate a SegWit 3-of-4 multisig address', function () {
72+
var pubKeys = [
73+
'026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
74+
'02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9',
75+
'023e4740d0ba639e28963f3476157b7cf2fb7c6fdf4254f97099cf8670b505ea59',
76+
'03c6103b3b83e4a24a0e33a4df246ef11772f9992663db0c35759a5e2ebf68d8e9'
77+
].map(function (hex) { return Buffer.from(hex, 'hex') })
78+
79+
var witnessScript = bitcoin.script.multisig.output.encode(3, pubKeys) // 3 of 4
80+
var scriptPubKey = bitcoin.script.witnessScriptHash.output.encode(bitcoin.crypto.sha256(witnessScript))
81+
var address = bitcoin.address.fromOutputScript(scriptPubKey)
82+
83+
assert.strictEqual(address, 'bc1q75f6dv4q8ug7zhujrsp5t0hzf33lllnr3fe7e2pra3v24mzl8rrqtp3qul')
84+
})
85+
86+
it('can generate a SegWit 2-of-2 multisig address (via P2SH)', function () {
87+
var pubKeys = [
88+
'026477115981fe981a6918a6297d9803c4dc04f328f22041bedff886bbc2962e01',
89+
'02c96db2302d19b43d4c69368babace7854cc84eb9e061cde51cfa77ca4a22b8b9'
90+
].map(function (hex) { return Buffer.from(hex, 'hex') })
91+
92+
var witnessScript = bitcoin.script.multisig.output.encode(2, pubKeys) // 2 of 2
93+
var redeemScript = bitcoin.script.witnessScriptHash.output.encode(bitcoin.crypto.sha256(witnessScript))
94+
var scriptPubKey = bitcoin.script.scriptHash.output.encode(bitcoin.crypto.hash160(redeemScript))
95+
var address = bitcoin.address.fromOutputScript(scriptPubKey)
96+
97+
assert.strictEqual(address, '3P4mrxQfmExfhxqjLnR2Ah4WES5EB1KBrN')
98+
})
99+
52100
it('can support the retrieval of transactions for an address (3rd party blockchain)', function (done) {
53101
var keyPair = bitcoin.ECPair.makeRandom()
54102
var address = keyPair.getAddress()

0 commit comments

Comments
 (0)