abi function type
This commit is contained in:
parent
63d9c070ef
commit
ea7c2fc673
|
@ -66,6 +66,14 @@ var getMethodWithName = function (json, methodName) {
|
|||
return json[index];
|
||||
};
|
||||
|
||||
/// Filters all function from input abi
|
||||
/// @returns abi array with filtered objects of type 'function'
|
||||
var filterFunctions = function (json) {
|
||||
return json.filter(function (current) {
|
||||
return current.type === 'function';
|
||||
});
|
||||
};
|
||||
|
||||
/// @param string string to be padded
|
||||
/// @param number of characters that result string should have
|
||||
/// @param sign, by default 0
|
||||
|
@ -352,7 +360,7 @@ var methodTypeName = function (method) {
|
|||
/// @returns input parser object for given json abi
|
||||
var inputParser = function (json) {
|
||||
var parser = {};
|
||||
json.forEach(function (method) {
|
||||
filterFunctions(json).forEach(function (method) {
|
||||
var displayName = methodDisplayName(method.name);
|
||||
var typeName = methodTypeName(method.name);
|
||||
|
||||
|
@ -375,7 +383,7 @@ var inputParser = function (json) {
|
|||
/// @returns output parser for given json abi
|
||||
var outputParser = function (json) {
|
||||
var parser = {};
|
||||
json.forEach(function (method) {
|
||||
filterFunctions(json).forEach(function (method) {
|
||||
|
||||
var displayName = methodDisplayName(method.name);
|
||||
var typeName = methodTypeName(method.name);
|
||||
|
@ -406,7 +414,8 @@ module.exports = {
|
|||
methodSignature: methodSignature,
|
||||
methodDisplayName: methodDisplayName,
|
||||
methodTypeName: methodTypeName,
|
||||
getMethodWithName: getMethodWithName
|
||||
getMethodWithName: getMethodWithName,
|
||||
filterFunctions: filterFunctions
|
||||
};
|
||||
|
||||
|
||||
|
@ -464,6 +473,7 @@ var contract = function (address, desc) {
|
|||
// workaround for invalid assumption that method.name is the full anonymous prototype of the method.
|
||||
// it's not. it's just the name. the rest of the code assumes it's actually the anonymous
|
||||
// prototype, so we make it so as a workaround.
|
||||
// TODO: we may not want to modify input params, maybe use copy instead?
|
||||
if (method.name.indexOf('(') === -1) {
|
||||
var displayName = method.name;
|
||||
var typeName = method.inputs.map(function(i){return i.type; }).join();
|
||||
|
@ -497,7 +507,7 @@ var contract = function (address, desc) {
|
|||
});
|
||||
|
||||
|
||||
desc.forEach(function (method) {
|
||||
abi.filterFunctions(desc).forEach(function (method) {
|
||||
|
||||
var displayName = abi.methodDisplayName(method.name);
|
||||
var typeName = abi.methodTypeName(method.name);
|
||||
|
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
15
lib/abi.js
15
lib/abi.js
|
@ -65,6 +65,14 @@ var getMethodWithName = function (json, methodName) {
|
|||
return json[index];
|
||||
};
|
||||
|
||||
/// Filters all function from input abi
|
||||
/// @returns abi array with filtered objects of type 'function'
|
||||
var filterFunctions = function (json) {
|
||||
return json.filter(function (current) {
|
||||
return current.type === 'function';
|
||||
});
|
||||
};
|
||||
|
||||
/// @param string string to be padded
|
||||
/// @param number of characters that result string should have
|
||||
/// @param sign, by default 0
|
||||
|
@ -351,7 +359,7 @@ var methodTypeName = function (method) {
|
|||
/// @returns input parser object for given json abi
|
||||
var inputParser = function (json) {
|
||||
var parser = {};
|
||||
json.forEach(function (method) {
|
||||
filterFunctions(json).forEach(function (method) {
|
||||
var displayName = methodDisplayName(method.name);
|
||||
var typeName = methodTypeName(method.name);
|
||||
|
||||
|
@ -374,7 +382,7 @@ var inputParser = function (json) {
|
|||
/// @returns output parser for given json abi
|
||||
var outputParser = function (json) {
|
||||
var parser = {};
|
||||
json.forEach(function (method) {
|
||||
filterFunctions(json).forEach(function (method) {
|
||||
|
||||
var displayName = methodDisplayName(method.name);
|
||||
var typeName = methodTypeName(method.name);
|
||||
|
@ -405,6 +413,7 @@ module.exports = {
|
|||
methodSignature: methodSignature,
|
||||
methodDisplayName: methodDisplayName,
|
||||
methodTypeName: methodTypeName,
|
||||
getMethodWithName: getMethodWithName
|
||||
getMethodWithName: getMethodWithName,
|
||||
filterFunctions: filterFunctions
|
||||
};
|
||||
|
||||
|
|
|
@ -51,6 +51,7 @@ var contract = function (address, desc) {
|
|||
// workaround for invalid assumption that method.name is the full anonymous prototype of the method.
|
||||
// it's not. it's just the name. the rest of the code assumes it's actually the anonymous
|
||||
// prototype, so we make it so as a workaround.
|
||||
// TODO: we may not want to modify input params, maybe use copy instead?
|
||||
if (method.name.indexOf('(') === -1) {
|
||||
var displayName = method.name;
|
||||
var typeName = method.inputs.map(function(i){return i.type; }).join();
|
||||
|
@ -84,7 +85,7 @@ var contract = function (address, desc) {
|
|||
});
|
||||
|
||||
|
||||
desc.forEach(function (method) {
|
||||
abi.filterFunctions(desc).forEach(function (method) {
|
||||
|
||||
var displayName = abi.methodDisplayName(method.name);
|
||||
var typeName = abi.methodTypeName(method.name);
|
||||
|
|
|
@ -5,6 +5,7 @@ var clone = function (object) { return JSON.parse(JSON.stringify(object)); };
|
|||
|
||||
var description = [{
|
||||
"name": "test",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
|
@ -339,10 +340,12 @@ describe('abi', function() {
|
|||
// given
|
||||
var d = [{
|
||||
name: "test",
|
||||
type: "function",
|
||||
inputs: [{ type: "int" }],
|
||||
outputs: [{ type: "int" }]
|
||||
},{
|
||||
name: "test2",
|
||||
type: "function",
|
||||
inputs: [{ type: "string" }],
|
||||
outputs: [{ type: "string" }]
|
||||
}];
|
||||
|
@ -775,10 +778,12 @@ describe('abi', function() {
|
|||
// given
|
||||
var d = [{
|
||||
name: "test",
|
||||
type: "function",
|
||||
inputs: [{ type: "int" }],
|
||||
outputs: [{ type: "int" }]
|
||||
},{
|
||||
name: "test2",
|
||||
type: "function",
|
||||
inputs: [{ type: "string" }],
|
||||
outputs: [{ type: "string" }]
|
||||
}];
|
||||
|
|
|
@ -0,0 +1,172 @@
|
|||
var assert = require('assert');
|
||||
var contract = require('../lib/contract.js');
|
||||
|
||||
describe('contract', function() {
|
||||
it('should create simple contract with one method from abi with explicit type name', function () {
|
||||
|
||||
// given
|
||||
var description = [{
|
||||
"name": "test(uint256)",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
]
|
||||
}];
|
||||
|
||||
// when
|
||||
var con = contract(null, description);
|
||||
|
||||
// then
|
||||
assert.equal('function', typeof con.test);
|
||||
assert.equal('function', typeof con.test['uint256']);
|
||||
});
|
||||
|
||||
it('should create simple contract with one method from abi with implicit type name', function () {
|
||||
|
||||
// given
|
||||
var description = [{
|
||||
"name": "test",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
]
|
||||
}];
|
||||
|
||||
// when
|
||||
var con = contract(null, description);
|
||||
|
||||
// then
|
||||
assert.equal('function', typeof con.test);
|
||||
assert.equal('function', typeof con.test['uint256']);
|
||||
});
|
||||
|
||||
it('should create contract with multiple methods', function () {
|
||||
|
||||
// given
|
||||
var description = [{
|
||||
"name": "test",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
}, {
|
||||
"name": "test2",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
]
|
||||
}];
|
||||
|
||||
// when
|
||||
var con = contract(null, description);
|
||||
|
||||
// then
|
||||
assert.equal('function', typeof con.test);
|
||||
assert.equal('function', typeof con.test['uint256']);
|
||||
assert.equal('function', typeof con.test2);
|
||||
assert.equal('function', typeof con.test2['uint256']);
|
||||
});
|
||||
|
||||
it('should create contract with overloaded methods', function () {
|
||||
|
||||
// given
|
||||
var description = [{
|
||||
"name": "test",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
}, {
|
||||
"name": "test",
|
||||
"type": "function",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "string"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
]
|
||||
}];
|
||||
|
||||
// when
|
||||
var con = contract(null, description);
|
||||
|
||||
// then
|
||||
assert.equal('function', typeof con.test);
|
||||
assert.equal('function', typeof con.test['uint256']);
|
||||
assert.equal('function', typeof con.test['string']);
|
||||
});
|
||||
|
||||
it('should create contract with no methods', function () {
|
||||
|
||||
// given
|
||||
var description = [{
|
||||
"name": "test(uint256)",
|
||||
"type": "event",
|
||||
"inputs": [{
|
||||
"name": "a",
|
||||
"type": "uint256"
|
||||
}
|
||||
],
|
||||
"outputs": [
|
||||
{
|
||||
"name": "d",
|
||||
"type": "uint256"
|
||||
}
|
||||
]
|
||||
}];
|
||||
|
||||
|
||||
// when
|
||||
var con = contract(null, description);
|
||||
|
||||
// then
|
||||
assert.equal('undefined', typeof con.test);
|
||||
|
||||
});
|
||||
});
|
||||
|
Loading…
Reference in New Issue