diff options
author | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-20 22:06:05 +0800 |
---|---|---|
committer | Marek Kotewicz <marek.kotewicz@gmail.com> | 2015-01-20 22:06:05 +0800 |
commit | 380c1522ac450fdafe9bfb8e2d2f60fdfe918745 (patch) | |
tree | 8ec905b875a77a86f279f174a32e413ebe22a25a /lib | |
parent | 6a58db66f7f42a49667bcc751418256441752279 (diff) | |
download | dexon-380c1522ac450fdafe9bfb8e2d2f60fdfe918745.tar.gz dexon-380c1522ac450fdafe9bfb8e2d2f60fdfe918745.tar.zst dexon-380c1522ac450fdafe9bfb8e2d2f60fdfe918745.zip |
solidity methods "overloading"
Diffstat (limited to 'lib')
-rw-r--r-- | lib/abi.js | 50 | ||||
-rw-r--r-- | lib/contract.js | 16 |
2 files changed, 51 insertions, 15 deletions
diff --git a/lib/abi.js b/lib/abi.js index 72001eaa0..c896ab28a 100644 --- a/lib/abi.js +++ b/lib/abi.js @@ -330,15 +330,37 @@ var fromAbiOutput = function (json, methodName, output) { return result; }; +/// @returns display name for method eg. multiply(uint256) -> multiply +var methodDisplayName = function (method) { + var length = method.indexOf('('); + return length !== -1 ? method.substr(0, length) : method; +}; + +/// @returns overloaded part of method's name +var methodTypeName = function (method) { + /// TODO: make it not vulnerable + var length = method.indexOf('('); + return length !== -1 ? method.substr(length + 1, method.length - 1 - (length + 1)) : ""; +}; + /// @param json abi for contract /// @returns input parser object for given json abi var inputParser = function (json) { var parser = {}; json.forEach(function (method) { - parser[method.name] = function () { + var displayName = methodDisplayName(method.name); + var typeName = methodTypeName(method.name); + + var impl = function () { var params = Array.prototype.slice.call(arguments); return toAbiInput(json, method.name, params); }; + + if (parser[displayName] === undefined) { + parser[displayName] = impl; + } + + parser[displayName][typeName] = impl; }); return parser; @@ -349,9 +371,19 @@ var inputParser = function (json) { var outputParser = function (json) { var parser = {}; json.forEach(function (method) { - parser[method.name] = function (output) { + + var displayName = methodDisplayName(method.name); + var typeName = methodTypeName(method.name); + + var impl = function (output) { return fromAbiOutput(json, method.name, output); }; + + if (parser[displayName] === undefined) { + parser[displayName] = impl; + } + + parser[displayName][typeName] = impl; }); return parser; @@ -361,20 +393,14 @@ var outputParser = function (json) { /// @param method name for which we want to get method signature /// @returns (promise) contract method signature for method with given name var methodSignature = function (json, name) { - var method = json[findMethodIndex(json, name)]; - var result = name + '('; - var inputTypes = method.inputs.map(function (inp) { - return inp.type; - }); - result += inputTypes.join(','); - result += ')'; - - return web3.sha3(web3.fromAscii(result)); + return web3.sha3(web3.fromAscii(name)); }; module.exports = { inputParser: inputParser, outputParser: outputParser, - methodSignature: methodSignature + methodSignature: methodSignature, + methodDisplayName: methodDisplayName, + methodTypeName: methodTypeName }; diff --git a/lib/contract.js b/lib/contract.js index 744fc88a4..2e8ef8ce4 100644 --- a/lib/contract.js +++ b/lib/contract.js @@ -53,12 +53,16 @@ var contract = function (address, desc) { var contract = {}; desc.forEach(function (method) { - contract[method.name] = function () { + + var displayName = abi.methodDisplayName(method.name); + var typeName = abi.methodTypeName(method.name); + + var impl = function () { var params = Array.prototype.slice.call(arguments); - var parsed = inputParser[method.name].apply(null, params); + var parsed = inputParser[displayName][typeName].apply(null, params); var onSuccess = function (result) { - return outputParser[method.name](result); + return outputParser[displayName][typeName](result); }; return { @@ -80,6 +84,12 @@ var contract = function (address, desc) { } }; }; + + if (contract[displayName] === undefined) { + contract[displayName] = impl; + } + + contract[displayName][typeName] = impl; }); return contract; |