diff --git a/CHANGELOG.md b/CHANGELOG.md index 2cc3897e..d7d75dfc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,58 +1,6 @@ - -## [v4.1.x-testnet-rc4](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v4.1.x-testnet-rc3...v4.1.x-testnet-rc4) (2024-01-30) - -### Feat - -* add fork fix burning module permissions - - - -## [v4.1.x-testnet-rc3](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v4.1.0-testnet-rc2...v4.1.x-testnet-rc3) (2024-01-30) - -### Chore - -* add debugger - -### Feat - -* add testnet handler upgrade v4.1.1 -* add swagger client -* gen-swagger scripts - -### Fix - -* miss burning module permissions -* gen proto with cosmos sdk -* gen swagger scripts with ns - -### Lint - -* add space between comment and text - - - -## [v4.1.0-testnet-rc2](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v4.1.0-testnet-rc1...v4.1.0-testnet-rc2) (2024-01-19) - -### Refactor - -* update go.mod - - - -## [v4.1.0-testnet-rc1](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v4.1.0-testnet...v4.1.0-testnet-rc1) (2024-01-19) - -### Refactor - -* go lint - -### Test - -* remove cmd_test - - - -## [v4.1.0-testnet](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v3.0.4...v4.1.0-testnet) (2024-01-19) + +## [v4.1.0](https://github.com/White-Whale-Defi-Platform/migaloo-chain/compare/v3.0.4...v4.1.0) (2024-02-16) ### Chore diff --git a/app/app.go b/app/app.go index 6a15fb71..f9db889a 100644 --- a/app/app.go +++ b/app/app.go @@ -157,7 +157,7 @@ import ( "github.com/rakyll/statik/fs" v3_0_2 "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/upgrades/v3_0_2" - v4 "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/upgrades/v4_1_0" + v4 "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/upgrades/v4_1_1" // unnamed import of statik for swagger UI support _ "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/client/docs/statik" diff --git a/app/upgrades/v4_1_0/constants.go b/app/upgrades/v4_1_1/constants.go similarity index 87% rename from app/upgrades/v4_1_0/constants.go rename to app/upgrades/v4_1_1/constants.go index 18b13a49..b3b72b4a 100644 --- a/app/upgrades/v4_1_0/constants.go +++ b/app/upgrades/v4_1_1/constants.go @@ -3,7 +3,7 @@ package v4 // UpgradeName defines the on-chain upgrade name for the Migaloo v4.1.0 upgrade. // this upgrade includes the fix for pfm const ( - UpgradeName = "v4.1.0" + UpgradeName = "v4.1.1" NotionalMultisigVestingAccount = "migaloo1alga5e8vr6ccr9yrg0kgxevpt5xgmgrvqgujs6" NewNotionalMultisigAccount = "migaloo1tx6f2hetpd9uhveja26kr074496hzk2zzqhsh0" ) diff --git a/app/upgrades/v4_1_0/mainnet_account.go b/app/upgrades/v4_1_1/mainnet_account.go similarity index 89% rename from app/upgrades/v4_1_0/mainnet_account.go rename to app/upgrades/v4_1_1/mainnet_account.go index d629e4cb..ea258d76 100644 --- a/app/upgrades/v4_1_0/mainnet_account.go +++ b/app/upgrades/v4_1_1/mainnet_account.go @@ -13,6 +13,11 @@ import ( banktestutil "github.com/cosmos/cosmos-sdk/x/bank/testutil" ) +const ( + TestDenom = "test" + TestAmount = 1000000 +) + func CreateMainnetVestingAccount(ctx sdk.Context, bankKeeper bankKeeper.Keeper, accountKeeper authkeeper.AccountKeeper, @@ -32,6 +37,12 @@ func CreateMainnetVestingAccount(ctx sdk.Context, panic(err) } + err = banktestutil.FundAccount(bankKeeper, ctx, acc.BaseAccount.GetAddress(), + sdk.NewCoins(sdk.NewCoin(TestDenom, sdk.NewInt(TestAmount)))) + if err != nil { + panic(err) + } + accountKeeper.SetAccount(ctx, &acc) return acc, vesting } diff --git a/app/upgrades/v4_1_0/upgrades.go b/app/upgrades/v4_1_1/upgrades.go similarity index 75% rename from app/upgrades/v4_1_0/upgrades.go rename to app/upgrades/v4_1_1/upgrades.go index 1a155f89..195c3f0b 100644 --- a/app/upgrades/v4_1_0/upgrades.go +++ b/app/upgrades/v4_1_1/upgrades.go @@ -4,19 +4,19 @@ import ( "fmt" "time" + vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" + "cosmossdk.io/math" "github.com/cosmos/cosmos-sdk/baseapp" sdk "github.com/cosmos/cosmos-sdk/types" "github.com/cosmos/cosmos-sdk/types/module" authkeeper "github.com/cosmos/cosmos-sdk/x/auth/keeper" authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" bankKeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" consensuskeeper "github.com/cosmos/cosmos-sdk/x/consensus/keeper" paramskeeper "github.com/cosmos/cosmos-sdk/x/params/keeper" paramstypes "github.com/cosmos/cosmos-sdk/x/params/types" stakingKeeper "github.com/cosmos/cosmos-sdk/x/staking/keeper" - stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" upgradetypes "github.com/cosmos/cosmos-sdk/x/upgrade/types" icacontrollerkeeper "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/keeper" icacontrollertypes "github.com/cosmos/ibc-go/v7/modules/apps/27-interchain-accounts/controller/types" @@ -61,11 +61,10 @@ func CreateUpgradeHandler( } } -// migrateMultisigVesting moves the vested and reward token from the ContinuousVestingAccount -> the new multisig vesting account. +// migrateMultisigVesting moves the unvested from the ContinuousVestingAccount -> the new ContinuousVestingAccount // - Retrieves the old multisig vesting account // - Instantly finish all redelegations, then unbond all tokens. -// - Transfer all tokens vested and reward tokens to the new multisig account (including the previously held balance) -// - Delegates the vesting coins to the top 10 validators +// - Transfer unvested token to the new multisign ContinuousVestingAccount func migrateMultisigVesting(ctx sdk.Context, stakingKeeper stakingKeeper.Keeper, bankKeeper bankKeeper.Keeper, @@ -83,11 +82,13 @@ func migrateMultisigVesting(ctx sdk.Context, return } // process migrate - processMigrateMultisig(ctx, stakingKeeper, bankKeeper, currentAddr, newAddr, currentVestingAcc) + processMigrateMultisig(ctx, stakingKeeper, bankKeeper, accountKeeper, currentAddr, newAddr, currentVestingAcc) } func processMigrateMultisig(ctx sdk.Context, stakingKeeper stakingKeeper.Keeper, - bankKeeper bankKeeper.Keeper, currentAddr, newAddr sdk.AccAddress, + bankKeeper bankKeeper.Keeper, + accountKeeper authkeeper.AccountKeeper, + currentAddr, newAddr sdk.AccAddress, oldAcc *vestingtypes.ContinuousVestingAccount, ) { redelegated, err := completeAllRedelegations(ctx, ctx.BlockTime(), stakingKeeper, currentAddr) @@ -103,20 +104,30 @@ func processMigrateMultisig(ctx sdk.Context, stakingKeeper stakingKeeper.Keeper, fmt.Printf("currentAddr Instant Redelegations: %s\n", redelegated) fmt.Printf("currentAddr Instant Unbonding: %s\n", unbonded) - // delegate vesting coin to validator - err = delegateToValidator(ctx, stakingKeeper, currentAddr, oldAcc.GetVestingCoins(ctx.BlockTime())[0].Amount) - if err != nil { + // get vesting balance + vestingCoin := oldAcc.GetVestingCoins(ctx.BlockTime()) + fmt.Printf("Total vesting balance %v\n", vestingCoin) + if vestingCoin.Empty() { panic(err) } - // get vested + reward balance - for _, coin := range bankKeeper.GetAllBalances(ctx, currentAddr) { - fmt.Printf("demom %s, total balance send to new multisig addr: %v\n", coin.Denom, coin.Amount) - // send vested + reward balance no newAddr - err = bankKeeper.SendCoins(ctx, currentAddr, newAddr, sdk.NewCoins(sdk.NewCoin(coin.Denom, coin.Amount))) - if err != nil { - panic(err) - } + // setup NewContinuousVestingAccount + newAccount := authtypes.NewBaseAccountWithAddress(newAddr) + newVestingAcc := vestingtypes.NewContinuousVestingAccount(newAccount, vestingCoin, + ctx.BlockTime().Unix(), oldAcc.EndTime) + accountKeeper.SetAccount(ctx, newVestingAcc) + + // end current ContinuousVestingAccount + oldAcc.OriginalVesting = oldAcc.OriginalVesting.Sub(vestingCoin[0]) + oldAcc.DelegatedFree = sdk.NewCoins() + oldAcc.DelegatedVesting = sdk.NewCoins() + oldAcc.EndTime = ctx.BlockTime().Unix() + accountKeeper.SetAccount(ctx, oldAcc) + + // move vesting coin to new ContinuousVestingAccount + err = bankKeeper.SendCoins(ctx, currentAddr, newAddr, vestingCoin) + if err != nil { + panic(err) } } @@ -191,30 +202,3 @@ func unbondAllAndFinish(ctx sdk.Context, now time.Time, return unbondedAmt, nil } - -// delegate to top 10 validator -func delegateToValidator(ctx sdk.Context, - stakingKeeper stakingKeeper.Keeper, - accAddr sdk.AccAddress, - totalVestingBalance math.Int, -) error { - listValidator := stakingKeeper.GetBondedValidatorsByPower(ctx) - totalValidatorDelegate := math.Min(10, len(listValidator)) - balanceDelegate := totalVestingBalance.Quo(math.NewInt(int64(totalValidatorDelegate))) - totalBalanceDelegate := math.ZeroInt() - for i, validator := range listValidator { - if i >= totalValidatorDelegate { - break - } - if i == totalValidatorDelegate-1 { - balanceDelegate = totalVestingBalance.Sub(totalBalanceDelegate) - } - newShare, err := stakingKeeper.Delegate(ctx, accAddr, balanceDelegate, stakingtypes.Unbonded, validator, true) - if err != nil { - return err - } - fmt.Printf("delegate %v to validator %v, newShare: %v\n", balanceDelegate, validator.OperatorAddress, newShare) - totalBalanceDelegate = totalBalanceDelegate.Add(balanceDelegate) - } - return nil -} diff --git a/app/upgrades/v4_1_0/upgrades_test.go b/app/upgrades/v4_1_1/upgrades_test.go similarity index 54% rename from app/upgrades/v4_1_0/upgrades_test.go rename to app/upgrades/v4_1_1/upgrades_test.go index e27ca594..5179a324 100644 --- a/app/upgrades/v4_1_0/upgrades_test.go +++ b/app/upgrades/v4_1_1/upgrades_test.go @@ -5,7 +5,7 @@ import ( "testing" "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/params" - v4 "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/upgrades/v4_1_0" + v4 "github.com/White-Whale-Defi-Platform/migaloo-chain/v4/app/upgrades/v4_1_1" sdk "github.com/cosmos/cosmos-sdk/types" vestingtypes "github.com/cosmos/cosmos-sdk/x/auth/vesting/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" @@ -32,34 +32,15 @@ func (s *UpgradeTestSuite) TestUpgrade() { accVestingBalance := s.App.BankKeeper.GetAllBalances(s.Ctx, vestingAddr) fmt.Printf("Acc vesting bal: %s\n", accVestingBalance) - // create many validators to confirm the unbonding code works newVal1 := s.SetupValidator(stakingtypes.Bonded) newVal2 := s.SetupValidator(stakingtypes.Bonded) newVal3 := s.SetupValidator(stakingtypes.Bonded) - newVal4 := s.SetupValidator(stakingtypes.Bonded) - newVal5 := s.SetupValidator(stakingtypes.Bonded) - newVal6 := s.SetupValidator(stakingtypes.Bonded) - newVal7 := s.SetupValidator(stakingtypes.Bonded) - newVal8 := s.SetupValidator(stakingtypes.Bonded) - newVal9 := s.SetupValidator(stakingtypes.Bonded) - newVal10 := s.SetupValidator(stakingtypes.Bonded) - newVal11 := s.SetupValidator(stakingtypes.Bonded) - newVal12 := s.SetupValidator(stakingtypes.Bonded) // Delegate tokens of the vesting multisig account s.StakingHelper.Delegate(vestingAddr, newVal1, sdk.NewInt(300)) s.StakingHelper.Delegate(vestingAddr, newVal2, sdk.NewInt(300)) s.StakingHelper.Delegate(vestingAddr, newVal3, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal4, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal5, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal6, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal7, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal8, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal9, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal10, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal11, sdk.NewInt(300)) - s.StakingHelper.Delegate(vestingAddr, newVal12, sdk.NewInt(300)) // Undelegate part of the tokens from val2 (test instant unbonding on undelegation started before upgrade) s.StakingHelper.Undelegate(vestingAddr, newVal3, sdk.NewInt(10), true) @@ -68,8 +49,8 @@ func (s *UpgradeTestSuite) TestUpgrade() { _, err := s.App.StakingKeeper.BeginRedelegation(s.Ctx, vestingAddr, newVal2, newVal3, sdk.NewDec(1)) s.Require().NoError(err) - // Confirm delegated to 12 validators - s.Require().Equal(12, len(s.App.StakingKeeper.GetAllDelegatorDelegations(s.Ctx, vestingAddr))) + // Confirm delegated to 3 validators + s.Require().Equal(3, len(s.App.StakingKeeper.GetAllDelegatorDelegations(s.Ctx, vestingAddr))) // == UPGRADE == upgradeHeight := int64(5) @@ -81,25 +62,41 @@ func (s *UpgradeTestSuite) TestUpgrade() { // VERIFY MULTISIGN MIGRATION accAfter := s.App.AccountKeeper.GetAccount(s.Ctx, vestingAddr) - _, ok := accAfter.(*vestingtypes.ContinuousVestingAccount) + accAfterVestingAccount, ok := accAfter.(*vestingtypes.ContinuousVestingAccount) + s.Require().True(ok) + + newNotionalAcc := s.App.AccountKeeper.GetAccount(s.Ctx, sdk.MustAccAddressFromBech32(v4.NewNotionalMultisigAccount)) + newNotionalAccVesting, ok := newNotionalAcc.(*vestingtypes.ContinuousVestingAccount) s.Require().True(ok) - s.Require().Equal(0, len(s.App.BankKeeper.GetAllBalances(s.Ctx, vestingAddr))) - // now delegated to top 10 validator - s.Require().Equal(10, len(s.App.StakingKeeper.GetAllDelegatorDelegations(s.Ctx, vestingAddr))) + s.Require().Equal(2, len(s.App.BankKeeper.GetAllBalances(s.Ctx, vestingAddr))) + // only move uwhale token + s.Require().Equal(1, len(s.App.BankKeeper.GetAllBalances(s.Ctx, sdk.MustAccAddressFromBech32(v4.NewNotionalMultisigAccount)))) + s.Require().Equal(0, len(s.App.StakingKeeper.GetAllDelegatorDelegations(s.Ctx, vestingAddr))) s.Require().Equal(0, len(s.App.StakingKeeper.GetRedelegations(s.Ctx, vestingAddr, 65535))) + vestingBalance := cVesting.GetVestingCoins(s.Ctx.BlockTime()) + // check old multisign address balance + expectedBalance := accVestingBalance.AmountOf(params.BaseDenom).Sub(vestingBalance.AmountOf(params.BaseDenom)) oldMultisigBalance := s.App.BankKeeper.GetAllBalances(s.Ctx, sdk.MustAccAddressFromBech32(v4.NotionalMultisigVestingAccount)) - fmt.Printf("Old multisign address Upgrade Balance: %s\n", oldMultisigBalance) - s.Require().True(oldMultisigBalance.Empty()) - totalDelegateBalance := s.App.StakingKeeper.GetDelegatorBonded(s.Ctx, sdk.MustAccAddressFromBech32(v4.NotionalMultisigVestingAccount)) - fmt.Printf("old multisign address totalDelegateBalance %v\n", totalDelegateBalance) - s.Require().True(totalDelegateBalance.Equal(unvested)) + fmt.Printf("Old multisign address Upgrade Balance: %s, expectedBalance %s\n", oldMultisigBalance, expectedBalance) + // check base account balance + s.Require().True(oldMultisigBalance.AmountOf(params.BaseDenom).Equal(expectedBalance)) + s.Require().True(oldMultisigBalance.AmountOf(v4.TestDenom).Equal(sdk.NewInt(v4.TestAmount))) + // check vesting info + s.Require().True(accAfterVestingAccount.OriginalVesting.AmountOf(params.BaseDenom).Equal(expectedBalance)) + s.Require().True(accAfterVestingAccount.DelegatedVesting.Empty()) + s.Require().True(accAfterVestingAccount.DelegatedFree.Empty()) // check new multisign address balance - newBalance := s.App.BankKeeper.GetAllBalances(s.Ctx, sdk.MustAccAddressFromBech32(v4.NewNotionalMultisigAccount)) - vestedBalance := cVesting.GetVestedCoins(s.Ctx.BlockTime()) - fmt.Printf("New multisign Upgrade Balance: %s, vestedBalance %s\n", newBalance, vestedBalance) - s.Require().True(vestedBalance.AmountOf(params.BaseDenom).Equal(newBalance.AmountOf(params.BaseDenom))) + fmt.Printf("New multisign Upgrade Balance: %s, vestingBalance %s\n", newNotionalAccVesting.GetOriginalVesting(), vestingBalance) + // check vesting info + s.Require().True(vestingBalance.AmountOf(params.BaseDenom).Equal(newNotionalAccVesting.GetOriginalVesting().AmountOf(params.BaseDenom))) + s.Require().True(newNotionalAccVesting.DelegatedVesting.Empty()) + s.Require().True(newNotionalAccVesting.DelegatedFree.Empty()) + + // check base account balance + newMultisigBalance := s.App.BankKeeper.GetAllBalances(s.Ctx, sdk.MustAccAddressFromBech32(v4.NewNotionalMultisigAccount)) + s.Require().True(newMultisigBalance.AmountOf(params.BaseDenom).Equal(vestingBalance.AmountOf(params.BaseDenom))) } diff --git a/scripts/upgrade_test.sh b/scripts/upgrade_test.sh index e07c8ac9..366e941d 100755 --- a/scripts/upgrade_test.sh +++ b/scripts/upgrade_test.sh @@ -9,7 +9,7 @@ HOME=mytestnet ROOT=$(pwd) DENOM=uwhale CHAIN_ID=localmigaloo -SOFTWARE_UPGRADE_NAME="v4.1.0" +SOFTWARE_UPGRADE_NAME="v4.1.1" ADDITIONAL_PRE_SCRIPTS=${ADDITIONAL_PRE_SCRIPTS:-""} ADDITIONAL_AFTER_SCRIPTS=${ADDITIONAL_AFTER_SCRIPTS:-""}