@solvprotocol/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
43 lines (35 loc) • 1.26 kB
text/typescript
import { Expression } from 'solidity-ast';
import { TransformHelper } from '../transformations/type';
export function parseNewExpression(expr: Expression) {
let needsCast = false;
if (expr.nodeType === 'FunctionCall' && expr.kind === 'typeConversion') {
if (
expr.expression.nodeType === 'ElementaryTypeNameExpression' &&
expr.expression.typeName.name === 'address'
) {
expr = expr.arguments[0];
needsCast = true;
}
}
if (expr.nodeType === 'FunctionCall' && expr.expression.nodeType === 'NewExpression') {
const functionCall = expr;
const { arguments: args } = expr;
const { typeName } = expr.expression;
if (typeName.nodeType !== 'UserDefinedTypeName') {
return undefined;
}
const initializeCall = (varName: string, helper: TransformHelper) =>
[
...(needsCast ? [helper.read(typeName), '(', varName, ')'] : varName),
'.initialize',
'(',
functionCall.arguments.map(a => helper.read(a)).join(', '),
')',
].join('');
const newCall = (helper: TransformHelper) => {
const n = `new ${helper.read(typeName)}()`;
return needsCast ? `address(${n})` : n;
};
return { typeName, args, initializeCall, newCall };
}
}