Part II: Introducing more Reward Transparency

Sorare
Sorare
Published in
6 min readJul 8, 2021

Hi everyone! I’m Thomas, a full stack engineer at Sorare. Over the last couple of months I’ve been part of the team behind building our Dynamic Reward system. The following blog is a more technical explanation of our system for anyone who is curious to dig deeper into the process.

With the recent introduction of our new Dynamic Rewards system, we wanted to bring a new standard of transparency on the way we compute and select the rewards. To achieve our goal, we created a way for our community to verify and validate rewards distributed on each Game Week starting from GW182.

In case you missed part one of our blog, we recommend you read it to learn more about the latest update.

So how does the Rewards system work?

At the beginning of a season we reserve a certain number of cards per player and rarity to each league in which the player is eligible (All-star, U23, weekly, regionals, etc.).

This dispatch depends on the player’s team, his regional, his age, and his overall tier. To have a fair reward structure, we link the number of rewards to the number of playing licensed players for the Game Week. By adopting this approach, we have a smarter rewards dispatch between big Game Weeks where a large number of Managers can be competitive, and small ones.

To do this transparently, when a Game Week opens, we compute a reward data json file that will contain all the required data to compute the rewards.

That file is stored hashed on IPFS so it’s available to our community and it cannot be altered.

This file allows us to compute the number of rewards we can distribute for a Game Week and select the cards rewarded in a transparent way. You can examine the public seed further at the end of the blog.

How do we define the number of rewards distributed?

The number of rewards distributed is based on the number of licensed players that have a game during the Game Week.

If a player has a fixture in a Game Week, that player will increase the number of rewards available for that Game Week.

In a nutshell, to determine how many cards we have available for rewards in a particular Game Week our system looks at the following four things:

  • How many licensed players have a fixture during the Game Week
  • How much total supply we have left for those players
  • How many fixtures those licensed players have left with their clubs for that season
  • The rewards that were won the previous Game Week.

We consider the above because it is essential to helping us manage card supply across a full football season.

The key metric that influences our system is supply. This changes across a season which is why we can’t share a table example of how rewards will look like in a particular Game Week. What we recommend is to check out the public prize pools and see how they change across Game Weeks.

For those who want to dig deeper:

  • The number of remaining fixtures does not match the number of games remaining for the current season. New season cards are usually not released before the start of the new season so we overestimate the number of games to handle the season overlap. That computation is made internally and will be continuously improved to be as accurate as possible.
  • The contribution of a player to the pool is capped by two limits, a hard limit limiting the max number of cards for a player we can give for a single Game Week, and the cool down limit, limiting the number of cards we can give over a certain number of Game Weeks. Those limits are applied here (and when picking up the rewarded cards)

Once this is done, we then need to compute the quality of the card we will be giving. In order to do that, we apply the ratio of each quality in the remaining season supply (for example: the percentage of Rare cards available for the Global All-star that are T3s).

This gives us the exact number of cards per scarcity, quality, and league we will give.

From the number of rewards we give for a league, we dispatch the cards over the divisions using a config that is available in our public library, see below.

Card reward selection is made using a random generator that is seeded using 2 values:

  • The block hash of the first mined on Ethereum after the cut off of the preceding Game week
  • A private seed that is stored hashed within the reward data file (so it cannot be altered) and made public once the tournament has been closed.

Each time we select a card we verify that it does not exceed the player available supply (with the hard and cool down limits).

Anyone can verify the rewards distributed for a GameWeek using the public ruby library we released: https://rubygems.org/gems/sorare-rewards/versions/1.0.0

What’s next?

Following our recent update of the Dynamic Rewards system, our next goal to help improve your Rewards experience, is to upgrade the system we use to sort players into Tiers. Over the next few weeks we will monitor how the recent increase in reward supply affects our Tier system before we begin implementing a better experience for all.

That’s all for now. Thanks for reading. We hope this offers more transparency into how the reward selection and distribution process works. If you’d like more technical blogs like this, please let us know!

We’re Hiring!

Our team is currently exploring more engineering challenges that come with building a global fantasy football platform built on innovative technology!

Visit our open job opportunities here

{
/**
* The public seed of the Game Week (see Transparency section for more)
*/
“public_seed”: 1234,
/**
* The hashed version of the private salt (see Transparency section for more
*/
“hashed_salt”: “1ea0973”,
/**
* The version of the gem used for the game week
*/
“version”: “1.0.0”,
“config”: {
/**
* Define the max number of cards per player we
* can distribute over the given period for a single Game Week / League
*/
“cooldown”: {
“rare”: {
“quantity”: 2,
“since”: 1209600 // Two weeks
},

},
/**
* The max number of cards per player we can distribute for a single Game Week / League
*/
“limits”: {
“rare”: 2,

},
/**
* The currency used for the price pool
*/
“prize_pool_currency”: “eth”
},
“leagues”: {
“global-all_star”: {
/**
* The supply pool used for the rewards
*/
“pool_supply”: “global-all_star”,
/**
* The maximum prize pool per position per division
*/
“prize_pools”: [
[1.2, 0.6, 0.3], // D1
[1, 0.5, 0.2], // D2
[0.8, 0.4, 0.1], // D3
[0.6, 0.3, 0.05], // D4
],
/**
* The percentage of eligible licensed players that have a game for the Game Week
*/
“playing_rate”: 0.23
}
},
“playing_players”: {
“kylian-mbappe-lottin”: {
/**
* The number of remaining games for the current season of the player
*/
“remaining_games”: 2,
/**
* The estimated number of remaining games for the current supply of the player
*/
“remaining_games_for_supply”: 4,
/**
* The latest rewarded cards for the player per league and rarity
*/
“global-all_star”: {
“rare”: [“2021–04–13T06:44:30.753Z”, “2021–04–20T07:16:22.113Z”],

},

}
},
/**
* The available supply for each leagues, rarity and player
*/
“supply”: {
“global-all_star”: {
“rare”: {
“kylian-mbappe-lottin”: {
“supply”: 5, // The available cards
“rank”: 1, // The player rank within the league
“tier”: 1 // The player tier within the league (OPTIONAL)
},

}

}
}
}

--

--

Sorare
Sorare

Sorare is a fantasy Football, NBA, and MLB game + marketplace. Collect, buy, sell, and compete with officially licensed digital player cards to win rewards.