Skip to content

Commit 297d104

Browse files
Add support for enabling or disabling entire versions of protocols
1 parent 6512616 commit 297d104

File tree

3 files changed

+60
-4
lines changed

3 files changed

+60
-4
lines changed

calculation/calculation.go

+26-1
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,24 @@ func isPoolQualified(program types.Program, pool types.Pool, locked uint64) (boo
208208
// if it's covered by one of the "eligible" criteria, we'll flip it true
209209
// if it's covered by one of the "disqualified" criteria, we'll flip it back false
210210
// BUT, if the "eligible" criteria lists are all null, then every pool starts eligible, so this needs to start true
211-
qualified := program.EligiblePools == nil && program.EligibleAssets == nil && program.EligiblePairs == nil
211+
qualified := program.EligibleVersions == nil &&
212+
program.EligiblePools == nil &&
213+
program.EligibleAssets == nil &&
214+
program.EligiblePairs == nil
212215
reason := ""
216+
if program.EligibleVersions != nil {
217+
found := false
218+
for _, version := range program.EligibleVersions {
219+
if version == pool.Version {
220+
qualified = true
221+
found = true
222+
break
223+
}
224+
}
225+
if !found {
226+
reason += fmt.Sprintf("Program lists eligible versions, but doesn't list this version (%v); ", pool.Version)
227+
}
228+
}
213229
if program.EligiblePools != nil {
214230
found := false
215231
for _, poolIdent := range program.EligiblePools {
@@ -249,6 +265,15 @@ func isPoolQualified(program types.Program, pool types.Pool, locked uint64) (boo
249265
reason += "Program lists eligible pairs, but doesn't list these two assets as an eligible pair; "
250266
}
251267
}
268+
if program.DisqualifiedVersions != nil {
269+
for _, version := range program.DisqualifiedVersions {
270+
if version == pool.Version {
271+
qualified = false
272+
reason += fmt.Sprintf("Version (%v) is explicitly disqualified; ", pool.Version)
273+
break
274+
}
275+
}
276+
}
252277
if program.DisqualifiedPools != nil {
253278
for _, poolIdent := range program.DisqualifiedPools {
254279
if poolIdent == pool.PoolIdent {

calculation/calculation_test.go

+29-3
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,11 @@ func Test_AtLeastOnePercent(t *testing.T) {
223223

224224
func Test_QualifiedPools(t *testing.T) {
225225
program := sampleProgram(500_000)
226-
poolA := types.Pool{PoolIdent: "A", AssetA: "A", AssetB: "X", TotalLPTokens: 1500}
227-
poolB := types.Pool{PoolIdent: "B", AssetA: "B", AssetB: "X", TotalLPTokens: 1500}
228-
poolC := types.Pool{PoolIdent: "C", AssetA: "C", AssetB: "Y", TotalLPTokens: 1500}
226+
poolA := types.Pool{Version: "V1", PoolIdent: "A", AssetA: "A", AssetB: "X", TotalLPTokens: 1500}
227+
poolB := types.Pool{Version: "V1", PoolIdent: "B", AssetA: "B", AssetB: "X", TotalLPTokens: 1500}
228+
poolC := types.Pool{Version: "V1", PoolIdent: "C", AssetA: "C", AssetB: "Y", TotalLPTokens: 1500}
229+
poolD := types.Pool{Version: "V3", PoolIdent: "D", AssetA: "A", AssetB: "X", TotalLPTokens: 1500}
230+
poolE := types.Pool{Version: "V3-stable", PoolIdent: "D", AssetA: "A", AssetB: "X", TotalLPTokens: 1500}
229231

230232
assertQualified := func(pool types.Pool, qty uint64) {
231233
actual, _ := isPoolQualified(program, pool, qty)
@@ -240,6 +242,18 @@ func Test_QualifiedPools(t *testing.T) {
240242
assertQualified(poolA, 500)
241243
assertDisqualified(poolA, 10)
242244

245+
program.EligibleVersions = []string{"V1"}
246+
assertQualified(poolA, 150)
247+
assertDisqualified(poolD, 150)
248+
assertDisqualified(poolE, 150)
249+
250+
program.EligibleVersions = []string{"V1", "V3"}
251+
assertQualified(poolA, 150)
252+
assertQualified(poolD, 150)
253+
assertDisqualified(poolE, 150)
254+
255+
program.EligibleVersions = nil
256+
243257
program.EligiblePools = []string{"A"}
244258
assertQualified(poolA, 500)
245259
assertDisqualified(poolB, 500)
@@ -267,6 +281,18 @@ func Test_QualifiedPools(t *testing.T) {
267281
assertDisqualified(poolC, 500)
268282
program.EligiblePairs = nil
269283

284+
program.DisqualifiedVersions = []string{"V1"}
285+
assertDisqualified(poolA, 500)
286+
assertQualified(poolD, 500)
287+
assertQualified(poolE, 500)
288+
289+
program.DisqualifiedVersions = []string{"V1", "V3-stable"}
290+
assertDisqualified(poolA, 500)
291+
assertQualified(poolD, 500)
292+
assertDisqualified(poolE, 500)
293+
294+
program.DisqualifiedVersions = nil
295+
270296
program.DisqualifiedPools = []string{"A"}
271297
assertDisqualified(poolA, 500)
272298
assertQualified(poolB, 500)

types/types.go

+5
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ type Program struct {
3838
// Any remaining emissions above this are *not* emitted, and instead rever to the treasury
3939
EmissionCap uint64
4040

41+
// A list of eligible protocol versions
42+
EligibleVersions []string
4143
// A list of pools for which a delegation is considered valid
4244
EligiblePools []string
4345
// A list of assets for which *any* pools will be considered valid
@@ -47,6 +49,8 @@ type Program struct {
4749
AssetA shared.AssetID
4850
AssetB shared.AssetID
4951
}
52+
// A list of which protocol versions will be ignored
53+
DisqualifiedVersions []string
5054
// A list of pools for which delegation will be ignored
5155
DisqualifiedPools []string
5256
// A list of assets, for which *any* pools will be considered invalid
@@ -66,6 +70,7 @@ type Program struct {
6670

6771
type Pool struct {
6872
PoolIdent string
73+
Version string
6974
TransactionHash string
7075
Slot uint64
7176
TotalLPTokens uint64

0 commit comments

Comments
 (0)