From 0ceee56de3368245f6683cb6418ad64c8674e723 Mon Sep 17 00:00:00 2001 From: ricmoo Date: Mon, 1 Aug 2016 17:57:00 -0400 Subject: [PATCH] Fixed contract interface coder for numbers. --- lib/contract.js | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/lib/contract.js b/lib/contract.js index d17a36f53..8cc00cc90 100644 --- a/lib/contract.js +++ b/lib/contract.js @@ -44,14 +44,28 @@ function zpad(buffer, length) { return buffer; } +// There seems to be a but in maskn, so we are doing this for now. +var bitmasks = []; +(function() { + var mask = ''; + for (var i = 0; i < 33; i++) { + bitmasks.push(new utils.BN(mask, 16)); + mask += 'ff'; + } +})(); + function coderNumber(size, signed) { return { encode: function(value) { value = numberOrBN(value) + value = value.toTwos(size * 8).and(bitmasks[size]); if (signed) { - value = value.toTwos(32 * 8); - } else if (value < 0) { - value = value.toTwos(size * 8); + value = value.fromTwos(size * 8).toTwos(256); + //value = value.toTwos(size * 8).and(bitmasks[size]).fromTwos(size * 8).toTwos(256); +// } else { //if (value.isNeg()) { +// value = value.toTwos(size * 8).and(bitmasks[size]); +// } else { +// value = value.and(bitmasks[size]); } return value.toArrayLike(Buffer, 'be', 32); }, @@ -60,7 +74,7 @@ function coderNumber(size, signed) { if (signed) { value = value.fromTwos(size * 8); } else { - value = value.mod((new utils.BN(2)).pow(new utils.BN(size * 8))) + value = value.fromTwos(size * 8); //.toTwos(256); //mod((new utils.BN(2)).pow(new utils.BN(size * 8))) } return { consumed: 32,