Skip to content

Commit d6fa308

Browse files
9.4 update (backport #3166) (#3172)
Co-authored-by: Justin Barnett <61020572+jusbar23@users.noreply.github.com>
1 parent 64ca450 commit d6fa308

File tree

10 files changed

+245
-49
lines changed

10 files changed

+245
-49
lines changed

protocol/app/upgrades.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package app
33
import (
44
"fmt"
55

6-
v_9_3 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v9.3"
6+
v_9_4 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v9.4"
77

88
upgradetypes "cosmossdk.io/x/upgrade/types"
99
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -14,21 +14,22 @@ var (
1414
// `Upgrades` defines the upgrade handlers and store loaders for the application.
1515
// New upgrades should be added to this slice after they are implemented.
1616
Upgrades = []upgrades.Upgrade{
17-
v_9_3.Upgrade,
17+
v_9_4.Upgrade,
1818
}
1919
Forks = []upgrades.Fork{}
2020
)
2121

2222
// setupUpgradeHandlers registers the upgrade handlers to perform custom upgrade
2323
// logic and state migrations for software upgrades.
2424
func (app *App) setupUpgradeHandlers() {
25-
if app.UpgradeKeeper.HasHandler(v_9_3.UpgradeName) {
26-
panic(fmt.Sprintf("Cannot register duplicate upgrade handler '%s'", v_9_3.UpgradeName))
25+
if app.UpgradeKeeper.HasHandler(v_9_4.UpgradeName) {
26+
panic(fmt.Sprintf("Cannot register duplicate upgrade handler '%s'", v_9_4.UpgradeName))
2727
}
2828
app.UpgradeKeeper.SetUpgradeHandler(
29-
v_9_3.UpgradeName,
30-
v_9_3.CreateUpgradeHandler(
29+
v_9_4.UpgradeName,
30+
v_9_4.CreateUpgradeHandler(
3131
app.ModuleManager,
32+
app.AffiliatesKeeper,
3233
app.configurator,
3334
),
3435
)

protocol/app/upgrades/v9.3/upgrade_container_test.go

Lines changed: 0 additions & 37 deletions
This file was deleted.
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package v_9_4
2+
3+
import (
4+
store "cosmossdk.io/store/types"
5+
"github.com/dydxprotocol/v4-chain/protocol/app/upgrades"
6+
affiliatetypes "github.com/dydxprotocol/v4-chain/protocol/x/affiliates/types"
7+
)
8+
9+
const (
10+
UpgradeName = "v9.4"
11+
)
12+
13+
var (
14+
Upgrade = upgrades.Upgrade{
15+
UpgradeName: UpgradeName,
16+
StoreUpgrades: store.StoreUpgrades{},
17+
}
18+
19+
PreviousAffilliateTiers = affiliatetypes.AffiliateTiers{
20+
Tiers: []affiliatetypes.AffiliateTiers_Tier{
21+
{
22+
ReqReferredVolumeQuoteQuantums: 0,
23+
ReqStakedWholeCoins: 0,
24+
TakerFeeSharePpm: 50_000,
25+
},
26+
{
27+
ReqReferredVolumeQuoteQuantums: 1_000_000_000_000, // 1M volume
28+
ReqStakedWholeCoins: 200,
29+
TakerFeeSharePpm: 100_000,
30+
},
31+
{
32+
ReqReferredVolumeQuoteQuantums: 5_000_000_000_000, // 5M volume
33+
ReqStakedWholeCoins: 1_000,
34+
TakerFeeSharePpm: 125_000,
35+
},
36+
{
37+
ReqReferredVolumeQuoteQuantums: 25_000_000_000_000, // 25M volume
38+
ReqStakedWholeCoins: 5_000,
39+
TakerFeeSharePpm: 150_000,
40+
},
41+
},
42+
}
43+
44+
UpdatedAffiliateParameters = affiliatetypes.AffiliateParameters{
45+
Maximum_30DAffiliateRevenuePerReferredUserQuoteQuantums: 1_000_000_000_000, // 1M volume
46+
RefereeMinimumFeeTierIdx: 1,
47+
Maximum_30DAttributableVolumePerReferredUserQuoteQuantums: 10_000_000_000, // 10k volume
48+
}
49+
50+
UpdatedAffiliateTiers = affiliatetypes.AffiliateTiers{
51+
Tiers: []affiliatetypes.AffiliateTiers_Tier{
52+
{
53+
ReqReferredVolumeQuoteQuantums: 0,
54+
ReqStakedWholeCoins: 0,
55+
TakerFeeSharePpm: 300_000,
56+
},
57+
{
58+
ReqReferredVolumeQuoteQuantums: 1_000_000_000_000, // 1M volume
59+
ReqStakedWholeCoins: 0,
60+
TakerFeeSharePpm: 400_000,
61+
},
62+
{
63+
ReqReferredVolumeQuoteQuantums: 10_000_000_000_000, // 10M volume
64+
ReqStakedWholeCoins: 0,
65+
TakerFeeSharePpm: 500_000,
66+
},
67+
},
68+
}
69+
)
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package v_9_4
2+
3+
import (
4+
"context"
5+
"fmt"
6+
7+
upgradetypes "cosmossdk.io/x/upgrade/types"
8+
sdk "github.com/cosmos/cosmos-sdk/types"
9+
"github.com/cosmos/cosmos-sdk/types/module"
10+
11+
"github.com/dydxprotocol/v4-chain/protocol/lib"
12+
affiliatekeeper "github.com/dydxprotocol/v4-chain/protocol/x/affiliates/keeper"
13+
affiliatetypes "github.com/dydxprotocol/v4-chain/protocol/x/affiliates/types"
14+
)
15+
16+
func setDefaultAffiliateTiersForSlidingAffiliates(ctx sdk.Context, affiliateKeeper affiliatekeeper.Keeper) {
17+
err := affiliateKeeper.UpdateAffiliateTiers(ctx, UpdatedAffiliateTiers)
18+
19+
if err != nil {
20+
panic(fmt.Sprintf("failed to set default affiliate tiers: %s", err))
21+
}
22+
}
23+
24+
func setDefaultAffiliateParameters(ctx sdk.Context, affiliateKeeper affiliatekeeper.Keeper) {
25+
err := affiliateKeeper.UpdateAffiliateParameters(ctx, &affiliatetypes.MsgUpdateAffiliateParameters{
26+
AffiliateParameters: UpdatedAffiliateParameters,
27+
})
28+
29+
if err != nil {
30+
panic(fmt.Sprintf("failed to set default affiliate parameters: %s", err))
31+
}
32+
}
33+
34+
func migrateAffiliateOverrides(ctx sdk.Context, affiliateKeeper affiliatekeeper.Keeper) {
35+
// Get all whitelist
36+
whitelist, err := affiliateKeeper.GetAffiliateWhitelist(ctx)
37+
if err != nil {
38+
panic(fmt.Sprintf("failed to get affiliate whitelist: %s", err))
39+
}
40+
// Create overrides for all whitelist addresses
41+
overrides := affiliatetypes.AffiliateOverrides{}
42+
var overridesList []string
43+
for _, addr := range whitelist.Tiers {
44+
overridesList = append(overridesList, addr.Addresses...)
45+
}
46+
overrides.Addresses = overridesList
47+
// Update affiliate overrides
48+
err = affiliateKeeper.SetAffiliateOverrides(ctx, overrides)
49+
if err != nil {
50+
panic(fmt.Sprintf("failed to set affiliate overrides: %s", err))
51+
}
52+
}
53+
54+
func CreateUpgradeHandler(
55+
mm *module.Manager,
56+
affiliateKeeper affiliatekeeper.Keeper,
57+
configurator module.Configurator,
58+
) upgradetypes.UpgradeHandler {
59+
return func(ctx context.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
60+
sdkCtx := lib.UnwrapSDKContext(ctx, "app/upgrades")
61+
sdkCtx.Logger().Info(fmt.Sprintf("Running %s Upgrade...", UpgradeName))
62+
63+
// Set default affiliate tiers and parameters.
64+
setDefaultAffiliateTiersForSlidingAffiliates(sdkCtx, affiliateKeeper)
65+
66+
// Set default affiliate parameters.
67+
setDefaultAffiliateParameters(sdkCtx, affiliateKeeper)
68+
69+
// Migrate affiliate overrides.
70+
migrateAffiliateOverrides(sdkCtx, affiliateKeeper)
71+
72+
return mm.RunMigrations(ctx, configurator, vm)
73+
}
74+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//go:build all || container_test
2+
3+
package v_9_4_test
4+
5+
import (
6+
"testing"
7+
8+
"github.com/cosmos/gogoproto/proto"
9+
v_9_4 "github.com/dydxprotocol/v4-chain/protocol/app/upgrades/v9.4"
10+
"github.com/dydxprotocol/v4-chain/protocol/testing/containertest"
11+
"github.com/dydxprotocol/v4-chain/protocol/testutil/constants"
12+
affiliatetypes "github.com/dydxprotocol/v4-chain/protocol/x/affiliates/types"
13+
"github.com/stretchr/testify/require"
14+
)
15+
16+
func TestStateUpgrade(t *testing.T) {
17+
testnet, err := containertest.NewTestnetWithPreupgradeGenesis()
18+
require.NoError(t, err, "failed to create testnet - is docker daemon running?")
19+
err = testnet.Start()
20+
require.NoError(t, err)
21+
defer testnet.MustCleanUp()
22+
node := testnet.Nodes["alice"]
23+
nodeAddress := constants.AliceAccAddress.String()
24+
25+
preUpgradeSetups(node, t)
26+
preUpgradeChecks(node, t)
27+
28+
err = containertest.UpgradeTestnet(nodeAddress, t, node, v_9_4.UpgradeName)
29+
require.NoError(t, err)
30+
31+
postUpgradeChecks(node, t)
32+
}
33+
34+
func preUpgradeSetups(node *containertest.Node, t *testing.T) {}
35+
36+
func preUpgradeChecks(node *containertest.Node, t *testing.T) {
37+
// Verify affiliate tiers are set to default values
38+
tiersResp := &affiliatetypes.AllAffiliateTiersResponse{}
39+
resp, err := containertest.Query(
40+
node,
41+
affiliatetypes.NewQueryClient,
42+
affiliatetypes.QueryClient.AllAffiliateTiers,
43+
&affiliatetypes.AllAffiliateTiersRequest{},
44+
)
45+
require.NoError(t, err)
46+
err = proto.UnmarshalText(resp.String(), tiersResp)
47+
require.NoError(t, err)
48+
require.Equal(t, v_9_4.PreviousAffilliateTiers, tiersResp.Tiers)
49+
}
50+
51+
func postUpgradeChecks(node *containertest.Node, t *testing.T) {
52+
// Verify affiliate tiers are set to default values
53+
tiersResp := &affiliatetypes.AllAffiliateTiersResponse{}
54+
resp, err := containertest.Query(
55+
node,
56+
affiliatetypes.NewQueryClient,
57+
affiliatetypes.QueryClient.AllAffiliateTiers,
58+
&affiliatetypes.AllAffiliateTiersRequest{},
59+
)
60+
require.NoError(t, err)
61+
err = proto.UnmarshalText(resp.String(), tiersResp)
62+
require.NoError(t, err)
63+
require.Equal(t, v_9_4.UpdatedAffiliateTiers, tiersResp.Tiers)
64+
65+
// Verify affiliate parameters are set to default values
66+
paramsResp := &affiliatetypes.AffiliateParametersResponse{}
67+
resp, err = containertest.Query(
68+
node,
69+
affiliatetypes.NewQueryClient,
70+
affiliatetypes.QueryClient.AffiliateParameters,
71+
&affiliatetypes.AffiliateParametersRequest{},
72+
)
73+
require.NoError(t, err)
74+
err = proto.UnmarshalText(resp.String(), paramsResp)
75+
require.NoError(t, err)
76+
require.Equal(t, v_9_4.UpdatedAffiliateParameters, paramsResp.Parameters)
77+
78+
// Verify affiliate overrides were migrated from whitelist
79+
overridesResp := &affiliatetypes.AffiliateOverridesResponse{}
80+
resp, err = containertest.Query(
81+
node,
82+
affiliatetypes.NewQueryClient,
83+
affiliatetypes.QueryClient.AffiliateOverrides,
84+
&affiliatetypes.AffiliateOverridesRequest{},
85+
)
86+
require.NoError(t, err)
87+
err = proto.UnmarshalText(resp.String(), overridesResp)
88+
require.NoError(t, err)
89+
}

protocol/scripts/genesis/sample_pregenesis.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4101,7 +4101,7 @@
41014101
]
41024102
}
41034103
},
4104-
"app_version": "9.0.0-64-g531bff2de",
4104+
"app_version": "9.0.0-47-gd399e2625",
41054105
"chain_id": "dydx-sample-1",
41064106
"consensus": {
41074107
"params": {
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v9.3
1+
v9.4
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v9.2.1
1+
v9.3.0
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
v9.2
1+
v9.3

protocol/x/affiliates/keeper/keeper.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -251,9 +251,9 @@ func (k Keeper) UpdateAffiliateTiers(ctx sdk.Context, affiliateTiers types.Affil
251251
}
252252
// Check if the tiers are strictly increasing.
253253
if tiers[i].ReqReferredVolumeQuoteQuantums <= tiers[i-1].ReqReferredVolumeQuoteQuantums ||
254-
tiers[i].ReqStakedWholeCoins <= tiers[i-1].ReqStakedWholeCoins {
254+
tiers[i].ReqStakedWholeCoins < tiers[i-1].ReqStakedWholeCoins {
255255
return errorsmod.Wrapf(types.ErrInvalidAffiliateTiers,
256-
"tiers values must be strictly increasing")
256+
"volume must be strictly increasing; staked coins must be non-decreasing")
257257
}
258258
}
259259
store.Set([]byte(types.AffiliateTiersKey), affiliateTiersBytes)

0 commit comments

Comments
 (0)