@@ -3,14 +3,19 @@ package app
33import (
44 "fmt"
55
6+ storetypes "cosmossdk.io/store/types"
67 upgradetypes "cosmossdk.io/x/upgrade/types"
78
9+ "github.com/cosmos/cosmos-sdk/baseapp"
810 sdk "github.com/cosmos/cosmos-sdk/types"
911
1012 "github.com/piplabs/story/client/app/upgrades"
1113 "github.com/piplabs/story/client/app/upgrades/polybius"
1214 "github.com/piplabs/story/client/app/upgrades/singularity/virgil"
15+ "github.com/piplabs/story/client/app/upgrades/v140"
1316 "github.com/piplabs/story/client/app/upgrades/v_1_2_0"
17+ "github.com/piplabs/story/lib/errors"
18+ "github.com/piplabs/story/lib/netconf"
1419)
1520
1621var (
@@ -20,15 +25,19 @@ var (
2025 virgil .Upgrade ,
2126 v_1_2_0 .Upgrade ,
2227 polybius .Upgrade ,
28+ v140 .Upgrade ,
2329 }
2430 // Forks are for hard forks that breaks backward compatibility.
2531 Forks = []upgrades.Fork {
2632 virgil .Fork ,
2733 v_1_2_0 .Fork ,
2834 polybius .Fork ,
35+ v140 .Fork ,
2936 }
3037)
3138
39+ type StoreUpgradesMap map [int64 ]storetypes.StoreUpgrades
40+
3241func (a * App ) setupUpgradeHandlers () {
3342 for _ , upgrade := range Upgrades {
3443 a .Keepers .UpgradeKeeper .SetUpgradeHandler (
@@ -40,19 +49,37 @@ func (a *App) setupUpgradeHandlers() {
4049
4150// setUpgradeStoreLoaders sets custom store loaders to customize the rootMultiStore initialization for software upgrades.
4251func (a * App ) setupUpgradeStoreLoaders () {
43- upgradeInfo , err := a . Keepers . UpgradeKeeper . ReadUpgradeInfoFromDisk ( )
52+ upgradeHistory , err := netconf . GetUpgradeHistory ( a . ChainID () )
4453 if err != nil {
45- panic (fmt . Sprintf ( "failed to read upgrade info from disk %s" , err ))
54+ panic (errors . Wrap ( err , "failed to get upgrade history" ))
4655 }
4756
48- if a .Keepers .UpgradeKeeper .IsSkipHeight (upgradeInfo .Height ) {
49- return
57+ storeUpgradesMap := make (StoreUpgradesMap )
58+ for name , height := range upgradeHistory {
59+ if a .Keepers .UpgradeKeeper .IsSkipHeight (height ) {
60+ return
61+ }
62+
63+ for _ , upgrade := range Upgrades {
64+ if name == upgrade .UpgradeName {
65+ storeUpgradesMap [height ] = upgrade .StoreUpgrades
66+ }
67+ }
5068 }
5169
52- for _ , upgrade := range Upgrades {
53- if upgradeInfo .Name == upgrade .UpgradeName {
54- a .SetStoreLoader (upgradetypes .UpgradeStoreLoader (upgradeInfo .Height , & upgrade .StoreUpgrades ))
70+ a .SetStoreLoader (UpgradeStoreLoader (storeUpgradesMap ))
71+ }
72+
73+ // UpgradeStoreLoader returns store loader including all upgrades.
74+ func UpgradeStoreLoader (storeUpgradesMap StoreUpgradesMap ) baseapp.StoreLoader {
75+ return func (ms storetypes.CommitMultiStore ) error {
76+ if storeUpgrades , ok := storeUpgradesMap [ms .LastCommitID ().Version + 1 ]; ok {
77+ if len (storeUpgrades .Renamed ) > 0 || len (storeUpgrades .Deleted ) > 0 || len (storeUpgrades .Added ) > 0 {
78+ return ms .LoadLatestVersionAndUpgrade (& storeUpgrades )
79+ }
5580 }
81+
82+ return baseapp .DefaultStoreLoader (ms )
5683 }
5784}
5885
0 commit comments