UNPKG

filfox-verifier

Version:

CLI tool for verifying smart contracts on Filfox from foundry and hardhat projects

109 lines â€ĸ 5.14 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.verifyFilfoxCommand = void 0; const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const ora_1 = __importDefault(require("ora")); const FoundryProject_1 = require("../services/FoundryProject"); const filfox_verifier_1 = require("../services/filfox-verifier"); exports.verifyFilfoxCommand = new commander_1.Command() .name("forge") .description("Verify a smart contract on Filfox using Foundry") .argument("<address>", "Contract address to verify") .argument("<contract>", "Contract path in format src/Contract.sol:ContractName") .option("--chain <chainId>", "Chain ID (314: Filecoin Mainnet, 314159: Filecoin Calibration Testnet)") .option("--root <path>", "Project root directory", process.cwd()) .action(async (address, contract, options) => { // Validate chainId const validChainIds = ["314", "314159"]; if (!validChainIds.includes(options.chain)) { console.error(chalk_1.default.red(`Invalid chain ID: ${options.chain}`)); console.error(chalk_1.default.yellow("Valid options:")); console.error(chalk_1.default.yellow(" 314 - Filecoin Mainnet")); console.error(chalk_1.default.yellow(" 314159 - Filecoin Calibration Testnet")); process.exit(1); } const spinner = (0, ora_1.default)("Starting verification process...").start(); try { const [contractPath, contractName] = contract.split(":"); if (!contractPath || !contractName) { throw new Error("Contract must be in format src/Contract.sol:ContractName"); } spinner.text = "Loading Foundry project...\n\n"; const project = new FoundryProject_1.FoundryProject(options.root); await project.initialize(); spinner.text = "Compiling contract and extracting metadata...\n\n"; const compilationResult = await project.compile(contractPath, contractName); spinner.text = "Preparing verification request...\n\n"; const verifier = new filfox_verifier_1.FilfoxVerifier(options.chain); spinner.text = "Verifying contract on Filfox...\n\n"; const result = await verifier.verify({ address, language: "Solidity", compiler: compilationResult.metadata.compiler.version, optimize: compilationResult.metadata.settings.optimizer.enabled, optimizeRuns: compilationResult.metadata.settings.optimizer.runs, sourceFiles: Object.fromEntries(Object.entries(compilationResult.sourceFiles).map(([filePath, content]) => [filePath, { content }])), license: "", evmVersion: compilationResult.metadata.settings.evmVersion, viaIR: compilationResult.metadata.settings.viaIR, libraries: "", metadata: compilationResult.metadata, optimizerDetails: "{}", }); console.log(chalk_1.default.cyanBright("Verification Result:\n\n")); handleVerificationResult(result, options.chain, address, spinner); } catch (error) { spinner.fail(chalk_1.default.red("Verification failed\n\n")); console.error(error); process.exit(1); } }); /** * Handles and displays verification results */ const handleVerificationResult = (result, chainId, address, spinner) => { const explorerUrls = { 314159: "https://calibration.filfox.info/en/address/", 314: "https://filfox.info/en/address/", }; const explorerUrl = explorerUrls[chainId]; switch (result.errorCode) { case 0: spinner.succeed(`✅ Contract "${result.contractName}" verified successfully!`); spinner.succeed(`🔗 View at: ${explorerUrl}${address}`); break; case 1: spinner.fail("âš ī¸ Error: No source file provided."); break; case 2: spinner.fail("âš ī¸ Error: Contract initCode not found."); break; case 3: spinner.fail("âš ī¸ Error: Compiler version format incorrect."); spinner.fail("💡 Use long format (e.g., v0.7.6+commit.7338295f)"); break; case 4: spinner.fail("âš ī¸ Error: Verification failed - bytecode mismatch."); spinner.fail("💡 Check source files and compiler settings."); break; case 5: spinner.fail("âš ī¸ Error: Unsupported language (Solidity only)."); break; case 6: spinner.succeed(`â„šī¸ Contract already verified at: ${explorerUrl}${address}`); break; case 7: spinner.fail("âš ī¸ Compilation error in source files."); spinner.fail(`📝 Details: ${result.errorMsg}`); break; default: spinner.fail("âš ī¸ Unknown verification error occurred."); break; } }; //# sourceMappingURL=verify-filfox.js.map