UNPKG

@neo-one/smart-contract-compiler

Version:

NEO•ONE TypeScript smart contract compiler.

99 lines (97 loc) 15.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const ts_utils_1 = require("@neo-one/ts-utils"); const utils_1 = require("@neo-one/utils"); const typescript_1 = tslib_1.__importDefault(require("typescript")); const Helper_1 = require("../Helper"); const utils_2 = require("./utils"); class HandleNormalHelper extends Helper_1.Helper { constructor({ propInfo, getter }) { super(); this.propInfo = propInfo; this.getter = getter; } emit(sb, node, optionsIn) { const options = sb.pushValueOptions(optionsIn); const propInfo = this.propInfo; if (propInfo.type === 'function') { const { decl, returnType } = propInfo; if (typescript_1.default.isPropertyDeclaration(decl)) { sb.context.reportUnsupported(decl); return; } sb.emitPushInt(decl, 1); sb.emitHelper(decl, options, sb.helpers.getArgument); if (propInfo.claim) { sb.emitOp(decl, 'DUP'); sb.emitSysCall(decl, 'System.ExecutionEngine.GetScriptContainer'); sb.emitOp(decl, 'APPEND'); } sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.parameters({ params: ts_utils_1.tsUtils.parametered.getParameters(decl), mapParam: utils_2.createWrapParam(sb), })); sb.emitHelper(decl, innerOptions, sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitHelper(decl, innerOptions, sb.helpers.unwrapValRecursive({ type: returnType })); }); return; } if (propInfo.type === 'property') { const { decl } = propInfo; sb.emitPushString(decl, propInfo.name); sb.emitHelper(decl, options, sb.helpers.getCommonStorage); sb.emitHelper(decl, options, sb.helpers.unwrapValRecursive({ type: sb.context.analysis.getType(decl) })); return; } if (propInfo.type === 'accessor') { const { propertyType } = propInfo; if (this.getter) { const { getter } = propInfo; if (getter !== undefined) { const { decl } = getter; sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitHelper(decl, innerOptions, sb.helpers.unwrapValRecursive({ type: propertyType })); }); } } else { const { setter } = propInfo; if (setter !== undefined) { const { decl } = setter; sb.emitPushInt(decl, 1); sb.emitHelper(decl, options, sb.helpers.getArgument); sb.withScope(decl, options, (innerOptions) => { sb.emitHelper(decl, innerOptions, sb.helpers.parameters({ params: ts_utils_1.tsUtils.parametered.getParameters(decl), mapParam: utils_2.createWrapParam(sb), })); sb.emitHelper(decl, sb.noPushValueOptions(innerOptions), sb.helpers.invokeSmartContractMethod({ method: decl })); sb.emitPushBuffer(decl, Buffer.alloc(0, 0)); }); } } return; } if (propInfo.type === 'refundAssets') { sb.emitHelper(node, options, sb.helpers.refundAssets); return; } if (propInfo.type === 'completeSend') { sb.emitHelper(node, options, sb.helpers.completeSend); return; } if (propInfo.type === 'deploy') { throw new Error('Something went wrong!'); } if (propInfo.type === 'upgrade') { sb.emitHelper(node, options, sb.helpers.upgrade({ approveUpgrade: propInfo.approveUpgrade })); return; } utils_1.utils.assertNever(propInfo); } } exports.HandleNormalHelper = HandleNormalHelper; //# sourceMappingURL=data:application/json;charset=utf8;base64,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O1lBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsdUJBQXVCLENBQUMsQ0FBQztTQUMxQztRQUVELElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxTQUFTLEVBQUU7WUFDL0IsRUFBRSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsY0FBYyxFQUFFLFFBQVEsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFFOUYsT0FBTztTQUNSO1FBRUQsYUFBSyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QixDQUFDO0NBQ0Y7QUFsSUQsZ0RBa0lDIiwiZmlsZSI6Im5lby1vbmUtc21hcnQtY29udHJhY3QtY29tcGlsZXIvc3JjL2NvbXBpbGUvaGVscGVyL2NvbnRyYWN0L0hhbmRsZU5vcm1hbEhlbHBlci5qcyIsInNvdXJjZXNDb250ZW50IjpbIi8vIHRzbGludDpkaXNhYmxlIHByZWZlci1zd2l0Y2hcbmltcG9ydCB7IHRzVXRpbHMgfSBmcm9tICdAbmVvLW9uZS90cy11dGlscyc7XG5pbXBvcnQgeyB1dGlscyB9IGZyb20gJ0BuZW8tb25lL3V0aWxzJztcbmltcG9ydCB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7IFByb3BJbmZvIH0gZnJvbSAnLi4vLi4vLi4vY29udHJhY3QnO1xuaW1wb3J0IHsgU2NyaXB0QnVpbGRlciB9IGZyb20gJy4uLy4uL3NiJztcbmltcG9ydCB7IFZpc2l0T3B0aW9ucyB9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7IEhlbHBlciB9IGZyb20gJy4uL0hlbHBlcic7XG5pbXBvcnQgeyBjcmVhdGVXcmFwUGFyYW0gfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGludGVyZmFjZSBIYW5kbGVOb3JtYWxIZWxwZXJPcHRpb25zIHtcbiAgcmVhZG9ubHkgcHJvcEluZm86IFByb3BJbmZvO1xuICByZWFkb25seSBnZXR0ZXI/OiBib29sZWFuO1xufVxuXG4vLyBJbnB1dDogW11cbi8vIE91dHB1dDogW3ZhbHVlXVxuZXhwb3J0IGNsYXNzIEhhbmRsZU5vcm1hbEhlbHBlciBleHRlbmRzIEhlbHBlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcHJvcEluZm86IFByb3BJbmZvO1xuICBwcml2YXRlIHJlYWRvbmx5IGdldHRlcj86IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHsgcHJvcEluZm8sIGdldHRlciB9OiBIYW5kbGVOb3JtYWxIZWxwZXJPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnByb3BJbmZvID0gcHJvcEluZm87XG4gICAgdGhpcy5nZXR0ZXIgPSBnZXR0ZXI7XG4gIH1cblxuICBwdWJsaWMgZW1pdChzYjogU2NyaXB0QnVpbGRlciwgbm9kZTogdHMuTm9kZSwgb3B0aW9uc0luOiBWaXNpdE9wdGlvbnMpOiB2b2lkIHtcbiAgICBjb25zdCBvcHRpb25zID0gc2IucHVzaFZhbHVlT3B0aW9ucyhvcHRpb25zSW4pO1xuXG4gICAgY29uc3QgcHJvcEluZm8gPSB0aGlzLnByb3BJbmZvO1xuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHsgZGVjbCwgcmV0dXJuVHlwZSB9ID0gcHJvcEluZm87XG4gICAgICBpZiAodHMuaXNQcm9wZXJ0eURlY2xhcmF0aW9uKGRlY2wpKSB7XG4gICAgICAgIHNiLmNvbnRleHQucmVwb3J0VW5zdXBwb3J0ZWQoZGVjbCk7XG5cbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBbbnVtYmVyXVxuICAgICAgc2IuZW1pdFB1c2hJbnQoZGVjbCwgMSk7XG4gICAgICAvLyBbYXJnXVxuICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLmdldEFyZ3VtZW50KTtcbiAgICAgIGlmIChwcm9wSW5mby5jbGFpbSkge1xuICAgICAgICAvLyBbYXJnLCBhcmddXG4gICAgICAgIHNiLmVtaXRPcChkZWNsLCAnRFVQJyk7XG4gICAgICAgIC8vIFt0cmFuc2FjdGlvbiwgYXJnLCBhcmddXG4gICAgICAgIHNiLmVtaXRTeXNDYWxsKGRlY2wsICdTeXN0ZW0uRXhlY3V0aW9uRW5naW5lLkdldFNjcmlwdENvbnRhaW5lcicpO1xuICAgICAgICAvLyBbYXJnXVxuICAgICAgICBzYi5lbWl0T3AoZGVjbCwgJ0FQUEVORCcpO1xuICAgICAgfVxuICAgICAgc2Iud2l0aFNjb3BlKGRlY2wsIG9wdGlvbnMsIChpbm5lck9wdGlvbnMpID0+IHtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICBkZWNsLFxuICAgICAgICAgIGlubmVyT3B0aW9ucyxcbiAgICAgICAgICBzYi5oZWxwZXJzLnBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgcGFyYW1zOiB0c1V0aWxzLnBhcmFtZXRlcmVkLmdldFBhcmFtZXRlcnMoZGVjbCksXG4gICAgICAgICAgICBtYXBQYXJhbTogY3JlYXRlV3JhcFBhcmFtKHNiKSxcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBpbm5lck9wdGlvbnMsIHNiLmhlbHBlcnMuaW52b2tlU21hcnRDb250cmFjdE1ldGhvZCh7IG1ldGhvZDogZGVjbCB9KSk7XG4gICAgICAgIHNiLmVtaXRIZWxwZXIoZGVjbCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHJldHVyblR5cGUgfSkpO1xuICAgICAgfSk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcEluZm8udHlwZSA9PT0gJ3Byb3BlcnR5Jykge1xuICAgICAgY29uc3QgeyBkZWNsIH0gPSBwcm9wSW5mbztcblxuICAgICAgc2IuZW1pdFB1c2hTdHJpbmcoZGVjbCwgcHJvcEluZm8ubmFtZSk7XG4gICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMuZ2V0Q29tbW9uU3RvcmFnZSk7XG4gICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIG9wdGlvbnMsIHNiLmhlbHBlcnMudW53cmFwVmFsUmVjdXJzaXZlKHsgdHlwZTogc2IuY29udGV4dC5hbmFseXNpcy5nZXRUeXBlKGRlY2wpIH0pKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wSW5mby50eXBlID09PSAnYWNjZXNzb3InKSB7XG4gICAgICBjb25zdCB7IHByb3BlcnR5VHlwZSB9ID0gcHJvcEluZm87XG4gICAgICBpZiAodGhpcy5nZXR0ZXIpIHtcbiAgICAgICAgY29uc3QgeyBnZXR0ZXIgfSA9IHByb3BJbmZvO1xuICAgICAgICBpZiAoZ2V0dGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBjb25zdCB7IGRlY2wgfSA9IGdldHRlcjtcblxuICAgICAgICAgIHNiLndpdGhTY29wZShkZWNsLCBvcHRpb25zLCAoaW5uZXJPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBzYi5lbWl0SGVscGVyKGRlY2wsIGlubmVyT3B0aW9ucywgc2IuaGVscGVycy5pbnZva2VTbWFydENvbnRyYWN0TWV0aG9kKHsgbWV0aG9kOiBkZWNsIH0pKTtcbiAgICAgICAgICAgIHNiLmVtaXRIZWxwZXIoZGVjbCwgaW5uZXJPcHRpb25zLCBzYi5oZWxwZXJzLnVud3JhcFZhbFJlY3Vyc2l2ZSh7IHR5cGU6IHByb3BlcnR5VHlwZSB9KSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHsgc2V0dGVyIH0gPSBwcm9wSW5mbztcbiAgICAgICAgaWYgKHNldHRlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY29uc3QgeyBkZWNsIH0gPSBzZXR0ZXI7XG5cbiAgICAgICAgICAvLyBbbnVtYmVyXVxuICAgICAgICAgIHNiLmVtaXRQdXNoSW50KGRlY2wsIDEpO1xuICAgICAgICAgIC8vIFthcmddXG4gICAgICAgICAgc2IuZW1pdEhlbHBlcihkZWNsLCBvcHRpb25zLCBzYi5oZWxwZXJzLmdldEFyZ3VtZW50KTtcbiAgICAgICAgICBzYi53aXRoU2NvcGUoZGVjbCwgb3B0aW9ucywgKGlubmVyT3B0aW9ucykgPT4ge1xuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgZGVjbCxcbiAgICAgICAgICAgICAgaW5uZXJPcHRpb25zLFxuICAgICAgICAgICAgICBzYi5oZWxwZXJzLnBhcmFtZXRlcnMoe1xuICAgICAgICAgICAgICAgIHBhcmFtczogdHNVdGlscy5wYXJhbWV0ZXJlZC5nZXRQYXJhbWV0ZXJzKGRlY2wpLFxuICAgICAgICAgICAgICAgIG1hcFBhcmFtOiBjcmVhdGVXcmFwUGFyYW0oc2IpLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBbXVxuICAgICAgICAgICAgc2IuZW1pdEhlbHBlcihcbiAgICAgICAgICAgICAgZGVjbCxcbiAgICAgICAgICAgICAgc2Iubm9QdXNoVmFsdWVPcHRpb25zKGlubmVyT3B0aW9ucyksXG4gICAgICAgICAgICAgIHNiLmhlbHBlcnMuaW52b2tlU21hcnRDb250cmFjdE1ldGhvZCh7IG1ldGhvZDogZGVjbCB9KSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvLyBbYnVmZmVyXVxuICAgICAgICAgICAgc2IuZW1pdFB1c2hCdWZmZXIoZGVjbCwgQnVmZmVyLmFsbG9jKDAsIDApKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICdyZWZ1bmRBc3NldHMnKSB7XG4gICAgICBzYi5lbWl0SGVscGVyKG5vZGUsIG9wdGlvbnMsIHNiLmhlbHBlcnMucmVmdW5kQXNzZXRzKTtcblxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChwcm9wSW5mby50eXBlID09PSAnY29tcGxldGVTZW5kJykge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLmNvbXBsZXRlU2VuZCk7XG5cbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAocHJvcEluZm8udHlwZSA9PT0gJ2RlcGxveScpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignU29tZXRoaW5nIHdlbnQgd3JvbmchJyk7XG4gICAgfVxuXG4gICAgaWYgKHByb3BJbmZvLnR5cGUgPT09ICd1cGdyYWRlJykge1xuICAgICAgc2IuZW1pdEhlbHBlcihub2RlLCBvcHRpb25zLCBzYi5oZWxwZXJzLnVwZ3JhZGUoeyBhcHByb3ZlVXBncmFkZTogcHJvcEluZm8uYXBwcm92ZVVwZ3JhZGUgfSkpO1xuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdXRpbHMuYXNzZXJ0TmV2ZXIocHJvcEluZm8pO1xuICB9XG59XG4iXX0=