@btc-vision/transaction
Version:
OPNet transaction library allows you to create and sign transactions for the OPNet network.
219 lines (187 loc) • 7.89 kB
text/typescript
import { describe, expect, it } from 'vitest';
import { MLDSASecurityLevel, Mnemonic } from '../build/opnet.js';
import { networks } from '@btc-vision/bitcoin';
describe('Network Awareness', () => {
const testMnemonic =
'abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about';
describe('Mnemonic network awareness', () => {
it('should derive different classical keys for different networks', () => {
const mnemonicMainnet = new Mnemonic(
testMnemonic,
'',
networks.bitcoin,
MLDSASecurityLevel.LEVEL2,
);
const mnemonicTestnet = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const walletMainnet = mnemonicMainnet.derive(0);
const walletTestnet = mnemonicTestnet.derive(0);
// Classical private keys should be different
expect(walletMainnet.toPrivateKeyHex()).not.toBe(walletTestnet.toPrivateKeyHex());
});
it('should derive different quantum keys for different networks', () => {
const mnemonicMainnet = new Mnemonic(
testMnemonic,
'',
networks.bitcoin,
MLDSASecurityLevel.LEVEL2,
);
const mnemonicTestnet = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const walletMainnet = mnemonicMainnet.derive(0);
const walletTestnet = mnemonicTestnet.derive(0);
// Quantum private keys should be different
expect(walletMainnet.quantumPrivateKeyHex).not.toBe(walletTestnet.quantumPrivateKeyHex);
});
it('should generate correct address prefixes for mainnet', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.bitcoin,
MLDSASecurityLevel.LEVEL2,
);
const wallet = mnemonic.derive(0);
expect(wallet.p2tr).toMatch(/^bc1/);
expect(wallet.p2wpkh).toMatch(/^bc1/);
});
it('should generate correct address prefixes for testnet', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const wallet = mnemonic.derive(0);
expect(wallet.p2tr).toMatch(/^tb1/);
expect(wallet.p2wpkh).toMatch(/^tb1/);
});
it('should generate correct address prefixes for regtest', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.regtest,
MLDSASecurityLevel.LEVEL2,
);
const wallet = mnemonic.derive(0);
expect(wallet.p2tr).toMatch(/^bcrt1/);
expect(wallet.p2wpkh).toMatch(/^bcrt1/);
});
});
describe('opnetTestnet network awareness', () => {
it('should generate correct address prefixes for opnetTestnet', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.opnetTestnet,
MLDSASecurityLevel.LEVEL2,
);
const wallet = mnemonic.derive(0);
expect(wallet.p2tr).toMatch(/^opt1/);
expect(wallet.p2wpkh).toMatch(/^opt1/);
});
it('should derive same keys as testnet (same BIP32 version bytes)', () => {
const mnemonicTestnet = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const mnemonicOpnetTestnet = new Mnemonic(
testMnemonic,
'',
networks.opnetTestnet,
MLDSASecurityLevel.LEVEL2,
);
const walletTestnet = mnemonicTestnet.derive(0);
const walletOpnetTestnet = mnemonicOpnetTestnet.derive(0);
// Same BIP32 version bytes → same private keys
expect(walletOpnetTestnet.toPrivateKeyHex()).toBe(walletTestnet.toPrivateKeyHex());
expect(walletOpnetTestnet.quantumPrivateKeyHex).toBe(walletTestnet.quantumPrivateKeyHex);
// But addresses should differ due to different bech32 prefix
expect(walletOpnetTestnet.p2tr).not.toBe(walletTestnet.p2tr);
expect(walletOpnetTestnet.p2wpkh).not.toBe(walletTestnet.p2wpkh);
});
it('should preserve opnetTestnet through derivePath', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.opnetTestnet,
MLDSASecurityLevel.LEVEL2,
);
const parent = mnemonic.derive(0);
const child = parent.derivePath('m/0');
expect(child.network.bech32).toBe('opt');
expect(child.p2tr).toMatch(/^opt1/);
});
});
describe('Testnet and regtest parity', () => {
it('should derive same keys for testnet and regtest (BIP32 behavior)', () => {
const mnemonicTestnet = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const mnemonicRegtest = new Mnemonic(
testMnemonic,
'',
networks.regtest,
MLDSASecurityLevel.LEVEL2,
);
const walletTestnet = mnemonicTestnet.derive(0);
const walletRegtest = mnemonicRegtest.derive(0);
// Testnet and regtest should have same private keys (BIP32 uses same version bytes)
expect(walletTestnet.toPrivateKeyHex()).toBe(walletRegtest.toPrivateKeyHex());
expect(walletTestnet.quantumPrivateKeyHex).toBe(walletRegtest.quantumPrivateKeyHex);
// But addresses should differ due to different prefixes
expect(walletTestnet.p2tr).not.toBe(walletRegtest.p2tr);
expect(walletTestnet.p2wpkh).not.toBe(walletRegtest.p2wpkh);
});
});
describe('Network preservation through derivation', () => {
it('should preserve mainnet through derivePath', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.bitcoin,
MLDSASecurityLevel.LEVEL2,
);
const parent = mnemonic.derive(0);
const child = parent.derivePath('m/0');
expect(child.network.bech32).toBe('bc');
expect(child.p2tr).toMatch(/^bc1/);
});
it('should preserve testnet through derivePath', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.testnet,
MLDSASecurityLevel.LEVEL2,
);
const parent = mnemonic.derive(0);
const child = parent.derivePath('m/0');
expect(child.network.bech32).toBe('tb');
expect(child.p2tr).toMatch(/^tb1/);
});
it('should preserve regtest through derivePath', () => {
const mnemonic = new Mnemonic(
testMnemonic,
'',
networks.regtest,
MLDSASecurityLevel.LEVEL2,
);
const parent = mnemonic.derive(0);
const child = parent.derivePath('m/0');
expect(child.network.bech32).toBe('bcrt');
expect(child.p2tr).toMatch(/^bcrt1/);
});
});
});