diff --git a/lib/web3/function.js b/lib/web3/function.js index 2bbb684..41ec19e 100644 --- a/lib/web3/function.js +++ b/lib/web3/function.js @@ -14,7 +14,7 @@ You should have received a copy of the GNU Lesser General Public License along with ethereum.js. If not, see . */ -/** +/** * @file function.js * @author Marek Kotewicz * @date 2015 @@ -67,21 +67,47 @@ SolidityFunction.prototype.signature = function () { return web3.sha3(web3.fromAscii(this._name)).slice(2, 10); }; -/** - * Should be used to call function - * - * @method call - * @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); + +SolidityFunction.prototype.unpackOutput = function (output) { + if (output == null) { + return; + } + output = output.length >= 2 ? output.slice(2) : output; var result = coder.decodeParams(this._outputTypes, output); 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 * @@ -105,7 +131,7 @@ SolidityFunction.prototype.displayName = function () { /** * Should be used to get function type name - * + * * @method typeName * @return {String} type name of the function */ @@ -120,7 +146,7 @@ SolidityFunction.prototype.typeName = function () { */ SolidityFunction.prototype.execute = function () { var transaction = !this._constant; - + // send transaction if (transaction) { return this.sendTransaction.apply(this, Array.prototype.slice.call(arguments));