@blockchain-api/bitcoin-js
Version:
Blockchain Api Bitcoin JS
149 lines (130 loc) • 7.33 kB
text/typescript
import { UTXO } from '../../interfaces/UTXO'
import { Script } from 'bitcore-lib'
import { generateAddressFromMnemonic, generateAddressFromPrivatekey, generateAddressFromXPub, generatePrivateKeyFromMnemonic, generateWallet, isValidAddress, signTxOffline } from './bitcoin'
const mnemonic = 'coyote nephew stable ghost enroll tunnel dizzy endorse garden know device funny swamp rural engine'
const accountExtPubkey = 'xpub6CMVnxESC4HLmqXLUwZFUySaj8YEpsdGRYQ52QyZzQNUTeLPK86RSXZzDo6qjaHEaEKLwYBsLvZ5jS7zcWMuU7wQDorAhznJA1y4QGN1wf7'
const accountExtPrivatekey = 'xprv9yN9PShYMgj3ZMSsNv2F7qVrB6hkRQuR4KUUE2ZxS4qVar1EmanAtjFWNXdeNoR5LkyXUNCMS5phjCdV9WNTyMpvs5Z2hc8YJkuPxHi4cWe'
const bip32ExtPubkey = 'xpub6EVdHS6ZJW28nSXy1x3fmmgnp9c9U8VCdS6CpChuJzuypxdwGYg5EeKWg9tgn62cymfJGX6xKj5qAMwWg5hfHEG7ZHs9qwVp6AgF3dnDiqx'
const bip32ExtPrivatekey = 'xprvA1WGsvZfU8TqZxTVuvWfQdk4G7mf4fmMGDAc1pJHkfNzxAJnj1Mpgr12prLZSByC59f5vGwcYXnfcMqaq7L6aiaPkmz9xtvsLGDVjiNfBQD'
const privateKeyBip44AddressIndex0 = 'L3yPj4BTZETs6GutQXYCBLNNu8nnJfkTFcFEg9uaHJMM47wxWBiw'
const bip44AddressIndex0 = '1Q59nZVyQVnf9euxWtXR6GedktTZmHkWTX'
const bip49AddressIndex0 = '3578hPA3ieKUfGCvFhkjGuwgmycLvjjmLC'
const bip84AddressIndex0 = 'bc1qupuel77fmpjcfk7g8e3p79s0p0la6d5kghrkqj'
const bip141AddressIndex0 = '38mW26MbBh7xoG6Mv78rhbbe4gbZaQkDfz'
const testnetAccountExtPubkey = 'tpubDCVKQML6TxHkPdWmtBWEHitrf9Gy24w7Ws8u4WoMfRG8mPT5ByjYfwhWgCMPJFqKgbPFVFmeBWiuZbt7y9tbUaR7ZzZca9dw8wbxg5yk2E1'
const testnetAccountExtPrivatekey = 'tprv8foHFwHrKac5WAUyzXqdtKEk67m2rjkCwZY7mzm4F9TjvuCJZauxVT5eW3VXje9PxNyee7CQjXqDgvzARLUzDgECWUfHzeKEXsKdWyHpixx'
const testnetBip32ExtPubkey = 'tpubDEh1QwGhPMp5PNWMzFF3shrWYN5saSmCJbKS1unFoQZ3QoAX1mxPB9243SjSEq81s9MB5p8hLbUp4EzkomV8GE6yfvPXtWse2QccAz1nG3B'
const testnetBip32ExtPrivatekey = 'tprv8hzyGXETEz8QVuUa6baTUJCPyLZwR7aHjHiejPjxP8keaJukPP8nzeQBsLSDLyqrGfb476xou2RNjwt2oHrTUQMYGpBhVVEPMpVYBqR3x5a'
const testnetPrivateKeyBip44AddressIndex0 = 'cPcq1pg1in22EJeqNWuFchjvY2w6s27uiGbyKA1p1M1nVNyddK6R'
const testnetBip44AddressIndex0 = 'mxTP99tk8fhepLXLExQfYErG9RugtZwdu6'
const testnetBip49AddressIndex0 = '2N47TPxbUFNUjFVtwyJy9aB79KXg2vbPvf2'
const testnetBip84AddressIndex0 = 'tb1q7tej0qx4k2yeg46cwdjaz57thhlqf42rdtjkq5'
const testnetBip141AddressIndex0 = '2MzKi5qHco9dK13iubEkjKYauH2ojQWXn8e'
describe('mainnet', () => {
const network = "mainnet"
test('generateWallet', async () => {
const wallet = await generateWallet(network, mnemonic)
expect(wallet.mnemonic).toBe(mnemonic)
expect(wallet.accountExtPubkey).toBe(accountExtPubkey)
expect(wallet.accountExtPrivatekey).toBe(accountExtPrivatekey)
expect(wallet.bip32ExtPubkey).toBe(bip32ExtPubkey)
expect(wallet.bip32ExtPrivatekey).toBe(bip32ExtPrivatekey)
});
test('generateAddressFromMnemonic', async () => {
const address = await generateAddressFromMnemonic(network, mnemonic, 0)
expect(address).toBe(bip44AddressIndex0)
});
test('generateAddressFromPrivatekey', async () => {
const address = generateAddressFromPrivatekey(network, privateKeyBip44AddressIndex0)
expect(address).toBe(bip44AddressIndex0)
});
test('generatePrivateKeyFromMnemonic', async () => {
const privateKey = await generatePrivateKeyFromMnemonic(network, mnemonic, 0)
expect(privateKey).toBe(privateKeyBip44AddressIndex0)
});
test('generateAddressFromXPub', async () => {
const address = generateAddressFromXPub(network, bip32ExtPubkey, 0)
expect(address).toBe(bip44AddressIndex0)
});
test('isValidAddress', async () => {
const address1 = bip44AddressIndex0
const checkValidAddress1 = isValidAddress(network, address1)
const address2 = bip49AddressIndex0
const checkValidAddress2 = isValidAddress(network, address2)
const address3 = bip84AddressIndex0
const checkValidAddress3 = isValidAddress(network, address3)
const address4 = bip141AddressIndex0
const checkValidAddress4 = isValidAddress(network, address4)
const address5 = testnetBip44AddressIndex0
const checkValidAddress5 = isValidAddress(network, address5)
expect(checkValidAddress1).toBe(true)
expect(checkValidAddress2).toBe(true)
expect(checkValidAddress3).toBe(true)
expect(checkValidAddress4).toBe(true)
expect(checkValidAddress5).toBe(false)
});
})
describe('testnet', () => {
const network = "testnet"
test('generateWallet', async () => {
const wallet = await generateWallet(network, mnemonic)
expect(wallet.mnemonic).toBe(mnemonic)
expect(wallet.accountExtPubkey).toBe(testnetAccountExtPubkey)
expect(wallet.accountExtPrivatekey).toBe(testnetAccountExtPrivatekey)
expect(wallet.bip32ExtPubkey).toBe(testnetBip32ExtPubkey)
expect(wallet.bip32ExtPrivatekey).toBe(testnetBip32ExtPrivatekey)
});
test('generateAddressFromMnemonic', async () => {
const address = await generateAddressFromMnemonic(network, mnemonic, 0)
expect(address).toBe(testnetBip44AddressIndex0)
});
test('generateAddressFromPrivatekey', async () => {
const address = generateAddressFromPrivatekey(network, testnetPrivateKeyBip44AddressIndex0)
expect(address).toBe(testnetBip44AddressIndex0)
});
test('generatePrivateKeyFromMnemonic', async () => {
const privateKey = await generatePrivateKeyFromMnemonic(network, mnemonic, 0)
expect(privateKey).toBe(testnetPrivateKeyBip44AddressIndex0)
});
test('generateAddressFromXPub', async () => {
const address = generateAddressFromXPub(network, testnetBip32ExtPubkey, 0)
expect(address).toBe(testnetBip44AddressIndex0)
});
test('isValidAddress', async () => {
const address1 = testnetBip44AddressIndex0
const checkValidAddress1 = isValidAddress(network, address1)
const address2 = testnetBip49AddressIndex0
const checkValidAddress2 = isValidAddress(network, address2)
const address3 = testnetBip84AddressIndex0
const checkValidAddress3 = isValidAddress(network, address3)
const address4 = testnetBip141AddressIndex0
const checkValidAddress4 = isValidAddress(network, address4)
const address5 = bip44AddressIndex0
const checkValidAddress5 = isValidAddress(network, address5)
expect(checkValidAddress1).toBe(true)
expect(checkValidAddress2).toBe(true)
expect(checkValidAddress3).toBe(true)
expect(checkValidAddress4).toBe(true)
expect(checkValidAddress5).toBe(false)
});
})
describe('transaction', () => {
test('signTxOffline by script', async () => {
const outputs = [{
txHash: 'e6452a2cb71aa864aaa959e647e7a4726a22e640560f199f79b56b5502114c37',
index: 0,
script: Script.fromAddress(bip44AddressIndex0).toString(),
value: 5000661330
} as UTXO]
signTxOffline("mainnet", outputs, privateKeyBip44AddressIndex0, bip44AddressIndex0, 0.001)
});
test('signTxOffline by address testnet', async () => {
const outputs = [{
txHash: 'b7e0b3bc15a94a080981b0164957bf20e45ddc4926ee9237ba1563c8d6b0048a',
index: 0,
script: Script.fromAddress(testnetBip44AddressIndex0).toString(),
value: 3796821615
} as UTXO]
signTxOffline("testnet", outputs, testnetPrivateKeyBip44AddressIndex0, testnetBip44AddressIndex0, 0.001)
});
})