Merge pull request #1519 from obscuren/develop

web3: updated 0.9.1
This commit is contained in:
Jeffrey Wilcke 2015-07-25 04:06:43 -07:00
commit 6cffa743ee
1 changed files with 346 additions and 82 deletions

View File

@ -373,10 +373,10 @@ var formatInputBytes = function (value) {
* @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);
var result = utils.toHex(value).substr(2);
var length = result.length / 2;
var l = Math.floor((result.length + 63) / 64);
var result = utils.padRight(result, l * 64);
return new SolidityParam(formatInputInt(length).value + result, 32);
};
@ -389,9 +389,10 @@ var formatInputDynamicBytes = function (value) {
*/
var formatInputString = function (value) {
var result = utils.fromAscii(value).substr(2);
var length = result.length / 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(length).value + result, 32);
};
/**
@ -996,6 +997,7 @@ var padRight = function (string, chars, sign) {
/**
* Should be called to get sting from it's hex representation
* TODO: it should be called toUTF8
*
* @method toAscii
* @param {String} string in hex
@ -1013,7 +1015,7 @@ var toAscii = function(hex) {
str += String.fromCharCode(code);
}
return str;
return decodeURIComponent(escape(str));
};
/**
@ -1024,6 +1026,7 @@ var toAscii = function(hex) {
* @returns {String} hex representation of input string
*/
var toHexNative = function(str) {
str = unescape(encodeURIComponent(str));
var hex = "";
for(var i = 0; i < str.length; i++) {
var n = str.charCodeAt(i).toString(16);
@ -1417,7 +1420,7 @@ module.exports = {
},{"bignumber.js":"bignumber.js"}],8:[function(require,module,exports){
module.exports={
"version": "0.8.1"
"version": "0.9.1"
}
},{}],9:[function(require,module,exports){
@ -1524,6 +1527,9 @@ web3.setProvider = function (provider) {
this.currentProvider = provider;
RequestManager.getInstance().setProvider(provider);
};
web3.isConnected = function(){
return (this.currentProvider && this.currentProvider.isConnected());
};
web3.reset = function () {
RequestManager.getInstance().reset();
c.defaultBlock = 'latest';
@ -1594,7 +1600,7 @@ setupMethods(web3.shh, shh.methods);
module.exports = web3;
},{"./utils/config":5,"./utils/sha3":6,"./utils/utils":7,"./version.json":8,"./web3/batch":11,"./web3/db":13,"./web3/eth":15,"./web3/filter":17,"./web3/formatters":18,"./web3/method":23,"./web3/net":25,"./web3/property":26,"./web3/requestmanager":28,"./web3/shh":29,"./web3/watches":31}],10:[function(require,module,exports){
},{"./utils/config":5,"./utils/sha3":6,"./utils/utils":7,"./version.json":8,"./web3/batch":11,"./web3/db":13,"./web3/eth":15,"./web3/filter":17,"./web3/formatters":18,"./web3/method":24,"./web3/net":26,"./web3/property":27,"./web3/requestmanager":28,"./web3/shh":29,"./web3/watches":31}],10:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -1639,7 +1645,6 @@ AllSolidityEvents.prototype.encode = function (options) {
result[f] = formatters.inputBlockNumberFormatter(options[f]);
});
result.topics = [null, null, null, null, null]; // match all topics
result.address = this._address;
return result;
@ -1701,6 +1706,8 @@ module.exports = AllSolidityEvents;
*/
var RequestManager = require('./requestmanager');
var Jsonrpc = require('./jsonrpc');
var errors = require('./errors');
var Batch = function () {
this.requests = [];
@ -1727,11 +1734,14 @@ Batch.prototype.execute = function () {
results = results || [];
requests.map(function (request, index) {
return results[index] || {};
}).map(function (result, index) {
return requests[index].format ? requests[index].format(result.result) : result.result;
}).forEach(function (result, index) {
if (requests[index].callback) {
requests[index].callback(err, result);
if (!Jsonrpc.getInstance().isValidResponse(result)) {
return requests[index].callback(errors.InvalidResponse(result));
}
requests[index].callback(null, (requests[index].format ? requests[index].format(result.result) : result.result));
}
});
});
@ -1740,7 +1750,7 @@ Batch.prototype.execute = function () {
module.exports = Batch;
},{"./requestmanager":28}],12:[function(require,module,exports){
},{"./errors":14,"./jsonrpc":23,"./requestmanager":28}],12:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -1848,28 +1858,42 @@ var contract = function (abi) {
* @returns {Undefined}
*/
var checkForContractAddress = function(contract, abi, callback){
var count = 0;
var count = 0,
callbackFired = false;
// wait for receipt
var filter = web3.eth.filter('latest', function(e){
if(!e) {
if(!e && !callbackFired) {
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();
callbackFired = true;
if(callback)
callback(new Error('Contract transaction couldn\'t be found after 50 blocks'));
else
throw new Error('Contract transaction couldn\'t be found after 50 blocks');
} else {
web3.eth.getTransactionReceipt(contract.transactionHash, function(e, receipt){
if(receipt) {
if(receipt && !callbackFired) {
web3.eth.getCode(receipt.contractAddress, function(e, code){
/*jshint maxcomplexity: 5 */
if(callbackFired)
return;
filter.stopWatching();
callbackFired = true;
if(code.length > 2) {
// console.log('Contract code deployed!');
@ -1880,14 +1904,16 @@ var checkForContractAddress = function(contract, abi, callback){
addFunctionsToContract(contract, abi);
addEventsToContract(contract, abi);
// call callback for the second time
if(callback)
callback(null, contract);
} else if(callback) {
callback(new Error('The contract code couldn\'t be stored'));
} else {
if(callback)
callback(new Error('The contract code couldn\'t be stored, please check your gas amount.'));
else
throw new Error('The contract code couldn\'t be stored, please check your gas amount.');
}
filter.stopWatching();
});
}
});
@ -1949,6 +1975,10 @@ ContractFactory.prototype.new = function () {
} else {
// add the transaction hash
contract.transactionHash = hash;
// call callback for the first time
callback(null, contract);
checkForContractAddress(contract, _this.abi, callback);
}
});
@ -2057,7 +2087,7 @@ module.exports = {
methods: methods
};
},{"./method":23}],14:[function(require,module,exports){
},{"./method":24}],14:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -2091,7 +2121,7 @@ module.exports = {
return new Error('Providor not set or invalid');
},
InvalidResponse: function (result){
var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response';
var message = !!result && !!result.error && !!result.error.message ? result.error.message : 'Invalid JSON RPC response: '+ result;
return new Error(message);
}
};
@ -2271,7 +2301,7 @@ var sendRawTransaction = new Method({
name: 'sendRawTransaction',
call: 'eth_sendRawTransaction',
params: 1,
inputFormatter: []
inputFormatter: [null]
});
var sendTransaction = new Method({
@ -2390,7 +2420,7 @@ module.exports = {
};
},{"../utils/utils":7,"./formatters":18,"./method":23,"./property":26}],16:[function(require,module,exports){
},{"../utils/utils":7,"./formatters":18,"./method":24,"./property":27}],16:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -2692,9 +2722,11 @@ var getLogsAtStart = function(self, callback){
callback(err);
}
messages.forEach(function (message) {
callback(null, message);
});
if(utils.isArray(messages)) {
messages.forEach(function (message) {
callback(null, message);
});
}
});
}
};
@ -3314,12 +3346,11 @@ module.exports = SolidityFunction;
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* Fabian Vogelsteller <fabian@ethdev.com>
* @date 2014
* @date 2015
*/
"use strict";
// resolves the problem for electron/atom shell environments, which use node integration, but have no process variable available
var XMLHttpRequest = (typeof window !== 'undefined' && window.XMLHttpRequest) ? window.XMLHttpRequest : require('xmlhttprequest').XMLHttpRequest; // jshint ignore:line
var errors = require('./errors');
@ -3327,6 +3358,25 @@ var HttpProvider = function (host) {
this.host = host || 'http://localhost:8545';
};
HttpProvider.prototype.isConnected = function() {
var request = new XMLHttpRequest();
request.open('POST', this.host, false);
request.setRequestHeader('Content-type','application/json');
try {
request.send(JSON.stringify({
id: 9999999999,
jsonrpc: '2.0',
method: 'net_listening',
params: []
}));
return true;
} catch(e) {
return false;
}
};
HttpProvider.prototype.send = function (payload) {
var request = new XMLHttpRequest();
@ -3351,7 +3401,7 @@ HttpProvider.prototype.send = function (payload) {
try {
result = JSON.parse(result);
} catch(e) {
throw errors.InvalidResponse(result);
throw errors.InvalidResponse(request.responseText);
}
return result;
@ -3367,7 +3417,7 @@ HttpProvider.prototype.sendAsync = function (payload, callback) {
try {
result = JSON.parse(result);
} catch(e) {
error = errors.InvalidResponse(result);
error = errors.InvalidResponse(request.responseText);
}
callback(error, result);
@ -3514,6 +3564,219 @@ module.exports = ICAP;
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file ipcprovider.js
* @authors:
* Fabian Vogelsteller <fabian@ethdev.com>
* @date 2015
*/
"use strict";
var utils = require('../utils/utils');
var errors = require('./errors');
var errorTimeout = '{"jsonrpc": "2.0", "error": {"code": -32603, "message": "IPC Request timed out for method \'__method__\'"}, "id": "__id__"}';
var IpcProvider = function (path, net) {
var _this = this;
this.responseCallbacks = {};
this.path = path;
net = net || require('net');
this.connection = net.connect({path: this.path});
this.connection.on('error', function(e){
console.error('IPC Connection Error', e);
_this._timeout();
});
this.connection.on('end', function(){
_this._timeout();
});
// LISTEN FOR CONNECTION RESPONSES
this.connection.on('data', function(data) {
/*jshint maxcomplexity: 6 */
_this._parseResponse(data.toString()).forEach(function(result){
var id = null;
// get the id which matches the returned id
if(utils.isArray(result)) {
result.forEach(function(load){
if(_this.responseCallbacks[load.id])
id = load.id;
});
} else {
id = result.id;
}
// fire the callback
if(_this.responseCallbacks[id]) {
_this.responseCallbacks[id](null, result);
delete _this.responseCallbacks[id];
}
});
});
};
/**
Will parse the response and make an array out of it.
@method _parseResponse
@param {String} data
*/
IpcProvider.prototype._parseResponse = function(data) {
var _this = this,
returnValues = [];
// DE-CHUNKER
var dechunkedData = data
.replace(/\}\{/g,'}|--|{') // }{
.replace(/\}\]\[\{/g,'}]|--|[{') // }][{
.replace(/\}\[\{/g,'}|--|[{') // }[{
.replace(/\}\]\{/g,'}]|--|{') // }]{
.split('|--|');
dechunkedData.forEach(function(data){
// prepend the last chunk
if(_this.lastChunk)
data = _this.lastChunk + data;
var result = null;
try {
result = JSON.parse(data);
} catch(e) {
_this.lastChunk = data;
// start timeout to cancel all requests
clearTimeout(_this.lastChunkTimeout);
_this.lastChunkTimeout = setTimeout(function(){
_this.timeout();
throw errors.InvalidResponse(data);
}, 1000 * 15);
return;
}
// cancel timeout and set chunk to null
clearTimeout(_this.lastChunkTimeout);
_this.lastChunk = null;
if(result)
returnValues.push(result);
});
return returnValues;
};
/**
Get the adds a callback to the responseCallbacks object,
which will be called if a response matching the response Id will arrive.
@method _addResponseCallback
*/
IpcProvider.prototype._addResponseCallback = function(payload, callback) {
var id = payload.id || payload[0].id;
var method = payload.method || payload[0].method;
this.responseCallbacks[id] = callback;
this.responseCallbacks[id].method = method;
};
/**
Timeout all requests when the end/error event is fired
@method _timeout
*/
IpcProvider.prototype._timeout = function() {
for(var key in this.responseCallbacks) {
if(this.responseCallbacks.hasOwnProperty(key)){
this.responseCallbacks[key](errorTimeout.replace('__id__', key).replace('__method__', this.responseCallbacks[key].method));
delete this.responseCallbacks[key];
}
}
};
/**
Check if the current connection is still valid.
@method isConnected
*/
IpcProvider.prototype.isConnected = function() {
var _this = this;
// try reconnect, when connection is gone
if(!_this.connection.writable)
_this.connection.connect({path: _this.path});
return !!this.connection.writable;
};
IpcProvider.prototype.send = function (payload) {
if(this.connection.writeSync) {
var result;
// try reconnect, when connection is gone
if(!this.connection.writable)
this.connection.connect({path: this.path});
var data = this.connection.writeSync(JSON.stringify(payload));
try {
result = JSON.parse(data);
} catch(e) {
throw errors.InvalidResponse(data);
}
return result;
} else {
throw new Error('You tried to send "'+ payload.method +'" synchronously. Synchronous requests are not supported by the IPC provider.');
}
};
IpcProvider.prototype.sendAsync = function (payload, callback) {
// try reconnect, when connection is gone
if(!this.connection.writable)
this.connection.connect({path: this.path});
this.connection.write(JSON.stringify(payload));
this._addResponseCallback(payload, callback);
};
module.exports = IpcProvider;
},{"../utils/utils":7,"./errors":14,"net":32}],23:[function(require,module,exports){
/*
This file is part of ethereum.js.
ethereum.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ethereum.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file jsonrpc.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
@ -3590,7 +3853,7 @@ Jsonrpc.prototype.toBatchPayload = function (messages) {
module.exports = Jsonrpc;
},{}],23:[function(require,module,exports){
},{}],24:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -3687,7 +3950,7 @@ Method.prototype.formatInput = function (args) {
* @return {Object}
*/
Method.prototype.formatOutput = function (result) {
return this.outputFormatter && result !== null ? this.outputFormatter(result) : result;
return this.outputFormatter && result ? this.outputFormatter(result) : result;
};
/**
@ -3764,7 +4027,7 @@ Method.prototype.send = function () {
module.exports = Method;
},{"../utils/utils":7,"./errors":14,"./requestmanager":28}],24:[function(require,module,exports){
},{"../utils/utils":7,"./errors":14,"./requestmanager":28}],25:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -3812,7 +4075,7 @@ var abi = [
module.exports = contract(abi).at(address);
},{"./contract":12}],25:[function(require,module,exports){
},{"./contract":12}],26:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -3862,7 +4125,7 @@ module.exports = {
};
},{"../utils/utils":7,"./property":26}],26:[function(require,module,exports){
},{"../utils/utils":7,"./property":27}],27:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -3887,6 +4150,7 @@ module.exports = {
*/
var RequestManager = require('./requestmanager');
var utils = require('../utils/utils');
var Property = function (options) {
this.name = options.name;
@ -3918,6 +4182,19 @@ Property.prototype.formatOutput = function (result) {
return this.outputFormatter && result !== null ? this.outputFormatter(result) : result;
};
/**
* Should be used to extract callback from array of arguments. Modifies input param
*
* @method extractCallback
* @param {Array} arguments
* @return {Function|Null} callback, if exists
*/
Property.prototype.extractCallback = function (args) {
if (utils.isFunction(args[args.length - 1])) {
return args.pop(); // modify the args array!
}
};
/**
* Should attach function to method
*
@ -3944,7 +4221,10 @@ Property.prototype.attachToObject = function (obj) {
return prefix + name.charAt(0).toUpperCase() + name.slice(1);
};
obj[toAsyncName('get', name)] = this.getAsync.bind(this);
var func = this.getAsync.bind(this);
func.request = this.request.bind(this);
obj[toAsyncName('get', name)] = func;
};
/**
@ -3977,45 +4257,27 @@ Property.prototype.getAsync = function (callback) {
});
};
/**
* Should be called to create pure JSONRPC request which can be used in batch request
*
* @method request
* @param {...} params
* @return {Object} jsonrpc request
*/
Property.prototype.request = function () {
var payload = {
method: this.getter,
params: [],
callback: this.extractCallback(Array.prototype.slice.call(arguments))
};
payload.format = this.formatOutput.bind(this);
return payload;
};
module.exports = Property;
},{"./requestmanager":28}],27:[function(require,module,exports){
/*
This file is part of ethereum.js.
ethereum.js is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
ethereum.js is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/
/** @file qtsync.js
* @authors:
* Marek Kotewicz <marek@ethdev.com>
* Marian Oancea <marian@ethdev.com>
* @date 2014
*/
var QtSyncProvider = function () {
};
QtSyncProvider.prototype.send = function (payload) {
var result = navigator.qt.callMethod(JSON.stringify(payload));
return JSON.parse(result);
};
module.exports = QtSyncProvider;
},{}],28:[function(require,module,exports){
},{"../utils/utils":7,"./requestmanager":28}],28:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -4280,7 +4542,7 @@ RequestManager.prototype.poll = function () {
module.exports = RequestManager;
},{"../utils/config":5,"../utils/utils":7,"./errors":14,"./jsonrpc":22}],29:[function(require,module,exports){
},{"../utils/config":5,"../utils/utils":7,"./errors":14,"./jsonrpc":23}],29:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -4350,7 +4612,7 @@ module.exports = {
};
},{"./formatters":18,"./method":23}],30:[function(require,module,exports){
},{"./formatters":18,"./method":24}],30:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -4446,7 +4708,7 @@ var deposit = function (from, address, value, client, callback) {
module.exports = transfer;
},{"../web3":9,"./contract":12,"./icap":21,"./namereg":24}],31:[function(require,module,exports){
},{"../web3":9,"./contract":12,"./icap":21,"./namereg":25}],31:[function(require,module,exports){
/*
This file is part of ethereum.js.
@ -4562,7 +4824,7 @@ module.exports = {
};
},{"./method":23}],32:[function(require,module,exports){
},{"./method":24}],32:[function(require,module,exports){
},{}],33:[function(require,module,exports){
;(function (root, factory) {
@ -5944,8 +6206,10 @@ module.exports = BigNumber; // jshint ignore:line
},{}],"web3":[function(require,module,exports){
var web3 = require('./lib/web3');
web3.providers.HttpProvider = require('./lib/web3/httpprovider');
web3.providers.QtSyncProvider = require('./lib/web3/qtsync');
web3.providers.IpcProvider = require('./lib/web3/ipcprovider');
web3.eth.contract = require('./lib/web3/contract');
web3.eth.namereg = require('./lib/web3/namereg');
web3.eth.sendIBANTransaction = require('./lib/web3/transfer');
@ -5958,6 +6222,6 @@ if (typeof window !== 'undefined' && typeof window.web3 === 'undefined') {
module.exports = web3;
},{"./lib/web3":9,"./lib/web3/contract":12,"./lib/web3/httpprovider":20,"./lib/web3/namereg":24,"./lib/web3/qtsync":27,"./lib/web3/transfer":30}]},{},["web3"])
},{"./lib/web3":9,"./lib/web3/contract":12,"./lib/web3/httpprovider":20,"./lib/web3/ipcprovider":22,"./lib/web3/namereg":25,"./lib/web3/transfer":30}]},{},["web3"])
//# sourceMappingURL=web3-light.js.map
`