Skip to content

Commit 71a0673

Browse files
authored
Merge pull request #388 from persistenceOne/puneet/add-redeem-v12
feat: add redeem stkassets to v12
2 parents afc9d79 + 68db0b5 commit 71a0673

1 file changed

Lines changed: 129 additions & 1 deletion

File tree

app/upgrades/testnet/v12.0.0-rc0/upgrades.go

Lines changed: 129 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,40 @@
11
package v12_0_0_rc0
22

33
import (
4+
"encoding/json"
5+
6+
wasmtypes "github.com/CosmWasm/wasmd/x/wasm/types"
47
sdk "github.com/cosmos/cosmos-sdk/types"
58
"github.com/cosmos/cosmos-sdk/types/module"
9+
authtypes "github.com/cosmos/cosmos-sdk/x/auth/types"
610
upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types"
11+
transfertypes "github.com/cosmos/ibc-go/v7/modules/apps/transfer/types"
12+
channeltypes "github.com/cosmos/ibc-go/v7/modules/core/04-channel/types"
713

814
"github.com/persistenceOne/persistenceCore/v12/app/upgrades"
915
)
1016

17+
var denomsMap = map[string]struct{}{
18+
"stk/ubld": {},
19+
"stk/uhuahua": {},
20+
}
21+
22+
var contractAddr = "persistence1yljdn6nvt2k7dtz8erd9ytdaauhef5gtwwtevvtdqna0ms5afa0qunhryh"
23+
1124
func CreateUpgradeHandler(args upgrades.UpgradeHandlerArgs) upgradetypes.UpgradeHandler {
1225
return func(ctx sdk.Context, plan upgradetypes.Plan, vm module.VersionMap) (module.VersionMap, error) {
13-
ctx.Logger().Info("running module migrations...")
26+
ctx.Logger().Info("Running upgrade handler")
1427
err := FixLSMData(ctx, args)
1528
if err != nil {
1629
return vm, err
1730
}
31+
ctx.Logger().Info("fixed lsm data")
32+
err = RedeemStkBalances(ctx, args)
33+
if err != nil {
34+
return vm, err
35+
}
36+
ctx.Logger().Info("redeemed stk balances")
37+
ctx.Logger().Info("running module migrations...")
1838
return args.ModuleManager.RunMigrations(ctx, args.Configurator, vm)
1939
}
2040
}
@@ -46,3 +66,111 @@ func FixLSMData(ctx sdk.Context, args upgrades.UpgradeHandlerArgs) error {
4666

4767
return nil
4868
}
69+
70+
func RedeemStkBalances(ctx sdk.Context, args upgrades.UpgradeHandlerArgs) error {
71+
userdata, err := GetUserAddressesWithBalance(ctx, args)
72+
if err != nil {
73+
return err
74+
}
75+
type Redeem struct{}
76+
type RedeemMsg struct {
77+
Redeem Redeem `json:"redeem"`
78+
}
79+
bz, err := json.Marshal(RedeemMsg{Redeem: Redeem{}})
80+
if err != nil {
81+
return err
82+
}
83+
for _, user := range userdata {
84+
msg := &wasmtypes.MsgExecuteContract{
85+
Sender: user.Address,
86+
Contract: contractAddr,
87+
Msg: bz,
88+
Funds: sdk.NewCoins(user.Balance),
89+
}
90+
handler := args.Keepers.GovKeeper.Router().Handler(msg)
91+
res, err := handler(ctx, msg)
92+
if err != nil {
93+
return err
94+
}
95+
ctx.EventManager().EmitEvents(res.GetEvents())
96+
}
97+
return nil
98+
}
99+
100+
type AddressBalance struct {
101+
Address string
102+
Balance sdk.Coin
103+
}
104+
105+
func GetUserAddressesWithBalance(ctx sdk.Context, args upgrades.UpgradeHandlerArgs) ([]AddressBalance, error) {
106+
107+
contractAddrs := GetContractAddresses(ctx, args)
108+
ibcAddrs := GetIBCAddrs(ctx, args)
109+
// Define a struct to hold address and balance information
110+
userAddresses := make([]AddressBalance, 0)
111+
112+
// Get all balances with non-zero amounts for the specific denom
113+
args.Keepers.BankKeeper.IterateAllBalances(ctx, func(addr sdk.AccAddress, balance sdk.Coin) bool {
114+
if _, ok := denomsMap[balance.Denom]; !ok {
115+
return false // continue iteration
116+
}
117+
118+
// Get the account to check its type
119+
acc := args.Keepers.AccountKeeper.GetAccount(ctx, addr)
120+
if acc == nil {
121+
return false
122+
}
123+
124+
if acc.GetPubKey() == nil {
125+
ctx.Logger().Info("found address without pubkey",
126+
"address", addr, "acc", acc)
127+
}
128+
129+
// Skip module accounts
130+
if _, isModuleAccount := acc.(authtypes.ModuleAccountI); isModuleAccount {
131+
ctx.Logger().Info("found module account", "address", addr)
132+
return false
133+
}
134+
135+
// Skip contract addresses (they start with specific prefix for contracts)
136+
if _, ok := contractAddrs[addr.String()]; ok {
137+
ctx.Logger().Info("found contract account", "address", addr)
138+
return false
139+
}
140+
141+
// Skip IBC escrow accounts
142+
if _, ok := ibcAddrs[addr.String()]; ok {
143+
ctx.Logger().Info("found ibc escrow account", "address", addr)
144+
return false
145+
}
146+
147+
userAddresses = append(userAddresses, AddressBalance{
148+
Address: addr.String(),
149+
Balance: balance,
150+
})
151+
152+
return false // continue iteration
153+
})
154+
155+
return userAddresses, nil
156+
}
157+
158+
func GetContractAddresses(ctx sdk.Context, args upgrades.UpgradeHandlerArgs) map[string]struct{} {
159+
contracts := map[string]struct{}{}
160+
args.Keepers.WasmKeeper.IterateContractInfo(ctx, func(addr sdk.AccAddress, info wasmtypes.ContractInfo) bool {
161+
contracts[addr.String()] = struct{}{}
162+
return false
163+
})
164+
return contracts
165+
}
166+
167+
// we are optimistic here
168+
func GetIBCAddrs(ctx sdk.Context, args upgrades.UpgradeHandlerArgs) map[string]struct{} {
169+
addrs := map[string]struct{}{}
170+
channelID := args.Keepers.IBCKeeper.ChannelKeeper.GetNextChannelSequence(ctx)
171+
for i := uint64(0); i <= channelID; i++ {
172+
addr := transfertypes.GetEscrowAddress(transfertypes.PortID, channeltypes.FormatChannelIdentifier(i))
173+
addrs[addr.String()] = struct{}{}
174+
}
175+
return addrs
176+
}

0 commit comments

Comments
 (0)