@gnus.ai/upgrade-safe-transpiler-diamond
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe using Diamond Pattern (EIP-2535).
123 lines • 7.84 kB
JavaScript
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.transpile = void 0;
const path_1 = __importDefault(require("path"));
const fs_1 = __importDefault(require("fs"));
const lodash_1 = require("lodash");
const matcher_1 = require("./utils/matcher");
const rename_1 = require("./rename");
const transform_1 = require("./transform");
const generate_with_init_1 = require("./generate-with-init");
const find_already_initializable_1 = require("./find-already-initializable");
const fix_import_directives_1 = require("./transformations/fix-import-directives");
const rename_identifiers_1 = require("./transformations/rename-identifiers");
const prepend_initializable_base_1 = require("./transformations/prepend-initializable-base");
const purge_var_inits_1 = require("./transformations/purge-var-inits");
const remove_immutable_1 = require("./transformations/remove-immutable");
const remove_inheritance_list_args_1 = require("./transformations/remove-inheritance-list-args");
const rename_contract_definition_1 = require("./transformations/rename-contract-definition");
const append_initializable_import_1 = require("./transformations/append-initializable-import");
const fix_new_statement_1 = require("./transformations/fix-new-statement");
const add_required_public_initializers_1 = require("./transformations/add-required-public-initializers");
const add_storage_gaps_1 = require("./transformations/add-storage-gaps");
const rename_inheritdoc_1 = require("./transformations/rename-inheritdoc");
const transform_constructor_1 = require("./transformations/transform-constructor");
const add_diamond_storage_1 = require("./transformations/add-diamond-storage");
const add_diamond_access_1 = require("./transformations/add-diamond-access");
const remove_state_variables_1 = require("./transformations/remove-state-variables");
const add_public_getters_1 = require("./transformations/add-public-getters");
function getExtraOutputPaths(paths, options) {
const outputPaths = (0, lodash_1.mapValues)({
initializable: 'Initializable.sol',
withInit: 'mocks/WithInit.sol',
}, s => path_1.default.relative(paths.root, path_1.default.join(paths.sources, s)));
if (options === null || options === void 0 ? void 0 : options.initializablePath) {
outputPaths.initializable = options === null || options === void 0 ? void 0 : options.initializablePath;
}
return outputPaths;
}
async function transpile(solcInput, solcOutput, paths, options) {
var _a;
const outputPaths = getExtraOutputPaths(paths, options);
const alreadyInitializable = (0, find_already_initializable_1.findAlreadyInitializable)(solcOutput, options === null || options === void 0 ? void 0 : options.initializablePath);
const excludeSet = new Set([...alreadyInitializable, ...Object.values(outputPaths)]);
const excludeMatch = (0, matcher_1.matcher)((_a = options === null || options === void 0 ? void 0 : options.exclude) !== null && _a !== void 0 ? _a : []);
// build a final array of files to return
const outputFiles = [];
const transform = new transform_1.Transform(solcInput, solcOutput, {
exclude: source => { var _a; return excludeSet.has(source) || ((_a = excludeMatch(source)) !== null && _a !== void 0 ? _a : (0, rename_1.isRenamed)(source)); },
});
transform.apply(rename_identifiers_1.renameIdentifiers);
transform.apply(rename_contract_definition_1.renameContractDefinition);
transform.apply(rename_inheritdoc_1.renameInheritdoc);
transform.apply(prepend_initializable_base_1.prependInitializableBase);
transform.apply(fix_import_directives_1.fixImportDirectives);
transform.apply((0, transform_constructor_1.transformConstructor)((options === null || options === void 0 ? void 0 : options.extractStorage) || false));
transform.apply(transform_constructor_1.removeLeftoverConstructorHead);
transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)(options === null || options === void 0 ? void 0 : options.publicInitializers));
transform.apply(remove_inheritance_list_args_1.removeInheritanceListArguments);
transform.apply(remove_immutable_1.removeImmutable);
if (!(options === null || options === void 0 ? void 0 : options.extractStorage)) {
transform.apply(purge_var_inits_1.removeStateVarInits);
transform.apply(add_storage_gaps_1.addStorageGaps);
}
else {
transform.apply(add_diamond_access_1.addDiamondAccess);
transform.apply((0, add_diamond_storage_1.addDiamondStorage)(outputFiles));
transform.apply(add_public_getters_1.addPublicGetters);
transform.apply(remove_state_variables_1.removeStateVariables);
}
transform.apply((0, append_initializable_import_1.appendInitializableImport)(outputPaths.initializable));
transform.apply(fix_new_statement_1.fixNewStatement);
const results = transform.results();
for (const file in results) {
const transformedSource = results[file];
outputFiles.push({
source: transformedSource,
path: (0, rename_1.renamePath)(file),
fileName: path_1.default.basename(file),
});
}
const initializableSource = (options === null || options === void 0 ? void 0 : options.initializablePath) !== undefined
? transpileInitializable(solcInput, solcOutput, paths, options === null || options === void 0 ? void 0 : options.initializablePath, (options === null || options === void 0 ? void 0 : options.extractStorage) || false, outputFiles)
: fs_1.default.readFileSync(require.resolve((options === null || options === void 0 ? void 0 : options.extractStorage) ? '../InitializableFacet.sol' : '../Initializable.sol'), 'utf8');
outputFiles.push({
source: initializableSource,
path: outputPaths.initializable,
fileName: path_1.default.basename(outputPaths.initializable),
});
if ((options === null || options === void 0 ? void 0 : options.extractStorage) && (options === null || options === void 0 ? void 0 : options.initializablePath) === undefined) {
const initFacetStorage = fs_1.default.readFileSync(require.resolve('../InitializableFacetStorage.sol'), 'utf8');
outputFiles.push({
source: initFacetStorage,
path: path_1.default.dirname(outputPaths.initializable) + path_1.default.sep + 'InitializableStorage.sol',
fileName: 'InitializableStorage.sol',
});
}
outputFiles.push({
source: (0, generate_with_init_1.generateWithInit)(transform, outputPaths.withInit, options === null || options === void 0 ? void 0 : options.solcVersion),
path: outputPaths.withInit,
fileName: path_1.default.basename(outputPaths.withInit),
});
return outputFiles;
}
exports.transpile = transpile;
function transpileInitializable(solcInput, solcOutput, paths, initializablePath, extractStorage, outputFiles) {
const transform = new transform_1.Transform(solcInput, solcOutput);
transform.apply(function* (ast, tools) {
if (ast.absolutePath === initializablePath) {
yield* (0, rename_identifiers_1.renameIdentifiers)(ast, tools);
yield* (0, fix_import_directives_1.fixImportDirectives)(ast, tools);
if (extractStorage) {
yield* (0, add_diamond_access_1.addDiamondAccess)(ast, tools);
yield* (0, add_diamond_storage_1.addDiamondStorage)(outputFiles)(ast, tools);
yield* (0, remove_state_variables_1.removeStateVariables)(ast, tools);
}
}
});
return transform.results()[initializablePath];
}
//# sourceMappingURL=index.js.map