Allow modifiers on Human-Readable ABI for tuples and arrays.

This commit is contained in:
Richard Moore 2020-05-01 16:24:59 -04:00
parent 54dfb757c4
commit 83fba3de25
No known key found for this signature in database
GPG Key ID: 665176BE8E9DC651
2 changed files with 40 additions and 0 deletions

@ -53,11 +53,14 @@ type ParseNode = {
}; };
let ModifiersBytes: { [ name: string ]: boolean } = { calldata: true, memory: true, storage: true }; let ModifiersBytes: { [ name: string ]: boolean } = { calldata: true, memory: true, storage: true };
let ModifiersNest: { [ name: string ]: boolean } = { calldata: true, memory: true };
function checkModifier(type: string, name: string): boolean { function checkModifier(type: string, name: string): boolean {
if (type === "bytes" || type === "string") { if (type === "bytes" || type === "string") {
if (ModifiersBytes[name]) { return true; } if (ModifiersBytes[name]) { return true; }
} else if (type === "address") { } else if (type === "address") {
if (name === "payable") { return true; } if (name === "payable") { return true; }
} else if (type.indexOf("[") >= 0 || type === "tuple") {
if (ModifiersNest[name]) { return true; }
} }
if (ModifiersBytes[name] || name === "payable") { if (ModifiersBytes[name] || name === "payable") {
logger.throwArgumentError("invalid modifier", "name", name); logger.throwArgumentError("invalid modifier", "name", name);

@ -595,3 +595,40 @@ describe('Test Filters', function() {
doTest(test); doTest(test);
}); });
}); });
describe("Test ParamType Parser", function() {
const Tests: Array<{ type: string, format: string }> = [
{ type: "address", format: "address" },
{ type: "address foo", format: "address foo" },
{ type: "address payable", format: "address" },
{ type: "address payable foo", format: "address foo" },
{ type: "uint", format: "uint256" },
{ type: "uint16", format: "uint16" },
{ type: "uint256", format: "uint256" },
{ type: "int", format: "int256" },
{ type: "int16", format: "int16" },
{ type: "int256", format: "int256" },
{ type: "string", format: "string" },
{ type: "string memory", format: "string" },
{ type: "string calldata", format: "string" },
{ type: "string storage", format: "string" },
{ type: "string memory foo", format: "string foo" },
{ type: "string foo", format: "string foo" },
{ type: "string[]", format: "string[]" },
{ type: "string[5]", format: "string[5]" },
{ type: "uint[] memory", format: "uint256[]" },
{ type: "tuple(address a, string[] b) memory foo", format: "tuple(address a, string[] b) foo" },
];
Tests.forEach((test) => {
it(`allows correct modifiers ${ JSON.stringify(test.type) }`, function() {
const paramType = ethers.utils.ParamType.from(test.type);
//console.log(test, paramType.format("full"));
assert.equal(paramType.format("full"), test.format);
});
});
});