MarketMaker Scoring
Methodology
The evaluation objective is to reward market makers who consistently provide tight and deep liquidity for users.
Market makers earn points according to liquidity contribution, which means there is a score cap per block.
The calculation is done off-chain based on on-chain blockchain data. The codebase is publicly available for any third-party verification.
Market Maker Eligibility
Market maker eligibility is decided by governance every month.
Only registered market makers can earn incentives based on their scores. Market makers who fail to meet the uptime requirements are also given their month incentives.
New applicants are requested to submit ApplyMarketMaker transaction to be included in the uptime evaluation. Those who meet the uptime requirement will be included in eligible market makers through governance.
The governance can exclude existing market makers who fail to meet the requirements for 2 consecutive months or 3 months within the last 5 months.
Market Maker Orders Requirement
Orders satisfying following conditions can be recognized and evaluated:
Use MMOrder from eligible MMAddress
Spread
equal or smaller thanMaxSpread
Min(
AskWidth
,BidWidth
) equal or larger thanMinWidth
Min(
AskDepth
,BidDepth
) equal or larger thanMinDepth
Parameters (bottom of the document) are assigned differently for each pair depending on the market characteristics, and can be adjusted by governance
Uptime Requirement
Uptime requirement is measured in 2 stages:
LiveHour
is added as market maker provide valid orders for an hour. Following 1 out of 2 conditions, it fails:No valid orders longer than
MaxDowntime
in a rowNo valid orders longer than
MaxTotalDowntime
total in an hour
LiveDay
is added asLiveHour
is equal or larger thanMinHours
in a day
Those who earn
LiveDay
equal or larger thanMinDays
satisfy the uptime requirement.Parameters (bottom of the document) are decided and adjusted by governance.
Formula
Following formula is used to compute how much incentives should be rewarded to each market maker per month. The amount of CRE earned is determined by the relative share of each market maker’s score.
First step (within a block)
Calculate 2-sided liquidity point and take minimum value (take integer part)
Second step (within a block)
Third step (within a month)
Calculate
Uptime
by dividingLiveHour
with total hours in a monthU = Total
LiveHour
/ Total hours in a month
Forth step (Final score)
Processing Order data
All variables are used as final values after the trade is made.
Even if the order of n-th tick is partially filled, the tick can still be a reference point(whether the highest bid or lowest ask) of measures when one of the following conditions is met. If not, the following tick becomes the reference point.
Min(
AskQ(n)
,BidQ(n)
) is equal or larger thanMinOpenRatio
of the original orderMin(
AskQ(n)
,BidQ(n)
) is equal or larger thanMinOpenDepthRatio
ofMinDepth
Measures
Breadth
MidPrice
: Average price of lowest ask and highest bidSpread
: Price difference between lowest ask and highest bid divide byMidPrice
AskWidth
: Price difference between maximum and minimum ask divided byMidPrice
.BidWidth
is same with bid pricesAskD(n)
: Price difference betweenMidPrice
and n-th ask price divided byMidPrice
.BidD(n)
is same with bid prices
Depth
AskQ(n)
,BidQ(n)
: The amount of token remaining in n-th tickAskDepth
,BidDepth
: Total amount of token remaining in ask or bid side
Example
Assume
MaxSpread
0.012,MinWidth
0.002,MinDepth
100,MinOpenRatio
0.5,MinOpenDepthRatio
0.1Measure
Block 1
Market Maker AMarket Maker BMidPrice
9.945 = (9.96 + 9.93) / 2
9.945 = (9.97 + 9.92) / 2
Spread
0.00301659.. = (9.96 - 9.93) / 9.945
0.00502765.. = (9.97 - 9.92) / 9.945
AskWidth
0.00301659.. = (9.99-9.96) / 9.945
0.00201106.. = (9.99 - 9.97) / 9.945
BidWidth
0.00301659.. = (9.93-9.90) / 9.945
0.00201106.. = (9.92 - 9.90) / 9.945
AskD(1)
0.00150829.. = (9.96-9.945) / 9.945
0.00251382.. = (9.97 - 9.945) / 9.945
AskD(2)
0.00251382.. = (9.97-9.945) / 9.945
0.00351935.. = (9.98 - 9.945) / 9.945
AskD(3)
0.00351935.. = (9.98-9.945) / 9.945
0.00452488.. = (9.99 - 9.945) / 9.945
AskD(4)
0.00452488.. = (9.99-9.945) / 9.945
-
BidD(1)
0.00150829.. = (9.945-9.93) / 9.945
0.00251382.. = (9.945 - 9.92) / 9.945
BidD(2)
0.00251382.. = (9.945-9.92) / 9.945
0.00351935.. = (9.945 - 9.91) / 9.945
BidD(3)
0.00351935.. = (9.945-9.91) / 9.945
0.00452488.. = (9.945 - 9.90) / 9.945
BidD(4)
0.00452488.. = (9.945-9.90) / 9.945
-
AskDepth
200
225
BidDepth
160
240
AskQ(1)
50
75
AskQ(2)
50
75
AskQ(3)
50
75
AskQ(4)
50
-
BidQ(1)
40
80
BidQ(2)
40
80
BidQ(3)
40
80
BidQ(4)
40
-
Block 2
Market Maker AMarket Maker BMidPrice
9.935 = (9.96 + 9.91) / 2
9.945 = (9.97 + 9.92) / 2
Spread
0.00503271.. = (9.96 - 9.91) / 9.935
0.00502765.. = (9.97 - 9.92) / 9.945
AskWidth
0.00301962.. = (9.99-9.96) / 9.935
0.00201106.. = (9.99 - 9.97) / 9.945
BidWidth
0.00100654.. = (9.91-9.90) / 9.935
0.00201106.. = (9.92 - 9.90) / 9.945
AskD(1)
0.00251635.. = (9.96-9.935) / 9.935
0.00251382.. = (9.97 - 9.945) / 9.945
AskD(2)
0.00352289.. = (9.97-9.935) / 9.935
0.00351935.. = (9.98 - 9.945) / 9.945
AskD(3)
0.00452944.. = (9.98-9.935) / 9.935
0.00452488.. = (9.99 - 9.945) / 9.945
AskD(4)
0.00553598.. = (9.99-9.935) / 9.935
-
BidD(1)
0.00050327.. = (9.935-9.93) / 9.935
0.00251382.. = (9.945 - 9.92) / 9.945
BidD(2)
0.00150981.. = (9.935-9.92) / 9.935
0.00351935.. = (9.945 - 9.91) / 9.945
BidD(3)
0.00251635.. = (9.935-9.91) / 9.935
0.00452488.. = (9.945 - 9.90) / 9.945
BidD(4)
0.00352289.. = (9.935-9.90) / 9.935
-
AskDepth
190
225
BidDepth
80
180
AskQ(1)
40
75
AskQ(2)
50
75
AskQ(3)
50
75
AskQ(4)
50
-
BidQ(1)
0
20
BidQ(2)
5
80
BidQ(3)
40
80
BidQ(4)
40
-
In case of market maker A, the highest bid has moved from 9.93 to 9.91 at block 2.
BidQ(2)
does not meet the either conditions ofMinOpenRatio
of original order amount (5/40 < 0.5) norMinOpenDepthRatio
( 100(MinDepth
) * 0.1 = 10 ).For market maker B’s case, reference point haven’t changed.
BidQ(1)
could not meet theMinOpenRatio
(20/80 < 50)condition, but larger thanMinOpenDepthRatio
.
Liquidity Point
Block 1
Both market maker A and B meet the condition
Spread(A)
,Spread(B)
<MaxSpread
(0.012)AskWidth(A)
,BidWidth(A)
,AskWidth(B)
,BidWidth(B)
>MinWidth
(0.002)AskDepth(A)
,BidDepth(A)
,AskDepth(B)
,BidDepth(B)
>MinDepth
(100)
Block 2
Only Market maker B meet the condition,
Spread(A)
,Spread(B)
<MaxSpread
(0.012)AskWidth(A)
,AskWidth(B)
,BidWidth(B)
>MinWidth
(0.002)BidWidth(A) < MinWidth
AskDepth(A)
,AskDepth(B)
,BidDepth(B)
>MinDepth
(100)BidDepth(A) < MinDepth
Contribution Score
Final Score
Sum up all of the contribution scores for the month and product cube of uptime
Parameters
Scoring module contains following parameters :
Common Parameters
MinOpenRatio
Minimum ratio to maintain the tick order
0.5
MinOpenDepthRatio
Minimum ratio of open amount to MinDepth
0.1
MaxDowntime
Maximum allowable consecutive blocks of outage
20 (blocks)
MaxTotalDowntime
Maximum allowable sum of blocks in an hour
100 (blocks)
MinHours
Minimum value of LiveHour to achieve LiveDay
16
MinDays
Minimum value of LiveDay to maintain MM eligibility
22
Parameters for each pair
PairId
Pair id of liquidity module
20
UpdateTime
Time the pair variables start to be applied to the scoring system
2022-12-01T00:00:00Z
IncentiveWeight
Incentive weights for each pair
0.1
MaxSpread
Maximum allowable spread between bid and ask
0.006 (ETH-USDC pair), 0.012 (ATOM-USDC pair)
MinWidth
Minimum allowable price difference of high and low on both side of orders
0.001 (ETH-USDC pair), 0.002 (ATOM-USDC pair)
MinDepth
Minimum allowable order depth on each side
600000000000000000 (ETH-USDC pair), 100000000 (ATOM-USDC pair)
Last updated