UNPKG

@0x/web3-wrapper

Version:

Wraps around web3 and gives a nicer interface

203 lines 11.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.marshaller = void 0; const utils_1 = require("@0x/utils"); const ethereum_types_1 = require("ethereum-types"); const ethUtil = require("ethereumjs-util"); const _ = require("lodash"); const utils_2 = require("./utils"); /** * Utils to convert ethereum structures from user-space format to RPC format. (marshall/unmarshall) */ exports.marshaller = { /** * Unmarshall block without transaction data * @param blockWithHexValues block to unmarshall * @return unmarshalled block without transaction data */ unmarshalIntoBlockWithoutTransactionData(blockWithHexValues) { const block = Object.assign(Object.assign({}, blockWithHexValues), { gasLimit: utils_2.utils.convertHexToNumber(blockWithHexValues.gasLimit), gasUsed: utils_2.utils.convertHexToNumber(blockWithHexValues.gasUsed), size: utils_2.utils.convertHexToNumber(blockWithHexValues.size), timestamp: utils_2.utils.convertHexToNumber(blockWithHexValues.timestamp), number: blockWithHexValues.number === null ? null : utils_2.utils.convertHexToNumber(blockWithHexValues.number), difficulty: utils_2.utils.convertAmountToBigNumber(blockWithHexValues.difficulty), totalDifficulty: utils_2.utils.convertAmountToBigNumber(blockWithHexValues.totalDifficulty) }); return block; }, /** * Unmarshall block with transaction data * @param blockWithHexValues block to unmarshall * @return unmarshalled block with transaction data */ unmarshalIntoBlockWithTransactionData(blockWithHexValues) { const block = Object.assign(Object.assign({}, blockWithHexValues), { gasLimit: utils_2.utils.convertHexToNumber(blockWithHexValues.gasLimit), gasUsed: utils_2.utils.convertHexToNumber(blockWithHexValues.gasUsed), size: utils_2.utils.convertHexToNumber(blockWithHexValues.size), timestamp: utils_2.utils.convertHexToNumber(blockWithHexValues.timestamp), number: blockWithHexValues.number === null ? null : utils_2.utils.convertHexToNumber(blockWithHexValues.number), difficulty: utils_2.utils.convertAmountToBigNumber(blockWithHexValues.difficulty), totalDifficulty: utils_2.utils.convertAmountToBigNumber(blockWithHexValues.totalDifficulty), transactions: [] }); block.transactions = _.map(blockWithHexValues.transactions, (tx) => { const transaction = exports.marshaller.unmarshalTransaction(tx); return transaction; }); return block; }, /** * Unmarshall transaction * @param txRpc transaction to unmarshall * @return unmarshalled transaction */ unmarshalTransaction(txRpc) { const tx = Object.assign(Object.assign({}, txRpc), { blockNumber: txRpc.blockNumber !== null ? utils_2.utils.convertHexToNumber(txRpc.blockNumber) : null, transactionIndex: txRpc.transactionIndex !== null ? utils_2.utils.convertHexToNumber(txRpc.transactionIndex) : null, nonce: utils_2.utils.convertHexToNumber(txRpc.nonce), gas: utils_2.utils.convertHexToNumber(txRpc.gas), gasPrice: txRpc.gasPrice !== undefined ? utils_2.utils.convertAmountToBigNumber(txRpc.gasPrice) : undefined, maxFeePerGas: txRpc.maxFeePerGas !== undefined ? utils_2.utils.convertAmountToBigNumber(txRpc.maxFeePerGas) : undefined, maxPriorityFeePerGas: txRpc.maxPriorityFeePerGas !== undefined ? utils_2.utils.convertAmountToBigNumber(txRpc.maxPriorityFeePerGas) : undefined, value: utils_2.utils.convertAmountToBigNumber(txRpc.value) }); return tx; }, /** * Unmarshall transaction receipt * @param txReceiptRpc transaction receipt to unmarshall * @return unmarshalled transaction receipt */ unmarshalTransactionReceipt(txReceiptRpc) { const txReceipt = Object.assign(Object.assign({}, txReceiptRpc), { blockNumber: utils_2.utils.convertHexToNumber(txReceiptRpc.blockNumber), transactionIndex: utils_2.utils.convertHexToNumber(txReceiptRpc.transactionIndex), cumulativeGasUsed: utils_2.utils.convertHexToNumber(txReceiptRpc.cumulativeGasUsed), gasUsed: utils_2.utils.convertHexToNumber(txReceiptRpc.gasUsed), logs: _.map(txReceiptRpc.logs, exports.marshaller.unmarshalLog.bind(exports.marshaller)) }); return txReceipt; }, /** * Unmarshall transaction data * @param txDataRpc transaction data to unmarshall * @return unmarshalled transaction data */ unmarshalTxData(txDataRpc) { if (txDataRpc.from === undefined) { throw new Error(`txData must include valid 'from' value.`); } const txData = { to: txDataRpc.to, from: txDataRpc.from, data: txDataRpc.data, value: txDataRpc.value !== undefined ? utils_2.utils.convertAmountToBigNumber(txDataRpc.value) : undefined, gas: txDataRpc.gas !== undefined ? utils_2.utils.convertHexToNumber(txDataRpc.gas) : undefined, gasPrice: txDataRpc.gasPrice !== undefined ? utils_2.utils.convertAmountToBigNumber(txDataRpc.gasPrice) : undefined, maxFeePerGas: txDataRpc.maxFeePerGas !== undefined ? utils_2.utils.convertAmountToBigNumber(txDataRpc.maxFeePerGas) : undefined, maxPriorityFeePerGas: txDataRpc.maxPriorityFeePerGas !== undefined ? utils_2.utils.convertAmountToBigNumber(txDataRpc.maxPriorityFeePerGas) : undefined, nonce: txDataRpc.nonce !== undefined ? utils_2.utils.convertHexToNumber(txDataRpc.nonce) : undefined, }; return txData; }, /** * Marshall transaction data * @param txData transaction data to marshall * @return marshalled transaction data */ marshalTxData(txData) { if (txData.from === undefined) { throw new Error(`txData must include valid 'from' value.`); } const callTxDataBase = Object.assign({}, txData); delete callTxDataBase.from; const callTxDataBaseRPC = exports.marshaller._marshalCallTxDataBase(callTxDataBase); const txDataRPC = Object.assign(Object.assign({}, callTxDataBaseRPC), { from: exports.marshaller.marshalAddress(txData.from) }); const prunableIfUndefined = ['gasPrice', 'maxFeePerGas', 'maxPriorityFeePerGas', 'gas', 'value', 'nonce']; _.each(txDataRPC, (value, key) => { if (value === undefined && _.includes(prunableIfUndefined, key)) { delete txDataRPC[key]; } }); return txDataRPC; }, /** * Marshall call data * @param callData call data to marshall * @return marshalled call data */ marshalCallData(callData) { const callTxDataBase = Object.assign({}, callData); delete callTxDataBase.from; delete callTxDataBase.overrides; const callTxDataBaseRPC = exports.marshaller._marshalCallTxDataBase(callTxDataBase); const callDataRPC = Object.assign(Object.assign({}, callTxDataBaseRPC), { from: callData.from === undefined ? undefined : exports.marshaller.marshalAddress(callData.from) }); return callDataRPC; }, /** * Marshall call overrides parameter for for a geth eth_call. * @param overrides overrides to marshal * @return marshalled overrides */ marshalCallOverrides(overrides) { const marshalled = {}; for (const address in overrides) { if (address) { const override = overrides[address]; const marshalledAddress = exports.marshaller.marshalAddress(address); const marshalledOverride = (marshalled[marshalledAddress] = {}); if (override.code !== undefined) { marshalledOverride.code = override.code; } if (override.nonce !== undefined) { marshalledOverride.nonce = utils_2.utils.encodeAmountAsHexString(override.nonce); } if (override.balance !== undefined) { marshalledOverride.balance = utils_2.utils.encodeAmountAsHexString(override.balance); } if (Object.keys(marshalledOverride).length === 0) { delete marshalled[marshalledAddress]; } } } return marshalled; }, /** * Marshall address * @param address address to marshall * @return marshalled address */ marshalAddress(address) { if (utils_1.addressUtils.isAddress(address)) { return ethUtil.addHexPrefix(address); } throw new Error(`Invalid address encountered: ${address}`); }, /** * Marshall block param * @param blockParam block param to marshall * @return marshalled block param */ marshalBlockParam(blockParam) { if (blockParam === undefined) { return ethereum_types_1.BlockParamLiteral.Latest; } const encodedBlockParam = _.isNumber(blockParam) ? utils_2.utils.numberToHex(blockParam) : blockParam; return encodedBlockParam; }, /** * Unmarshall log * @param rawLog log to unmarshall * @return unmarshalled log */ unmarshalLog(rawLog) { const formattedLog = Object.assign(Object.assign({}, rawLog), { logIndex: utils_2.utils.convertHexToNumberOrNull(rawLog.logIndex), blockNumber: utils_2.utils.convertHexToNumberOrNull(rawLog.blockNumber), transactionIndex: utils_2.utils.convertHexToNumberOrNull(rawLog.transactionIndex) }); return formattedLog; }, _marshalCallTxDataBase(callTxDataBase) { let accessList; if (callTxDataBase.accessList && Object.keys(callTxDataBase.accessList).length) { accessList = Object.entries(callTxDataBase.accessList).map(([address, storageKeys]) => ({ address, storageKeys, })); } const callTxDataBaseRPC = { data: callTxDataBase.data, to: callTxDataBase.to === undefined ? undefined : exports.marshaller.marshalAddress(callTxDataBase.to), gasPrice: callTxDataBase.gasPrice === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.gasPrice), maxFeePerGas: callTxDataBase.maxFeePerGas === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.maxFeePerGas), maxPriorityFeePerGas: callTxDataBase.maxPriorityFeePerGas === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.maxPriorityFeePerGas), gas: callTxDataBase.gas === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.gas), value: callTxDataBase.value === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.value), nonce: callTxDataBase.nonce === undefined ? undefined : utils_2.utils.encodeAmountAsHexString(callTxDataBase.nonce), accessList, }; return callTxDataBaseRPC; }, }; //# sourceMappingURL=marshaller.js.map