filfox-verifier
Version:
CLI tool for verifying smart contracts on Filfox from foundry and hardhat projects
109 lines âĸ 5.14 kB
JavaScript
;
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