UNPKG

@ethereum-sourcify/compilers

Version:

Wrapper around multiple compilers to download the right version and invoke the compilation with a common interface.

149 lines 11.7 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.findVyperPlatform = findVyperPlatform; exports.useVyperCompiler = useVyperCompiler; exports.getVyperExecutable = getVyperExecutable; // TODO: Handle nodejs only dependencies const path_1 = __importDefault(require("path")); const fs_1 = __importDefault(require("fs")); const child_process_1 = require("child_process"); const common_1 = require("./common"); const logger_1 = require("../logger"); const HOST_VYPER_REPO = 'https://github.com/vyperlang/vyper/releases/download/'; function findVyperPlatform() { if (process.platform === 'darwin' && (process.arch === 'x64' || process.arch === 'arm64')) { return 'darwin'; } if (process.platform === 'linux' && process.arch === 'x64') { return 'linux'; } if (process.platform === 'win32' && process.arch === 'x64') { return 'windows.exe'; } return false; } /** * Searches for a vyper compiler: first for a local executable version, then from HOST_VYPER_REPO * Once the compiler is retrieved, it is used, and the stringified vyper output is returned. * * @param version the version of vyper to be used for compilation * @param input a JSON object of the standard-json format compatible with vyper * @param log the logger * @returns stringified vyper output */ async function useVyperCompiler(vyperRepoPath, version, vyperJsonInput) { var _a; const vyperPlatform = findVyperPlatform(); if (!vyperPlatform) { throw new Error('Vyper is not supported on this machine.'); } const vyperPath = await getVyperExecutable(vyperRepoPath, vyperPlatform, version); let compiled; const inputStringified = JSON.stringify(vyperJsonInput); const startCompilation = Date.now(); try { compiled = await (0, common_1.asyncExec)(`${vyperPath} --standard-json`, inputStringified, 250 * 1024 * 1024); } catch (error) { if ((error === null || error === void 0 ? void 0 : error.code) === 'ENOBUFS') { throw new Error('Compilation output size too large'); } (0, logger_1.logWarn)(error.message); throw error; } const endCompilation = Date.now(); (0, logger_1.logInfo)('Local compiler - Compilation done', { compiler: 'vyper', timeInMs: endCompilation - startCompilation, }); if (!compiled) { throw new Error('Compilation failed. No output from the compiler.'); } const compiledJSON = JSON.parse(compiled); const errorMessages = (_a = compiledJSON === null || compiledJSON === void 0 ? void 0 : compiledJSON.errors) === null || _a === void 0 ? void 0 : _a.filter((e) => e.severity === 'error'); if (errorMessages && errorMessages.length > 0) { (0, logger_1.logError)('Compiler error', { errorMessages, }); throw new common_1.CompilerError('Compiler error', errorMessages); } return compiledJSON; } async function getVyperExecutable(vyperRepoPath, platform, version) { const fileName = `vyper.${version}.${platform}`; const vyperPath = path_1.default.join(vyperRepoPath, fileName); if (validateVyperPath(vyperPath)) { return vyperPath; } await fetchAndSaveVyper(platform, vyperPath, version, fileName); // Validate the vyper path if (!validateVyperPath(vyperPath)) { throw new Error(`Vyper not found. Maybe an incorrect version was provided. ${vyperPath} - ${version} - ${platform}`); } return vyperPath; } function validateVyperPath(vyperPath) { var _a; if (!fs_1.default.existsSync(vyperPath)) { (0, logger_1.logDebug)('Vyper binary not found', { vyperPath, }); return false; } // TODO: Handle nodejs only dependencies const spawned = (0, child_process_1.spawnSync)(vyperPath, ['--version']); if (spawned.status === 0) { (0, logger_1.logDebug)('Found vyper binary', { vyperPath, }); return true; } const error = ((_a = spawned === null || spawned === void 0 ? void 0 : spawned.error) === null || _a === void 0 ? void 0 : _a.message) || spawned.stderr.toString() || 'Error running vyper, are you on the right platform? (e.g. x64 vs arm)'; (0, logger_1.logWarn)(error); return false; } /** * Fetches a vyper binary and saves it to the given path. */ async function fetchAndSaveVyper(platform, vyperPath, version, fileName) { const encodedURIFilename = encodeURIComponent(fileName); const versionWithoutCommit = version.split('+')[0]; const githubVyperURI = `${HOST_VYPER_REPO}v${versionWithoutCommit}/${encodedURIFilename}`; (0, logger_1.logDebug)('Fetching vyper', { version, platform, vyperPath, githubVyperURI, }); const res = await (0, common_1.fetchWithBackoff)(githubVyperURI); const status = res.status; const buffer = await res.arrayBuffer(); if (status === 200 && buffer) { (0, logger_1.logDebug)('Fetched vyper', { version, platform, vyperPath }); fs_1.default.mkdirSync(path_1.default.dirname(vyperPath), { recursive: true }); try { fs_1.default.unlinkSync(vyperPath); } catch (_e) { undefined; } fs_1.default.writeFileSync(vyperPath, new DataView(buffer), { mode: 0o755 }); return; } else { (0, logger_1.logError)('Failed fetching vyper', { version, platform, vyperPath, githubVyperURI, }); throw new Error(`Failed fetching vyper ${version} for platform ${platform}. Please check if the version is valid.`); } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnlwZXJDb21waWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdnlwZXJDb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWFBLDhDQWNDO0FBV0QsNENBb0RDO0FBRUQsZ0RBbUJDO0FBL0dELHdDQUF3QztBQUN4QyxnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLGlEQUEwQztBQUMxQyxxQ0FBc0U7QUFDdEUsc0NBQWlFO0FBTWpFLE1BQU0sZUFBZSxHQUFHLHVEQUF1RCxDQUFDO0FBRWhGLFNBQWdCLGlCQUFpQjtJQUMvQixJQUNFLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUTtRQUM3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQ3BELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDM0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNEOzs7Ozs7OztHQVFHO0FBRUksS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxhQUFxQixFQUNyQixPQUFlLEVBQ2YsY0FBOEI7O0lBRTlCLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxTQUFT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