You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
176 lines
5.4 KiB
176 lines
5.4 KiB
/*!
|
|
* test/lib/bitcoin/hd-accounts-helper.js
|
|
* Copyright © 2019 – Katana Cryptographic Ltd. All Rights Reserved.
|
|
*/
|
|
|
|
'use strict'
|
|
|
|
const assert = require('assert')
|
|
const bitcoin = require('bitcoinjs-lib')
|
|
const network = require('../../../lib/bitcoin/network')
|
|
const hdaHelper = require('../../../lib/bitcoin/hd-accounts-helper')
|
|
|
|
|
|
/**
|
|
* Test vectors
|
|
*/
|
|
|
|
const XPUB = 'tpubDDDAe7GgFT4fzEzKwWVA4BWo8fiJXQeGEYDTexzo2w6CK1iDoLPYkpEisXo623ieF79GQ3xpcEVN1vcQhX2sysyL8o1XqzBmQb9JReTxQ7w'
|
|
const YPUB = 'upub5ELkCsSF68UnAZE7zF9CDztvHeBJiAAhwa4VxEFzZ1CfQRbpy93mkBbUZsqYVpoeEHFwY3fGh9bfftH79ZwbhjUEUBAxQj551TMxVyny4UX'
|
|
const ZPUB = 'vpub5ZB1WY7AEp2G1rREpbvpS5zRTcKkenACrgaijd9sw1aYTXR4DoDLNFFcb5o8VjTZdvNkHXFq9oxDZAtfsGMcVy9qLWsNzdtZHBRbtXe87LB'
|
|
|
|
const BIP44_VECTORS = [
|
|
[0, 0, 'mmZ5FRccGAkwfKme4JkrsmurnimDLdfmNL'],
|
|
[0, 1, 'n3yomLicyrSULiNWFKHsK8erntSpJZEPV6'],
|
|
[0, 2, 'mvVYLwjmMuYVWbuTyB9UE6LWah9tevLrrE'],
|
|
[0, 3, 'n1CrG3NpdTiFWh8KgsnAGUgn6aEF8xvYY2'],
|
|
[0, 4, 'mw3JvPz3wdUVrmTD6WugHgahk97QWnD61L'],
|
|
|
|
[1, 0, 'miYMfmg3F3QpBJ48oVzvSi4NVgi93ykJ1L'],
|
|
[1, 1, 'mvEnHm9ZFcdnBa5wNfiJ6yVViex8wReDJJ'],
|
|
[1, 2, 'muSWDErhMRUHb6nSQqnVLp3TctqsKjKY4G'],
|
|
[1, 3, 'mhxsuiLirgVeRT9Nb9iUVrmCTgNDc1tcNa'],
|
|
[1, 4, 'mtj8CDwFPa4cfyK9cgfSCaXvDxdszgFFVU']
|
|
]
|
|
|
|
const BIP49_VECTORS = [
|
|
[0, 0, '2NCmqrb5eXMYZUxdnY4Dr8h3FKqH6JmWCco'],
|
|
[0, 1, '2NCxTGKxDsv9gyC2wjBev85WHP1GN8LCKfR'],
|
|
[0, 2, '2N7vmdwgKjVxkivSou6F8Zaj37SxH7jASaC'],
|
|
[0, 3, '2NBeYshMWNj5jiMBuk9mfywY2853QKgDJ9k'],
|
|
[0, 4, '2MutR6UcnThCUmFJVUrT2z265pNGQcj6DV3'],
|
|
|
|
[1, 0, '2MvSusqGmAB5MNz66dVLndV8AVKBvhidCdS'],
|
|
[1, 1, '2MxCqx15GTdW8wDXAVSsxnmHTjoqQLEEzQt'],
|
|
[1, 2, '2N7megh7h2CiCcGWcXax266BtjxZy5Hovrf'],
|
|
[1, 3, '2N8CrDFMsFA7Gs9phdA7xpm3RrDgvk719ro'],
|
|
[1, 4, '2Msi1iNCJcxsxX5ENiVzzqWw8GuCJG8zfmV']
|
|
]
|
|
|
|
const BIP84_VECTORS = [
|
|
[0, 0, 'tb1qggmkgcrk5zdwm8wlh2nzqv5k7xunv3tqk6w9p0'],
|
|
[0, 1, 'tb1q7enwpjlzuc3taq69mkpyqmkwn8d5mtrvmvzl9m'],
|
|
[0, 2, 'tb1q53zh56awxvk824msyxhfjtlwg4fwd3s2s5wygh'],
|
|
[0, 3, 'tb1q6l6lm298eq5qkwntl42lv2x0vw6yny50ugnuef'],
|
|
[0, 4, 'tb1q4fre2as0az62am5eaj30tupv92crqd8yjpu67w'],
|
|
|
|
[1, 0, 'tb1qyykyu2y9lx6qt2y6j3nur88ssnpuapnug9zuv4'],
|
|
[1, 1, 'tb1q59awztrl7dfn7l38a8uvgrkstrw4lf4fwmz2kt'],
|
|
[1, 2, 'tb1qnza9973gp8f7rm9k9yc327zwdvz9wl9sa3yvp7'],
|
|
[1, 3, 'tb1qrttk0uzx656uupg9w8f39ec6e6c8wwcts4fanj'],
|
|
[1, 4, 'tb1qjrnw8u2pvspm6hq3aa83ff93wevq2zyxqczewy']
|
|
]
|
|
|
|
const HD_TYPES_VECTORS = [
|
|
// unlocked
|
|
[0, hdaHelper.BIP44, false],
|
|
[1, hdaHelper.BIP49, false],
|
|
[2, hdaHelper.BIP84, false],
|
|
// locked
|
|
[128, hdaHelper.BIP44, true],
|
|
[129, hdaHelper.BIP49, true],
|
|
[130, hdaHelper.BIP84, true],
|
|
]
|
|
|
|
|
|
describe('HdAccountsHelper', function() {
|
|
|
|
describe('isXpub()', function() {
|
|
it('should successfully detect a XPUB', function() {
|
|
assert(hdaHelper.isXpub(XPUB))
|
|
assert(!hdaHelper.isXpub(YPUB))
|
|
assert(!hdaHelper.isXpub(ZPUB))
|
|
})
|
|
|
|
it('should successfully detect a YPUB', function() {
|
|
assert(!hdaHelper.isYpub(XPUB))
|
|
assert(hdaHelper.isYpub(YPUB))
|
|
assert(!hdaHelper.isYpub(ZPUB))
|
|
})
|
|
|
|
it('should successfully detect a ZPUB', function() {
|
|
assert(!hdaHelper.isZpub(XPUB))
|
|
assert(!hdaHelper.isZpub(YPUB))
|
|
assert(hdaHelper.isZpub(ZPUB))
|
|
})
|
|
})
|
|
|
|
|
|
describe('isValid()', function() {
|
|
it('should successfully validate a valid XPUB', function() {
|
|
assert(hdaHelper.isValid(XPUB))
|
|
})
|
|
|
|
it('should successfully validate a valid YPUB', function() {
|
|
assert(hdaHelper.isValid(YPUB))
|
|
})
|
|
|
|
it('should successfully validate a valid ZPUB', function() {
|
|
assert(hdaHelper.isValid(ZPUB))
|
|
})
|
|
})
|
|
|
|
|
|
describe('classify()', function() {
|
|
it('should successfully classify the code stored in db', function() {
|
|
for (const v of HD_TYPES_VECTORS) {
|
|
const ret = hdaHelper.classify(v[0])
|
|
assert(ret.type == v[1])
|
|
assert(ret.locked == v[2])
|
|
}
|
|
})
|
|
})
|
|
|
|
|
|
describe('makeType()', function() {
|
|
it('should successfully compute the code stored in db', function() {
|
|
for (const v of HD_TYPES_VECTORS) {
|
|
const ret = hdaHelper.makeType(v[1], v[2])
|
|
assert(ret == v[0])
|
|
}
|
|
})
|
|
})
|
|
|
|
|
|
describe('deriveAddresses()', () => {
|
|
it('should successfully derive addresses with BIP44', async () => {
|
|
for (const v of BIP44_VECTORS) {
|
|
const addresses = await hdaHelper.deriveAddresses(XPUB, v[0], [v[1]], hdaHelper.BIP44)
|
|
assert(addresses[0].address == v[2])
|
|
}
|
|
})
|
|
|
|
it('should successfully derive addresses with BIP49', async () => {
|
|
for (const v of BIP49_VECTORS) {
|
|
const addresses = await hdaHelper.deriveAddresses(XPUB, v[0], [v[1]], hdaHelper.BIP49)
|
|
assert(addresses[0].address == v[2])
|
|
}
|
|
})
|
|
|
|
it('should successfully derive addresses with BIP84', async () => {
|
|
for (const v of BIP84_VECTORS) {
|
|
const addresses = await hdaHelper.deriveAddresses(XPUB, v[0], [v[1]], hdaHelper.BIP84)
|
|
assert(addresses[0].address == v[2])
|
|
}
|
|
})
|
|
})
|
|
|
|
|
|
describe('xlatXPUB()', function() {
|
|
it('should successfully translate XPUB in YPUB', function() {
|
|
const xpubXlated = hdaHelper.xlatXPUB(XPUB)
|
|
assert(xpubXlated == XPUB)
|
|
})
|
|
|
|
it('should successfully translate YPUB in XPUB', function() {
|
|
const ypubXlated = hdaHelper.xlatXPUB(YPUB)
|
|
assert(ypubXlated == XPUB)
|
|
})
|
|
|
|
it('should successfully translate ZPUB in XPUB', function() {
|
|
const zpubXlated = hdaHelper.xlatXPUB(ZPUB)
|
|
assert(zpubXlated == XPUB)
|
|
})
|
|
})
|
|
|
|
})
|
|
|