@ethereum-sourcify/compilers
Version:
Wrapper around multiple compilers to download the right version and invoke the compilation with a common interface.
158 lines • 12.2 kB
JavaScript
;
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);
if (!vyperPath) {
throw new Error('Vyper path not found. Maybe an incorrect version was provided.');
}
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) {
const error = new Error('Compiler error:\n ' + JSON.stringify(errorMessages));
(0, logger_1.logError)(error.message);
throw error;
}
return compiledJSON;
}
async function getVyperExecutable(vyperRepoPath, platform, version) {
const fileName = `vyper.${version}.${platform}`;
const vyperPath = path_1.default.join(vyperRepoPath, fileName);
if (fs_1.default.existsSync(vyperPath) && validateVyperPath(vyperPath)) {
(0, logger_1.logDebug)('Found vyper binary', {
version,
vyperPath,
platform,
});
return vyperPath;
}
(0, logger_1.logDebug)('Downloading vyper', {
version,
vyperPath,
platform,
});
const success = await fetchAndSaveVyper(platform, vyperPath, version, fileName);
if (success) {
(0, logger_1.logDebug)('Downloaded vyper', {
version,
vyperPath,
platform,
});
}
if (success && !validateVyperPath(vyperPath)) {
(0, logger_1.logError)('Cannot validate vyper', {
version,
vyperPath,
platform,
});
return null;
}
return success ? vyperPath : null;
}
function validateVyperPath(vyperPath) {
var _a;
// TODO: Handle nodejs only dependencies
const spawned = (0, child_process_1.spawnSync)(vyperPath, ['--version']);
if (spawned.status === 0) {
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 true;
}
else {
(0, logger_1.logWarn)('Failed fetching vyper', { version, platform, vyperPath });
}
return false;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnlwZXJDb21waWxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdnlwZXJDb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWFBLDhDQWNDO0FBV0QsNENBMkRDO0FBRUQsZ0RBMkNDO0FBOUlELHdDQUF3QztBQUN4QyxnREFBd0I7QUFDeEIsNENBQW9CO0FBQ3BCLGlEQUEwQztBQUMxQyxxQ0FBdUQ7QUFDdkQsc0NBQWlFO0FBTWpFLE1BQU0sZUFBZSxHQUFHLHVEQUF1RCxDQUFDO0FBRWhGLFNBQWdCLGlCQUFpQjtJQUMvQixJQUNFLE9BQU8sQ0FBQyxRQUFRLEtBQUssUUFBUTtRQUM3QixDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQ3BELENBQUM7UUFDRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBQ0QsSUFBSSxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDO1FBQzNELE9BQU8sT0FBTyxDQUFDO0lBQ2pCLENBQUM7SUFDRCxJQUFJLE9BQU8sQ0FBQyxRQUFRLEtBQUssT0FBTyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssS0FBSyxFQUFFLENBQUM7UUFDM0QsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUNEOzs7Ozs7OztHQVFHO0FBRUksS0FBSyxVQUFVLGdCQUFnQixDQUNwQyxhQUFxQixFQUNyQixPQUFlLEVBQ2YsY0FBOEI7O0lBRTlCLE1BQU0sYUFBYSxHQUFHLGlCQUFpQixFQUFFLENBQUM7SUFDMUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztJQUM3RCxDQUFDO0lBRUQsTUFBTSxTQUFTLEdBQUcsTUFBTSxrQkFBa0IsQ0FDeEMsYUFBYSxFQUNiLGFBQWEsRUFDYixPQUFPLENBQ1IsQ0FBQztJQUVGLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNmLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0VBQWdFLENBQ2pFLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxRQUE0QixDQUFDO0lBQ2pDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN4RCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNwQyxJQUFJLENBQUM7UUFDSCxRQUFRLEdBQUcsTUFBTSxJQUFBLGtCQUFTLEVBQ3hCLEdBQUcsU0FBUyxrQkFBa0IsRUFDOUIsZ0JBQWdCLEVBQ2hCLEdBQUcsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUNsQixDQUFDO0lBQ0osQ0FBQztJQUFDLE9BQU8sS0FBVSxFQUFFLENBQUM7UUFDcEIsSUFBSSxDQUFBLEtBQUssYUFBTCxLQUFLLHVCQUFMLEtBQUssQ0FBRSxJQUFJLE1BQUssU0FBUyxFQUFFLENBQUM7WUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFBLGdCQUFPLEVBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sS0FBSyxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztJQUNsQyxJQUFBLGdCQUFPLEVBQUMsbUNBQW1DLEVBQUU7UUFDM0MsUUFBUSxFQUFFLE9BQU87UUFDakIsUUFBUSxFQUFFLGNBQWMsR0FBRyxnQkFBZ0I7S0FDNUMsQ0FBQyxDQUFDO0lBRUgsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO1FBQ2QsTUFBTSxJQUFJLEtBQUssQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQ3RFLENBQUM7SUFDRCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzFDLE1BQU0sYUFBYSxHQUFHLE1BQUEsWUFBWSxhQUFaLFlBQVksdUJBQVosWUFBWSxDQUFFLE1BQU0sMENBQUUsTUFBTSxDQUNoRCxDQUFDLENBQU0sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQ25DLENBQUM7SUFDRixJQUFJLGFBQWEsSUFBSSxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQzlDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUNyQixvQkFBb0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxDQUNyRCxDQUFDO1FBQ0YsSUFBQSxpQkFBUSxFQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN4QixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7SUFDRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRU0sS0FBSyxVQUFVLGtCQUFrQixDQUN0QyxhQUFxQixFQUNyQixRQUFnQixFQUNoQixPQUFlO0lBRWYsTUFBTSxRQUFRLEdBQUcsU0FBUyxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7SUFDaEQsTUFBTSxTQUFTLEdBQUcsY0FBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsSUFBSSxZQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0QsSUFBQSxpQkFBUSxFQUFDLG9CQUFvQixFQUFFO1lBQzdCLE9BQU87WUFDUCxTQUFTO1lBQ1QsUUFBUTtTQUNULENBQUMsQ0FBQztRQUNILE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxJQUFBLGlCQUFRLEVBQUMsbUJBQW1CLEVBQUU7UUFDNUIsT0FBTztRQUNQLFNBQVM7UUFDVCxRQUFRO0tBQ1QsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLEdBQUcsTUFBTSxpQkFBaUIsQ0FDckMsUUFBUSxFQUNSLFNBQVMsRUFDVCxPQUFPLEVBQ1AsUUFBUSxDQUNULENBQUM7SUFDRixJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQ1osSUFBQSxpQkFBUSxFQUFDLGtCQUFrQixFQUFFO1lBQzNCLE9BQU87WUFDUCxTQUFTO1lBQ1QsUUFBUTtTQUNULENBQUMsQ0FBQztJQUNMLENBQUM7SUFDRCxJQUFJLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7UUFDN0MsSUFBQSxpQkFBUSxFQUFDLHVCQUF1QixFQUFFO1lBQ2hDLE9BQU87WUFDUCxTQUFTO1lBQ1QsUUFBUTtTQUNULENBQUMsQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztBQUNwQyxDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxTQUFpQjs7SUFDMUMsd0NBQXdDO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUEseUJBQVMsRUFBQyxTQUFTLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ3BELElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN6QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxNQUFNLEtBQUssR0FDVCxDQUFBLE1BQUEsT0FBTyxhQUFQLE9BQU8sdUJBQVAsT0FBTyxDQUFFLEtBQUssMENBQUUsT0FBTztRQUN2QixPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtRQUN6Qix1RUFBdUUsQ0FBQztJQUUxRSxJQUFBLGdCQUFPLEVBQUMsS0FBSyxDQUFDLENBQUM7SUFDZixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDs7R0FFRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDOUIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsT0FBZSxFQUNmLFFBQWdCO0lBRWhCLE1BQU0sa0JBQWtCLEdBQUcsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDeEQsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sY0FBYyxHQUFHLEdBQUcsZUFBZSxJQUFJLG9CQUFvQixJQUFJLGtCQUFrQixFQUFFLENBQUM7SUFDMUYsSUFBQSxpQkFBUSxFQUFDLGdCQUFnQixFQUFFO1FBQ3pCLE9BQU87UUFDUCxRQUFRO1FBQ1IsU0FBUztRQUNULGNBQWM7S0FDZixDQUFDLENBQUM7SUFDSCxNQUFNLEdBQUcsR0FBRyxNQUFNLElBQUEseUJBQWdCLEVBQUMsY0FBYyxDQUFDLENBQUM7SUFDbkQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUMxQixNQUFNLE1BQU0sR0FBRyxNQUFNLEdBQUcsQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUV2QyxJQUFJLE1BQU0sS0FBSyxHQUFHLElBQUksTUFBTSxFQUFFLENBQUM7UUFDN0IsSUFBQSxpQkFBUSxFQUFDLGVBQWUsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztRQUM1RCxZQUFFLENBQUMsU0FBUyxDQUFDLGNBQUksQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUzRCxJQUFJLENBQUM7WUFDSCxZQUFFLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO1lBQ1osU0FBUyxDQUFDO1FBQ1osQ0FBQztRQUNELFlBQUUsQ0FBQyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7UUFFbkUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO1NBQU0sQ0FBQztRQUNOLElBQUEsZ0JBQU8sRUFBQyx1QkFBdUIsRUFBRSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUNyRSxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDIn0=