Skip to content

Commit 418ce42

Browse files
Retroactive pr (backport #3033) (#3034)
Co-authored-by: Justin Barnett <61020572+jusbar23@users.noreply.github.com>
1 parent fdaa144 commit 418ce42

File tree

4 files changed

+116
-57
lines changed

4 files changed

+116
-57
lines changed

protocol/x/clob/keeper/orders.go

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -187,13 +187,6 @@ func (k Keeper) PlaceShortTermOrder(
187187
order.OrderId.MustBeShortTermOrder()
188188
orderLabels := order.GetOrderLabels()
189189

190-
if _, err := k.revshareKeeper.GetOrderRouterRevShare(
191-
ctx,
192-
order.GetOrderRouterAddress(),
193-
); err != nil {
194-
return 0, 0, err
195-
}
196-
197190
defer telemetry.ModuleMeasureSince(types.ModuleName, time.Now(), metrics.PlaceOrder, metrics.Latency)
198191
defer func() {
199192
telemetry.IncrCounterWithLabels(

protocol/x/clob/keeper/orders_test.go

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@ import (
3131
"github.com/dydxprotocol/v4-chain/protocol/x/perpetuals"
3232
perptypes "github.com/dydxprotocol/v4-chain/protocol/x/perpetuals/types"
3333
"github.com/dydxprotocol/v4-chain/protocol/x/prices"
34-
revsharetypes "github.com/dydxprotocol/v4-chain/protocol/x/revshare/types"
3534
rewardtypes "github.com/dydxprotocol/v4-chain/protocol/x/rewards/types"
3635
statstypes "github.com/dydxprotocol/v4-chain/protocol/x/stats/types"
3736
satypes "github.com/dydxprotocol/v4-chain/protocol/x/subaccounts/types"
@@ -365,7 +364,7 @@ func TestPlaceShortTermOrder(t *testing.T) {
365364
constants.BtcUsd_SmallMarginRequirement.Params.Id: big.NewInt(100_000_000),
366365
},
367366
},
368-
"Cannot open an order with an invalid order router address": {
367+
"Can open an order with an invalid order router address": {
369368
perpetuals: []perptypes.Perpetual{
370369
constants.BtcUsd_100PercentMarginRequirement,
371370
},
@@ -388,7 +387,12 @@ func TestPlaceShortTermOrder(t *testing.T) {
388387
OrderRouterAddress: constants.CarlAccAddress.String(),
389388
},
390389

391-
expectedErr: revsharetypes.ErrOrderRouterRevShareNotFound,
390+
expectedOrderStatus: types.Success,
391+
expectedFilledSize: 0,
392+
expectedOpenInterests: map[uint32]*big.Int{
393+
// unchanged, no match happened
394+
constants.BtcUsd_100PercentMarginRequirement.Params.Id: big.NewInt(100_000_000),
395+
},
392396
},
393397
`New order should be undercollateralized when matching when previous fills make it undercollateralized when using
394398
maker orders subticks, but would be collateralized if using taker order subticks`: {
@@ -1207,7 +1211,7 @@ func TestPerformStatefulOrderValidation(t *testing.T) {
12071211
},
12081212
expectedErr: "must be a multiple of the ClobPair's StepBaseQuantums",
12091213
},
1210-
"Fails if Order router address is not found": {
1214+
"Still succeeds if Order router address is not found": {
12111215
order: types.Order{
12121216
OrderId: types.OrderId{
12131217
ClientId: 0,
@@ -1220,7 +1224,6 @@ func TestPerformStatefulOrderValidation(t *testing.T) {
12201224
GoodTilOneof: &types.Order_GoodTilBlock{GoodTilBlock: blockHeight + 5},
12211225
OrderRouterAddress: constants.AliceAccAddress.String(),
12221226
},
1223-
expectedErr: "order router rev share not found",
12241227
},
12251228
"Fails if GoodTilBlock is in the past": {
12261229
order: types.Order{

protocol/x/revshare/keeper/revshare.go

Lines changed: 40 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -222,11 +222,10 @@ func (k Keeper) GetAllRevShares(
222222
var orderRouterRevShares []types.RevShare
223223
netFeesSubRevenueShare := new(big.Int).Set(netFees)
224224
// No affiliate fees shared, so we can generate order router rev shares
225-
if affiliateRevShares == nil {
226-
orderRouterRevShares, err = k.getOrderRouterRevShares(ctx, fill, takerFees, makerFees)
227-
if err != nil {
228-
return types.RevSharesForFill{}, err
229-
}
225+
// In the case that the taker has an affiliate fee and the maker does not, then no order router fees are generated
226+
// for the maker or the taker
227+
if len(affiliateRevShares) == 0 {
228+
orderRouterRevShares = k.getOrderRouterRevShares(ctx, fill, takerFees, makerFees)
230229
for _, revShare := range orderRouterRevShares {
231230
netFeesSubRevenueShare.Sub(netFeesSubRevenueShare, revShare.QuoteQuantums)
232231
}
@@ -325,58 +324,54 @@ func (k Keeper) getOrderRouterRevShares(
325324
fill clobtypes.FillForProcess,
326325
takerFees *big.Int,
327326
makerFees *big.Int,
328-
) ([]types.RevShare, error) {
327+
) []types.RevShare {
329328
if fill.TakerOrderRouterAddr == "" && fill.MakerOrderRouterAddr == "" {
330-
return nil, nil
329+
return []types.RevShare{}
331330
}
332331

333332
orderRouterRevShares := []types.RevShare{}
334333
takerOrderRouterRevSharePpm, err := k.GetOrderRouterRevShare(ctx, fill.TakerOrderRouterAddr)
335334
if err != nil {
336-
// This should never happen
337-
k.Logger(ctx).Error("order router rev share not found for taker: " + fill.TakerOrderRouterAddr)
338-
return nil, err
339-
}
340-
341-
if fill.TakerOrderRouterAddr != "" {
342-
// Orders can have 2 rev share ids, we need to calculate each side separately
343-
// This is taker ppm * min(taker, taker - maker_rebate)
344-
takerFeesSide := lib.BigMin(takerFees, new(big.Int).Add(takerFees, makerFees))
345-
takerRevShare := lib.BigMulPpm(lib.BigU(takerOrderRouterRevSharePpm), takerFeesSide, false)
346-
orderRouterRevShares = append(orderRouterRevShares, types.RevShare{
347-
Recipient: fill.TakerOrderRouterAddr,
348-
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_TAKER_FEE,
349-
RevShareType: types.REV_SHARE_TYPE_ORDER_ROUTER,
350-
QuoteQuantums: takerRevShare,
351-
RevSharePpm: takerOrderRouterRevSharePpm,
352-
})
335+
k.Logger(ctx).Error("order router rev share invalid for taker: " + fill.TakerOrderRouterAddr)
336+
} else {
337+
if fill.TakerOrderRouterAddr != "" {
338+
// Orders can have 2 rev share ids, we need to calculate each side separately
339+
// This is taker ppm * min(taker, taker - maker_rebate)
340+
takerFeesSide := lib.BigMin(takerFees, new(big.Int).Add(takerFees, makerFees))
341+
takerRevShare := lib.BigMulPpm(lib.BigU(takerOrderRouterRevSharePpm), takerFeesSide, false)
342+
orderRouterRevShares = append(orderRouterRevShares, types.RevShare{
343+
Recipient: fill.TakerOrderRouterAddr,
344+
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_TAKER_FEE,
345+
RevShareType: types.REV_SHARE_TYPE_ORDER_ROUTER,
346+
QuoteQuantums: takerRevShare,
347+
RevSharePpm: takerOrderRouterRevSharePpm,
348+
})
349+
}
353350
}
354351

355352
makerOrderRouterRevSharePpm, err := k.GetOrderRouterRevShare(ctx, fill.MakerOrderRouterAddr)
356353
if err != nil {
357-
// This should never happen
358-
k.Logger(ctx).Error("order router rev share not found for maker: " + fill.MakerOrderRouterAddr)
359-
return nil, err
360-
}
361-
362-
if fill.MakerOrderRouterAddr != "" {
363-
// maker ppm * max(0, maker)
364-
makerFeeSide := lib.BigMax(lib.BigI(0), makerFees)
365-
makerRevShare := lib.BigMulPpm(makerFeeSide,
366-
lib.BigU(makerOrderRouterRevSharePpm),
367-
false,
368-
)
369-
370-
orderRouterRevShares = append(orderRouterRevShares, types.RevShare{
371-
Recipient: fill.MakerOrderRouterAddr,
372-
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_MAKER_FEE,
373-
RevShareType: types.REV_SHARE_TYPE_ORDER_ROUTER,
374-
QuoteQuantums: makerRevShare,
375-
RevSharePpm: makerOrderRouterRevSharePpm,
376-
})
354+
k.Logger(ctx).Error("order router rev share invalid for maker: " + fill.MakerOrderRouterAddr)
355+
} else {
356+
if fill.MakerOrderRouterAddr != "" {
357+
// maker ppm * max(0, maker)
358+
makerFeeSide := lib.BigMax(lib.BigI(0), makerFees)
359+
makerRevShare := lib.BigMulPpm(makerFeeSide,
360+
lib.BigU(makerOrderRouterRevSharePpm),
361+
false,
362+
)
363+
364+
orderRouterRevShares = append(orderRouterRevShares, types.RevShare{
365+
Recipient: fill.MakerOrderRouterAddr,
366+
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_MAKER_FEE,
367+
RevShareType: types.REV_SHARE_TYPE_ORDER_ROUTER,
368+
QuoteQuantums: makerRevShare,
369+
RevSharePpm: makerOrderRouterRevSharePpm,
370+
})
371+
}
377372
}
378373

379-
return orderRouterRevShares, nil
374+
return orderRouterRevShares
380375
}
381376

382377
func (k Keeper) getUnconditionalRevShares(

protocol/x/revshare/keeper/revshare_test.go

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1029,6 +1029,74 @@ func TestKeeper_GetAllRevShares_Valid(t *testing.T) {
10291029
require.NoError(t, err)
10301030
},
10311031
},
1032+
{
1033+
name: "Rev share populates order router rev share even if one is missing",
1034+
expectedRevSharesForFill: types.RevSharesForFill{
1035+
AllRevShares: []types.RevShare{
1036+
{
1037+
Recipient: constants.DaveAccAddress.String(),
1038+
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_MAKER_FEE,
1039+
RevShareType: types.REV_SHARE_TYPE_ORDER_ROUTER,
1040+
QuoteQuantums: big.NewInt(400_000),
1041+
RevSharePpm: 200_000, // 20%
1042+
},
1043+
{
1044+
Recipient: constants.AliceAccAddress.String(),
1045+
RevShareFeeSource: types.REV_SHARE_FEE_SOURCE_NET_PROTOCOL_REVENUE,
1046+
RevShareType: types.REV_SHARE_TYPE_MARKET_MAPPER,
1047+
QuoteQuantums: big.NewInt(1_160_000),
1048+
RevSharePpm: 100_000, // 10%
1049+
},
1050+
},
1051+
AffiliateRevShare: nil,
1052+
FeeSourceToQuoteQuantums: map[types.RevShareFeeSource]*big.Int{
1053+
types.REV_SHARE_FEE_SOURCE_NET_PROTOCOL_REVENUE: big.NewInt(1_160_000),
1054+
types.REV_SHARE_FEE_SOURCE_TAKER_FEE: big.NewInt(0),
1055+
types.REV_SHARE_FEE_SOURCE_MAKER_FEE: big.NewInt(400_000),
1056+
},
1057+
FeeSourceToRevSharePpm: map[types.RevShareFeeSource]uint32{
1058+
types.REV_SHARE_FEE_SOURCE_NET_PROTOCOL_REVENUE: 100_000, // 10%
1059+
types.REV_SHARE_FEE_SOURCE_TAKER_FEE: 0, // 10%
1060+
types.REV_SHARE_FEE_SOURCE_MAKER_FEE: 200_000, // 20%
1061+
},
1062+
},
1063+
fill: clobtypes.FillForProcess{
1064+
TakerAddr: constants.AliceAccAddress.String(),
1065+
TakerFeeQuoteQuantums: big.NewInt(10_000_000),
1066+
MakerAddr: constants.BobAccAddress.String(),
1067+
MakerFeeQuoteQuantums: big.NewInt(2_000_000),
1068+
FillQuoteQuantums: big.NewInt(100_000_000_000),
1069+
ProductId: marketId,
1070+
MonthlyRollingTakerVolumeQuantums: 1_000_000_000_000,
1071+
TakerOrderRouterAddr: constants.CarlAccAddress.String(),
1072+
MakerOrderRouterAddr: constants.DaveAccAddress.String(),
1073+
},
1074+
setup: func(tApp *testapp.TestApp, ctx sdk.Context, keeper *keeper.Keeper,
1075+
affiliatesKeeper *affiliateskeeper.Keeper) {
1076+
err := keeper.SetMarketMapperRevenueShareParams(ctx, types.MarketMapperRevenueShareParams{
1077+
Address: constants.AliceAccAddress.String(),
1078+
RevenueSharePpm: 100_000, // 10%
1079+
ValidDays: 1,
1080+
})
1081+
require.NoError(t, err)
1082+
1083+
err = affiliatesKeeper.UpdateAffiliateTiers(ctx, affiliatetypes.DefaultAffiliateTiers)
1084+
require.NoError(t, err)
1085+
1086+
err = keeper.SetOrderRouterRevShare(ctx, constants.DaveAccAddress.String(), 200_000) // 20%
1087+
require.NoError(t, err)
1088+
1089+
err = affiliatesKeeper.SetAffiliateWhitelist(ctx, affiliatetypes.AffiliateWhitelist{
1090+
Tiers: []affiliatetypes.AffiliateWhitelist_Tier{
1091+
{
1092+
Addresses: []string{constants.BobAccAddress.String()},
1093+
TakerFeeSharePpm: 250_000, // 25%
1094+
},
1095+
},
1096+
})
1097+
require.NoError(t, err)
1098+
},
1099+
},
10321100
{
10331101
name: "Rev share populates order router rev share if affiliates is empty",
10341102
expectedRevSharesForFill: types.RevSharesForFill{

0 commit comments

Comments
 (0)