PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-core/dist/src/bitgo/recovery

Просмотр файла: initiate.js

"use strict";
/**
 * @prettier
 */
Object.defineProperty(exports, "__esModule", { value: true });
exports.getKrsProvider = getKrsProvider;
exports.checkKrsProvider = checkKrsProvider;
exports.getIsKrsRecovery = getIsKrsRecovery;
exports.getIsUnsignedSweep = getIsUnsignedSweep;
exports.validateKey = validateKey;
exports.getBip32Keys = getBip32Keys;
const utxo_lib_1 = require("@bitgo/utxo-lib");
const config_1 = require("../config");
/**
 * @param coin
 * @param krsProviderName
 * @param checkCoinFamilySupport - assert that krsProvider explicitly supports coin
 * @return KrsProvider
 */
function getKrsProvider(coin, krsProviderName, { checkCoinFamilySupport = true } = {}) {
    if (!krsProviderName) {
        throw new Error(`no krsProvider name`);
    }
    const krsProvider = config_1.krsProviders[krsProviderName];
    if (krsProvider === undefined) {
        throw new Error('unknown key recovery service provider');
    }
    if (checkCoinFamilySupport && !krsProvider.supportedCoins.includes(coin.getFamily())) {
        throw new Error('specified key recovery service does not support recoveries for this coin');
    }
    return krsProvider;
}
/**
 * Wrapper for {@see getKrsProvider} returning void
 */
