Files
2026-07-18 13:39:48 -07:00

58 lines
2.3 KiB
TypeScript

import assert from 'node:assert/strict';
import { test } from 'node:test';
import { generateForeignWallet } from '../src/index';
test('foreign wallet derivation matches the Qortal Hub derivation convention', () => {
const seed = Uint8Array.from({ length: 32 }, (_, index) => index);
const original = [...seed];
const expected: Record<string, { address: string; extendedPublicKey: string }> = {
BTC: {
address: '1A9G3q16XmzmVDF72DvSZEK37ZzZUrNmK1',
extendedPublicKey:
'xpub661MyMwAqRbcFtt61PnRrkS3rTbfuoSzFdQToo7EWMYiDNoqdiBPczzQAUhxLRyRbdiVjLoT1noDubccztGBrGEzvj63fsS58UeGxfuyivb',
},
LTC: {
address: 'LYn1W4kqTV1KYcdBomcQ5HdKr9GprWhTY2',
extendedPublicKey:
'xpub661MyMwAqRbcEeGMkZu4CuQ2DQAs9N9tUSmyWSqZRvshiE5FQwcVzdaVj8dNkt618jxT2UGzvYs4eieqNU8GWQY6jPMuHR2SdSZicSgnJVZ',
},
DOGE: {
address: 'DFxiKGpTHGfyeyo67P7nzXJ57DxRArZy9q',
extendedPublicKey:
'dgub8kXBZ7ymNWy2TBrQUZ5vm9RVY3p1CK96HkfWU7BXLAXTEmUPSb1o7doAGnokfd8jhUAHK8qhRSbyiMWNTbGJzWdpTKeCSL7RorFvxk7ywk4',
},
DGB: {
address: 'DSdpkc557DEnhYm3QM66tK8DmrmjtVon6V',
extendedPublicKey:
'xpub661MyMwAqRbcG37CaNum4X7eZLavWF1NQ2wsz2tTSK78Ed4uCyZAFM85GHKNMogEQf4rYSM4NcaE65WkeXUjsFU6cKbxCfzBbiEAeJV2dqA',
},
RVN: {
address: 'RLDxaPHNqrBXDR1utACFqLzDq1jwUj7wug',
extendedPublicKey:
'xpub661MyMwAqRbcFcm4bHdVHhga8qn9mXuzYFvy6CnwR3C2LC3UgPNt1XP7yxv8wt3aRpnpUe3pLgAC3jFstrG41B6KTKEiV3Z3NEM7JozWRJf',
},
ARRR: {
address: 'h9BRoyJm2BdMGNGh81YRyxMeu4rv26dDZsm',
extendedPublicKey:
'xpub661MyMwAqRbcGHfBbYi8i2oGt4DmHQPGqQHst8Xsig653mgzn9KMBFtqiVrCLnnYSbqnqgN6zeujP3PDApoyyDMnS4hCCxTapKF7pZHReS7',
},
};
for (const [coin, vector] of Object.entries(expected)) {
const wallet = generateForeignWallet(seed, coin);
assert.equal(wallet.address, vector.address, `${coin} address`);
assert.equal(wallet.derivedMasterPublicKey, vector.extendedPublicKey, `${coin} xpub`);
assert.ok(wallet.seed58.length > 0, `${coin} seed material is generated internally`);
}
assert.deepEqual([...seed], original, 'derivation does not mutate the Qortal address seed');
});
test('foreign wallet derivation rejects unsupported coins', () => {
assert.throws(
() => generateForeignWallet(new Uint8Array(32), 'NOT_A_COIN'),
/Unsupported foreign blockchain/,
);
});