web3.js/lib/solidity/formatters.js

251 lines
7.3 KiB
JavaScript
Raw Normal View History

2015-01-31 01:52:36 +01:00
/*
2015-10-08 15:34:07 +08:00
This file is part of web3.js.
2015-01-31 01:52:36 +01:00
2015-10-08 15:34:07 +08:00
web3.js is free software: you can redistribute it and/or modify
2015-01-31 01:52:36 +01:00
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.
2015-10-08 15:34:07 +08:00
web3.js is distributed in the hope that it will be useful,
2015-01-31 01:52:36 +01:00
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
2015-10-08 15:34:07 +08:00
along with web3.js. If not, see <http://www.gnu.org/licenses/>.
2015-01-31 01:52:36 +01:00
*/
/**
* @file formatters.js
* @author Marek Kotewicz <marek@ethdev.com>
2015-01-31 01:52:36 +01:00
* @date 2015
*/
var BigNumber = require('bignumber.js');
2015-03-08 18:18:52 +01:00
var utils = require('../utils/utils');
var c = require('../utils/config');
var SolidityParam = require('./param');
2015-01-31 01:52:36 +01:00
2015-04-16 21:16:26 +02:00
2015-03-08 17:28:32 +01:00
/**
* 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 {SolidityParam}
2015-03-08 17:28:32 +01:00
*/
2015-01-31 01:52:36 +01:00
var formatInputInt = function (value) {
2015-03-08 17:28:32 +01:00
BigNumber.config(c.ETH_BIGNUMBER_ROUNDING_MODE);
var result = utils.padLeft(utils.toTwosComplement(value).round().toString(16), 64);
return new SolidityParam(result);
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:28:32 +01:00
/**
* Formats input bytes
2015-03-08 17:28:32 +01:00
*
* @method formatInputBytes
2015-03-08 17:28:32 +01:00
* @param {String}
* @returns {SolidityParam}
2015-03-08 17:28:32 +01:00
*/
var formatInputBytes = function (value) {
var result = utils.toHex(value).substr(2);
var l = Math.floor((result.length + 63) / 64);
result = utils.padRight(result, l * 64);
return new SolidityParam(result);
};
/**
* Formats input bytes
*
* @method formatDynamicInputBytes
* @param {String}
* @returns {SolidityParam}
*/
var formatInputDynamicBytes = function (value) {
var result = utils.toHex(value).substr(2);
var length = result.length / 2;
var l = Math.floor((result.length + 63) / 64);
2015-07-21 15:51:19 +02:00
result = utils.padRight(result, l * 64);
2015-07-28 15:46:38 +02:00
return new SolidityParam(formatInputInt(length).value + result);
};
/**
* Formats input value to byte representation of string
*
* @method formatInputString
* @param {String}
* @returns {SolidityParam}
*/
var formatInputString = function (value) {
2015-08-10 22:11:37 +02:00
var result = utils.fromUtf8(value).substr(2);
var length = result.length / 2;
2015-06-30 12:02:46 +02:00
var l = Math.floor((result.length + 63) / 64);
result = utils.padRight(result, l * 64);
2015-07-28 15:46:38 +02:00
return new SolidityParam(formatInputInt(length).value + result);
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:28:32 +01:00
/**
* Formats input value to byte representation of bool
*
* @method formatInputBool
* @param {Boolean}
* @returns {SolidityParam}
2015-03-08 17:28:32 +01:00
*/
2015-01-31 01:52:36 +01:00
var formatInputBool = function (value) {
2015-04-16 16:37:13 +02:00
var result = '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
return new SolidityParam(result);
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:28:32 +01:00
/**
* 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 {SolidityParam}
2015-03-08 17:28:32 +01:00
*/
2015-01-31 01:52:36 +01:00
var formatInputReal = function (value) {
2015-04-16 16:37:13 +02:00
return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:28:32 +01:00
/**
* Check if input value is negative
*
* @method signedIsNegative
* @param {String} value is hex format
* @returns {Boolean} true if it is negative, otherwise false
*/
2015-01-31 01:52:36 +01:00
var signedIsNegative = function (value) {
return (new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1)) === '1';
};
2015-03-08 17:28:32 +01:00
/**
* Formats right-aligned output bytes to int
*
* @method formatOutputInt
* @param {SolidityParam} param
2015-03-08 17:28:32 +01:00
* @returns {BigNumber} right-aligned output bytes formatted to big number
*/
2015-04-16 21:16:26 +02:00
var formatOutputInt = function (param) {
2015-05-09 20:15:08 +02:00
var value = param.staticPart() || "0";
2015-02-23 17:05:53 +01:00
2015-01-31 01:52:36 +01:00
// 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);
};
2015-03-08 17:28:32 +01:00
/**
* Formats right-aligned output bytes to uint
*
* @method formatOutputUInt
* @param {SolidityParam}
2015-03-08 17:28:32 +01:00
* @returns {BigNumeber} right-aligned output bytes formatted to uint
*/
2015-04-16 21:16:26 +02:00
var formatOutputUInt = function (param) {
2015-05-09 20:15:08 +02:00
var value = param.staticPart() || "0";
2015-01-31 01:52:36 +01:00
return new BigNumber(value, 16);
};
2015-03-08 17:28:32 +01:00
/**
* Formats right-aligned output bytes to real
*
* @method formatOutputReal
* @param {SolidityParam}
2015-03-08 17:28:32 +01:00
* @returns {BigNumber} input bytes formatted to real
*/
2015-04-16 21:16:26 +02:00
var formatOutputReal = function (param) {
return formatOutputInt(param).dividedBy(new BigNumber(2).pow(128));
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:28:32 +01:00
/**
* Formats right-aligned output bytes to ureal
*
2015-03-08 17:52:52 +01:00
* @method formatOutputUReal
* @param {SolidityParam}
2015-03-08 17:28:32 +01:00
* @returns {BigNumber} input bytes formatted to ureal
*/
2015-04-16 21:16:26 +02:00
var formatOutputUReal = function (param) {
return formatOutputUInt(param).dividedBy(new BigNumber(2).pow(128));
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:52:52 +01:00
/**
* Should be used to format output bool
*
* @method formatOutputBool
* @param {SolidityParam}
2015-03-08 17:52:52 +01:00
* @returns {Boolean} right-aligned input bytes formatted to bool
*/
2015-04-16 21:16:26 +02:00
var formatOutputBool = function (param) {
2015-05-09 20:15:08 +02:00
return param.staticPart() === '0000000000000000000000000000000000000000000000000000000000000001' ? true : false;
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:52:52 +01:00
/**
* Should be used to format output bytes
2015-03-08 17:52:52 +01:00
*
* @method formatOutputBytes
* @param {SolidityParam} left-aligned hex representation of string
* @returns {String} hex string
2015-03-08 17:52:52 +01:00
*/
var formatOutputBytes = function (param) {
return '0x' + param.staticPart();
};
/**
* Should be used to format output bytes
*
* @method formatOutputDynamicBytes
* @param {SolidityParam} left-aligned hex representation of string
* @returns {String} hex string
*/
var formatOutputDynamicBytes = function (param) {
var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
return '0x' + param.dynamicPart().substr(64, length);
};
/**
* Should be used to format output string
*
* @method formatOutputString
* @param {SolidityParam} left-aligned hex representation of string
* @returns {String} ascii string
*/
var formatOutputString = function (param) {
var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
2015-08-10 22:11:37 +02:00
return utils.toUtf8(param.dynamicPart().substr(64, length));
2015-01-31 01:52:36 +01:00
};
2015-03-08 17:52:52 +01:00
/**
* Should be used to format output address
*
* @method formatOutputAddress
* @param {SolidityParam} right-aligned input bytes
2015-03-08 17:52:52 +01:00
* @returns {String} address
*/
2015-04-16 21:16:26 +02:00
var formatOutputAddress = function (param) {
2015-05-09 20:15:08 +02:00
var value = param.staticPart();
2015-01-31 01:52:36 +01:00
return "0x" + value.slice(value.length - 40, value.length);
};
module.exports = {
formatInputInt: formatInputInt,
formatInputBytes: formatInputBytes,
formatInputDynamicBytes: formatInputDynamicBytes,
formatInputString: formatInputString,
2015-01-31 01:52:36 +01:00
formatInputBool: formatInputBool,
formatInputReal: formatInputReal,
formatOutputInt: formatOutputInt,
formatOutputUInt: formatOutputUInt,
formatOutputReal: formatOutputReal,
formatOutputUReal: formatOutputUReal,
formatOutputBool: formatOutputBool,
formatOutputBytes: formatOutputBytes,
formatOutputDynamicBytes: formatOutputDynamicBytes,
formatOutputString: formatOutputString,
formatOutputAddress: formatOutputAddress
2015-01-31 01:52:36 +01:00
};