@neo-one/smart-contract-compiler
Version:
NEO•ONE TypeScript smart contract compiler.
99 lines (97 loc) • 18.7 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const ts_utils_1 = require("@neo-one/ts-utils");
const typescript_1 = tslib_1.__importDefault(require("typescript"));
const Helper_1 = require("../Helper");
const utils_1 = require("./utils");
class DeployHelper extends Helper_1.Helper {
constructor({ contractInfo, propInfo }) {
super();
this.contractInfo = contractInfo;
this.propInfo = propInfo;
}
emit(sb, node, optionsIn) {
const options = sb.pushValueOptions(optionsIn);
const handleDeployProperties = (contractInfo, innerOptions) => {
contractInfo.propInfos
.filter((prop) => prop.classDecl === contractInfo.smartContract)
.forEach((propertyPropInfo) => {
if (propertyPropInfo.type === 'property' && propertyPropInfo.structuredStorageType === undefined) {
const property = propertyPropInfo.decl;
if (typescript_1.default.isPropertyDeclaration(property)) {
const initializer = ts_utils_1.tsUtils.initializer.getInitializer(property);
const propNode = initializer === undefined ? property : initializer;
if (initializer === undefined) {
sb.emitHelper(propNode, sb.pushValueOptions(innerOptions), sb.helpers.wrapUndefined);
}
else {
sb.visit(initializer, sb.pushValueOptions(innerOptions));
}
sb.emitPushString(property, ts_utils_1.tsUtils.node.getName(property));
sb.emitHelper(property, innerOptions, sb.helpers.putCommonStorage);
}
else if (typescript_1.default.isParameterPropertyDeclaration(property)) {
const name = ts_utils_1.tsUtils.node.getName(property);
sb.scope.get(sb, property, sb.pushValueOptions(innerOptions), name);
sb.emitPushString(property, name);
sb.emitHelper(property, innerOptions, sb.helpers.putCommonStorage);
}
}
});
};
const handleDeploy = (currentContractInfo, propInfo, innerOptions, entry = true) => {
const decl = propInfo.decl;
const superDeploy = utils_1.findSuperDeployPropInfo(currentContractInfo);
if (decl === undefined) {
if (superDeploy === undefined) {
handleDeployProperties(currentContractInfo, innerOptions);
}
else {
handleDeploy(superDeploy[0], superDeploy[1], innerOptions, entry);
handleDeployProperties(currentContractInfo, innerOptions);
}
}
else {
if (entry) {
sb.emitPushInt(decl, 1);
sb.emitHelper(decl, innerOptions, sb.helpers.getArgument);
}
sb.withScope(decl, innerOptions, (innerInnerOptions) => {
sb.emitHelper(decl, innerInnerOptions, sb.helpers.parameters({
params: ts_utils_1.tsUtils.parametered.getParameters(decl),
mapParam: entry ? utils_1.createWrapParam(sb) : undefined,
}));
const invokeOptions = sb.handleSuperConstructOptions(sb.noPushValueOptions(innerInnerOptions), (expr, _superExpr, innerInnerInnerOptionsIn) => {
if (superDeploy === undefined) {
return;
}
const innerInnerInnerOptions = sb.pushValueOptions(innerInnerInnerOptionsIn);
sb.emitHelper(expr, innerInnerInnerOptions, sb.helpers.args);
handleDeploy(superDeploy[0], superDeploy[1], innerInnerInnerOptions, false);
handleDeployProperties(currentContractInfo, innerInnerInnerOptions);
});
if (superDeploy === undefined) {
handleDeployProperties(currentContractInfo, innerInnerOptions);
}
sb.emitHelper(decl, invokeOptions, sb.helpers.invokeSmartContractMethod({ method: decl }));
});
}
};
sb.emitHelper(node, options, sb.helpers.if({
condition: () => {
sb.emitHelper(this.propInfo.decl === undefined ? node : this.propInfo.decl, options, sb.helpers.isDeployed);
},
whenTrue: () => {
sb.emitPushBoolean(this.propInfo.decl === undefined ? this.propInfo.classDecl : this.propInfo.decl, false);
},
whenFalse: () => {
handleDeploy(this.contractInfo, this.propInfo, options);
sb.emitHelper(this.propInfo.decl === undefined ? node : this.propInfo.decl, options, sb.helpers.setDeployed);
sb.emitPushBoolean(this.propInfo.decl === undefined ? this.propInfo.classDecl : this.propInfo.decl, true);
},
}));
}
}
exports.DeployHelper = DeployHelper;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzlHLENBQUM7WUFDRCxRQUFRLEVBQUUsR0FBRyxFQUFFO2dCQUViLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDN0csQ0FBQztZQUNELFNBQVMsRUFBRSxHQUFHLEVBQUU7Z0JBRWQsWUFBWSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQztnQkFFeEQsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLENBQUM7Z0JBRTdHLEVBQUUsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUcsQ0FBQztTQUNGLENBQUMsQ0FDSCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBM0hELG9DQTJIQyIsImZpbGUiOiJuZW8tb25lLXNtYXJ0LWNvbnRyYWN0LWNvbXBpbGVyL3NyYy9jb21waWxlL2hlbHBlci9jb250cmFjdC9EZXBsb3lIZWxwZXIuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyB0c1V0aWxzIH0gZnJvbSAnQG5lby1vbmUvdHMtdXRpbHMnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgQ29udHJhY3RJbmZvLCBEZXBsb3lQcm9wSW5mbyB9IGZyb20gJy4uLy4uLy4uL2NvbnRyYWN0JztcbmltcG9ydCB7IFNjcmlwdEJ1aWxkZXIgfSBmcm9tICcuLi8uLi9zYic7XG5pbXBvcnQgeyBWaXNpdE9wdGlvbnMgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgeyBIZWxwZXIgfSBmcm9tICcuLi9IZWxwZXInO1xuaW1wb3J0IHsgY3JlYXRlV3JhcFBhcmFtLCBmaW5kU3VwZXJEZXBsb3lQcm9wSW5mbyB9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlcGxveUhlbHBlck9wdGlvbnMge1xuICByZWFkb25seSBjb250cmFjdEluZm86IENvbnRyYWN0SW5mbztcbiAgcmVhZG9ubHkgcHJvcEluZm86IERlcGxveVByb3BJbmZvO1xufVxuXG4vLyBJbnB1dDogW11cbi8vIE91dHB1dDogW2Jvb2xlYW5dXG5leHBvcnQgY2xhc3MgRGVwbG95SGVscGVyIGV4dGVuZHMgSGVscGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBjb250cmFjdEluZm86IENvbnRyYWN0SW5mbztcbiAgcHJpdmF0ZSByZWFkb25seSBwcm9wSW5mbzogRGVwbG95UHJvcEluZm87XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgY29udHJhY3RJbmZvLCBwcm9wSW5mbyB9OiBEZXBsb3lIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmNvbnRyYWN0SW5mbyA9IGNvbnRyYWN0SW5mbztcbiAgICB0aGlzLnByb3BJbmZvID0gcHJvcEluZm87XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuXG4gICAgY29uc3QgaGFuZGxlRGVwbG95UHJvcGVydGllcyA9IChjb250cmFjdEluZm86IENvbnRyYWN0SW5mbywgaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMpID0+IHtcbiAgICAgIGNvbnRyYWN0SW5mby5wcm9wSW5mb3NcbiAgICAgICAgLmZpbHRlcigocHJvcCkgPT4gcHJvcC5jbGFzc0RlY2wgPT09IGNvbnRyYWN0SW5mby5zbWFydENvbnRyYWN0KVxuICAgICAgICAuZm9yRWFjaCgocHJvcGVydHlQcm9wSW5mbykgPT4ge1xuICAgICAgICAgIGlmIChwcm9wZXJ0eVByb3BJbmZvLnR5cGUgPT09ICdwcm9wZXJ0eScgJiYgcHJvcGVydHlQcm9wSW5mby5zdHJ1Y3R1cmVkU3RvcmFnZVR5cGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBwcm9wZXJ0eVByb3BJbmZvLmRlY2w7XG4gICAgICAgICAgICBpZiAodHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKHByb3BlcnR5KSkge1xuICAgICAgICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IHRzVXRpbHMuaW5pdGlhbGl6ZXIuZ2V0SW5pdGlhbGl6ZXIocHJvcGVydHkpO1xuICAgICAgICAgICAgICBjb25zdCBwcm9wTm9kZSA9IGluaXRpYWxpemVyID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0eSA6IGluaXRpYWxpemVyO1xuICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIocHJvcE5vZGUsIHNiLnB1c2hWYWx1ZU9wdGlvbnMoaW5uZXJPcHRpb25zKSwgc2IuaGVscGVycy53cmFwVW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBbdmFsXVxuICAgICAgICAgICAgICAgIHNiLnZpc2l0KGluaXRpYWxpemVyLCBzYi5wdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucykpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIC8vIFtuYW1lLCB2YWxdXG4gICAgICAgICAgICAgIHNiLmVtaXRQdXNoU3RyaW5nKHByb3BlcnR5LCB0c1V0aWxzLm5vZGUuZ2V0TmFtZShwcm9wZXJ0eSkpO1xuICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3BlcnR5LCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMucHV0Q29tbW9uU3RvcmFnZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzUGFyYW1ldGVyUHJvcGVydHlEZWNsYXJhdGlvbihwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRzVXRpbHMubm9kZS5nZXROYW1lKHByb3BlcnR5KTtcbiAgICAgICAgICAgICAgLy8gW3ZhbF1cbiAgICAgICAgICAgICAgc2Iuc2NvcGUuZ2V0KHNiLCBwcm9wZXJ0eSwgc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lck9wdGlvbnMpLCBuYW1lKTtcbiAgICAgICAgICAgICAgLy8gW25hbWUsIHZhbF1cbiAgICAgICAgICAgICAgc2IuZW1pdFB1c2hTdHJpbmcocHJvcGVydHksIG5hbWUpO1xuICAgICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgICBzYi5lbWl0SGVscGVyKHByb3BlcnR5LCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMucHV0Q29tbW9uU3RvcmFnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgY29uc3QgaGFuZGxlRGVwbG95ID0gKFxuICAgICAgY3VycmVudENvbnRyYWN0SW5mbzogQ29udHJhY3RJbmZvLFxuICAgICAgcHJvcEluZm86IERlcGxveVByb3BJbmZvLFxuICAgICAgaW5uZXJPcHRpb25zOiBWaXNpdE9wdGlvbnMsXG4gICAgICBlbnRyeSA9IHRydWUsXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBkZWNsID0gcHJvcEluZm8uZGVjbDtcbiAgICAgIGNvbnN0IHN1cGVyRGVwbG95ID0gZmluZFN1cGVyRGVwbG95UHJvcEluZm8oY3VycmVudENvbnRyYWN0SW5mbyk7XG5cbiAgICAgIGlmIChkZWNsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgaWYgKHN1cGVyRGVwbG95ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBoYW5kbGVEZXBsb3lQcm9wZXJ0aWVzKGN1cnJlbnRDb250cmFjdEluZm8sIGlubmVyT3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFuZGxlRGVwbG95KHN1cGVyRGVwbG95WzBdLCBzdXBlckRlcGxveVsxXSwgaW5uZXJPcHRpb25zLCBlbnRyeSk7XG4gICAgICAgICAgaGFuZGxlRGVwbG95UHJvcGVydGllcyhjdXJyZW50Q29udHJhY3RJbmZvLCBpbm5lck9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZW50cnkpIHtcbiAgICAgICAgICAvLyBbbnVtYmVyXVxuICAgICAgICAgIHNiLmVtaXRQdXNoSW50KGRlY2wsIDEpO1xuICAgICAgICAgIC8vIFthcmddXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0QXJndW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHNiLndpdGhTY29wZShkZWNsLCBpbm5lck9wdGlvbnMsIChpbm5lcklubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgIHNiLmVtaXRIZWxwZXIoXG4gICAgICAgICAgICBkZWNsLFxuICAgICAgICAgICAgaW5uZXJJbm5lck9wdGlvbnMsXG4gICAgICAgICAgICBzYi5oZWxwZXJzLnBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgICBwYXJhbXM6IHRzVXRpbHMucGFyYW1ldGVyZWQuZ2V0UGFyYW1ldGVycyhkZWNsKSxcbiAgICAgICAgICAgICAgbWFwUGFyYW06IGVudHJ5ID8gY3JlYXRlV3JhcFBhcmFtKHNiKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCBpbnZva2VPcHRpb25zID0gc2IuaGFuZGxlU3VwZXJDb25zdHJ1Y3RPcHRpb25zKFxuICAgICAgICAgICAgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVySW5uZXJPcHRpb25zKSxcbiAgICAgICAgICAgIChleHByLCBfc3VwZXJFeHByLCBpbm5lcklubmVySW5uZXJPcHRpb25zSW4pID0+IHtcbiAgICAgICAgICAgICAgaWYgKHN1cGVyRGVwbG95ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjb25zdCBpbm5lcklubmVySW5uZXJPcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhpbm5lcklubmVySW5uZXJPcHRpb25zSW4pO1xuICAgICAgICAgICAgICAvLyBbYXJnc2Fycl1cbiAgICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihleHByLCBpbm5lcklubmVySW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLmFyZ3MpO1xuICAgICAgICAgICAgICBoYW5kbGVEZXBsb3koc3VwZXJEZXBsb3lbMF0sIHN1cGVyRGVwbG95WzFdLCBpbm5lcklubmVySW5uZXJPcHRpb25zLCBmYWxzZSk7XG4gICAgICAgICAgICAgIGhhbmRsZURlcGxveVByb3BlcnRpZXMoY3VycmVudENvbnRyYWN0SW5mbywgaW5uZXJJbm5lcklubmVyT3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHN1cGVyRGVwbG95ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGhhbmRsZURlcGxveVByb3BlcnRpZXMoY3VycmVudENvbnRyYWN0SW5mbywgaW5uZXJJbm5lck9wdGlvbnMpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIGludm9rZU9wdGlvbnMsIHNiLmhlbHBlcnMuaW52b2tlU21hcnRDb250cmFjdE1ldGhvZCh7IG1ldGhvZDogZGVjbCB9KSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBzYi5lbWl0SGVscGVyKFxuICAgICAgbm9kZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgICBzYi5oZWxwZXJzLmlmKHtcbiAgICAgICAgY29uZGl0aW9uOiAoKSA9PiB7XG4gICAgICAgICAgLy8gW2Jvb2xlYW5dXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcih0aGlzLnByb3BJbmZvLmRlY2wgPT09IHVuZGVmaW5lZCA/IG5vZGUgOiB0aGlzLnByb3BJbmZvLmRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMuaXNEZXBsb3llZCk7XG4gICAgICAgIH0sXG4gICAgICAgIHdoZW5UcnVlOiAoKSA9PiB7XG4gICAgICAgICAgLy8gW2Jvb2xlYW5dXG4gICAgICAgICAgc2IuZW1pdFB1c2hCb29sZWFuKHRoaXMucHJvcEluZm8uZGVjbCA9PT0gdW5kZWZpbmVkID8gdGhpcy5wcm9wSW5mby5jbGFzc0RlY2wgOiB0aGlzLnByb3BJbmZvLmRlY2wsIGZhbHNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgd2hlbkZhbHNlOiAoKSA9PiB7XG4gICAgICAgICAgLy8gW11cbiAgICAgICAgICBoYW5kbGVEZXBsb3kodGhpcy5jb250cmFjdEluZm8sIHRoaXMucHJvcEluZm8sIG9wdGlvbnMpO1xuICAgICAgICAgIC8vIFtdXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcih0aGlzLnByb3BJbmZvLmRlY2wgPT09IHVuZGVmaW5lZCA/IG5vZGUgOiB0aGlzLnByb3BJbmZvLmRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMuc2V0RGVwbG95ZWQpO1xuICAgICAgICAgIC8vIFtib29sZWFuXVxuICAgICAgICAgIHNiLmVtaXRQdXNoQm9vbGVhbih0aGlzLnByb3BJbmZvLmRlY2wgPT09IHVuZGVmaW5lZCA/IHRoaXMucHJvcEluZm8uY2xhc3NEZWNsIDogdGhpcy5wcm9wSW5mby5kZWNsLCB0cnVlKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==