UNPKG

@rsksmart/rsk-cli

Version:

CLI tool for Rootstock network using Viem

105 lines (104 loc) 3.76 kB
import { isAddress } from "viem"; import chalk from "chalk"; import { ZERO_ADDRESS } from "./constants.js"; import { validateAndFormatAddressRSK } from "./index.js"; function logMessage(isExternal, message, color = chalk.white) { if (!isExternal) { console.log(color(message)); } } function logError(isExternal, message) { logMessage(isExternal, `❌ ${message}`, chalk.red); } function logWarning(isExternal, message) { logMessage(isExternal, message, chalk.yellow); } function logSuccess(isExternal, message) { logMessage(isExternal, message, chalk.green); } export function isRNSDomain(input) { if (input.endsWith(".rsk")) { const domainName = input.replace(".rsk", ""); return domainName.length >= 5 && /^[a-z0-9-]+$/i.test(domainName); } if (!input.startsWith("0x") && !input.includes(".")) { return input.length >= 5 && /^[a-z0-9-]+$/i.test(input); } return false; } async function getResolver() { const RNSResolverModule = await import("@rsksmart/rns-resolver.js"); return RNSResolverModule.default.default || RNSResolverModule.default; } export async function resolveRNSToAddress(params) { try { let name = params.name; if (!name.endsWith(".rsk")) { name = name + ".rsk"; } const Resolver = await getResolver(); const resolver = params.testnet ? Resolver.forRskTestnet({}) : Resolver.forRskMainnet({}); const resolvedAddress = await resolver.addr(name); if (!resolvedAddress || resolvedAddress === ZERO_ADDRESS) { logWarning(params.isExternal, `⚠️ No address found for ${name}`); return null; } const formatted = validateAndFormatAddressRSK(resolvedAddress, !!params.testnet); if (!formatted) { logError(params.isExternal, `Failed to validate resolved address for ${name}`); return null; } logSuccess(params.isExternal, `✅ Resolved ${name} to ${formatted}`); return formatted; } catch (error) { logError(params.isExternal, `Failed to resolve RNS name: ${params.name}`); if (error instanceof Error && !params.isExternal) { logWarning(params.isExternal, error.message); } return null; } } export async function resolveAddressToRNS(params) { try { const Resolver = await getResolver(); const resolver = params.testnet ? Resolver.forRskTestnet({}) : Resolver.forRskMainnet({}); const resolverName = await resolver.reverse(params.address); if (resolverName && resolverName !== "") { logSuccess(params.isExternal, `✅ Resolved ${params.address} to ${resolverName}`); return resolverName; } return null; } catch (error) { logError(params.isExternal, `Failed to reverse resolve address: ${params.address}`); if (error instanceof Error && !params.isExternal) { logWarning(params.isExternal, error.message); } return null; } } export async function resolveToAddress(params) { if (params.input.startsWith("0x") && params.input.length === 42) { if (isAddress(params.input)) { return params.input; } else { logError(params.isExternal, "Invalid address format"); return null; } } if (isRNSDomain(params.input)) { return await resolveRNSToAddress({ name: params.input, testnet: params.testnet, isExternal: params.isExternal }); } logError(params.isExternal, "Input is neither a valid address nor an RNS domain"); return null; }