UNPKG

@newos/cli

Version:
104 lines 6.19 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const lodash_1 = require("lodash"); const NetworkFile_1 = __importDefault(require("../models/files/NetworkFile")); const push_1 = __importDefault(require("./push")); const update_1 = __importDefault(require("../scripts/update")); const contract_1 = require("../utils/contract"); const migrations_1 = require("../prompts/migrations"); const ConfigManager_1 = __importDefault(require("../models/config/ConfigManager")); const prompt_1 = require("../prompts/prompt"); const method_params_1 = __importDefault(require("../prompts/method-params")); const telemetry_1 = __importDefault(require("../telemetry")); const interfaces_1 = require("../scripts/interfaces"); const ProjectFile_1 = __importDefault(require("../models/files/ProjectFile")); const name = 'upgrade'; const signature = `${name} [contract-or-address]`; const description = 'upgrade contract to a new logic. Provide the [contract] or [package]/[contract] you added your contract with, its [address], or use --all flag to upgrade all contracts in your project.'; const register = program => program .command(signature, undefined, { noHelp: true }) .alias('update') .usage('[contract-or-address] --network <network> [options]') .description(description) .option('--init [function]', `call function after upgrading contract. If no name is given, 'initialize' will be used`) .option('--args <arg1, arg2, ...>', 'provide initialization arguments for your contract if required') .option('--all', 'upgrade all contracts in the application') .option('--force', 'ignore contracts validation errors') .withNetworkOptions() .withSkipCompileOption() .withNonInteractiveOption() .action(commandActions); async function commandActions(proxyReference, options) { const { network: promptedNetwork } = await prompt_1.promptForNetwork(options, () => getCommandProps()); const { network, txParams } = await ConfigManager_1.default.initNetworkConfiguration(Object.assign(Object.assign({}, options), { network: promptedNetwork })); await action(proxyReference, Object.assign(Object.assign({}, options), { network, txParams, promptedNetwork })); if (!options.dontExitProcess && process.env.NODE_ENV !== 'test') process.exit(0); } async function action(proxyReference, options) { var _a; const { network, txParams, force, interactive, all, init: rawInitMethod } = options; if (!(await migrations_1.hasToMigrateProject(network))) process.exit(0); const promptedProxyInfo = await promptForProxies(proxyReference, network, options); const parsedContractReference = contract_1.parseContractReference(promptedProxyInfo.proxyReference); const additionalOpts = { askForMethodParams: rawInitMethod, askForMethodParamsMessage: 'Call a function on the instance after upgrading it?', }; const initMethodParams = promptedProxyInfo.proxyReference && !promptedProxyInfo.all ? await method_params_1.default(promptedProxyInfo.contractFullName, options, additionalOpts) : {}; const args = lodash_1.pickBy(Object.assign(Object.assign({ all: promptedProxyInfo.all, force }, parsedContractReference), initMethodParams)); const projectFile = new ProjectFile_1.default(); const networkFile = new NetworkFile_1.default(projectFile, network); const proxies = networkFile.getProxies({ package: (_a = parsedContractReference.packageName) !== null && _a !== void 0 ? _a : (parsedContractReference.contractName && projectFile.name), contractName: parsedContractReference.contractName, address: parsedContractReference.proxyAddress, kind: interfaces_1.ProxyType.Upgradeable, }); await push_1.default.runActionIfNeeded(lodash_1.uniq(proxies.map(proxy => proxy.contractName)), Object.assign(Object.assign({}, options), { network: options.promptedNetwork })); await telemetry_1.default.report('update', Object.assign(Object.assign({}, args), { network, txParams }), interactive); await update_1.default(Object.assign(Object.assign({}, args), { network, txParams })); } async function promptForProxies(proxyReference, network, options) { const { all, interactive } = options; const pickProxyBy = all ? 'all' : undefined; const args = { pickProxyBy, proxy: proxyReference }; const props = getCommandProps({ proxyReference, network, all }); const { pickProxyBy: promptedPickProxyBy, proxy: promptedProxy } = await prompt_1.promptIfNeeded({ args, props }, interactive); return Object.assign(Object.assign({}, promptedProxy), { all: promptedPickProxyBy === 'all' }); } function getCommandProps({ proxyReference, network, all } = {}) { return Object.assign(Object.assign({}, prompt_1.networksList('network', 'list')), { pickProxyBy: { message: 'Which instances would you like to upgrade?', type: 'list', choices: [ { name: 'All instances', value: 'all', }, { name: 'Choose by name', value: 'byName', }, { name: 'Choose by address', value: 'byAddress', }, ], when: () => !proxyReference && prompt_1.proxiesList('byAddress', network, { kind: interfaces_1.ProxyType.Upgradeable }).length, }, proxy: { message: 'Pick an instance to upgrade', type: 'list', choices: ({ pickProxyBy }) => prompt_1.proxiesList(pickProxyBy, network, { kind: interfaces_1.ProxyType.Upgradeable }), when: ({ pickProxyBy }) => !all && pickProxyBy && pickProxyBy !== 'all', normalize: input => (typeof input !== 'object' ? prompt_1.proxyInfo(contract_1.parseContractReference(input), network) : input), } }); } exports.default = { name, signature, description, register, action }; //# sourceMappingURL=update.js.map