UNPKG

@solvprotocol/upgrade-safe-transpiler

Version:

Solidity preprocessor used to generate OpenZeppelin Contracts Upgrade Safe.

176 lines 8.82 kB
"use strict"; 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