Files
sre-06-oracles/packages/hardhat/scripts/oracle-bot/validation.ts
2026-01-23 20:20:58 +07:00

80 lines
2.7 KiB
TypeScript

import { HardhatRuntimeEnvironment } from "hardhat/types";
const getStakedAmount = async (publicClient: any, nodeAddress: `0x${string}`, oracleContract: any) => {
const nodeInfo = (await publicClient.readContract({
address: oracleContract.address as `0x${string}`,
abi: oracleContract.abi,
functionName: "nodes",
args: [nodeAddress],
})) as any[];
const [, stakedAmount] = nodeInfo;
return stakedAmount as bigint;
};
export const claimRewards = async (hre: HardhatRuntimeEnvironment) => {
const { deployments } = hre;
const oracleContract = await deployments.get("StakingOracle");
const accounts = await hre.viem.getWalletClients();
const oracleNodeAccounts = accounts.slice(1, 11);
const publicClient = await hre.viem.getPublicClient();
// Get minimum stake requirement from contract
const minimumStake = (await publicClient.readContract({
address: oracleContract.address as `0x${string}`,
abi: oracleContract.abi,
functionName: "MINIMUM_STAKE",
args: [],
})) as unknown as bigint;
try {
return Promise.all(
oracleNodeAccounts.map(async account => {
const stakedAmount = await getStakedAmount(publicClient, account.account.address, oracleContract);
// Only claim rewards if the node has sufficient stake
if (stakedAmount >= minimumStake) {
try {
console.log(`Claiming rewards for ${account.account.address}`);
return await account.writeContract({
address: oracleContract.address as `0x${string}`,
abi: oracleContract.abi,
functionName: "claimReward",
args: [],
});
} catch (error: any) {
if (error.message && error.message.includes("No rewards available")) {
console.log(`Skipping reward claim for ${account.account.address} - no rewards available`);
return Promise.resolve();
}
throw error;
}
} else {
console.log(`Skipping reward claim for ${account.account.address} - insufficient stake`);
return Promise.resolve();
}
}),
);
} catch (error) {
console.error("Error claiming rewards:", error);
}
};
// Keep the old validateNodes function for backward compatibility if needed
export const validateNodes = async (hre: HardhatRuntimeEnvironment) => {
const { deployments } = hre;
const [account] = await hre.viem.getWalletClients();
const oracleContract = await deployments.get("StakingOracle");
try {
return await account.writeContract({
address: oracleContract.address as `0x${string}`,
abi: oracleContract.abi,
functionName: "slashNodes",
args: [],
});
} catch (error) {
console.error("Error validating nodes:", error);
}
};