PHP WebShell
Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo/legacysafe
Просмотр файла: index.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const legacysafe_1 = require("../../../src/bitgo/legacysafe");
const testutil_1 = require("../../../src/testutil");
const assert = require("assert");
const src_1 = require("../../../src");
const address_1 = require("../../../src/address");
describe('public key conversion', function () {
const compressedKeyPair = (0, testutil_1.getKey)('utxo');
const uncompressedPublicKeyHex = '048b9c36721d4c9d9c46c796039ccab17cb89df246ff991720fb119990cbc049969445c874ae1272aa0d3f94087cd2f210c90036aff09d3bc521b01098f7cce3b5';
it('converts compressed to uncompressed', function () {
const uncompressedPub = (0, legacysafe_1.toUncompressedPub)(compressedKeyPair.publicKey);
assert.strictEqual(uncompressedPub.length, 65);
assert.strictEqual(uncompressedPub.toString('hex'), uncompressedPublicKeyHex);
});
it('keeps compressed as compressed', function () {
const compressedPub = (0, legacysafe_1.toCompressedPub)(compressedKeyPair.publicKey);
assert.strictEqual(compressedPub.length, 33);
assert.strictEqual(compressedPub.toString('hex'), compressedKeyPair.publicKey.toString('hex'));
});
it('converts uncompressed to compressed', function () {
const uncompressedPub = (0, legacysafe_1.toUncompressedPub)(compressedKeyPair.publicKey);
const compressedPub = (0, legacysafe_1.toCompressedPub)(uncompressedPub);
assert.strictEqual(compressedPub.length, 33);
assert.strictEqual(compressedPub.toString('hex'), compressedKeyPair.publicKey.toString('hex'));
});
});
describe('legacy safe scripts creation', function () {
const compressedKeyPairs = (0, testutil_1.getKeyTriple)('utxo');
it('throws error for invalid public keys', function () {
assert.throws(() => (0, legacysafe_1.createLegacySafeOutputScript2of3)([Buffer.alloc(10), Buffer.alloc(11), Buffer.alloc(12)], src_1.networks.bitcoin), /^Error: Unexpected key length 10, neither compressed nor uncompressed.$/);
});
it('creates output script for legacy safe wallet', function () {
const uncompressedKeyPairs = compressedKeyPairs.map((keyPair) => (0, legacysafe_1.toUncompressedPub)(keyPair.publicKey));
const uncompressedPubKeysAddress = '3B8ySJRmah2bSFin39kkTz7Fe8soVJx9Vf';
const uncompressedPubKeysScriptSize = 201; // bytes;
const script = (0, legacysafe_1.createLegacySafeOutputScript2of3)(uncompressedKeyPairs, src_1.networks.bitcoin);
assert.strictEqual(script.redeemScript.length, uncompressedPubKeysScriptSize); // bytes
assert.strictEqual(script.scriptPubKey.length, 23); // bytes;
assert.strictEqual((0, address_1.fromOutputScript)(script.scriptPubKey, src_1.networks.bitcoin), uncompressedPubKeysAddress);
});
it('creates deterministic uncompressed public keys and address for v1 safe wallet', function () {
const uncompressedKeyPairs = (0, testutil_1.getUncompressedKeyTriple)([12414, 546456, 65856546]);
const uncompressedPubKeys = uncompressedKeyPairs.map((keyPair) => keyPair.publicKey);
const outputScript = (0, legacysafe_1.createLegacySafeOutputScript2of3)(uncompressedPubKeys, src_1.networks.testnet);
assert.strictEqual(outputScript.scriptPubKey.length, 23);
assert.strictEqual(outputScript.redeemScript.length, 201);
assert.strictEqual(outputScript.scriptPubKey.toString('hex'), 'a9146e9fb0db60f4fc5974885c392815b58e6505a30d87');
assert.strictEqual(outputScript.redeemScript.toString('hex'), '524104b9aea0bf6be18d3ed48d1cc3495e9af5e499ad90a84930990ba58b198ee81b5e83f6aa2f617c04401616e844f51802c0f1d827422efc1f3856dc222dd8beed16410435e9d7c48e3a5254d5881b60abf004cf6eedc6ab842393caa2fdd20d6d0ad170cc32c4664603de3e9b9d1fd01b070d192fad570fcbb3b185c034ec5a4a0b1fb44104466d7fcae563e5cb09a0d1870bb580344804617879a14949cf22285f1bae3f276728176c3c6431f8eeda4538dc37c865e2784f3a9e77d044f33e407797e1278a53ae');
const addressTestnet = (0, address_1.fromOutputScript)(outputScript.scriptPubKey, src_1.networks.testnet);
assert.strictEqual(addressTestnet, '2N3L9cu9WN2Df7Xvb1Y8owokuDVj5Hdyv4i');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90ZXN0L2JpdGdvL2xlZ2FjeXNhZmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSw4REFBcUg7QUFDckgsb0RBQXVGO0FBQ3ZGLGlDQUFpQztBQUNqQyxzQ0FBd0M7QUFDeEMsa0RBQXdEO0FBRXhELFFBQVEsQ0FBQyx1QkFBdUIsRUFBRTtJQUNoQyxNQUFNLGlCQUFpQixHQUFHLElBQUEsaUJBQU0sRUFBQyxNQUFNLENBQUMsQ0FBQztJQUN6QyxNQUFNLHdCQUF3QixHQUM1QixvSUFBb0ksQ0FBQztJQUV2SSxFQUFFLENBQUMscUNBQXFDLEVBQUU7UUFDeEMsTUFBTSxlQUFlLEdBQUcsSUFBQSw4QkFBaUIsRUFBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RSxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDL0MsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFDaEYsQ0FBQyxDQUFDLENBQUM7SUFFSCxFQUFFLENBQUMsZ0NBQWdDLEVBQUU7UUFDbkMsTUFBTSxhQUFhLEdBQUcsSUFBQSw0QkFBZSxFQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sQ0FBQyxXQUFXLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUM3QyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUMsQ0FBQyxDQUFDO0lBRUgsRUFBRSxDQUFDLHFDQUFxQyxFQUFFO1FBQ3hDLE1BQU0sZUFBZSxHQUFHLElB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LFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFDekMsb1pBQW9aLENBQ3JaLENBQUM7UUFFRixNQUFNLGNBQWMsR0FBRyxJQUFBLDBCQUFnQixFQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsY0FBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3JGLE1BQU0sQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFDNUUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHRvVW5jb21wcmVzc2VkUHViLCB0b0NvbXByZXNzZWRQdWIsIGNyZWF0ZUxlZ2FjeVNhZmVPdXRwdXRTY3JpcHQyb2YzIH0gZnJvbSAnLi4vLi4vLi4vc3JjL2JpdGdvL2xlZ2FjeXNhZmUnO1xuaW1wb3J0IHsgZ2V0S2V5LCBnZXRLZXlUcmlwbGUsIGdldFVuY29tcHJlc3NlZEtleVRyaXBsZSB9IGZyb20gJy4uLy4uLy4uL3NyYy90ZXN0dXRpbCc7XG5pbXBvcnQgKiBhcyBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCB7IG5ldHdvcmtzIH0gZnJvbSAnLi4vLi4vLi4vc3JjJztcbmltcG9ydCB7IGZyb21PdXRwdXRTY3JpcHQgfSBmcm9tICcuLi8uLi8uLi9zcmMvYWRkcmVzcyc7XG5cbmRlc2NyaWJlKCdwdWJsaWMga2V5IGNvbnZlcnNpb24nLCBmdW5jdGlvbiAoKSB7XG4gIGNvbnN0IGNvbXByZXNzZWRLZXlQYWlyID0gZ2V0S2V5KCd1dHhvJyk7XG4gIGNvbnN0IHVuY29tcHJlc3NlZFB1YmxpY0tleUhleCA9XG4gICAgJzA0OGI5YzM2NzIxZDRjOWQ5YzQ2Yzc5NjAzOWNjYWIxN2NiODlkZjI0NmZmOTkxNzIwZmIxMTk5OTBjYmMwNDk5Njk0NDVjODc0YWUxMjcyYWEwZDNmOTQwODdjZDJmMjEwYzkwMDM2YWZmMDlkM2JjNTIxYjAxMDk4ZjdjY2UzYjUnO1xuXG4gIGl0KCdjb252ZXJ0cyBjb21wcmVzc2VkIHRvIHVuY29tcHJlc3NlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRQdWIgPSB0b1VuY29tcHJlc3NlZFB1Yihjb21wcmVzc2VkS2V5UGFpci5wdWJsaWNLZXkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbCh1bmNvbXByZXNzZWRQdWIubGVuZ3RoLCA2NSk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKHVuY29tcHJlc3NlZFB1Yi50b1N0cmluZygnaGV4JyksIHVuY29tcHJlc3NlZFB1YmxpY0tleUhleCk7XG4gIH0pO1xuXG4gIGl0KCdrZWVwcyBjb21wcmVzc2VkIGFzIGNvbXByZXNzZWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgY29tcHJlc3NlZFB1YiA9IHRvQ29tcHJlc3NlZFB1Yihjb21wcmVzc2VkS2V5UGFpci5wdWJsaWNLZXkpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21wcmVzc2VkUHViLmxlbmd0aCwgMzMpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChjb21wcmVzc2VkUHViLnRvU3RyaW5nKCdoZXgnKSwgY29tcHJlc3NlZEtleVBhaXIucHVibGljS2V5LnRvU3RyaW5nKCdoZXgnKSk7XG4gIH0pO1xuXG4gIGl0KCdjb252ZXJ0cyB1bmNvbXByZXNzZWQgdG8gY29tcHJlc3NlZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB1bmNvbXByZXNzZWRQdWIgPSB0b1VuY29tcHJlc3NlZFB1Yihjb21wcmVzc2VkS2V5UGFpci5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IGNvbXByZXNzZWRQdWIgPSB0b0NvbXByZXNzZWRQdWIodW5jb21wcmVzc2VkUHViKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tcHJlc3NlZFB1Yi5sZW5ndGgsIDMzKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoY29tcHJlc3NlZFB1Yi50b1N0cmluZygnaGV4JyksIGNvbXByZXNzZWRLZXlQYWlyLnB1YmxpY0tleS50b1N0cmluZygnaGV4JykpO1xuICB9KTtcbn0pO1xuXG5kZXNjcmliZSgnbGVnYWN5IHNhZmUgc2NyaXB0cyBjcmVhdGlvbicsIGZ1bmN0aW9uICgpIHtcbiAgY29uc3QgY29tcHJlc3NlZEtleVBhaXJzID0gZ2V0S2V5VHJpcGxlKCd1dHhvJyk7XG5cbiAgaXQoJ3Rocm93cyBlcnJvciBmb3IgaW52YWxpZCBwdWJsaWMga2V5cycsIGZ1bmN0aW9uICgpIHtcbiAgICBhc3NlcnQudGhyb3dzKFxuICAgICAgKCkgPT4gY3JlYXRlTGVnYWN5U2FmZU91dHB1dFNjcmlwdDJvZjMoW0J1ZmZlci5hbGxvYygxMCksIEJ1ZmZlci5hbGxvYygxMSksIEJ1ZmZlci5hbGxvYygxMildLCBuZXR3b3Jrcy5iaXRjb2luKSxcbiAgICAgIC9eRXJyb3I6IFVuZXhwZWN0ZWQga2V5IGxlbmd0aCAxMCwgbmVpdGhlciBjb21wcmVzc2VkIG5vciB1bmNvbXByZXNzZWQuJC9cbiAgICApO1xuICB9KTtcblxuICBpdCgnY3JlYXRlcyBvdXRwdXQgc2NyaXB0IGZvciBsZWdhY3kgc2FmZSB3YWxsZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdW5jb21wcmVzc2VkS2V5UGFpcnMgPSBjb21wcmVzc2VkS2V5UGFpcnMubWFwKChrZXlQYWlyKSA9PiB0b1VuY29tcHJlc3NlZFB1YihrZXlQYWlyLnB1YmxpY0tleSkpO1xuICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YktleXNBZGRyZXNzID0gJzNCOHlTSlJtYWgyYlNGaW4zOWtrVHo3RmU4c29WSng5VmYnO1xuICAgIGNvbnN0IHVuY29tcHJlc3NlZFB1YktleXNTY3JpcHRTaXplID0gMjAxOyAvLyBieXRlcztcblxuICAgIGNvbnN0IHNjcmlwdCA9IGNyZWF0ZUxlZ2FjeVNhZmVPdXRwdXRTY3JpcHQyb2YzKHVuY29tcHJlc3NlZEtleVBhaXJzLCBuZXR3b3Jrcy5iaXRjb2luKTtcblxuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHQucmVkZWVtU2NyaXB0Lmxlbmd0aCwgdW5jb21wcmVzc2VkUHViS2V5c1NjcmlwdFNpemUpOyAvLyBieXRlc1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChzY3JpcHQuc2NyaXB0UHViS2V5Lmxlbmd0aCwgMjMpOyAvLyBieXRlcztcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoZnJvbU91dHB1dFNjcmlwdChzY3JpcHQuc2NyaXB0UHViS2V5LCBuZXR3b3Jrcy5iaXRjb2luKSwgdW5jb21wcmVzc2VkUHViS2V5c0FkZHJlc3MpO1xuICB9KTtcblxuICBpdCgnY3JlYXRlcyBkZXRlcm1pbmlzdGljIHVuY29tcHJlc3NlZCBwdWJsaWMga2V5cyBhbmQgYWRkcmVzcyBmb3IgdjEgc2FmZSB3YWxsZXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgdW5jb21wcmVzc2VkS2V5UGFpcnMgPSBnZXRVbmNvbXByZXNzZWRLZXlUcmlwbGUoWzEyNDE0LCA1NDY0NTYsIDY1ODU2NTQ2XSk7XG4gICAgY29uc3QgdW5jb21wcmVzc2VkUHViS2V5cyA9IHVuY29tcHJlc3NlZEtleVBhaXJzLm1hcCgoa2V5UGFpcikgPT4ga2V5UGFpci5wdWJsaWNLZXkpO1xuICAgIGNvbnN0IG91dHB1dFNjcmlwdCA9IGNyZWF0ZUxlZ2FjeVNhZmVPdXRwdXRTY3JpcHQyb2YzKHVuY29tcHJlc3NlZFB1YktleXMsIG5ldHdvcmtzLnRlc3RuZXQpO1xuXG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dFNjcmlwdC5zY3JpcHRQdWJLZXkubGVuZ3RoLCAyMyk7XG4gICAgYXNzZXJ0LnN0cmljdEVxdWFsKG91dHB1dFNjcmlwdC5yZWRlZW1TY3JpcHQubGVuZ3RoLCAyMDEpO1xuICAgIGFzc2VydC5zdHJpY3RFcXVhbChvdXRwdXRTY3JpcHQuc2NyaXB0UHViS2V5LnRvU3RyaW5nKCdoZXgnKSwgJ2E5MTQ2ZTlmYjBkYjYwZjRmYzU5NzQ4ODVjMzkyODE1YjU4ZTY1MDVhMzBkODcnKTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoXG4gICAgICBvdXRwdXRTY3JpcHQucmVkZWVtU2NyaXB0LnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgICc1MjQxMDRiOWFlYTBiZjZiZTE4ZDNlZDQ4ZDFjYzM0OTVlOWFmNWU0OTlhZDkwYTg0OTMwOTkwYmE1OGIxOThlZTgxYjVlODNmNmFhMmY2MTdjMDQ0MDE2MTZlODQ0ZjUxODAyYzBmMWQ4Mjc0MjJlZmMxZjM4NTZkYzIyMmRkOGJlZWQxNjQxMDQzNWU5ZDdjNDhlM2E1MjU0ZDU4ODFiNjBhYmYwMDRjZjZlZWRjNmFiODQyMzkzY2FhMmZkZDIwZDZkMGFkMTcwY2MzMmM0NjY0NjAzZGUzZTliOWQxZmQwMWIwNzBkMTkyZmFkNTcwZmNiYjNiMTg1YzAzNGVjNWE0YTBiMWZiNDQxMDQ0NjZkN2ZjYWU1NjNlNWNiMDlhMGQxODcwYmI1ODAzNDQ4MDQ2MTc4NzlhMTQ5NDljZjIyMjg1ZjFiYWUzZjI3NjcyODE3NmMzYzY0MzFmOGVlZGE0NTM4ZGMzN2M4NjVlMjc4NGYzYTllNzdkMDQ0ZjMzZTQwNzc5N2UxMjc4YTUzYWUnXG4gICAgKTtcblxuICAgIGNvbnN0IGFkZHJlc3NUZXN0bmV0ID0gZnJvbU91dHB1dFNjcmlwdChvdXRwdXRTY3JpcHQuc2NyaXB0UHViS2V5LCBuZXR3b3Jrcy50ZXN0bmV0KTtcbiAgICBhc3NlcnQuc3RyaWN0RXF1YWwoYWRkcmVzc1Rlc3RuZXQsICcyTjNMOWN1OVdOMkRmN1h2YjFZOG93b2t1RFZqNUhkeXY0aScpO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!