@newos/upgradeability-transpiler
Version:
Transpiles Solidity contracts to updgradable versions compatible with NewOs.
64 lines • 3.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const ast_utils_1 = require("../solc/ast-utils");
const get_var_inits_1 = require("./get-var-inits");
const build_super_calls_for_chain_1 = require("./build-super-calls-for-chain");
function getVarInitsPart(contractNode, source) {
return get_var_inits_1.getVarInits(contractNode, source)
.map(([vr, , match]) => `\n ${vr.name} ${match[2]};`)
.join('');
}
function transformConstructor(contractNode, source, contracts, contractsToArtifactsMap) {
const superCalls = build_super_calls_for_chain_1.buildSuperCallsForChain(contractNode, source, contracts, contractsToArtifactsMap);
const declarationInserts = getVarInitsPart(contractNode, source);
const constructorNode = ast_utils_1.getConstructor(contractNode);
const isFullyImplemented = contractNode.fullyImplemented;
let removeConstructor = null;
let constructorBodySource = null;
let constructorParameterList = null;
let constructorArgsList = null;
if (constructorNode) {
constructorBodySource = ast_utils_1.stripBraces(ast_utils_1.getNodeSources(constructorNode.body, source)[2]);
constructorParameterList = ast_utils_1.stripBraces(ast_utils_1.getNodeSources(constructorNode.parameters, source)[2]);
const [start, len] = ast_utils_1.getNodeSources(constructorNode, source);
removeConstructor = {
start: start,
end: start + len,
text: '',
};
constructorArgsList = constructorNode.parameters.parameters.map(par => par.name).join(',');
}
constructorParameterList = (constructorParameterList !== null && constructorParameterList !== void 0 ? constructorParameterList : '');
const constructorParameterListWithComma = constructorParameterList ? `, ${constructorParameterList}` : '';
constructorBodySource = (constructorBodySource !== null && constructorBodySource !== void 0 ? constructorBodySource : '');
constructorArgsList = constructorArgsList ? `, ${constructorArgsList}` : '';
const initializeFuncText = isFullyImplemented
? `
function initialize(${constructorParameterList.replace('string memory', 'string calldata')}) external initializer {
__init(true${constructorArgsList});
}`
: '';
const superCallsBlock = superCalls
? `if(callChain) {${superCalls}
}`
: '';
const [start, , contractSource] = ast_utils_1.getNodeSources(contractNode, source);
const match = /\bcontract[^\{]*{/.exec(contractSource);
if (!match)
throw new Error(`Can't find contract pattern in ${contractSource}`);
return [
removeConstructor,
{
start: start + match[0].length,
end: start + match[0].length,
text: `${initializeFuncText}\n
function __init(bool callChain${constructorParameterListWithComma}) internal {
${superCallsBlock}
${declarationInserts}
${constructorBodySource}
}\n`,
},
].filter(tran => tran !== null);
}
exports.transformConstructor = transformConstructor;
//# sourceMappingURL=transform-constructor.js.map