PHP WebShell
Текущая директория: /opt/BitGoJS/modules/abstract-utxo/dist/test/offlineVault
Просмотр файла: halfSigned.js
"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const fs = __importStar(require("fs"));
const assert_1 = __importDefault(require("assert"));
const crypto_1 = __importDefault(require("crypto"));
const t = __importStar(require("io-ts"));
const sdk_core_1 = require("@bitgo/sdk-core");
const utxolib = __importStar(require("@bitgo/utxo-lib"));
const offlineVault_1 = require("../../src/offlineVault");
const descriptor_1 = require("../../src/offlineVault/descriptor");
const fixtures_utils_1 = require("../transaction/descriptor/fixtures.utils");
const { assertEqualFixture } = (0, fixtures_utils_1.getFixtureRoot)(__dirname + '/fixtures');
function getFixturesNames() {
// I'm using sync here because mocha cannot do async setup
// eslint-disable-next-line no-sync
return fs.readdirSync(__dirname + '/fixtures').filter((f) => f.endsWith('.json') && !f.endsWith('.explanation.json'));
}
const KeyPair = t.intersection([t.type({ xpub: t.string }), t.partial({ xprv: t.string })]);
const KeyWithParent = t.intersection([KeyPair, t.partial({ parent: KeyPair })]);
const Fixture = t.type({
walletKeys: t.array(KeyWithParent),
response: t.unknown,
});
async function readFixture(name) {
const data = JSON.parse(await fs.promises.readFile(__dirname + '/fixtures/' + name, 'utf-8'));
return (0, sdk_core_1.decodeOrElse)('Fixture', Fixture, data, (e) => {
throw new Error(`failed to decode fixture ${name}: ${e}`);
});
}
function withRotatedXpubs(tx) {
const { user, backup, bitgo } = tx.xpubsWithDerivationPath;
return {
...tx,
xpubsWithDerivationPath: {
user: bitgo,
backup: user,
bitgo: backup,
},
};
}
function withRandomXpubs(tx) {
function randomXpub() {
const bytes = crypto_1.default.getRandomValues(new Uint8Array(32));
return utxolib.bip32.fromSeed(Buffer.from(bytes)).neutered().toBase58();
}
return {
...tx,
xpubsWithDerivationPath: {
user: randomXpub(),
backup: randomXpub(),
bitgo: randomXpub(),
},
};
}
function withoutDescriptors(tx) {
return {
...tx,
descriptors: [],
};
}
function getDerivationId(v) {
const id = v.user.derivedFromParentWithSeed;
(0, assert_1.default)(id);
return id;
}
function getRootPrv(walletKeys) {
(0, assert_1.default)(walletKeys[0]);
(0, assert_1.default)(walletKeys[0].parent);
(0, assert_1.default)(walletKeys[0].parent.xprv);
return utxolib.bip32.fromBase58(walletKeys[0].parent.xprv);
}
describe('OfflineVaultHalfSigned', function () {
for (const fixtureName of getFixturesNames()) {
it(`can sign fixture ${fixtureName}`, async function () {
const { walletKeys, response } = await readFixture(fixtureName);
(0, assert_1.default)(descriptor_1.DescriptorTransaction.is(response));
const rootPrv = getRootPrv(walletKeys);
const derivationId = getDerivationId(response.xpubsWithDerivationPath);
(0, offlineVault_1.createHalfSigned)('btc', rootPrv, derivationId, response);
const mutations = [withRotatedXpubs(response), withRandomXpubs(response), withoutDescriptors(response)];
for (const mutation of mutations) {
assert_1.default.throws(() => (0, offlineVault_1.createHalfSigned)('btc', rootPrv, derivationId, mutation));
}
await assertEqualFixture(fixtureName.replace(/\.json$/, '.explanation.json'), (0, offlineVault_1.getTransactionExplanation)('btc', response));
});
}
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFsZlNpZ25lZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Rlc3Qvb2ZmbGluZVZhdWx0L2hhbGZTaWduZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsb0RBQTRCO0FBQzVCLG9EQUE0QjtBQUU1Qix5Q0FBMkI7QUFDM0IsOENBQStDO0FBQy9DLHlEQUEyQztBQUUzQyx5REFBcUY7QUFDckYsa0VBQTBFO0FBQzFFLDZFQUEwRTtBQUUxRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUUsR0FBRyxJQUFBLCtCQUFjLEVBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxDQUFDO0FBRXZFLFNBQVMsZ0JBQWdCO0lBQ3ZCLDBEQUEwRDtJQUMxRCxtQ0FBbUM7SUFDbkMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLFNBQVMsR0FBRyxXQUFXLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztBQUN4SCxDQUFDO0FBRUQsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFNUYsTUFBTSxhQUFhLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBR2hGLE1B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QUFXLENBQUMsQ0FBQztZQUNoRSxJQUFBLGdCQUFNLEVBQUMsa0NBQXFCLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDM0MsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUN2RSxJQUFBLCtCQUFnQixFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3pELE1BQU0sU0FBUyxHQUFHLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQUUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxFQUFFLGtCQUFrQixDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7WUFDeEcsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztnQkFDakMsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBQSwrQkFBZ0IsRUFBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ2hGLENBQUM7WUFDRCxNQUFNLGtCQUFrQixDQUN0QixXQUFXLENBQUMsT0FBTyxDQUFDLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxFQUNuRCxJQUFBLHdDQUF5QixFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FDM0MsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnO1xuaW1wb3J0IGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0IGNyeXB0byBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgKiBhcyB0IGZyb20gJ2lvLXRzJztcbmltcG9ydCB7IGRlY29kZU9yRWxzZSB9IGZyb20gJ0BiaXRnby9zZGstY29yZSc7XG5pbXBvcnQgKiBhcyB1dHhvbGliIGZyb20gJ0BiaXRnby91dHhvLWxpYic7XG5cbmltcG9ydCB7IGNyZWF0ZUhhbGZTaWduZWQsIGdldFRyYW5zYWN0aW9uRXhwbGFuYXRpb24gfSBmcm9tICcuLi8uLi9zcmMvb2ZmbGluZVZhdWx0JztcbmltcG9ydCB7IERlc2NyaXB0b3JUcmFuc2FjdGlvbiB9IGZyb20gJy4uLy4uL3NyYy9vZmZsaW5lVmF1bHQvZGVzY3JpcHRvcic7XG5pbXBvcnQgeyBnZXRGaXh0dXJlUm9vdCB9IGZyb20gJy4uL3RyYW5zYWN0aW9uL2Rlc2NyaXB0b3IvZml4dHVyZXMudXRpbHMnO1xuXG5jb25zdCB7IGFzc2VydEVxdWFsRml4dHVyZSB9ID0gZ2V0Rml4dHVyZVJvb3QoX19kaXJuYW1lICsgJy9maXh0dXJlcycpO1xuXG5mdW5jdGlvbiBnZXRGaXh0dXJlc05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgLy8gSSdtIHVzaW5nIHN5bmMgaGVyZSBiZWNhdXNlIG1vY2hhIGNhbm5vdCBkbyBhc3luYyBzZXR1cFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc3luY1xuICByZXR1cm4gZnMucmVhZGRpclN5bmMoX19kaXJuYW1lICsgJy9maXh0dXJlcycpLmZpbHRlcigoZikgPT4gZi5lbmRzV2l0aCgnLmpzb24nKSAmJiAhZi5lbmRzV2l0aCgnLmV4cGxhbmF0aW9uLmpzb24nKSk7XG59XG5cbmNvbnN0IEtleVBhaXIgPSB0LmludGVyc2VjdGlvbihbdC50eXBlKHsgeHB1YjogdC5zdHJpbmcgfSksIHQucGFydGlhbCh7IHhwcnY6IHQuc3RyaW5nIH0pXSk7XG5cbmNvbnN0IEtleVdpdGhQYXJlbnQgPSB0LmludGVyc2VjdGlvbihbS2V5UGFpciwgdC5wYXJ0aWFsKHsgcGFyZW50OiBLZXlQYWlyIH0pXSk7XG50eXBlIEtleVdpdGhQYXJlbnQgPSB0LlR5cGVPZjx0eXBlb2YgS2V5V2l0aFBhcmVudD47XG5cbmNvbnN0IEZpeHR1cmUgPSB0LnR5cGUoe1xuICB3YWxsZXRLZXlzOiB0LmFycmF5KEtleVdpdGhQYXJlbnQpLFxuICByZXNwb25zZTogdC51bmtub3duLFxufSk7XG5cbnR5cGUgRml4dHVyZSA9IHQuVHlwZU9mPHR5cGVvZiBGaXh0dXJlPjtcblxuYXN5bmMgZnVuY3Rpb24gcmVhZEZpeHR1cmUobmFtZTogc3RyaW5nKTogUHJvbWlzZTxGaXh0dXJlPiB7XG4gIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGF3YWl0IGZzLnByb21pc2VzLnJlYWRGaWxlKF9fZGlybmFtZSArICcvZml4dHVyZXMvJyArIG5hbWUsICd1dGYtOCcpKTtcbiAgcmV0dXJuIGRlY29kZU9yRWxzZSgnRml4dHVyZScsIEZpeHR1cmUsIGRhdGEsIChlKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBmYWlsZWQgdG8gZGVjb2RlIGZpeHR1cmUgJHtuYW1lfTogJHtlfWApO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gd2l0aFJvdGF0ZWRYcHVicyh0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uKTogRGVzY3JpcHRvclRyYW5zYWN0aW9uIHtcbiAgY29uc3QgeyB1c2VyLCBiYWNrdXAsIGJpdGdvIH0gPSB0eC54cHVic1dpdGhEZXJpdmF0aW9uUGF0aDtcbiAgcmV0dXJuIHtcbiAgICAuLi50eCxcbiAgICB4cHVic1dpdGhEZXJpdmF0aW9uUGF0aDoge1xuICAgICAgdXNlcjogYml0Z28sXG4gICAgICBiYWNrdXA6IHVzZXIsXG4gICAgICBiaXRnbzogYmFja3VwLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpdGhSYW5kb21YcHVicyh0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uKSB7XG4gIGZ1bmN0aW9uIHJhbmRvbVhwdWIoKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBjcnlwdG8uZ2V0UmFuZG9tVmFsdWVzKG5ldyBVaW50OEFycmF5KDMyKSk7XG4gICAgcmV0dXJuIHV0eG9saWIuYmlwMzIuZnJvbVNlZWQoQnVmZmVyLmZyb20oYnl0ZXMpKS5uZXV0ZXJlZCgpLnRvQmFzZTU4KCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi50eCxcbiAgICB4cHVic1dpdGhEZXJpdmF0aW9uUGF0aDoge1xuICAgICAgdXNlcjogcmFuZG9tWHB1YigpLFxuICAgICAgYmFja3VwOiByYW5kb21YcHViKCksXG4gICAgICBiaXRnbzogcmFuZG9tWHB1YigpLFxuICAgIH0sXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdpdGhvdXREZXNjcmlwdG9ycyh0eDogRGVzY3JpcHRvclRyYW5zYWN0aW9uKTogRGVzY3JpcHRvclRyYW5zYWN0aW9uIHtcbiAgcmV0dXJuIHtcbiAgICAuLi50eCxcbiAgICBkZXNjcmlwdG9yczogW10sXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldERlcml2YXRpb25JZCh2OiBEZXNjcmlwdG9yVHJhbnNhY3Rpb25bJ3hwdWJzV2l0aERlcml2YXRpb25QYXRoJ10pOiBzdHJpbmcge1xuICBjb25zdCBpZCA9IHYudXNlci5kZXJpdmVkRnJvbVBhcmVudFdpdGhTZWVkO1xuICBhc3NlcnQoaWQpO1xuICByZXR1cm4gaWQ7XG59XG5cbmZ1bmN0aW9uIGdldFJvb3RQcnYod2FsbGV0S2V5czogS2V5V2l0aFBhcmVudFtdKTogdXR4b2xpYi5CSVAzMkludGVyZmFjZSB7XG4gIGFzc2VydCh3YWxsZXRLZXlzWzBdKTtcbiAgYXNzZXJ0KHdhbGxldEtleXNbMF0ucGFyZW50KTtcbiAgYXNzZXJ0KHdhbGxldEtleXNbMF0ucGFyZW50LnhwcnYpO1xuICByZXR1cm4gdXR4b2xpYi5iaXAzMi5mcm9tQmFzZTU4KHdhbGxldEtleXNbMF0ucGFyZW50LnhwcnYpO1xufVxuXG5kZXNjcmliZSgnT2ZmbGluZVZhdWx0SGFsZlNpZ25lZCcsIGZ1bmN0aW9uICgpIHtcbiAgZm9yIChjb25zdCBmaXh0dXJlTmFtZSBvZiBnZXRGaXh0dXJlc05hbWVzKCkpIHtcbiAgICBpdChgY2FuIHNpZ24gZml4dHVyZSAke2ZpeHR1cmVOYW1lfWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHsgd2FsbGV0S2V5cywgcmVzcG9uc2UgfSA9IGF3YWl0IHJlYWRGaXh0dXJlKGZpeHR1cmVOYW1lKTtcbiAgICAgIGFzc2VydChEZXNjcmlwdG9yVHJhbnNhY3Rpb24uaXMocmVzcG9uc2UpKTtcbiAgICAgIGNvbnN0IHJvb3RQcnYgPSBnZXRSb290UHJ2KHdhbGxldEtleXMpO1xuICAgICAgY29uc3QgZGVyaXZhdGlvbklkID0gZ2V0RGVyaXZhdGlvbklkKHJlc3BvbnNlLnhwdWJzV2l0aERlcml2YXRpb25QYXRoKTtcbiAgICAgIGNyZWF0ZUhhbGZTaWduZWQoJ2J0YycsIHJvb3RQcnYsIGRlcml2YXRpb25JZCwgcmVzcG9uc2UpO1xuICAgICAgY29uc3QgbXV0YXRpb25zID0gW3dpdGhSb3RhdGVkWHB1YnMocmVzcG9uc2UpLCB3aXRoUmFuZG9tWHB1YnMocmVzcG9uc2UpLCB3aXRob3V0RGVzY3JpcHRvcnMocmVzcG9uc2UpXTtcbiAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zKSB7XG4gICAgICAgIGFzc2VydC50aHJvd3MoKCkgPT4gY3JlYXRlSGFsZlNpZ25lZCgnYnRjJywgcm9vdFBydiwgZGVyaXZhdGlvbklkLCBtdXRhdGlvbikpO1xuICAgICAgfVxuICAgICAgYXdhaXQgYXNzZXJ0RXF1YWxGaXh0dXJlKFxuICAgICAgICBmaXh0dXJlTmFtZS5yZXBsYWNlKC9cXC5qc29uJC8sICcuZXhwbGFuYXRpb24uanNvbicpLFxuICAgICAgICBnZXRUcmFuc2FjdGlvbkV4cGxhbmF0aW9uKCdidGMnLCByZXNwb25zZSlcbiAgICAgICk7XG4gICAgfSk7XG4gIH1cbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!