UNPKG

web3x

Version:

Typescript port of web3.js

98 lines (95 loc) 10.1 kB
"use strict"; /* This file is part of web3x. web3x is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. web3x is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with web3x. If not, see <http://www.gnu.org/licenses/>. */ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const rlp_1 = require("rlp"); const address_1 = require("../address"); const account_1 = tslib_1.__importDefault(require("../eth-lib/account")); const bytes_1 = tslib_1.__importDefault(require("../eth-lib/bytes")); const nat_1 = tslib_1.__importDefault(require("../eth-lib/nat")); const rlp_2 = tslib_1.__importDefault(require("../eth-lib/rlp")); const formatters_1 = require("../formatters"); const utils_1 = require("../utils"); async function signTransaction(tx, privateKey, eth) { if (!tx.gas) { throw new Error('gas is missing or 0'); } // Resolve immediately if nonce, chainId and price are provided if (tx.nonce !== undefined && tx.chainId !== undefined && tx.gasPrice !== undefined) { return sign(tx, privateKey); } // Otherwise, get the missing info from the Ethereum Node const promises = [ isNot(tx.chainId) ? eth.getId() : Promise.resolve(tx.chainId), isNot(tx.gasPrice) ? eth.getGasPrice() : Promise.resolve(tx.gasPrice), isNot(tx.nonce) ? eth.getTransactionCount(address_1.Address.fromString(account_1.default.fromPrivate(privateKey).address)) : Promise.resolve(tx.nonce), ]; const [chainId, gasPrice, nonce] = await Promise.all(promises); if (isNot(chainId) || isNot(gasPrice) || isNot(nonce)) { throw new Error('One of the values chainId, gasPrice, or nonce could not be fetched'); } return sign({ ...tx, chainId, gasPrice, nonce }, privateKey); } exports.signTransaction = signTransaction; function recoverTransaction(rawTx) { const values = rlp_2.default.decode(rawTx); const signature = account_1.default.encodeSignature(values.slice(6, 9)); const recovery = bytes_1.default.toNumber(values[6]); const extraData = recovery < 35 ? [] : [bytes_1.default.fromNumber((recovery - 35) >> 1), '0x', '0x']; const signingData = values.slice(0, 6).concat(extraData); const signingDataHex = rlp_2.default.encode(signingData); return account_1.default.recover(utils_1.sha3(signingDataHex), signature); } exports.recoverTransaction = recoverTransaction; function sign(tx, privateKey) { if (tx.nonce < 0 || tx.gas < 0 || tx.gasPrice < 0 || tx.chainId < 0) { throw new Error('gas, gasPrice, nonce or chainId is lower than 0'); } const chainId = utils_1.numberToHex(tx.chainId); const toEncode = [ bytes_1.default.fromNat(utils_1.numberToHex(tx.nonce)), bytes_1.default.fromNat(utils_1.numberToHex(tx.gasPrice)), bytes_1.default.fromNat(utils_1.numberToHex(tx.gas)), tx.to ? formatters_1.inputAddressFormatter(tx.to) : '0x', bytes_1.default.fromNat(tx.value ? utils_1.numberToHex(tx.value) : '0x'), tx.data ? utils_1.bufferToHex(tx.data) : '0x', bytes_1.default.fromNat(chainId || '0x1'), '0x', '0x', ]; const rlpEncoded = rlp_1.encode(toEncode); const messageHash = utils_1.sha3(rlpEncoded); const signature = account_1.default.makeSigner(nat_1.default.toNumber(chainId || '0x1') * 2 + 35)(messageHash, privateKey); const rawTx = [...rlp_1.decode(rlpEncoded).slice(0, 6), ...account_1.default.decodeSignature(signature)]; rawTx[6] = utils_1.makeHexEven(utils_1.trimHexLeadingZero(rawTx[6])); rawTx[7] = utils_1.makeHexEven(utils_1.trimHexLeadingZero(rawTx[7])); rawTx[8] = utils_1.makeHexEven(utils_1.trimHexLeadingZero(rawTx[8])); const rawTransaction = rlp_1.encode(rawTx); const values = rlp_1.decode(rawTransaction); return { messageHash, v: utils_1.trimHexLeadingZero(utils_1.bufferToHex(values[6])), r: utils_1.trimHexLeadingZero(utils_1.bufferToHex(values[7])), s: utils_1.trimHexLeadingZero(utils_1.bufferToHex(values[8])), rawTransaction: utils_1.bufferToHex(rawTransaction), }; } exports.sign = sign; function isNot(value) { return value === undefined || value === null; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi10cmFuc2FjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hY2NvdW50L3NpZ24tdHJhbnNhY3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7RUFlRTs7O0FBRUYsNkJBQXFDO0FBQ3JDLHdDQUFxQztBQUVyQyx5RUFBeUM7QUFDekMscUVBQXFDO0FBQ3JDLGlFQUFpQztBQUNqQyxpRUFBaUM7QUFDakMsOENBQXNEO0FBQ3RELG9DQUEyRjtBQXVCcEYsS0FBSyxVQUFVLGVBQWUsQ0FBQyxFQUEwQixFQUFFLFVBQWtCLEVBQUUsR0FBUTtJQUM1RixJQUFJLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRTtRQUNYLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQUN4QztJQUVELCtEQUErRDtJQUMvRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLEVBQUUsQ0FBQyxRQUFRLEtBQUssU0FBUyxFQUFFO1FBQ25GLE9BQU8sSUFBSSxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztLQUM3QjtJQUVELHlEQUF5RDtJQUN6RCxNQUFNLFFBQVEsR0FBRztRQUNmLEtBQUssQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQzdELEtBQUssQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDO1FBQ3JFLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDO1lBQ2IsQ0FBQyxDQUFD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