PHP WebShell
Текущая директория: /opt/BitGoJS/modules/sdk-coin-eth/dist/test/unit/transactionBuilder
Просмотр файла: contractCall.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 should_1 = __importDefault(require("should"));
const sdk_core_1 = require("@bitgo/sdk-core");
const testData = __importStar(require("../../resources/eth"));
const getBuilder_1 = require("../getBuilder");
describe('Eth contract call transaction builder', () => {
let txBuilder;
let contractAddress;
const rawTx = '0xf889398506fc23ac0083be8c72947fc37878dca69c9ac48397500279305f798b157280a42bf90baacecf367fdc11132a0ccfeb91692cb31ff126083c353459e0572a0b34c48e952377a0206c902a536c5327ea2861965538963b6180f7d13e36ffd4abb7aa9628f72eb9a05ee209b7b02a2ea3fbf6033701d6e959dfc1e78452235245cf2b8d3f9110c6af';
beforeEach(() => {
contractAddress = '0x8f977e912ef500548a0c3be6ddde9899f1199b81';
// testData.KEYPAIR_PRV.getKeys().prv as string;
txBuilder = (0, getBuilder_1.getBuilder)('teth');
txBuilder.type(sdk_core_1.TransactionType.ContractCall);
txBuilder.fee({
fee: '30000000000',
gasLimit: '12487794',
});
txBuilder.counter(57);
});
it('should build a contract call type transaction', async () => {
txBuilder.contract('0x7Fc37878DCa69C9AC48397500279305F798b1572');
txBuilder.data('0x2bf90baacecf367fdc11132a0ccfeb91692cb31ff126083c353459e0572a0b34c48e9523');
txBuilder.sign({ key: '064A3BF8B08A3426E8A719AE5E4115228A75E7A1449CB1B734E51C7DC8A867BE' });
const tx = await txBuilder.build();
should_1.default.exist(tx);
should_1.default.equal(tx.toBroadcastFormat(), rawTx);
});
it('should deserialize an serialize raw transaction', async () => {
txBuilder.from(rawTx);
const tx = await txBuilder.build();
should_1.default.equal(tx.toBroadcastFormat(), rawTx);
});
it('should build a contract call type transaction, deserialize it, sign it and serialize it again', async () => {
txBuilder.contract('0x7Fc37878DCa69C9AC48397500279305F798b1572');
txBuilder.data('0x2bf90baacecf367fdc11132a0ccfeb91692cb31ff126083c353459e0572a0b34c48e9523');
const txUnsigned = await txBuilder.build();
const builderFrom = (0, getBuilder_1.getBuilder)('teth');
builderFrom.from(txUnsigned.toBroadcastFormat());
builderFrom.sign({ key: '064A3BF8B08A3426E8A719AE5E4115228A75E7A1449CB1B734E51C7DC8A867BE' });
const tx = await builderFrom.build();
should_1.default.equal(tx.toBroadcastFormat(), rawTx);
should_1.default.equal(txUnsigned.toJson().v, '0x77');
});
it('should thrown if contract or data is missing', async () => {
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing contract address');
txBuilder.contract(contractAddress);
await txBuilder.build().should.be.rejectedWith('Invalid transaction: missing contract call data field');
});
it('should properly build tx for eth2 staking staking deposit', async () => {
txBuilder.contract(testData.ETH2_STAKING_CONTRACT_ADDRESS);
txBuilder.data(testData.ETH2_STAKING_CONTRACT_DATA);
txBuilder.sign({ key: '064A3BF8B08A3426E8A719AE5E4115228A75E7A1449CB1B734E51C7DC8A867BE' });
const tx = await txBuilder.build();
should_1.default.exist(tx);
const txData = tx.toJson();
should_1.default.equal(txData.to, testData.ETH2_STAKING_CONTRACT_ADDRESS);
should_1.default.equal(txData.from, '0x14fc903e3025a3aad66fad7a7862b1ec232f8df2');
should_1.default.equal(txData.data, testData.ETH2_STAKING_CONTRACT_DATA);
should_1.default.equal(txData.nonce, 57);
should_1.default.equal(txData.chainId, '0x2a');
});
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJhY3RDYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGVzdC91bml0L3RyYW5zYWN0aW9uQnVpbGRlci9jb250cmFjdENhbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFFNUIsOENBQWtEO0FBQ2xELDhEQUFnRDtBQUNoRCw4Q0FBMkM7QUFFM0MsUUFBUSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRTtJQUNyRCxJQUFJLFNBQVMsQ0FBQztJQUNkLElBQUksZUFBZSxDQUFDO0lBQ3BCLE1BQU0sS0FBSyxHQUNULDBSQUEwUixDQUFDO0lBRTdSLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxlQUFlLEdBQUcsNENBQTRDLENBQUM7UUFDL0QsZ0RBQWdEO1FBQ2hELFNBQVMsR0FBRyxJQUFBLHVCQUFVLEVBQUMsTUFBTSxDQUF1QixDQUFDO1FBQ3JELFNBQVMsQ0FBQyxJQUFJLENBQUMsMEJBQWUsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM3QyxTQUFTLENBQUMsR0FBRyxDQUFDO1lBQ1osR0FBRyxFQUFFLGFBQWE7WUFDbEIsUUFBUSxFQUFFLFVBQVU7U0FDckIsQ0FBQyxDQUFDO1FBQ0gsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4QixDQUFDLENBQUMsQ0FBQztJQUVILEVBQUUsQ0FBQywrQ0FBK0MsRUFBRSxLQUFLLElBQUksRUFBRTtRQUM3RCxTQUFTLENBQUMsUUFBUSxDQUFDLDRDQUE0QyxDQUFDLENBQUM7UUFDakUsU0FBUyxDQUFDLElBQUksQ0FBQyw0RUFBNEUsQ0FBQyxDQUFDO1FBQzdGLFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsa0VBQWtFLEVBQUUsQ0FBQyxDQUFDO1FBQzVGLE1BQU0sRUFBRSxHQUFHLE1BQU0sU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFD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SyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9CLGdCQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaG91bGQgZnJvbSAnc2hvdWxkJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uQnVpbGRlciB9IGZyb20gJy4uLy4uLy4uL3NyYyc7XG5pbXBvcnQgeyBUcmFuc2FjdGlvblR5cGUgfSBmcm9tICdAYml0Z28vc2RrLWNvcmUnO1xuaW1wb3J0ICogYXMgdGVzdERhdGEgZnJvbSAnLi4vLi4vcmVzb3VyY2VzL2V0aCc7XG5pbXBvcnQgeyBnZXRCdWlsZGVyIH0gZnJvbSAnLi4vZ2V0QnVpbGRlcic7XG5cbmRlc2NyaWJlKCdFdGggY29udHJhY3QgY2FsbCB0cmFuc2FjdGlvbiBidWlsZGVyJywgKCkgPT4ge1xuICBsZXQgdHhCdWlsZGVyO1xuICBsZXQgY29udHJhY3RBZGRyZXNzO1xuICBjb25zdCByYXdUeCA9XG4gICAgJzB4Zjg4OTM5ODUwNmZjMjNhYzAwODNiZThjNzI5NDdmYzM3ODc4ZGNhNjljOWFjNDgzOTc1MDAyNzkzMDVmNzk4YjE1NzI4MGE0MmJmOTBiYWFjZWNmMzY3ZmRjMTExMzJhMGNjZmViOTE2OTJjYjMxZmYxMjYwODNjMzUzNDU5ZTA1NzJhMGIzNGM0OGU5NTIzNzdhMDIwNmM5MDJhNTM2YzUzMjdlYTI4NjE5NjU1Mzg5NjNiNjE4MGY3ZDEzZTM2ZmZkNGFiYjdhYTk2MjhmNzJlYjlhMDVlZTIwOWI3YjAyYTJlYTNmYmY2MDMzNzAxZDZlOTU5ZGZjMWU3ODQ1MjIzNTI0NWNmMmI4ZDNmOTExMGM2YWYnO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGNvbnRyYWN0QWRkcmVzcyA9ICcweDhmOTc3ZTkxMmVmNTAwNTQ4YTBjM2JlNmRkZGU5ODk5ZjExOTliODEnO1xuICAgIC8vIHRlc3REYXRhLktFWVBBSVJfUFJWLmdldEtleXMoKS5wcnYgYXMgc3RyaW5nO1xuICAgIHR4QnVpbGRlciA9IGdldEJ1aWxkZXIoJ3RldGgnKSBhcyBUcmFuc2FjdGlvbkJ1aWxkZXI7XG4gICAgdHhCdWlsZGVyLnR5cGUoVHJhbnNhY3Rpb25UeXBlLkNvbnRyYWN0Q2FsbCk7XG4gICAgdHhCdWlsZGVyLmZlZSh7XG4gICAgICBmZWU6ICczMDAwMDAwMDAwMCcsXG4gICAgICBnYXNMaW1pdDogJzEyNDg3Nzk0JyxcbiAgICB9KTtcbiAgICB0eEJ1aWxkZXIuY291bnRlcig1Nyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgYnVpbGQgYSBjb250cmFjdCBjYWxsIHR5cGUgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KCcweDdGYzM3ODc4RENhNjlDOUFDNDgzOTc1MDAyNzkzMDVGNzk4YjE1NzInKTtcbiAgICB0eEJ1aWxkZXIuZGF0YSgnMHgyYmY5MGJhYWNlY2YzNjdmZGMxMTEzMmEwY2NmZWI5MTY5MmNiMzFmZjEyNjA4M2MzNTM0NTllMDU3MmEwYjM0YzQ4ZTk1MjMnKTtcbiAgICB0eEJ1aWxkZXIuc2lnbih7IGtleTogJzA2NEEzQkY4QjA4QTM0MjZFOEE3MTlBRTVFNDExNTIyOEE3NUU3QTE0NDlDQjFCNzM0RTUxQzdEQzhBODY3QkUnIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4KTtcbiAgICBzaG91bGQuZXF1YWwodHgudG9Ccm9hZGNhc3RGb3JtYXQoKSwgcmF3VHgpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGRlc2VyaWFsaXplIGFuIHNlcmlhbGl6ZSByYXcgdHJhbnNhY3Rpb24nLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLmZyb20ocmF3VHgpO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4LnRvQnJvYWRjYXN0Rm9ybWF0KCksIHJhd1R4KTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCBidWlsZCBhIGNvbnRyYWN0IGNhbGwgdHlwZSB0cmFuc2FjdGlvbiwgZGVzZXJpYWxpemUgaXQsIHNpZ24gaXQgYW5kIHNlcmlhbGl6ZSBpdCBhZ2FpbicsIGFzeW5jICgpID0+IHtcbiAgICB0eEJ1aWxkZXIuY29udHJhY3QoJzB4N0ZjMzc4NzhEQ2E2OUM5QUM0ODM5NzUwMDI3OTMwNUY3OThiMTU3MicpO1xuICAgIHR4QnVpbGRlci5kYXRhKCcweDJiZjkwYmFhY2VjZjM2N2ZkYzExMTMyYTBjY2ZlYjkxNjkyY2IzMWZmMTI2MDgzYzM1MzQ1OWUwNTcyYTBiMzRjNDhlOTUyMycpO1xuICAgIGNvbnN0IHR4VW5zaWduZWQgPSBhd2FpdCB0eEJ1aWxkZXIuYnVpbGQoKTtcblxuICAgIGNvbnN0IGJ1aWxkZXJGcm9tID0gZ2V0QnVpbGRlcigndGV0aCcpIGFzIFRyYW5zYWN0aW9uQnVpbGRlcjtcbiAgICBidWlsZGVyRnJvbS5mcm9tKHR4VW5zaWduZWQudG9Ccm9hZGNhc3RGb3JtYXQoKSk7XG4gICAgYnVpbGRlckZyb20uc2lnbih7IGtleTogJzA2NEEzQkY4QjA4QTM0MjZFOEE3MTlBRTVFNDExNTIyOEE3NUU3QTE0NDlDQjFCNzM0RTUxQzdEQzhBODY3QkUnIH0pO1xuICAgIGNvbnN0IHR4ID0gYXdhaXQgYnVpbGRlckZyb20uYnVpbGQoKTtcblxuICAgIHNob3VsZC5lcXVhbCh0eC50b0Jyb2FkY2FzdEZvcm1hdCgpLCByYXdUeCk7XG4gICAgc2hvdWxkLmVxdWFsKHR4VW5zaWduZWQudG9Kc29uKCkudiwgJzB4NzcnKTtcbiAgfSk7XG5cbiAgaXQoJ3Nob3VsZCB0aHJvd24gaWYgY29udHJhY3Qgb3IgZGF0YSBpcyBtaXNzaW5nJywgYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgY29udHJhY3QgYWRkcmVzcycpO1xuICAgIHR4QnVpbGRlci5jb250cmFjdChjb250cmFjdEFkZHJlc3MpO1xuICAgIGF3YWl0IHR4QnVpbGRlci5idWlsZCgpLnNob3VsZC5iZS5yZWplY3RlZFdpdGgoJ0ludmFsaWQgdHJhbnNhY3Rpb246IG1pc3NpbmcgY29udHJhY3QgY2FsbCBkYXRhIGZpZWxkJyk7XG4gIH0pO1xuXG4gIGl0KCdzaG91bGQgcHJvcGVybHkgYnVpbGQgdHggZm9yIGV0aDIgc3Rha2luZyBzdGFraW5nIGRlcG9zaXQnLCBhc3luYyAoKSA9PiB7XG4gICAgdHhCdWlsZGVyLmNvbnRyYWN0KHRlc3REYXRhLkVUSDJfU1RBS0lOR19DT05UUkFDVF9BRERSRVNTKTtcbiAgICB0eEJ1aWxkZXIuZGF0YSh0ZXN0RGF0YS5FVEgyX1NUQUtJTkdfQ09OVFJBQ1RfREFUQSk7XG4gICAgdHhCdWlsZGVyLnNpZ24oeyBrZXk6ICcwNjRBM0JGOEIwOEEzNDI2RThBNzE5QUU1RTQxMTUyMjhBNzVFN0ExNDQ5Q0IxQjczNEU1MUM3REM4QTg2N0JFJyB9KTtcblxuICAgIGNvbnN0IHR4ID0gYXdhaXQgdHhCdWlsZGVyLmJ1aWxkKCk7XG4gICAgc2hvdWxkLmV4aXN0KHR4KTtcblxuICAgIGNvbnN0IHR4RGF0YSA9IHR4LnRvSnNvbigpO1xuICAgIHNob3VsZC5lcXVhbCh0eERhdGEudG8sIHRlc3REYXRhLkVUSDJfU1RBS0lOR19DT05UUkFDVF9BRERSRVNTKTtcbiAgICBzaG91bGQuZXF1YWwodHhEYXRhLmZyb20sICcweDE0ZmM5MDNlMzAyNWEzYWFkNjZmYWQ3YTc4NjJiMWVjMjMyZjhkZjInKTtcbiAgICBzaG91bGQuZXF1YWwodHhEYXRhLmRhdGEsIHRlc3REYXRhLkVUSDJfU1RBS0lOR19DT05UUkFDVF9EQVRBKTtcbiAgICBzaG91bGQuZXF1YWwodHhEYXRhLm5vbmNlLCA1Nyk7XG4gICAgc2hvdWxkLmVxdWFsKHR4RGF0YS5jaGFpbklkLCAnMHgyYScpO1xuICB9KTtcbn0pO1xuIl19Выполнить команду
Для локальной разработки. Не используйте в интернете!