Merge commit '2b4d38b9bf059014596e1ab00c99dc2ad4ab3761' into ethereumjs
This commit is contained in:
commit
83505e61f3
43
dist/ethereum.js
vendored
43
dist/ethereum.js
vendored
@ -117,6 +117,13 @@ var formatInputBool = function (value) {
|
|||||||
return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
|
return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Formats input value to byte representation of real
|
||||||
|
/// Values are multiplied by 2^m and encoded as integers
|
||||||
|
/// @returns byte representation of real
|
||||||
|
var formatInputReal = function (value) {
|
||||||
|
return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
|
||||||
|
};
|
||||||
|
|
||||||
var dynamicTypeBytes = function (type, value) {
|
var dynamicTypeBytes = function (type, value) {
|
||||||
// TODO: decide what to do with array of strings
|
// TODO: decide what to do with array of strings
|
||||||
if (arrayType(type) || prefixedType('string')(type))
|
if (arrayType(type) || prefixedType('string')(type))
|
||||||
@ -133,8 +140,8 @@ var setupInputTypes = function () {
|
|||||||
{ type: prefixedType('int'), format: formatInputInt },
|
{ type: prefixedType('int'), format: formatInputInt },
|
||||||
{ type: prefixedType('hash'), format: formatInputInt },
|
{ type: prefixedType('hash'), format: formatInputInt },
|
||||||
{ type: prefixedType('string'), format: formatInputString },
|
{ type: prefixedType('string'), format: formatInputString },
|
||||||
{ type: prefixedType('real'), format: formatInputInt },
|
{ type: prefixedType('real'), format: formatInputReal },
|
||||||
{ type: prefixedType('ureal'), format: formatInputInt },
|
{ type: prefixedType('ureal'), format: formatInputReal },
|
||||||
{ type: namedType('address'), format: formatInputInt },
|
{ type: namedType('address'), format: formatInputInt },
|
||||||
{ type: namedType('bool'), format: formatInputBool }
|
{ type: namedType('bool'), format: formatInputBool }
|
||||||
];
|
];
|
||||||
@ -187,13 +194,19 @@ var toAbiInput = function (json, methodName, params) {
|
|||||||
return bytes;
|
return bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Check if input value is negative
|
||||||
|
/// @param value is hex format
|
||||||
|
/// @returns 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 input right-aligned input bytes to int
|
/// Formats input right-aligned input bytes to int
|
||||||
/// @returns right-aligned input bytes formatted to int
|
/// @returns right-aligned input bytes formatted to int
|
||||||
var formatOutputInt = function (value) {
|
var formatOutputInt = function (value) {
|
||||||
// check if it's negative number
|
// check if it's negative number
|
||||||
// it it is, return two's complement
|
// it it is, return two's complement
|
||||||
var firstBit = new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1);
|
if (signedIsNegative(value)) {
|
||||||
if (firstBit === '1') {
|
|
||||||
return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
|
return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
|
||||||
}
|
}
|
||||||
return new BigNumber(value, 16);
|
return new BigNumber(value, 16);
|
||||||
@ -205,6 +218,16 @@ var formatOutputUInt = function (value) {
|
|||||||
return new BigNumber(value, 16);
|
return new BigNumber(value, 16);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @returns input bytes formatted to real
|
||||||
|
var formatOutputReal = function (value) {
|
||||||
|
return formatOutputInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @returns input bytes formatted to ureal
|
||||||
|
var formatOutputUReal = function (value) {
|
||||||
|
return formatOutputUInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||||
|
};
|
||||||
|
|
||||||
/// @returns right-aligned input bytes formatted to hex
|
/// @returns right-aligned input bytes formatted to hex
|
||||||
var formatOutputHash = function (value) {
|
var formatOutputHash = function (value) {
|
||||||
return "0x" + value;
|
return "0x" + value;
|
||||||
@ -240,8 +263,8 @@ var setupOutputTypes = function () {
|
|||||||
{ type: prefixedType('int'), format: formatOutputInt },
|
{ type: prefixedType('int'), format: formatOutputInt },
|
||||||
{ type: prefixedType('hash'), format: formatOutputHash },
|
{ type: prefixedType('hash'), format: formatOutputHash },
|
||||||
{ type: prefixedType('string'), format: formatOutputString },
|
{ type: prefixedType('string'), format: formatOutputString },
|
||||||
{ type: prefixedType('real'), format: formatOutputInt },
|
{ type: prefixedType('real'), format: formatOutputReal },
|
||||||
{ type: prefixedType('ureal'), format: formatOutputInt },
|
{ type: prefixedType('ureal'), format: formatOutputUReal },
|
||||||
{ type: namedType('address'), format: formatOutputAddress },
|
{ type: namedType('address'), format: formatOutputAddress },
|
||||||
{ type: namedType('bool'), format: formatOutputBool }
|
{ type: namedType('bool'), format: formatOutputBool }
|
||||||
];
|
];
|
||||||
@ -387,10 +410,9 @@ module.exports = {
|
|||||||
* if it fails, it uses HttpRpcProvider
|
* if it fails, it uses HttpRpcProvider
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: is these line is supposed to be here?
|
var web3 = require('./web3'); // jshint ignore:line
|
||||||
if ("build" !== 'build') {/*
|
if ("build" !== 'build') {/*
|
||||||
var WebSocket = require('ws'); // jshint ignore:line
|
var WebSocket = require('ws'); // jshint ignore:line
|
||||||
var web3 = require('./web3'); // jshint ignore:line
|
|
||||||
*/}
|
*/}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -433,7 +455,7 @@ var AutoProvider = function (userOptions) {
|
|||||||
self.poll = self.provider.poll.bind(self.provider);
|
self.poll = self.provider.poll.bind(self.provider);
|
||||||
}
|
}
|
||||||
self.sendQueue.forEach(function (payload) {
|
self.sendQueue.forEach(function (payload) {
|
||||||
self.provider(payload);
|
self.provider.send(payload);
|
||||||
});
|
});
|
||||||
self.onmessageQueue.forEach(function (handler) {
|
self.onmessageQueue.forEach(function (handler) {
|
||||||
self.provider.onmessage = handler;
|
self.provider.onmessage = handler;
|
||||||
@ -474,7 +496,7 @@ Object.defineProperty(AutoProvider.prototype, 'onmessage', {
|
|||||||
|
|
||||||
module.exports = AutoProvider;
|
module.exports = AutoProvider;
|
||||||
|
|
||||||
},{}],3:[function(require,module,exports){
|
},{"./web3":8}],3:[function(require,module,exports){
|
||||||
/*
|
/*
|
||||||
This file is part of ethereum.js.
|
This file is part of ethereum.js.
|
||||||
|
|
||||||
@ -807,7 +829,6 @@ module.exports = HttpRpcProvider;
|
|||||||
* @date 2014
|
* @date 2014
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: is these line is supposed to be here?
|
|
||||||
var web3 = require('./web3'); // jshint ignore:line
|
var web3 = require('./web3'); // jshint ignore:line
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
8
dist/ethereum.js.map
vendored
8
dist/ethereum.js.map
vendored
File diff suppressed because one or more lines are too long
2
dist/ethereum.min.js
vendored
2
dist/ethereum.min.js
vendored
File diff suppressed because one or more lines are too long
35
lib/abi.js
35
lib/abi.js
@ -116,6 +116,13 @@ var formatInputBool = function (value) {
|
|||||||
return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
|
return '000000000000000000000000000000000000000000000000000000000000000' + (value ? '1' : '0');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Formats input value to byte representation of real
|
||||||
|
/// Values are multiplied by 2^m and encoded as integers
|
||||||
|
/// @returns byte representation of real
|
||||||
|
var formatInputReal = function (value) {
|
||||||
|
return formatInputInt(new BigNumber(value).times(new BigNumber(2).pow(128)));
|
||||||
|
};
|
||||||
|
|
||||||
var dynamicTypeBytes = function (type, value) {
|
var dynamicTypeBytes = function (type, value) {
|
||||||
// TODO: decide what to do with array of strings
|
// TODO: decide what to do with array of strings
|
||||||
if (arrayType(type) || prefixedType('string')(type))
|
if (arrayType(type) || prefixedType('string')(type))
|
||||||
@ -132,8 +139,8 @@ var setupInputTypes = function () {
|
|||||||
{ type: prefixedType('int'), format: formatInputInt },
|
{ type: prefixedType('int'), format: formatInputInt },
|
||||||
{ type: prefixedType('hash'), format: formatInputInt },
|
{ type: prefixedType('hash'), format: formatInputInt },
|
||||||
{ type: prefixedType('string'), format: formatInputString },
|
{ type: prefixedType('string'), format: formatInputString },
|
||||||
{ type: prefixedType('real'), format: formatInputInt },
|
{ type: prefixedType('real'), format: formatInputReal },
|
||||||
{ type: prefixedType('ureal'), format: formatInputInt },
|
{ type: prefixedType('ureal'), format: formatInputReal },
|
||||||
{ type: namedType('address'), format: formatInputInt },
|
{ type: namedType('address'), format: formatInputInt },
|
||||||
{ type: namedType('bool'), format: formatInputBool }
|
{ type: namedType('bool'), format: formatInputBool }
|
||||||
];
|
];
|
||||||
@ -186,13 +193,19 @@ var toAbiInput = function (json, methodName, params) {
|
|||||||
return bytes;
|
return bytes;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// Check if input value is negative
|
||||||
|
/// @param value is hex format
|
||||||
|
/// @returns 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 input right-aligned input bytes to int
|
/// Formats input right-aligned input bytes to int
|
||||||
/// @returns right-aligned input bytes formatted to int
|
/// @returns right-aligned input bytes formatted to int
|
||||||
var formatOutputInt = function (value) {
|
var formatOutputInt = function (value) {
|
||||||
// check if it's negative number
|
// check if it's negative number
|
||||||
// it it is, return two's complement
|
// it it is, return two's complement
|
||||||
var firstBit = new BigNumber(value.substr(0, 1), 16).toString(2).substr(0, 1);
|
if (signedIsNegative(value)) {
|
||||||
if (firstBit === '1') {
|
|
||||||
return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
|
return new BigNumber(value, 16).minus(new BigNumber('ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', 16)).minus(1);
|
||||||
}
|
}
|
||||||
return new BigNumber(value, 16);
|
return new BigNumber(value, 16);
|
||||||
@ -204,6 +217,16 @@ var formatOutputUInt = function (value) {
|
|||||||
return new BigNumber(value, 16);
|
return new BigNumber(value, 16);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/// @returns input bytes formatted to real
|
||||||
|
var formatOutputReal = function (value) {
|
||||||
|
return formatOutputInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||||
|
};
|
||||||
|
|
||||||
|
/// @returns input bytes formatted to ureal
|
||||||
|
var formatOutputUReal = function (value) {
|
||||||
|
return formatOutputUInt(value).dividedBy(new BigNumber(2).pow(128));
|
||||||
|
};
|
||||||
|
|
||||||
/// @returns right-aligned input bytes formatted to hex
|
/// @returns right-aligned input bytes formatted to hex
|
||||||
var formatOutputHash = function (value) {
|
var formatOutputHash = function (value) {
|
||||||
return "0x" + value;
|
return "0x" + value;
|
||||||
@ -239,8 +262,8 @@ var setupOutputTypes = function () {
|
|||||||
{ type: prefixedType('int'), format: formatOutputInt },
|
{ type: prefixedType('int'), format: formatOutputInt },
|
||||||
{ type: prefixedType('hash'), format: formatOutputHash },
|
{ type: prefixedType('hash'), format: formatOutputHash },
|
||||||
{ type: prefixedType('string'), format: formatOutputString },
|
{ type: prefixedType('string'), format: formatOutputString },
|
||||||
{ type: prefixedType('real'), format: formatOutputInt },
|
{ type: prefixedType('real'), format: formatOutputReal },
|
||||||
{ type: prefixedType('ureal'), format: formatOutputInt },
|
{ type: prefixedType('ureal'), format: formatOutputUReal },
|
||||||
{ type: namedType('address'), format: formatOutputAddress },
|
{ type: namedType('address'), format: formatOutputAddress },
|
||||||
{ type: namedType('bool'), format: formatOutputBool }
|
{ type: namedType('bool'), format: formatOutputBool }
|
||||||
];
|
];
|
||||||
|
@ -27,10 +27,9 @@
|
|||||||
* if it fails, it uses HttpRpcProvider
|
* if it fails, it uses HttpRpcProvider
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: is these line is supposed to be here?
|
var web3 = require('./web3'); // jshint ignore:line
|
||||||
if (process.env.NODE_ENV !== 'build') {
|
if (process.env.NODE_ENV !== 'build') {
|
||||||
var WebSocket = require('ws'); // jshint ignore:line
|
var WebSocket = require('ws'); // jshint ignore:line
|
||||||
var web3 = require('./web3'); // jshint ignore:line
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -73,7 +72,7 @@ var AutoProvider = function (userOptions) {
|
|||||||
self.poll = self.provider.poll.bind(self.provider);
|
self.poll = self.provider.poll.bind(self.provider);
|
||||||
}
|
}
|
||||||
self.sendQueue.forEach(function (payload) {
|
self.sendQueue.forEach(function (payload) {
|
||||||
self.provider(payload);
|
self.provider.send(payload);
|
||||||
});
|
});
|
||||||
self.onmessageQueue.forEach(function (handler) {
|
self.onmessageQueue.forEach(function (handler) {
|
||||||
self.provider.onmessage = handler;
|
self.provider.onmessage = handler;
|
||||||
|
@ -23,7 +23,6 @@
|
|||||||
* @date 2014
|
* @date 2014
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: is these line is supposed to be here?
|
|
||||||
var web3 = require('./web3'); // jshint ignore:line
|
var web3 = require('./web3'); // jshint ignore:line
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -380,6 +380,45 @@ describe('abi', function() {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should parse input real', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var d = clone(description);
|
||||||
|
|
||||||
|
d[0].inputs = [
|
||||||
|
{ type: 'real' }
|
||||||
|
];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var parser = abi.inputParser(d);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(parser.test([1]), "0000000000000000000000000000000100000000000000000000000000000000");
|
||||||
|
assert.equal(parser.test([2.125]), "0000000000000000000000000000000220000000000000000000000000000000");
|
||||||
|
assert.equal(parser.test([8.5]), "0000000000000000000000000000000880000000000000000000000000000000");
|
||||||
|
assert.equal(parser.test([-1]), "ffffffffffffffffffffffffffffffff00000000000000000000000000000000");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse input ureal', function () {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var d = clone(description);
|
||||||
|
|
||||||
|
d[0].inputs = [
|
||||||
|
{ type: 'ureal' }
|
||||||
|
];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var parser = abi.inputParser(d);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(parser.test([1]), "0000000000000000000000000000000100000000000000000000000000000000");
|
||||||
|
assert.equal(parser.test([2.125]), "0000000000000000000000000000000220000000000000000000000000000000");
|
||||||
|
assert.equal(parser.test([8.5]), "0000000000000000000000000000000880000000000000000000000000000000");
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('outputParser', function() {
|
describe('outputParser', function() {
|
||||||
@ -633,12 +672,52 @@ describe('abi', function() {
|
|||||||
var parser = abi.outputParser(d);
|
var parser = abi.outputParser(d);
|
||||||
|
|
||||||
// then
|
// then
|
||||||
assert.equal(parser.test("000000000000000000000000000000000000000000000000000000000000000001")[0], true);
|
assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000001")[0], true);
|
||||||
assert.equal(parser.test("000000000000000000000000000000000000000000000000000000000000000000")[0], false);
|
assert.equal(parser.test("0x0000000000000000000000000000000000000000000000000000000000000000")[0], false);
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it('should parse output real', function() {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var d = clone(description);
|
||||||
|
|
||||||
|
d[0].outputs = [
|
||||||
|
{ type: 'real' }
|
||||||
|
];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var parser = abi.outputParser(d);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000100000000000000000000000000000000")[0], 1);
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000220000000000000000000000000000000")[0], 2.125);
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000880000000000000000000000000000000")[0], 8.5);
|
||||||
|
assert.equal(parser.test("0xffffffffffffffffffffffffffffffff00000000000000000000000000000000")[0], -1);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should parse output ureal', function() {
|
||||||
|
|
||||||
|
// given
|
||||||
|
var d = clone(description);
|
||||||
|
|
||||||
|
d[0].outputs = [
|
||||||
|
{ type: 'ureal' }
|
||||||
|
];
|
||||||
|
|
||||||
|
// when
|
||||||
|
var parser = abi.outputParser(d);
|
||||||
|
|
||||||
|
// then
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000100000000000000000000000000000000")[0], 1);
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000220000000000000000000000000000000")[0], 2.125);
|
||||||
|
assert.equal(parser.test("0x0000000000000000000000000000000880000000000000000000000000000000")[0], 8.5);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should parse multiple output strings', function() {
|
it('should parse multiple output strings', function() {
|
||||||
|
|
||||||
// given
|
// given
|
||||||
|
Loading…
Reference in New Issue
Block a user