mirror of https://github.com/status-im/web3.js.git
Merge branch 'develop' into ipcProvider
Conflicts: dist/web3-light.js dist/web3-light.min.js dist/web3.js dist/web3.js.map dist/web3.min.js
This commit is contained in:
commit
706fc21128
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "web3",
|
"name": "web3",
|
||||||
"namespace": "ethereum",
|
"namespace": "ethereum",
|
||||||
"version": "0.6.1",
|
"version": "0.8.1",
|
||||||
"description": "Ethereum Compatible JavaScript API",
|
"description": "Ethereum Compatible JavaScript API",
|
||||||
"main": [
|
"main": [
|
||||||
"./dist/web3.js",
|
"./dist/web3.js",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -16,7 +16,7 @@
|
||||||
document.getElementById('coinbase').innerText = 'coinbase: ' + coinbase;
|
document.getElementById('coinbase').innerText = 'coinbase: ' + coinbase;
|
||||||
document.getElementById('original').innerText = ' original balance: ' + originalBalance + ' watching...';
|
document.getElementById('original').innerText = ' original balance: ' + originalBalance + ' watching...';
|
||||||
|
|
||||||
web3.eth.filter('pending').watch(function() {
|
web3.eth.filter('latest').watch(function() {
|
||||||
var currentBalance = web3.eth.getBalance(coinbase).toNumber();
|
var currentBalance = web3.eth.getBalance(coinbase).toNumber();
|
||||||
document.getElementById("current").innerText = 'current: ' + currentBalance;
|
document.getElementById("current").innerText = 'current: ' + currentBalance;
|
||||||
document.getElementById("diff").innerText = 'diff: ' + (currentBalance - originalBalance);
|
document.getElementById("diff").innerText = 'diff: ' + (currentBalance - originalBalance);
|
||||||
|
|
|
@ -31,25 +31,18 @@
|
||||||
// let's assume that coinbase is our account
|
// let's assume that coinbase is our account
|
||||||
web3.eth.defaultAccount = web3.eth.coinbase;
|
web3.eth.defaultAccount = web3.eth.coinbase;
|
||||||
|
|
||||||
var watch = web3.eth.filter('latest');
|
|
||||||
|
|
||||||
// create contract
|
// create contract
|
||||||
myContract = web3.eth.contract(abi).new({data: code});
|
|
||||||
console.log('address: ' + myContract.address);
|
|
||||||
document.getElementById('status').innerText = "transaction sent, waiting for confirmation";
|
document.getElementById('status').innerText = "transaction sent, waiting for confirmation";
|
||||||
watch.watch(function (err, hash) {
|
web3.eth.contract(abi).new({data: code}, function (err, contract) {
|
||||||
var block = web3.eth.getBlock(hash, true);
|
if (err) {
|
||||||
var contractMined = block.transactions.reduce(function (mined, th) {
|
console.error(err);
|
||||||
// TODO: compiled code do not have 0x prefix
|
return;
|
||||||
return mined || (th.from === web3.eth.defaultAccount && th.input.indexOf(code) !== -1);
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
if (contractMined) {
|
|
||||||
document.getElementById('status').innerText = 'Mined!';
|
|
||||||
document.getElementById('call').style.visibility = 'visible';
|
|
||||||
}
|
}
|
||||||
|
myContract = contract;
|
||||||
|
console.log('address: ' + myContract.address);
|
||||||
|
document.getElementById('status').innerText = 'Mined!';
|
||||||
|
document.getElementById('call').style.visibility = 'visible';
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function callExampleContract() {
|
function callExampleContract() {
|
||||||
|
|
|
@ -0,0 +1,77 @@
|
||||||
|
<!doctype>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<script type="text/javascript" src="../dist/web3.js"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
|
||||||
|
var web3 = require('web3');
|
||||||
|
web3.setProvider(new web3.providers.HttpProvider("http://localhost:8545"));
|
||||||
|
|
||||||
|
// solidity code code
|
||||||
|
var source = "" +
|
||||||
|
"contract test {\n" +
|
||||||
|
" function take(uint[] a, uint b) constant returns(uint d) {\n" +
|
||||||
|
" return a[b];\n" +
|
||||||
|
" }\n" +
|
||||||
|
"}\n";
|
||||||
|
|
||||||
|
var compiled = web3.eth.compile.solidity(source);
|
||||||
|
var code = compiled.test.code;
|
||||||
|
// contract json abi, this is autogenerated using solc CLI
|
||||||
|
var abi = compiled.test.info.abiDefinition;
|
||||||
|
|
||||||
|
var myContract;
|
||||||
|
|
||||||
|
function createExampleContract() {
|
||||||
|
// hide create button
|
||||||
|
document.getElementById('create').style.visibility = 'hidden';
|
||||||
|
document.getElementById('code').innerText = code;
|
||||||
|
|
||||||
|
// let's assume that coinbase is our account
|
||||||
|
web3.eth.defaultAccount = web3.eth.coinbase;
|
||||||
|
|
||||||
|
// create contract
|
||||||
|
document.getElementById('status').innerText = "transaction sent, waiting for confirmation";
|
||||||
|
web3.eth.contract(abi).new({data: code}, function (err, contract) {
|
||||||
|
if (err) {
|
||||||
|
console.error(err);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
myContract = contract;
|
||||||
|
console.log('address: ' + myContract.address);
|
||||||
|
|
||||||
|
document.getElementById('status').innerText = 'Mined!';
|
||||||
|
document.getElementById('call').style.visibility = 'visible';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function callExampleContract() {
|
||||||
|
// this should be generated by ethereum
|
||||||
|
var param = parseInt(document.getElementById('value').value);
|
||||||
|
|
||||||
|
// call the contract
|
||||||
|
var res = myContract.take([0,6,5,2,1,5,6], param);
|
||||||
|
document.getElementById('result').innerText = res.toString(10);
|
||||||
|
}
|
||||||
|
|
||||||
|
</script>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>contract</h1>
|
||||||
|
<div id="code"></div>
|
||||||
|
<div id="status"></div>
|
||||||
|
<div id='create'>
|
||||||
|
<button type="button" onClick="createExampleContract();">create example contract</button>
|
||||||
|
</div>
|
||||||
|
<div id='call' style='visibility: hidden;'>
|
||||||
|
<div>var array = [0,6,5,2,1,5,6];</div>
|
||||||
|
<div>var x = array[
|
||||||
|
<input type="number" id="value" onkeyup='callExampleContract()'></input>
|
||||||
|
];
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div id="result"></div>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
|
|
@ -35,29 +35,22 @@
|
||||||
// let's assume that we have a private key to coinbase ;)
|
// let's assume that we have a private key to coinbase ;)
|
||||||
web3.eth.defaultAccount = web3.eth.coinbase;
|
web3.eth.defaultAccount = web3.eth.coinbase;
|
||||||
|
|
||||||
var watch = web3.eth.filter('latest');
|
|
||||||
|
|
||||||
contract = web3.eth.contract(abi).new({data: code});
|
|
||||||
|
|
||||||
console.log('address: ' + contract.address);
|
|
||||||
|
|
||||||
document.getElementById('create').style.visibility = 'hidden';
|
document.getElementById('create').style.visibility = 'hidden';
|
||||||
document.getElementById('status').innerText = "transaction sent, waiting for confirmation";
|
document.getElementById('status').innerText = "transaction sent, waiting for confirmation";
|
||||||
watch.watch(function (err, hash) {
|
|
||||||
var block = web3.eth.getBlock(hash, true);
|
|
||||||
var contractMined = block.transactions.reduce(function (mined, th) {
|
|
||||||
// TODO: compiled code do not have 0x prefix
|
|
||||||
return mined || (th.from === web3.eth.defaultAccount && th.input.indexOf(code) !== -1);
|
|
||||||
}, false);
|
|
||||||
|
|
||||||
if (contractMined) {
|
web3.eth.contract(abi).new({data: code}, function (err, c) {
|
||||||
document.getElementById('status').innerText = 'Mined!';
|
if (err) {
|
||||||
document.getElementById('call').style.visibility = 'visible';
|
console.error(err);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
});
|
|
||||||
|
|
||||||
inc = contract.Incremented({odd: true});
|
contract = c;
|
||||||
inc.watch(update);
|
console.log('address: ' + contract.address);
|
||||||
|
document.getElementById('status').innerText = 'Mined!';
|
||||||
|
document.getElementById('call').style.visibility = 'visible';
|
||||||
|
|
||||||
|
inc = contract.Incremented({odd: true}, update);
|
||||||
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
var counter = 0;
|
var counter = 0;
|
||||||
|
|
27
gulpfile.js
27
gulpfile.js
|
@ -17,7 +17,7 @@ var bower = require('bower');
|
||||||
var streamify = require('gulp-streamify');
|
var streamify = require('gulp-streamify');
|
||||||
var replace = require('gulp-replace');
|
var replace = require('gulp-replace');
|
||||||
|
|
||||||
var DEST = './dist/';
|
var DEST = path.join(__dirname, 'dist/');
|
||||||
var src = 'index';
|
var src = 'index';
|
||||||
var dst = 'web3';
|
var dst = 'web3';
|
||||||
var lightDst = 'web3-light';
|
var lightDst = 'web3-light';
|
||||||
|
@ -29,7 +29,7 @@ var browserifyOptions = {
|
||||||
bundleExternal: true
|
bundleExternal: true
|
||||||
};
|
};
|
||||||
|
|
||||||
gulp.task('versionReplace', function(){
|
gulp.task('version', function(){
|
||||||
gulp.src(['./package.json'])
|
gulp.src(['./package.json'])
|
||||||
.pipe(replace(/\"version\"\: \"(.{5})\"/, '"version": "'+ version.version + '"'))
|
.pipe(replace(/\"version\"\: \"(.{5})\"/, '"version": "'+ version.version + '"'))
|
||||||
.pipe(gulp.dest('./'));
|
.pipe(gulp.dest('./'));
|
||||||
|
@ -41,24 +41,24 @@ gulp.task('versionReplace', function(){
|
||||||
.pipe(gulp.dest('./'));
|
.pipe(gulp.dest('./'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('bower', function(cb){
|
gulp.task('bower', ['version'], function(cb){
|
||||||
bower.commands.install().on('end', function (installed){
|
bower.commands.install().on('end', function (installed){
|
||||||
console.log(installed);
|
console.log(installed);
|
||||||
cb();
|
cb();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('clean', ['lint'], function(cb) {
|
gulp.task('lint', ['bower'], function(){
|
||||||
del([ DEST ], cb);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task('lint', function(){
|
|
||||||
return gulp.src(['./*.js', './lib/*.js'])
|
return gulp.src(['./*.js', './lib/*.js'])
|
||||||
.pipe(jshint())
|
.pipe(jshint())
|
||||||
.pipe(jshint.reporter('default'));
|
.pipe(jshint.reporter('default'));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('buildLight', ['clean'], function () {
|
gulp.task('clean', ['lint'], function(cb) {
|
||||||
|
del([ DEST ], cb);
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task('light', ['clean'], function () {
|
||||||
return browserify(browserifyOptions)
|
return browserify(browserifyOptions)
|
||||||
.require('./' + src + '.js', {expose: 'web3'})
|
.require('./' + src + '.js', {expose: 'web3'})
|
||||||
.ignore('bignumber.js')
|
.ignore('bignumber.js')
|
||||||
|
@ -73,7 +73,7 @@ gulp.task('buildLight', ['clean'], function () {
|
||||||
.pipe(gulp.dest( DEST ));
|
.pipe(gulp.dest( DEST ));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('buildStandalone', ['clean'], function () {
|
gulp.task('standalone', ['clean'], function () {
|
||||||
return browserify(browserifyOptions)
|
return browserify(browserifyOptions)
|
||||||
.require('./' + src + '.js', {expose: 'web3'})
|
.require('./' + src + '.js', {expose: 'web3'})
|
||||||
.require('bignumber.js') // expose it to dapp users
|
.require('bignumber.js') // expose it to dapp users
|
||||||
|
@ -92,10 +92,5 @@ gulp.task('watch', function() {
|
||||||
gulp.watch(['./lib/*.js'], ['lint', 'build']);
|
gulp.watch(['./lib/*.js'], ['lint', 'build']);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('light', ['versionReplace','bower', 'lint', 'buildLight']);
|
gulp.task('default', ['version', 'bower', 'lint', 'clean', 'light', 'standalone']);
|
||||||
gulp.task('standalone', ['versionReplace','bower', 'lint', 'buildStandalone']);
|
|
||||||
gulp.task('default', ['light', 'standalone']);
|
|
||||||
|
|
||||||
|
|
||||||
gulp.task('version', ['versionReplace']);
|
|
||||||
|
|
||||||
|
|
|
@ -262,6 +262,13 @@ var coder = new SolidityCoder([
|
||||||
inputFormatter: f.formatInputBytes,
|
inputFormatter: f.formatInputBytes,
|
||||||
outputFormatter: f.formatOutputBytes
|
outputFormatter: f.formatOutputBytes
|
||||||
}),
|
}),
|
||||||
|
new SolidityType({
|
||||||
|
name: 'string',
|
||||||
|
match: 'strict',
|
||||||
|
mode: 'bytes',
|
||||||
|
inputFormatter: f.formatInputString,
|
||||||
|
outputFormatter: f.formatOutputString
|
||||||
|
}),
|
||||||
new SolidityType({
|
new SolidityType({
|
||||||
name: 'real',
|
name: 'real',
|
||||||
match: 'prefix',
|
match: 'prefix',
|
||||||
|
|
|
@ -43,26 +43,43 @@ var formatInputInt = function (value) {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats input value to byte representation of string
|
* Formats input bytes
|
||||||
*
|
*
|
||||||
* @method formatInputBytes
|
* @method formatInputBytes
|
||||||
* @param {String}
|
* @param {String}
|
||||||
* @returns {SolidityParam}
|
* @returns {SolidityParam}
|
||||||
*/
|
*/
|
||||||
var formatInputBytes = function (value) {
|
var formatInputBytes = function (value) {
|
||||||
var result = utils.fromAscii(value, c.ETH_PADDING).substr(2);
|
var result = utils.padRight(utils.toHex(value).substr(2), 64);
|
||||||
return new SolidityParam(result);
|
return new SolidityParam(result);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats input bytes
|
||||||
|
*
|
||||||
|
* @method formatDynamicInputBytes
|
||||||
|
* @param {String}
|
||||||
|
* @returns {SolidityParam}
|
||||||
|
*/
|
||||||
|
var formatInputDynamicBytes = function (value) {
|
||||||
|
value = utils.toHex(value).substr(2);
|
||||||
|
var l = Math.floor((value.length + 63) / 64);
|
||||||
|
var result = utils.padRight(value, l * 64);
|
||||||
|
var length = Math.floor(value.length / 2);
|
||||||
|
return new SolidityParam(formatInputInt(length).value + result, 32);
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats input value to byte representation of string
|
* Formats input value to byte representation of string
|
||||||
*
|
*
|
||||||
* @method formatInputDynamicBytes
|
* @method formatInputString
|
||||||
* @param {String}
|
* @param {String}
|
||||||
* @returns {SolidityParam}
|
* @returns {SolidityParam}
|
||||||
*/
|
*/
|
||||||
var formatInputDynamicBytes = function (value) {
|
var formatInputString = function (value) {
|
||||||
var result = utils.fromAscii(value, c.ETH_PADDING).substr(2);
|
var result = utils.fromAscii(value).substr(2);
|
||||||
|
var l = Math.floor((result.length + 63) / 64);
|
||||||
|
result = utils.padRight(result, l * 64);
|
||||||
return new SolidityParam(formatInputInt(value.length).value + result, 32);
|
return new SolidityParam(formatInputInt(value.length).value + result, 32);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -165,27 +182,38 @@ var formatOutputBool = function (param) {
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should be used to format output string
|
* Should be used to format output bytes
|
||||||
*
|
*
|
||||||
* @method formatOutputBytes
|
* @method formatOutputBytes
|
||||||
* @param {SolidityParam} left-aligned hex representation of string
|
* @param {SolidityParam} left-aligned hex representation of string
|
||||||
* @returns {String} ascii string
|
* @returns {String} hex string
|
||||||
*/
|
*/
|
||||||
var formatOutputBytes = function (param) {
|
var formatOutputBytes = function (param) {
|
||||||
// length might also be important!
|
return '0x' + param.staticPart();
|
||||||
return utils.toAscii(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
|
* Should be used to format output string
|
||||||
*
|
*
|
||||||
* @method formatOutputDynamicBytes
|
* @method formatOutputString
|
||||||
* @param {SolidityParam} left-aligned hex representation of string
|
* @param {SolidityParam} left-aligned hex representation of string
|
||||||
* @returns {String} ascii string
|
* @returns {String} ascii string
|
||||||
*/
|
*/
|
||||||
var formatOutputDynamicBytes = function (param) {
|
var formatOutputString = function (param) {
|
||||||
// length might also be important!
|
var length = (new BigNumber(param.dynamicPart().slice(0, 64), 16)).toNumber() * 2;
|
||||||
return utils.toAscii(param.dynamicPart().slice(64));
|
return utils.toAscii(param.dynamicPart().substr(64, length));
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -204,6 +232,7 @@ module.exports = {
|
||||||
formatInputInt: formatInputInt,
|
formatInputInt: formatInputInt,
|
||||||
formatInputBytes: formatInputBytes,
|
formatInputBytes: formatInputBytes,
|
||||||
formatInputDynamicBytes: formatInputDynamicBytes,
|
formatInputDynamicBytes: formatInputDynamicBytes,
|
||||||
|
formatInputString: formatInputString,
|
||||||
formatInputBool: formatInputBool,
|
formatInputBool: formatInputBool,
|
||||||
formatInputReal: formatInputReal,
|
formatInputReal: formatInputReal,
|
||||||
formatOutputInt: formatOutputInt,
|
formatOutputInt: formatOutputInt,
|
||||||
|
@ -213,6 +242,7 @@ module.exports = {
|
||||||
formatOutputBool: formatOutputBool,
|
formatOutputBool: formatOutputBool,
|
||||||
formatOutputBytes: formatOutputBytes,
|
formatOutputBytes: formatOutputBytes,
|
||||||
formatOutputDynamicBytes: formatOutputDynamicBytes,
|
formatOutputDynamicBytes: formatOutputDynamicBytes,
|
||||||
|
formatOutputString: formatOutputString,
|
||||||
formatOutputAddress: formatOutputAddress
|
formatOutputAddress: formatOutputAddress
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -182,13 +182,14 @@ var getOffset = function (bytes, index) {
|
||||||
*/
|
*/
|
||||||
SolidityParam.decodeBytes = function (bytes, index) {
|
SolidityParam.decodeBytes = function (bytes, index) {
|
||||||
index = index || 0;
|
index = index || 0;
|
||||||
//TODO add support for strings longer than 32 bytes
|
|
||||||
//var length = parseInt('0x' + bytes.substr(offset * 64, 64));
|
|
||||||
|
|
||||||
var offset = getOffset(bytes, index);
|
var offset = getOffset(bytes, index);
|
||||||
|
|
||||||
// 2 * , cause we also parse length
|
var l = parseInt('0x' + bytes.substr(offset * 2, 64));
|
||||||
return new SolidityParam(bytes.substr(offset * 2, 2 * 64), 0);
|
l = Math.floor((l + 31) / 32);
|
||||||
|
|
||||||
|
// (1 + l) * , cause we also parse length
|
||||||
|
return new SolidityParam(bytes.substr(offset * 2, (1 + l) * 64), 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
// go env doesn't have and need XMLHttpRequest
|
||||||
|
if (typeof XMLHttpRequest === 'undefined') {
|
||||||
|
exports.XMLHttpRequest = {};
|
||||||
|
} else {
|
||||||
|
exports.XMLHttpRequest = XMLHttpRequest; // jshint ignore:line
|
||||||
|
}
|
||||||
|
|
|
@ -75,6 +75,19 @@ var padLeft = function (string, chars, sign) {
|
||||||
return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
|
return new Array(chars - string.length + 1).join(sign ? sign : "0") + string;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should be called to pad string to expected length
|
||||||
|
*
|
||||||
|
* @method padRight
|
||||||
|
* @param {String} string to be padded
|
||||||
|
* @param {Number} characters that result string should have
|
||||||
|
* @param {String} sign, by default 0
|
||||||
|
* @returns {String} right aligned string
|
||||||
|
*/
|
||||||
|
var padRight = function (string, chars, sign) {
|
||||||
|
return string + (new Array(chars - string.length + 1).join(sign ? sign : "0"));
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should be called to get sting from it's hex representation
|
* Should be called to get sting from it's hex representation
|
||||||
*
|
*
|
||||||
|
@ -91,10 +104,6 @@ var toAscii = function(hex) {
|
||||||
}
|
}
|
||||||
for (; i < l; i+=2) {
|
for (; i < l; i+=2) {
|
||||||
var code = parseInt(hex.substr(i, 2), 16);
|
var code = parseInt(hex.substr(i, 2), 16);
|
||||||
if (code === 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
str += String.fromCharCode(code);
|
str += String.fromCharCode(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +213,7 @@ var fromDecimal = function (value) {
|
||||||
* @return {String}
|
* @return {String}
|
||||||
*/
|
*/
|
||||||
var toHex = function (val) {
|
var toHex = function (val) {
|
||||||
/*jshint maxcomplexity:7 */
|
/*jshint maxcomplexity: 8 */
|
||||||
|
|
||||||
if (isBoolean(val))
|
if (isBoolean(val))
|
||||||
return fromDecimal(+val);
|
return fromDecimal(+val);
|
||||||
|
@ -218,9 +227,11 @@ var toHex = function (val) {
|
||||||
// if its a negative number, pass it through fromDecimal
|
// if its a negative number, pass it through fromDecimal
|
||||||
if (isString(val)) {
|
if (isString(val)) {
|
||||||
if (val.indexOf('-0x') === 0)
|
if (val.indexOf('-0x') === 0)
|
||||||
return fromDecimal(val);
|
return fromDecimal(val);
|
||||||
else if (!isFinite(val))
|
else if (!isFinite(val))
|
||||||
return fromAscii(val);
|
return fromAscii(val);
|
||||||
|
else if(val.indexOf('0x') === 0)
|
||||||
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
return fromDecimal(val);
|
return fromDecimal(val);
|
||||||
|
@ -471,6 +482,7 @@ var isIBAN = function (iban) {
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
padLeft: padLeft,
|
padLeft: padLeft,
|
||||||
|
padRight: padRight,
|
||||||
toHex: toHex,
|
toHex: toHex,
|
||||||
toDecimal: toDecimal,
|
toDecimal: toDecimal,
|
||||||
fromDecimal: fromDecimal,
|
fromDecimal: fromDecimal,
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
{
|
{
|
||||||
"version": "0.6.1"
|
"version": "0.8.1"
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,63 @@ var contract = function (abi) {
|
||||||
return new ContractFactory(abi);
|
return new ContractFactory(abi);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Should be called to check if the contract gets properly deployed on the blockchain.
|
||||||
|
*
|
||||||
|
* @method checkForContractAddress
|
||||||
|
* @param {Object} contract
|
||||||
|
* @param {Function} callback
|
||||||
|
* @returns {Undefined}
|
||||||
|
*/
|
||||||
|
var checkForContractAddress = function(contract, abi, callback){
|
||||||
|
var count = 0;
|
||||||
|
|
||||||
|
// wait for receipt
|
||||||
|
var filter = web3.eth.filter('latest', function(e){
|
||||||
|
if(!e) {
|
||||||
|
count++;
|
||||||
|
|
||||||
|
// console.log('Checking for contract address', count);
|
||||||
|
|
||||||
|
// stop watching after 50 blocks (timeout)
|
||||||
|
if(count > 50) {
|
||||||
|
if(callback)
|
||||||
|
callback(new Error('Contract couldn\'t be deployed'));
|
||||||
|
|
||||||
|
filter.stopWatching();
|
||||||
|
|
||||||
|
} else {
|
||||||
|
|
||||||
|
web3.eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
|
||||||
|
if(receipt) {
|
||||||
|
|
||||||
|
web3.eth.getCode(receipt.contractAddress, function(e, code){
|
||||||
|
if(code.length > 2) {
|
||||||
|
|
||||||
|
// console.log('Contract code deployed!');
|
||||||
|
|
||||||
|
contract.address = receipt.contractAddress;
|
||||||
|
|
||||||
|
// attach events and methods
|
||||||
|
addFunctionsToContract(contract, abi);
|
||||||
|
addEventsToContract(contract, abi);
|
||||||
|
|
||||||
|
if(callback)
|
||||||
|
callback(null, contract);
|
||||||
|
|
||||||
|
} else if(callback) {
|
||||||
|
callback(new Error('The contract code couldn\'t be stored'));
|
||||||
|
}
|
||||||
|
|
||||||
|
filter.stopWatching();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Should be called to create new ContractFactory instance
|
* Should be called to create new ContractFactory instance
|
||||||
*
|
*
|
||||||
|
@ -114,10 +171,12 @@ var ContractFactory = function (abi) {
|
||||||
* @param {Any} contract constructor param2 (optional)
|
* @param {Any} contract constructor param2 (optional)
|
||||||
* @param {Object} contract transaction object (required)
|
* @param {Object} contract transaction object (required)
|
||||||
* @param {Function} callback
|
* @param {Function} callback
|
||||||
* @returns {Contract} returns contract if no callback was passed,
|
* @returns {Contract} returns contract instance
|
||||||
* otherwise calls callback function (err, contract)
|
|
||||||
*/
|
*/
|
||||||
ContractFactory.prototype.new = function () {
|
ContractFactory.prototype.new = function () {
|
||||||
|
var _this = this;
|
||||||
|
var contract = new Contract(this.abi);
|
||||||
|
|
||||||
// parse arguments
|
// parse arguments
|
||||||
var options = {}; // required!
|
var options = {}; // required!
|
||||||
var callback;
|
var callback;
|
||||||
|
@ -137,18 +196,27 @@ ContractFactory.prototype.new = function () {
|
||||||
var bytes = encodeConstructorParams(this.abi, args);
|
var bytes = encodeConstructorParams(this.abi, args);
|
||||||
options.data += bytes;
|
options.data += bytes;
|
||||||
|
|
||||||
if (!callback) {
|
|
||||||
var address = web3.eth.sendTransaction(options);
|
if(callback) {
|
||||||
return this.at(address);
|
|
||||||
|
// wait for the contract address adn check if the code was deployed
|
||||||
|
web3.eth.sendTransaction(options, function (err, hash) {
|
||||||
|
if (err) {
|
||||||
|
callback(err);
|
||||||
|
} else {
|
||||||
|
// add the transaction hash
|
||||||
|
contract.transactionHash = hash;
|
||||||
|
checkForContractAddress(contract, _this.abi, callback);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var hash = web3.eth.sendTransaction(options);
|
||||||
|
// add the transaction hash
|
||||||
|
contract.transactionHash = hash;
|
||||||
|
checkForContractAddress(contract, _this.abi);
|
||||||
}
|
}
|
||||||
|
|
||||||
var self = this;
|
return contract;
|
||||||
web3.eth.sendTransaction(options, function (err, address) {
|
|
||||||
if (err) {
|
|
||||||
callback(err);
|
|
||||||
}
|
|
||||||
self.at(address, callback);
|
|
||||||
});
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -161,12 +229,17 @@ ContractFactory.prototype.new = function () {
|
||||||
* otherwise calls callback function (err, contract)
|
* otherwise calls callback function (err, contract)
|
||||||
*/
|
*/
|
||||||
ContractFactory.prototype.at = function (address, callback) {
|
ContractFactory.prototype.at = function (address, callback) {
|
||||||
|
var contract = new Contract(this.abi, address);
|
||||||
// TODO: address is required
|
// TODO: address is required
|
||||||
|
|
||||||
|
// attach functions
|
||||||
|
addFunctionsToContract(contract, this.abi);
|
||||||
|
addEventsToContract(contract, this.abi);
|
||||||
|
|
||||||
if (callback) {
|
if (callback) {
|
||||||
callback(null, new Contract(this.abi, address));
|
callback(null, contract);
|
||||||
}
|
}
|
||||||
return new Contract(this.abi, address);
|
return contract;
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -178,8 +251,6 @@ ContractFactory.prototype.at = function (address, callback) {
|
||||||
*/
|
*/
|
||||||
var Contract = function (abi, address) {
|
var Contract = function (abi, address) {
|
||||||
this.address = address;
|
this.address = address;
|
||||||
addFunctionsToContract(this, abi);
|
|
||||||
addEventsToContract(this, abi);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
module.exports = contract;
|
module.exports = contract;
|
||||||
|
|
|
@ -152,6 +152,13 @@ var getTransactionFromBlock = new Method({
|
||||||
outputFormatter: formatters.outputTransactionFormatter
|
outputFormatter: formatters.outputTransactionFormatter
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var getTransactionReceipt = new Method({
|
||||||
|
name: 'getTransactionReceipt',
|
||||||
|
call: 'eth_getTransactionReceipt',
|
||||||
|
params: 1,
|
||||||
|
outputFormatter: formatters.outputTransactionReceiptFormatter
|
||||||
|
});
|
||||||
|
|
||||||
var getTransactionCount = new Method({
|
var getTransactionCount = new Method({
|
||||||
name: 'getTransactionCount',
|
name: 'getTransactionCount',
|
||||||
call: 'eth_getTransactionCount',
|
call: 'eth_getTransactionCount',
|
||||||
|
@ -230,6 +237,7 @@ var methods = [
|
||||||
getBlockUncleCount,
|
getBlockUncleCount,
|
||||||
getTransaction,
|
getTransaction,
|
||||||
getTransactionFromBlock,
|
getTransactionFromBlock,
|
||||||
|
getTransactionReceipt,
|
||||||
getTransactionCount,
|
getTransactionCount,
|
||||||
call,
|
call,
|
||||||
estimateGas,
|
estimateGas,
|
||||||
|
|
|
@ -103,8 +103,8 @@ SolidityEvent.prototype.encode = function (indexed, options) {
|
||||||
|
|
||||||
result.topics = [];
|
result.topics = [];
|
||||||
|
|
||||||
|
result.address = this._address;
|
||||||
if (!this._anonymous) {
|
if (!this._anonymous) {
|
||||||
result.address = this._address;
|
|
||||||
result.topics.push('0x' + this.signature());
|
result.topics.push('0x' + this.signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -135,6 +135,7 @@ var Filter = function (options, methods, formatter, callback) {
|
||||||
});
|
});
|
||||||
this.options = getOptions(options);
|
this.options = getOptions(options);
|
||||||
this.implementation = implementation;
|
this.implementation = implementation;
|
||||||
|
this.filterId = null;
|
||||||
this.callbacks = [];
|
this.callbacks = [];
|
||||||
this.pollFilters = [];
|
this.pollFilters = [];
|
||||||
this.formatter = formatter;
|
this.formatter = formatter;
|
||||||
|
@ -145,12 +146,13 @@ var Filter = function (options, methods, formatter, callback) {
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
self.filterId = id;
|
self.filterId = id;
|
||||||
// get filter logs at start
|
|
||||||
|
// get filter logs for the already existing watch calls
|
||||||
self.callbacks.forEach(function(cb){
|
self.callbacks.forEach(function(cb){
|
||||||
getLogsAtStart(self, cb);
|
getLogsAtStart(self, cb);
|
||||||
});
|
});
|
||||||
pollFilter(self);
|
if(self.callbacks.length > 0)
|
||||||
|
pollFilter(self);
|
||||||
|
|
||||||
// start to watch immediately
|
// start to watch immediately
|
||||||
if(callback) {
|
if(callback) {
|
||||||
|
|
|
@ -85,8 +85,8 @@ var inputTransactionFormatter = function (options){
|
||||||
* Formats the output of a transaction to its proper values
|
* Formats the output of a transaction to its proper values
|
||||||
*
|
*
|
||||||
* @method outputTransactionFormatter
|
* @method outputTransactionFormatter
|
||||||
* @param {Object} transaction
|
* @param {Object} tx
|
||||||
* @returns {Object} transaction
|
* @returns {Object}
|
||||||
*/
|
*/
|
||||||
var outputTransactionFormatter = function (tx){
|
var outputTransactionFormatter = function (tx){
|
||||||
if(tx.blockNumber !== null)
|
if(tx.blockNumber !== null)
|
||||||
|
@ -100,12 +100,36 @@ var outputTransactionFormatter = function (tx){
|
||||||
return tx;
|
return tx;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Formats the output of a transaction receipt to its proper values
|
||||||
|
*
|
||||||
|
* @method outputTransactionReceiptFormatter
|
||||||
|
* @param {Object} receipt
|
||||||
|
* @returns {Object}
|
||||||
|
*/
|
||||||
|
var outputTransactionReceiptFormatter = function (receipt){
|
||||||
|
if(receipt.blockNumber !== null)
|
||||||
|
receipt.blockNumber = utils.toDecimal(receipt.blockNumber);
|
||||||
|
if(receipt.transactionIndex !== null)
|
||||||
|
receipt.transactionIndex = utils.toDecimal(receipt.transactionIndex);
|
||||||
|
receipt.cumulativeGasUsed = utils.toDecimal(receipt.cumulativeGasUsed);
|
||||||
|
receipt.gasUsed = utils.toDecimal(receipt.gasUsed);
|
||||||
|
|
||||||
|
if(utils.isArray(receipt.logs)) {
|
||||||
|
receipt.logs = receipt.logs.map(function(log){
|
||||||
|
return outputLogFormatter(log);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
return receipt;
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Formats the output of a block to its proper values
|
* Formats the output of a block to its proper values
|
||||||
*
|
*
|
||||||
* @method outputBlockFormatter
|
* @method outputBlockFormatter
|
||||||
* @param {Object} block object
|
* @param {Object} block
|
||||||
* @returns {Object} block object
|
* @returns {Object}
|
||||||
*/
|
*/
|
||||||
var outputBlockFormatter = function(block) {
|
var outputBlockFormatter = function(block) {
|
||||||
|
|
||||||
|
@ -213,6 +237,7 @@ module.exports = {
|
||||||
inputPostFormatter: inputPostFormatter,
|
inputPostFormatter: inputPostFormatter,
|
||||||
outputBigNumberFormatter: outputBigNumberFormatter,
|
outputBigNumberFormatter: outputBigNumberFormatter,
|
||||||
outputTransactionFormatter: outputTransactionFormatter,
|
outputTransactionFormatter: outputTransactionFormatter,
|
||||||
|
outputTransactionReceiptFormatter: outputTransactionReceiptFormatter,
|
||||||
outputBlockFormatter: outputBlockFormatter,
|
outputBlockFormatter: outputBlockFormatter,
|
||||||
outputLogFormatter: outputLogFormatter,
|
outputLogFormatter: outputLogFormatter,
|
||||||
outputPostFormatter: outputPostFormatter
|
outputPostFormatter: outputPostFormatter
|
||||||
|
|
|
@ -188,8 +188,9 @@ SolidityFunction.prototype.request = function () {
|
||||||
var format = this.unpackOutput.bind(this);
|
var format = this.unpackOutput.bind(this);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
method: this._constant ? 'eth_call' : 'eth_sendTransaction',
|
||||||
callback: callback,
|
callback: callback,
|
||||||
payload: payload,
|
params: [payload],
|
||||||
format: format
|
format: format
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/* jshint ignore:start */
|
/* jshint ignore:start */
|
||||||
Package.describe({
|
Package.describe({
|
||||||
name: 'ethereum:web3',
|
name: 'ethereum:web3',
|
||||||
version: '0.6.1',
|
version: '0.8.1',
|
||||||
summary: 'Ethereum JavaScript API, middleware to talk to a ethreum node over RPC',
|
summary: 'Ethereum JavaScript API, middleware to talk to a ethreum node over RPC',
|
||||||
git: 'https://github.com/ethereum/ethereum.js',
|
git: 'https://github.com/ethereum/ethereum.js',
|
||||||
// By default, Meteor will default to using README.md for documentation.
|
// By default, Meteor will default to using README.md for documentation.
|
||||||
|
|
23
package.json
23
package.json
|
@ -1,7 +1,7 @@
|
||||||
{
|
{
|
||||||
"name": "web3",
|
"name": "web3",
|
||||||
"namespace": "ethereum",
|
"namespace": "ethereum",
|
||||||
"version": "0.6.1",
|
"version": "0.8.1",
|
||||||
"description": "Ethereum JavaScript API, middleware to talk to a ethereum node over RPC",
|
"description": "Ethereum JavaScript API, middleware to talk to a ethereum node over RPC",
|
||||||
"main": "./index.js",
|
"main": "./index.js",
|
||||||
"directories": {
|
"directories": {
|
||||||
|
@ -13,6 +13,7 @@
|
||||||
"xmlhttprequest": "*"
|
"xmlhttprequest": "*"
|
||||||
},
|
},
|
||||||
"browser": {
|
"browser": {
|
||||||
|
"xmlhttprequest": "./lib/utils/browser-xhr.js"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"bower": ">=1.4.1",
|
"bower": ">=1.4.1",
|
||||||
|
@ -55,30 +56,30 @@
|
||||||
],
|
],
|
||||||
"author": "ethdev.com",
|
"author": "ethdev.com",
|
||||||
"authors": [
|
"authors": [
|
||||||
{
|
|
||||||
"name": "Jeffery Wilcke",
|
|
||||||
"email": "jeff@ethdev.com",
|
|
||||||
"url": "https://github.com/obscuren"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Marek Kotewicz",
|
"name": "Marek Kotewicz",
|
||||||
"email": "marek@ethdev.com",
|
"email": "marek@ethdev.com",
|
||||||
"url": "https://github.com/debris"
|
"url": "https://github.com/debris"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "Fabian Vogelsteller",
|
||||||
|
"email": "fabian@ethdev.com",
|
||||||
|
"homepage": "http://frozeman.de"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "Marian Oancea",
|
"name": "Marian Oancea",
|
||||||
"email": "marian@ethdev.com",
|
"email": "marian@ethdev.com",
|
||||||
"url": "https://github.com/cubedro"
|
"url": "https://github.com/cubedro"
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"name": "Fabian Vogelsteller",
|
|
||||||
"email": "fabian@frozeman.de",
|
|
||||||
"homepage": "http://frozeman.de"
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"name": "Gav Wood",
|
"name": "Gav Wood",
|
||||||
"email": "g@ethdev.com",
|
"email": "g@ethdev.com",
|
||||||
"homepage": "http://gavwood.com"
|
"homepage": "http://gavwood.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Jeffery Wilcke",
|
||||||
|
"email": "jeff@ethdev.com",
|
||||||
|
"url": "https://github.com/obscuren"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"license": "LGPL-3.0"
|
"license": "LGPL-3.0"
|
||||||
|
|
|
@ -28,6 +28,16 @@ describe('lib/web3/batch', function () {
|
||||||
done();
|
done();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
provider.injectValidation(function (payload) {
|
||||||
|
var first = payload[0];
|
||||||
|
var second = payload[1];
|
||||||
|
|
||||||
|
assert.equal(first.method, 'eth_getBalance');
|
||||||
|
assert.deepEqual(first.params, ['0x0000000000000000000000000000000000000000', 'latest']);
|
||||||
|
assert.equal(second.method, 'eth_getBalance');
|
||||||
|
assert.deepEqual(second.params, ['0x0000000000000000000000000000000000000005', 'latest']);
|
||||||
|
});
|
||||||
|
|
||||||
var batch = web3.createBatch();
|
var batch = web3.createBatch();
|
||||||
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
|
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
|
||||||
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000005', 'latest', callback2));
|
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000005', 'latest', callback2));
|
||||||
|
@ -55,7 +65,7 @@ describe('lib/web3/batch', function () {
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
|
||||||
var address = '0x0000000000000000000000000000000000000000';
|
var address = '0x1000000000000000000000000000000000000001';
|
||||||
var result = '0x126';
|
var result = '0x126';
|
||||||
var result2 = '0x0000000000000000000000000000000000000000000000000000000000000123';
|
var result2 = '0x0000000000000000000000000000000000000000000000000000000000000123';
|
||||||
|
|
||||||
|
@ -71,6 +81,19 @@ describe('lib/web3/batch', function () {
|
||||||
done();
|
done();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
provider.injectValidation(function (payload) {
|
||||||
|
var first = payload[0];
|
||||||
|
var second = payload[1];
|
||||||
|
|
||||||
|
assert.equal(first.method, 'eth_getBalance');
|
||||||
|
assert.deepEqual(first.params, ['0x0000000000000000000000000000000000000000', 'latest']);
|
||||||
|
assert.equal(second.method, 'eth_call');
|
||||||
|
assert.deepEqual(second.params, [{
|
||||||
|
'to': '0x1000000000000000000000000000000000000001',
|
||||||
|
'data': '0xe3d670d70000000000000000000000001000000000000000000000000000000000000001'
|
||||||
|
}]);
|
||||||
|
});
|
||||||
|
|
||||||
var batch = web3.createBatch();
|
var batch = web3.createBatch();
|
||||||
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
|
batch.add(web3.eth.getBalance.request('0x0000000000000000000000000000000000000000', 'latest', callback));
|
||||||
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
|
batch.add(web3.eth.contract(abi).at(address).balance.request(address, callback2));
|
||||||
|
|
|
@ -20,10 +20,53 @@ describe('lib/solidity/coder', function () {
|
||||||
test({ type: 'int256', expected: new bn(1), value: '0000000000000000000000000000000000000000000000000000000000000001'});
|
test({ type: 'int256', expected: new bn(1), value: '0000000000000000000000000000000000000000000000000000000000000001'});
|
||||||
test({ type: 'int256', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
test({ type: 'int256', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
test({ type: 'int256', expected: new bn(-1), value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
test({ type: 'int256', expected: new bn(-1), value: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
||||||
test({ type: 'bytes32', expected: 'gavofyork', value: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
test({ type: 'int8', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
test({ type: 'bytes', expected: 'gavofyork', value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ type: 'int32', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
|
test({ type: 'int64', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
|
test({ type: 'int128', expected: new bn(16), value: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
|
test({ type: 'bytes32', expected: '0x6761766f66796f726b0000000000000000000000000000000000000000000000',
|
||||||
|
value: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes', expected: '0x6761766f66796f726b',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes32', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
value: '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'bytes', expected: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'bytes', expected: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000060' +
|
||||||
|
'131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'string', expected: 'gavofyork', value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'string', expected: '\xc3\xa4\x00\x00\xc3\xa4',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
|
'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'string', expected: '\xc3',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
|
'c300000000000000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes', expected: '0xc3a40000c3a4',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
|
'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes32', expected: '0xc3a40000c3a40000000000000000000000000000000000000000000000000000',
|
||||||
|
value: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
test({ type: 'int[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ type: 'int[]', expected: [], value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000000'});
|
'0000000000000000000000000000000000000000000000000000000000000000'});
|
||||||
test({ type: 'int[]', expected: [new bn(3)], value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ type: 'int[]', expected: [new bn(3)], value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
@ -49,6 +92,11 @@ describe('lib/solidity/coder', function () {
|
||||||
test({ type: 'ureal', expected: new bn(8.5), value: '0000000000000000000000000000000880000000000000000000000000000000'});
|
test({ type: 'ureal', expected: new bn(8.5), value: '0000000000000000000000000000000880000000000000000000000000000000'});
|
||||||
test({ type: 'address', expected: '0x407d73d8a49eeb85d32cf465507dd71d507100c1',
|
test({ type: 'address', expected: '0x407d73d8a49eeb85d32cf465507dd71d507100c1',
|
||||||
value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'});
|
value: '000000000000000000000000407d73d8a49eeb85d32cf465507dd71d507100c1'});
|
||||||
|
test({ type: 'string', expected: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.',
|
||||||
|
value: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'000000000000000000000000000000000000000000000000000000000000003e' +
|
||||||
|
'77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' +
|
||||||
|
'657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -62,26 +110,44 @@ describe('lib/solidity/coder', function () {
|
||||||
|
|
||||||
|
|
||||||
test({ types: ['int'], expected: [new bn(1)], values: '0000000000000000000000000000000000000000000000000000000000000001'});
|
test({ types: ['int'], expected: [new bn(1)], values: '0000000000000000000000000000000000000000000000000000000000000001'});
|
||||||
test({ types: ['bytes32', 'int'], expected: ['gavofyork', new bn(5)],
|
test({ types: ['bytes32', 'int'], expected: ['0x6761766f66796f726b0000000000000000000000000000000000000000000000', new bn(5)],
|
||||||
values: '6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
values: '6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000005'});
|
'0000000000000000000000000000000000000000000000000000000000000005'});
|
||||||
test({ types: ['int', 'bytes32'], expected: [new bn(5), 'gavofyork'],
|
test({ types: ['int', 'bytes32'], expected: [new bn(5), '0x6761766f66796f726b0000000000000000000000000000000000000000000000'],
|
||||||
values: '0000000000000000000000000000000000000000000000000000000000000005' +
|
values: '0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
test({ types: ['int', 'bytes', 'int', 'int', 'int', 'int[]'], expected: [new bn(1), 'gavofyork', new bn(2), new bn(3), new bn(4),
|
test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], expected: [new bn(1), 'gavofyork', new bn(2), new bn(3), new bn(4),
|
||||||
[new bn(5), new bn(6), new bn(7)]],
|
[new bn(5), new bn(6), new bn(7)]],
|
||||||
values: '0000000000000000000000000000000000000000000000000000000000000001' +
|
values: '0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
'00000000000000000000000000000000000000000000000000000000000000c0' +
|
'00000000000000000000000000000000000000000000000000000000000000c0' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000002' +
|
'0000000000000000000000000000000000000000000000000000000000000002' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000003' +
|
'0000000000000000000000000000000000000000000000000000000000000003' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000004' +
|
'0000000000000000000000000000000000000000000000000000000000000004' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000100' +
|
'0000000000000000000000000000000000000000000000000000000000000100' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
'6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000003' +
|
'0000000000000000000000000000000000000000000000000000000000000003' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000005' +
|
'0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000006' +
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000007'});
|
'0000000000000000000000000000000000000000000000000000000000000007'});
|
||||||
|
test({ types: ['int', 'bytes', 'int', 'bytes'], expected: [
|
||||||
|
new bn(5),
|
||||||
|
'0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
new bn(3),
|
||||||
|
'0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
],
|
||||||
|
values: '0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000080' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000003' +
|
||||||
|
'00000000000000000000000000000000000000000000000000000000000000e0' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -20,10 +20,37 @@ describe('lib/solidity/coder', function () {
|
||||||
test({ type: 'int256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'});
|
test({ type: 'int256', value: 1, expected: '0000000000000000000000000000000000000000000000000000000000000001'});
|
||||||
test({ type: 'int256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'});
|
test({ type: 'int256', value: 16, expected: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
test({ type: 'int256', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
test({ type: 'int256', value: -1, expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
||||||
test({ type: 'bytes32', value: 'gavofyork', expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
test({ type: 'bytes32', value: '0x6761766f66796f726b',
|
||||||
test({ type: 'bytes', value: 'gavofyork', expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes32', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
expected: '731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'bytes32', value: '0x02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29',
|
||||||
|
expected: '02838654a83c213dae3698391eabbd54a5b6e1fb3452bc7fa4ea0dd5c8ce7e29'});
|
||||||
|
test({ type: 'bytes', value: '0x6761766f66796f726b',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes', value: '0x731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'731a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'string', value: 'gavofyork', expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes', value: '0xc3a40000c3a4',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
|
'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes32', value: '0xc3a40000c3a4',
|
||||||
|
expected: 'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'string', value: '\xc3\xa4\x00\x00\xc3\xa4',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
|
'c3a40000c3a40000000000000000000000000000000000000000000000000000'});
|
||||||
|
test({ type: 'string', value: '\xc3',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
|
'c300000000000000000000000000000000000000000000000000000000000000'});
|
||||||
test({ type: 'int[]', value: [], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ type: 'int[]', value: [], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000000'});
|
'0000000000000000000000000000000000000000000000000000000000000000'});
|
||||||
test({ type: 'int[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ type: 'int[]', value: [3], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
@ -48,6 +75,25 @@ describe('lib/solidity/coder', function () {
|
||||||
test({ type: 'ureal', value: 1, expected: '0000000000000000000000000000000100000000000000000000000000000000'});
|
test({ type: 'ureal', value: 1, expected: '0000000000000000000000000000000100000000000000000000000000000000'});
|
||||||
test({ type: 'ureal', value: 2.125, expected: '0000000000000000000000000000000220000000000000000000000000000000'});
|
test({ type: 'ureal', value: 2.125, expected: '0000000000000000000000000000000220000000000000000000000000000000'});
|
||||||
test({ type: 'ureal', value: 8.5, expected: '0000000000000000000000000000000880000000000000000000000000000000'});
|
test({ type: 'ureal', value: 8.5, expected: '0000000000000000000000000000000880000000000000000000000000000000'});
|
||||||
|
test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'bytes', value: '0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000060' +
|
||||||
|
'131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
|
test({ type: 'string', value: 'welcome to ethereum. welcome to ethereum. welcome to ethereum.',
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
'000000000000000000000000000000000000000000000000000000000000003e' +
|
||||||
|
'77656c636f6d6520746f20657468657265756d2e2077656c636f6d6520746f20' +
|
||||||
|
'657468657265756d2e2077656c636f6d6520746f20657468657265756d2e0000'});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -67,8 +113,9 @@ describe('lib/solidity/coder', function () {
|
||||||
test({ types: ['int256'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'});
|
test({ types: ['int256'], values: [1], expected: '0000000000000000000000000000000000000000000000000000000000000001'});
|
||||||
test({ types: ['int256'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'});
|
test({ types: ['int256'], values: [16], expected: '0000000000000000000000000000000000000000000000000000000000000010'});
|
||||||
test({ types: ['int256'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
test({ types: ['int256'], values: [-1], expected: 'ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'});
|
||||||
test({ types: ['bytes32'], values: ['gavofyork'], expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
test({ types: ['bytes32'], values: ['0x6761766f66796f726b'],
|
||||||
test({ types: ['bytes'], values: ['gavofyork'], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
expected: '6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
|
test({ types: ['string'], values: ['gavofyork'], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
test({ types: ['int[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
test({ types: ['int[]'], values: [[3]], expected: '0000000000000000000000000000000000000000000000000000000000000020' +
|
||||||
|
@ -91,18 +138,18 @@ describe('lib/solidity/coder', function () {
|
||||||
'0000000000000000000000000000000000000000000000000000000000000002' +
|
'0000000000000000000000000000000000000000000000000000000000000002' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000003' +
|
'0000000000000000000000000000000000000000000000000000000000000003' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000004'});
|
'0000000000000000000000000000000000000000000000000000000000000004'});
|
||||||
test({ types: ['bytes32', 'int'], values: ['gavofyork', 5],
|
test({ types: ['bytes32', 'int'], values: ['0x6761766f66796f726b', 5],
|
||||||
expected: '6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
expected: '6761766f66796f726b0000000000000000000000000000000000000000000000' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000005'});
|
'0000000000000000000000000000000000000000000000000000000000000005'});
|
||||||
test({ types: ['int', 'bytes32'], values: [5, 'gavofyork'],
|
test({ types: ['int', 'bytes32'], values: [5, '0x6761766f66796f726b'],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000005' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
test({ types: ['bytes', 'int'], values: ['gavofyork', 5],
|
test({ types: ['string', 'int'], values: ['gavofyork', 5],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000040' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000005' +
|
'0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
test({ types: ['bytes', 'bool', 'int[]'], values: ['gavofyork', true, [1, 2, 3]],
|
test({ types: ['string', 'bool', 'int[]'], values: ['gavofyork', true, [1, 2, 3]],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000060' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000060' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000001' +
|
'0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
'00000000000000000000000000000000000000000000000000000000000000a0' +
|
'00000000000000000000000000000000000000000000000000000000000000a0' +
|
||||||
|
@ -112,7 +159,7 @@ describe('lib/solidity/coder', function () {
|
||||||
'0000000000000000000000000000000000000000000000000000000000000001' +
|
'0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000002' +
|
'0000000000000000000000000000000000000000000000000000000000000002' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000003'});
|
'0000000000000000000000000000000000000000000000000000000000000003'});
|
||||||
test({ types: ['bytes', 'int[]'], values: ['gavofyork', [1, 2, 3]],
|
test({ types: ['string', 'int[]'], values: ['gavofyork', [1, 2, 3]],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000040' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000080' +
|
'0000000000000000000000000000000000000000000000000000000000000080' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
|
@ -121,12 +168,12 @@ describe('lib/solidity/coder', function () {
|
||||||
'0000000000000000000000000000000000000000000000000000000000000001' +
|
'0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000002' +
|
'0000000000000000000000000000000000000000000000000000000000000002' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000003'});
|
'0000000000000000000000000000000000000000000000000000000000000003'});
|
||||||
test({ types: ['int', 'bytes'], values: [5, 'gavofyork'],
|
test({ types: ['int', 'string'], values: [5, 'gavofyork'],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000005' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000040' +
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000009' +
|
'0000000000000000000000000000000000000000000000000000000000000009' +
|
||||||
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
'6761766f66796f726b0000000000000000000000000000000000000000000000'});
|
||||||
test({ types: ['int', 'bytes', 'int', 'int', 'int', 'int[]'], values: [1, 'gavofyork', 2, 3, 4, [5, 6, 7]],
|
test({ types: ['int', 'string', 'int', 'int', 'int', 'int[]'], values: [1, 'gavofyork', 2, 3, 4, [5, 6, 7]],
|
||||||
expected: '0000000000000000000000000000000000000000000000000000000000000001' +
|
expected: '0000000000000000000000000000000000000000000000000000000000000001' +
|
||||||
'00000000000000000000000000000000000000000000000000000000000000c0' +
|
'00000000000000000000000000000000000000000000000000000000000000c0' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000002' +
|
'0000000000000000000000000000000000000000000000000000000000000002' +
|
||||||
|
@ -139,6 +186,24 @@ describe('lib/solidity/coder', function () {
|
||||||
'0000000000000000000000000000000000000000000000000000000000000005' +
|
'0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000006' +
|
'0000000000000000000000000000000000000000000000000000000000000006' +
|
||||||
'0000000000000000000000000000000000000000000000000000000000000007'});
|
'0000000000000000000000000000000000000000000000000000000000000007'});
|
||||||
|
test({ types: ['int', 'bytes', 'int', 'bytes'], values: [
|
||||||
|
5,
|
||||||
|
'0x131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
3,
|
||||||
|
'0x331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b',
|
||||||
|
],
|
||||||
|
expected: '0000000000000000000000000000000000000000000000000000000000000005' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000080' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000003' +
|
||||||
|
'00000000000000000000000000000000000000000000000000000000000000e0' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'131a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'231a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'0000000000000000000000000000000000000000000000000000000000000040' +
|
||||||
|
'331a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b' +
|
||||||
|
'431a3afc00d1b1e3461b955e53fc866dcf303b3eb9f4c16f89e388930f48134b'});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -14,6 +14,7 @@ var tests = [
|
||||||
{ value: '-0x1', expected: '-0x1'},
|
{ value: '-0x1', expected: '-0x1'},
|
||||||
{ value: '-15', expected: '-0xf'},
|
{ value: '-15', expected: '-0xf'},
|
||||||
{ value: '-0xf', expected: '-0xf'},
|
{ value: '-0xf', expected: '-0xf'},
|
||||||
|
{ value: '0x657468657265756d', expected: '0x657468657265756d'},
|
||||||
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'},
|
{ value: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'},
|
||||||
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'},
|
{ value: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff', expected: '-0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff'},
|
||||||
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'},
|
{ value: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd', expected: '-0xfffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd'},
|
||||||
|
|
|
@ -219,15 +219,27 @@ describe('web3.eth.contract', function() {
|
||||||
]
|
]
|
||||||
}];
|
}];
|
||||||
|
|
||||||
|
var steps = 1;
|
||||||
|
|
||||||
provider.injectResult(address);
|
provider.injectResult(address);
|
||||||
provider.injectValidation(function (payload) {
|
provider.injectValidation(function (payload) {
|
||||||
assert.equal(payload.jsonrpc, '2.0');
|
if(steps === 1) {
|
||||||
assert.equal(payload.method, 'eth_sendTransaction');
|
assert.equal(payload.jsonrpc, '2.0');
|
||||||
assert.equal(payload.params[0].data, code + '0000000000000000000000000000000000000000000000000000000000000002');
|
assert.equal(payload.method, 'eth_sendTransaction');
|
||||||
done();
|
assert.equal(payload.params[0].data, code + '0000000000000000000000000000000000000000000000000000000000000002');
|
||||||
|
steps++;
|
||||||
|
|
||||||
|
} else if(steps === 2) {
|
||||||
|
assert.equal(payload.jsonrpc, '2.0');
|
||||||
|
assert.equal(payload.method, 'eth_newBlockFilter');
|
||||||
|
|
||||||
|
done();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
var myCon = contract(description).new(2, {data: code});
|
contract(description).new(2, {data: code}, function(e, myCon){
|
||||||
|
|
||||||
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,6 @@ var testMethod = require('./helpers/test.method.js');
|
||||||
var method = 'getTransaction';
|
var method = 'getTransaction';
|
||||||
|
|
||||||
var txResult = {
|
var txResult = {
|
||||||
"status": "mined",
|
|
||||||
"hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
"hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
||||||
"nonce":"0x5",
|
"nonce":"0x5",
|
||||||
"blockHash": "0x6fd9e2a26ab",
|
"blockHash": "0x6fd9e2a26ab",
|
||||||
|
@ -20,7 +19,6 @@ var txResult = {
|
||||||
"input":"0x603880600c6000396000f30060"
|
"input":"0x603880600c6000396000f30060"
|
||||||
};
|
};
|
||||||
var formattedTxResult = {
|
var formattedTxResult = {
|
||||||
"status": "mined",
|
|
||||||
"hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
"hash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
||||||
"nonce":5,
|
"nonce":5,
|
||||||
"blockHash": "0x6fd9e2a26ab",
|
"blockHash": "0x6fd9e2a26ab",
|
||||||
|
|
|
@ -0,0 +1,70 @@
|
||||||
|
var chai = require('chai');
|
||||||
|
var web3 = require('../index');
|
||||||
|
var BigNumber = require('bignumber.js');
|
||||||
|
var testMethod = require('./helpers/test.method.js');
|
||||||
|
|
||||||
|
var method = 'getTransactionReceipt';
|
||||||
|
|
||||||
|
var txResult = {
|
||||||
|
"blockHash": "0x6fd9e2a26ab",
|
||||||
|
"blockNumber": "0x15df",
|
||||||
|
"transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
||||||
|
"transactionIndex": "0x1",
|
||||||
|
"contractAddress":"0x407d73d8a49eeb85d32cf465507dd71d507100c1",
|
||||||
|
"cumulativeGasUsed":"0x7f110",
|
||||||
|
"gasUsed": "0x7f110",
|
||||||
|
"logs": [{
|
||||||
|
transactionIndex: '0x3e8',
|
||||||
|
logIndex: '0x3e8',
|
||||||
|
blockNumber: '0x3e8',
|
||||||
|
transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
|
||||||
|
blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
|
||||||
|
data: '0x7b2274657374223a2274657374227',
|
||||||
|
topics: ['0x68656c6c6f','0x6d79746f70696373']
|
||||||
|
},{
|
||||||
|
transactionIndex: null,
|
||||||
|
logIndex: null,
|
||||||
|
blockNumber: null,
|
||||||
|
transactionHash: null,
|
||||||
|
blockHash: null,
|
||||||
|
data: '0x7b2274657374223a2274657374227',
|
||||||
|
topics: ['0x68656c6c6f','0x6d79746f70696373']
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
var formattedTxResult = {
|
||||||
|
"blockHash": "0x6fd9e2a26ab",
|
||||||
|
"blockNumber": 5599,
|
||||||
|
"transactionHash":"0xc6ef2fc5426d6ad6fd9e2a26abeab0aa2411b7ab17f30a99d3cb96aed1d1055b",
|
||||||
|
"transactionIndex": 1,
|
||||||
|
"contractAddress":"0x407d73d8a49eeb85d32cf465507dd71d507100c1",
|
||||||
|
"cumulativeGasUsed": 520464,
|
||||||
|
"gasUsed": 520464,
|
||||||
|
"logs": [{
|
||||||
|
transactionIndex: 1000,
|
||||||
|
logIndex: 1000,
|
||||||
|
blockNumber: 1000,
|
||||||
|
transactionHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
|
||||||
|
blockHash: '0xd6960376d6c6dea93647383ffb245cfced97ccc5c7525397a543a72fdaea5265',
|
||||||
|
data: '0x7b2274657374223a2274657374227',
|
||||||
|
topics: ['0x68656c6c6f','0x6d79746f70696373']
|
||||||
|
},{
|
||||||
|
transactionIndex: null,
|
||||||
|
logIndex: null,
|
||||||
|
blockNumber: null,
|
||||||
|
transactionHash: null,
|
||||||
|
blockHash: null,
|
||||||
|
data: '0x7b2274657374223a2274657374227',
|
||||||
|
topics: ['0x68656c6c6f','0x6d79746f70696373']
|
||||||
|
}]
|
||||||
|
};
|
||||||
|
|
||||||
|
var tests = [{
|
||||||
|
args: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855'],
|
||||||
|
formattedArgs: ['0x2dbab4c0612bf9caf4c195085547dc0612bf9caf4c1950855'],
|
||||||
|
result: txResult,
|
||||||
|
formattedResult: formattedTxResult,
|
||||||
|
call: 'eth_'+ method
|
||||||
|
}];
|
||||||
|
|
||||||
|
testMethod.runTests('eth', method, tests);
|
||||||
|
|
Loading…
Reference in New Issue