Summary
This proposal directly supersedes SCP-128 entirely.
This proposal outlines a parametric fee model to be implemented on all trades routes.
FOX holders receive discounted, up to free trades, based on a parameter.
Small trades under a given parameter qualify for free trades.
A parametric curve determines discounted fees as a function of size.
Parameters will initially be determined by governance via this proposal.
They will be maintained by TMDC in the interim and implemented by product and engineering.
Ultimately be maintained via governance and enacted via SnapShot, with the results attached as data to the proposal and stored on chain. This is consistent with mature DAO best practices, inspired by lending protocols like Aave, or AMM’s like Curve.
Abstract
This proposal introduces a three-fold change to our DAO’s fee structure.
First, we eliminate fees for small trades.
Second, we dramatically reduce fees for high-volume trades, targeting large traders while maintaining some value capture.
Lastly, we propose linearly-discounted trades for FOX token holders, with 1,000,000 FOX giving a 100% discount, or free trades. This encourages longer-term holding of our native token, while simultaneously offering direct utility and value to our community.
Motivation
ShapeShift is not profitable. We are burning ~$200k in stablecoin runway each month, more if subsidized infrastructure via the Fox Foundation is included. We need to promptly course correct from our current default-dead business model and it should be in governance’s hands to determine that future
ShapeShift tried a “many revenue streams” approach. These are often characterized as great or diverse. Unfortunately, they all have either become defunct, have failed to deliver, or take so long to convert that the DAO can’t meet its obligations. Or worse, they deliver tokens that are held back from conversion into our main liability assets. While it makes logical sense to have diverse revenue, without proper ownership they don’t convert in any meaningful timeline.
Monetizing trade volume via fees is the de facto standard way for similar organizations or competitions within the ecosystem to generate revenue.
omgitsjustfees-alwayshasbeen.jpg
There exists ambiguity in governance and the community around recently implemented fees via monetization experiments with good arguments on both sides of an old debate.
Several proposals exist to indirectly address the debate around fees with varied approaches and subtexts.
-
This proposal seeks an amenable, unambiguous and clear compromise on multiple positions in a concrete way, meeting the following criteria:
Free trades for small amounts under a specified parameter
- Free, or discounted trades for FOX holders based on holdings
- Fees that decrease as a function of trade size, starting at a maximum parameter, decaying to a minimum parameter, with curve parameters.
A data-driven, unambiguous, governance-approved, and parametric fee model with clear invalidation criteria plus tunability is necessary to ensure robust trade driven revenue, and hence sustainability and survival for the DAO.
Specification
The model and its parameters shall apply to all current and future trade routes or features that include a buy and sell asset(s).
It is useful to consider the parameters and their interactions in parts.
Success and failure criteria
If over the 3 month trial period, 1 month trailing trade volume dips below 50% of the last 3 months average trade volume we will consider this a failure and revert back to no fees.
Outsized trade volume that was incentivized by Optimism token rewards shall be excluded from historical data, and the underlying trade volume considered.
Free trades for small traders
Problem: Small traders are fickle, transient, create an outsized support burden, yet are often vocal supporters of a good product. Although they are difficult to serve, they can become one of our strongest assets for the community.
Small traders are also difficult to monetize, for example
-
A 25bps fee on a $1,000 trade equates to $2.50 in DAO revenue.
- This would require ~80,000 transactions of $1000 per month to generate $200k in revenue.
- Large numbers of small users is difficult for support, operations and moderation; we reached a peak of ~50,000 MAU with ~$300,000 of OP token incentives
Solution - let small trades be free, up to a specified parameter. We propose the following parameter
-
no_fee_threshold_usd
- Denominated in USD at market price of sell asset
- Price oracles are not of concern; downside risk is limited to a lost fee.
- Set to $1000 initially.
A small trader given a good experience can become a loyal supporter. We let the krill go free.
Free trades for FOX holders
Problem: Currently the FOX token has no economic utility outside governance participation, sadly the space still finds governance underrated as a use case.
Solution: This proposal gives the token utility by linearly discounting trade fees to zero for FOX holders. This is a necessary but insufficient step towards a FOX rewards program, which is yet to be specified.
The parameter should be designed with the consideration of the LTV of the user in terms of revenue foregone if fees were mandatory, assuming demand is purely inelastic. This is not precisely true, but a good linearization determines a starting point.
A reasonable economic burden to the buyer, but still creating a monetary incentive to buy, hold, and participate.
-
For the purpose of analysis, let’s consider the current market, and the persona “rational actor”
a FOX price of $0.02, with
- A user executing a $10,000 trade,
- 30bps fees
Said trade brings the DAO $30 in revenue. The persona of a user executing $10,000 in current market conditions is one of a regularly active participant. Assume they execute one transaction per month for 12 months, paying $360 in fees - their lifetime value, or LTV.
The following extreme examples would not fit their use case:
-
100 FOX, or $2. A rational actor would buy $2 worth of FOX to offset a $30 fee on a single trade. Clearly, this is easily exploitable and harmful to DAO revenue.
- 1,000,000 FOX, or $20,000. A rational actor is unlikely to allocate $20,000 of capital to offset $360 of trades in a year.
There exists a balance we must strike to capture value between easily foregone revenue and an unattractive proposition to users.
As such, we propose the following parameter
-
fox_max_discount_threshold
- Denominated in FOX
- Holding 0 FOX will not apply any fee discount
- Holding this value of FOX or more will discount fees by 100%
- A linear discount is applied between, e.g. 250,000 FOX will apply a 25% discount to the fees that are otherwise calculated based on trade size.
- Set to an initial value of 1,000,000 FOX,or $20,000 given the price used above.
- Determined via the same mechanism as governance, i.e. SnapShot algorithm. This captures the market participants including liquidity providers, farmers, multiple chains etc.
- We propose a second, accompanying parameter
fox_discount_delay_hours
- Initially set to 168 (7 days)
- A user must hold the amount of FOX using the snapshot strategy for this period before the discount is applied
- This parameter is intended to assuage concerns of users obtaining FOX, executing trades, then disposing of it shortly afterwards.
- In the future, via a future proposal, this could be modified to ramp up to the FOX discount over a holding period
- Currently, it is a simple delay
Bear in mind, the cost of acquiring the minimum FOX required is not an expense to the user, rather a capital allocation. They are not worse off - they have allocated capital to a liquid asset that can later be disposed of, and market participants may speculate on price and are exposed to volatility in both directions.
This could also be denominated in a USD value, with a utility appropriate to market conditions, say $2,000, and computed using a suitable price oracle such as Chainlink, however this adds additional lift and can be considered in a future proposal.
We support the FOX holding community.
Fee discount curve
Businesses operating at scale can afford to operate on lower margins, referred to as volume discounts.
Fees charged to a user should be proportional to the utility of the service that is provided to them.
Consider a flat 25 bps fee on various trade sizes
-
A user executing a $1000 trade doesn’t need a $2.50 fee to worry about.
- A user executing a $10,000 trade on a slick and reliable UI will gladly pay $25 for the service of doing so. We’ve heard this direct feedback from users actually doing these trades “don’t clutter my UI with options, just make the execution good. I’ll gladly pay since I already do everywhere else.”
- A user executing a $1,000,000 trade on the same UI will likely find a $2,500 fee steep, and are savvy enough to seek optimal trade routes elsewhere.
We propose a sigmoid curve-based decaying fee structure. This model allows for flexibility and value capture across various trade sizes.
See the Python implementation below, which is easily understood.
First, we can calculate the fee according to the sigmoid curve. A second dimension to the fee calculation is the FOX held which creates the FOX discount percentage. This discount percentage is applied to the sigmoid curve to get the final fee to be charged.
Key Parameters
- FOX Max Discount Threshold (FOX)
- Holding this amount of FOX gives a 100% fee discount
- Holding a fraction of this FOX gives the same fraction of 100% as a discount.
- No-Fee Threshold (USD)
- Transactions below this threshold incur zero fees.
- Initial value: $1,000
- Max Fee (bps)
- The highest possible fee rate, applying immediately after surpassing the No-Fee Threshold.
- Initial value: 29 basis points
- Psychologically lower than 30bps, easy sell.
- Min Fee (bps)
- The fee asymptotically approaches this value as trade size goes to infinity.
- Initial value: 10 basis points
- Long tail value capture on large trades.
- Curve Midpoint (USD)
- This parameter sets the inflection point of the sigmoid curve.
- Initial value: $150,000
- This “moves” the curve left and right.
- Curve Steepness Factor (k)
- Controls the "sharpness" of the sigmoid curve.
- A higher value leads to a more gradual transition; a lower value leads to a sharper transition.
- Initial value: 40,000
- This value is unitless and arbitrary.
Model Features
- Utilizes a sigmoid function to define the fee curve.
- Allows for easy adjustments via key parameters.
- Designed to capture maximum value in the range where the majority of trades occur.
Benefits
- Accommodates both small and large traders.
- Enables optimal value capture on the most frequent trade sizes.
- Key parameters are under DAO governance, allowing future adjustments
- Gives FOX holders another utility
Model implementation
An interactive Google Colaboratory notebook is available here to be forked https://colab.research.google.com/drive/1DloLZDsy4-atEzFOlMixzdPlprFyjHik
Python implementation
parameters governance votes on
fox_max_discount_threshold = 1_000_000 # Maximum FOX held for 100% discount
no_fee_threshold_usd = 1_000 # USD
max_fee_bps = 29 # bps - what fees start at
min_fee_bps = 10 # bps - what fees go down to, if you don’t hold any FOX
midpoint_usd = 150_000 # USD - the “knee” of the fee curve
steepness = 40_000 # unitless - the steepness of the fee curve
implementation of the proposal you are voting on
def calculate_fee_bps(trade_amount_usd, fox_held, no_fee_threshold_usd, max_fee_bps, min_fee_bps, midpoint_usd, steepness):
# fee free amount
if trade_amount_usd <= no_fee_threshold_usd:
return 0
# decreasing fee based on trade amount
sigmoid_fee = min_fee_bps + (max_fee_bps - min_fee_bps) / (1 + np.exp(1 / steepness * (trade_amount_usd - midpoint_usd)))
# apply the discount based on FOX held
fox_discount = fox_held / fox_max_discount_threshold
fee_bps = sigmoid_fee * (1 - fox_discount)
return max(fee_bps, 0)
Visualization
A visualization is provided for illustrative and grokking purposes. The parameters and function above shall be the canonical reference and implementation, and form the core of this proposal.
Benefits
This proposal is quantitative and focuses the discussion on the mechanics and parameters of the model, rather than assertions and hope.
It is easily understood, marketable and catchy, with a consistent message, and details that can be expanded upon by referencing dynamic parameters, for example
-
“Small trades are free at ShapeShift!”
- “We support small traders, we don’t charge fees under no_fee_threshold_usd”
- “Free trades for FOX holders at ShapeShift”
- “We support our community - hold fox_max_discount_threshold and get free trades at ShapeShift”
- “Bigger trades are cheaper at ShapeShift”
- “We welcome whales - only calculate_fee_bps(...) basis points for your $trade_amount_usd trade at ShapeShift”, or “$400 fees on a million dollar trade? $FOX yeah”
Allows for data-driven feedback and experimentation with the parameters of the model to maximize revenue generation.
Creates a value accrual mechanism for the ShapeShift token outside governance participation.
Directly addresses multiple outstanding proposals trying to indirectly address this core issue in underhanded ways.
Users can choose to opt-out of fees by buying FOX, creating buy pressure.
Creates a liquid revenue stream across a variety of trade routes that can be promptly converted into stablecoins at the TMDC’s discretion to extend our runway and ensure survival.
Drawbacks
This may impact grant funding at Optimism but TBD on other grant partnerships.
This may mean we are not classed as a free public good, worth noting we are still majority open source.
The delegation of responsibility to the TMDC is acceptable but not maximal decentralization.
Ensuring a balance of rapidly responding to price volatility and market feedback, vs. the cumbersome nature of a governance vote enacting simple parameter changes will be difficult to explicitly define, refine, and iterate on.
The system may be open to abuse in unforeseen ways, leading to market volatility.