Overview
Queries the FenineSystem contract to get comprehensive information about a specific validator including status, stakes, commission, and rewards.
Contract Call Details
0x0000000000000000000000000000000000001000 (FenineSystem)
Function selector: 0xb5d89627 + ABI-encoded validator address
The validator address to query
Response
Validator status:
0: NOT_EXIST (never registered)
1: CREATED (registered, not staked)
2: STAKED (staked, waiting activation)
3: VALIDATED (active, earning rewards)
4: UNSTAKED (unstaking in progress)
Validator’s self-stake amount in wei
Total stake (self + delegated) in wei
Commission rate in basis points (e.g., 500 = 5%)
Pending rewards available to claim in wei
Number of delegators staked to this validator
Examples
# Replace <VALIDATOR_ADDRESS> with actual address (without 0x prefix)
curl -X POST https://rpc.fene.app \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"method": "eth_call",
"params": [{
"to": "0x0000000000000000000000000000000000001000",
"data": "0xb5d89627000000000000000000000000<VALIDATOR_ADDRESS>"
}, "latest"],
"id": 1
}'
Use Cases
async function getValidatorDashboard(address) {
const info = await contract.methods.getValidatorInfo(address).call();
// Calculate delegation ratio
const delegatedStake = BigInt(info.totalStake) - BigInt(info.selfStake);
const delegationRatio = Number(delegatedStake * 100n / BigInt(info.totalStake));
return {
status: STATUS_NAMES[info.status],
isActive: info.status == 3,
selfStake: web3.utils.fromWei(info.selfStake, 'ether'),
delegatedStake: web3.utils.fromWei(delegatedStake.toString(), 'ether'),
totalStake: web3.utils.fromWei(info.totalStake, 'ether'),
delegationRatio: delegationRatio.toFixed(1) + '%',
commission: (info.commissionRate / 100) + '%',
pendingRewards: web3.utils.fromWei(info.claimableReward, 'ether'),
delegatorCount: info.stakerCount
};
}
async function compareValidators(addresses) {
const comparisons = await Promise.all(
addresses.map(async (addr) => {
const info = await contract.methods.getValidatorInfo(addr).call();
return {
address: addr,
totalStake: web3.utils.fromWei(info.totalStake, 'ether'),
commission: info.commissionRate / 100,
delegators: parseInt(info.stakerCount),
isActive: info.status == 3
};
})
);
// Sort by total stake
comparisons.sort((a, b) => parseFloat(b.totalStake) - parseFloat(a.totalStake));
console.table(comparisons);
return comparisons;
}
async function canStakeToValidator(validatorAddress) {
const info = await contract.methods.getValidatorInfo(validatorAddress).call();
if (info.status != 3) {
return { canStake: false, reason: 'Validator not active' };
}
// Check if accepting delegators (optional business logic)
const constants = await web3.getContractConstants();
if (info.commissionRate > constants.maxCommission) {
return { canStake: false, reason: 'Commission too high' };
}
return {
canStake: true,
validatorInfo: {
totalStake: web3.utils.fromWei(info.totalStake, 'ether'),
commission: (info.commissionRate / 100) + '%',
delegators: info.stakerCount
}
};
}
Status Lifecycle
NOT_EXIST (0)
↓ registerValidator()
CREATED (1)
↓ stakeValidator()
STAKED (2)
↓ [Epoch activation]
VALIDATED (3) ← Active, earning rewards
↓ unstakeValidator()
UNSTAKED (4)
↓ withdrawValidatorStake()
CREATED (1) ← Can re-stake
getActiveValidators
Get all active validators
getValidatorStakers
Get validator’s delegators
getDelegatorInfo
Get delegator stake info