PHP WebShell
Текущая директория: /opt/BitGoJS/modules/express/dist/test/unit/lightning
Просмотр файла: lightningWithdrawRoutes.test.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const sinon = require("sinon");
const should = require("should");
const bitgo_1 = require("bitgo");
const lightningWithdrawRoutes_1 = require("../../../src/lightning/lightningWithdrawRoutes");
describe('Lightning Withdraw Routes', () => {
let bitgo;
const coin = 'tlnbtc';
const mockRequestObject = (params) => {
const req = {};
req.body = params.body || {};
req.params = params.params || {};
req.query = params.query || {};
req.bitgo = params.bitgo;
return req;
};
afterEach(() => {
sinon.restore();
});
describe('On chain withdrawal', () => {
it('should successfully make a on chain withdrawal', async () => {
const inputParams = {
recipients: [
{
amountSat: '500000',
address: 'bcrt1qjq48cqk2u80hewdcndf539m8nnnvt845nl68x7',
},
],
satsPerVbyte: '15',
};
const expectedResponse = {
txRequestState: 'delivered',
txRequestId: '123',
};
const onchainWithdrawStub = sinon.stub().resolves(expectedResponse);
const mockLightningWallet = {
withdrawOnchain: onchainWithdrawStub,
};
// Mock the module import
const proxyquire = require('proxyquire');
const lightningWithdrawRoutes = proxyquire('../../../src/lightning/lightningWithdrawRoutes', {
'@bitgo/abstract-lightning': {
getLightningWallet: () => mockLightningWallet,
},
});
const walletStub = {};
const coinStub = {
wallets: () => ({ get: sinon.stub().resolves(walletStub) }),
};
const stubBitgo = sinon.createStubInstance(bitgo_1.BitGo, { coin: coinStub });
const req = mockRequestObject({
params: { id: 'testWalletId', coin },
body: inputParams,
bitgo: stubBitgo,
});
const result = await lightningWithdrawRoutes.handleLightningWithdraw(req);
should(result).deepEqual(expectedResponse);
should(onchainWithdrawStub).be.calledOnce();
const [firstArg] = onchainWithdrawStub.getCall(0).args;
const decodedRecipients = inputParams.recipients.map((recipient) => {
return {
...recipient,
amountSat: BigInt(recipient.amountSat),
};
});
// we decode the amountMsat string to bigint, it should be in bigint format when passed to payInvoice
should(firstArg).have.property('recipients', decodedRecipients);
should(firstArg).have.property('satsPerVbyte', BigInt(inputParams.satsPerVbyte));
});
it('should throw an error if the satsPerVbyte is missing in the request params', async () => {
const inputParams = {
recipients: [
{
amountSat: '500000',
address: 'bcrt1qjq48cqk2u80hewdcndf539m8nnnvt845nl68x7',
},
],
};
const req = mockRequestObject({
params: { id: 'testWalletId', coin },
body: inputParams,
});
req.bitgo = bitgo;
await should((0, lightningWithdrawRoutes_1.handleLightningWithdraw)(req)).be.rejectedWith('Invalid request body for withdrawing on chain lightning balance');
});
it('should throw an error if the recipients is missing in the request params', async () => {
const inputParams = {
satsPerVbyte: '15',
};
const req = mockRequestObject({
params: { id: 'testWalletId', coin },
body: inputParams,
});
req.bitgo = bitgo;
await should((0, lightningWithdrawRoutes_1.handleLightningWithdraw)(req)).be.rejectedWith('Invalid request body for withdrawing on chain lightning balance');
});
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGlnaHRuaW5nV2l0aGRyYXdSb3V0ZXMudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Rlc3QvdW5pdC9saWdodG5pbmcvbGlnaHRuaW5nV2l0aGRyYXdSb3V0ZXMudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLCtCQUErQjtBQUMvQixpQ0FBaUM7QUFHakMsaUNBQThCO0FBQzlCLDRGQUF5RjtBQUV6RixRQUFRLENBQUMsMkJBQTJCLEVBQUUsR0FBRyxFQUFFO0lBQ3pDLElBQUksS0FBSyxDQUFDO0lBQ1YsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBRXRCLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxNQUE4RCxFQUFFLEVBQUU7UUFDM0YsTUFBTSxHQUFHLEdBQTZCLEVBQUUsQ0FBQztRQUN6QyxHQUFHLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzdCLEdBQUcsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDakMsR0FBRyxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUMvQixHQUFHLENBQUMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDekIsT0FBTyxHQUFzQixDQUFDO0lBQ2hDLENBQUMsQ0FBQztJQUVGLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDYixLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEIsQ0FBQyxDQUFDLENBQUM7SUFFSCxRQUFRLENBQUMscUJBQXFCLEVBQUUsR0FBRyxFQUFFO1FBQ25DLEVBQUUsQ0FBQyxnREFBZ0QsRUFBRSxLQUFLLElBQUksRUFBRTtZQUM5RCxNQUFNLFdBQVcsR0FBRztnQkFDbEIsVUFBVSxFQUFFO29CQUNWO3dCQUNFLFNBQVMsRUFBRSxRQUFRO3dCQUNuQixPQUFPLEVBQUUsOENBQThDO3FCQUN4RDtpQkFDRjtn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TSxDQUFDLElBQUEsaURBQXVCLEVBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUN4RCxpRUFBaUUsQ0FDbEUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDBFQUEwRSxFQUFFLEtBQUssSUFBSSxFQUFFO1lBQ3hGLE1BQU0sV0FBVyxHQUFHO2dCQUNsQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDO1lBRUYsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUM7Z0JBQzVCLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQUUsSUFBSSxFQUFFO2dCQUNwQyxJQUFJLEVBQUUsV0FBVzthQUNsQixDQUFDLENBQUM7WUFDSCxHQUFHLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztZQUVsQixNQUFNLE1BQU0sQ0FBQyxJQUFBLGlEQUF1QixFQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FDeEQsaUVBQWlFLENBQ2xFLENBQUM7UUFDSixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzaW5vbiBmcm9tICdzaW5vbic7XG5pbXBvcnQgKiBhcyBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCAqIGFzIGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgeyBQYXlJbnZvaWNlUmVzcG9uc2UgfSBmcm9tICdAYml0Z28vYWJzdHJhY3QtbGlnaHRuaW5nJztcbmltcG9ydCB7IEJpdEdvIH0gZnJvbSAnYml0Z28nO1xuaW1wb3J0IHsgaGFuZGxlTGlnaHRuaW5nV2l0aGRyYXcgfSBmcm9tICcuLi8uLi8uLi9zcmMvbGlnaHRuaW5nL2xpZ2h0bmluZ1dpdGhkcmF3Um91dGVzJztcblxuZGVzY3JpYmUoJ0xpZ2h0bmluZyBXaXRoZHJhdyBSb3V0ZXMnLCAoKSA9PiB7XG4gIGxldCBiaXRnbztcbiAgY29uc3QgY29pbiA9ICd0bG5idGMnO1xuXG4gIGNvbnN0IG1vY2tSZXF1ZXN0T2JqZWN0ID0gKHBhcmFtczogeyBib2R5PzogYW55OyBwYXJhbXM/OiBhbnk7IHF1ZXJ5PzogYW55OyBiaXRnbz86IGFueSB9KSA9PiB7XG4gICAgY29uc3QgcmVxOiBQYXJ0aWFsPGV4cHJlc3MuUmVxdWVzdD4gPSB7fTtcbiAgICByZXEuYm9keSA9IHBhcmFtcy5ib2R5IHx8IHt9O1xuICAgIHJlcS5wYXJhbXMgPSBwYXJhbXMucGFyYW1zIHx8IHt9O1xuICAgIHJlcS5xdWVyeSA9IHBhcmFtcy5xdWVyeSB8fCB7fTtcbiAgICByZXEuYml0Z28gPSBwYXJhbXMuYml0Z287XG4gICAgcmV0dXJuIHJlcSBhcyBleHByZXNzLlJlcXVlc3Q7XG4gIH07XG5cbiAgYWZ0ZXJFYWNoKCgpID0+IHtcbiAgICBzaW5vbi5yZXN0b3JlKCk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdPbiBjaGFpbiB3aXRoZHJhd2FsJywgKCkgPT4ge1xuICAgIGl0KCdzaG91bGQgc3VjY2Vzc2Z1bGx5IG1ha2UgYSBvbiBjaGFpbiB3aXRoZHJhd2FsJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXRQYXJhbXMgPSB7XG4gICAgICAgIHJlY2lwaWVudHM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhbW91bnRTYXQ6ICc1MDAwMDAnLFxuICAgICAgICAgICAgYWRkcmVzczogJ2JjcnQxcWpxNDhjcWsydTgwaGV3ZGNuZGY1MzltOG5ubnZ0ODQ1bmw2OHg3JyxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICBzYXRzUGVyVmJ5dGU6ICcxNScsXG4gICAgICB9O1xuXG4gICAgICBjb25zdCBleHBlY3RlZFJlc3BvbnNlOiBQYXlJbnZvaWNlUmVzcG9uc2UgPSB7XG4gICAgICAgIHR4UmVxdWVzdFN0YXRlOiAnZGVsaXZlcmVkJyxcbiAgICAgICAgdHhSZXF1ZXN0SWQ6ICcxMjMnLFxuICAgICAgfTtcblxuICAgICAgY29uc3Qgb25jaGFpbldpdGhkcmF3U3R1YiA9IHNpbm9uLnN0dWIoKS5yZXNvbHZlcyhleHBlY3RlZFJlc3BvbnNlKTtcbiAgICAgIGNvbnN0IG1vY2tMaWdodG5pbmdXYWxsZXQgPSB7XG4gICAgICAgIHdpdGhkcmF3T25jaGFpbjogb25jaGFpbldpdGhkcmF3U3R1YixcbiAgICAgIH07XG5cbiAgICAgIC8vIE1vY2sgdGhlIG1vZHVsZSBpbXBvcnRcbiAgICAgIGNvbnN0IHByb3h5cXVpcmUgPSByZXF1aXJlKCdwcm94eXF1aXJlJyk7XG4gICAgICBjb25zdCBsaWdodG5pbmdXaXRoZHJhd1JvdXRlcyA9IHByb3h5cXVpcmUoJy4uLy4uLy4uL3NyYy9saWdodG5pbmcvbGlnaHRuaW5nV2l0aGRyYXdSb3V0ZXMnLCB7XG4gICAgICAgICdAYml0Z28vYWJzdHJhY3QtbGlnaHRuaW5nJzoge1xuICAgICAgICAgIGdldExpZ2h0bmluZ1dhbGxldDogKCkgPT4gbW9ja0xpZ2h0bmluZ1dhbGxldCxcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCB3YWxsZXRTdHViID0ge307XG4gICAgICBjb25zdCBjb2luU3R1YiA9IHtcbiAgICAgICAgd2FsbGV0czogKCkgPT4gKHsgZ2V0OiBzaW5vbi5zdHViKCkucmVzb2x2ZXMod2FsbGV0U3R1YikgfSksXG4gICAgICB9O1xuICAgICAgY29uc3Qgc3R1YkJpdGdvID0gc2lub24uY3JlYXRlU3R1Ykluc3RhbmNlKEJpdEdvIGFzIGFueSwgeyBjb2luOiBjb2luU3R1YiB9KTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3RPYmplY3Qoe1xuICAgICAgICBwYXJhbXM6IHsgaWQ6ICd0ZXN0V2FsbGV0SWQnLCBjb2luIH0sXG4gICAgICAgIGJvZHk6IGlucHV0UGFyYW1zLFxuICAgICAgICBiaXRnbzogc3R1YkJpdGdvLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGxpZ2h0bmluZ1dpdGhkcmF3Um91dGVzLmhhbmRsZUxpZ2h0bmluZ1dpdGhkcmF3KHJlcSk7XG5cbiAgICAgIHNob3VsZChyZXN1bHQpLmRlZXBFcXVhbChleHBlY3RlZFJlc3BvbnNlKTtcbiAgICAgIHNob3VsZChvbmNoYWluV2l0aGRyYXdTdHViKS5iZS5jYWxsZWRPbmNlKCk7XG4gICAgICBjb25zdCBbZmlyc3RBcmddID0gb25jaGFpbldpdGhkcmF3U3R1Yi5nZXRDYWxsKDApLmFyZ3M7XG5cbiAgICAgIGNvbnN0IGRlY29kZWRSZWNpcGllbnRzID0gaW5wdXRQYXJhbXMucmVjaXBpZW50cy5tYXAoKHJlY2lwaWVudCkgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIC4uLnJlY2lwaWVudCxcbiAgICAgICAgICBhbW91bnRTYXQ6IEJpZ0ludChyZWNpcGllbnQuYW1vdW50U2F0KSxcbiAgICAgICAgfTtcbiAgICAgIH0pO1xuXG4gICAgICAvLyB3ZSBkZWNvZGUgdGhlIGFtb3VudE1zYXQgc3RyaW5nIHRvIGJpZ2ludCwgaXQgc2hvdWxkIGJlIGluIGJpZ2ludCBmb3JtYXQgd2hlbiBwYXNzZWQgdG8gcGF5SW52b2ljZVxuICAgICAgc2hvdWxkKGZpcnN0QXJnKS5oYXZlLnByb3BlcnR5KCdyZWNpcGllbnRzJywgZGVjb2RlZFJlY2lwaWVudHMpO1xuICAgICAgc2hvdWxkKGZpcnN0QXJnKS5oYXZlLnByb3BlcnR5KCdzYXRzUGVyVmJ5dGUnLCBCaWdJbnQoaW5wdXRQYXJhbXMuc2F0c1BlclZieXRlKSk7XG4gICAgfSk7XG5cbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVycm9yIGlmIHRoZSBzYXRzUGVyVmJ5dGUgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdCBwYXJhbXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFBhcmFtcyA9IHtcbiAgICAgICAgcmVjaXBpZW50czogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFtb3VudFNhdDogJzUwMDAwMCcsXG4gICAgICAgICAgICBhZGRyZXNzOiAnYmNydDFxanE0OGNxazJ1ODBoZXdkY25kZjUzOW04bm5udnQ4NDVubDY4eDcnLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByZXEgPSBtb2NrUmVxdWVzdE9iamVjdCh7XG4gICAgICAgIHBhcmFtczogeyBpZDogJ3Rlc3RXYWxsZXRJZCcsIGNvaW4gfSxcbiAgICAgICAgYm9keTogaW5wdXRQYXJhbXMsXG4gICAgICB9KTtcbiAgICAgIHJlcS5iaXRnbyA9IGJpdGdvO1xuXG4gICAgICBhd2FpdCBzaG91bGQoaGFuZGxlTGlnaHRuaW5nV2l0aGRyYXcocmVxKSkuYmUucmVqZWN0ZWRXaXRoKFxuICAgICAgICAnSW52YWxpZCByZXF1ZXN0IGJvZHkgZm9yIHdpdGhkcmF3aW5nIG9uIGNoYWluIGxpZ2h0bmluZyBiYWxhbmNlJ1xuICAgICAgKTtcbiAgICB9KTtcblxuICAgIGl0KCdzaG91bGQgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIHJlY2lwaWVudHMgaXMgbWlzc2luZyBpbiB0aGUgcmVxdWVzdCBwYXJhbXMnLCBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dFBhcmFtcyA9IHtcbiAgICAgICAgc2F0c1BlclZieXRlOiAnMTUnLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgcmVxID0gbW9ja1JlcXVlc3RPYmplY3Qoe1xuICAgICAgICBwYXJhbXM6IHsgaWQ6ICd0ZXN0V2FsbGV0SWQnLCBjb2luIH0sXG4gICAgICAgIGJvZHk6IGlucHV0UGFyYW1zLFxuICAgICAgfSk7XG4gICAgICByZXEuYml0Z28gPSBiaXRnbztcblxuICAgICAgYXdhaXQgc2hvdWxkKGhhbmRsZUxpZ2h0bmluZ1dpdGhkcmF3KHJlcSkpLmJlLnJlamVjdGVkV2l0aChcbiAgICAgICAgJ0ludmFsaWQgcmVxdWVzdCBib2R5IGZvciB3aXRoZHJhd2luZyBvbiBjaGFpbiBsaWdodG5pbmcgYmFsYW5jZSdcbiAgICAgICk7XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=Выполнить команду
Для локальной разработки. Не используйте в интернете!