@solvprotocol/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
65 lines • 3.07 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateWithInit = void 0;
const path_1 = __importDefault(require("path"));
const compare_versions_1 = require("compare-versions");
const format_lines_1 = require("./transformations/utils/format-lines");
const utils_1 = require("solidity-ast/utils");
const ast_utils_1 = require("./solc/ast-utils");
const rename_1 = require("./rename");
const relative_path_1 = require("./utils/relative-path");
const upgrades_overrides_1 = require("./utils/upgrades-overrides");
function generateWithInit(transform, destPath, solcVersion = '0.6.0') {
const pragmaVersion = (0, compare_versions_1.satisfies)(solcVersion, '>=0.7') ? '0.7' : '0.6';
const res = [
`pragma solidity >=${pragmaVersion} <0.9;`,
`pragma experimental ABIEncoderV2;`,
``,
];
for (const sourceUnit of transform.asts()) {
for (const contract of (0, utils_1.findAll)('ContractDefinition', sourceUnit)) {
if (contract.contractKind !== 'contract' || contract.abstract) {
continue;
}
const constructorNode = (0, ast_utils_1.getConstructor)(contract);
let argNames = '';
if (constructorNode) {
argNames = constructorNode.parameters.parameters.map(p => p.name).join(', ');
}
let argsList = '';
if (constructorNode) {
const source = transform.read(constructorNode);
const argsMatch = source.match(/\((.*?)\)/s);
if (argsMatch === null) {
throw new Error(`Could not find constructor arguments for ${contract.name}`);
}
[, argsList] = argsMatch;
}
const renamedContract = (0, rename_1.renameContract)(contract.name);
let parents = [];
let statements = [];
if ((0, upgrades_overrides_1.hasConstructorOverride)(contract)) {
parents = [`${(0, rename_1.renameContract)(contract.name)}(${argNames})`];
}
else {
statements = [`__${contract.name}_init(${argNames});`];
}
res.push(`import "${(0, relative_path_1.relativePath)(path_1.default.dirname(destPath), (0, rename_1.renamePath)(sourceUnit.absolutePath))}";`, ``, `contract ${renamedContract}WithInit is ${renamedContract} {`, [
[
`constructor(${argsList})`,
...parents,
...((0, compare_versions_1.satisfies)(pragmaVersion, '>=0.7') ? [] : [`public`]),
`payable initializer {`,
].join(' '),
statements,
`}`,
], `}`);
}
}
return (0, format_lines_1.formatLines)(0, res);
}
exports.generateWithInit = generateWithInit;
//# sourceMappingURL=generate-with-init.js.map