As we launch SSV's Shifu V2 Testnet and move closer to a subsequent release candidate, the details of the network are beginning to solidify. But at this moment, before all of this is finalized in preparation for mainnet launch, we have an opportunity to augment the project's tokenomics to improve the network's properties, support the SSV community, and better serve the greater Ethereum ecosystem. This article illustrates how we might seek to achieve such effects and presents some example solutions for us to consider, including:
But please do not view this as an exhaustive list. Instead, the purpose of this is to explain how our objectives can be transformed into tangible features, and the primary concept that I wish to convey is this: If we can define objectives, and if we can formulate those objectives in terms of measurable metrics, then we can design mathematical mechanisms to encourage those desired properties. So let's discuss what our objectives should be and then work towards designing the corresponding mechanisms that support them.
You'll see that I dive into the math a bit here, but don't worry if you're non-technical. We have plenty of people that can listen to your ideas and handle the math, and I encourage everyone in the community to share their thoughts and ideas. With that said, I have tried to be demonstrative about how I think we should approach the design process, including the tuning of those functions and ensuring that they are bounded to guarantee safety.
For a description of the complete tokenomics design, see the documentation. However, to summarize the relevant concepts, let's use a figure from the documentation above:
From this diagram, we can see that ETH stakers on the network pay operators a fee (in SSV tokens) to run their validators. A small additional "network fee" is also charged to the staker, which goes to the DAO treasury to fund further ecosystem development and other activities approved by the DAO.
To ensure the network stays solvent and that operators always get paid for their work, each validator must maintain a minimum balance of SSV, called the "liquidation collateral". If a user balance drops below this minimum amount, their remaining balance will be liquidated, and their selected operators will cease performing duties for their validators.
So to represent it mathematically, let the fees be defined per validator as:
where
By increasing the network fee on an operator as their number of validators increases, we can discourage centralization by incentivizing stakers to choose smaller operators.
We can achieve this by defining the network fee as,
where
where
Image Not Showing
Possible Reasons
|
---|
Penalty function that increases the network fee as the size of an operator increases. |
Note that from Equation (2),
Tuning and bounding: This function has two parameters to tune:
We don't have any bounding concerns with this function, since
You can experiment with different values using this graphing tool.
Additional considerations: We might not have a reliable way to measure an operator's total size because they could spin up many nodes and try to keep each of them small. Without any mitigation of this, the above is still a partial solution, but a more robust way to evaluate operator size would be useful.
We can create the incentive for users to hold SSV by decreasing the network fee paid by validators as their amount of held SSV increases. This can be achieved by defining the network fee,
where
where
We could configure this in several ways, but here’s an example to illustrate: Let the amounts of SSV be defined with respect to the length of time the validator can be paid for (maybe using some average cost). So if we use a unit of months and let
Image Not Showing
Possible Reasons
|
---|
Discount function that decreases the network fee as the amount of SSV held by a user increases. |
With these example values, at the minimum amount of SSV held (
Observe that the effects of holding additional SSV are very high initially, with decreasing effect as more SSV is added, asymptotically approaching a full cancelation of the network fee (
Tuning and bounding: This function has one main parameter to tune:
However, if you zoom out on a plot of this function, you'll see that we're only using a specific region of it (and need to stay there). So we have some constraints with setting
You can experiment with different values using this graphing tool.
It's important to note that the mechanisms above can be implemented independently or in combination. I'll illustrate how we could combine them here by putting Equations (2) and (4) together, defining the network fee as,
Now the value of
Image Not Showing
Possible Reasons
|
---|
Function combining the discount from holding SSV with the centralization penalty for choosing large operators. |
The constants were set to the same values used above (
–For a user with the minimum SSV (
–For a user with 120 months of SSV and an operator with 0 validators, the network fee is 15% the base network fee. [best case: new operator, high fee mitigation]
–For a user with the minimum SSV using an operator with 2000 validators, the network fee is 320% the base network fee. [worst case: large operator, no fee mitigation]
–For a user with 120 months of SSV and an operator with 2000 validators, the network fee is 50% the base network fee. [large operator, high fee mitigation]
This feature is an exception in that it's not a direct mapping from objective to mechanism (although this might be possible). Rather, this is achieved through a secondary feature of the fee discount mechanism described above.
The fee discount creates a dynamic where a staker would save money by having more SSV tokens. We can extend this further and observe that they would also be incentivized to borrow those additional tokens if they could do so at a cost that is less than the savings earned. From the other side, a holder of SSV would be incentivized to lend their tokens to that staker because they could earn a return by taking a share of the staker's savings. In other words, the staker and the lender can work together to extract value from the fee discount mechanism, then share it.
To illustrate with an example, imagine a staker is paying a network fee of 1 SSV per year, and if they had more SSV, the discount would reduce that to 0.5 SSV per year, giving them 0.5 SSV of savings. Another SSV holder that wishes to earn a return on their tokens offers to lend those tokens to the staker for a price of 0.25 SSV. The staker accepts that deal and pays the lender their price of 0.25 SSV, so the lender walks away with 0.25 SSV profit. The staker uses those tokens to save 0.5 SSV, which after their payment to the lender, they have 0.25 SSV remaining as profit. Both the staker and lender made 0.25 SSV from this deal.
This value extraction can be utilized to create a method to stake SSV and earn a return on those tokens. However, there are a few ways this could be implemented. The simplest way is to take the staked SSV and apply it to the discount of all validators, lowering the network fee for everyone. But we could also have this be more directed, where a user would assign their staked SSV to a specific validator or group of validators. For example, they could decide to lower the cost of validators run on certain operators (e.g. small operators, operators running minority clients, etc.) to give them a competitive advantage and have an altruistic effect on the ecosystem. Or the staked SSV could be assigned dynamically to validators that would see the greatest discount, maximizing the return for SSV stakers. What do you think our objectives should be?
I suspect this design might be too complex to implement robustly on mainnet SSV. But regardless, I am presenting it here because it's a good opportunity to further illustrate this general approach. And we could still opt to use it for future incentivized testnet programs, where increased complexity carries far fewer costs.
One struggle of the SSV community has been our low rate of voter participation on DAO proposals. We can attempt to address this by incentivizing participation among users through rewards or penalties. For the sake of consistency, let's demonstrate it on the network fee,
One approach is to simply give a small discount for voting on DAO proposals, where the more a user votes, the greater their discount. We can achieve this by again modifying the network fee to be,
where
In choosing the function for
where
To mitigate this possible abuse, we can change our approach slightly to one where
where
![]() |
---|
Network fee that decreases as a user voting participation increases. |
Observe that the network fee decreases as the user votes over time, and therefore this should effectively reward participation without allowing significant abuse. However, we can refine this further, so let's ask ourselves some questions: Do we want to value consistent long-term participation more than short-term? Do we want new devoted users to be capable of earning the same discount as those that have participated from the beginning? How quickly should new users earn this discount? Should it expire? With answers to these questions, we can make adjustments.
To value long-term participation more highly, we can use another function to give little weighting to the users' early votes and more weighting as they continue. I'll use a logistic function to control the weighting here. I'm choosing it because it's effectively an "on-off switch", and I want to the discount to "turn on" when a user participates sufficiently. There are many similar functions that achieve a switching effect (e.g. step function, clamp function, smoothstep function), but I want something continuous and smooth, and the logistic function has a good shape for this application, while being fairly simple to evaluate. Written out, it looks like this,
and we can integrate it into Equation (9) by wrapping our summed ratio, using parameters
where
Choosing arbitrary values for the constants,
![]() |
---|
Network fee that decreases as a user votes for several months. |
Observe that the logistic function produces a property where a user must vote for several months before the discount grows significantly. Another feature of this function the flat section to the right, where the fee stops decreasing. This gives the discount an effective cap, such that participation above some threshold gives no additional discount, which limits the advantage of old users over new ones.
Now if we continue with this, we'll notice that with the function in Equations (11) and (12), a user could vote for a year or so then stop, and they would still keep the discount. If we want to encourage continued participation, we can modify the function to cause the discount to expire or decay.
There are again several options to accomplish this, but I'll use our friend the logistic function once more because it can "turn off" the discount in the same way it turned it on. We can weight each participation ratio using this function with respect to the number of months into the past, which will cause old votes to lose their value after a period of time. Modifying Equation (12) in this way, we get,
where
![]() |
---|
Network fee that decreases as a user votes for several months and reverts after they stop voting. |
Observe that the decay feature requires the user to continue participating to maintain their discount, and if they stop, the discount is lost over time.
If we put everything together, we have created a mechanism (Equations (7), (11), and (13)) with the following objectives and corresponding features:
Let's conclude by considering what we just did. We started with some objectives, and we showed how we can design a mechanism that achieves them. There are many ways to approach constructing designs, and this is all intended to illustrate a process more than to propose specific plans. So please don't get too hung up on the details of what's above. We have the freedom to engineer and tune all of this. Rather, let's ask ourselves these questions:
Thanks for reading, and please visit the SSV Discord to discuss these topics with the community