UNPKG

@nomicfoundation/hardhat-viem

Version:
94 lines 4.58 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; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveBytecodeWithLinkedLibraries = exports.linkBytecode = void 0; const errors_1 = require("./errors"); async function linkBytecode(artifact, libraries) { const { isHex } = await Promise.resolve().then(() => __importStar(require("viem"))); let bytecode = artifact.bytecode; // TODO: measure performance impact for (const { sourceName, libraryName, address } of libraries) { const linkReferences = artifact.linkReferences[sourceName][libraryName]; for (const { start, length } of linkReferences) { bytecode = bytecode.substring(0, 2 + start * 2) + address.substring(2) + bytecode.substring(2 + (start + length) * 2); } } return isHex(bytecode) ? bytecode : `0x${bytecode}`; } exports.linkBytecode = linkBytecode; async function throwOnAmbigousLibraryNameOrUnnecessaryLink(contractName, libraries, neededLibraries) { for (const linkedLibraryName of Object.keys(libraries)) { const matchingLibraries = neededLibraries.filter(({ sourceName, libraryName }) => libraryName === linkedLibraryName || `${sourceName}:${libraryName}` === linkedLibraryName); if (matchingLibraries.length > 1) { throw new errors_1.AmbigousLibraryNameError(contractName, linkedLibraryName, matchingLibraries.map(({ sourceName, libraryName }) => `${sourceName}:${libraryName}`)); } else if (matchingLibraries.length === 0) { throw new errors_1.UnnecessaryLibraryLinkError(contractName, linkedLibraryName); } } } async function throwOnMissingLibrariesAddress(contractName, libraries, neededLibraries) { const missingLibraries = []; for (const { sourceName, libraryName } of neededLibraries) { const address = libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName]; if (address === undefined) { missingLibraries.push({ sourceName, libraryName }); } } if (missingLibraries.length > 0) { throw new errors_1.MissingLibraryAddressError(contractName, missingLibraries); } } async function throwOnOverlappingLibraryNames(contractName, libraries, neededLibraries) { for (const { sourceName, libraryName } of neededLibraries) { if (libraries[`${sourceName}:${libraryName}`] !== undefined && libraries[libraryName] !== undefined) { throw new errors_1.OverlappingLibraryNamesError(sourceName, libraryName); } } } async function resolveBytecodeWithLinkedLibraries(artifact, libraries) { const { linkReferences } = artifact; const neededLibraries = []; for (const [sourceName, sourceLibraries] of Object.entries(linkReferences)) { for (const libraryName of Object.keys(sourceLibraries)) { neededLibraries.push({ sourceName, libraryName, address: libraries[`${sourceName}:${libraryName}`] ?? libraries[libraryName], }); } } await throwOnAmbigousLibraryNameOrUnnecessaryLink(artifact.contractName, libraries, neededLibraries); await throwOnOverlappingLibraryNames(artifact.contractName, libraries, neededLibraries); await throwOnMissingLibrariesAddress(artifact.contractName, libraries, neededLibraries); return linkBytecode(artifact, neededLibraries); } exports.resolveBytecodeWithLinkedLibraries = resolveBytecodeWithLinkedLibraries; //# sourceMappingURL=bytecode.js.map