@@ -1069,21 +1069,21 @@ func TestDistributeWithRelatedKeys(t *testing.T) {
1069
1069
Stats : []* eventspb.PartyVestingStats {
1070
1070
{
1071
1071
PartyId : derivedKeys [0 ],
1072
- RewardBonusMultiplier : "2 " ,
1072
+ RewardBonusMultiplier : "1 " ,
1073
1073
QuantumBalance : "145" ,
1074
1074
SummedRewardBonusMultiplier : "3" ,
1075
1075
SummedQuantumBalance : "825" ,
1076
1076
},
1077
1077
{
1078
1078
PartyId : derivedKeys [1 ],
1079
- RewardBonusMultiplier : "2 " ,
1079
+ RewardBonusMultiplier : "1 " ,
1080
1080
QuantumBalance : "145" ,
1081
1081
SummedRewardBonusMultiplier : "3" ,
1082
1082
SummedQuantumBalance : "825" ,
1083
1083
},
1084
1084
{
1085
1085
PartyId : derivedKeys [2 ],
1086
- RewardBonusMultiplier : "2 " ,
1086
+ RewardBonusMultiplier : "1 " ,
1087
1087
QuantumBalance : "145" ,
1088
1088
SummedRewardBonusMultiplier : "3" ,
1089
1089
SummedQuantumBalance : "825" ,
@@ -1166,12 +1166,33 @@ func TestDistributeWithRelatedKeys(t *testing.T) {
1166
1166
assert .Equal (t , eventspb.VestingStatsUpdated {
1167
1167
AtEpoch : epochSeq ,
1168
1168
Stats : []* eventspb.PartyVestingStats {
1169
+ {
1170
+ PartyId : derivedKeys [0 ],
1171
+ RewardBonusMultiplier : "1" ,
1172
+ QuantumBalance : "150" ,
1173
+ SummedRewardBonusMultiplier : "3" ,
1174
+ SummedQuantumBalance : "850" ,
1175
+ },
1176
+ {
1177
+ PartyId : derivedKeys [1 ],
1178
+ RewardBonusMultiplier : "1" ,
1179
+ QuantumBalance : "150" ,
1180
+ SummedRewardBonusMultiplier : "3" ,
1181
+ SummedQuantumBalance : "850" ,
1182
+ },
1183
+ {
1184
+ PartyId : derivedKeys [2 ],
1185
+ RewardBonusMultiplier : "1" ,
1186
+ QuantumBalance : "150" ,
1187
+ SummedRewardBonusMultiplier : "3" ,
1188
+ SummedQuantumBalance : "850" ,
1189
+ },
1169
1190
{
1170
1191
PartyId : party ,
1171
1192
RewardBonusMultiplier : "2" ,
1172
1193
QuantumBalance : "400" ,
1173
- SummedRewardBonusMultiplier : "2 " ,
1174
- SummedQuantumBalance : "400 " ,
1194
+ SummedRewardBonusMultiplier : "3 " ,
1195
+ SummedQuantumBalance : "850 " ,
1175
1196
},
1176
1197
},
1177
1198
}, e .Proto ())
@@ -1219,6 +1240,116 @@ func TestDistributeWithRelatedKeys(t *testing.T) {
1219
1240
})
1220
1241
}
1221
1242
1243
+ func TestGetRewardBonusMultiplier (t * testing.T ) {
1244
+ v := getTestEngine (t )
1245
+
1246
+ ctx := context .Background ()
1247
+
1248
+ // distribute 90% as the base rate,
1249
+ // so first we distribute some, then we get under the minimum value, and all the rest
1250
+ // is distributed
1251
+ require .NoError (t , v .OnRewardVestingBaseRateUpdate (ctx , num .MustDecimalFromString ("0.9" )))
1252
+ // this is multiplied by the quantum, so it will make it 100% of the quantum
1253
+ require .NoError (t , v .OnRewardVestingMinimumTransferUpdate (ctx , num .MustDecimalFromString ("1" )))
1254
+
1255
+ require .NoError (t , v .OnBenefitTiersUpdate (ctx , & vegapb.VestingBenefitTiers {
1256
+ Tiers : []* vegapb.VestingBenefitTier {
1257
+ {
1258
+ MinimumQuantumBalance : "200" ,
1259
+ RewardMultiplier : "1" ,
1260
+ },
1261
+ {
1262
+ MinimumQuantumBalance : "500" ,
1263
+ RewardMultiplier : "2" ,
1264
+ },
1265
+ {
1266
+ MinimumQuantumBalance : "1200" ,
1267
+ RewardMultiplier : "3" ,
1268
+ },
1269
+ },
1270
+ }))
1271
+
1272
+ party := "party1"
1273
+ partyID := types .PartyID (party )
1274
+ vegaAsset := "VEGA"
1275
+ derivedKeys := []string {"derived1" , "derived2" , "derived3" , "derived4" }
1276
+
1277
+ v .parties .EXPECT ().RelatedKeys (party ).Return (& partyID , derivedKeys ).AnyTimes ()
1278
+
1279
+ v .col .InitVestedBalance (party , vegaAsset , num .NewUint (500 ))
1280
+
1281
+ for _ , key := range derivedKeys {
1282
+ v .col .InitVestedBalance (key , vegaAsset , num .NewUint (250 ))
1283
+ v .parties .EXPECT ().RelatedKeys (key ).Return (& partyID , derivedKeys ).AnyTimes ()
1284
+ }
1285
+
1286
+ for _ , key := range append (derivedKeys , party ) {
1287
+ balance , multiplier := v .GetRewardBonusMultiplier (key )
1288
+ require .Equal (t , num .DecimalFromInt64 (1500 ), balance )
1289
+ require .Equal (t , num .DecimalFromInt64 (3 ), multiplier )
1290
+ }
1291
+
1292
+ // check that we only called the GetVestingQuantumBalance once for each key
1293
+ // later calls should be cached
1294
+ require .Equal (t , 5 , v .col .GetVestingQuantumBalanceCallCount ())
1295
+
1296
+ v .col .ResetVestingQuantumBalanceCallCount ()
1297
+
1298
+ single , summed := v .GetSingleAndSummedRewardBonusMultipliers (party )
1299
+ require .Equal (t , num .DecimalFromInt64 (500 ), single .QuantumBalance )
1300
+ require .Equal (t , num .DecimalFromInt64 (2 ), single .Multiplier )
1301
+ require .Equal (t , num .DecimalFromInt64 (1500 ), summed .QuantumBalance )
1302
+ require .Equal (t , num .DecimalFromInt64 (3 ), summed .Multiplier )
1303
+
1304
+ for _ , key := range derivedKeys {
1305
+ single , summed := v .GetSingleAndSummedRewardBonusMultipliers (key )
1306
+ require .Equal (t , num .DecimalFromInt64 (250 ), single .QuantumBalance )
1307
+ require .Equal (t , num .DecimalFromInt64 (1 ), single .Multiplier )
1308
+ require .Equal (t , num .DecimalFromInt64 (1500 ), summed .QuantumBalance )
1309
+ require .Equal (t , num .DecimalFromInt64 (3 ), summed .Multiplier )
1310
+ }
1311
+
1312
+ // here we check that we just called 5 more times to re-calculate single values
1313
+ // summed should be cached
1314
+ require .Equal (t , 5 , v .col .GetVestingQuantumBalanceCallCount ())
1315
+
1316
+ v .broker .EXPECT ().Send (gomock .Any ()).AnyTimes ()
1317
+
1318
+ // now we simulate the end of the epoch
1319
+ // it will reset cache for reward bonus multipliers
1320
+ v .OnEpochEvent (ctx , types.Epoch {
1321
+ Action : vegapb .EpochAction_EPOCH_ACTION_END ,
1322
+ Seq : 1 ,
1323
+ })
1324
+
1325
+ v .col .ResetVestingQuantumBalanceCallCount ()
1326
+
1327
+ for _ , key := range append (derivedKeys , party ) {
1328
+ balance , multiplier := v .GetRewardBonusMultiplier (key )
1329
+ require .Equal (t , num .DecimalFromInt64 (1500 ), balance )
1330
+ require .Equal (t , num .DecimalFromInt64 (3 ), multiplier )
1331
+ }
1332
+
1333
+ // now it's called 5 times again because the cache gets reset at the end of the epoch
1334
+ require .Equal (t , 5 , v .col .GetVestingQuantumBalanceCallCount ())
1335
+
1336
+ v .OnEpochEvent (ctx , types.Epoch {
1337
+ Action : vegapb .EpochAction_EPOCH_ACTION_END ,
1338
+ Seq : 1 ,
1339
+ })
1340
+
1341
+ v .col .ResetVestingQuantumBalanceCallCount ()
1342
+
1343
+ for _ , key := range append (derivedKeys , party ) {
1344
+ balance , multiplier := v .GetRewardBonusMultiplier (key )
1345
+ require .Equal (t , num .DecimalFromInt64 (1500 ), balance )
1346
+ require .Equal (t , num .DecimalFromInt64 (3 ), multiplier )
1347
+ }
1348
+
1349
+ // now it's called 5 times again because the cache gets reset at the end of the epoch
1350
+ require .Equal (t , 5 , v .col .GetVestingQuantumBalanceCallCount ())
1351
+ }
1352
+
1222
1353
// LedgerMovements is the result of a mock, so it doesn't really make sense to
1223
1354
// verify data consistency.
1224
1355
func expectLedgerMovements (t * testing.T , v * testEngine ) {
0 commit comments