Skip to content

Commit 79b14d6

Browse files
committed
chore: recover coreum-mainnet-1 light client
1 parent f0fad52 commit 79b14d6

6 files changed

Lines changed: 18 additions & 96 deletions

File tree

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
- Recover expired IBC light client for `coreum-mainnet-1` ([#647](https://github.com/noble-assets/noble/pull/647))

.changelog/v11.5.0/summary.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
*Jul 8, 2026*
2+
3+
This is a minor release to the v11 Flux line.

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# CHANGELOG
22

3+
## v11.5.0
4+
5+
*Jul 8, 2026*
6+
7+
This is a minor release to the v11 Flux line.
8+
9+
### IMPROVEMENTS
10+
11+
- Recover expired IBC light client for `coreum-mainnet-1` ([#647](https://github.com/noble-assets/noble/pull/647))
12+
313
## v11.4.0
414

515
*Apr 9, 2026*

app.go

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -476,9 +476,7 @@ func (app *App) RegisterUpgradeHandler() error {
476476
app.ModuleManager,
477477
app.Configurator(),
478478
app.Logger(),
479-
app.AccountKeeper.AddressCodec(),
480479
app.IBCKeeper.ClientKeeper,
481-
app.DollarKeeper,
482480
),
483481
)
484482

upgrade/constants.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
package upgrade
1818

1919
// UpgradeName is the name of this specific software upgrade used on-chain.
20-
const UpgradeName = "v11.4.0"
20+
const UpgradeName = "v11.5.0"
2121

2222
// TestnetChainID is the Chain ID of the Noble testnet.
2323
const TestnetChainID = "grand-1"

upgrade/upgrade.go

Lines changed: 3 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -18,28 +18,19 @@ package upgrade
1818

1919
import (
2020
"context"
21-
"fmt"
22-
"sort"
2321

24-
"cosmossdk.io/core/address"
2522
"cosmossdk.io/log"
26-
"cosmossdk.io/math"
2723
upgradetypes "cosmossdk.io/x/upgrade/types"
28-
dollarkeeper "dollar.noble.xyz/v2/keeper"
29-
vaultstypes "dollar.noble.xyz/v2/types/vaults"
3024
sdk "github.com/cosmos/cosmos-sdk/types"
3125
"github.com/cosmos/cosmos-sdk/types/module"
3226
clientkeeper "github.com/cosmos/ibc-go/v8/modules/core/02-client/keeper"
33-
authoritytypes "github.com/noble-assets/authority/types"
3427
)
3528

3629
func CreateUpgradeHandler(
3730
mm *module.Manager,
3831
cfg module.Configurator,
3932
logger log.Logger,
40-
addressCdc address.Codec,
4133
clientKeeper clientkeeper.Keeper,
42-
dollarKeeper *dollarkeeper.Keeper,
4334
) upgradetypes.UpgradeHandler {
4435
return func(ctx context.Context, _ upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
4536
vm, err := mm.RunMigrations(ctx, cfg, vm)
@@ -54,94 +45,13 @@ func CreateUpgradeHandler(
5445
// Maintenance Multisig. As a result, expired clients on mainnet must
5546
// be manually recovered as part of a software upgrade.
5647
if sdkCtx.ChainID() == MainnetChainID {
57-
// Substitute the IBC light client for the evmos_9001-2 chain.
58-
err = clientKeeper.RecoverClient(sdkCtx, "07-tendermint-12", "07-tendermint-208")
48+
// Substitute the IBC light client for the coreum-mainnet-1 chain.
49+
err = clientKeeper.RecoverClient(sdkCtx, "07-tendermint-71", "07-tendermint-226")
5950
if err != nil {
60-
logger.Error("failed to recover evmos_9001-2 client", "error", err)
61-
}
62-
// Substitute the IBC light client for the haqq_11235-1 chain.
63-
err = clientKeeper.RecoverClient(sdkCtx, "07-tendermint-58", "07-tendermint-194")
64-
if err != nil {
65-
logger.Error("failed to recover haqq_11235-1 client", "error", err)
51+
logger.Error("failed to recover coreum-mainnet-1 client", "error", err)
6652
}
6753
}
6854

69-
vaultServer := dollarkeeper.NewVaultsMsgServer(dollarKeeper)
70-
71-
// Unlock all user positions from the Staked Vault.
72-
if err = endVaultsSeasonTwo(ctx, logger, addressCdc, dollarKeeper, vaultServer); err != nil {
73-
return vm, err
74-
}
75-
76-
// Pause all Vaults permanently.
77-
if _, err = vaultServer.SetPausedState(ctx, &vaultstypes.MsgSetPausedState{
78-
Signer: authoritytypes.ModuleAddress.String(),
79-
Paused: vaultstypes.ALL,
80-
}); err != nil {
81-
return vm, err
82-
}
83-
8455
return vm, nil
8556
}
8657
}
87-
88-
// endVaultsSeasonTwo handles the logic to end Vaults Season Two, unlocking all
89-
// Staked vault user positions.
90-
func endVaultsSeasonTwo(
91-
ctx context.Context,
92-
logger log.Logger,
93-
addressCdc address.Codec,
94-
k *dollarkeeper.Keeper,
95-
vaultServer vaultstypes.MsgServer,
96-
) error {
97-
// Get all the vaults positions.
98-
positions, err := k.GetVaultsPositions(ctx)
99-
if err != nil {
100-
return err
101-
}
102-
103-
// Create a mapping by address and the total positions amount.
104-
stakedUsers := map[string]math.Int{}
105-
var stakedUsersAddress []string
106-
107-
// Iterate through all the positions.
108-
logger.Info("collecting vault positions")
109-
for _, position := range positions {
110-
switch position.Vault {
111-
case vaultstypes.STAKED:
112-
addr, err := addressCdc.BytesToString(position.Address)
113-
if err != nil {
114-
logger.Warn("invalid position address: " + err.Error())
115-
continue
116-
}
117-
118-
if _, exists := stakedUsers[addr]; !exists {
119-
stakedUsers[addr] = position.Amount
120-
stakedUsersAddress = append(stakedUsersAddress, addr)
121-
} else {
122-
stakedUsers[addr] = stakedUsers[addr].Add(position.Amount)
123-
}
124-
}
125-
}
126-
127-
sort.Strings(stakedUsersAddress)
128-
129-
// Unlock all the Staked vault positions.
130-
logger.Info(fmt.Sprintf("unlocking %d staked vault positions", len(stakedUsers)))
131-
stakedUsersProcessed := 0
132-
for _, stakedUserAddr := range stakedUsersAddress {
133-
stakedUserTotalAmount := stakedUsers[stakedUserAddr]
134-
if _, unlockErr := vaultServer.Unlock(ctx, &vaultstypes.MsgUnlock{
135-
Signer: stakedUserAddr,
136-
Vault: vaultstypes.STAKED,
137-
Amount: stakedUserTotalAmount,
138-
}); unlockErr != nil {
139-
logger.Error(fmt.Sprintf("failed to unlock staked vault position for %s: %v", stakedUserAddr, err))
140-
continue
141-
}
142-
stakedUsersProcessed += 1
143-
}
144-
logger.Info(fmt.Sprintf("unlocked %d/%d staked vault positions successfully", stakedUsersProcessed, len(stakedUsers)))
145-
146-
return nil
147-
}

0 commit comments

Comments
 (0)