function checkKrsProvider(coin, krsProviderName, options = {}) {
    getKrsProvider(coin, krsProviderName, options);
}
function getIsKrsRecovery({ backupKey, userKey }) {
    return backupKey.startsWith('xpub') && !userKey.startsWith('xpub');
}
function getIsUnsignedSweep({ backupKey, userKey, isTss, }) {
    if (isTss) {
        try {
            return typeof JSON.parse(backupKey) === 'string' && typeof JSON.parse(userKey) === 'string';
        }
        catch (e) {
            return true;
        }
    }
    return backupKey.startsWith('xpub') && userKey.startsWith('xpub');
}
function validateKey(bitgo, { key, source, passphrase, isUnsignedSweep, isKrsRecovery }) {
    if (!key.startsWith('xprv') && !isUnsignedSweep) {
        // Try to decrypt the key
        try {
            if (source === 'user' || (source === 'backup' && !isKrsRecovery)) {
                return utxo_lib_1.bip32.fromBase58(bitgo.decrypt({ password: passphrase, input: key }));
            }
        }
        catch (e) {
            throw new Error(`Failed to decrypt ${source} key with passcode - try again!`);
        }
    }
    try {
        return utxo_lib_1.bip32.fromBase58(key);
    }
    catch (e) {
        throw new Error(`Failed to validate ${source} key - try again!`);
    }
}
function getBip32Keys(bitgo, params, { requireBitGoXpub }) {
    const isKrsRecovery = getIsKrsRecovery(params);
    const isUnsignedSweep = getIsUnsignedSweep(params);
    const keys = [
        // Box A
        validateKey(bitgo, {
            key: params.userKey,
            source: 'user',
            passphrase: params.walletPassphrase,
            isKrsRecovery,
            isUnsignedSweep,
        }),
        // Box B
        validateKey(bitgo, {
            key: params.backupKey,
            source: 'backup',
            passphrase: params.walletPassphrase,
            isKrsRecovery,
            isUnsignedSweep,
        }),
    ];
    if (requireBitGoXpub) {
        if (!params.bitgoKey) {
            throw new Error(`BitGo xpub required but not provided`);
        }
        try {
            // Box C
            keys.push(utxo_lib_1.bip32.fromBase58(params.bitgoKey));
        }
        catch (e) {
            throw new Error('Failed to parse bitgo xpub!');
        }
    }
    return keys;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYml0Z28vcmVjb3ZlcnkvaW5pdGlhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOztHQUVHOztBQXNDSCx3Q0FvQkM7QUFLRCw0Q0FNQztBQUVELDRDQUVDO0FBRUQsZ0RBaUJDO0FBRUQsa0NBbUJDO0FBRUQsb0NBdUNDO0FBeEpELDhDQUF3RDtBQUd4RCxzQ0FBc0Q7QUEyQnREOzs7OztHQUtHO0FBQ0gsU0FBZ0IsY0FBYyxDQUM1QixJQUFjLEVBQ2QsZUFBbUMsRUFDbkMsRUFBRSxzQkFBc0IsR0FBRyxJQUFJLEtBQTRCLEVBQUU7SUFFN0QsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsTUFBTSxXQUFXLEdBQUcscUJBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVsRCxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELElBQUksc0JBQXNCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDO1FBQ3JGLE1BQU0sSUFBSSxLQUFLLENBQUMsMEVBQTBFLENBQUMsQ0FBQztJQUM5RixDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0IsZ0JBQWdCLENBQzlCLElBQWMsRUFDZCxlQUFtQyxFQUNuQyxVQUFpQyxFQUFFO0lBRW5DLGNBQWMsQ0FBQyxJQUFJLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBRSxP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WUFDUixJQUFJLENBQUMsSUFBSSxDQUFDLGdCQUFLLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQy9DLENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAcHJldHRpZXJcbiAqL1xuXG5pbXBvcnQgeyBiaXAzMiwgQklQMzJJbnRlcmZhY2UgfSBmcm9tICdAYml0Z28vdXR4by1saWInO1xuaW1wb3J0IHsgQmFzZUNvaW4gfSBmcm9tICcuLi9iYXNlQ29pbic7XG5pbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICcuLi9iaXRnb0Jhc2UnO1xuaW1wb3J0IHsgS3JzUHJvdmlkZXIsIGtyc1Byb3ZpZGVycyB9IGZyb20gJy4uL2NvbmZpZyc7XG5cbmludGVyZmFjZSBWYWxpZGF0ZUtleU9wdGlvbnMge1xuICBrZXk6IHN0cmluZztcbiAgc291cmNlOiBzdHJpbmc7XG4gIHBhc3NwaHJhc2U/OiBzdHJpbmc7XG4gIGlzVW5zaWduZWRTd2VlcDogYm9vbGVhbjtcbiAgaXNLcnNSZWNvdmVyeTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJbml0aWF0ZVJlY292ZXJ5T3B0aW9ucyB7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIGJpdGdvS2V5Pzogc3RyaW5nOyAvLyBvcHRpb25hbCBmb3IgeHJwIHJlY292ZXJpZXNcbiAgcmVjb3ZlcnlEZXN0aW5hdGlvbjogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYXRlQ29uc29saWRhdGlvblJlY292ZXJ5T3B0aW9ucyB7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIGJpdGdvS2V5Pzogc3RyaW5nO1xuICB3YWxsZXRQYXNzcGhyYXNlPzogc3RyaW5nO1xufVxuXG50eXBlIEdldEtyc1Byb3ZpZGVyT3B0aW9ucyA9IHsgY2hlY2tDb2luRmFtaWx5U3VwcG9ydD86IGJvb2xlYW4gfTtcblxuLyoqXG4gKiBAcGFyYW0gY29pblxuICogQHBhcmFtIGtyc1Byb3ZpZGVyTmFtZVxuICogQHBhcmFtIGNoZWNrQ29pbkZhbWlseVN1cHBvcnQgLSBhc3NlcnQgdGhhdCBrcnNQcm92aWRlciBleHBsaWNpdGx5IHN1cHBvcnRzIGNvaW5cbiAqIEByZXR1cm4gS3JzUHJvdmlkZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEtyc1Byb3ZpZGVyKFxuICBjb2luOiBCYXNlQ29pbixcbiAga3JzUHJvdmlkZXJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHsgY2hlY2tDb2luRmFtaWx5U3VwcG9ydCA9IHRydWUgfTogR2V0S3JzUHJvdmlkZXJPcHRpb25zID0ge31cbik6IEtyc1Byb3ZpZGVyIHtcbiAgaWYgKCFrcnNQcm92aWRlck5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYG5vIGtyc1Byb3ZpZGVyIG5hbWVgKTtcbiAgfVxuXG4gIGNvbnN0IGtyc1Byb3ZpZGVyID0ga3JzUHJvdmlkZXJzW2tyc1Byb3ZpZGVyTmFtZV07XG5cbiAgaWYgKGtyc1Byb3ZpZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24ga2V5IHJlY292ZXJ5IHNlcnZpY2UgcHJvdmlkZXInKTtcbiAgfVxuXG4gIGlmIChjaGVja0NvaW5GYW1pbHlTdXBwb3J0ICYmICFrcnNQcm92aWRlci5zdXBwb3J0ZWRDb2lucy5pbmNsdWRlcyhjb2luLmdldEZhbWlseSgpKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignc3BlY2lmaWVkIGtleSByZWNvdmVyeSBzZXJ2aWNlIGRvZXMgbm90IHN1cHBvcnQgcmVjb3ZlcmllcyBmb3IgdGhpcyBjb2luJyk7XG4gIH1cblxuICByZXR1cm4ga3JzUHJvdmlkZXI7XG59XG5cbi8qKlxuICogV3JhcHBlciBmb3Ige0BzZWUgZ2V0S3JzUHJvdmlkZXJ9IHJldHVybmluZyB2b2lkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0tyc1Byb3ZpZGVyKFxuICBjb2luOiBCYXNlQ29pbixcbiAga3JzUHJvdmlkZXJOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIG9wdGlvbnM6IEdldEtyc1Byb3ZpZGVyT3B0aW9ucyA9IHt9XG4pOiB2b2lkIHtcbiAgZ2V0S3JzUHJvdmlkZXIoY29pbiwga3JzUHJvdmlkZXJOYW1lLCBvcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldElzS3JzUmVjb3ZlcnkoeyBiYWNrdXBLZXksIHVzZXJLZXkgfTogeyBiYWNrdXBLZXk6IHN0cmluZzsgdXNlcktleTogc3RyaW5nIH0pOiBib29sZWFuIHtcbiAgcmV0dXJuIGJhY2t1cEtleS5zdGFydHNXaXRoKCd4cHViJykgJiYgIXVzZXJLZXkuc3RhcnRzV2l0aCgneHB1YicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SXNVbnNpZ25lZFN3ZWVwKHtcbiAgYmFja3VwS2V5LFxuICB1c2VyS2V5LFxuICBpc1Rzcyxcbn06IHtcbiAgYmFja3VwS2V5OiBzdHJpbmc7XG4gIHVzZXJLZXk6IHN0cmluZztcbiAgaXNUc3M/OiBib29sZWFuO1xufSk6IGJvb2xlYW4ge1xuICBpZiAoaXNUc3MpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHR5cGVvZiBKU09OLnBhcnNlKGJhY2t1cEtleSkgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBKU09OLnBhcnNlKHVzZXJLZXkpID09PSAnc3RyaW5nJztcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhY2t1cEtleS5zdGFydHNXaXRoKCd4cHViJykgJiYgdXNlcktleS5zdGFydHNXaXRoKCd4cHViJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUtleShcbiAgYml0Z286IEJpdEdvQmFzZSxcbiAgeyBrZXksIHNvdXJjZSwgcGFzc3BocmFzZSwgaXNVbnNpZ25lZFN3ZWVwLCBpc0tyc1JlY292ZXJ5IH06IFZhbGlkYXRlS2V5T3B0aW9uc1xuKTogQklQMzJJbnRlcmZhY2Uge1xuICBpZiAoIWtleS5zdGFydHNXaXRoKCd4cHJ2JykgJiYgIWlzVW5zaWduZWRTd2VlcCkge1xuICAgIC8vIFRyeSB0byBkZWNyeXB0IHRoZSBrZXlcbiAgICB0cnkge1xuICAgICAgaWYgKHNvdXJjZSA9PT0gJ3VzZXInIHx8IChzb3VyY2UgPT09ICdiYWNrdXAnICYmICFpc0tyc1JlY292ZXJ5KSkge1xuICAgICAgICByZXR1cm4gYmlwMzIuZnJvbUJhc2U1OChiaXRnby5kZWNyeXB0KHsgcGFzc3dvcmQ6IHBhc3NwaHJhc2UsIGlucHV0OiBrZXkgfSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGRlY3J5cHQgJHtzb3VyY2V9IGtleSB3aXRoIHBhc3Njb2RlIC0gdHJ5IGFnYWluIWApO1xuICAgIH1cbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBiaXAzMi5mcm9tQmFzZTU4KGtleSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byB2YWxpZGF0ZSAke3NvdXJjZX0ga2V5IC0gdHJ5IGFnYWluIWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaXAzMktleXMoXG4gIGJpdGdvOiBCaXRHb0Jhc2UsXG4gIHBhcmFtczogSW5pdGlhdGVSZWNvdmVyeU9wdGlvbnMgfCBJbml0aWF0ZUNvbnNvbGlkYXRpb25SZWNvdmVyeU9wdGlvbnMsXG4gIHsgcmVxdWlyZUJpdEdvWHB1YiB9OiB7IHJlcXVpcmVCaXRHb1hwdWI6IGJvb2xlYW4gfVxuKTogQklQMzJJbnRlcmZhY2VbXSB7XG4gIGNvbnN0IGlzS3JzUmVjb3ZlcnkgPSBnZXRJc0tyc1JlY292ZXJ5KHBhcmFtcyk7XG4gIGNvbnN0IGlzVW5zaWduZWRTd2VlcCA9IGdldElzVW5zaWduZWRTd2VlcChwYXJhbXMpO1xuICBjb25zdCBrZXlzID0gW1xuICAgIC8vIEJveCBBXG4gICAgdmFsaWRhdGVLZXkoYml0Z28sIHtcbiAgICAgIGtleTogcGFyYW1zLnVzZXJLZXksXG4gICAgICBzb3VyY2U6ICd1c2VyJyxcbiAgICAgIHBhc3NwaHJhc2U6IHBhcmFtcy53YWxsZXRQYXNzcGhyYXNlLFxuICAgICAgaXNLcnNSZWNvdmVyeSxcbiAgICAgIGlzVW5zaWduZWRTd2VlcCxcbiAgICB9KSxcbiAgICAvLyBCb3ggQlxuICAgIHZhbGlkYXRlS2V5KGJpdGdvLCB7XG4gICAgICBrZXk6IHBhcmFtcy5iYWNrdXBLZXksXG4gICAgICBzb3VyY2U6ICdiYWNrdXAnLFxuICAgICAgcGFzc3BocmFzZTogcGFyYW1zLndhbGxldFBhc3NwaHJhc2UsXG4gICAgICBpc0tyc1JlY292ZXJ5LFxuICAgICAgaXNVbnNpZ25lZFN3ZWVwLFxuICAgIH0pLFxuICBdO1xuXG4gIGlmIChyZXF1aXJlQml0R29YcHViKSB7XG4gICAgaWYgKCFwYXJhbXMuYml0Z29LZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQml0R28geHB1YiByZXF1aXJlZCBidXQgbm90IHByb3ZpZGVkYCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAvLyBCb3ggQ1xuICAgICAga2V5cy5wdXNoKGJpcDMyLmZyb21CYXNlNTgocGFyYW1zLmJpdGdvS2V5KSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcGFyc2UgYml0Z28geHB1YiEnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ga2V5cztcbn1cbiJdfQ==

Выполнить команду


Для локальной разработки. Не используйте в интернете!