Savvy SVY Token Emissions

Savvy DeFi
2023-09-13

This document examines the SVY token emissions schedule. We perform a number of checks to ensure the accuracy of the schedule and token quantities. Finally, using the emissions schedule we just validated, we visualize the 6-year timecourse of the schedule.

The numbers discussed in this report are current as of the date above - but may be subject to change due to DAO governance. For example, the DAO will be empowered to adjust the distribution of emissions to various liquidity pools. Please ensure you have access to the latest data.

Checksumming allocation totals

In the first section of this document, we will checksum each of the allocations to ensure monthly allocations sum to the proper total allocation. Each time a test results in TRUE, this means we obtained the expected result.

svy_total = 10000000

team_total = .11 * svy_total
treasury_total = .11 * svy_total
dao_total = .15 * svy_total
ecosystem = round(.07 * svy_total, digits=0)
liquidity_mining_total = .39 * svy_total
boost_total = round(.07 * svy_total, digits=0)
lge_total = 0 * svy_total
lbp_total = .05 * svy_total
seed_total = .05 * svy_total

checksum = team_total + 
  treasury_total + 
  dao_total + 
  ecosystem + 
  liquidity_mining_total + 
  boost_total + 
  lge_total + 
  lbp_total + 
  seed_total

checksum == svy_total
[1] TRUE
checksum == 10000000
[1] TRUE

As 1,000,000 SVY are allocated to the launch, the remaining 9,000,000 SVY are emitted over time.

svy_total - lge_total - lbp_total - seed_total == 9000000
[1] TRUE

Calculating monthly emissions

For most of the allocations, emissions are linear.

Seed

Total Seed allocation is 500,000 over 2 years.

seed_total == 500000
[1] TRUE
seed_per_month = 20833.33
all.equal(seed_total, seed_per_month*24, tolerance=0.001)
[1] TRUE
seed_series = c(rep(seed_per_month, 24))
all.equal(sum(seed_series), seed_total, tolerance=0.001)
[1] TRUE

Team

Total Team emissions are 1,100,000 SVY. Team allocations are slightly larger during the first month, then the remaining months are constant.

team_total == 1100000
[1] TRUE
team_per_month = (team_total - 77000 - 40000) / 70
team_per_month
[1] 14042.86
all.equal(77000 + 40000 + team_per_month * 70, team_total, tolerance=0.001)
[1] TRUE
team_series = c(77000, 40000, rep(team_per_month, 70))
all.equal(sum(team_series), team_total, tolerance=0.001)
[1] TRUE

Treasury

Total Treasury emissions are 1,100,000 SVY. Treasury emissions are front-loaded and occur over a 2-year term. Emissions during the first two months are the greatest; the subsequent two months are also larger, and the remaining months are constant.

treasury_total == 1100000
[1] TRUE

Determine monthly emissions

treasury_monthly = (treasury_total - 200000*2 - 100000*2) / 20
treasury_monthly
[1] 25000
200000 * 2 + 100000 * 2 + treasury_monthly * 20 == treasury_total
[1] TRUE
treasury_series = c(rep(200000, 2), rep(100000, 2), rep(treasury_monthly, 20))
all.equal(sum(treasury_series), treasury_total, tolerance=0.001)
[1] TRUE

DAO

Total DAO emissions are 1,500,000 SVY. The DAO receives a slightly larger allocation during the first month, then the remaining months are constant.

dao_total == 1500000
[1] TRUE
dao_monthly = (dao_total - 22000) / 71
dao_monthly
[1] 20816.9
22000 + dao_monthly * 71 == dao_total
[1] TRUE
dao_series = c(22000, rep(dao_monthly, 71))
all.equal(sum(dao_series), dao_total, tolerance=0.001)
[1] TRUE

Ecosystem/Bounty

The Ecosystem allocation is for growing the protocol. Total Ecosystem/Bounty emissions are 700,000 SVY Ecosystem emissions are brief, concluding within five months. They are constant throughout.

ecosystem_total = 700000
ecosystem_monthly = ecosystem_total / 5
ecosystem_monthly
[1] 140000
ecosystem_series = rep(ecosystem_monthly, 5)
sum(ecosystem_series) == ecosystem_total
[1] TRUE

veSVY Boost

Total veSVY Boost emissions are 700,000 SVY. The veSVY Boost emissions start at a reduced rate for 4 months, but becomes constant for the remainder of the 72-month term.

boost_total == 700000
[1] TRUE

Calculate the SVY per month for months 5-72.

boost_monthly = (boost_total - (4000 + 5000 + 6000 + 7000)) / 68
boost_monthly
[1] 9970.588

Ensure this sums to the total.

4000 + 5000 + 6000 + 7000 + (boost_monthly * 68) == boost_total
[1] TRUE

Create data series and ensure that sums to total, also.

boost_series = c(4000, 5000, 6000, 7000, rep(boost_monthly, 68))
sum(boost_series) == boost_total
[1] TRUE

