PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-icp/dist/test/unit

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

"use strict";
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
    var ownKeys = function(o) {
        ownKeys = Object.getOwnPropertyNames || function (o) {
            var ar = [];
            for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
            return ar;
        };
        return ownKeys(o);
    };
    return function (mod) {
        if (mod && mod.__esModule) return mod;
        var result = {};
        if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
        __setModuleDefault(result, mod);
        return result;
    };
})();
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const src_1 = require("../../src");
const statics_1 = require("@bitgo/statics");
const assert_1 = __importDefault(require("assert"));
const should_1 = __importDefault(require("should"));
const utils_1 = require("../../src/lib/utils");
const sdk_core_1 = require("@bitgo/sdk-core");
const testData = __importStar(require("../resources/icp"));
const getBuilderFactory_1 = require("./getBuilderFactory");
const sinon_1 = __importDefault(require("sinon"));
describe('ICP Transaction', () => {
    let tx;
    let utils;
    let serializedTxHex;
    const config = statics_1.coins.get('ticp');
    beforeEach(() => {
        utils = new utils_1.Utils();
        tx = new src_1.Transaction(config, utils);
        const serializedTxFormat = {
            serializedTxHex: testData.PayloadsData,
            publicKey: testData.Accounts.account1.publicKey,
        };
        serializedTxHex = Buffer.from(JSON.stringify(serializedTxFormat), 'utf-8').toString('hex');
        sinon_1.default.stub(utils, 'validateExpireTime').returns(true);
    });
    describe('empty transaction', () => {
        it('should throw an empty transaction error', () => {
            assert_1.default.throws(() => tx.toBroadcastFormat(), (err) => err instanceof sdk_core_1.InvalidTransactionError && err.message === 'Empty transaction', 'Expected an InvalidTransactionError with message "Empty transaction"');
            assert_1.default.throws(() => tx.toJson(), (err) => err instanceof sdk_core_1.InvalidTransactionError && err.message === 'Empty transaction', 'Expected an InvalidTransactionError with message "Empty transaction"');
        });
    });
    describe('build a txn from init() method', () => {
        it('start and build a txn with builder init method', async () => {
            const txn = new src_1.Transaction(config, utils);
            txn.icpTransactionData = testData.IcpTransactionData;
            const factory = (0, getBuilderFactory_1.getBuilderFactory)('ticp');
            const txBuilder = factory.getTransferBuilder();
            txBuilder.initBuilder(txn);
            await txBuilder.build();
            const icpTransaction = txBuilder.transaction.icpTransaction;
            const payloadsData = txBuilder.transaction.payloadsData;
            should_1.default.equal(icpTransaction.metadata.memo, testData.IcpTransactionData.memo);
            should_1.default.equal(icpTransaction.operations[0].account.address, testData.IcpTransactionData.senderAddress);
            should_1.default.equal(icpTransaction.operations[1].account.address, testData.IcpTransactionData.receiverAddress);
            should_1.default.equal(icpTransaction.operations[1].amount.value, testData.IcpTransactionData.amount);
            should_1.default.equal(icpTransaction.operations[2].amount.value, testData.IcpTransactionData.fee);
            should_1.default.equal(icpTransaction.public_keys[0].hex_bytes, testData.IcpTransactionData.senderPublicKeyHex);
            payloadsData.payloads.should.be.an.Array();
            payloadsData.payloads.length.should.equal(1);
        });
    });
    describe('from raw transaction', () => {
        it('build a json transaction from raw hex', async () => {
            await tx.fromRawTransaction(serializedTxHex);
            const json = tx.toJson();
            should_1.default.equal(json.memo, testData.ParsedRawTransaction.metadata.memo);
            should_1.default.equal(json.feeAmount, testData.ParsedRawTransaction.operations[2].amount.value);
            should_1.default.equal(json.sender, testData.ParsedRawTransaction.operations[0].account.address);
            should_1.default.equal(json.recipient, testData.ParsedRawTransaction.operations[1].account.address);
            should_1.default.equal(json.senderPublicKey, testData.Accounts.account1.publicKey);
            should_1.default.equal(json.id, testData.OnChainTransactionHash);
        });
    });
    describe('Explain', () => {
        it('explain transaction', async () => {
            await tx.fromRawTransaction(serializedTxHex);
            const explain = tx.explainTransaction();
            explain.outputAmount.should.equal('10');
            explain.outputs[0].amount.should.equal('10');
            explain.outputs[0].address.should.equal(testData.Accounts.account2.address);
            explain.fee.fee.should.equal('-10000');
            explain.changeAmount.should.equal('0');
            if (explain.displayOrder !== undefined) {
                explain.displayOrder.should.deepEqual([
                    'id',
                    'outputAmount',
                    'changeAmount',
                    'outputs',
                    'changeOutputs',
                    'fee',
                ]);
            }
        });
    });
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90ZXN0L3VuaXQvdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBd0M7QUFDeEMsNENBQXVDO0FBQ3ZDLG9EQUE0QjtBQUM1QixvREFBNEI7QUFDNUIsK0NBQTRDO0FBQzVDLDhDQUEwRDtBQUMxRCwyREFBNkM7QUFDN0MsMkRBQXdEO0FBQ3hELGtEQUEwQjtBQUUxQixRQUFRLENBQUMsaUJBQWlCLEVBQUUsR0FBRyxFQUFFO0lBQy9CLElBQUksRUFBZSxDQUFDO0lBQ3BCLElBQUksS0FBWSxDQUFDO0lBQ2pCLElBQUksZUFBb0IsQ0FBQztJQUN6QixNQUFNLE1BQU0sR0FBRyxlQUFLLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRWpDLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxLQUFLLEdBQUcsSUFBSSxhQUFLLEVBQUUsQ0FBQztRQUNwQixFQUFFLEdBQUcsSUFBSSxpQkFBVyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUNwQyxNQUFNLGtCQUFrQixHQUFHO1lBQ3pCLGVBQWUsRUFBRSxRQUFRLENBQUMsWUFBWTtZQUN0QyxTQUFTLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsU0FBUztTQUNoRCxDQUFDO1FBQ0YsZUFBZSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMzRixlQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4RCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxtQkFB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a0IsQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3QyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUV4QyxPQUFPLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDeEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM3QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQzVFLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDdkMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZDLElBQUksT0FBTyxDQUFDLFlBQVksS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdkMsT0FBTyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO29CQUNwQyxJQUFJO29CQUNKLGNBQWM7b0JBQ2QsY0FBYztvQkFDZCxTQUFTO29CQUNULGVBQWU7b0JBQ2YsS0FBSztpQkFDTixDQUFDLENBQUM7WUFDTCxDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVHJhbnNhY3Rpb24gfSBmcm9tICcuLi8uLi9zcmMnO1xuaW1wb3J0IHsgY29pbnMgfSBmcm9tICdAYml0Z28vc3RhdGljcyc7XG5pbXBvcnQgYXNzZXJ0IGZyb20gJ2Fzc2VydCc7XG5pbXBvcnQgc2hvdWxkIGZyb20gJ3Nob3VsZCc7XG5pbXBvcnQgeyBVdGlscyB9IGZyb20gJy4uLy4uL3NyYy9saWIvdXRpbHMnO1xuaW1wb3J0IHsgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vcmVzb3VyY2VzL2ljcCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyRmFjdG9yeSB9IGZyb20gJy4vZ2V0QnVpbGRlckZhY3RvcnknO1xuaW1wb3J0IHNpbm9uIGZyb20gJ3Npbm9uJztcblxuZGVzY3JpYmUoJ0lDUCBUcmFuc2FjdGlvbicsICgpID0+IHtcbiAgbGV0IHR4OiBUcmFuc2FjdGlvbjtcbiAgbGV0IHV0aWxzOiBVdGlscztcbiAgbGV0IHNlcmlhbGl6ZWRUeEhleDogYW55O1xuICBjb25zdCBjb25maWcgPSBjb2lucy5nZXQoJ3RpY3AnKTtcblxuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICB1dGlscyA9IG5ldyBVdGlscygpO1xuICAgIHR4ID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZywgdXRpbHMpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWRUeEZvcm1hdCA9IHtcbiAgICAgIHNlcmlhbGl6ZWRUeEhleDogdGVzdERhdGEuUGF5bG9hZHNEYXRhLFxuICAgICAgcHVibGljS2V5OiB0ZXN0RGF0YS5BY2NvdW50cy5hY2NvdW50MS5wdWJsaWNLZXksXG4gICAgfTtcbiAgICBzZXJpYWxpemVkVHhIZXggPSBCdWZmZXIuZnJvbShKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkVHhGb3JtYXQpLCAndXRmLTgnKS50b1N0cmluZygnaGV4Jyk7XG4gICAgc2lub24uc3R1Yih1dGlscywgJ3ZhbGlkYXRlRXhwaXJlVGltZScpLnJldHVybnModHJ1ZSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdlbXB0eSB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnc2hvdWxkIHRocm93IGFuIGVtcHR5IHRyYW5zYWN0aW9uIGVycm9yJywgKCkgPT4ge1xuICAgICAgYXNzZXJ0LnRocm93cyhcbiAgICAgICAgKCkgPT4gdHgudG9Ccm9hZGNhc3RGb3JtYXQoKSxcbiAgICAgICAgKGVycikgPT4gZXJyIGluc3RhbmNlb2YgSW52YWxpZFRyYW5zYWN0aW9uRXJyb3IgJiYgZXJyLm1lc3NhZ2UgPT09ICdFbXB0eSB0cmFuc2FjdGlvbicsXG4gICAgICAgICdFeHBlY3RlZCBhbiBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciB3aXRoIG1lc3NhZ2UgXCJFbXB0eSB0cmFuc2FjdGlvblwiJ1xuICAgICAgKTtcbiAgICAgIGFzc2VydC50aHJvd3MoXG4gICAgICAgICgpID0+IHR4LnRvSnNvbigpLFxuICAgICAgICAoZXJyKSA9PiBlcnIgaW5zdGFuY2VvZiBJbnZhbGlkVHJhbnNhY3Rpb25FcnJvciAmJiBlcnIubWVzc2FnZSA9PT0gJ0VtcHR5IHRyYW5zYWN0aW9uJyxcbiAgICAgICAgJ0V4cGVjdGVkIGFuIEludmFsaWRUcmFuc2FjdGlvbkVycm9yIHdpdGggbWVzc2FnZSBcIkVtcHR5IHRyYW5zYWN0aW9uXCInXG4gICAgICApO1xuICAgIH0pO1xuICB9KTtcblxuICBkZXNjcmliZSgnYnVpbGQgYSB0eG4gZnJvbSBpbml0KCkgbWV0aG9kJywgKCkgPT4ge1xuICAgIGl0KCdzdGFydCBhbmQgYnVpbGQgYSB0eG4gd2l0aCBidWlsZGVyIGluaXQgbWV0aG9kJywgYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgdHhuID0gbmV3IFRyYW5zYWN0aW9uKGNvbmZpZywgdXRpbHMpO1xuICAgICAgdHhuLmljcFRyYW5zYWN0aW9uRGF0YSA9IHRlc3REYXRhLkljcFRyYW5zYWN0aW9uRGF0YTtcbiAgICAgIGNvbnN0IGZhY3RvcnkgPSBnZXRCdWlsZGVyRmFjdG9yeSgndGljcCcpO1xuICAgICAgY29uc3QgdHhCdWlsZGVyID0gZmFjdG9yeS5nZXRUcmFuc2ZlckJ1aWxkZXIoKTtcbiAgICAgIHR4QnVpbGRlci5pbml0QnVpbGRlcih0eG4pO1xuICAgICAgYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgIGNvbnN0IGljcFRyYW5zYWN0aW9uID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uLmljcFRyYW5zYWN0aW9uO1xuICAgICAgY29uc3QgcGF5bG9hZHNEYXRhID0gdHhCdWlsZGVyLnRyYW5zYWN0aW9uLnBheWxvYWRzRGF0YTtcbiAgICAgIHNob3VsZC5lcXVhbChpY3BUcmFuc2FjdGlvbi5tZXRhZGF0YS5tZW1vLCB0ZXN0RGF0YS5JY3BUcmFuc2FjdGlvbkRhdGEubWVtbyk7XG4gICAgICBzaG91bGQuZXF1YWwoaWNwVHJhbnNhY3Rpb24ub3BlcmF0aW9uc1swXS5hY2NvdW50LmFkZHJlc3MsIHRlc3REYXRhLkljcFRyYW5zYWN0aW9uRGF0YS5zZW5kZXJBZGRyZXNzKTtcbiAgICAgIHNob3VsZC5lcXVhbChpY3BUcmFuc2FjdGlvbi5vcGVyYXRpb25zWzFdLmFjY291bnQuYWRkcmVzcywgdGVzdERhdGEuSWNwVHJhbnNhY3Rpb25EYXRhLnJlY2VpdmVyQWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwoaWNwVHJhbnNhY3Rpb24ub3BlcmF0aW9uc1sxXS5hbW91bnQudmFsdWUsIHRlc3REYXRhLkljcFRyYW5zYWN0aW9uRGF0YS5hbW91bnQpO1xuICAgICAgc2hvdWxkLmVxdWFsKGljcFRyYW5zYWN0aW9uLm9wZXJhdGlvbnNbMl0uYW1vdW50LnZhbHVlLCB0ZXN0RGF0YS5JY3BUcmFuc2FjdGlvbkRhdGEuZmVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChpY3BUcmFuc2FjdGlvbi5wdWJsaWNfa2V5c1swXS5oZXhfYnl0ZXMsIHRlc3REYXRhLkljcFRyYW5zYWN0aW9uRGF0YS5zZW5kZXJQdWJsaWNLZXlIZXgpO1xuICAgICAgcGF5bG9hZHNEYXRhLnBheWxvYWRzLnNob3VsZC5iZS5hbi5BcnJheSgpO1xuICAgICAgcGF5bG9hZHNEYXRhLnBheWxvYWRzLmxlbmd0aC5zaG91bGQuZXF1YWwoMSk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdmcm9tIHJhdyB0cmFuc2FjdGlvbicsICgpID0+IHtcbiAgICBpdCgnYnVpbGQgYSBqc29uIHRyYW5zYWN0aW9uIGZyb20gcmF3IGhleCcsIGFzeW5jICgpID0+IHtcbiAgICAgIGF3YWl0IHR4LmZyb21SYXdUcmFuc2FjdGlvbihzZXJpYWxpemVkVHhIZXgpO1xuICAgICAgY29uc3QganNvbiA9IHR4LnRvSnNvbigpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24ubWVtbywgdGVzdERhdGEuUGFyc2VkUmF3VHJhbnNhY3Rpb24ubWV0YWRhdGEubWVtbyk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5mZWVBbW91bnQsIHRlc3REYXRhLlBhcnNlZFJhd1RyYW5zYWN0aW9uLm9wZXJhdGlvbnNbMl0uYW1vdW50LnZhbHVlKTtcbiAgICAgIHNob3VsZC5lcXVhbChqc29uLnNlbmRlciwgdGVzdERhdGEuUGFyc2VkUmF3VHJhbnNhY3Rpb24ub3BlcmF0aW9uc1swXS5hY2NvdW50LmFkZHJlc3MpO1xuICAgICAgc2hvdWxkLmVxdWFsKGpzb24ucmVjaXBpZW50LCB0ZXN0RGF0YS5QYXJzZWRSYXdUcmFuc2FjdGlvbi5vcGVyYXRpb25zWzFdLmFjY291bnQuYWRkcmVzcyk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5zZW5kZXJQdWJsaWNLZXksIHRlc3REYXRhLkFjY291bnRzLmFjY291bnQxLnB1YmxpY0tleSk7XG4gICAgICBzaG91bGQuZXF1YWwoanNvbi5pZCwgdGVzdERhdGEuT25DaGFpblRyYW5zYWN0aW9uSGFzaCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKCdFeHBsYWluJywgKCkgPT4ge1xuICAgIGl0KCdleHBsYWluIHRyYW5zYWN0aW9uJywgYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdHguZnJvbVJhd1RyYW5zYWN0aW9uKHNlcmlhbGl6ZWRUeEhleCk7XG4gICAgICBjb25zdCBleHBsYWluID0gdHguZXhwbGFpblRyYW5zYWN0aW9uKCk7XG5cbiAgICAgIGV4cGxhaW4ub3V0cHV0QW1vdW50LnNob3VsZC5lcXVhbCgnMTAnKTtcbiAgICAgIGV4cGxhaW4ub3V0cHV0c1swXS5hbW91bnQuc2hvdWxkLmVxdWFsKCcxMCcpO1xuICAgICAgZXhwbGFpbi5vdXRwdXRzWzBdLmFkZHJlc3Muc2hvdWxkLmVxdWFsKHRlc3REYXRhLkFjY291bnRzLmFjY291bnQyLmFkZHJlc3MpO1xuICAgICAgZXhwbGFpbi5mZWUuZmVlLnNob3VsZC5lcXVhbCgnLTEwMDAwJyk7XG4gICAgICBleHBsYWluLmNoYW5nZUFtb3VudC5zaG91bGQuZXF1YWwoJzAnKTtcbiAgICAgIGlmIChleHBsYWluLmRpc3BsYXlPcmRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGV4cGxhaW4uZGlzcGxheU9yZGVyLnNob3VsZC5kZWVwRXF1YWwoW1xuICAgICAgICAgICdpZCcsXG4gICAgICAgICAgJ291dHB1dEFtb3VudCcsXG4gICAgICAgICAgJ2NoYW5nZUFtb3VudCcsXG4gICAgICAgICAgJ291dHB1dHMnLFxuICAgICAgICAgICdjaGFuZ2VPdXRwdXRzJyxcbiAgICAgICAgICAnZmVlJyxcbiAgICAgICAgXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufSk7XG4iXX0=

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


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