@solvprotocol/upgrade-safe-transpiler
Version:
Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.
176 lines • 8.82 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const ava_1 = __importDefault(require("ava"));
const get_build_info_1 = require("./test-utils/get-build-info");
const utils_1 = require("solidity-ast/utils");
const ast_utils_1 = require("./solc/ast-utils");
const transform_1 = require("./transform");
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 fix_import_directives_1 = require("./transformations/fix-import-directives");
const fix_new_statement_1 = require("./transformations/fix-new-statement");
const add_required_public_initializers_1 = require("./transformations/add-required-public-initializers");
const append_initializable_import_1 = require("./transformations/append-initializable-import");
const add_storage_gaps_1 = require("./transformations/add-storage-gaps");
const transform_constructor_1 = require("./transformations/transform-constructor");
const test = ava_1.default;
test.serial.before('compile', async (t) => {
const buildInfo = await (0, get_build_info_1.getBuildInfo)('0.6');
t.context.solcInput = buildInfo.input;
t.context.solcOutput = buildInfo.output;
t.context.transformFile = (file) => new transform_1.Transform(t.context.solcInput, t.context.solcOutput, {
exclude: source => source !== file,
});
});
test.beforeEach('transform', async (t) => {
t.context.transform = new transform_1.Transform(t.context.solcInput, t.context.solcOutput, {
exclude: source => source.startsWith('contracts/invalid/'),
});
});
test('read', t => {
const text = t.context.transform.read({ src: '0:6:0' });
t.deepEqual('pragma', text);
});
test('apply + read', t => {
t.context.transform.apply(function* () {
yield { kind: 'a', start: 1, length: 0, text: '~' };
});
const text = t.context.transform.read({ src: '0:6:0' });
t.deepEqual('p~ragma', text);
});
test('apply + read invalid', t => {
t.context.transform.apply(function* () {
yield { kind: 'a', start: 1, length: 2, text: '~~' };
});
t.throws(() => t.context.transform.read({ src: '2:2:0' }));
});
test('remove functions', t => {
const file = 'contracts/TransformRemove.sol';
t.context.transform.apply(function* (sourceUnit) {
if (sourceUnit.absolutePath === file) {
for (const node of (0, utils_1.findAll)('FunctionDefinition', sourceUnit)) {
yield { ...(0, ast_utils_1.getNodeBounds)(node), kind: 'remove', text: '' };
}
}
});
t.snapshot(t.context.transform.results()[file]);
});
test('rename identifiers', t => {
const file = 'contracts/solc-0.6/Rename.sol';
t.context.transform.apply(rename_identifiers_1.renameIdentifiers);
t.snapshot(t.context.transform.results()[file]);
});
test('prepend Initializable base', t => {
const file = 'contracts/solc-0.6/Rename.sol';
t.context.transform.apply(prepend_initializable_base_1.prependInitializableBase);
t.snapshot(t.context.transform.results()[file]);
});
test('purge var inits', t => {
const file = 'contracts/solc-0.6/ElementaryTypes.sol';
t.context.transform.apply(purge_var_inits_1.removeStateVarInits);
t.snapshot(t.context.transform.results()[file]);
});
test('remove inheritance args', t => {
const file = 'contracts/TransformInheritanceArgs.sol';
t.context.transform.apply(remove_inheritance_list_args_1.removeInheritanceListArguments);
t.snapshot(t.context.transform.results()[file]);
});
test('transform contract name', t => {
const file = 'contracts/solc-0.6/Rename.sol';
t.context.transform.apply(rename_contract_definition_1.renameContractDefinition);
t.snapshot(t.context.transform.results()[file]);
});
test('skip contract rename when Upgradeable suffix', t => {
const file = 'contracts/solc-0.6/AlreadyUpgradeable.sol';
t.context.transform.apply(rename_contract_definition_1.renameContractDefinition);
t.snapshot(t.context.transform.results()[file]);
});
test('fix import directives', t => {
const file = 'contracts/solc-0.6/Local.sol';
t.context.transform.apply(fix_import_directives_1.fixImportDirectives);
t.snapshot(t.context.transform.results()[file]);
});
test('fix import directives complex', t => {
const file = 'contracts/TransformImport2.sol';
t.context.transform.apply(rename_identifiers_1.renameIdentifiers);
t.context.transform.apply(fix_import_directives_1.fixImportDirectives);
t.snapshot(t.context.transform.results()[file]);
});
test('append initializable import', t => {
const file = 'contracts/solc-0.6/Local.sol';
t.context.transform.apply((0, append_initializable_import_1.appendInitializableImport)('contracts/solc-0.6/Initializable.sol'));
t.snapshot(t.context.transform.results()[file]);
});
test('append initializable import custom', t => {
const file = 'contracts/solc-0.6/Local.sol';
t.context.transform.apply((0, append_initializable_import_1.appendInitializableImport)('contracts/solc-0.6/Initializable2.sol'));
t.snapshot(t.context.transform.results()[file]);
});
test('transform constructor', t => {
const file = 'contracts/TransformConstructor.sol';
t.context.transform.apply(transform_constructor_1.transformConstructor);
t.context.transform.apply(transform_constructor_1.removeLeftoverConstructorHead);
t.snapshot(t.context.transform.results()[file]);
});
test('invalid constructors', t => {
const tVarSubexpr = t.context.transformFile('contracts/invalid/TransformConstructorVarSubexpr.sol');
t.throws(() => tVarSubexpr.apply(transform_constructor_1.transformConstructor), {
message: `Can't transpile non-trivial expression in parent constructor argument (y + 1)`,
});
const tVarSubexprVar = t.context.transformFile('contracts/invalid/TransformConstructorVarSubexprVar.sol');
t.throws(() => tVarSubexprVar.apply(transform_constructor_1.transformConstructor), {
message: `Can't transpile non-trivial expression in parent constructor argument (y + 1)`,
});
const tDupExpr = t.context.transformFile('contracts/invalid/TransformConstructorDupExpr.sol');
t.throws(() => tDupExpr.apply(transform_constructor_1.transformConstructor), {
message: `Can't transpile non-trivial expression in parent constructor argument (t.mint())`,
});
});
test('fix new statement', t => {
const file = 'contracts/TransformNew.sol';
t.context.transform.apply(fix_new_statement_1.fixNewStatement);
t.context.transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)([]));
t.snapshot(t.context.transform.results()[file]);
});
test('fix new statement in var init', t => {
const file = 'contracts/TransformNewVarInit.sol';
t.context.transform.apply(transform_constructor_1.transformConstructor);
t.context.transform.apply(purge_var_inits_1.removeStateVarInits);
t.context.transform.apply(transform_constructor_1.removeLeftoverConstructorHead);
t.context.transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)([]));
t.snapshot(t.context.transform.results()[file]);
});
test('exclude', t => {
const file = 'contracts/TransformInitializable.sol';
const transform = new transform_1.Transform(t.context.solcInput, t.context.solcOutput, {
exclude: s => s === file,
});
// eslint-disable-next-line require-yield
transform.apply(function* (s) {
t.not(s.absolutePath, file);
});
t.false(file in transform.results());
});
test('add storage gaps', t => {
const file = 'contracts/TransformAddGap.sol';
t.context.transform.apply(add_storage_gaps_1.addStorageGaps);
t.snapshot(t.context.transform.results()[file]);
});
test('add requested public initializer', t => {
const file = 'contracts/TransformConstructorWithArgs.sol';
t.context.transform.apply((0, add_required_public_initializers_1.addRequiredPublicInitializer)([file]));
t.snapshot(t.context.transform.results()[file]);
});
test('remove immutable', t => {
const file = 'contracts/TransformImmutable.sol';
t.context.transform.apply(remove_immutable_1.removeImmutable);
t.snapshot(t.context.transform.results()[file]);
});
//# sourceMappingURL=transform.test.js.map