Liquidity Mining

Total Liquidity Mining emissions are 3,900,000 SVY. These emissions are the most complex; they start at a substantial amount and are reduced each month, generating a cumulative emissions curve. The cumulative emissions for any year are given by the following function:

\(\frac{3051915 * year^{\frac{3}{4}}}{3}\)

[1] "delta.    : 0.087992"

Examine sums; ensure delta ~ 0.

sprintf("summed.   : %f", final_summed_monthly)
[1] "summed.   : 3900000.087992"
sprintf("cumulative: %f", final_cumulative)
[1] "cumulative: 3900000.087992"
sprintf("delta.    : %f", final_delta)
[1] "delta.    : 0.087992"

Examine monthly emissions

unlist(lapply(1:72, monthly_emissions))
 [1] 157784.83 107576.57  94310.24  86611.26  81302.48  77307.80
 [7]  74136.53  71525.66  69318.66  67415.28  65747.69  64268.01
[13]  62941.23  61741.06  60647.29  59644.05  58718.68  57860.94
[19]  57062.41  56316.12  55616.22  54957.77  54336.55  53748.93
[25]  53191.77  52662.34  52158.26  51677.42  51217.96  50778.22
[31]  50356.74  49952.19  49563.39  49189.27  48828.85  48481.26
[37]  48145.70  47821.45  47507.82  47204.22  46910.08  46624.88
[43]  46348.15  46079.44  45818.34  45564.48  45317.49  45077.06
[49]  44842.88  44614.65  44392.12  44175.03  43963.14  43756.24
[55]  43554.12  43356.59  43163.45  42974.54  42789.70  42608.76
[61]  42431.58  42258.03  42087.97  41921.27  41757.83  41597.53
[67]  41440.25  41285.90  41134.39  40985.62  40839.50  40695.94

Checksum Liquidity Mining Emissions

mining_series = unlist(lapply(1:72, monthly_emissions))
all.equal(sum(mining_series), mining_total, tolerance=0.001)
[1] TRUE

Final data series

The monthly emissions values that we just checksummed are combined into a single table to be plotted.

Emissions

The following plot depicts the cumulative SVY distribution schedule over a 6-year period.

Emissions after Launch

Because the Launch and Seed are one-time events, we have also plotted the Cumulative Emissions Schedule without those allocations.

Monthly emission schedule

Emissions per Year

year treasury dao_ecosystem team boost liquidity_mining tge seed
1 8e+05 950985.9 257428.6 101764.7 1017305.0 5e+05 250000
2 3e+05 249802.8 168514.3 119647.1 693591.3 NA 250000
3 NA 249802.8 168514.3 119647.1 608057.7 NA NA
4 NA 249802.8 168514.3 119647.1 558419.1 NA NA
5 NA 249802.8 168514.3 119647.1 524191.2 NA NA
6 NA 249802.8 168514.3 119647.1 498435.8 NA NA

Weekly Liquidity Mining Emissions

Because liquidity mining emissions are more dynamic towards launch time, we examined week-level emissions for greater time resolution.

week per_week cumulative
1 55785.36 55785.36
2 38034.06 93819.42
3 33343.70 127163.12
4 30621.70 157784.83
5 28744.77 186529.60
6 27332.43 213862.03
7 26211.22 240073.26
8 25288.14 265361.39
9 24507.85 289869.24
10 23834.90 313704.14
11 23245.32 336949.46
12 22722.17 359671.63
13 22253.08 381924.72
14 21828.76 403753.48
15 21442.06 425195.53
16 21087.36 446282.89
17 20760.19 467043.08
18 20456.93 487500.01
19 20174.61 507674.62
20 19910.76 527585.37
21 19663.30 547248.68
22 19430.51 566679.19
23 19210.87 585890.06
24 19003.11 604893.17
25 18806.13 623699.30
26 18618.95 642318.25
27 18440.73 660758.98
28 18270.73 679029.71
29 18108.28 697137.99
30 17952.81 715090.80
31 17803.80 732894.60
32 17660.77 750555.37
33 17523.31 768078.67
34 17391.03 785469.70
35 17263.61 802733.31
36 17140.71 819874.02
37 17022.08 836896.10
38 16907.43 853803.53
39 16796.55 870600.09
40 16689.21 887289.30
41 16585.22 903874.52
42 16484.39 920358.91
43 16386.55 936745.45
44 16291.54 953036.99
45 16199.23 969236.22
46 16109.48 985345.70
47 16022.15 1001367.85
48 15937.15 1017305.00

A Note about Time

Emissions have been calculated for 72 periods of distribution, corresponding to the 72 months in a 6-year duration. Each month is broken into 4 weeks of 7 days each, resulting in 48 periods per year. Because most months have more than 28 days, the emissions are simply distributed evenly across the time period, such that those 48 periods expanded to cover a full year. This structure makes it very easy to calculate the monthly emissions quantities, which is how the contracts are coded, but it becomes slightly awkward to calculate daily quantities.