From 35fe73af0ec4fa93e1809d362b1834b3eb90f4cf Mon Sep 17 00:00:00 2001 From: Hadrien Croubois Date: Thu, 28 Mar 2024 17:07:07 +0100 Subject: [PATCH] working on a solution TODO: retrieve UDVT underlying type --- src/core.test.ts.md | 17 +++++++++++++++++ src/core.test.ts.snap | Bin 2425 -> 2487 bytes src/core.ts | 9 +++++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/core.test.ts.md b/src/core.test.ts.md index 6784d97..d6b89b9 100644 --- a/src/core.test.ts.md +++ b/src/core.test.ts.md @@ -824,6 +824,23 @@ Generated by [AVA](https://avajs.dev). ␊ receive() external payable {}␊ }␊ + ␊ + contract $UdvtConflict {␊ + bytes32 public constant __hh_exposed_bytecode_marker = "hardhat-exposed";␊ + ␊ + constructor() payable {␊ + }␊ + ␊ + function $unwrap_UdvtConflict_myFirstType(UdvtConflict.myFirstType t) external pure returns (bytes32 ret0) {␊ + (ret0) = UdvtConflict.unwrap(t);␊ + }␊ + ␊ + function $unwrap_UdvtConflict_mySecondType(UdvtConflict.mySecondType t) external pure returns (bytes32 ret0) {␊ + (ret0) = UdvtConflict.unwrap(t);␊ + }␊ + ␊ + receive() external payable {}␊ + }␊ ` ## snapshot initializers diff --git a/src/core.test.ts.snap b/src/core.test.ts.snap index 62e03a23d55114641f1386e8e172d2c346e88598..d19911a71edf9adef51dbd02ea07c02dc3b59473 100644 GIT binary patch literal 2487 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 diff --git a/src/core.ts b/src/core.ts index 8d2c676..e90a5cf 100644 --- a/src/core.ts +++ b/src/core.ts @@ -205,7 +205,7 @@ function getExposedContent(ast: SourceUnit, relativizePath: (p: string) => strin ]), // external functions ...externalizableFunctions.map(fn => { - const fnName = clashingFunctions[getFunctionId(fn, c, deref)] === 1 ? fn.name : getFunctionNameQualified(fn, c, deref); + const fnName = clashingFunctions[getFunctionId(fn, c, deref)] === 1 ? fn.name : getFunctionNameQualified(fn, c, deref, false); const fnArgs = getFunctionArguments(fn, c, deref); const fnRets = getFunctionReturnParameters(fn, c, deref); const evName = isNonViewWithReturns(fn) && (clashingEvents[fn.name] === 1 ? fn.name : getFunctionNameQualified(fn, c, deref, false)); @@ -284,7 +284,7 @@ function areFunctionsFullyImplemented(contract: ContractDefinition, deref: ASTDe function getFunctionId(fn: FunctionDefinition, context: ContractDefinition, deref: ASTDereferencer): string { const storageArgs = new Set(getStorageArguments(fn, context, deref)); const nonStorageArgs = getFunctionArguments(fn, context, deref).filter(a => !storageArgs.has(a)); - return fn.name + nonStorageArgs.map(a => a.type).join(''); + return fn.name + nonStorageArgs.map(a => a.udvtType ?? a.type).join(''); } function getFunctionNameQualified(fn: FunctionDefinition, context: ContractDefinition, deref: ASTDereferencer, onlyStorage: boolean = true): string { @@ -439,6 +439,7 @@ interface Argument { name: string; storageVar?: string; storageType?: string; + udvtType?: string; } const printArgument = (arg: Argument) => `${arg.type} ${arg.name}`; @@ -451,6 +452,10 @@ function getFunctionArguments(fnDef: FunctionDefinition, context: ContractDefini const storageVar = 'v_' + storageType.replace(/[^0-9a-zA-Z$_]+/g, '_'); // The argument is an index to an array in storage. return { name, type: 'uint256', storageVar, storageType }; + } else if (p.typeName?.nodeType == 'UserDefinedTypeName') { + const type = getVarType(p, context, deref, 'calldata'); + const udvtType = 'bytes32'; // TODO: Do an actual resolution + return { name, type, udvtType }; } else { const type = getVarType(p, context, deref, 'calldata'); return { name, type };