ACP-267: Primary Network validator uptime requirement increases from 80% to 90%.Read the proposal

Register Validator

Theory walkthrough of registering a PoS validator with token staking

Registering a PoS Validator

In a Permissionless L1, anyone can register a validator by staking the required minimum amount of tokens. Unlike the PoA model where only the contract owner can add validators, the PoS model is open to all participants.

The process follows the same three-phase pattern as the permissioned L1 flow but with key differences around token staking and delegation parameters.

Phase 1: Initiation (L1)

The validator calls initiateValidatorRegistration on the Staking Manager contract.

For NativeTokenStakingManager, this is a payable function — the validator sends native tokens as msg.value:

function initiateValidatorRegistration(
    ValidatorRegistrationInput calldata registrationInput,
    uint16 delegationFeeBips,
    uint64 minStakeDuration
) external payable returns (bytes32 validationID)

Under the hood, the contract:

  • Validates the stake amount meets the minimum requirements
  • Locks the staked tokens in the contract
  • Converts the token amount to a validator weight using valueToWeight()
  • Validates BLS keys, nodeID, churn limits
  • Builds a RegisterL1ValidatorMessage with a bounded expiry
  • Computes a unique validationID
  • Stores the validation period with PoS-specific data (delegation fee, min stake duration)
  • Sends a Warp message to the P-Chain

Key PoS parameters:

  • delegationFeeBips - The percentage fee (in basis points) that this validator charges delegators. For example, 1000 = 10% fee on delegation rewards.
  • minStakeDuration - The minimum time the validator must stake before they can withdraw. This also applies to delegators.

Phase 2: P-Chain Processing

The Warp message from Phase 1 must be signed by the network and submitted to the P-Chain as a RegisterL1ValidatorTx. This is identical to the permissioned L1 flow:

  1. Aggregate signatures from 67% of the stake-weighted validator set
  2. Submit the signed message to the P-Chain
  3. The P-Chain validates and processes the registration
  4. The P-Chain signs a response L1ValidatorRegistrationMessage

Phase 3: Completion (L1)

Call completeValidatorRegistration(messageIndex) with the P-Chain's signed response:

  • Verifies the Warp message signature
  • Activates the validator (status → Active)
  • Sets the start time (important for reward calculations)
  • Emits CompletedValidatorRegistration

Anyone can call this function with the signed message.

Weight and Stake Conversion

In PoS, validator weight is derived from the staked token amount:

  • valueToWeight(tokenAmount) - Converts tokens to weight (used during registration)
  • weightToValue(weight) - Converts weight back to tokens (used for display)

The weight determines the validator's influence in consensus proportional to their stake.

Registration Expiry

Just like in permissioned L1s, validator registrations expire after 24 hours by default. If the registration is not completed within this window, it becomes invalid and must be cleaned up.

Appendix: PoS Validator Registration Flow

Is this guide helpful?