import { HyperionClient } from './hyperion-client.js';
import { WalletManager } from './wallet-manager.js';
import {
CreateWalletParams,
ImportWalletParams,
GetBalanceParams,
SendTransactionParams,
GetTransactionParams,
GetBlockParams,
CallContractParams,
SendContractTransactionParams,
EstimateGasParams,
DeployERC20Params,
GetTokenInfoParams,
MintTokensParams,
} from './types.js';
export class ToolHandlers {
constructor(
private hyperionClient: HyperionClient,
private walletManager: WalletManager
) {}
public async handleCreateWallet(params: CreateWalletParams) {
const walletInfo = this.walletManager.createWallet(params.name);
return {
content: [
{
type: 'text',
text: `Wallet created successfully!\n\nAddress: ${walletInfo.address}\nMnemonic: ${walletInfo.mnemonic}\n\n⚠️ IMPORTANT: Save your mnemonic phrase securely. It's the only way to recover your wallet!`,
},
],
};
}
public async handleImportWallet(params: ImportWalletParams) {
const walletInfo = this.walletManager.importWallet(
params.privateKey,
params.mnemonic,
params.name
);
return {
content: [
{
type: 'text',
text: `Wallet imported successfully!\n\nAddress: ${walletInfo.address}`,
},
],
};
}
public async handleListWallets() {
const wallets = this.walletManager.listWallets();
const currentAddress = this.walletManager.getCurrentAddress();
let response = `Available Wallets (${wallets.length}):\n\n`;
for (const wallet of wallets) {
const isCurrent = wallet.address.toLowerCase() === currentAddress.toLowerCase();
response += `${isCurrent ? '→ ' : ' '}${wallet.address}${isCurrent ? ' (current)' : ''}\n`;
}
return {
content: [
{
type: 'text',
text: response,
},
],
};
}
public async handleGetBalance(params: GetBalanceParams) {
try {
if (params.tokenAddress) {
const tokenBalance = await this.hyperionClient.getTokenBalance(
params.address,
params.tokenAddress
);
return {
content: [
{
type: 'text',
text: `Token Balance:\n\nAddress: ${params.address}\nToken: ${tokenBalance.name} (${tokenBalance.symbol})\nBalance: ${tokenBalance.balance} ${tokenBalance.symbol}`,
},
],
};
} else {
const balance = await this.hyperionClient.getBalance(params.address);
return {
content: [
{
type: 'text',
text: `Native Balance:\n\nAddress: ${params.address}\nBalance: ${balance} ${this.hyperionClient.getCurrencySymbol()}`,
},
],
};
}
} catch (error) {
throw new Error(`Failed to get balance: ${error}`);
}
}
public async handleSendTransaction(params: SendTransactionParams) {
try {
const wallet = this.walletManager.getCurrentWallet();
let result;
if (params.tokenAddress) {
result = await this.hyperionClient.sendTokenTransaction(
wallet,
params.tokenAddress,
params.to,
params.amount,
params.gasLimit,
params.gasPrice
);
} else {
result = await this.hyperionClient.sendTransaction(
wallet,
params.to,
params.amount,
params.gasLimit,
params.gasPrice
);
}
const explorerUrl = this.hyperionClient.getExplorerUrl();
const txExplorerLink = `${explorerUrl}/tx/${result.hash}`;
return {
content: [
{
type: 'text',
text: `Transaction sent successfully!\n\nTransaction Hash: ${result.hash}\nTransaction Explorer: ${txExplorerLink}\n\nTransaction Details:\nFrom: ${result.from}\nTo: ${result.to}\nAmount: ${result.value}\nStatus: ${result.status}`,
},
],
};
} catch (error) {
throw new Error(`Failed to send transaction: ${error}`);
}
}
public async handleGetTransaction(params: GetTransactionParams) {
try {
const transaction = await this.hyperionClient.getTransaction(params.hash);
const explorerUrl = this.hyperionClient.getExplorerUrl();
const txExplorerLink = `${explorerUrl}/tx/${transaction.hash}`;
return {
content: [
{
type: 'text',
text: `Transaction Details:\n\nHash: ${transaction.hash}\nExplorer: ${txExplorerLink}\n\nFrom: ${transaction.from}\nTo: ${transaction.to}\nValue: ${transaction.value} ${this.hyperionClient.getCurrencySymbol()}\nGas Used: ${transaction.gasUsed}\nBlock: ${transaction.blockNumber}\nStatus: ${transaction.status}`,
},
],
};
} catch (error) {
throw new Error(`Failed to get transaction: ${error}`);
}
}
public async handleGetBlock(params: GetBlockParams) {
try {
const block = await this.hyperionClient.getBlock(params.blockNumber, params.blockHash);
return {
content: [
{
type: 'text',
text: `Block Information:\n\nNumber: ${block.number}\nHash: ${block.hash}\nTimestamp: ${new Date(block.timestamp * 1000).toISOString()}\nTransactions: ${block.transactionCount}\nGas Used: ${block.gasUsed}\nGas Limit: ${block.gasLimit}\nMiner: ${block.miner}`,
},
],
};
} catch (error) {
throw new Error(`Failed to get block: ${error}`);
}
}
public async handleGetNetworkInfo() {
try {
const networkInfo = await this.hyperionClient.getNetworkInfo();
return {
content: [
{
type: 'text',
text: `Network Information:\n\nName: ${networkInfo.networkName}\nChain ID: ${networkInfo.chainId}\nLatest Block: ${networkInfo.blockNumber}\nGas Price: ${networkInfo.gasPrice} wei\nConnected: ${networkInfo.isConnected ? 'Yes' : 'No'}`,
},
],
};
} catch (error) {
throw new Error(`Failed to get network info: ${error}`);
}
}
public async handleEstimateGas(params: EstimateGasParams) {
try {
const estimate = await this.hyperionClient.estimateGas(
params.to,
params.value,
params.data
);
return {
content: [
{
type: 'text',
text: `Gas Estimate:\n\nGas Limit: ${estimate.gasLimit}\nGas Price: ${estimate.gasPrice} wei\nEstimated Cost: ${estimate.estimatedCost} ${this.hyperionClient.getCurrencySymbol()}`,
},
],
};
} catch (error) {
throw new Error(`Failed to estimate gas: ${error}`);
}
}
public async handleCallContract(params: CallContractParams) {
try {
const result = await this.hyperionClient.callContract(
params.contractAddress,
params.methodName,
params.parameters || [],
params.abi
);
return {
content: [
{
type: 'text',
text: `Contract Call Result:\n\nContract: ${params.contractAddress}\nMethod: ${params.methodName}\nResult: ${JSON.stringify(result.result, null, 2)}`,
},
],
};
} catch (error) {
throw new Error(`Failed to call contract: ${error}`);
}
}
public async handleSendContractTransaction(params: SendContractTransactionParams) {
try {
const wallet = this.walletManager.getCurrentWallet();
const result = await this.hyperionClient.sendContractTransaction(
wallet,
params.contractAddress,
params.methodName,
params.parameters || [],
params.abi,
params.value,
params.gasLimit,
params.gasPrice
);
const explorerUrl = this.hyperionClient.getExplorerUrl();
const txExplorerLink = `${explorerUrl}/tx/${result.hash}`;
const contractExplorerLink = `${explorerUrl}/address/${params.contractAddress}`;
return {
content: [
{
type: 'text',
text: `Contract Transaction Sent:\n\nTransaction Hash: ${result.hash}\nTransaction Explorer: ${txExplorerLink}\n\nContract: ${params.contractAddress}\nContract Explorer: ${contractExplorerLink}\n\nMethod: ${params.methodName}\nStatus: ${result.status}`,
},
],
};
} catch (error) {
throw new Error(`Failed to send contract transaction: ${error}`);
}
}
public async handleSetCurrentWallet(params: { address: string }) {
try {
this.walletManager.setCurrentWallet(params.address);
return {
content: [
{
type: 'text',
text: `Current wallet set to: ${params.address}`,
},
],
};
} catch (error) {
throw new Error(`Failed to set current wallet: ${error}`);
}
}
public async handleGetCurrentWallet() {
try {
const address = this.walletManager.getCurrentAddress();
const walletInfo = this.walletManager.getWalletInfo(address);
return {
content: [
{
type: 'text',
text: `Current Wallet:\n\nAddress: ${walletInfo.address}\nPublic Key: ${walletInfo.publicKey}\nPrivate Key: ${walletInfo.privateKey}`,
},
],
};
} catch (error) {
throw new Error(`Failed to get current wallet: ${error}`);
}
}
public async handleDeployERC20Token(params: DeployERC20Params) {
try {
const wallet = this.walletManager.getCurrentWallet();
const result = await this.hyperionClient.deployERC20Token(
wallet,
params.name,
params.symbol,
params.decimals || 18,
params.initialSupply,
params.mintable || false,
params.gasLimit,
params.gasPrice
);
const explorerUrl = this.hyperionClient.getExplorerUrl();
const contractExplorerLink = `${explorerUrl}/address/${result.contractAddress}`;
const txExplorerLink = `${explorerUrl}/tx/${result.transactionHash}`;
return {
content: [
{
type: 'text',
text: `ERC20 Token Deployed Successfully!\n\nContract Address: ${result.contractAddress}\nContract Explorer: ${contractExplorerLink}\n\nTransaction Hash: ${result.transactionHash}\nTransaction Explorer: ${txExplorerLink}\n\nToken Details:\nName: ${result.name}\nSymbol: ${result.symbol}\nDecimals: ${result.decimals}\nInitial Supply: ${result.initialSupply}\nDeployer: ${result.deployer}\nGas Used: ${result.gasUsed}\nBlock Number: ${result.blockNumber}`,
},
],
};
} catch (error) {
throw new Error(`Failed to deploy ERC20 token: ${error}`);
}
}
public async handleGetTokenInfo(params: GetTokenInfoParams) {
try {
const result = await this.hyperionClient.getTokenInfo(params.tokenAddress);
return {
content: [
{
type: 'text',
text: `Token Information:\n\nAddress: ${result.address}\nName: ${result.name}\nSymbol: ${result.symbol}\nDecimals: ${result.decimals}\nTotal Supply: ${result.totalSupply}${result.owner ? `\nOwner: ${result.owner}` : ''}`,
},
],
};
} catch (error) {
throw new Error(`Failed to get token info: ${error}`);
}
}
public async handleMintTokens(params: MintTokensParams) {
try {
const wallet = this.walletManager.getCurrentWallet();
const result = await this.hyperionClient.mintTokens(
wallet,
params.tokenAddress,
params.to,
params.amount,
params.gasLimit,
params.gasPrice
);
const explorerUrl = this.hyperionClient.getExplorerUrl();
const txExplorerLink = `${explorerUrl}/tx/${result.hash}`;
const contractExplorerLink = `${explorerUrl}/address/${params.tokenAddress}`;
return {
content: [
{
type: 'text',
text: `Tokens Minted Successfully!\n\nTransaction Hash: ${result.hash}\nTransaction Explorer: ${txExplorerLink}\n\nToken Contract: ${params.tokenAddress}\nContract Explorer: ${contractExplorerLink}\n\nMint Details:\nMinted To: ${params.to}\nAmount: ${params.amount}\nStatus: ${result.status}\nGas Used: ${result.gasUsed}`,
},
],
};
} catch (error) {
throw new Error(`Failed to mint tokens: ${error}`);
}
}
}