@tovarishfin/hardhat-yul
Version:
Hardhat plugin to develop smart contracts in Yul
159 lines • 6.66 kB
JavaScript
;
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