58 lines
2.3 KiB
TypeScript
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/,
|
|
);
|
|
});
|