UNPKG

@xtools-at/hardhat-sourcify

Version:

Improved fork of zoey-t's Sourcify contract verification plugin for Hardhat

125 lines 4.9 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.submitSourcesToSourcify = void 0; /* eslint-disable @typescript-eslint/no-explicit-any */ const axios_1 = __importDefault(require("axios")); const form_data_1 = __importDefault(require("form-data")); const contract_names_1 = require("hardhat/utils/contract-names"); const stream_1 = require("stream"); const DEFAULT_ENDPOINT = "https://sourcify.dev/server/"; function log(...args) { console.log(...args); } function logError(...args) { console.error("ERROR: ", ...args); } function ensureTrailingSlash(s) { if (s.endsWith("/")) { s += "/"; } return s; } function inferFullyQualifiedName(contractName, fullPath, path) { let source = ''; if (fullPath) { source = fullPath; } else { source = `contracts/${path || ''}`; if (!source.endsWith(".sol")) { source += `${source.endsWith("/") ? "" : "/"}${contractName}.sol`; } } return { fullName: (0, contract_names_1.getFullyQualifiedName)(source, contractName), sourceName: source, }; } async function submitSourcesToSourcify(hre, config) { config = config || {}; // get config const chainId = config.chainId || hre.network.config.chainId; let { contract, fullPath, path, address } = config; // legacy fallback if (config.contractName) { contract = config.contractName; } if (config.sourceName) { fullPath = config.sourceName; } if (!contract) { logError("Please pass in the name of your contract using the `contract` parameter"); return; } const url = config.endpoint ? ensureTrailingSlash(config.endpoint) : DEFAULT_ENDPOINT; if ((path && fullPath)) { logError("Please use either the `path` or the `full-path` parameter"); return; } const { fullName, sourceName } = inferFullyQualifiedName(contract, fullPath, path); log(`Verifying source code for contract "${contract}" located at [${sourceName}], deployed to [${address}] on chain id [${chainId}]...`); async function submit() { // get chosenContract (contract index in hardhat metadata file) const buildInfo = await hre.artifacts.getBuildInfo(fullName); // get contract index from output of build info let index; if (buildInfo) { index = Object.keys(buildInfo.output.contracts).indexOf(sourceName); } else { // throw error logError("Contract not found"); return; } const metadataString = JSON.stringify(buildInfo); try { const checkResponse = await axios_1.default.get(`${url}checkByAddresses?addresses=${address.toLowerCase()}&chainIds=${chainId}`); const { data: checkData } = checkResponse; if (checkData[0].status === "perfect" || checkData[0].status === "partial") { log(`Already verified: "${contract}" [${address}], skipping. Status = ${checkData[0].status}`); return; } } catch (e) { logError("Verification status check failed"); logError((e.response && JSON.stringify(e.response.data)) || e); } if (!metadataString) { logError(`Contract ${contract} was deployed without saving metadata. Cannot submit to sourcify, skipping.`); return; } const formData = new form_data_1.default(); formData.append("address", address); formData.append("chain", chainId); formData.append("chosenContract", index); const fileStream = new stream_1.Readable(); fileStream.push(metadataString); fileStream.push(null); formData.append("files", fileStream, "metadata.json"); try { const submissionResponse = await axios_1.default.post(url, formData, { headers: formData.getHeaders(), }); const result = submissionResponse.data.result[0]; const status = result.status; if (status === "perfect" || status === "partial") { log(`SUCCESS: => contract ${contract} is now verified, verification status = ${status}`); } else { logError(` => contract ${contract} is NOT verified, result = ${JSON.stringify(result, null, 2)}`); } } catch (e) { logError(` => contract ${contract} is NOT verified`); logError((e.response && JSON.stringify(e.response.data, null, 2)) || e); } } await submit(); } exports.submitSourcesToSourcify = submitSourcesToSourcify; //# sourceMappingURL=sourcify.js.map