mirror of https://github.com/status-im/op-geth.git
solidity methods "overloading"
This commit is contained in:
parent
6a58db66f7
commit
380c1522ac
|
@ -331,15 +331,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;
|
||||
|
@ -350,9 +372,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;
|
||||
|
@ -362,21 +394,15 @@ 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
|
||||
};
|
||||
|
||||
|
||||
|
@ -552,12 +578,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 {
|
||||
|
@ -579,6 +609,12 @@ var contract = function (address, desc) {
|
|||
}
|
||||
};
|
||||
};
|
||||
|
||||
if (contract[displayName] === undefined) {
|
||||
contract[displayName] = impl;
|
||||
}
|
||||
|
||||
contract[displayName][typeName] = impl;
|
||||
});
|
||||
|
||||
return contract;
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -20,7 +20,7 @@
|
|||
|
||||
// contract description, this will be autogenerated somehow
|
||||
var desc = [{
|
||||
"name": "multiply",
|
||||
"name": "multiply(uint256)",
|
||||
"inputs": [
|
||||
{
|
||||
"name": "a",
|
||||
|
|
50
lib/abi.js
50
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
|
||||
};
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -48,7 +48,6 @@ describe('abi', function() {
|
|||
assert.equal(parser.test('0.1'), "0000000000000000000000000000000000000000000000000000000000000000");
|
||||
assert.equal(parser.test('3.9'), "0000000000000000000000000000000000000000000000000000000000000003");
|
||||
|
||||
|
||||
});
|
||||
|
||||
it('should parse input uint128', function() {
|
||||
|
@ -321,7 +320,7 @@ describe('abi', function() {
|
|||
|
||||
// given
|
||||
var d = clone(description);
|
||||
d[0].name = 'helloworld';
|
||||
d[0].name = 'helloworld(int)';
|
||||
d[0].inputs = [
|
||||
{ type: "int" }
|
||||
];
|
||||
|
@ -331,6 +330,7 @@ describe('abi', function() {
|
|||
|
||||
// then
|
||||
assert.equal(parser.helloworld(1), "0000000000000000000000000000000000000000000000000000000000000001");
|
||||
assert.equal(parser.helloworld['int'](1), "0000000000000000000000000000000000000000000000000000000000000001");
|
||||
|
||||
});
|
||||
|
||||
|
@ -755,7 +755,7 @@ describe('abi', function() {
|
|||
|
||||
// given
|
||||
var d = clone(description);
|
||||
d[0].name = 'helloworld';
|
||||
d[0].name = 'helloworld(int)';
|
||||
d[0].outputs = [
|
||||
{ type: "int" }
|
||||
];
|
||||
|
@ -765,6 +765,7 @@ describe('abi', function() {
|
|||
|
||||
// then
|
||||
assert.equal(parser.helloworld("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1);
|
||||
assert.equal(parser.helloworld['int']("0x0000000000000000000000000000000000000000000000000000000000000001")[0], 1);
|
||||
|
||||
});
|
||||
|
||||
|
|
Loading…
Reference in New Issue