UNPKG

@harmony-js/transaction

Version:

transaction package for harmony

237 lines 9.37 kB
"use strict"; /** * @packageDocumentation * @module harmony-transaction * @hidden */ Object.defineProperty(exports, "__esModule", { value: true }); exports.RLPSign = exports.defaultMessenger = exports.TransactionEvents = exports.sleep = exports.recoverETH = exports.recover = exports.handleAddress = exports.handleNumber = exports.transactionFieldsETH = exports.transactionFields = void 0; var tslib_1 = require("tslib"); var utils_1 = require("@harmony-js/utils"); var crypto_1 = require("@harmony-js/crypto"); var network_1 = require("@harmony-js/network"); exports.transactionFields = [ { name: 'nonce', length: 32, fix: false }, { name: 'gasPrice', length: 32, fix: false, transform: 'hex' }, { name: 'gasLimit', length: 32, fix: false, transform: 'hex' }, { name: 'shardID', length: 16, fix: false }, // recover it after main repo fix { name: 'toShardID', length: 16, fix: false }, { name: 'to', length: 20, fix: true }, { name: 'value', length: 32, fix: false, transform: 'hex' }, { name: 'data', fix: false }, ]; exports.transactionFieldsETH = [ { name: 'nonce', length: 32, fix: false }, { name: 'gasPrice', length: 32, fix: false, transform: 'hex' }, { name: 'gasLimit', length: 32, fix: false, transform: 'hex' }, { name: 'to', length: 20, fix: true }, { name: 'value', length: 32, fix: false, transform: 'hex' }, { name: 'data', fix: false }, ]; exports.handleNumber = function (value) { if (utils_1.isHex(value) && value === '0x') { return utils_1.hexToNumber('0x00'); } else if (utils_1.isHex(value) && value !== '0x') { return utils_1.hexToNumber(value); } else { return value; } }; exports.handleAddress = function (value) { if (value === '0x') { return '0x'; } else if (utils_1.isAddress(value)) { return value; } else { return '0x'; } }; exports.recover = function (rawTransaction) { var transaction = crypto_1.decode(rawTransaction); if (transaction.length !== 11 && transaction.length !== 8) { throw new Error('invalid rawTransaction'); } var tx = { id: '0x', from: '0x', rawTransaction: '0x', unsignedRawTransaction: '0x', nonce: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[0]))).toNumber(), gasPrice: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[1]))), gasLimit: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[2]))), shardID: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[3]))).toNumber(), toShardID: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[4]))).toNumber(), to: exports.handleAddress(transaction[5]) !== '0x' ? crypto_1.getAddress(exports.handleAddress(transaction[5])).checksum : '0x', value: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[6]))), data: transaction[7], chainId: 0, signature: { r: '', s: '', recoveryParam: 0, v: 0, }, }; // Legacy unsigned transaction if (transaction.length === 8) { tx.unsignedRawTransaction = rawTransaction; return tx; } try { tx.signature.v = new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[8]))).toNumber(); } catch (error) { throw error; } tx.signature.r = crypto_1.hexZeroPad(transaction[9], 32); tx.signature.s = crypto_1.hexZeroPad(transaction[10], 32); if (new crypto_1.BN(utils_1.strip0x(exports.handleNumber(tx.signature.r))).isZero() && new crypto_1.BN(utils_1.strip0x(exports.handleNumber(tx.signature.s))).isZero()) { // EIP-155 unsigned transaction tx.chainId = tx.signature.v; tx.signature.v = 0; } else { // Signed Tranasaction tx.chainId = Math.floor((tx.signature.v - 35) / 2); if (tx.chainId < 0) { tx.chainId = 0; } var recoveryParam = tx.signature.v - 27; var raw = transaction.slice(0, 8); if (tx.chainId !== 0) { raw.push(crypto_1.hexlify(tx.chainId)); raw.push('0x'); raw.push('0x'); recoveryParam -= tx.chainId * 2 + 8; } var digest = crypto_1.keccak256(crypto_1.encode(raw)); try { var recoveredFrom = crypto_1.recoverAddress(digest, { r: crypto_1.hexlify(tx.signature.r), s: crypto_1.hexlify(tx.signature.s), recoveryParam: recoveryParam, }); tx.from = recoveredFrom === '0x' ? '0x' : crypto_1.getAddress(recoveredFrom).checksum; } catch (error) { throw error; } tx.rawTransaction = rawTransaction; tx.id = crypto_1.keccak256(rawTransaction); } return tx; }; exports.recoverETH = function (rawTransaction) { var transaction = crypto_1.decode(rawTransaction); if (transaction.length !== 9 && transaction.length !== 6) { throw new Error('invalid rawTransaction'); } var tx = { id: '0x', from: '0x', rawTransaction: '0x', unsignedRawTransaction: '0x', nonce: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[0]))).toNumber(), gasPrice: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[1]))), gasLimit: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[2]))), shardID: 0, toShardID: 0, to: exports.handleAddress(transaction[3]) !== '0x' ? crypto_1.getAddress(exports.handleAddress(transaction[3])).checksum : '0x', value: new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[4]))), data: transaction[5], chainId: 0, signature: { r: '', s: '', recoveryParam: 0, v: 0, }, }; // Legacy unsigned transaction if (transaction.length === 6) { tx.unsignedRawTransaction = rawTransaction; return tx; } try { tx.signature.v = new crypto_1.BN(utils_1.strip0x(exports.handleNumber(transaction[6]))).toNumber(); } catch (error) { throw error; } tx.signature.r = crypto_1.hexZeroPad(transaction[7], 32); tx.signature.s = crypto_1.hexZeroPad(transaction[8], 32); if (new crypto_1.BN(utils_1.strip0x(exports.handleNumber(tx.signature.r))).isZero() && new crypto_1.BN(utils_1.strip0x(exports.handleNumber(tx.signature.s))).isZero()) { // EIP-155 unsigned transaction tx.chainId = tx.signature.v; tx.signature.v = 0; } else { // Signed Tranasaction tx.chainId = Math.floor((tx.signature.v - 35) / 2); if (tx.chainId < 0) { tx.chainId = 0; } var recoveryParam = tx.signature.v - 27; var raw = transaction.slice(0, 6); if (tx.chainId !== 0) { raw.push(crypto_1.hexlify(tx.chainId)); raw.push('0x'); raw.push('0x'); recoveryParam -= tx.chainId * 2 + 8; } var digest = crypto_1.keccak256(crypto_1.encode(raw)); try { var recoveredFrom = crypto_1.recoverAddress(digest, { r: crypto_1.hexlify(tx.signature.r), s: crypto_1.hexlify(tx.signature.s), recoveryParam: recoveryParam, }); tx.from = recoveredFrom === '0x' ? '0x' : crypto_1.getAddress(recoveredFrom).checksum; } catch (error) { throw error; } tx.rawTransaction = rawTransaction; tx.id = crypto_1.keccak256(rawTransaction); } return tx; }; exports.sleep = function (ms) { return tslib_1.__awaiter(void 0, void 0, void 0, function () { return tslib_1.__generator(this, function (_a) { return [2 /*return*/, new Promise(function (resolve) { setTimeout(function () { return resolve(); }, ms); })]; }); }); }; var TransactionEvents; (function (TransactionEvents) { TransactionEvents["transactionHash"] = "transactionHash"; TransactionEvents["error"] = "error"; TransactionEvents["confirmation"] = "confirmation"; TransactionEvents["receipt"] = "receipt"; TransactionEvents["track"] = "track"; TransactionEvents["cxConfirmation"] = "cxConfirmation"; TransactionEvents["cxReceipt"] = "cxReceipt"; TransactionEvents["cxTrack"] = "cxTrack"; })(TransactionEvents = exports.TransactionEvents || (exports.TransactionEvents = {})); exports.defaultMessenger = new network_1.Messenger(new network_1.HttpProvider('http://localhost:9500'), utils_1.ChainType.Harmony); exports.RLPSign = function (transaction, prv) { var _a = tslib_1.__read(transaction.getRLPUnsigned(), 2), unsignedRawTransaction = _a[0], raw = _a[1]; var regroup = tslib_1.__assign(tslib_1.__assign({}, transaction.txParams), { unsignedRawTransaction: unsignedRawTransaction }); transaction.setParams(regroup); var signature = crypto_1.sign(crypto_1.keccak256(unsignedRawTransaction), prv); var signed = transaction.getRLPSigned(raw, signature); return [signature, signed]; }; //# sourceMappingURL=utils.js.map