Skip to main content

How Points Work

The GenLayer Points system uses a two-tier scoring mechanism:
  1. Base Points: Awarded for each contribution based on its type and quality
  2. Global Points: Base points multiplied by time-based multipliers
This system allows the GenLayer Foundation to incentivize certain contribution types during specific periods while preserving the value of past contributions.

Point Calculation Formula

The core calculation is straightforward:
Global Points = Base Points × Active Multiplier

Example

1

Earn Base Points

You submit a blog post contribution and are awarded 50 base points
2

Apply Multiplier

The active multiplier for blog posts on your contribution date is 2.0x
3

Calculate Global Points

50 × 2.0 = 100 global points
4

Freeze Points

These 100 points are permanently recorded, even if the multiplier changes later
Frozen Points: Once awarded, your global points never decrease. The frozen_global_points field preserves your score at the multiplier rate when the contribution was made.

Base Points

Base points are determined by the contribution type and steward evaluation:

Point Ranges

Each contribution type has a defined range:
class ContributionType:
    min_points = 0      # Minimum points allowed
    max_points = 100    # Maximum points allowed
Contribution TypeMin PointsMax PointsCategory
Node Running10100Validator
Network Upgrade50200Validator
Blog Post25150Builder
Code Contribution100500Builder
Smart Contract2001000Builder
Contribution Review550Steward
Working Group Lead100300Steward
These are example ranges. Actual contribution types and point ranges are configured by stewards and may vary.

Point Assignment

When reviewing a submission, stewards consider:
  • Complexity: How difficult was the work?
  • Impact: How valuable is it to the ecosystem?
  • Quality: How well was it executed?
  • Effort: How much time and skill did it require?
Based on these factors, they assign a point value within the type’s min/max range.

Multipliers

Multipliers allow the GenLayer Foundation to emphasize certain contribution types during specific time periods.

How Multipliers Work

Multipliers are stored in the GlobalLeaderboardMultiplier model:
class GlobalLeaderboardMultiplier:
    contribution_type    # Which contribution type
    multiplier_value    # The multiplier (e.g., 1.5, 2.0)
    valid_from         # When this multiplier becomes active
    description        # Reason for this multiplier

Time-Based Activation

Multipliers are active from their valid_from date until a new multiplier is created:
1

Initial Multiplier

March 1, 2026: Blog post multiplier set to 1.0x (baseline)
2

Incentive Period

April 1, 2026: Blog post multiplier increased to 2.5x to encourage content creation
3

Normalization

May 1, 2026: Blog post multiplier reduced to 1.5x as normal rate
Contributions made between April 1 and April 30 would receive the 2.5x multiplier, while those made after May 1 would receive 1.5x.

Multiplier History

The system tracks all historical multipliers:
# Get active multiplier for a specific date
multiplier = GlobalLeaderboardMultiplier.get_active_for_type(
    contribution_type=blog_post_type,
    at_date=datetime(2026, 4, 15)  # Returns 2.5x
)
This enables:
  • Retroactive contribution submissions with correct multipliers
  • Historical analysis of incentive periods
  • Fair point calculations regardless of submission timing

Multiplier Example Timeline

A contribution made on:
  • March 15: 50 points × 1.0 = 50 global points
  • April 15: 50 points × 2.5 = 125 global points
  • May 15: 50 points × 1.5 = 75 global points
Multipliers must exist for a contribution type before contributions can be submitted. If no multiplier is defined for the contribution date, the submission will fail validation.

Leaderboard Rankings

Your total points determine your rank on category-specific leaderboards.

Point Aggregation

Total points are calculated by summing all your contribution’s global points:
total_points = sum(contribution.frozen_global_points 
                  for contribution in user.contributions.all())

Ranking Rules

  1. Sort by Total Points: Higher points = better rank
  2. Alphabetical Tiebreaker: Users with equal points are ranked alphabetically by name
  3. Consecutive Ranks: No tied ranks - users with same points get consecutive numbers (1, 2, 3)
  4. Visibility Filter: Only visible users appear on leaderboards

Rank Calculation Example

UserTotal PointsRank
Alice15001
Bob12002
Charlie12003
Diana8004
Bob and Charlie have the same points (1200) but receive consecutive ranks (2 and 3) based on alphabetical order.

Category-Specific Scoring

Points are tracked separately for each category:

Validator Points

Sum of all contributions in the Validator category:
validator_points = sum(
    contribution.frozen_global_points
    for contribution in user.contributions.filter(
        contribution_type__category__slug='validator'
    )
)

