Staking & Delegation

Staking & Delegation

UltraDAG uses a proof-of-stake system with delegated staking. Validators stake UDAG to participate in consensus and earn rewards. Token holders can delegate to validators without running a node.


Staking Overview

ParameterValue
Minimum validator stake2,000 UDAG
Maximum active validators100
Epoch length210,000 rounds (~12.15 days)
Minimum delegation100 UDAG
Unstake/Undelegate cooldown2,016 rounds (~2.8 hours)
Default commission10%
Commission range0-100%

Validator Staking

Becoming a Validator

To become a validator:

  1. Acquire at least 2,000 UDAG
  2. Submit a Stake transaction
  3. If your effective stake ranks in the top 100 at the next epoch boundary, you become an active validator
curl -X POST http://localhost:10333/stake \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "YOUR_SECRET_KEY",
    "amount": 200000000000
  }'
Fee-exempt
Staking operations (Stake, Unstake, Delegate, Undelegate, SetCommission) are **zero-fee** transactions. You do not need extra UDAG beyond the stake amount.

Active Validator Set

The active validator set is determined at each epoch boundary (every 210,000 rounds):

  1. All staked addresses are ranked by effective stake (own stake + delegations)
  2. The top 100 become active validators for the next epoch
  3. Ties are broken by address bytes ascending (deterministic)

All stakers are ranked by effective stake. The top 100 become active validators earning full rewards. Those ranked 101+ become passive stakers earning a reduced 50% observer rate.

Effective Stake

A validator’s effective stake determines their ranking and reward share:

$$ \text{effective_stake} = \text{own_stake} + \sum_{d \in \text{delegators}} d.\text{amount} $$

Attracting delegations is a key strategy for validators to enter and remain in the active set.


Reward Distribution

Active Validator Rewards

Active validators earn rewards proportional to their effective stake. Each round:

$$ \text{validator_pool} = \text{round_reward} \times (1 - \text{council_share_pct}) $$

$$ \text{reward}_i = \text{validator_pool} \times \frac{\text{effective_stake}i}{\sum{j \in \text{active}} \text{effective_stake}_j} $$

Example: With 4 active validators and a 1 UDAG round reward (10% to council):

ValidatorEffective StakeShareReward
Alice50,000 UDAG50%0.450 UDAG
Bob25,000 UDAG25%0.225 UDAG
Carol15,000 UDAG15%0.135 UDAG
Dave10,000 UDAG10%0.090 UDAG
Total100,000 UDAG100%0.900 UDAG

The remaining 0.100 UDAG goes to the Council.

Passive Staking Rewards

Validators who are staked but not in the top 100 still earn rewards at a reduced rate:

$$ \text{passive_reward}_i = \text{active_equivalent}_i \times 0.50 $$

This incentivizes staking even when not in the active set — passive stakers earn 50% of what they would earn as an active validator with the same stake.

Why passive rewards?
Passive staking rewards encourage a deep bench of validators ready to enter the active set. Without passive rewards, there would be no incentive to stake until you could guarantee a top-100 position, creating a barrier to entry.

Delegation

How Delegation Works

Token holders who don’t want to run a validator can delegate their UDAG to an existing validator:

  1. Delegator sends a Delegate transaction specifying a target validator
  2. Delegated UDAG moves from the delegator’s liquid balance to a DelegationAccount
  3. The delegated amount increases the validator’s effective stake
  4. The delegator earns a share of the validator’s rewards, minus commission
curl -X POST http://localhost:10333/delegate \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "DELEGATOR_SECRET_KEY",
    "validator": "VALIDATOR_ADDRESS",
    "amount": 10000000000
  }'

Delegation Parameters

ParameterValue
Minimum delegation100 UDAG (10,000,000,000 sats)
Delegations per address1 (one active delegation at a time)
Delegation to multiple validatorsNot supported (use multiple wallets)
Re-delegationUndelegate + Delegate (cooldown applies)

Commission

Validators set a commission rate that determines their cut of delegation rewards:

$$ \text{delegator_pool} = \text{validator_total_reward} \times \frac{\text{delegated_stake}}{\text{effective_stake}} $$

