@planq-network/connect
Version:
Light Toolkit for connecting with the Planq network
226 lines • 9.04 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.inputSignFormatter = exports.inputAddressFormatter = exports.outputBigNumberFormatter = exports.outputLogFormatter = exports.hexToNumber = exports.outputBlockFormatter = exports.outputBlockHeaderFormatter = exports.inputBlockNumberFormatter = exports.inputDefaultBlockNumberFormatter = exports.outputPlanqTxReceiptFormatter = exports.outputPlanqTxFormatter = exports.inputPlanqTxFormatter = void 0;
var address_1 = require("@planq-network/base/lib/address");
var address_2 = require("@planq-network/utils/lib/address");
var solidity_1 = require("@planq-network/utils/lib/solidity");
var bignumber_js_1 = __importDefault(require("bignumber.js"));
var utf8_1 = require("utf8");
/**
* Formats the input of a transaction and converts all values to HEX
*/
function inputPlanqTxFormatter(tx) {
var _a, _b, _c, _d;
tx.from = inputAddressFormatter((_a = tx.from) === null || _a === void 0 ? void 0 : _a.toString());
tx.to = inputAddressFormatter(tx.to);
if (tx.data) {
tx.data = (0, address_1.ensureLeading0x)(tx.data);
}
if (tx.data && !isHex(tx.data)) {
throw new Error("The data field must be HEX encoded data.");
}
tx.gas = numberToHex(tx.gas);
tx.gasPrice = numberToHex((_b = tx.gasPrice) === null || _b === void 0 ? void 0 : _b.toString());
tx.value = numberToHex((_c = tx.value) === null || _c === void 0 ? void 0 : _c.toString());
// @ts-ignore - nonce is defined as number, but uses as string (web3)
tx.nonce = numberToHex((_d = tx.nonce) === null || _d === void 0 ? void 0 : _d.toString());
// @ts-ignore - prune undefines
Object.keys(tx).forEach(function (key) { return tx[key] === undefined && delete tx[key]; });
return tx;
}
exports.inputPlanqTxFormatter = inputPlanqTxFormatter;
function outputPlanqTxFormatter(tx) {
if (tx.blockNumber !== null) {
tx.blockNumber = hexToNumber(tx.blockNumber);
}
if (tx.transactionIndex !== null) {
tx.transactionIndex = hexToNumber(tx.transactionIndex);
}
tx.nonce = hexToNumber(tx.nonce);
tx.gas = hexToNumber(tx.gas);
tx.gasPrice = outputBigNumberFormatter(tx.gasPrice);
tx.value = outputBigNumberFormatter(tx.value);
tx.to =
tx.to && (0, address_2.isValidAddress)(tx.to)
? // tx.to could be `0x0` or `null` while contract creation
(tx.to = (0, address_2.toChecksumAddress)(tx.to))
: null; // set to `null` if invalid address
if (tx.from) {
tx.from = (0, address_2.toChecksumAddress)(tx.from);
}
return tx;
}
exports.outputPlanqTxFormatter = outputPlanqTxFormatter;
function outputPlanqTxReceiptFormatter(receipt) {
if (typeof receipt !== "object") {
throw new Error("Received receipt is invalid: " + receipt);
}
if (receipt.blockNumber !== null) {
receipt.blockNumber = hexToNumber(receipt.blockNumber);
}
if (receipt.transactionIndex !== null) {
receipt.transactionIndex = hexToNumber(receipt.transactionIndex);
}
receipt.cumulativeGasUsed = hexToNumber(receipt.cumulativeGasUsed);
receipt.gasUsed = hexToNumber(receipt.gasUsed);
if (Array.isArray(receipt.logs)) {
receipt.logs = receipt.logs.map(outputLogFormatter);
}
if (receipt.contractAddress) {
receipt.contractAddress = (0, address_2.toChecksumAddress)(receipt.contractAddress);
}
if (typeof receipt.status !== "undefined" && receipt.status !== null) {
receipt.status = Boolean(parseInt((0, address_1.trimLeading0x)(receipt.status), 10));
}
return receipt;
}
exports.outputPlanqTxReceiptFormatter = outputPlanqTxReceiptFormatter;
function inputDefaultBlockNumberFormatter(blockNumber) {
if (blockNumber == null) {
blockNumber = "latest";
}
return inputBlockNumberFormatter(blockNumber);
}
exports.inputDefaultBlockNumberFormatter = inputDefaultBlockNumberFormatter;
function inputBlockNumberFormatter(blockNumber) {
if (blockNumber == null) {
return undefined;
}
if (isPredefinedBlockNumber(blockNumber)) {
return blockNumber;
}
if (blockNumber === "genesis") {
return "0x0";
}
return isHexStrict(blockNumber.toString())
? blockNumber.toString().toLocaleLowerCase()
: numberToHex(blockNumber.toString());
}
exports.inputBlockNumberFormatter = inputBlockNumberFormatter;
function outputBlockHeaderFormatter(blockHeader) {
// transform to number
blockHeader.gasLimit = hexToNumber(blockHeader.gasLimit);
blockHeader.gasUsed = hexToNumber(blockHeader.gasUsed);
blockHeader.size = hexToNumber(blockHeader.size);
blockHeader.timestamp = hexToNumber(blockHeader.timestamp);
if (blockHeader.number !== null) {
blockHeader.number = hexToNumber(blockHeader.number);
}
if (blockHeader.miner) {
blockHeader.miner = (0, address_2.toChecksumAddress)(blockHeader.miner);
}
return blockHeader;
}
exports.outputBlockHeaderFormatter = outputBlockHeaderFormatter;
function outputBlockFormatter(block) {
block = outputBlockHeaderFormatter(block);
if (block.difficulty) {
block.difficulty = outputBigNumberFormatter(block.difficulty);
}
if (block.totalDifficulty) {
block.totalDifficulty = outputBigNumberFormatter(block.totalDifficulty);
}
if (Array.isArray(block.transactions)) {
block.transactions.forEach(function (item) {
if (typeof item !== "string" && !(item instanceof String)) {
return outputPlanqTxFormatter(item);
}
});
}
return block;
}
exports.outputBlockFormatter = outputBlockFormatter;
function hexToNumber(hex) {
if (hex) {
return new bignumber_js_1.default(hex).toNumber();
}
return undefined;
}
exports.hexToNumber = hexToNumber;
function outputLogFormatter(log) {
// generate a custom log id
if (typeof log.blockHash === "string" &&
typeof log.transactionHash === "string" &&
typeof log.logIndex === "string") {
var shaId = (0, solidity_1.sha3)((0, address_1.trimLeading0x)(log.blockHash) +
(0, address_1.trimLeading0x)(log.transactionHash) +
(0, address_1.trimLeading0x)(log.logIndex));
log.id = "log_" + (0, address_1.trimLeading0x)(shaId).substring(0, 8);
}
else if (!log.id) {
log.id = null;
}
if (log.blockNumber !== null) {
log.blockNumber = hexToNumber(log.blockNumber);
}
if (log.transactionIndex !== null) {
log.transactionIndex = hexToNumber(log.transactionIndex);
}
if (log.logIndex !== null) {
log.logIndex = hexToNumber(log.logIndex);
}
if (log.address) {
log.address = (0, address_2.toChecksumAddress)(log.address);
}
return log;
}
exports.outputLogFormatter = outputLogFormatter;
function outputBigNumberFormatter(hex) {
return new bignumber_js_1.default(hex).toString(10);
}
exports.outputBigNumberFormatter = outputBigNumberFormatter;
function inputAddressFormatter(address) {
if (!address || address === "0x") {
return undefined;
}
if ((0, address_2.isValidAddress)(address)) {
return (0, address_1.ensureLeading0x)(address).toLocaleLowerCase();
}
throw new Error("Provided address ".concat(address, " is invalid, the capitalization checksum test failed"));
}
exports.inputAddressFormatter = inputAddressFormatter;
function inputSignFormatter(data) {
return isHexStrict(data) ? data : utf8ToHex(data);
}
exports.inputSignFormatter = inputSignFormatter;
function utf8ToHex(str) {
str = (0, utf8_1.encode)(str);
var hex = "";
// remove \u0000 padding from either side
str = str.replace(/^(?:\u0000)*/, "");
str = str.split("").reverse().join("");
str = str.replace(/^(?:\u0000)*/, "");
str = str.split("").reverse().join("");
for (var i = 0; i < str.length; i++) {
var code = str.charCodeAt(i);
// if (code !== 0) {
var n = code.toString(16);
hex += n.length < 2 ? "0" + n : n;
// }
}
return (0, address_1.ensureLeading0x)(hex);
}
function isHex(hex) {
return /^(-0x|0x)?[0-9a-f]*$/i.test(hex);
}
function isHexStrict(hex) {
return /^(-)?0x[0-9a-f]*$/i.test(hex);
}
function numberToHex(value) {
if (value) {
var numberValue = new bignumber_js_1.default(value);
var result = (0, address_1.ensureLeading0x)(new bignumber_js_1.default(value).toString(16));
// Seen in web3, copied just in case
return numberValue.lt(new bignumber_js_1.default(0)) ? "-".concat(result) : result;
}
return undefined;
}
function isPredefinedBlockNumber(blockNumber) {
return (blockNumber === "latest" ||
blockNumber === "pending" ||
blockNumber === "earliest");
}
//# sourceMappingURL=formatter.js.map