PHP WebShell

Текущая директория: /opt/BitGoJS/modules/utxo-lib/dist/test/bitgo/litecoin

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

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const assert = require("assert");
const path = require("path");
const fs = require("fs-extra");
const src_1 = require("../../../src");
const bitgo_1 = require("../../../src/bitgo");
const testutil_1 = require("../../../src/testutil");
const network = src_1.networks.litecoin;
async function getFixture(name) {
    const p = path.join(__dirname, 'fixtures', name);
    return JSON.parse(await fs.readFile(p, 'utf-8'));
}
async function getFixtureAsBuffer(name) {
    return Buffer.from(await getFixture(name), 'hex');
}
async function getTransaction(mweb) {
    return (0, bitgo_1.createTransactionFromBuffer)(await getFixtureAsBuffer(`ltc-${mweb ? 'mweb-' : ''}transaction.json`), network, {
        amountType: 'bigint',
    });
}
describe('Litecoin Transaction', function () {
    it('mweb transaction gets round-tripped to a non-mweb transaction', async function () {
        const mweb = await getTransaction(true);
        assert(mweb instanceof bitgo_1.LitecoinTransaction);
        const nonMwebFixture = await getFixture(`ltc-transaction.json`);
        assert.deepStrictEqual(mweb.toHex(), nonMwebFixture);
    });
    it('non-mweb transaction gets round-tripped to a non-mweb transaction', async function () {
        const nonMweb = await getTransaction(false);
        assert(nonMweb instanceof bitgo_1.LitecoinTransaction);
        const nonMwebFixture = await getFixture(`ltc-transaction.json`);
        assert.deepStrictEqual(nonMweb.toHex(), nonMwebFixture);
    });
    it(`mweb transaction read from hex and buffer serialize to the same fixture`, async function () {
        const mweb = await getTransaction(true);
        const hex = await getFixture(`ltc-mweb-transaction.json`);
        const mwebBuffer = (0, bitgo_1.createTransactionFromBuffer)(Buffer.from(hex, 'hex'), network, { amountType: 'bigint' });
        assert.deepStrictEqual(mweb.toHex(), mwebBuffer.toHex());
    });
});
describe('Litecoin Psbt', function () {
    it('LitecoinPsbt can read hex of a mweb transaction', async function () {
        const mwebTransaction = await getTransaction(true);
        const psbt = (0, bitgo_1.createPsbtFromTransaction)(mwebTransaction, [
            {
                script: Buffer.from('f955ddd1845eb0cb2c4542ff04ace2695f9f88c6b7a1ac2fba0b91662cffacc9', 'hex'),
                value: BigInt(10000),
            },
        ]);
        assert(psbt instanceof bitgo_1.LitecoinPsbt);
        assert.deepStrictEqual(psbt.getUnsignedTx().toHex(), await getFixture(`ltc-transaction.json`));
    });
    it('can add an input to a psbt whose prev transaction has a mweb serialization', async function () {
        const rootWalletKeys = (0, testutil_1.getDefaultWalletKeys)();
        const buf = await getFixtureAsBuffer(`ltc-mweb-transaction.json`);
        const tx = await (0, bitgo_1.createTransactionFromBuffer)(buf, network, { amountType: 'bigint' });
        const psbt = (0, bitgo_1.createPsbtForNetwork)({ network });
        assert(psbt instanceof bitgo_1.LitecoinPsbt);
        const u = (0, testutil_1.mockWalletUnspent)(network, BigInt(9500), {
            chain: 0,
            index: 0,
            keys: rootWalletKeys,
            vout: 0,
            id: `${tx.getId()}:0`,
        });
        (0, bitgo_1.addWalletUnspentToPsbt)(psbt, {
            ...u,
            prevTx: buf,
        }, rootWalletKeys, 'user', 'bitgo');
        assert(psbt.data.inputs.length > 0);
        // Check that the previous transaction buffer added does not have a MWEB flag
        const prevTxBuffer = psbt.data.inputs[0].nonWitnessUtxo;
        assert(prevTxBuffer);
        assert.deepStrictEqual(prevTxBuffer.toString('hex'), await getFixture(`ltc-transaction.json`));
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXdlYkJlaGF2aW9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC9iaXRnby9saXRlY29pbi9td2ViQmVoYXZpb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxpQ0FBaUM7QUFFakMsNkJBQTZCO0FBQzdCLCtCQUErQjtBQUUvQixzQ0FBd0M7QUFDeEMsOENBUTRCO0FBQzVCLG9EQUFnRjtBQUVoRixNQUFNLE9BQU8sR0FBRyxjQUFRLENBQUMsUUFBUSxDQUFDO0FBRWxDLEtBQUssVUFBVSxVQUFVLENBQUksSUFBWTtJQUN2QyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDakQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsS0FBSyxVQUFVLGtCQUFrQixDQUFDLElBQVk7SUFDNUMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sVUFBVSxDQUFTLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxLQUFLLFVBQVUsY0FBYyxDQUFDLElBQWE7SUFDekMsT0FBTyxJQUFBLG1DQUEyQixFQUFDLE1BQU0sa0JBQWtCLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sRUFBRTtRQUNsSCxVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsUUFBUSxDQUFDLHNCQUFzQixFQUFFO0lBQy9CLEVBQUUsQ0FBQywrREFBK0QsRUFBRSxLQUFLO1FBQ3ZFLE1BQU0sSUFBSSxHQUFHLE1BQU0sY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hDLE1B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QUFJO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUEsOEJBQXNCLEVBQ3BCLElBQUksRUFDSjtZQUNFLEdBQUcsQ0FBQztZQUNKLE1BQU0sRUFBRSxHQUFHO1NBQ3VCLEVBQ3BDLGNBQWMsRUFDZCxNQUFNLEVBQ04sT0FBTyxDQUNSLENBQUM7UUFDRixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXBDLDZFQUE2RTtRQUM3RSxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUM7UUFDeEQsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JCLE1BQU0sQ0FBQyxlQUFlLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsRUFBRSxNQUFNLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDLENBQUM7SUFDakcsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGFzc2VydCBmcm9tICdhc3NlcnQnO1xuXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuXG5pbXBvcnQgeyBuZXR3b3JrcyB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQge1xuICBhZGRXYWxsZXRVbnNwZW50VG9Qc2J0LFxuICBjcmVhdGVQc2J0Rm9yTmV0d29yayxcbiAgY3JlYXRlUHNidEZyb21UcmFuc2FjdGlvbixcbiAgY3JlYXRlVHJhbnNhY3Rpb25Gcm9tQnVmZmVyLFxuICBMaXRlY29pblBzYnQsXG4gIExpdGVjb2luVHJhbnNhY3Rpb24sXG4gIE5vbldpdG5lc3NXYWxsZXRVbnNwZW50LFxufSBmcm9tICcuLi8uLi8uLi9zcmMvYml0Z28nO1xuaW1wb3J0IHsgZ2V0RGVmYXVsdFdhbGxldEtleXMsIG1vY2tXYWxsZXRVbnNwZW50IH0gZnJvbSAnLi4vLi4vLi4vc3JjL3Rlc3R1dGlsJztcblxuY29uc3QgbmV0d29yayA9IG5ldHdvcmtzLmxpdGVjb2luO1xuXG5hc3luYyBmdW5jdGlvbiBnZXRGaXh0dXJlPFQ+KG5hbWU6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICBjb25zdCBwID0gcGF0aC5qb2luKF9fZGlybmFtZSwgJ2ZpeHR1cmVzJywgbmFtZSk7XG4gIHJldHVybiBKU09OLnBhcnNlKGF3YWl0IGZzLnJlYWRGaWxlKHAsICd1dGYtOCcpKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0Rml4dHVyZUFzQnVmZmVyKG5hbWU6IHN0cmluZyk6IFByb21pc2U8QnVmZmVyPiB7XG4gIHJldHVybiBCdWZmZXIuZnJvbShhd2FpdCBnZXRGaXh0dXJlPHN0cmluZz4obmFtZSksICdoZXgnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0VHJhbnNhY3Rpb24obXdlYjogYm9vbGVhbik6IFByb21pc2U8TGl0ZWNvaW5UcmFuc2FjdGlvbjxiaWdpbnQ+PiB7XG4gIHJldHVybiBjcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXIoYXdhaXQgZ2V0Rml4dHVyZUFzQnVmZmVyKGBsdGMtJHttd2ViID8gJ213ZWItJyA6ICcnfXRyYW5zYWN0aW9uLmpzb25gKSwgbmV0d29yaywge1xuICAgIGFtb3VudFR5cGU6ICdiaWdpbnQnLFxuICB9KTtcbn1cblxuZGVzY3JpYmUoJ0xpdGVjb2luIFRyYW5zYWN0aW9uJywgZnVuY3Rpb24gKCkge1xuICBpdCgnbXdlYiB0cmFuc2FjdGlvbiBnZXRzIHJvdW5kLXRyaXBwZWQgdG8gYSBub24tbXdlYiB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtd2ViID0gYXdhaXQgZ2V0VHJhbnNhY3Rpb24odHJ1ZSk7XG4gICAgYXNzZXJ0KG13ZWIgaW5zdGFuY2VvZiBMaXRlY29pblRyYW5zYWN0aW9uKTtcbiAgICBjb25zdCBub25Nd2ViRml4dHVyZSA9IGF3YWl0IGdldEZpeHR1cmUoYGx0Yy10cmFuc2FjdGlvbi5qc29uYCk7XG4gICAgYXNzZXJ0LmRlZXBTdHJpY3RFcXVhbChtd2ViLnRvSGV4KCksIG5vbk13ZWJGaXh0dXJlKTtcbiAgfSk7XG5cbiAgaXQoJ25vbi1td2ViIHRyYW5zYWN0aW9uIGdldHMgcm91bmQtdHJpcHBlZCB0byBhIG5vbi1td2ViIHRyYW5zYWN0aW9uJywgYXN5bmMgZnVuY3Rpb24gKCkge1xuICAgIGNvbnN0IG5vbk13ZWIgPSBhd2FpdCBnZXRUcmFuc2FjdGlvbihmYWxzZSk7XG5cbiAgICBhc3NlcnQobm9uTXdlYiBpbnN0YW5jZW9mIExpdGVjb2luVHJhbnNhY3Rpb24pO1xuXG4gICAgY29uc3Qgbm9uTXdlYkZpeHR1cmUgPSBhd2FpdCBnZXRGaXh0dXJlKGBsdGMtdHJhbnNhY3Rpb24uanNvbmApO1xuICAgIGFzc2VydC5kZWVwU3RyaWN0RXF1YWwobm9uTXdlYi50b0hleCgpLCBub25Nd2ViRml4dHVyZSk7XG4gIH0pO1xuXG4gIGl0KGBtd2ViIHRyYW5zYWN0aW9uIHJlYWQgZnJvbSBoZXggYW5kIGJ1ZmZlciBzZXJpYWxpemUgdG8gdGhlIHNhbWUgZml4dHVyZWAsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtd2ViID0gYXdhaXQgZ2V0VHJhbnNhY3Rpb24odHJ1ZSk7XG4gICAgY29uc3QgaGV4OiBzdHJpbmcgPSBhd2FpdCBnZXRGaXh0dXJlKGBsdGMtbXdlYi10cmFuc2FjdGlvbi5qc29uYCk7XG4gICAgY29uc3QgbXdlYkJ1ZmZlciA9IGNyZWF0ZVRyYW5zYWN0aW9uRnJvbUJ1ZmZlcihCdWZmZXIuZnJvbShoZXgsICdoZXgnKSwgbmV0d29yaywgeyBhbW91bnRUeXBlOiAnYmlnaW50JyB9KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKG13ZWIudG9IZXgoKSwgbXdlYkJ1ZmZlci50b0hleCgpKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ0xpdGVjb2luIFBzYnQnLCBmdW5jdGlvbiAoKSB7XG4gIGl0KCdMaXRlY29pblBzYnQgY2FuIHJlYWQgaGV4IG9mIGEgbXdlYiB0cmFuc2FjdGlvbicsIGFzeW5jIGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBtd2ViVHJhbnNhY3Rpb24gPSBhd2FpdCBnZXRUcmFuc2FjdGlvbih0cnVlKTtcbiAgICBjb25zdCBwc2J0ID0gY3JlYXRlUHNidEZyb21UcmFuc2FjdGlvbihtd2ViVHJhbnNhY3Rpb24sIFtcbiAgICAgIHtcbiAgICAgICAgc2NyaXB0OiBCdWZmZXIuZnJvbSgnZjk1NWRkZDE4NDVlYjBjYjJjNDU0MmZmMDRhY2UyNjk1ZjlmODhjNmI3YTFhYzJmYmEwYjkxNjYyY2ZmYWNjOScsICdoZXgnKSxcbiAgICAgICAgdmFsdWU6IEJpZ0ludCgxMDAwMCksXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGFzc2VydChwc2J0IGluc3RhbmNlb2YgTGl0ZWNvaW5Qc2J0KTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHBzYnQuZ2V0VW5zaWduZWRUeCgpLnRvSGV4KCksIGF3YWl0IGdldEZpeHR1cmUoYGx0Yy10cmFuc2FjdGlvbi5qc29uYCkpO1xuICB9KTtcblxuICBpdCgnY2FuIGFkZCBhbiBpbnB1dCB0byBhIHBzYnQgd2hvc2UgcHJldiB0cmFuc2FjdGlvbiBoYXMgYSBtd2ViIHNlcmlhbGl6YXRpb24nLCBhc3luYyBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3Qgcm9vdFdhbGxldEtleXMgPSBnZXREZWZhdWx0V2FsbGV0S2V5cygpO1xuXG4gICAgY29uc3QgYnVmID0gYXdhaXQgZ2V0Rml4dHVyZUFzQnVmZmVyKGBsdGMtbXdlYi10cmFuc2FjdGlvbi5qc29uYCk7XG4gICAgY29uc3QgdHggPSBhd2FpdCBjcmVhdGVUcmFuc2FjdGlvbkZyb21CdWZmZXIoYnVmLCBuZXR3b3JrLCB7IGFtb3VudFR5cGU6ICdiaWdpbnQnIH0pO1xuXG4gICAgY29uc3QgcHNidCA9IGNyZWF0ZVBzYnRGb3JOZXR3b3JrKHsgbmV0d29yayB9KTtcbiAgICBhc3NlcnQocHNidCBpbnN0YW5jZW9mIExpdGVjb2luUHNidCk7XG5cbiAgICBjb25zdCB1ID0gbW9ja1dhbGxldFVuc3BlbnQobmV0d29yaywgQmlnSW50KDk1MDApLCB7XG4gICAgICBjaGFpbjogMCxcbiAgICAgIGluZGV4OiAwLFxuICAgICAga2V5czogcm9vdFdhbGxldEtleXMsXG4gICAgICB2b3V0OiAwLFxuICAgICAgaWQ6IGAke3R4LmdldElkKCl9OjBgLFxuICAgIH0pO1xuXG4gICAgYWRkV2FsbGV0VW5zcGVudFRvUHNidChcbiAgICAgIHBzYnQsXG4gICAgICB7XG4gICAgICAgIC4uLnUsXG4gICAgICAgIHByZXZUeDogYnVmLFxuICAgICAgfSBhcyBOb25XaXRuZXNzV2FsbGV0VW5zcGVudDxiaWdpbnQ+LFxuICAgICAgcm9vdFdhbGxldEtleXMsXG4gICAgICAndXNlcicsXG4gICAgICAnYml0Z28nXG4gICAgKTtcbiAgICBhc3NlcnQocHNidC5kYXRhLmlucHV0cy5sZW5ndGggPiAwKTtcblxuICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHRyYW5zYWN0aW9uIGJ1ZmZlciBhZGRlZCBkb2VzIG5vdCBoYXZlIGEgTVdFQiBmbGFnXG4gICAgY29uc3QgcHJldlR4QnVmZmVyID0gcHNidC5kYXRhLmlucHV0c1swXS5ub25XaXRuZXNzVXR4bztcbiAgICBhc3NlcnQocHJldlR4QnVmZmVyKTtcbiAgICBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKHByZXZUeEJ1ZmZlci50b1N0cmluZygnaGV4JyksIGF3YWl0IGdldEZpeHR1cmUoYGx0Yy10cmFuc2FjdGlvbi5qc29uYCkpO1xuICB9KTtcbn0pO1xuIl19

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


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