My App

Validators

Complete guide to becoming and operating a validator on Living Mission

Validators

Validators are the backbone of the Living Mission network. They produce blocks, validate transactions, and secure the network in exchange for rewards.

Overview

Living Mission supports a maximum of 101 active validators at any time, with unlimited validator candidates who can be activated when slots become available.

Key Parameters

ParameterValueDescription
Max Validators101Maximum active validators
Min Self-Stake10,000 LGMMinimum stake to become validator
Lock Period50,000 blocks~14 hours unstake lock
Default Commission5% (500 BPS)Default commission rate
Max Commission10% (1000 BPS)Maximum allowed commission

Validator Lifecycle

┌───────────┐    register    ┌───────────┐    stake     ┌───────────┐
│ NOT_EXIST │ ─────────────► │  CREATED  │ ───────────► │  STAKED   │
└───────────┘                └───────────┘              └─────┬─────┘

                                                         at epoch

┌───────────┐    unstake     ┌───────────┐    activate  ┌─────▼─────┐
│ UNSTAKED  │ ◄───────────── │ VALIDATED │ ◄─────────── │  STAKED   │
└─────┬─────┘                └───────────┘              └───────────┘

      │ after lock period

┌───────────┐
│  CREATED  │ (can re-stake)
└───────────┘

Status Definitions

StatusDescription
NOT_EXISTAddress has never registered
CREATEDRegistered but not staked
STAKEDStaked, waiting for activation
VALIDATEDActive validator, producing blocks
UNSTAKEDInitiated unstake, in lock period

Becoming a Validator

Register as Validator

Call registerValidator() with your metadata:

function registerValidator(
    address payable rewardAddress,  // Where rewards are sent
    string calldata moniker,        // Display name (max 128 chars)
    string calldata phoneNumber,    // Contact (optional)
    string calldata details,        // Description (optional)
    uint256 commissionRate          // 500-1000 BPS (5-10%)
) external returns (bool);

Example using ethers.js:

const tx = await resonanceSystem.registerValidator(
    "0xYourRewardAddress",
    "MyValidator",
    "+1234567890",
    "Professional validator with 99.9% uptime",
    500  // 5% commission
);
await tx.wait();

Stake Minimum Amount

Stake at least 10,000 LGM to become eligible:

function stakeValidator() external payable returns (bool);

Example:

const tx = await resonanceSystem.stakeValidator({
    value: ethers.parseEther("10000")  // 10,000 LGM
});
await tx.wait();

Wait for Activation

At the next epoch (every 200 blocks), your validator will be activated if:

  • Status is STAKED
  • Self-stake ≥ 10,000 LGM
  • Active validator count < 101

Once activated, you'll start producing blocks and earning rewards!

Validator Operations

Add More Stake

Top up your stake without affecting status:

function addValidatorStake() external payable returns (bool);
await resonanceSystem.addValidatorStake({
    value: ethers.parseEther("5000")  // Add 5,000 LGM
});

Update Metadata

Change your validator information:

function updateValidatorMetadata(
    string calldata moniker,
    string calldata phoneNumber,
    string calldata details
) external returns (bool);

Update Commission Rate

Commission can only be updated before activation (while in STAKED status).

function updateCommissionRate(uint256 newRate) external returns (bool);

Claim Rewards

Claim accumulated validator rewards:

function claimValidatorReward() external returns (bool);
const tx = await resonanceSystem.claimValidatorReward();
const receipt = await tx.wait();

// Check event for amounts
const event = receipt.logs.find(
    log => log.topics[0] === resonanceSystem.interface.getEventTopic('ValidatorRewardClaimed')
);

Unstake

Initiate the unstaking process:

function unstakeValidator() external returns (bool);

After unstaking, you must wait 50,000 blocks (~14 hours) before withdrawing.

Withdraw Stake

After the lock period, withdraw your stake:

function withdrawValidatorStake() external returns (bool);

Reward Distribution

How Rewards Work

  1. Block Fees accumulate in FeeRecorder
  2. At Epoch (every 200 blocks), rewards are distributed
  3. Per Validator share is proportional to total stake

Reward Calculation

Validator Share = (Epoch Reward × Validator Total Stake) / Total Network Stake

Commission = Validator Share × Commission Rate
Delegator Pool = Validator Share - Commission
Validator Self-Stake Reward = Delegator Pool × (Self Stake / Total Stake)

Total Validator Reward = Commission + Self-Stake Reward

Example

Epoch Reward: 1,000 LGM
Validator Total Stake: 100,000 LGM (10,000 self + 90,000 delegated)
Total Network Stake: 1,000,000 LGM
Commission Rate: 5%

Validator Share = 1,000 × 100,000 / 1,000,000 = 100 LGM
Commission = 100 × 5% = 5 LGM
Delegator Pool = 100 - 5 = 95 LGM
Self-Stake Reward = 95 × 10,000 / 100,000 = 9.5 LGM

Total Validator Reward = 5 + 9.5 = 14.5 LGM

Managing Delegators

Whitelist System

Validators control who can delegate to them via the NFT Passport system:

Creating Referral Keys

// One-time use key
function createReferralKey(bytes32 key) external;

// Multi-use key with limits
function createMultiUseKey(
    bytes32 key,
    uint256 maxUsage,      // 0 = unlimited
    uint256 expiresInBlocks // 0 = never
) external;

Example:

// Generate a unique key
const key = ethers.keccak256(ethers.toUtf8Bytes("my-referral-code-123"));

// Create the referral key
await nftPassport.createReferralKey(key);

// Share with potential delegators
console.log("Referral Key:", key);

Direct Invite

// Whitelist a specific address
await nftPassport.directInvite("0xDelegatorAddress");

// Batch invite multiple addresses
await nftPassport.batchDirectInvite([
    "0xDelegator1",
    "0xDelegator2",
    "0xDelegator3"
]);

View Functions

Get Validator Info

function getValidatorInfo(address vaAddr) external view returns (
    VAStatus status,
    uint256 selfStake,
    uint256 totalStake,
    uint256 commissionRate,
    uint256 claimableReward,
    uint256 stakerCount
);

Get Estimated Rewards

function getEstimatedValidatorReward(address vaAddr) external view returns (
    uint256 claimable,    // Gross amount
    uint256 afterTax      // Net after tax
);

Get Delegator List

function getValidatorStakers(address vaAddr) external view returns (
    address[] memory stakers
);

Best Practices

Infrastructure

  • High Availability: Run redundant nodes
  • Monitoring: Set up 24/7 alerting
  • Security: Use hardware security modules (HSM)
  • Backup: Maintain hot standby nodes

Operations

  • Commission: Set competitive rates (5-10%)
  • Communication: Keep delegators informed
  • Uptime: Maintain 99.9%+ availability
  • Updates: Stay current with network upgrades

Security

  • Key Management: Never expose private keys
  • Access Control: Use multi-sig for admin operations
  • Auditing: Regular security reviews
  • Incident Response: Have a plan ready