$$ \text{commission} = \text{delegator_pool} \times \frac{\text{commission_pct}}{100} $$

$$ \text{delegator_reward}_i = (\text{delegator_pool} - \text{commission}) \times \frac{d_i.\text{amount}}{\text{total_delegated}} $$

Example: Validator with 10% commission, 60,000 effective stake (20,000 own + 40,000 delegated), earning 0.54 UDAG/round:

ComponentCalculationAmount
Validator’s own share0.54 * (20,000/60,000)0.180 UDAG
Delegator pool0.54 * (40,000/60,000)0.360 UDAG
Commission (10%)0.360 * 0.100.036 UDAG
Distributed to delegators0.360 - 0.0360.324 UDAG
Validator total0.180 + 0.0360.216 UDAG

Setting Commission

curl -X POST http://localhost:10333/set-commission \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "VALIDATOR_SECRET_KEY",
    "commission_percent": 15
  }'

Commission changes take effect immediately. Delegators should monitor their validator’s commission rate.

Checking Delegations

View your delegation:

curl http://localhost:10333/delegation/DELEGATOR_ADDRESS

View a validator’s delegators:

curl http://localhost:10333/validator/VALIDATOR_ADDRESS/delegators

Unstaking and Undelegating

Cooldown Period

Both unstaking and undelegating have a 2,016 round cooldown (~2.8 hours at 5-second rounds):

  1. Submit Unstake or Undelegate transaction
  2. Funds enter cooldown state (unlock_at_round is set)
  3. During cooldown: funds earn no rewards and cannot be transferred
  4. After cooldown expires: funds automatically return to liquid balance
# Unstake (unstakes everything, no amount field)
curl -X POST http://localhost:10333/unstake \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "VALIDATOR_SECRET_KEY"
  }'

# Undelegate (undelegates everything, no amount or validator field)
curl -X POST http://localhost:10333/undelegate \
  -H "Content-Type: application/json" \
  -d '{
    "secret_key": "DELEGATOR_SECRET_KEY"
  }'
Partial unstake
If unstaking would reduce your stake below the 2,000 UDAG minimum, the unstake is rejected. You must unstake the full amount to exit the validator set.

Slashing

Equivocation Penalty

Validators who produce conflicting vertices in the same round are slashed:

ParameterValue
Default slash percentage50%
Governable range10-100%
Slash destinationBurned (removed from total supply)

Cascade to Delegators

Slashing cascades proportionally to all delegators:

$$ \text{delegator_slash}_i = d_i.\text{amount} \times \frac{\text{slash_pct}}{100} $$

Example: Validator with 50,000 total delegations slashed at 50%:

  • Each delegator loses 50% of their delegation
  • A delegator with 5,000 UDAG delegated loses 2,500 UDAG
  • All slashed amounts are burned (deflationary)
Delegation risk
Delegating to a validator exposes you to slashing risk. Choose validators carefully based on their track record, infrastructure reliability, and operational practices. Each address can only delegate to one validator — use multiple wallets to diversify across validators.

Slash Detection

Equivocation is detected automatically by any node that receives two different vertices from the same validator for the same round. The evidence is:

  1. Gossiped to all peers
  2. Included in a DAG vertex as equivocation evidence
  3. Once finalized, deterministically triggers the slash
  4. All honest nodes apply the identical slash — no voting or disputes

Epoch System

ParameterValue
Epoch length210,000 rounds
At 5-second rounds~12.15 days
Validator set recalculationOnce per epoch

At each epoch boundary:

  1. Rank all stakers by effective stake
  2. Top 100 become active validators
  3. Remaining stakers become passive (50% reward rate)
  4. Cooldowns from the previous epoch are processed
  5. Commission changes are reflected in new reward calculations

Summary of Fee Exemptions

Transaction TypeFee
TransferMIN_FEE (10,000 sats)
StakeFree
UnstakeFree
DelegateFree
UndelegateFree
SetCommissionFree
CreateProposalMIN_FEE (10,000 sats)
VoteMIN_FEE (10,000 sats)

Next Steps