/* This file is part of ethereum.js. ethereum.js 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. ethereum.js 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 ethereum.js. If not, see . */ /** @file formatters.js * @authors: * Marek Kotewicz * @date 2015 */ var BigNumber = require('bignumber.js'); var utils = require('../utils/utils'); var c = require('../utils/config'); /** * Formats input value to byte representation of int * If value is negative, return it's two's complement * If the value is floating point, round it down * * @method formatInputInt * @param {String|Number|BigNumber} value that needs to be formatted * @returns {String} right-aligned byte representation of int */ var formatInputInt = function (value) { var padding = c.ETH_PADDING * 2; BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE); return utils.padLeft(utils.toTwosComplement(value).round().toString(16), padding); }; /** * Formats input value to byte representation of string * * @method formatInputString * @param {String} * @returns {String} left-algined byte representation of string */ var formatInputString = function (value) { return utils.fromAscii(value, c.ETH_PADDING).substr(2); }; /** * Formats input value to byte representation of bool * * @method formatInputBool * @param {Boolean} * @returns {String} right-aligned byte representation bool */ var formatInputBool = function (value) { return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0'); }; /** * Formats input value to byte representation of real * Values are multiplied by 2^m and encoded as integers * * @method formatInputReal * @param {String|Number|BigNumber} * @returns {String} byte representation of real */ var formatInputReal = function (value) { return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128))); }; /** * Check if input value is negative * * @method signedIsNegative * @param {String} value is hex format * @returns {Boolean} true if it is negative, otherwise false */ var signedIsNegative = function (value) { return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1'; }; /** * Formats right-aligned output bytes to int * * @method formatOutputInt * @param {String} bytes * @returns {BigNumber} right-aligned output bytes formatted to big number */ var formatOutputInt = function (value) { value = value || "0"; // check if it's negative number // it it is, return two's complement if (signedIsNegative(value)) { return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1); } return new BigNumber(value, 16); }; /** * Formats right-aligned output bytes to uint * * @method formatOutputUInt * @param {String} bytes * @returns {BigNumeber} right-aligned output bytes formatted to uint */ var formatOutputUInt = function (value) { value = value || "0"; return new BigNumber(value, 16); }; /** * Formats right-aligned output bytes to real * * @method formatOutputReal * @param {String} * @returns {BigNumber} input bytes formatted to real */ var formatOutputReal = function (value) { return formatOutputInt(value).dividedBy(new BigNumber(2).pow(128)); }; /** * Formats right-aligned output bytes to ureal * * @method formatOutputUReal * @param {String} * @returns {BigNumber} input bytes formatted to ureal */ var formatOutputUReal = function (value) { return formatOutputUInt(value).dividedBy(new BigNumber(2).pow(128)); }; /** * Should be used to format output hash * * @method formatOutputHash * @param {String} * @returns {String} right-aligned output bytes formatted to hex */ var formatOutputHash = function (value) { return "0x" + value; }; /** * Should be used to format output bool * * @method formatOutputBool * @param {String} * @returns {Boolean} right-aligned input bytes formatted to bool */ var formatOutputBool = function (value) { return value === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false; }; /** * Should be used to format output string * * @method formatOutputString * @param {Sttring} left-aligned hex representation of string * @returns {String} ascii string */ var formatOutputString = function (value) { return utils.toAscii(value); }; /** * Should be used to format output address * * @method formatOutputAddress * @param {String} right-aligned input bytes * @returns {String} address */ var formatOutputAddress = function (value) { return "0x" + value.slice(value.length - 40, value.length); }; module.exports = { formatInputInt: formatInputInt, formatInputString: formatInputString, formatInputBool: formatInputBool, formatInputReal: formatInputReal, formatOutputInt: formatOutputInt, formatOutputUInt: formatOutputUInt, formatOutputReal: formatOutputReal, formatOutputUReal: formatOutputUReal, formatOutputHash: formatOutputHash, formatOutputBool: formatOutputBool, formatOutputString: formatOutputString, formatOutputAddress: formatOutputAddress };