New Splinterlands Reward system has a problem.

Coverimage.png

Today, Splinterlands introduces a new reward system that takes into account how much SPS you have staked when calculating your rewards. The idea is to promote investment into SPS, and to limit the value extraction possible by bot farms. The idea is great, but the suggested reward formula has a problem, which I will document here.

separator.png

New Splinterlands reward system

From the post where Splinterlands introduces the new system:

"The base amount of Reward Points earned from a ranked battle win (which determines how much SPS is won from the ranked battle reward pool as well as how many Focus and Season Points are earned towards loot chests) will be determined by the following formula:"

rating ^ 3 / 10000

...
"Finally, there be a new multiplier applied to the modified Reward Points which will be based on the amount of staked SPS the player has in their account (both owned and delegated), which will determine the final Reward Points earned from the battle. This multiplier will be calculated as follows:"

sps_multiplier = Max((staked_sps / (staked_sps + rating_constant)) * 13.3, 1)
rating_constant = ((rating - 100) * 0.007) ^ 3.5

separator.png

The problem

The reward system can punish you for increasing your rating if you dont have enough SPS staked.

Example with 5000 staked SPS

The figure below shows how the reward points, calculated as the product of the sps multiplier and the base amount of Reward Points (as described above), behaves as rating increases for 5000 staked SPS.

The rewards increase rapidly with rating below 2000. After that they increase more slowly to roughly 2600. Then there is a region where the rewards are reduced as the rating increases. This is the gray region in the figure above. In this case, the rewards are approximately 5% lower at 3400 rating than at 2600 rating.

Where the system punishes you for increasing rating

The chart below shows the combinations of staked SPS and rating that give reduced rewards with higher rating. The black region is where we don't want to be.

As shown here. the problem becomes irrelevant just above 30k staked SPS, as the rating you would need to obtain before being punished is only achievable for the top players in the end of a season. However, a large number of players have less than 30k staked, and can easily find themselves in the "punishment region".

image.png

Python code to reproduce the figures:

import matplotlib.pyplot as plt
import numpy as np


def sps_multiplier(rating,staked_sps):
    """ 
    Text in SPL post:
    sps_multiplier = Max((staked_sps / (staked_sps + rating_constant)) * 13.3, 1)
    rating_constant = ((rating - 100) * 0.007) ^ 3.5
    """
    rating_constant = ((rating - 100) * 0.007)**3.5
    return np.maximum((staked_sps / (staked_sps + rating_constant)) * 13.3, 1)

def reward_points(rating, staked_sps):
    """
    Text in SPL post:
    The base amount of Reward Points ... will be
    determined  by the following formula: rating ^ 3 / 10000
    """
    base = rating**3/1e4
    sps_multipl = sps_multiplier(rating, staked_sps)
    return base*sps_multipl

# Simple numerical gradient
def rp_gradient(rating, staked_sps):
    eps = 1e-3
    return (reward_points(rating+eps, staked_sps)\
           -reward_points(rating, staked_sps))/eps

# Plot the example for 5k staked sps
f = plt.figure(); ax = f.add_subplot(1,1,1)
x = np.linspace(0, 4500, 1000)
rp = reward_points(x, 0.5e4)/1e6
plt.plot(x, rp, label="5k staked SPS")
ax.set_xlabel("Rating"); ax.set_ylabel("Reward Points (in Millions)")
ax.legend()
grad = rp_gradient(x, 0.5e4)
I = np.where(grad<0)[0]
I1 = I[0]; I2 = I[-1]
ax.plot([x[I1], x[I1]], [0, rp[I1]], 'k--')
ax.plot([x[I2], x[I2]], [0, rp[I2]], 'k--')
ax.fill_between(x[I], 0*x[I], rp[I], zorder=-1, color='C7')
ax.set_xlim(0, 4500)
ax.set_ylim(0, 9)


# Plot the two-dimensional map
f2 = plt.figure(); ax2 = f2.add_subplot(1,1,1)
ratings = np.linspace(0, 4500, 1000)
sps_staked = np.linspace(0, 3e4, 1000)
x,y = np.meshgrid(ratings, sps_staked)
v = rp_gradient(x,y); v[np.isnan(v)] = 0; v[v>=0] = 1; v[v<0] = 0
ax2.imshow(v[::-1], extent=[0, 4500, 0, 3e4], aspect=0.1, cmap='binary_r')
ax2.set_xlabel("Rating")
ax2.set_ylabel("SPS Staked")

plt.show()

separator.png

Final words

I hope you found this post interesting. If you did, you might also enjoy my other content:

Battle mage challenges

Battle Mage Challenge: Going the Distance
Battle Mage Challenge: Ferocity
Battle Mage Challenge: Fog of War
Battle Mage Challenge: Fire & Regret
Battle Mage Challenge: Explosive weaponry

Brawl Reports

Peakmonsters [Legion] Brawl #161 Report
Peakmonsters [Legion] Brawl #160 Report
Peakmonsters [Legion] Brawl #159 Report

If you would like to see more of this content, please let me know, upvote and reblog the post. Also, if you have not yet started playing Splinterlands, you can join and support me and the same time with the following link

Join Splinterlands

Best of luck in Splinterlands!
Kalkulus

H2
H3
H4
3 columns
2 columns
1 column
Join the conversation now