bitgo
Version:
BitGo JavaScript SDK
69 lines • 7.97 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.SeedValidator = void 0;
const stellar = require("stellar-sdk");
const _ = require("lodash");
const statics_1 = require("@bitgo/statics");
const account_lib_1 = require("@bitgo/account-lib");
/**
* This classes intention is to guess/verify what seeds come from where.
*/
class SeedValidator {
/**
* Try to guess what kind of seed this could be
* @param seed
* @returns {string} - returns undefined if the coin type is undetectable. returns
* the coin family otherwise.
*/
static getCoinFamilyFromSeed(seed) {
let coin = undefined;
// if this can be implemented in more than one competing seed format, that could be an issue
if (!SeedValidator.hasCompetingSeedFormats(seed)) {
// ordering generally matters here - hbar is the least permissive for seed checking, algo and
// stellar have checksums. coin is guaranteed to be mutually exclusive by the
// competing seed format check
if (account_lib_1.Algo.algoUtils.isValidSeed(seed))
coin = statics_1.CoinFamily.ALGO;
if (stellar.StrKey.isValidEd25519SecretSeed(seed))
coin = statics_1.CoinFamily.XLM;
if (SeedValidator.isValidHbarSeedFormat(seed))
coin = statics_1.CoinFamily.HBAR;
}
return coin;
}
/**
* Checks whether this is a valid seed for this coin family type.
* @param seed - seed
* @param coinFamily - the coinFamily of the coin we're working with
*/
static isValidEd25519SeedForCoin(seed, coinFamily) {
const guessedCoin = SeedValidator.getCoinFamilyFromSeed(seed);
return coinFamily === guessedCoin;
}
/**
* We need to ensure there is no overlap for any two seeds we put into this function. This functions
* intention is for gating whether this seed could possibly match two formats or is invalid itself.
* @param seed
*/
static hasCompetingSeedFormats(seed) {
const isAlgoSeed = account_lib_1.Algo.algoUtils.isValidSeed(seed);
const isStellarSeed = stellar.StrKey.isValidEd25519SecretSeed(seed);
const isHbarSeed = SeedValidator.isValidHbarSeedFormat(seed);
return _.sum([isAlgoSeed, isStellarSeed, isHbarSeed]) !== 1;
}
/**
* Checks if this is a valid Hbar prv. These can be encoded differently.
* @param seed
*/
static isValidHbarSeedFormat(seed) {
try {
account_lib_1.Hbar.Utils.createRawKey(seed);
}
catch {
return false;
}
return true;
}
}
exports.SeedValidator = SeedValidator;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VlZFZhbGlkYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy92Mi9pbnRlcm5hbC9zZWVkVmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHVDQUF1QztBQUN2Qyw0QkFBNEI7QUFDNUIsNENBQTRDO0FBQzVDLG9EQUFnRDtBQUVoRDs7R0FFRztBQUNILE1BQWEsYUFBYTtJQUN4Qjs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxxQkFBcUIsQ0FBQyxJQUFZO1FBQ3ZDLElBQUksSUFBSSxHQUEyQixTQUFTLENBQUM7UUFFN0MsNEZBQTRGO1FBQzVGLElBQUksQ0FBQyxhQUFhLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEQsNkZBQTZGO1lBQzdGLDZFQUE2RTtZQUM3RSw4QkFBOEI7WUFFOUIsSUFBSSxrQkFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO2dCQUFFLElBQUksR0FBRyxvQkFBVSxDQUFDLElBQUksQ0FBQztZQUM3RCxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDO2dCQUFFLElBQUksR0FBRyxvQkFBVSxDQUFDLEdBQUcsQ0FBQztZQUN6RSxJQUFJLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUM7Z0JBQUUsSUFBSSxHQUFHLG9CQUFVLENBQUMsSUFBSSxDQUFDO1NBQ3ZFO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxJQUFZLEVBQUUsVUFBc0I7UUFDbkUsTUFBTSxXQUFXLEdBQUcsYUFBYSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlELE9BQU8sVUFBVSxLQUFLLFdBQVcsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQyxJQUFZO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLGtCQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLHdCQUF3QixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUU3RCxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxVQUFVLEVBQUUsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7O09BR0c7SUFDSCxNQUFNLENBQUMscUJBQXFCLENBQUMsSUFBWTtRQUN2QyxJQUFJO1lBQ0Ysa0JBQUksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQy9CO1FBQUMsTUFBTTtZQUNOLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRjtBQTNERCxzQ0EyREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzdGVsbGFyIGZyb20gJ3N0ZWxsYXItc2RrJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCB7IENvaW5GYW1pbHkgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgeyBIYmFyLCBBbGdvIH0gZnJvbSAnQGJpdGdvL2FjY291bnQtbGliJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzZXMgaW50ZW50aW9uIGlzIHRvIGd1ZXNzL3ZlcmlmeSB3aGF0IHNlZWRzIGNvbWUgZnJvbSB3aGVyZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlZWRWYWxpZGF0b3Ige1xuICAvKipcbiAgICogVHJ5IHRvIGd1ZXNzIHdoYXQga2luZCBvZiBzZWVkIHRoaXMgY291bGQgYmVcbiAgICogQHBhcmFtIHNlZWRcbiAgICogQHJldHVybnMge3N0cmluZ30gLSByZXR1cm5zIHVuZGVmaW5lZCBpZiB0aGUgY29pbiB0eXBlIGlzIHVuZGV0ZWN0YWJsZS4gcmV0dXJuc1xuICAgKiB0aGUgY29pbiBmYW1pbHkgb3RoZXJ3aXNlLlxuICAgKi9cbiAgc3RhdGljIGdldENvaW5GYW1pbHlGcm9tU2VlZChzZWVkOiBzdHJpbmcpOiBDb2luRmFtaWx5IHwgdW5kZWZpbmVkIHtcbiAgICBsZXQgY29pbjogQ29pbkZhbWlseSB8IHVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcblxuICAgIC8vIGlmIHRoaXMgY2FuIGJlIGltcGxlbWVudGVkIGluIG1vcmUgdGhhbiBvbmUgY29tcGV0aW5nIHNlZWQgZm9ybWF0LCB0aGF0IGNvdWxkIGJlIGFuIGlzc3VlXG4gICAgaWYgKCFTZWVkVmFsaWRhdG9yLmhhc0NvbXBldGluZ1NlZWRGb3JtYXRzKHNlZWQpKSB7XG4gICAgICAvLyBvcmRlcmluZyBnZW5lcmFsbHkgbWF0dGVycyBoZXJlIC0gaGJhciBpcyB0aGUgbGVhc3QgcGVybWlzc2l2ZSBmb3Igc2VlZCBjaGVja2luZywgYWxnbyBhbmRcbiAgICAgIC8vIHN0ZWxsYXIgaGF2ZSBjaGVja3N1bXMuIGNvaW4gaXMgZ3VhcmFudGVlZCB0byBiZSBtdXR1YWxseSBleGNsdXNpdmUgYnkgdGhlXG4gICAgICAvLyBjb21wZXRpbmcgc2VlZCBmb3JtYXQgY2hlY2tcblxuICAgICAgaWYgKEFsZ28uYWxnb1V0aWxzLmlzVmFsaWRTZWVkKHNlZWQpKSBjb2luID0gQ29pbkZhbWlseS5BTEdPO1xuICAgICAgaWYgKHN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5U2VjcmV0U2VlZChzZWVkKSkgY29pbiA9IENvaW5GYW1pbHkuWExNO1xuICAgICAgaWYgKFNlZWRWYWxpZGF0b3IuaXNWYWxpZEhiYXJTZWVkRm9ybWF0KHNlZWQpKSBjb2luID0gQ29pbkZhbWlseS5IQkFSO1xuICAgIH1cblxuICAgIHJldHVybiBjb2luO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoaXMgaXMgYSB2YWxpZCBzZWVkIGZvciB0aGlzIGNvaW4gZmFtaWx5IHR5cGUuXG4gICAqIEBwYXJhbSBzZWVkIC0gc2VlZFxuICAgKiBAcGFyYW0gY29pbkZhbWlseSAtIHRoZSBjb2luRmFtaWx5IG9mIHRoZSBjb2luIHdlJ3JlIHdvcmtpbmcgd2l0aFxuICAgKi9cbiAgc3RhdGljIGlzVmFsaWRFZDI1NTE5U2VlZEZvckNvaW4oc2VlZDogc3RyaW5nLCBjb2luRmFtaWx5OiBDb2luRmFtaWx5KTogYm9vbGVhbiB7XG4gICAgY29uc3QgZ3Vlc3NlZENvaW4gPSBTZWVkVmFsaWRhdG9yLmdldENvaW5GYW1pbHlGcm9tU2VlZChzZWVkKTtcbiAgICByZXR1cm4gY29pbkZhbWlseSA9PT0gZ3Vlc3NlZENvaW47XG4gIH1cblxuICAvKipcbiAgICogV2UgbmVlZCB0byBlbnN1cmUgdGhlcmUgaXMgbm8gb3ZlcmxhcCBmb3IgYW55IHR3byBzZWVkcyB3ZSBwdXQgaW50byB0aGlzIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uc1xuICAgKiBpbnRlbnRpb24gaXMgZm9yIGdhdGluZyB3aGV0aGVyIHRoaXMgc2VlZCBjb3VsZCBwb3NzaWJseSBtYXRjaCB0d28gZm9ybWF0cyBvciBpcyBpbnZhbGlkIGl0c2VsZi5cbiAgICogQHBhcmFtIHNlZWRcbiAgICovXG4gIHN0YXRpYyBoYXNDb21wZXRpbmdTZWVkRm9ybWF0cyhzZWVkOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBjb25zdCBpc0FsZ29TZWVkID0gQWxnby5hbGdvVXRpbHMuaXNWYWxpZFNlZWQoc2VlZCk7XG4gICAgY29uc3QgaXNTdGVsbGFyU2VlZCA9IHN0ZWxsYXIuU3RyS2V5LmlzVmFsaWRFZDI1NTE5U2VjcmV0U2VlZChzZWVkKTtcbiAgICBjb25zdCBpc0hiYXJTZWVkID0gU2VlZFZhbGlkYXRvci5pc1ZhbGlkSGJhclNlZWRGb3JtYXQoc2VlZCk7XG5cbiAgICByZXR1cm4gXy5zdW0oW2lzQWxnb1NlZWQsIGlzU3RlbGxhclNlZWQsIGlzSGJhclNlZWRdKSAhPT0gMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhpcyBpcyBhIHZhbGlkIEhiYXIgcHJ2LiBUaGVzZSBjYW4gYmUgZW5jb2RlZCBkaWZmZXJlbnRseS5cbiAgICogQHBhcmFtIHNlZWRcbiAgICovXG4gIHN0YXRpYyBpc1ZhbGlkSGJhclNlZWRGb3JtYXQoc2VlZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdHJ5IHtcbiAgICAgIEhiYXIuVXRpbHMuY3JlYXRlUmF3S2V5KHNlZWQpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuIl19
;