|
|
|
@ -447,18 +447,20 @@ var abi = require('./abi'); |
|
|
|
|
* |
|
|
|
|
* var myContract = web3.eth.contract('0x0123123121', abi); // creation of contract object
|
|
|
|
|
* |
|
|
|
|
* myContract.myMethod('this is test string param for call').call(); // myMethod call
|
|
|
|
|
* myContract.myMethod('this is test string param for transact').transact() // myMethod transact
|
|
|
|
|
* myContract.myMethod('this is test string param for call'); // myMethod call (implicit, default)
|
|
|
|
|
* myContract.myMethod('this is test string param for call').call(); // myMethod call (explicit)
|
|
|
|
|
* myContract.transact().myMethod('this is test string param for transact'); // myMethod transact
|
|
|
|
|
* |
|
|
|
|
* @param address - address of the contract, which should be called |
|
|
|
|
* @param desc - abi json description of the contract, which is being created |
|
|
|
|
* @returns contract object |
|
|
|
|
*/ |
|
|
|
|
var contract = function (address, desc) { |
|
|
|
|
|
|
|
|
|
var contract = function contract (address, desc) { |
|
|
|
|
var inputParser = abi.inputParser(desc); |
|
|
|
|
var outputParser = abi.outputParser(desc); |
|
|
|
|
|
|
|
|
|
var contract = {}; |
|
|
|
|
var result = {}; |
|
|
|
|
|
|
|
|
|
desc.forEach(function (method) { |
|
|
|
|
|
|
|
|
@ -467,44 +469,53 @@ var contract = function (address, desc) { |
|
|
|
|
|
|
|
|
|
var impl = function () { |
|
|
|
|
var params = Array.prototype.slice.call(arguments); |
|
|
|
|
var parsed = inputParser[displayName][typeName].apply(null, params); |
|
|
|
|
var signature = abi.methodSignature(method.name); |
|
|
|
|
var parsed = inputParser[displayName][typeName].apply(null, params); |
|
|
|
|
|
|
|
|
|
return { |
|
|
|
|
call: function (extra) { |
|
|
|
|
extra = extra || {}; |
|
|
|
|
extra.to = address; |
|
|
|
|
extra.data = signature + parsed; |
|
|
|
|
|
|
|
|
|
var result = web3.eth.call(extra); |
|
|
|
|
return outputParser[displayName][typeName](result); |
|
|
|
|
}, |
|
|
|
|
transact: function (extra) { |
|
|
|
|
extra = extra || {}; |
|
|
|
|
extra.to = address; |
|
|
|
|
extra.data = signature + parsed; |
|
|
|
|
|
|
|
|
|
/// it's used by natspec.js
|
|
|
|
|
/// TODO: figure a better way to solve this
|
|
|
|
|
web3._currentContractAbi = desc; |
|
|
|
|
web3._currentContractAddress = address; |
|
|
|
|
|
|
|
|
|
var result = web3.eth.transact(extra); |
|
|
|
|
return outputParser[displayName][typeName](result); |
|
|
|
|
} |
|
|
|
|
}; |
|
|
|
|
var options = contract._options || {}; |
|
|
|
|
options.to = address; |
|
|
|
|
options.data = signature + parsed; |
|
|
|
|
|
|
|
|
|
var output = ""; |
|
|
|
|
if (contract._isTransact) { |
|
|
|
|
// it's used byt natspec.js
|
|
|
|
|
// TODO: figure out better way to solve this
|
|
|
|
|
web3._currentContractAbi = desc; |
|
|
|
|
web3._currentContractAddress = address; |
|
|
|
|
|
|
|
|
|
output = web3.eth.transact(options); |
|
|
|
|
} else { |
|
|
|
|
output = web3.eth.call(options); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
return outputParser[displayName][typeName](output); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
if (contract[displayName] === undefined) { |
|
|
|
|
contract[displayName] = impl; |
|
|
|
|
if (result[displayName] === undefined) { |
|
|
|
|
result[displayName] = impl; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
contract[displayName][typeName] = impl; |
|
|
|
|
result[displayName][typeName] = impl; |
|
|
|
|
|
|
|
|
|
}); |
|
|
|
|
return result; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var transact = function (options) { |
|
|
|
|
contract._isTransact = true; |
|
|
|
|
contract._options = options; |
|
|
|
|
return contract; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
var call = function (options) { |
|
|
|
|
contract._isTransact = false; |
|
|
|
|
contract._options = options; |
|
|
|
|
return contract; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
contract.transact = transact; |
|
|
|
|
contract.call = call; |
|
|
|
|
|
|
|
|
|
module.exports = contract; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|