@rsksmart/rsk-cli
Version:
CLI tool for Rootstock network using Viem
105 lines (104 loc) • 3.76 kB
JavaScript
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;
}