class Sorare::Rewards::Supply::ComputeForRarity

ComputeForRarity computes the rewardable supply for a given rarity

Public Instance Methods

call() click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 16
def call
  context.rarity_supply = []

  context.rewardable = rewardable_supply
  distribute_in_tiers!
end
capped_tier_supply(total_supply, tier_supply, rewardable, tier_players) click to toggle source

Cap with the actual pickable supply for the tier

# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 40
def capped_tier_supply(total_supply, tier_supply, rewardable, tier_players)
  target = ComputeForQuality.call!(
    randomizer: randomizer, total_supply: total_supply,
    tier_supply: tier_supply, rewardable: rewardable, rewarded: rarity_supply
  ).quality_supply

  [target, tier_players.sum { |player| player_pickable_supply(player) }].min
end
distribute_in_tiers!() click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 29
def distribute_in_tiers!
  ctx = Tiers::QualifySupply.call!(sorted_supply: supply)
  qualified_players = Tiers::QualifyPlayers.call!(sorted_supply: supply).players
  ctx.supply.each_with_index do |tier_supply, index|
    rarity_supply.push(
      capped_tier_supply(ctx.count, tier_supply, rewardable, qualified_players[index])
    )
  end
end
player_contribution(slug) click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 56
def player_contribution(slug)
  game_week.player(slug).reward_pool_supply_contribution(league, rarity)
end
player_pickable_supply(slug) click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 60
def player_pickable_supply(slug)
  game_week.player(slug).pickable_supply(league, rarity)
end
remaining_supply(reward_probability) click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 64
def remaining_supply(reward_probability)
  probability = randomizer.rand
  return 0 unless probability < reward_probability

  1
end
rewardable_supply() click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 23
def rewardable_supply
  total_float_supply = supply.keys.sum { |player| player_contribution(player) }

  round_and_cap_league_supply(total_float_supply)
end
round_and_cap_league_supply(float_supply) click to toggle source
# File lib/sorare/rewards/interactors/supply/compute_for_rarity.rb, line 49
def round_and_cap_league_supply(float_supply)
  [
    float_supply.floor + remaining_supply(float_supply.modulo(1)), # Supply limit
    league.cards_in_circulation_limit(rarity) # Circulation limit
  ].compact.min
end