@hashgraphonline/standards-agent-kit
Version:
A modular SDK for building on-chain autonomous agents using Hashgraph Online Standards, including HCS-10 for agent discovery and communication. https://hol.org
97 lines (87 loc) • 3.41 kB
text/typescript
import { Hbar, TransferTransaction } from "@hashgraph/sdk";
import { Logger, HCS10Client, HederaMirrorNode } from "@hashgraphonline/standards-sdk";
export const MIN_REQUIRED_USD = 2.0;
export const MIN_REQUIRED_HBAR_USD = 10.0;
export async function ensureAgentHasEnoughHbar(
logger: Logger,
baseClient: HCS10Client,
accountId: string,
agentName: string
): Promise<void> {
try {
const account = await baseClient.requestAccount(accountId);
const balance = account.balance.balance;
const hbarBalance = balance / 100_000_000;
logger.info(`${agentName} account ${accountId} has ${hbarBalance} HBAR`);
try {
const mirrorNode = new HederaMirrorNode('testnet', logger);
const hbarPrice = await mirrorNode.getHBARPrice(new Date());
if (hbarPrice) {
const balanceInUsd = hbarBalance * hbarPrice;
logger.info(`${agentName} balance in USD: $${balanceInUsd.toFixed(2)}`);
if (balanceInUsd < MIN_REQUIRED_USD) {
logger.warn(
`${agentName} account ${accountId} has less than $${MIN_REQUIRED_USD} (${balanceInUsd.toFixed(
2
)}). Attempting to fund.`
);
try {
const funder = baseClient.getAccountAndSigner();
const targetHbar = MIN_REQUIRED_HBAR_USD / hbarPrice;
const amountToTransferHbar = Math.max(0, targetHbar - hbarBalance);
if (amountToTransferHbar > 0) {
const transferTx = new TransferTransaction()
.addHbarTransfer(
funder.accountId,
Hbar.fromTinybars(
Math.round(amountToTransferHbar * -100_000_000)
)
)
.addHbarTransfer(
accountId,
Hbar.fromTinybars(
Math.round(amountToTransferHbar * 100_000_000)
)
);
logger.info(
`Funding ${agentName} account ${accountId} with ${amountToTransferHbar.toFixed(
2
)} HBAR from ${funder.accountId}`
);
const clientAny: any = baseClient.getClient();
const fundTxResponse = await transferTx.execute(clientAny);
await fundTxResponse.getReceipt(clientAny);
logger.info(
`Successfully funded ${agentName} account ${accountId}.`
);
} else {
logger.info(
`${agentName} account ${accountId} does not require additional funding.`
);
}
} catch (fundingError) {
logger.error(
`Failed to automatically fund ${agentName} account ${accountId}:`,
fundingError
);
logger.warn(
`Please fund the account ${accountId} manually with at least ${(
MIN_REQUIRED_HBAR_USD / hbarPrice
).toFixed(2)} HBAR.`
);
}
}
} else {
logger.warn(
'Failed to get HBAR price from Mirror Node. Please ensure the account has enough HBAR.'
);
}
} catch (error) {
logger.warn(
'Failed to check USD balance. Please ensure the account has enough HBAR.'
);
}
} catch (error) {
logger.error(`Failed to check ${agentName} account balance:`, error);
}
}