@openzeppelin/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
64 lines • 2.4 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.hasConstructorOverride = exports.getOverrides = exports.hasOverride = void 0;
const ast_utils_1 = require("../solc/ast-utils");
const execall_1 = require("../utils/execall");
const errorKinds = [
'state-variable-assignment',
'state-variable-immutable',
'external-library-linking',
'struct-definition',
'enum-definition',
'constructor',
'delegatecall',
'selfdestruct',
'missing-public-upgradeto',
];
function hasOverride(node, override, resolver) {
const overrides = getOverrides(node, resolver);
return (overrides.includes(override) ||
(override === 'state-variable-assignment' &&
node.nodeType === 'VariableDeclaration' &&
node.mutability === 'immutable' &&
overrides.includes('state-variable-immutable')));
}
exports.hasOverride = hasOverride;
function getOverrides(node, resolver) {
const overrides = getOwnOverrides(node);
if ('scope' in node) {
const contract = resolver.resolveContract(node.scope);
if (contract) {
overrides.push(...getOwnOverrides(contract));
}
}
return overrides;
}
exports.getOverrides = getOverrides;
function getOwnOverrides(node) {
if ('documentation' in node) {
const doc = typeof node.documentation === 'string' ? node.documentation : node.documentation?.text ?? '';
const result = [];
for (const { groups } of (0, execall_1.execall)(/^\s*(?:@(?<title>\w+)(?::(?<tag>[a-z][a-z-]*))? )?(?<args>(?:(?!^\s@\w+)[^])*)/m, doc)) {
if (groups && groups.title === 'custom' && groups.tag === 'oz-upgrades-unsafe-allow') {
result.push(...groups.args.split(/\s+/));
}
}
result.forEach(arg => {
if (!errorKinds.includes(arg)) {
throw new Error(`NatSpec: oz-upgrades-unsafe-allow argument not recognized: ${arg}`);
}
});
return result;
}
else {
return [];
}
}
function hasConstructorOverride(contract) {
const ctor = (0, ast_utils_1.getConstructor)(contract);
return ctor
? [...getOwnOverrides(ctor), ...getOwnOverrides(contract)].includes('constructor')
: false;
}
exports.hasConstructorOverride = hasConstructorOverride;
//# sourceMappingURL=upgrades-overrides.js.map