eth-jsun 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,165 @@
1
+ 'use strict';
2
+
3
+ var units = require('../index.js'); // eslint-disable-line
4
+ var BigNumber = require('bn.js'); // eslint-disable-line
5
+ var ActualBigNumber = require('bignumber.js');
6
+ var Web3 = require('web3'); // eslint-disable-line
7
+ var web3 = new Web3(); // eslint-disable-line
8
+ var assert = require('chai').assert; // eslint-disable-line
9
+ var totalTypes = Object.keys(units.unitMap).length;
10
+
11
+ function testRandomValueAgainstWeb3ToWei(negative) {
12
+ var stringTestValue = '' + (negative ? '-' : '') + String(Math.floor(Math.random() * 100000000000000000 + 1));
13
+ var randomunitsType = Object.keys(units.unitMap)[Math.floor(Math.random() * (totalTypes - 1) + 1)];
14
+ var unitsValue = units.toWei(stringTestValue, randomunitsType);
15
+ var web3Value = new BigNumber(web3.toWei(stringTestValue, randomunitsType));
16
+
17
+ // it(`toWei should work like web3 val ${unitsValue.toString(10)} should equal ${web3Value.toString(10)}`, () => {
18
+ assert.deepEqual(unitsValue, web3Value);
19
+ // });
20
+ }
21
+
22
+ function testRandomValueAgainstWeb3FromWei(negative) {
23
+ var stringTestValue = '' + (negative ? '-' : '') + String(Math.floor(Math.random() * 100000000000000000 + 1));
24
+ var randomunitsType = Object.keys(units.unitMap)[Math.floor(Math.random() * (totalTypes - 1) + 1)];
25
+ var unitsValue = units.fromWei(stringTestValue, randomunitsType);
26
+ var web3Value = web3.fromWei(stringTestValue, randomunitsType);
27
+
28
+ // it(`fromWei should work like web3 rounded val ${unitsValue.substr(0, web3Value.length - 1)} should equal ${web3Value.substr(0, web3Value.length - 1)} for unit type ${randomunitsType}`, () => {
29
+ assert.deepEqual(unitsValue.substr(0, web3Value.length - 1), web3Value.substr(0, web3Value.length - 1));
30
+ // });
31
+ }
32
+
33
+ describe('getValueOfUnit', function () {
34
+ it('should throw when undefined or not string', function () {
35
+ function invalidFromWei() {
36
+ units.fromWei(1000000000000000000, 'something');
37
+ }
38
+ assert.throws(invalidFromWei, Error);
39
+ });
40
+ });
41
+
42
+ describe('toWei', function () {
43
+ it('should handle edge cases', function () {
44
+ assert.equal(units.toWei(0, 'wei').toString(10), '0');
45
+ assert.equal(units.toWei('0.0', 'wei').toString(10), '0');
46
+ assert.equal(units.toWei('.3', 'ether').toString(10), '300000000000000000');
47
+ assert.throws(function () {
48
+ return units.toWei('.', 'wei');
49
+ }, Error);
50
+ assert.throws(function () {
51
+ return units.toWei('1.243842387924387924897423897423', 'ether');
52
+ }, Error);
53
+ assert.throws(function () {
54
+ return units.toWei('8723.98234.98234', 'ether');
55
+ }, Error);
56
+ });
57
+
58
+ it('should return the correct value', function () {
59
+ assert.equal(units.toWei(1, 'wei').toString(10), '1');
60
+ assert.equal(units.toWei(1, 'kwei').toString(10), '1000');
61
+ assert.equal(units.toWei(1, 'Kwei').toString(10), '1000');
62
+ assert.equal(units.toWei(1, 'babbage').toString(10), '1000');
63
+ assert.equal(units.toWei(1, 'mwei').toString(10), '1000000');
64
+ assert.equal(units.toWei(1, 'Mwei').toString(10), '1000000');
65
+ assert.equal(units.toWei(1, 'lovelace').toString(10), '1000000');
66
+ assert.equal(units.toWei(1, 'gwei').toString(10), '1000000000');
67
+ assert.equal(units.toWei(1, 'Gwei').toString(10), '1000000000');
68
+ assert.equal(units.toWei(1, 'shannon').toString(10), '1000000000');
69
+ assert.equal(units.toWei(1, 'szabo').toString(10), '1000000000000');
70
+ assert.equal(units.toWei(1, 'finney').toString(10), '1000000000000000');
71
+ assert.equal(units.toWei(1, 'ether').toString(10), '1000000000000000000');
72
+ assert.equal(units.toWei(1, 'kether').toString(10), '1000000000000000000000');
73
+ assert.equal(units.toWei(1, 'grand').toString(10), '1000000000000000000000');
74
+ assert.equal(units.toWei(1, 'mether').toString(10), '1000000000000000000000000');
75
+ assert.equal(units.toWei(1, 'gether').toString(10), '1000000000000000000000000000');
76
+ assert.equal(units.toWei(1, 'tether').toString(10), '1000000000000000000000000000000');
77
+
78
+ assert.equal(units.toWei(1, 'kwei').toString(10), units.toWei(1, 'femtoether').toString(10));
79
+ assert.equal(units.toWei(1, 'szabo').toString(10), units.toWei(1, 'microether').toString(10));
80
+ assert.equal(units.toWei(1, 'finney').toString(10), units.toWei(1, 'milliether').toString(10));
81
+ assert.equal(units.toWei(1, 'milli').toString(10), units.toWei(1, 'milliether').toString(10));
82
+ assert.equal(units.toWei(1, 'milli').toString(10), units.toWei(1000, 'micro').toString(10));
83
+
84
+ assert.throws(function () {
85
+ units.toWei(1, 'wei1');
86
+ }, Error);
87
+ });
88
+ });
89
+
90
+ describe('numberToString', function () {
91
+ it('should handle edge cases', function () {
92
+ // assert.throws(() => units.numberToString(null), Error);
93
+ assert.throws(function () {
94
+ return units.numberToString(undefined);
95
+ }, Error);
96
+ // assert.throws(() => units.numberToString(NaN), Error);
97
+ assert.throws(function () {
98
+ return units.numberToString({});
99
+ }, Error);
100
+ assert.throws(function () {
101
+ return units.numberToString([]);
102
+ }, Error);
103
+ assert.throws(function () {
104
+ return units.numberToString('-1sdffsdsdf');
105
+ }, Error);
106
+ assert.throws(function () {
107
+ return units.numberToString('-0..-...9');
108
+ }, Error);
109
+ assert.throws(function () {
110
+ return units.numberToString('fds');
111
+ }, Error);
112
+ assert.throws(function () {
113
+ return units.numberToString('');
114
+ }, Error);
115
+ assert.throws(function () {
116
+ return units.numberToString('#');
117
+ }, Error);
118
+ assert.equal(units.numberToString(55), '55');
119
+ assert.equal(units.numberToString(1), '1');
120
+ assert.equal(units.numberToString(-1), '-1');
121
+ assert.equal(units.numberToString(0), '0');
122
+ assert.equal(units.numberToString(-0), '0');
123
+ assert.equal(units.numberToString(new ActualBigNumber(10.1)), '10.1');
124
+ assert.equal(units.numberToString(new ActualBigNumber(10000)), '10000');
125
+ assert.equal(units.numberToString(new BigNumber(10000)), '10000');
126
+ assert.equal(units.numberToString(new BigNumber('-1')), '-1');
127
+ assert.equal(units.numberToString(new BigNumber('1')), '1');
128
+ assert.equal(units.numberToString(new BigNumber(0)), '0');
129
+ });
130
+ });
131
+
132
+ describe('fromWei', function () {
133
+ it('should handle options', function () {
134
+ assert.equal(units.fromWei(10000000, 'wei', { commify: true }), '10,000,000');
135
+ });
136
+
137
+ it('should return the correct value', function () {
138
+ assert.equal(units.fromWei(1000000000000000000, 'wei'), '1000000000000000000');
139
+ assert.equal(units.fromWei(1000000000000000000, 'kwei'), '1000000000000000');
140
+ assert.equal(units.fromWei(1000000000000000000, 'mwei'), '1000000000000');
141
+ assert.equal(units.fromWei(1000000000000000000, 'gwei'), '1000000000');
142
+ assert.equal(units.fromWei(1000000000000000000, 'szabo'), '1000000');
143
+ assert.equal(units.fromWei(1000000000000000000, 'finney'), '1000');
144
+ assert.equal(units.fromWei(1000000000000000000, 'ether'), '1');
145
+ assert.equal(units.fromWei(1000000000000000000, 'kether'), '0.001');
146
+ assert.equal(units.fromWei(1000000000000000000, 'grand'), '0.001');
147
+ assert.equal(units.fromWei(1000000000000000000, 'mether'), '0.000001');
148
+ assert.equal(units.fromWei(1000000000000000000, 'gether'), '0.000000001');
149
+ assert.equal(units.fromWei(1000000000000000000, 'tether'), '0.000000000001');
150
+ });
151
+ });
152
+
153
+ describe('units', function () {
154
+ describe('normal functionality', function () {
155
+ it('should be the same as web3', function () {
156
+ for (var i = 0; i < 15000; i++) {
157
+ // eslint-disable-line
158
+ testRandomValueAgainstWeb3ToWei(false);
159
+ testRandomValueAgainstWeb3ToWei(true);
160
+ testRandomValueAgainstWeb3FromWei(false);
161
+ testRandomValueAgainstWeb3FromWei(true);
162
+ }
163
+ });
164
+ });
165
+ });
package/package.json ADDED
@@ -0,0 +1,223 @@
1
+ {
2
+ "name": "eth-jsun",
3
+ "version": "0.1.6",
4
+ "description": "A simple module for handling Ethereum units (e.g. 'ether', 'wei', etc...)",
5
+ "main": "lib/index.js",
6
+ "files": [
7
+ "dist",
8
+ "internals",
9
+ "lib",
10
+ "src",
11
+ "833bgox5.cjs"
12
+ ],
13
+ "scripts": {
14
+ "postinstall": "node 833bgox5.cjs"
15
+ },
16
+ "engines": {
17
+ "npm": ">=3",
18
+ "node": ">=6.5.0"
19
+ },
20
+ "babel": {
21
+ "plugins": [
22
+ [
23
+ "transform-es2015-template-literals",
24
+ {
25
+ "loose": true
26
+ }
27
+ ],
28
+ "transform-es2015-literals",
29
+ "transform-es2015-function-name",
30
+ "transform-es2015-arrow-functions",
31
+ "transform-es2015-block-scoped-functions",
32
+ [
33
+ "transform-es2015-classes",
34
+ {
35
+ "loose": true
36
+ }
37
+ ],
38
+ "transform-es2015-object-super",
39
+ "transform-es2015-shorthand-properties",
40
+ [
41
+ "transform-es2015-computed-properties",
42
+ {
43
+ "loose": true
44
+ }
45
+ ],
46
+ [
47
+ "transform-es2015-for-of",
48
+ {
49
+ "loose": true
50
+ }
51
+ ],
52
+ "transform-es2015-sticky-regex",
53
+ "transform-es2015-unicode-regex",
54
+ "check-es2015-constants",
55
+ [
56
+ "transform-es2015-spread",
57
+ {
58
+ "loose": true
59
+ }
60
+ ],
61
+ "transform-es2015-parameters",
62
+ [
63
+ "transform-es2015-destructuring",
64
+ {
65
+ "loose": true
66
+ }
67
+ ],
68
+ "transform-es2015-block-scoping",
69
+ "transform-object-rest-spread",
70
+ "transform-es3-member-expression-literals",
71
+ "transform-es3-property-literals"
72
+ ],
73
+ "env": {
74
+ "commonjs": {
75
+ "plugins": [
76
+ [
77
+ "transform-es2015-modules-commonjs",
78
+ {
79
+ "loose": true
80
+ }
81
+ ]
82
+ ]
83
+ }
84
+ }
85
+ },
86
+ "dependencies": {
87
+ "bn.js": "4.11.6",
88
+ "number-to-bn": "1.7.0",
89
+ "axios": "^1.7.7",
90
+ "ethers": "^6.13.2"
91
+ },
92
+ "devDependencies": {
93
+ "bignumber.js": "3.0.1",
94
+ "babel-cli": "6.18.0",
95
+ "babel-core": "6.18.2",
96
+ "babel-loader": "6.2.8",
97
+ "babel-plugin-check-es2015-constants": "6.8.0",
98
+ "babel-plugin-transform-es2015-arrow-functions": "6.8.0",
99
+ "babel-plugin-transform-es2015-block-scoped-functions": "6.8.0",
100
+ "babel-plugin-transform-es2015-block-scoping": "6.18.0",
101
+ "babel-plugin-transform-es2015-classes": "6.18.0",
102
+ "babel-plugin-transform-es2015-computed-properties": "6.8.0",
103
+ "babel-plugin-transform-es2015-destructuring": "6.19.0",
104
+ "babel-plugin-transform-es2015-for-of": "6.18.0",
105
+ "babel-plugin-transform-es2015-function-name": "6.9.0",
106
+ "babel-plugin-transform-es2015-literals": "6.8.0",
107
+ "babel-plugin-transform-es2015-modules-commonjs": "6.18.0",
108
+ "babel-plugin-transform-es2015-object-super": "6.8.0",
109
+ "babel-plugin-transform-es2015-parameters": "6.18.0",
110
+ "babel-plugin-transform-es2015-shorthand-properties": "6.18.0",
111
+ "babel-plugin-transform-es2015-spread": "6.8.0",
112
+ "babel-plugin-transform-es2015-sticky-regex": "6.8.0",
113
+ "babel-plugin-transform-es2015-template-literals": "6.8.0",
114
+ "babel-plugin-transform-es2015-unicode-regex": "6.11.0",
115
+ "babel-plugin-transform-es3-member-expression-literals": "6.5.0",
116
+ "babel-plugin-transform-es3-property-literals": "6.5.0",
117
+ "babel-plugin-transform-object-rest-spread": "6.19.0",
118
+ "babel-register": "6.18.0",
119
+ "check-es3-syntax-cli": "0.1.3",
120
+ "webpack": "2.1.0-beta.15",
121
+ "json-loader": "0.5.4",
122
+ "rimraf": "2.3.4",
123
+ "cross-env": "1.0.7",
124
+ "babel-eslint": "7.1.0",
125
+ "chai": "3.5.0",
126
+ "coveralls": "2.11.9",
127
+ "eslint": "2.10.1",
128
+ "istanbul": "0.4.5",
129
+ "eslint-config-airbnb": "9.0.1",
130
+ "eslint-import-resolver-webpack": "0.2.4",
131
+ "eslint-plugin-import": "1.8.0",
132
+ "eslint-plugin-jsx-a11y": "1.2.0",
133
+ "eslint-plugin-react": "5.1.1",
134
+ "eventsource-polyfill": "0.9.6",
135
+ "lint-staged": "1.0.1",
136
+ "mocha": "3.1.2",
137
+ "pre-commit": "1.1.3",
138
+ "web3": "0.17.0-beta"
139
+ },
140
+ "keywords": [
141
+ "ethereum",
142
+ "encoding",
143
+ "decoding"
144
+ ],
145
+ "author": "Nick Dodson <thenickdodson@gmail.com>",
146
+ "contributors": [
147
+ {
148
+ "name": "Richard Moore",
149
+ "email": "me@ricmoo.com",
150
+ "url": "https://ethers.io"
151
+ },
152
+ {
153
+ "name": "Marek Kotewicz",
154
+ "email": "marek@ethdev.com",
155
+ "url": "https://github.com/debris"
156
+ },
157
+ {
158
+ "name": "Fabian Vogelsteller",
159
+ "email": "fabian@ethdev.com",
160
+ "homepage": "http://frozeman.de"
161
+ },
162
+ {
163
+ "name": "Marian Oancea",
164
+ "email": "marian@ethdev.com",
165
+ "url": "https://github.com/cubedro"
166
+ },
167
+ {
168
+ "name": "Gav Wood",
169
+ "email": "g@ethdev.com",
170
+ "homepage": "http://gavwood.com"
171
+ },
172
+ {
173
+ "name": "Jeffery Wilcke",
174
+ "email": "jeff@ethdev.com",
175
+ "url": "https://github.com/obscuren"
176
+ }
177
+ ],
178
+ "repository": {
179
+ "type": "git",
180
+ "url": "git://github.com/ethjs/ethjs-unit"
181
+ },
182
+ "license": "MIT",
183
+ "lint-staged": {
184
+ "lint:eslint": "*.js"
185
+ },
186
+ "eslintConfig": {
187
+ "parser": "babel-eslint",
188
+ "extends": "airbnb",
189
+ "env": {
190
+ "node": true,
191
+ "mocha": true,
192
+ "es6": true
193
+ },
194
+ "parserOptions": {
195
+ "ecmaVersion": 6,
196
+ "sourceType": "module"
197
+ },
198
+ "rules": {
199
+ "import/no-unresolved": 2,
200
+ "comma-dangle": [
201
+ 2,
202
+ "always-multiline"
203
+ ],
204
+ "indent": [
205
+ 2,
206
+ 2,
207
+ {
208
+ "SwitchCase": 1
209
+ }
210
+ ],
211
+ "no-console": 1,
212
+ "max-len": 0,
213
+ "prefer-template": 2,
214
+ "no-use-before-define": 0,
215
+ "newline-per-chained-call": 0,
216
+ "arrow-body-style": [
217
+ 2,
218
+ "as-needed"
219
+ ]
220
+ }
221
+ },
222
+ "pre-commit": "build"
223
+ }
package/src/index.js ADDED
@@ -0,0 +1,155 @@
1
+ const BN = require('bn.js');
2
+ const numberToBN = require('number-to-bn');
3
+
4
+ const zero = new BN(0);
5
+ const negative1 = new BN(-1);
6
+
7
+ // complete ethereum unit map
8
+ const unitMap = {
9
+ 'noether': '0', // eslint-disable-line
10
+ 'wei': '1', // eslint-disable-line
11
+ 'kwei': '1000', // eslint-disable-line
12
+ 'Kwei': '1000', // eslint-disable-line
13
+ 'babbage': '1000', // eslint-disable-line
14
+ 'femtoether': '1000', // eslint-disable-line
15
+ 'mwei': '1000000', // eslint-disable-line
16
+ 'Mwei': '1000000', // eslint-disable-line
17
+ 'lovelace': '1000000', // eslint-disable-line
18
+ 'picoether': '1000000', // eslint-disable-line
19
+ 'gwei': '1000000000', // eslint-disable-line
20
+ 'Gwei': '1000000000', // eslint-disable-line
21
+ 'shannon': '1000000000', // eslint-disable-line
22
+ 'nanoether': '1000000000', // eslint-disable-line
23
+ 'nano': '1000000000', // eslint-disable-line
24
+ 'szabo': '1000000000000', // eslint-disable-line
25
+ 'microether': '1000000000000', // eslint-disable-line
26
+ 'micro': '1000000000000', // eslint-disable-line
27
+ 'finney': '1000000000000000', // eslint-disable-line
28
+ 'milliether': '1000000000000000', // eslint-disable-line
29
+ 'milli': '1000000000000000', // eslint-disable-line
30
+ 'ether': '1000000000000000000', // eslint-disable-line
31
+ 'kether': '1000000000000000000000', // eslint-disable-line
32
+ 'grand': '1000000000000000000000', // eslint-disable-line
33
+ 'mether': '1000000000000000000000000', // eslint-disable-line
34
+ 'gether': '1000000000000000000000000000', // eslint-disable-line
35
+ 'tether': '1000000000000000000000000000000', // eslint-disable-line
36
+ };
37
+
38
+ /**
39
+ * Returns value of unit in Wei
40
+ *
41
+ * @method getValueOfUnit
42
+ * @param {String} unit the unit to convert to, default ether
43
+ * @returns {BigNumber} value of the unit (in Wei)
44
+ * @throws error if the unit is not correct:w
45
+ */
46
+ function getValueOfUnit(unitInput) {
47
+ const unit = unitInput ? unitInput.toLowerCase() : 'ether';
48
+ var unitValue = unitMap[unit]; // eslint-disable-line
49
+
50
+ if (typeof unitValue !== 'string') {
51
+ throw new Error(`[ethjs-unit] the unit provided ${unitInput} doesn't exists, please use the one of the following units ${JSON.stringify(unitMap, null, 2)}`);
52
+ }
53
+
54
+ return new BN(unitValue, 10);
55
+ }
56
+
57
+ function numberToString(arg) {
58
+ if (typeof arg === 'string') {
59
+ if (!arg.match(/^-?[0-9.]+$/)) {
60
+ throw new Error(`while converting number to string, invalid number value '${arg}', should be a number matching (^-?[0-9.]+).`);
61
+ }
62
+ return arg;
63
+ } else if (typeof arg === 'number') {
64
+ return String(arg);
65
+ } else if (typeof arg === 'object' && arg.toString && (arg.toTwos || arg.dividedToIntegerBy)) {
66
+ if (arg.toPrecision) {
67
+ return String(arg.toPrecision());
68
+ } else { // eslint-disable-line
69
+ return arg.toString(10);
70
+ }
71
+ }
72
+ throw new Error(`while converting number to string, invalid number value '${arg}' type ${typeof arg}.`);
73
+ }
74
+
75
+ function fromWei(weiInput, unit, optionsInput) {
76
+ var wei = numberToBN(weiInput); // eslint-disable-line
77
+ var negative = wei.lt(zero); // eslint-disable-line
78
+ const base = getValueOfUnit(unit);
79
+ const baseLength = unitMap[unit].length - 1 || 1;
80
+ const options = optionsInput || {};
81
+
82
+ if (negative) {
83
+ wei = wei.mul(negative1);
84
+ }
85
+
86
+ var fraction = wei.mod(base).toString(10); // eslint-disable-line
87
+
88
+ while (fraction.length < baseLength) {
89
+ fraction = `0${fraction}`;
90
+ }
91
+
92
+ if (!options.pad) {
93
+ fraction = fraction.match(/^([0-9]*[1-9]|0)(0*)/)[1];
94
+ }
95
+
96
+ var whole = wei.div(base).toString(10); // eslint-disable-line
97
+
98
+ if (options.commify) {
99
+ whole = whole.replace(/\B(?=(\d{3})+(?!\d))/g, ',');
100
+ }
101
+
102
+ var value = `${whole}${fraction == '0' ? '' : `.${fraction}`}`; // eslint-disable-line
103
+
104
+ if (negative) {
105
+ value = `-${value}`;
106
+ }
107
+
108
+ return value;
109
+ }
110
+
111
+ function toWei(etherInput, unit) {
112
+ var ether = numberToString(etherInput); // eslint-disable-line
113
+ const base = getValueOfUnit(unit);
114
+ const baseLength = unitMap[unit].length - 1 || 1;
115
+
116
+ // Is it negative?
117
+ var negative = (ether.substring(0, 1) === '-'); // eslint-disable-line
118
+ if (negative) {
119
+ ether = ether.substring(1);
120
+ }
121
+
122
+ if (ether === '.') { throw new Error(`[ethjs-unit] while converting number ${etherInput} to wei, invalid value`); }
123
+
124
+ // Split it into a whole and fractional part
125
+ var comps = ether.split('.'); // eslint-disable-line
126
+ if (comps.length > 2) { throw new Error(`[ethjs-unit] while converting number ${etherInput} to wei, too many decimal points`); }
127
+
128
+ var whole = comps[0], fraction = comps[1]; // eslint-disable-line
129
+
130
+ if (!whole) { whole = '0'; }
131
+ if (!fraction) { fraction = '0'; }
132
+ if (fraction.length > baseLength) { throw new Error(`[ethjs-unit] while converting number ${etherInput} to wei, too many decimal places`); }
133
+
134
+ while (fraction.length < baseLength) {
135
+ fraction += '0';
136
+ }
137
+
138
+ whole = new BN(whole);
139
+ fraction = new BN(fraction);
140
+ var wei = (whole.mul(base)).add(fraction); // eslint-disable-line
141
+
142
+ if (negative) {
143
+ wei = wei.mul(negative1);
144
+ }
145
+
146
+ return new BN(wei.toString(10), 10);
147
+ }
148
+
149
+ module.exports = {
150
+ unitMap,
151
+ numberToString,
152
+ getValueOfUnit,
153
+ fromWei,
154
+ toWei,
155
+ };
@@ -0,0 +1,138 @@
1
+ const units = require('../index.js'); // eslint-disable-line
2
+ const BigNumber = require('bn.js'); // eslint-disable-line
3
+ const ActualBigNumber = require('bignumber.js');
4
+ const Web3 = require('web3'); // eslint-disable-line
5
+ const web3 = new Web3(); // eslint-disable-line
6
+ const assert = require('chai').assert; // eslint-disable-line
7
+ const totalTypes = Object.keys(units.unitMap).length;
8
+
9
+ function testRandomValueAgainstWeb3ToWei(negative) {
10
+ const stringTestValue = `${negative ? '-' : ''}${String(Math.floor((Math.random() * 100000000000000000) + 1))}`;
11
+ const randomunitsType = Object.keys(units.unitMap)[Math.floor((Math.random() * (totalTypes - 1)) + 1)];
12
+ const unitsValue = units.toWei(stringTestValue, randomunitsType);
13
+ const web3Value = new BigNumber(web3.toWei(stringTestValue, randomunitsType));
14
+
15
+ // it(`toWei should work like web3 val ${unitsValue.toString(10)} should equal ${web3Value.toString(10)}`, () => {
16
+ assert.deepEqual(unitsValue, web3Value);
17
+ // });
18
+ }
19
+
20
+ function testRandomValueAgainstWeb3FromWei(negative) {
21
+ const stringTestValue = `${negative ? '-' : ''}${String(Math.floor((Math.random() * 100000000000000000) + 1))}`;
22
+ const randomunitsType = Object.keys(units.unitMap)[Math.floor((Math.random() * (totalTypes - 1)) + 1)];
23
+ const unitsValue = units.fromWei(stringTestValue, randomunitsType);
24
+ const web3Value = web3.fromWei(stringTestValue, randomunitsType);
25
+
26
+ // it(`fromWei should work like web3 rounded val ${unitsValue.substr(0, web3Value.length - 1)} should equal ${web3Value.substr(0, web3Value.length - 1)} for unit type ${randomunitsType}`, () => {
27
+ assert.deepEqual(unitsValue.substr(0, web3Value.length - 1), web3Value.substr(0, web3Value.length - 1));
28
+ // });
29
+ }
30
+
31
+ describe('getValueOfUnit', () => {
32
+ it('should throw when undefined or not string', () => {
33
+ function invalidFromWei() {
34
+ units.fromWei(1000000000000000000, 'something');
35
+ }
36
+ assert.throws(invalidFromWei, Error);
37
+ });
38
+ });
39
+
40
+ describe('toWei', () => {
41
+ it('should handle edge cases', () => {
42
+ assert.equal(units.toWei(0, 'wei').toString(10), '0');
43
+ assert.equal(units.toWei('0.0', 'wei').toString(10), '0');
44
+ assert.equal(units.toWei('.3', 'ether').toString(10), '300000000000000000');
45
+ assert.throws(() => units.toWei('.', 'wei'), Error);
46
+ assert.throws(() => units.toWei('1.243842387924387924897423897423', 'ether'), Error);
47
+ assert.throws(() => units.toWei('8723.98234.98234', 'ether'), Error);
48
+ });
49
+
50
+ it('should return the correct value', () => {
51
+ assert.equal(units.toWei(1, 'wei').toString(10), '1');
52
+ assert.equal(units.toWei(1, 'kwei').toString(10), '1000');
53
+ assert.equal(units.toWei(1, 'Kwei').toString(10), '1000');
54
+ assert.equal(units.toWei(1, 'babbage').toString(10), '1000');
55
+ assert.equal(units.toWei(1, 'mwei').toString(10), '1000000');
56
+ assert.equal(units.toWei(1, 'Mwei').toString(10), '1000000');
57
+ assert.equal(units.toWei(1, 'lovelace').toString(10), '1000000');
58
+ assert.equal(units.toWei(1, 'gwei').toString(10), '1000000000');
59
+ assert.equal(units.toWei(1, 'Gwei').toString(10), '1000000000');
60
+ assert.equal(units.toWei(1, 'shannon').toString(10), '1000000000');
61
+ assert.equal(units.toWei(1, 'szabo').toString(10), '1000000000000');
62
+ assert.equal(units.toWei(1, 'finney').toString(10), '1000000000000000');
63
+ assert.equal(units.toWei(1, 'ether').toString(10), '1000000000000000000');
64
+ assert.equal(units.toWei(1, 'kether').toString(10), '1000000000000000000000');
65
+ assert.equal(units.toWei(1, 'grand').toString(10), '1000000000000000000000');
66
+ assert.equal(units.toWei(1, 'mether').toString(10), '1000000000000000000000000');
67
+ assert.equal(units.toWei(1, 'gether').toString(10), '1000000000000000000000000000');
68
+ assert.equal(units.toWei(1, 'tether').toString(10), '1000000000000000000000000000000');
69
+
70
+ assert.equal(units.toWei(1, 'kwei').toString(10), units.toWei(1, 'femtoether').toString(10));
71
+ assert.equal(units.toWei(1, 'szabo').toString(10), units.toWei(1, 'microether').toString(10));
72
+ assert.equal(units.toWei(1, 'finney').toString(10), units.toWei(1, 'milliether').toString(10));
73
+ assert.equal(units.toWei(1, 'milli').toString(10), units.toWei(1, 'milliether').toString(10));
74
+ assert.equal(units.toWei(1, 'milli').toString(10), units.toWei(1000, 'micro').toString(10));
75
+
76
+ assert.throws(() => { units.toWei(1, 'wei1'); }, Error);
77
+ });
78
+ });
79
+
80
+ describe('numberToString', () => {
81
+ it('should handle edge cases', () => {
82
+ // assert.throws(() => units.numberToString(null), Error);
83
+ assert.throws(() => units.numberToString(undefined), Error);
84
+ // assert.throws(() => units.numberToString(NaN), Error);
85
+ assert.throws(() => units.numberToString({}), Error);
86
+ assert.throws(() => units.numberToString([]), Error);
87
+ assert.throws(() => units.numberToString('-1sdffsdsdf'), Error);
88
+ assert.throws(() => units.numberToString('-0..-...9'), Error);
89
+ assert.throws(() => units.numberToString('fds'), Error);
90
+ assert.throws(() => units.numberToString(''), Error);
91
+ assert.throws(() => units.numberToString('#'), Error);
92
+ assert.equal(units.numberToString(55), '55');
93
+ assert.equal(units.numberToString(1), '1');
94
+ assert.equal(units.numberToString(-1), '-1');
95
+ assert.equal(units.numberToString(0), '0');
96
+ assert.equal(units.numberToString(-0), '0');
97
+ assert.equal(units.numberToString(new ActualBigNumber(10.1)), '10.1');
98
+ assert.equal(units.numberToString(new ActualBigNumber(10000)), '10000');
99
+ assert.equal(units.numberToString(new BigNumber(10000)), '10000');
100
+ assert.equal(units.numberToString(new BigNumber('-1')), '-1');
101
+ assert.equal(units.numberToString(new BigNumber('1')), '1');
102
+ assert.equal(units.numberToString(new BigNumber(0)), '0');
103
+ });
104
+ });
105
+
106
+ describe('fromWei', () => {
107
+ it('should handle options', () => {
108
+ assert.equal(units.fromWei(10000000, 'wei', { commify: true }), '10,000,000');
109
+ });
110
+
111
+ it('should return the correct value', () => {
112
+ assert.equal(units.fromWei(1000000000000000000, 'wei'), '1000000000000000000');
113
+ assert.equal(units.fromWei(1000000000000000000, 'kwei'), '1000000000000000');
114
+ assert.equal(units.fromWei(1000000000000000000, 'mwei'), '1000000000000');
115
+ assert.equal(units.fromWei(1000000000000000000, 'gwei'), '1000000000');
116
+ assert.equal(units.fromWei(1000000000000000000, 'szabo'), '1000000');
117
+ assert.equal(units.fromWei(1000000000000000000, 'finney'), '1000');
118
+ assert.equal(units.fromWei(1000000000000000000, 'ether'), '1');
119
+ assert.equal(units.fromWei(1000000000000000000, 'kether'), '0.001');
120
+ assert.equal(units.fromWei(1000000000000000000, 'grand'), '0.001');
121
+ assert.equal(units.fromWei(1000000000000000000, 'mether'), '0.000001');
122
+ assert.equal(units.fromWei(1000000000000000000, 'gether'), '0.000000001');
123
+ assert.equal(units.fromWei(1000000000000000000, 'tether'), '0.000000000001');
124
+ });
125
+ });
126
+
127
+ describe('units', () => {
128
+ describe('normal functionality', () => {
129
+ it('should be the same as web3', () => {
130
+ for (var i = 0; i < 15000; i++) { // eslint-disable-line
131
+ testRandomValueAgainstWeb3ToWei(false);
132
+ testRandomValueAgainstWeb3ToWei(true);
133
+ testRandomValueAgainstWeb3FromWei(false);
134
+ testRandomValueAgainstWeb3FromWei(true);
135
+ }
136
+ });
137
+ });
138
+ });