Merge branch 'async-contract-calls' of https://github.com/niran/web3.js into contract_overhaul

This commit is contained in:
Marek Kotewicz 2015-05-11 18:17:22 +02:00
commit 6afb1f9a56
1 changed files with 39 additions and 13 deletions

View File

@ -14,7 +14,7 @@
You should have received a copy of the GNU Lesser General Public License 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/>. along with ethereum.js. If not, see <http://www.gnu.org/licenses/>.
*/ */
/** /**
* @file function.js * @file function.js
* @author Marek Kotewicz <marek@ethdev.com> * @author Marek Kotewicz <marek@ethdev.com>
* @date 2015 * @date 2015
@ -67,21 +67,47 @@ SolidityFunction.prototype.signature = function () {
return web3.sha3(web3.fromAscii(this._name)).slice(2, 10); return web3.sha3(web3.fromAscii(this._name)).slice(2, 10);
}; };
/**
* Should be used to call function SolidityFunction.prototype.unpackOutput = function (output) {
* if (output == null) {
* @method call return;
* @param {Object} options }
* @return {String} output bytes
*/
SolidityFunction.prototype.call = function () {
var payload = this.toPayload.apply(this, Array.prototype.slice.call(arguments));
var output = web3.eth.call(payload);
output = output.length >= 2 ? output.slice(2) : output; output = output.length >= 2 ? output.slice(2) : output;
var result = coder.decodeParams(this._outputTypes, output); var result = coder.decodeParams(this._outputTypes, output);
return result.length === 1 ? result[0] : result; return result.length === 1 ? result[0] : result;
}; };
/**
* Calls a contract function.
*
* @method call
* @param {...Object} Contract function arguments
* @param {function} If the last argument is a function, the contract function
* call will be asynchronous, and the callback will be passed the
* error and result.
* @return {String} output bytes
*/
SolidityFunction.prototype.call = function () {
var this_ = this;
var args = Array.prototype.slice.call(arguments);
var callback;
if (typeof(args[args.length - 1]) === 'function') {
callback = args.pop();
}
var payload = this.toPayload.apply(this, args);
if (typeof(callback) === 'undefined') {
var output = web3.eth.call(payload, callback);
return this.unpackOutput(output);
} else {
web3.eth.call(payload, function (error, output) {
callback(error, this_.unpackOutput(output));
});
}
};
/** /**
* Should be used to sendTransaction to solidity function * Should be used to sendTransaction to solidity function
* *
@ -105,7 +131,7 @@ SolidityFunction.prototype.displayName = function () {
/** /**
* Should be used to get function type name * Should be used to get function type name
* *
* @method typeName * @method typeName
* @return {String} type name of the function * @return {String} type name of the function
*/ */
@ -120,7 +146,7 @@ SolidityFunction.prototype.typeName = function () {
*/ */
SolidityFunction.prototype.execute = function () { SolidityFunction.prototype.execute = function () {
var transaction = !this._constant; var transaction = !this._constant;
// send transaction // send transaction
if (transaction) { if (transaction) {
return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments)); return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));