80 lines
2.7 KiB
TypeScript
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);
|
|
}
|
|
};
|