PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/dist/test/v2/unit/coins/utxo

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
/**
 * @prettier
 */
require("should");
const assert = require("assert");
const utxolib = require("@bitgo/utxo-lib");
const { chainCodes } = utxolib.bitgo;
const util_1 = require("./util");
// TODO (@rushilbg): Delete these tests because they are redundant (similar tests are in utxo-lib)
function isCompatibleAddress(a, b) {
    if (a === b) {
        return true;
    }
    switch (a.getChain()) {
        case 'btc':
        case 'bsv':
        case 'bch':
        case 'bcha':
            return ['btc', 'bsv', 'bch', 'bcha'].includes(b.getChain());
        case 'tbtc':
        case 'tbtcsig':
        case 'tbtc4':
        case 'tbtcbgsig':
        case 'tbsv':
        case 'tbch':
        case 'tdoge':
        case 'tbcha':
            return ['tbtc', 'tbtcsig', 'tbtc4', 'tbtcbgsig', 'tbsv', 'tbch', 'tbcha', 'tdoge'].includes(b.getChain());
        default:
            return false;
    }
}
function run(coin) {
    const keychains = util_1.keychains.map((k) => ({ pub: k.neutered().toBase58() }));
    function getParameters() {
        return [undefined, ...chainCodes].map((chain) => ({ keychains, chain }));
    }
    describe(`UTXO Addresses ${coin.getChain()}`, function () {
        it('address support', function () {
            const supportedAddressTypes = utxolib.bitgo.outputScripts.scriptTypes2Of3.filter((t) => coin.supportsAddressType(t));
            switch (coin.getChain()) {
                case 'btc':
                case 'tbtc':
                case 'tbtcsig':
                case 'tbtc4':
                case 'tbtcbgsig':
                    supportedAddressTypes.should.eql(['p2sh', 'p2shP2wsh', 'p2wsh', 'p2tr', 'p2trMusig2']);
                    break;
                case 'btg':
                case 'tbtg':
                case 'ltc':
                case 'tltc':
                    supportedAddressTypes.should.eql(['p2sh', 'p2shP2wsh', 'p2wsh']);
                    break;
                case 'bch':
                case 'tbch':
                case 'bcha':
                case 'tbcha':
                case 'bsv':
                case 'tbsv':
                case 'dash':
                case 'tdash':
                case 'doge':
                case 'tdoge':
                case 'zec':
                case 'tzec':
                    supportedAddressTypes.should.eql(['p2sh']);
                    break;
                default:
                    throw new Error(`unexpected coin ${coin.getChain()}`);
            }
        });
        it('generates address matching the fixtures', async function () {
            const addresses = getParameters().map((p) => {
                const label = { chain: p.chain === undefined ? 'default' : p.chain };
                try {
                    return [label, coin.generateAddress(p)];
                }
                catch (e) {
                    return [label, { error: e.message }];
                }
            });
            (0, util_1.shouldEqualJSON)(addresses, await (0, util_1.getFixture)(coin, 'addresses-by-chain', addresses));
        });
        it('validates and verifies generated addresses', function () {
            getParameters().forEach((p) => {
                if (p.chain && !coin.supportsAddressChain(p.chain)) {
                    assert.throws(() => coin.generateAddress(p));
                    return;
                }
                const a = coin.generateAddress(p);
                coin.isValidAddress(a.address).should.eql(true);
                if (a.address !== a.address.toUpperCase()) {
                    coin.isValidAddress(a.address.toUpperCase()).should.eql(false);
                }
                coin.verifyAddress({ ...a, keychains });
            });
        });
        it('defaults to canonical address', function () {
            getParameters().forEach((p) => {
                if (!p.chain || coin.supportsAddressChain(p.chain)) {
                    const address = coin.generateAddress(p).address;
                    coin.canonicalAddress(address).should.eql(address);
                }
            });
        });
        util_1.utxoCoins.forEach((otherCoin) => {
            it(`has expected address compatability with ${otherCoin.getChain()}`, async function () {
                getParameters().forEach((p) => {
                    if (p.chain && (!coin.supportsAddressChain(p.chain) || !otherCoin.supportsAddressChain(p.chain))) {
                        return;
                    }
                    const address = coin.generateAddress(p);
                    const otherAddress = otherCoin.generateAddress(p);
                    (address.address === otherAddress.address).should.eql(isCompatibleAddress(coin, otherCoin));
                    coin.isValidAddress(otherAddress.address).should.eql(isCompatibleAddress(coin, otherCoin));
                });
            });
        });
    });
}
util_1.utxoCoins.forEach((c) => run(c));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkcmVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Rlc3QvdjIvdW5pdC9jb2lucy91dHhvL2FkZHJlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQTs7R0FFRztBQUNILGtCQUFnQjtBQUNoQixpQ0FBaUM7QUFDakMsMkNBQTJDO0FBQzNDLE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0FBSXJDLGlDQUE2RjtBQUU3RixrR0FBa0c7QUFDbEcsU0FBUyxtQkFBbUIsQ0FBQyxDQUFtQixFQUFFLENBQW1CO0lBQ25FLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ1osT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBQ0QsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztRQUNyQixLQUFLLEtBQUssQ0FBQztRQUNYLEtBQUssS0FBSyxDQUFDO1FBQ1gsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzlELEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxTQUFTLENBQUM7UUFDZixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssTUFBTSxDQUFDO1FBQ1osS0FBSyxNQUFNLENBQUM7UUFDWixLQUFLLE9BQU8sQ0FBQztRQUNiLEtBQUssT0FBTztZQUNWLE9BQU8sQ0FBQyxNQUFNLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQzVHO1lBQ0UsT0FB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SSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7b0JBQzVGLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQzdGLENBQUMsQ0FBQyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELGdCQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQHByZXR0aWVyXG4gKi9cbmltcG9ydCAnc2hvdWxkJztcbmltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuaW1wb3J0ICogYXMgdXR4b2xpYiBmcm9tICdAYml0Z28vdXR4by1saWInO1xuY29uc3QgeyBjaGFpbkNvZGVzIH0gPSB1dHhvbGliLmJpdGdvO1xuXG5pbXBvcnQgeyBBYnN0cmFjdFV0eG9Db2luLCBHZW5lcmF0ZUZpeGVkU2NyaXB0QWRkcmVzc09wdGlvbnMgfSBmcm9tICdAYml0Z28vYWJzdHJhY3QtdXR4byc7XG5cbmltcG9ydCB7IHV0eG9Db2lucywga2V5Y2hhaW5zIGFzIGtleWNoYWluc0JpcDMyLCBnZXRGaXh0dXJlLCBzaG91bGRFcXVhbEpTT04gfSBmcm9tICcuL3V0aWwnO1xuXG4vLyBUT0RPIChAcnVzaGlsYmcpOiBEZWxldGUgdGhlc2UgdGVzdHMgYmVjYXVzZSB0aGV5IGFyZSByZWR1bmRhbnQgKHNpbWlsYXIgdGVzdHMgYXJlIGluIHV0eG8tbGliKVxuZnVuY3Rpb24gaXNDb21wYXRpYmxlQWRkcmVzcyhhOiBBYnN0cmFjdFV0eG9Db2luLCBiOiBBYnN0cmFjdFV0eG9Db2luKTogYm9vbGVhbiB7XG4gIGlmIChhID09PSBiKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc3dpdGNoIChhLmdldENoYWluKCkpIHtcbiAgICBjYXNlICdidGMnOlxuICAgIGNhc2UgJ2Jzdic6XG4gICAgY2FzZSAnYmNoJzpcbiAgICBjYXNlICdiY2hhJzpcbiAgICAgIHJldHVybiBbJ2J0YycsICdic3YnLCAnYmNoJywgJ2JjaGEnXS5pbmNsdWRlcyhiLmdldENoYWluKCkpO1xuICAgIGNhc2UgJ3RidGMnOlxuICAgIGNhc2UgJ3RidGNzaWcnOlxuICAgIGNhc2UgJ3RidGM0JzpcbiAgICBjYXNlICd0YnRjYmdzaWcnOlxuICAgIGNhc2UgJ3Ric3YnOlxuICAgIGNhc2UgJ3RiY2gnOlxuICAgIGNhc2UgJ3Rkb2dlJzpcbiAgICBjYXNlICd0YmNoYSc6XG4gICAgICByZXR1cm4gWyd0YnRjJywgJ3RidGNzaWcnLCAndGJ0YzQnLCAndGJ0Y2Jnc2lnJywgJ3Ric3YnLCAndGJjaCcsICd0YmNoYScsICd0ZG9nZSddLmluY2x1ZGVzKGIuZ2V0Q2hhaW4oKSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBydW4oY29pbjogQWJzdHJhY3RVdHhvQ29pbikge1xuICBjb25zdCBrZXljaGFpbnMgPSBrZXljaGFpbnNCaXAzMi5tYXAoKGspID0+ICh7IHB1Yjogay5uZXV0ZXJlZCgpLnRvQmFzZTU4KCkgfSkpO1xuXG4gIGZ1bmN0aW9uIGdldFBhcmFtZXRlcnMoKTogR2VuZXJhdGVGaXhlZFNjcmlwdEFkZHJlc3NPcHRpb25zW10ge1xuICAgIHJldHVybiBbdW5kZWZpbmVkLCAuLi5jaGFpbkNvZGVzXS5tYXAoKGNoYWluKSA9PiAoeyBrZXljaGFpbnMsIGNoYWluIH0pKTtcbiAgfVxuXG4gIGRlc2NyaWJlKGBVVFhPIEFkZHJlc3NlcyAke2NvaW4uZ2V0Q2hhaW4oKX1gLCBmdW5jdGlvbiAoKSB7XG4gICAgaXQoJ2FkZHJlc3Mgc3VwcG9ydCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IHN1cHBvcnRlZEFkZHJlc3NUeXBlcyA9IHV0eG9saWIuYml0Z28ub3V0cHV0U2NyaXB0cy5zY3JpcHRUeXBlczJPZjMuZmlsdGVyKCh0KSA9PlxuICAgICAgICBjb2luLnN1cHBvcnRzQWRkcmVzc1R5cGUodClcbiAgICAgICk7XG4gICAgICBzd2l0Y2ggKGNvaW4uZ2V0Q2hhaW4oKSkge1xuICAgICAgICBjYXNlICdidGMnOlxuICAgICAgICBjYXNlICd0YnRjJzpcbiAgICAgICAgY2FzZSAndGJ0Y3NpZyc6XG4gICAgICAgIGNhc2UgJ3RidGM0JzpcbiAgICAgICAgY2FzZSAndGJ0Y2Jnc2lnJzpcbiAgICAgICAgICBzdXBwb3J0ZWRBZGRyZXNzVHlwZXMuc2hvdWxkLmVxbChbJ3Ayc2gnLCAncDJzaFAyd3NoJywgJ3Ayd3NoJywgJ3AydHInLCAncDJ0ck11c2lnMiddKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnYnRnJzpcbiAgICAgICAgY2FzZSAndGJ0Zyc6XG4gICAgICAgIGNhc2UgJ2x0Yyc6XG4gICAgICAgIGNhc2UgJ3RsdGMnOlxuICAgICAgICAgIHN1cHBvcnRlZEFkZHJlc3NUeXBlcy5zaG91bGQuZXFsKFsncDJzaCcsICdwMnNoUDJ3c2gnLCAncDJ3c2gnXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2JjaCc6XG4gICAgICAgIGNhc2UgJ3RiY2gnOlxuICAgICAgICBjYXNlICdiY2hhJzpcbiAgICAgICAgY2FzZSAndGJjaGEnOlxuICAgICAgICBjYXNlICdic3YnOlxuICAgICAgICBjYXNlICd0YnN2JzpcbiAgICAgICAgY2FzZSAnZGFzaCc6XG4gICAgICAgIGNhc2UgJ3RkYXNoJzpcbiAgICAgICAgY2FzZSAnZG9nZSc6XG4gICAgICAgIGNhc2UgJ3Rkb2dlJzpcbiAgICAgICAgY2FzZSAnemVjJzpcbiAgICAgICAgY2FzZSAndHplYyc6XG4gICAgICAgICAgc3VwcG9ydGVkQWRkcmVzc1R5cGVzLnNob3VsZC5lcWwoWydwMnNoJ10pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCBjb2luICR7Y29pbi5nZXRDaGFpbigpfWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaXQoJ2dlbmVyYXRlcyBhZGRyZXNzIG1hdGNoaW5nIHRoZSBmaXh0dXJlcycsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICAgIGNvbnN0IGFkZHJlc3NlcyA9IGdldFBhcmFtZXRlcnMoKS5tYXAoKHApID0+IHtcbiAgICAgICAgY29uc3QgbGFiZWwgPSB7IGNoYWluOiBwLmNoYWluID09PSB1bmRlZmluZWQgPyAnZGVmYXVsdCcgOiBwLmNoYWluIH07XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIFtsYWJlbCwgY29pbi5nZW5lcmF0ZUFkZHJlc3MocCldO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgcmV0dXJuIFtsYWJlbCwgeyBlcnJvcjogZS5tZXNzYWdlIH1dO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgc2hvdWxkRXF1YWxKU09OKGFkZHJlc3NlcywgYXdhaXQgZ2V0Rml4dHVyZShjb2luLCAnYWRkcmVzc2VzLWJ5LWNoYWluJywgYWRkcmVzc2VzKSk7XG4gICAgfSk7XG5cbiAgICBpdCgndmFsaWRhdGVzIGFuZCB2ZXJpZmllcyBnZW5lcmF0ZWQgYWRkcmVzc2VzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0UGFyYW1ldGVycygpLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgaWYgKHAuY2hhaW4gJiYgIWNvaW4uc3VwcG9ydHNBZGRyZXNzQ2hhaW4ocC5jaGFpbikpIHtcbiAgICAgICAgICBhc3NlcnQudGhyb3dzKCgpID0+IGNvaW4uZ2VuZXJhdGVBZGRyZXNzKHApKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhID0gY29pbi5nZW5lcmF0ZUFkZHJlc3MocCk7XG4gICAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3MoYS5hZGRyZXNzKS5zaG91bGQuZXFsKHRydWUpO1xuICAgICAgICBpZiAoYS5hZGRyZXNzICE9PSBhLmFkZHJlc3MudG9VcHBlckNhc2UoKSkge1xuICAgICAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3MoYS5hZGRyZXNzLnRvVXBwZXJDYXNlKCkpLnNob3VsZC5lcWwoZmFsc2UpO1xuICAgICAgICB9XG4gICAgICAgIGNvaW4udmVyaWZ5QWRkcmVzcyh7IC4uLmEsIGtleWNoYWlucyB9KTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgaXQoJ2RlZmF1bHRzIHRvIGNhbm9uaWNhbCBhZGRyZXNzJywgZnVuY3Rpb24gKCkge1xuICAgICAgZ2V0UGFyYW1ldGVycygpLmZvckVhY2goKHApID0+IHtcbiAgICAgICAgaWYgKCFwLmNoYWluIHx8IGNvaW4uc3VwcG9ydHNBZGRyZXNzQ2hhaW4ocC5jaGFpbikpIHtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gY29pbi5nZW5lcmF0ZUFkZHJlc3MocCkuYWRkcmVzcztcbiAgICAgICAgICBjb2luLmNhbm9uaWNhbEFkZHJlc3MoYWRkcmVzcykuc2hvdWxkLmVxbChhZGRyZXNzKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB1dHhvQ29pbnMuZm9yRWFjaCgob3RoZXJDb2luKSA9PiB7XG4gICAgICBpdChgaGFzIGV4cGVjdGVkIGFkZHJlc3MgY29tcGF0YWJpbGl0eSB3aXRoICR7b3RoZXJDb2luLmdldENoYWluKCl9YCwgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgICAgICBnZXRQYXJhbWV0ZXJzKCkuZm9yRWFjaCgocCkgPT4ge1xuICAgICAgICAgIGlmIChwLmNoYWluICYmICghY29pbi5zdXBwb3J0c0FkZHJlc3NDaGFpbihwLmNoYWluKSB8fCAhb3RoZXJDb2luLnN1cHBvcnRzQWRkcmVzc0NoYWluKHAuY2hhaW4pKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gY29pbi5nZW5lcmF0ZUFkZHJlc3MocCk7XG4gICAgICAgICAgY29uc3Qgb3RoZXJBZGRyZXNzID0gb3RoZXJDb2luLmdlbmVyYXRlQWRkcmVzcyhwKTtcbiAgICAgICAgICAoYWRkcmVzcy5hZGRyZXNzID09PSBvdGhlckFkZHJlc3MuYWRkcmVzcykuc2hvdWxkLmVxbChpc0NvbXBhdGlibGVBZGRyZXNzKGNvaW4sIG90aGVyQ29pbikpO1xuICAgICAgICAgIGNvaW4uaXNWYWxpZEFkZHJlc3Mob3RoZXJBZGRyZXNzLmFkZHJlc3MpLnNob3VsZC5lcWwoaXNDb21wYXRpYmxlQWRkcmVzcyhjb2luLCBvdGhlckNvaW4pKTtcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbnV0eG9Db2lucy5mb3JFYWNoKChjKSA9PiBydW4oYykpO1xuIl19

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


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