@@ -18,23 +18,15 @@ package upgrade
1818
1919import (
2020 "context"
21- "encoding/json"
2221 "errors"
2322
2423 "cosmossdk.io/core/address"
2524 "cosmossdk.io/log"
2625 upgradetypes "cosmossdk.io/x/upgrade/types"
27- dollarkeeper "dollar.noble.xyz/v2/keeper"
2826 "github.com/cosmos/cosmos-sdk/codec"
2927 sdk "github.com/cosmos/cosmos-sdk/types"
3028 "github.com/cosmos/cosmos-sdk/types/module"
31- authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
32- bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper"
33- clientkeeper "github.com/cosmos/ibc-go/v8/modules/core/02-client/keeper"
34- authoritykeeper "github.com/noble-assets/authority/keeper"
35- "github.com/noble-assets/orbiter"
36- orbitertypes "github.com/noble-assets/orbiter/types"
37- orbitercore "github.com/noble-assets/orbiter/types/core"
29+ oriterkeeper "github.com/noble-assets/orbiter/v2/keeper"
3830)
3931
4032func CreateUpgradeHandler (
@@ -43,130 +35,43 @@ func CreateUpgradeHandler(
4335 cdc codec.Codec ,
4436 logger log.Logger ,
4537 addressCodec address.Codec ,
46- authorityKeeper * authoritykeeper.Keeper ,
47- bankKeeper bankkeeper.Keeper ,
48- clientKeeper clientkeeper.Keeper ,
49- dollarKeeper * dollarkeeper.Keeper ,
38+ orbiterKeeper * oriterkeeper.Keeper ,
5039) upgradetypes.UpgradeHandler {
5140 return func (ctx context.Context , _ upgradetypes.Plan , vm module.VersionMap ) (module.VersionMap , error ) {
52- sdkCtx := sdk .UnwrapSDKContext (ctx )
53-
54- vm [orbitercore .ModuleName ] = orbiter.AppModule {}.ConsensusVersion ()
55- if module , ok := mm .Modules [orbitercore .ModuleName ].(module.HasGenesis ); ok {
56- module .InitGenesis (sdkCtx , cdc , orbiterCustomGen (cdc ))
57- }
5841
5942 vm , err := mm .RunMigrations (ctx , cfg , vm )
6043 if err != nil {
6144 return vm , err
6245 }
6346
64- err = claimDistributionFunds (ctx , logger , addressCodec , authorityKeeper , bankKeeper )
65- if err != nil {
66- return vm , err
67- }
68-
69- err = updateVaultsState (ctx , addressCodec , authorityKeeper , dollarKeeper )
47+ sdkCtx := sdk .UnwrapSDKContext (ctx )
48+ cachedCtx , writeCache := sdkCtx .CacheContext ()
49+ err = updateOrbiterStats (cachedCtx , * orbiterKeeper )
7050 if err != nil {
7151 return vm , err
7252 }
73-
74- // The IBC light clients for both the router_9600-1 and shido_9008-1
75- // chains have expired on Noble's mainnet. In IBC-Go v8.7.0, the
76- // MsgRecoverClient message does not support the LegacyAminoJSON
77- // signing mode, preventing recovery via the Noble Maintenance
78- // Multisig. As a result, the client must be manually recovered as part
79- // of this software upgrade.
80- err = clientKeeper .RecoverClient (sdkCtx , "07-tendermint-136" , "07-tendermint-192" )
81- if err != nil {
82- logger .Error ("unable to recover router_9600-1 light client" , "err" , err )
83- }
84- err = clientKeeper .RecoverClient (sdkCtx , "07-tendermint-106" , "07-tendermint-186" )
85- if err != nil {
86- logger .Error ("unable to recover shido_9008-1 light client" , "err" , err )
87- }
53+ writeCache ()
8854
8955 logger .Info (UpgradeASCII )
9056
9157 return vm , nil
9258 }
9359}
9460
95- // orbiterCustomGen overrides the default module genesis to pause the Hyperlane forwarding.
96- func orbiterCustomGen (cdc codec.Codec ) json.RawMessage {
97- gen := orbitertypes .DefaultGenesisState ()
98- gen .ForwarderGenesis .PausedProtocolIds = append (gen .ForwarderGenesis .PausedProtocolIds , orbitercore .PROTOCOL_HYPERLANE )
99-
100- return cdc .MustMarshalJSON (gen )
101- }
102-
103- // claimDistributionFunds transfers all transaction fees accrued by Noble prior
104- // to the v8 Helium upgrade (November 2024) to the x/authority owner. The funds
105- // are currently stuck as the x/distribution module was removed and replaced by
106- // the x/authority module without a proper migration of funds.
107- func claimDistributionFunds (ctx context.Context , logger log.Logger , addressCodec address.Codec , authorityKeeper * authoritykeeper.Keeper , bankKeeper bankkeeper.Keeper ) error {
108- // NOTE: We hardcode the x/distribution module name to avoid an import.
109- address := authtypes .NewModuleAddress ("distribution" )
110- balance := bankKeeper .GetAllBalances (ctx , address )
111- if balance .IsZero () {
112- // We return early in the case that there are no claimable funds.
113- return nil
114- }
115-
116- authority , err := authorityKeeper .Owner .Get (ctx )
117- if err != nil {
118- return errors .New ("unable to get underlying authority address from state" )
119- }
120- authorityBz , err := addressCodec .StringToBytes (authority )
121- if err != nil {
122- return errors .New ("unable to decode underlying authority address" )
123- }
124-
125- err = bankKeeper .SendCoins (ctx , address , authorityBz , balance )
126- if err != nil {
127- return errors .New ("unable to transfer stuck distribution funds" )
61+ func updateOrbiterStats (ctx context.Context , orbiterKeeper oriterkeeper.Keeper ) error {
62+ dispatcher := orbiterKeeper .Dispatcher ()
63+ if dispatcher == nil {
64+ return errors .New ("received nil orbiter dispatcher component" )
12865 }
66+ amounts := dispatcher .GetAllDispatchedAmounts (ctx )
67+ //
68+ // counts := dispatcher.GetAllDispatchedCounts(ctx)
69+ //
70+ for _ , entry := range amounts {
71+ dispatcher .RemoveDispatchedAmount (ctx context .Context , sourceID * core .CrossChainID , destID * core .CrossChainID , denom string )
12972
130- logger .Info ("claimed stuck distribution module funds" , "amount" , balance .String ())
131-
132- return nil
133- }
134-
135- // updateVaultsState sets state variables around Vaults Season One and Season
136- // Two. We do this so that we can remove these values from the app.yaml file,
137- // allowing us to ship one binary for both mainnet and testnet.
138- func updateVaultsState (ctx context.Context , addressCodec address.Codec , authorityKeeper * authoritykeeper.Keeper , dollarKeeper * dollarkeeper.Keeper ) error {
139- switch sdk .UnwrapSDKContext (ctx ).ChainID () {
140- case TestnetChainID :
141- err := dollarKeeper .VaultsSeasonOneEnded .Set (ctx , true )
142- if err != nil {
143- return errors .New ("unable to mark vaults season one as ended" )
144- }
73+ err := dispatcher .SetDispatchedAmount (ctx , sourceID * core .CrossChainID , destID * core .CrossChainID , denom string , amountDispatched dispatcher .AmountDispatched )
14574
146- authority , err := authorityKeeper .Owner .Get (ctx )
147- if err != nil {
148- return errors .New ("unable to get underlying authority address from state" )
149- }
150- authorityBz , err := addressCodec .StringToBytes (authority )
151- if err != nil {
152- return errors .New ("unable to decode underlying authority address" )
153- }
154- err = dollarKeeper .VaultsSeasonTwoYieldCollector .Set (ctx , authorityBz )
155- if err != nil {
156- return errors .New ("unable to set vaults season two yield collector" )
157- }
158- case MainnetChainID :
159- // NOTE: Vaults Season One has already been marked as ended on mainnet
160- // via the v10.1 Ember upgrade, so we safely skip that update here.
161-
162- yieldCollector , err := addressCodec .StringToBytes ("noble17m7dleu26hgwk842hrvfmh8mvrtp7p68k4zq8l" )
163- if err != nil {
164- return errors .New ("unable to decode vaults season two yield collector" )
165- }
166- err = dollarKeeper .VaultsSeasonTwoYieldCollector .Set (ctx , yieldCollector )
167- if err != nil {
168- return errors .New ("unable to set vaults season two yield collector" )
169- }
17075 }
17176
17277 return nil
0 commit comments