UNPKG

@tovarishfin/hardhat-yul

Version:

Hardhat plugin to develop smart contracts in Yul

159 lines 6.66 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.compileYulp = exports.compileYul = void 0; const source_names_1 = require("hardhat/utils/source-names"); const path_1 = __importDefault(require("path")); const solc_1 = __importDefault(require("solc")); const yulp_1 = __importDefault(require("yulp")); const fs = __importStar(require("fs")); const util_1 = __importDefault(require("util")); async function compileYul(_yulConfig, paths, artifacts) { const files = await getYulSources(paths); const allArtifacts = []; for (const file of files) { const cwdPath = path_1.default.relative(process.cwd(), file); console.log(`Compiling ${cwdPath}...`); const yulOutput = await _compileYul(cwdPath, file); const sourceName = await (0, source_names_1.localPathToSourceName)(paths.root, file); const artifact = getArtifactFromYulOutput(sourceName, yulOutput); await artifacts.saveArtifactAndDebugFile(artifact); allArtifacts.push(Object.assign(Object.assign({}, artifact), { artifacts: [artifact.contractName] })); const artifactsImpl = artifacts; artifactsImpl.addValidArtifacts(allArtifacts); } } exports.compileYul = compileYul; async function compileYulp(_yulConfig, paths, artifacts) { const files = await getYulpSources(paths); const allArtifacts = []; for (const file of files) { const cwdPath = path_1.default.relative(process.cwd(), file); console.log(`Compiling ${cwdPath}...`); const yulOutput = await _compileYulp(cwdPath, file); const sourceName = await (0, source_names_1.localPathToSourceName)(paths.root, file); const artifact = getArtifactFromYulOutput(sourceName, yulOutput); await artifacts.saveArtifactAndDebugFile(artifact); allArtifacts.push(Object.assign(Object.assign({}, artifact), { artifacts: [artifact.contractName] })); const artifactsImpl = artifacts; artifactsImpl.addValidArtifacts(allArtifacts); } } exports.compileYulp = compileYulp; async function getYulSources(paths) { const glob = await Promise.resolve().then(() => __importStar(require("glob"))); const yulFiles = glob.sync(path_1.default.join(paths.sources, "**", "*.yul")); return yulFiles; } async function getYulpSources(paths) { const glob = await Promise.resolve().then(() => __importStar(require("glob"))); const yulpFiles = glob.sync(path_1.default.join(paths.sources, "**", "*.yulp")); return yulpFiles; } function pathToContractName(file) { const sourceName = path_1.default.basename(file); return sourceName.substring(0, sourceName.indexOf(".")); } function getArtifactFromYulOutput(sourceName, output) { const contractName = pathToContractName(sourceName); return { _format: "hh-sol-artifact-1", contractName, sourceName, abi: [], bytecode: output.bytecode, deployedBytecode: output.bytecode_runtime, linkReferences: {}, deployedLinkReferences: {}, }; } async function _compileYul(filepath, filename) { const data = fs.readFileSync(filepath, "utf8"); const output = JSON.parse(solc_1.default.compile(JSON.stringify({ language: "Yul", sources: { "Target.yul": { content: data } }, settings: { outputSelection: { "*": { "*": ["*"], "": ["*"] } }, optimizer: { enabled: true, runs: 0, details: { yul: true, }, }, }, }))); if (output.errors && output.errors.length > 0) { throw new Error(`hardhat-yul: error compiling ${filename}: ${util_1.default.inspect(output, false, null, true)}`); } const contractObjects = Object.keys(output.contracts["Target.yul"]); const bytecode = "0x" + output.contracts["Target.yul"][contractObjects[0]]["evm"]["bytecode"]["object"]; const contractCompiled = { _format: "hh-sol-artifact-1", sourceName: filename, abi: [], bytecode: bytecode, }; return contractCompiled; } async function _compileYulp(filepath, filename) { const data = fs.readFileSync(filepath, "utf8"); const source = yulp_1.default.compile(data); const output = JSON.parse(solc_1.default.compile(JSON.stringify({ language: "Yul", sources: { "Target.yul": { content: yulp_1.default.print(source.results) } }, settings: { outputSelection: { "*": { "*": ["*"], "": ["*"] } }, optimizer: { enabled: true, runs: 0, details: { yul: true, }, }, }, }))); if (output.errors && output.errors.length > 0) { throw new Error(`hardhat-yul: error compiling ${filename}: ${util_1.default.inspect(output, false, null, true)}`); } const contractObjects = Object.keys(output.contracts["Target.yul"]); const bytecode = "0x" + output.contracts["Target.yul"][contractObjects[0]]["evm"]["bytecode"]["object"]; const abi = source.signatures .map((v) => v.abi.slice(4, -1)) .concat(source.topics.map((v) => v.abi.slice(6, -1))); const contractCompiled = { _format: "hh-sol-artifact-1", sourceName: filename, abi: abi, bytecode: bytecode, }; return contractCompiled; } //# sourceMappingURL=compilation.js.map