Builder Points

Sum of all contributions in the Builder category:
builder_points = sum(
    contribution.frozen_global_points
    for contribution in user.contributions.filter(
        contribution_type__category__slug='builder'
    )
)

Steward Points

Sum of all contributions in the Steward category (not currently used for leaderboard ranking).

Special Leaderboards

Validator Waitlist

The waitlist leaderboard includes:
  • Contribution Points: From validator category (excluding graduation)
  • Referral Points: 10% of referred users’ contributions
waitlist_points = validator_contributions + referral_points

Validator Waitlist Graduation

When promoted to active validator, your waitlist points are frozen:
graduation_entry = LeaderboardEntry(
    type='validator-waitlist-graduation',
    total_points=waitlist_points,  # Frozen
    graduation_date=validator_contribution_date
)
The graduation leaderboard is sorted by graduation date (most recent first), not by points. It serves as a historical record of validator promotions.

Referral Bonuses

Users who refer others earn bonus points:

Referral System

class ReferralPoints:
    builder_points     # 10% of referred users' builder contributions
    validator_points   # 10% of referred users' validator contributions

Eligibility

Referred users must have contributions beyond onboarding to count:
eligible = referred_user.contributions.exclude(
    contribution_type__slug__in=['builder-welcome', 'validator-waitlist']
).exists()

Calculation Example

1

You Refer a User

Alice refers Bob using her referral code
2

Bob Makes Contributions

Bob earns:
  • 500 builder global points
  • 300 validator global points
3

You Earn Referral Points

Alice receives:
  • 50 builder referral points (500 × 10%)
  • 30 validator referral points (300 × 10%)
  • Total: 80 referral points
4

Added to Your Total

These referral points are added to Alice’s waitlist leaderboard score

Leaderboard Update Timing

Leaderboards update automatically when:
  1. Contribution Accepted: Your points increase and rank recalculated
  2. Referred User Contributes: Your referral points update
  3. Profile Created: You appear on category leaderboard (Validator/Builder)
@receiver(post_save, sender=Contribution)
def update_leaderboard_on_contribution(sender, instance, **kwargs):
    # Update user's leaderboard entries
    update_user_leaderboard_entries(instance.user)
    
    # Update referrer's referral points
    if instance.user.referred_by:
        update_referrer_points(instance)
Leaderboard updates happen in real-time. As soon as a steward accepts your contribution, your rank updates immediately.

Point Integrity

The system enforces several safeguards:

Frozen Point Values

frozen_global_points = models.PositiveIntegerField(
    default=0,
    help_text="Global points calculated as points × multiplier."
)
Once calculated, global points cannot be changed by multiplier updates.

Multiplier Validation

def clean(self):
    if self.multiplier_value <= 0:
        raise ValidationError("Multiplier value must be positive")
Multipliers must be positive to prevent point manipulation.

Contribution Date Validation

if not contribution_date:
    contribution_date = timezone.now()

multiplier = GlobalLeaderboardMultiplier.get_active_for_type(
    contribution_type,
    at_date=contribution_date
)
The contribution date determines which multiplier is applied, ensuring consistency.

Viewing Your Score Breakdown

On Your Profile

Your profile shows:
  • Total Global Points: Sum across all categories
  • Points by Category: Validator, Builder, Steward breakdown
  • Recent Contributions: Latest point-earning activities
  • Contribution History: Complete list with point values

On Leaderboards

Leaderboards display:
  • Current Rank: Your position in the category
  • Total Points: Your category-specific score
  • Points to Next Rank: Gap to climb one position

Maximizing Your Points

Submit During High Multipliers

Watch for increased multipliers on contribution types you can complete

Aim for High-Value Types

Focus on contribution types with higher point ranges

Quality Over Quantity

Well-executed contributions earn more points within their range

Refer Active Contributors

Earn 10% of your referrals’ points as bonuses

Common Questions

No! Your points are frozen when awarded. Multiplier changes only affect new contributions, never existing ones.
Yes, the platform tracks all historical multipliers. You can view past rates in the contribution type details.
You earn 10% of your referred users’ global points (builder + validator categories only, excluding onboarding contributions).
Currently, Steward points are tracked but don’t have a dedicated leaderboard. Focus on Validator or Builder contributions for rankings.
No, multipliers must be positive values (greater than 0) to ensure fair point calculations.

Build docs developers (and LLMs) love