From 9b0c7416b2366b2beb76180c90a3444e48974b5c Mon Sep 17 00:00:00 2001 From: "T.K. Kwon" Date: Fri, 28 Jul 2023 13:54:39 +0700 Subject: [PATCH 1/4] remove x/recovery --- x/recovery/client/cli/query.go | 57 -- x/recovery/genesis.go | 24 - x/recovery/genesis_test.go | 117 ---- x/recovery/ibc_middleware.go | 66 -- x/recovery/keeper/grpc_query.go | 24 - x/recovery/keeper/grpc_query_test.go | 16 - x/recovery/keeper/ibc_callbacks.go | 289 --------- .../ibc_callbacks_integration_suite_test.go | 159 ----- .../keeper/ibc_callbacks_integration_test.go | 254 -------- x/recovery/keeper/ibc_callbacks_test.go | 576 ------------------ x/recovery/keeper/keeper.go | 84 --- x/recovery/keeper/keeper_test.go | 84 --- x/recovery/keeper/params.go | 18 - x/recovery/keeper/params_test.go | 9 - x/recovery/keeper/utils_test.go | 51 -- x/recovery/module.go | 165 ----- x/recovery/types/errors.go | 10 - x/recovery/types/events.go | 6 - x/recovery/types/genesis.go | 21 - x/recovery/types/genesis.pb.go | 546 ----------------- x/recovery/types/genesis_test.go | 41 -- x/recovery/types/interfaces.go | 41 -- x/recovery/types/keys.go | 13 - x/recovery/types/params.go | 82 --- x/recovery/types/params_test.go | 61 -- x/recovery/types/query.pb.go | 536 ---------------- x/recovery/types/query.pb.gw.go | 153 ----- 27 files changed, 3503 deletions(-) delete mode 100644 x/recovery/client/cli/query.go delete mode 100644 x/recovery/genesis.go delete mode 100644 x/recovery/genesis_test.go delete mode 100644 x/recovery/ibc_middleware.go delete mode 100644 x/recovery/keeper/grpc_query.go delete mode 100644 x/recovery/keeper/grpc_query_test.go delete mode 100644 x/recovery/keeper/ibc_callbacks.go delete mode 100644 x/recovery/keeper/ibc_callbacks_integration_suite_test.go delete mode 100644 x/recovery/keeper/ibc_callbacks_integration_test.go delete mode 100644 x/recovery/keeper/ibc_callbacks_test.go delete mode 100644 x/recovery/keeper/keeper.go delete mode 100644 x/recovery/keeper/keeper_test.go delete mode 100644 x/recovery/keeper/params.go delete mode 100644 x/recovery/keeper/params_test.go delete mode 100644 x/recovery/keeper/utils_test.go delete mode 100644 x/recovery/module.go delete mode 100644 x/recovery/types/errors.go delete mode 100644 x/recovery/types/events.go delete mode 100644 x/recovery/types/genesis.go delete mode 100644 x/recovery/types/genesis.pb.go delete mode 100644 x/recovery/types/genesis_test.go delete mode 100644 x/recovery/types/interfaces.go delete mode 100644 x/recovery/types/keys.go delete mode 100644 x/recovery/types/params.go delete mode 100644 x/recovery/types/params_test.go delete mode 100644 x/recovery/types/query.pb.go delete mode 100644 x/recovery/types/query.pb.gw.go diff --git a/x/recovery/client/cli/query.go b/x/recovery/client/cli/query.go deleted file mode 100644 index 6438f073..00000000 --- a/x/recovery/client/cli/query.go +++ /dev/null @@ -1,57 +0,0 @@ -package cli - -import ( - "context" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/client/flags" - "github.com/spf13/cobra" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -// GetQueryCmd returns the parent command for all recovery CLI query commands. -func GetQueryCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: types.ModuleName, - Short: "Querying commands for the recovery module", - DisableFlagParsing: true, - SuggestionsMinimumDistance: 2, - RunE: client.ValidateCmd, - } - - cmd.AddCommand( - GetParamsCmd(), - ) - return cmd -} - -// GetParamsCmd queries the module parameters -func GetParamsCmd() *cobra.Command { - cmd := &cobra.Command{ - Use: "params", - Short: "Gets recovery params", - Long: "Gets recovery params", - Args: cobra.NoArgs, - RunE: func(cmd *cobra.Command, _ []string) error { - clientCtx, err := client.GetClientQueryContext(cmd) - if err != nil { - return err - } - - queryClient := types.NewQueryClient(clientCtx) - - req := &types.QueryParamsRequest{} - - res, err := queryClient.Params(context.Background(), req) - if err != nil { - return err - } - - return clientCtx.PrintProto(res) - }, - } - - flags.AddQueryFlagsToCmd(cmd) - return cmd -} diff --git a/x/recovery/genesis.go b/x/recovery/genesis.go deleted file mode 100644 index 5309060d..00000000 --- a/x/recovery/genesis.go +++ /dev/null @@ -1,24 +0,0 @@ -package recovery - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/Canto-Network/Canto/v6/x/recovery/keeper" - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -// InitGenesis import module genesis -func InitGenesis( - ctx sdk.Context, - k keeper.Keeper, - data types.GenesisState, -) { - k.SetParams(ctx, data.Params) -} - -// ExportGenesis export module status -func ExportGenesis(ctx sdk.Context, k keeper.Keeper) *types.GenesisState { - return &types.GenesisState{ - Params: k.GetParams(ctx), - } -} diff --git a/x/recovery/genesis_test.go b/x/recovery/genesis_test.go deleted file mode 100644 index eaff8287..00000000 --- a/x/recovery/genesis_test.go +++ /dev/null @@ -1,117 +0,0 @@ -package recovery_test - -import ( - "fmt" - "testing" - "time" - - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/stretchr/testify/suite" - "github.com/tendermint/tendermint/crypto/tmhash" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmversion "github.com/tendermint/tendermint/proto/tendermint/version" - "github.com/tendermint/tendermint/version" - - "github.com/evmos/ethermint/tests" - feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" - - "github.com/Canto-Network/Canto/v6/app" - "github.com/Canto-Network/Canto/v6/x/recovery" - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -type GenesisTestSuite struct { - suite.Suite - - ctx sdk.Context - - app *app.Canto - genesis types.GenesisState -} - -func (suite *GenesisTestSuite) SetupTest() { - // consensus key - consAddress := sdk.ConsAddress(tests.GenerateAddress().Bytes()) - - suite.app = app.Setup(false, feemarkettypes.DefaultGenesisState()) - suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "canto_9000-1", - Time: time.Now().UTC(), - ProposerAddress: consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - suite.genesis = *types.DefaultGenesisState() -} - -func TestGenesisTestSuite(t *testing.T) { - suite.Run(t, new(GenesisTestSuite)) -} - -func (suite *GenesisTestSuite) TestRecoveryInitGenesis() { - testCases := []struct { - name string - genesis types.GenesisState - expPanic bool - }{ - { - "default genesis", - suite.genesis, - false, - }, - { - "custom genesis - recovery disabled", - types.GenesisState{ - Params: types.Params{ - EnableRecovery: false, - PacketTimeoutDuration: time.Hour * 10, - }, - }, - false, - }, - } - - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - if tc.expPanic { - suite.Require().Panics(func() { - recovery.InitGenesis(suite.ctx, *suite.app.RecoveryKeeper, tc.genesis) - }) - } else { - suite.Require().NotPanics(func() { - recovery.InitGenesis(suite.ctx, *suite.app.RecoveryKeeper, tc.genesis) - }) - - params := suite.app.RecoveryKeeper.GetParams(suite.ctx) - suite.Require().Equal(tc.genesis.Params, params) - } - }) - } -} - -func (suite *GenesisTestSuite) TestRecoveryExportGenesis() { - recovery.InitGenesis(suite.ctx, *suite.app.RecoveryKeeper, suite.genesis) - - genesisExported := recovery.ExportGenesis(suite.ctx, *suite.app.RecoveryKeeper) - suite.Require().Equal(genesisExported.Params, suite.genesis.Params) -} diff --git a/x/recovery/ibc_middleware.go b/x/recovery/ibc_middleware.go deleted file mode 100644 index f49e13e0..00000000 --- a/x/recovery/ibc_middleware.go +++ /dev/null @@ -1,66 +0,0 @@ -package recovery - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - - "github.com/Canto-Network/Canto/v6/ibc" - "github.com/Canto-Network/Canto/v6/x/recovery/keeper" -) - -var _ porttypes.Middleware = &IBCMiddleware{} - -// IBCMiddleware implements the ICS26 callbacks for the transfer middleware given -// the recovery keeper and the underlying application. -type IBCMiddleware struct { - *ibc.Module - keeper keeper.Keeper -} - -// NewIBCMiddleware creates a new IBCMiddleware given the keeper and underlying application -func NewIBCMiddleware(k keeper.Keeper, app porttypes.IBCModule) IBCMiddleware { - return IBCMiddleware{ - Module: ibc.NewModule(app), - keeper: k, - } -} - -// OnRecvPacket implements the IBCModule interface. -// If the acknowledgement fails, this callback will default to the ibc-core -// packet callback. -func (im IBCMiddleware) OnRecvPacket( - ctx sdk.Context, - packet channeltypes.Packet, - relayer sdk.AccAddress, -) exported.Acknowledgement { - ack := im.Module.OnRecvPacket(ctx, packet, relayer) - - // return if the acknowledgement is an error ACK - if !ack.Success() { - return ack - } - - return im.keeper.OnRecvPacket(ctx, packet, ack) -} - -// SendPacket implements the ICS4 Wrapper interface -func (im IBCMiddleware) SendPacket( - ctx sdk.Context, - chanCap *capabilitytypes.Capability, - packet exported.PacketI, -) error { - return im.keeper.SendPacket(ctx, chanCap, packet) -} - -// WriteAcknowledgement implements the ICS4 Wrapper interface -func (im IBCMiddleware) WriteAcknowledgement( - ctx sdk.Context, - chanCap *capabilitytypes.Capability, - packet exported.PacketI, - ack exported.Acknowledgement, -) error { - return im.keeper.WriteAcknowledgement(ctx, chanCap, packet, ack) -} diff --git a/x/recovery/keeper/grpc_query.go b/x/recovery/keeper/grpc_query.go deleted file mode 100644 index cc172689..00000000 --- a/x/recovery/keeper/grpc_query.go +++ /dev/null @@ -1,24 +0,0 @@ -package keeper - -import ( - "context" - - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -var _ types.QueryServer = Keeper{} - -// Params returns the module parameters -func (k Keeper) Params( - c context.Context, - _ *types.QueryParamsRequest, -) (*types.QueryParamsResponse, error) { - ctx := sdk.UnwrapSDKContext(c) - params := k.GetParams(ctx) - - return &types.QueryParamsResponse{ - Params: params, - }, nil -} diff --git a/x/recovery/keeper/grpc_query_test.go b/x/recovery/keeper/grpc_query_test.go deleted file mode 100644 index be2a81e9..00000000 --- a/x/recovery/keeper/grpc_query_test.go +++ /dev/null @@ -1,16 +0,0 @@ -package keeper_test - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -func (suite *KeeperTestSuite) TestQueryParams() { - ctx := sdk.WrapSDKContext(suite.ctx) - expParams := types.DefaultParams() - - res, err := suite.queryClient.Params(ctx, &types.QueryParamsRequest{}) - suite.Require().NoError(err) - suite.Require().Equal(expParams, res.Params) -} diff --git a/x/recovery/keeper/ibc_callbacks.go b/x/recovery/keeper/ibc_callbacks.go deleted file mode 100644 index e01c8f18..00000000 --- a/x/recovery/keeper/ibc_callbacks.go +++ /dev/null @@ -1,289 +0,0 @@ -package keeper - -import ( - "strings" - - "github.com/armon/go-metrics" - "github.com/cosmos/cosmos-sdk/telemetry" - sdk "github.com/cosmos/cosmos-sdk/types" - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - vestexported "github.com/cosmos/cosmos-sdk/x/auth/vesting/exported" - - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - host "github.com/cosmos/ibc-go/v3/modules/core/24-host" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - - "github.com/Canto-Network/Canto/v6/ibc" - canto "github.com/Canto-Network/Canto/v6/types" - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -// OnRecvPacket performs an IBC receive callback. It returns the tokens that -// users transferred to their Cosmos secp256k1 address instead of the Ethereum -// ethsecp256k1 address. The expected behavior is as follows: -// -// First transfer from authorized source chain: -// - sends back IBC tokens which originated from the source chain -// - sends over all canto native tokens -// Second transfer from a different authorized source chain: -// - only sends back IBC tokens which originated from the source chain -func (k Keeper) OnRecvPacket( - ctx sdk.Context, - packet channeltypes.Packet, - ack exported.Acknowledgement, -) exported.Acknowledgement { - logger := k.Logger(ctx) - - params := k.GetParams(ctx) - - // Check and return original ACK if: - // - recovery is disabled globally - // - channel is not authorized - // - channel is an EVM channel - if !params.EnableRecovery { - return ack - } - - // Get addresses in `canto1` and the original bech32 format - sender, recipient, senderBech32, recipientBech32, err := ibc.GetTransferSenderRecipient(packet) - if err != nil { - return channeltypes.NewErrorAcknowledgement(err.Error()) - } - - // return error ACK if the address is on the deny list - if k.bankKeeper.BlockedAddr(sender) || k.bankKeeper.BlockedAddr(recipient) { - return channeltypes.NewErrorAcknowledgement( - sdkerrors.Wrapf( - types.ErrBlockedAddress, - "sender (%s) or recipient (%s) address are in the deny list for sending and receiving transfers", - senderBech32, recipientBech32, - ).Error(), - ) - } - - // Check if sender != recipient, as recovery is only possible for transfers to - // a sender's own account on canto (sender == recipient) - if !sender.Equals(recipient) { - // Continue to the next IBC middleware by returning the original ACK. - return ack - } - - // get the recipient/sender account - account := k.accountKeeper.GetAccount(ctx, recipient) - - // recovery is not supported for vesting or module accounts - if _, isVestingAcc := account.(vestexported.VestingAccount); isVestingAcc { - return ack - } - - if _, isModuleAccount := account.(authtypes.ModuleAccountI); isModuleAccount { - return ack - } - - // Check if recipient pubkey is a supported key (eth_secp256k1, amino multisig, - // ed25519). Continue and return success ACK as the funds are not stuck on - // chain for supported keys - if account != nil && canto.IsSupportedKey(account.GetPubKey()) { - return ack - } - - // Perform recovery to transfer the balance back to the sender bech32 address. - // NOTE: Since destination channel is authorized and not from an EVM chain, we - // know that only secp256k1 keys are supported in the source chain. - var destPort, destChannel string - balances := sdk.Coins{} - - // iterate over all tokens owned by the address (i.e recipient balance) and - // transfer them to the original sender address in the source chain (if - // applicable, see cases for IBC vouchers below). - k.bankKeeper.IterateAccountBalances(ctx, recipient, func(coin sdk.Coin) (stop bool) { - if coin.IsZero() { - // safety check: continue - return false - } - - if strings.HasPrefix(coin.Denom, "ibc/") { - // IBC vouchers, obtain the destination port and channel from the denom path - destPort, destChannel, err = k.GetIBCDenomDestinationIdentifiers(ctx, coin.Denom, senderBech32) - if err != nil { - logger.Error( - "failed to get the IBC full denom path of source chain", - "error", err.Error(), - ) - return true // stop iteration - } - - // NOTE: only recover the IBC tokens from the source chain connected - // through our authorized destination channel - if packet.DestinationPort != destPort || packet.DestinationChannel != destChannel { - // continue - return false - } - } - - // NOTE: Don't use the consensus state because it may become unreliable if updates slow down - timeout := uint64(ctx.BlockTime().Add(params.PacketTimeoutDuration).UnixNano()) - - // Recover the tokens to the bech32 prefixed address of the source chain - err = k.transferKeeper.SendTransfer( - ctx, - packet.DestinationPort, // packet destination port is now the source - packet.DestinationChannel, // packet destination channel is now the source - coin, // balance of the coin - recipient, // recipient is the address in the canto chain - senderBech32, // transfer to your own account address on the source chain - clienttypes.ZeroHeight(), // timeout height disabled - timeout, // timeout timestamp is 4 hours from now - ) - - if err != nil { - return true // stop iteration - } - - balances = balances.Add(coin) - return false - }) - - // check error from the iteration above - if err != nil { - logger.Error( - "failed to recover IBC vouchers", - "sender", senderBech32, - "receiver", recipientBech32, - "source-port", packet.SourcePort, - "source-channel", packet.SourceChannel, - "error", err.Error(), - ) - - return channeltypes.NewErrorAcknowledgement( - sdkerrors.Wrapf( - err, - "failed to recover IBC vouchers back to sender '%s' in the corresponding IBC chain", senderBech32, - ).Error(), - ) - } - - if balances.IsZero() { - // short circuit in case the user doesn't have any balance - return ack - } - - amtStr := balances.String() - - logger.Info( - "balances recovered to sender address", - "sender", senderBech32, - "receiver", recipientBech32, - "amount", amtStr, - "source-port", packet.SourcePort, - "source-channel", packet.SourceChannel, - "dest-port", packet.DestinationPort, - "dest-channel", packet.DestinationChannel, - ) - - defer func() { - telemetry.IncrCounter(1, types.ModuleName, "ibc", "on_recv", "total") - - for _, b := range balances { - if b.Amount.IsInt64() { - telemetry.IncrCounterWithLabels( - []string{types.ModuleName, "ibc", "on_recv", "token", "total"}, - float32(b.Amount.Int64()), - []metrics.Label{ - telemetry.NewLabel("denom", b.Denom), - telemetry.NewLabel("source_channel", packet.SourceChannel), - telemetry.NewLabel("source_port", packet.SourcePort), - }, - ) - } - } - }() - - ctx.EventManager().EmitEvent( - sdk.NewEvent( - types.EventTypeRecovery, - sdk.NewAttribute(sdk.AttributeKeySender, senderBech32), - sdk.NewAttribute(transfertypes.AttributeKeyReceiver, recipientBech32), - sdk.NewAttribute(sdk.AttributeKeyAmount, amtStr), - sdk.NewAttribute(channeltypes.AttributeKeySrcChannel, packet.SourceChannel), - sdk.NewAttribute(channeltypes.AttributeKeySrcPort, packet.SourcePort), - sdk.NewAttribute(channeltypes.AttributeKeyDstPort, packet.DestinationPort), - sdk.NewAttribute(channeltypes.AttributeKeyDstChannel, packet.DestinationChannel), - ), - ) - - // return original acknowledgement - return ack -} - -// GetIBCDenomDestinationIdentifiers returns the destination port and channel of -// the IBC denomination, i.e port and channel on canto for the voucher. It -// returns an error if: -// - the denomination is invalid -// - the denom trace is not found on the store -// - destination port or channel ID are invalid -func (k Keeper) GetIBCDenomDestinationIdentifiers(ctx sdk.Context, denom, sender string) (destinationPort, destinationChannel string, err error) { - ibcDenom := strings.SplitN(denom, "/", 2) - if len(ibcDenom) < 2 { - return "", "", sdkerrors.Wrap(transfertypes.ErrInvalidDenomForTransfer, denom) - } - - hash, err := transfertypes.ParseHexHash(ibcDenom[1]) - if err != nil { - return "", "", sdkerrors.Wrapf( - err, - "failed to recover IBC vouchers back to sender '%s' in the corresponding IBC chain", sender, - ) - } - - denomTrace, found := k.transferKeeper.GetDenomTrace(ctx, hash) - if !found { - return "", "", sdkerrors.Wrapf( - transfertypes.ErrTraceNotFound, - "failed to recover IBC vouchers back to sender '%s' in the corresponding IBC chain", sender, - ) - } - - path := strings.Split(denomTrace.Path, "/") - if len(path)%2 != 0 { - // safety check: shouldn't occur - return "", "", sdkerrors.Wrapf( - transfertypes.ErrInvalidDenomForTransfer, - "invalid denom (%s) trace path %s", denomTrace.BaseDenom, denomTrace.Path, - ) - } - - destinationPort = path[0] - destinationChannel = path[1] - - _, found = k.channelKeeper.GetChannel(ctx, destinationPort, destinationChannel) - if !found { - return "", "", sdkerrors.Wrapf( - channeltypes.ErrChannelNotFound, - "port ID %s, channel ID %s", destinationPort, destinationChannel, - ) - } - - // NOTE: optimistic handshakes could cause unforeseen issues. - // Safety check: verify that the destination port and channel are valid - if err := host.PortIdentifierValidator(destinationPort); err != nil { - // shouldn't occur - return "", "", sdkerrors.Wrapf( - host.ErrInvalidID, - "invalid port ID '%s': %s", destinationPort, err.Error(), - ) - } - - if err := host.ChannelIdentifierValidator(destinationChannel); err != nil { - // shouldn't occur - return "", "", sdkerrors.Wrapf( - channeltypes.ErrInvalidChannelIdentifier, - "channel ID '%s': %s", destinationChannel, err.Error(), - ) - } - - return destinationPort, destinationChannel, nil -} diff --git a/x/recovery/keeper/ibc_callbacks_integration_suite_test.go b/x/recovery/keeper/ibc_callbacks_integration_suite_test.go deleted file mode 100644 index 7bbc7d95..00000000 --- a/x/recovery/keeper/ibc_callbacks_integration_suite_test.go +++ /dev/null @@ -1,159 +0,0 @@ -package keeper_test - -import ( - "strconv" - "testing" - - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" - - "github.com/stretchr/testify/suite" - - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcgotesting "github.com/cosmos/ibc-go/v3/testing" - - ibctesting "github.com/Canto-Network/Canto/v6/ibc/testing" - - "github.com/Canto-Network/Canto/v6/app" - inflationtypes "github.com/Canto-Network/Canto/v6/x/inflation/types" - "github.com/Canto-Network/Canto/v6/x/recovery/types" - minttypes "github.com/cosmos/cosmos-sdk/x/mint/types" -) - -type IBCTestingSuite struct { - suite.Suite - coordinator *ibcgotesting.Coordinator - - // testing chains used for convenience and readability - cantoChain *ibcgotesting.TestChain - IBCOsmosisChain *ibcgotesting.TestChain - IBCCosmosChain *ibcgotesting.TestChain - - pathOsmosiscanto *ibcgotesting.Path - pathCosmoscanto *ibcgotesting.Path - pathOsmosisCosmos *ibcgotesting.Path -} - -var s *IBCTestingSuite - -func TestIBCTestingSuite(t *testing.T) { - s = new(IBCTestingSuite) - suite.Run(t, s) - - // Run Ginkgo integration tests - RegisterFailHandler(Fail) - RunSpecs(t, "Keeper Suite") -} - -func (suite *IBCTestingSuite) SetupTest() { - // initializes 3 test chains - suite.coordinator = ibctesting.NewCoordinator(suite.T(), 1, 2) - suite.cantoChain = suite.coordinator.GetChain(ibcgotesting.GetChainID(1)) - suite.IBCOsmosisChain = suite.coordinator.GetChain(ibcgotesting.GetChainID(2)) - suite.IBCCosmosChain = suite.coordinator.GetChain(ibcgotesting.GetChainID(3)) - suite.coordinator.CommitNBlocks(suite.cantoChain, 2) - suite.coordinator.CommitNBlocks(suite.IBCOsmosisChain, 2) - suite.coordinator.CommitNBlocks(suite.IBCCosmosChain, 2) - - // Mint coins locked on the canto account generated with secp. - coincanto := sdk.NewCoin("acanto", sdk.NewInt(10000)) - coins := sdk.NewCoins(coincanto) - err := suite.cantoChain.App.(*app.Canto).BankKeeper.MintCoins(suite.cantoChain.GetContext(), inflationtypes.ModuleName, coins) - suite.Require().NoError(err) - err = suite.cantoChain.App.(*app.Canto).BankKeeper.SendCoinsFromModuleToAccount(suite.cantoChain.GetContext(), inflationtypes.ModuleName, suite.IBCOsmosisChain.SenderAccount.GetAddress(), coins) - suite.Require().NoError(err) - - // Mint coins on the osmosis side which we'll use to unlock our acanto - coinOsmo := sdk.NewCoin("uosmo", sdk.NewInt(10)) - coins = sdk.NewCoins(coinOsmo) - err = suite.IBCOsmosisChain.GetSimApp().BankKeeper.MintCoins(suite.IBCOsmosisChain.GetContext(), minttypes.ModuleName, coins) - suite.Require().NoError(err) - err = suite.IBCOsmosisChain.GetSimApp().BankKeeper.SendCoinsFromModuleToAccount(suite.IBCOsmosisChain.GetContext(), minttypes.ModuleName, suite.IBCOsmosisChain.SenderAccount.GetAddress(), coins) - suite.Require().NoError(err) - - // Mint coins on the cosmos side which we'll use to unlock our acanto - coinAtom := sdk.NewCoin("uatom", sdk.NewInt(10)) - coins = sdk.NewCoins(coinAtom) - err = suite.IBCCosmosChain.GetSimApp().BankKeeper.MintCoins(suite.IBCCosmosChain.GetContext(), minttypes.ModuleName, coins) - suite.Require().NoError(err) - err = suite.IBCCosmosChain.GetSimApp().BankKeeper.SendCoinsFromModuleToAccount(suite.IBCCosmosChain.GetContext(), minttypes.ModuleName, suite.IBCCosmosChain.SenderAccount.GetAddress(), coins) - suite.Require().NoError(err) - - params := types.DefaultParams() - params.EnableRecovery = true - suite.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(suite.cantoChain.GetContext(), params) - - suite.pathOsmosiscanto = ibctesting.NewTransferPath(suite.IBCOsmosisChain, suite.cantoChain) // clientID, connectionID, channelID empty - suite.pathCosmoscanto = ibctesting.NewTransferPath(suite.IBCCosmosChain, suite.cantoChain) - suite.pathOsmosisCosmos = ibctesting.NewTransferPath(suite.IBCCosmosChain, suite.IBCOsmosisChain) - suite.coordinator.Setup(suite.pathOsmosiscanto) // clientID, connectionID, channelID filled - suite.coordinator.Setup(suite.pathCosmoscanto) - suite.coordinator.Setup(suite.pathOsmosisCosmos) - suite.Require().Equal("07-tendermint-0", suite.pathOsmosiscanto.EndpointA.ClientID) - suite.Require().Equal("connection-0", suite.pathOsmosiscanto.EndpointA.ConnectionID) - suite.Require().Equal("channel-0", suite.pathOsmosiscanto.EndpointA.ChannelID) -} - -var ( - timeoutHeight = clienttypes.NewHeight(1000, 1000) - - uosmoDenomtrace = transfertypes.DenomTrace{ - Path: "transfer/channel-0", - BaseDenom: "uosmo", - } - - uosmoIbcdenom = uosmoDenomtrace.IBCDenom() - - uatomDenomtrace = transfertypes.DenomTrace{ - Path: "transfer/channel-1", - BaseDenom: "uatom", - } - uatomIbcdenom = uatomDenomtrace.IBCDenom() - - acantoDenomtrace = transfertypes.DenomTrace{ - Path: "transfer/channel-0", - BaseDenom: "acanto", - } - acantoIbcdenom = acantoDenomtrace.IBCDenom() - - uatomOsmoDenomtrace = transfertypes.DenomTrace{ - Path: "transfer/channel-0/transfer/channel-1", - BaseDenom: "uatom", - } - uatomOsmoIbcdenom = uatomOsmoDenomtrace.IBCDenom() -) - -func (suite *IBCTestingSuite) SendAndReceiveMessage(path *ibcgotesting.Path, origin *ibcgotesting.TestChain, coin string, amount int64, sender string, receiver string, seq uint64) { - // Send coin from A to B - transferMsg := transfertypes.NewMsgTransfer(path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, sdk.NewCoin(coin, sdk.NewInt(amount)), sender, receiver, timeoutHeight, 0) - _, err := origin.SendMsgs(transferMsg) - suite.Require().NoError(err) // message committed - // Recreate the packet that was sent - transfer := transfertypes.NewFungibleTokenPacketData(coin, strconv.Itoa(int(amount)), sender, receiver) - packet := channeltypes.NewPacket(transfer.GetBytes(), seq, path.EndpointA.ChannelConfig.PortID, path.EndpointA.ChannelID, path.EndpointB.ChannelConfig.PortID, path.EndpointB.ChannelID, timeoutHeight, 0) - // Receive message on the counterparty side, and send ack - err = path.RelayPacket(packet) - suite.Require().NoError(err) -} - -func CreatePacket(amount, denom, sender, receiver, srcPort, srcChannel, dstPort, dstChannel string, seq, timeout uint64) channeltypes.Packet { - transfer := transfertypes.FungibleTokenPacketData{ - Amount: amount, - Denom: denom, - Receiver: sender, - Sender: receiver, - } - return channeltypes.NewPacket( - transfer.GetBytes(), - seq, - srcPort, - srcChannel, - dstPort, - dstChannel, - clienttypes.ZeroHeight(), // timeout height disabled - timeout, - ) -} diff --git a/x/recovery/keeper/ibc_callbacks_integration_test.go b/x/recovery/keeper/ibc_callbacks_integration_test.go deleted file mode 100644 index f1ddbb67..00000000 --- a/x/recovery/keeper/ibc_callbacks_integration_test.go +++ /dev/null @@ -1,254 +0,0 @@ -package keeper_test - -import ( - "time" - - "github.com/Canto-Network/Canto/v6/app" - "github.com/Canto-Network/Canto/v6/x/recovery/types" - sdk "github.com/cosmos/cosmos-sdk/types" - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - . "github.com/onsi/ginkgo/v2" - . "github.com/onsi/gomega" -) - -var _ = Describe("Recovery: Performing an IBC Transfer", Ordered, func() { - coincanto := sdk.NewCoin("acanto", sdk.NewInt(10000)) - coinOsmo := sdk.NewCoin("uosmo", sdk.NewInt(10)) - coinAtom := sdk.NewCoin("uatom", sdk.NewInt(10)) - - var ( - sender, receiver string - senderAcc, receiverAcc sdk.AccAddress - timeout uint64 - // claim claimtypes.ClaimsRecord - ) - - BeforeEach(func() { - s.SetupTest() - }) - - Describe("from a non-authorized chain", func() { - BeforeEach(func() { - // params := "acanto" - // params.AuthorizedChannels = []string{} - - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.cantoChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - }) - It("should transfer and not recover tokens", func() { - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, "uosmo", 10, sender, receiver, 1) - - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto).To(Equal(coincanto)) - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo).To(Equal(sdk.NewCoin(uosmoIbcdenom, coinOsmo.Amount))) - }) - }) - - Describe("from an authorized, non-EVM chain (e.g. Osmosis)", func() { - Describe("to a different account on canto (sender != recipient)", func() { - BeforeEach(func() { - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.cantoChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - }) - - It("should transfer and not recover tokens", func() { - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, "uosmo", 10, sender, receiver, 1) - - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto).To(Equal(coincanto)) - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo).To(Equal(sdk.NewCoin(uosmoIbcdenom, coinOsmo.Amount))) - }) - }) - - Describe("to the sender's own eth_secp256k1 account on canto (sender == recipient)", func() { - BeforeEach(func() { - sender = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - receiver = s.IBCOsmosisChain.SenderAccount.GetAddress().String() - senderAcc = sdk.MustAccAddressFromBech32(sender) - receiverAcc = sdk.MustAccAddressFromBech32(receiver) - }) - - Context("with disabled recovery parameter", func() { - BeforeEach(func() { - params := types.DefaultParams() - params.EnableRecovery = false - s.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(s.cantoChain.GetContext(), params) - }) - - It("should not transfer or recover tokens", func() { - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, coinOsmo.Denom, coinOsmo.Amount.Int64(), sender, receiver, 1) - - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto).To(Equal(coincanto)) - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo).To(Equal(sdk.NewCoin(uosmoIbcdenom, coinOsmo.Amount))) - }) - }) - - Context("without a sender's claims record", func() { - When("recipient has no ibc vouchers that originated from other chains", func() { - It("should transfer and recover tokens", func() { - // fmt.Println("Sender Account Numberc: ", s.IBCOsmosisChain.SenderAccount.GetAccountNumber()) - // fmt.Println("Sender Sequence: ", s.IBCOsmosisChain.SenderAccount.GetSequence()) - - // acanto & ibc tokens that originated from the sender's chain - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, coinOsmo.Denom, coinOsmo.Amount.Int64(), sender, receiver, 1) - timeout = uint64(s.cantoChain.GetContext().BlockTime().Add(time.Hour * 4).Add(time.Second * -20).UnixNano()) - - // Escrow before relaying packets - balanceEscrow := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), transfertypes.GetEscrowAddress("transfer", "channel-0"), "acanto") - Expect(balanceEscrow).To(Equal(coincanto)) - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo.IsZero()).To(BeTrue()) - - // Relay both packets that were sent in the ibc_callback - err := s.pathOsmosiscanto.RelayPacket(CreatePacket("10000", "acanto", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 1, timeout)) - s.Require().NoError(err) - err = s.pathOsmosiscanto.RelayPacket(CreatePacket("10", "transfer/channel-0/uosmo", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 2, timeout)) - s.Require().NoError(err) - - // Check that the acanto were recovered - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto.IsZero()).To(BeTrue()) - ibccanto := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, acantoIbcdenom) - Expect(ibccanto).To(Equal(sdk.NewCoin(acantoIbcdenom, coincanto.Amount))) - - // Check that the uosmo were recovered - ibcOsmo = s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo.IsZero()).To(BeTrue()) - nativeOsmo := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - Expect(nativeOsmo).To(Equal(coinOsmo)) - }) - }) - - // Do not recover uatom sent from Cosmos when performing recovery through IBC transfer from Osmosis - When("recipient has additional ibc vouchers that originated from other chains", func() { - BeforeEach(func() { - params := types.DefaultParams() - params.EnableRecovery = false - s.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(s.cantoChain.GetContext(), params) - - // Send uatom from Cosmos to canto - s.SendAndReceiveMessage(s.pathCosmoscanto, s.IBCCosmosChain, coinAtom.Denom, coinAtom.Amount.Int64(), s.IBCCosmosChain.SenderAccount.GetAddress().String(), receiver, 1) - - params.EnableRecovery = true - s.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(s.cantoChain.GetContext(), params) - }) - It("should not recover tokens that originated from other chains", func() { - // Send uosmo from Osmosis to canto - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, "uosmo", 10, sender, receiver, 1) - - // Relay both packets that were sent in the ibc_callback - timeout := uint64(s.cantoChain.GetContext().BlockTime().Add(time.Hour * 4).Add(time.Second * -20).UnixNano()) - err := s.pathOsmosiscanto.RelayPacket(CreatePacket("10000", "acanto", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 1, timeout)) - s.Require().NoError(err) - err = s.pathOsmosiscanto.RelayPacket(CreatePacket("10", "transfer/channel-0/uosmo", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 2, timeout)) - s.Require().NoError(err) - - // Acanto was recovered from user address - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto.IsZero()).To(BeTrue()) - ibccanto := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, acantoIbcdenom) - Expect(ibccanto).To(Equal(sdk.NewCoin(acantoIbcdenom, coincanto.Amount))) - - // Check that the uosmo were retrieved - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo.IsZero()).To(BeTrue()) - nativeOsmo := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - Expect(nativeOsmo).To(Equal(coinOsmo)) - - // Check that the atoms were not retrieved - ibcAtom := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, uatomIbcdenom) - Expect(ibcAtom).To(Equal(sdk.NewCoin(uatomIbcdenom, coinAtom.Amount))) - - // Repeat transaction from Osmosis to canto - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, "uosmo", 10, sender, receiver, 2) - - timeout = uint64(s.cantoChain.GetContext().BlockTime().Add(time.Hour * 4).Add(time.Second * -20).UnixNano()) - err = s.pathOsmosiscanto.RelayPacket(CreatePacket("10", "transfer/channel-0/uosmo", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 3, timeout)) - s.Require().NoError(err) - - // No further tokens recovered - nativecanto = s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto.IsZero()).To(BeTrue()) - ibccanto = s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, acantoIbcdenom) - Expect(ibccanto).To(Equal(sdk.NewCoin(acantoIbcdenom, coincanto.Amount))) - - ibcOsmo = s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo.IsZero()).To(BeTrue()) - nativeOsmo = s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - Expect(nativeOsmo).To(Equal(coinOsmo)) - - ibcAtom = s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, uatomIbcdenom) - Expect(ibcAtom).To(Equal(sdk.NewCoin(uatomIbcdenom, coinAtom.Amount))) - }) - }) - - // Recover ibc/uatom that was sent from Osmosis back to Osmosis - When("recipient has additional non-native ibc vouchers that originated from senders chains", func() { - BeforeEach(func() { - params := types.DefaultParams() - params.EnableRecovery = false - s.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(s.cantoChain.GetContext(), params) - - s.SendAndReceiveMessage(s.pathOsmosisCosmos, s.IBCCosmosChain, coinAtom.Denom, coinAtom.Amount.Int64(), s.IBCCosmosChain.SenderAccount.GetAddress().String(), receiver, 1) - - // Send IBC transaction of 10 ibc/uatom - transferMsg := transfertypes.NewMsgTransfer(s.pathOsmosiscanto.EndpointA.ChannelConfig.PortID, s.pathOsmosiscanto.EndpointA.ChannelID, sdk.NewCoin(uatomIbcdenom, sdk.NewInt(10)), sender, receiver, timeoutHeight, 0) - _, err := s.IBCOsmosisChain.SendMsgs(transferMsg) - s.Require().NoError(err) // message committed - transfer := transfertypes.NewFungibleTokenPacketData("transfer/channel-1/uatom", "10", sender, receiver) - packet := channeltypes.NewPacket(transfer.GetBytes(), 1, s.pathOsmosiscanto.EndpointA.ChannelConfig.PortID, s.pathOsmosiscanto.EndpointA.ChannelID, s.pathOsmosiscanto.EndpointB.ChannelConfig.PortID, s.pathOsmosiscanto.EndpointB.ChannelID, timeoutHeight, 0) - // Receive message on the canto side, and send ack - err = s.pathOsmosiscanto.RelayPacket(packet) - s.Require().NoError(err) - - // Check that the ibc/uatom are available - osmoIBCAtom := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uatomOsmoIbcdenom) - s.Require().Equal(osmoIBCAtom.Amount, coinAtom.Amount) - - params.EnableRecovery = true - s.cantoChain.App.(*app.Canto).RecoveryKeeper.SetParams(s.cantoChain.GetContext(), params) - }) - It("should not recover tokens that originated from other chains", func() { - s.SendAndReceiveMessage(s.pathOsmosiscanto, s.IBCOsmosisChain, "uosmo", 10, sender, receiver, 2) - - // Relay packets that were sent in the ibc_callback - timeout := uint64(s.cantoChain.GetContext().BlockTime().Add(time.Hour * 4).Add(time.Second * -20).UnixNano()) - err := s.pathOsmosiscanto.RelayPacket(CreatePacket("10000", "acanto", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 1, timeout)) - s.Require().NoError(err) - err = s.pathOsmosiscanto.RelayPacket(CreatePacket("10", "transfer/channel-0/transfer/channel-1/uatom", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 2, timeout)) - s.Require().NoError(err) - err = s.pathOsmosiscanto.RelayPacket(CreatePacket("10", "transfer/channel-0/uosmo", sender, receiver, "transfer", "channel-0", "transfer", "channel-0", 3, timeout)) - s.Require().NoError(err) - - // Acanto was recovered from user address - nativecanto := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), senderAcc, "acanto") - Expect(nativecanto.IsZero()).To(BeTrue()) - ibccanto := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, acantoIbcdenom) - Expect(ibccanto).To(Equal(sdk.NewCoin(acantoIbcdenom, coincanto.Amount))) - - // Check that the uosmo were recovered - ibcOsmo := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uosmoIbcdenom) - Expect(ibcOsmo.IsZero()).To(BeTrue()) - nativeOsmo := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), receiverAcc, "uosmo") - Expect(nativeOsmo).To(Equal(coinOsmo)) - - // Check that the ibc/uatom were retrieved - osmoIBCAtom := s.cantoChain.App.(*app.Canto).BankKeeper.GetBalance(s.cantoChain.GetContext(), receiverAcc, uatomOsmoIbcdenom) - Expect(osmoIBCAtom.IsZero()).To(BeTrue()) - ibcAtom := s.IBCOsmosisChain.GetSimApp().BankKeeper.GetBalance(s.IBCOsmosisChain.GetContext(), senderAcc, uatomIbcdenom) - Expect(ibcAtom).To(Equal(sdk.NewCoin(uatomIbcdenom, sdk.NewInt(10)))) - }) - }) - }) - }) - }) -}) diff --git a/x/recovery/keeper/ibc_callbacks_test.go b/x/recovery/keeper/ibc_callbacks_test.go deleted file mode 100644 index ad47f1ec..00000000 --- a/x/recovery/keeper/ibc_callbacks_test.go +++ /dev/null @@ -1,576 +0,0 @@ -package keeper_test - -import ( - "fmt" - - "github.com/Canto-Network/Canto/v6/testutil" - "github.com/cosmos/cosmos-sdk/crypto/keys/secp256k1" - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - "github.com/evmos/ethermint/crypto/ethsecp256k1" - "github.com/evmos/ethermint/tests" - "github.com/stretchr/testify/mock" - - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" - ibcgotesting "github.com/cosmos/ibc-go/v3/testing" - ibcmock "github.com/cosmos/ibc-go/v3/testing/mock" - - "github.com/Canto-Network/Canto/v6/x/recovery/keeper" - "github.com/Canto-Network/Canto/v6/x/recovery/types" - distrtypes "github.com/cosmos/cosmos-sdk/x/distribution/types" -) - -func (suite *KeeperTestSuite) TestOnRecvPacket() { - // secp256k1 account - secpPk := secp256k1.GenPrivKey() - secpAddr := sdk.AccAddress(secpPk.PubKey().Address()) - secpAddrcanto := secpAddr.String() - secpAddrCosmos := sdk.MustBech32ifyAddressBytes(sdk.Bech32MainPrefix, secpAddr) - - // ethsecp256k1 account - ethPk, err := ethsecp256k1.GenerateKey() - suite.Require().Nil(err) - ethsecpAddr := sdk.AccAddress(ethPk.PubKey().Address()) - ethsecpAddrcanto := sdk.AccAddress(ethPk.PubKey().Address()).String() - ethsecpAddrCosmos := sdk.MustBech32ifyAddressBytes(sdk.Bech32MainPrefix, ethsecpAddr) - - // Setup Cosmos <=> canto IBC relayer - denom := "uatom" - sourceChannel := "channel-292" - cantoChannel := "channel-3" - path := fmt.Sprintf("%s/%s", transfertypes.PortID, cantoChannel) - - timeoutHeight := clienttypes.NewHeight(0, 100) - disabledTimeoutTimestamp := uint64(0) - mockPacket := channeltypes.NewPacket(ibcgotesting.MockPacketData, 1, transfertypes.PortID, "channel-0", transfertypes.PortID, "channel-0", timeoutHeight, disabledTimeoutTimestamp) - packet := mockPacket - expAck := ibcmock.MockAcknowledgement - - coins := sdk.NewCoins( - sdk.NewCoin("acanto", sdk.NewInt(1000)), - sdk.NewCoin(ibcAtomDenom, sdk.NewInt(1000)), - sdk.NewCoin(ibcOsmoDenom, sdk.NewInt(1000)), - sdk.NewCoin(erc20Denom, sdk.NewInt(1000)), - ) - - testCases := []struct { - name string - malleate func() - ackSuccess bool - expRecovery bool - expCoins sdk.Coins - }{ - { - "continue - params disabled", - func() { - params := suite.app.RecoveryKeeper.GetParams(suite.ctx) - params.EnableRecovery = false - suite.app.RecoveryKeeper.SetParams(suite.ctx, params) - }, - true, - false, - coins, - }, - { - "continue - destination channel not authorized", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", ethsecpAddrcanto, ethsecpAddrCosmos) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 1, transfertypes.PortID, sourceChannel, transfertypes.PortID, "channel-100", timeoutHeight, 0) - }, - true, - false, - coins, - }, - { - "continue - destination channel is EVM", - func() { - // EVMChannels := suite.app.ClaimsKeeper.GetParams(suite.ctx).EVMChannels - //set EVM IBC channel to default one - EVMChannels := []string{"channel-2"} - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", ethsecpAddrcanto, ethsecpAddrCosmos) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 1, transfertypes.PortID, sourceChannel, transfertypes.PortID, EVMChannels[0], timeoutHeight, 0) - }, - true, - false, - coins, - }, - { - "fail - non ics20 packet", - func() { - packet = mockPacket - }, - false, - false, - coins, - }, - { - "fail - invalid sender - missing '1' ", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", "canto", ethsecpAddrCosmos) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - false, - false, - coins, - }, - { - "fail - invalid sender - invalid bech32", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", "badba1sv9m0g7ycejwr3s369km58h5qe7xj77hvcxrms", ethsecpAddrCosmos) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - false, - false, - coins, - }, - { - "fail - invalid recipient", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", ethsecpAddrcanto, "badbadhf0468jjpe6m6vx38s97z2qqe8ldu0njdyf625") - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - false, - false, - coins, - }, - { - "fail - case: receiver address is in deny list", - func() { - blockedAddr := authtypes.NewModuleAddress(transfertypes.ModuleName) - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, blockedAddr.String()) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - false, - false, - coins, - }, - { - "continue - sender != receiver", - func() { - pk1 := secp256k1.GenPrivKey() - otherSecpAddrcanto := sdk.AccAddress(pk1.PubKey().Address()).String() - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, otherSecpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - true, - false, - coins, - }, - { - "continue - receiver is a module account", - func() { - distrAcc := suite.app.AccountKeeper.GetModuleAccount(suite.ctx, distrtypes.ModuleName) - suite.Require().NotNil(distrAcc) - addr := distrAcc.GetAddress().String() - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", addr, addr) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - true, - false, - coins, - }, - { - "continue - receiver pubkey is a supported key", - func() { - // Set account to generate a pubkey - suite.app.AccountKeeper.SetAccount(suite.ctx, authtypes.NewBaseAccount(ethsecpAddr, ethPk.PubKey(), 0, 0)) - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", ethsecpAddrCosmos, ethsecpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - true, - false, - coins, - }, - { - "partial recovery - account has invalid ibc vouchers balance", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, secpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - - invalidDenom := "ibc/1" - coins := sdk.NewCoins(sdk.NewCoin(invalidDenom, sdk.NewInt(1000))) - testutil.FundAccount(suite.app.BankKeeper, suite.ctx, secpAddr, coins) - }, - false, - false, - sdk.NewCoins( - sdk.NewCoin("ibc/1", sdk.NewInt(1000)), - sdk.NewCoin(ibcAtomDenom, sdk.NewInt(1000)), - sdk.NewCoin(ibcOsmoDenom, sdk.NewInt(1000)), - ), - }, - { - "recovery - send uatom from cosmos to canto", - func() { - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, secpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - true, - true, - nil, - }, - { - "recovery - send ibc/uosmo from cosmos to canto", - func() { - denom = ibcOsmoDenom - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, secpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - }, - true, - true, - nil, - }, - { - "recovery - send uosmo from osmosis to canto", - func() { - // Setup Osmosis <=> canto IBC relayer - denom = "uosmo" - sourceChannel = "channel-204" - // cantoChannel = claimstypes.DefaultAuthorizedChannels[0] - cantoChannel = "channel-0" - - path = fmt.Sprintf("%s/%s", transfertypes.PortID, cantoChannel) - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, secpAddrcanto) - bz := transfertypes.ModuleCdc.MustMarshalJSON(&transfer) - packet = channeltypes.NewPacket(bz, 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - // TODO TEST - }, - true, - true, - nil, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - // Enable Recovery - params := suite.app.RecoveryKeeper.GetParams(suite.ctx) - params.EnableRecovery = true - suite.app.RecoveryKeeper.SetParams(suite.ctx, params) - - tc.malleate() - - // Set Denom Trace - denomTrace := transfertypes.DenomTrace{ - Path: path, - BaseDenom: denom, - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - // Set Cosmos Channel - channel := channeltypes.Channel{ - State: channeltypes.INIT, - Ordering: channeltypes.UNORDERED, - Counterparty: channeltypes.NewCounterparty(transfertypes.PortID, sourceChannel), - ConnectionHops: []string{sourceChannel}, - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, transfertypes.PortID, cantoChannel, channel) - - // Set Next Sequence Send - suite.app.IBCKeeper.ChannelKeeper.SetNextSequenceSend(suite.ctx, transfertypes.PortID, cantoChannel, 1) - - // Mock the Transferkeeper to always return nil on SendTransfer(), as this - // method requires a successfull handshake with the counterparty chain. - // This, however, exceeds the requirements of the unit tests. - mockTransferKeeper := &MockTransferKeeper{ - Keeper: suite.app.BankKeeper, - } - - mockTransferKeeper.On("GetDenomTrace", mock.Anything, mock.Anything).Return(denomTrace, true) - mockTransferKeeper.On("SendTransfer", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - - sp, found := suite.app.ParamsKeeper.GetSubspace(types.ModuleName) - suite.Require().True(found) - suite.app.RecoveryKeeper = keeper.NewKeeper(sp, suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.IBCKeeper.ChannelKeeper, mockTransferKeeper) - - // Fund receiver account with canto, ERC20 coins and IBC vouchers - testutil.FundAccount(suite.app.BankKeeper, suite.ctx, secpAddr, coins) - - // Perform IBC callback - ack := suite.app.RecoveryKeeper.OnRecvPacket(suite.ctx, packet, expAck) - - // Check acknowledgement - if tc.ackSuccess { - suite.Require().True(ack.Success(), string(ack.Acknowledgement())) - suite.Require().Equal(expAck, ack) - } else { - suite.Require().False(ack.Success(), string(ack.Acknowledgement())) - } - - // Check recovery - balances := suite.app.BankKeeper.GetAllBalances(suite.ctx, secpAddr) - if tc.expRecovery { - suite.Require().True(balances.IsZero()) - } else { - suite.Require().Equal(tc.expCoins, balances) - } - }) - } -} - -func (suite *KeeperTestSuite) TestGetIBCDenomDestinationIdentifiers() { - address := sdk.AccAddress(tests.GenerateAddress().Bytes()).String() - - testCases := []struct { - name string - denom string - malleate func() - expError bool - expDestinationPort, expDestinationChannel string - }{ - { - "invalid native denom", - "acanto", - func() {}, - true, - "", "", - }, - { - "invalid IBC denom hash", - "ibc/acanto", - func() {}, - true, - "", "", - }, - { - "denom trace not found", - ibcAtomDenom, - func() {}, - true, - "", "", - }, - { - "channel not found", - ibcAtomDenom, - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "transfer/channel-3", - BaseDenom: "uatom", - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - }, - true, - "", "", - }, - { - "invalid destination port - insufficient length", - "ibc/B9A49AA0AB0EB977D4EC627D7D9F747AF11BB1D74F430DE759CA37B22ECACF30", // denomTrace.Hash() - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "t/channel-3", - BaseDenom: "uatom", - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - channel := channeltypes.Channel{ - Counterparty: channeltypes.NewCounterparty("t", "channel-292"), - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, "t", "channel-3", channel) - }, - true, - "", "", - }, - { - "invalid channel identifier - insufficient length", - "ibc/5E3E083402F07599C795A7B75058EC3F13A8E666A8FEA2E51B6F3D93C755DFBC", // denomTrace.Hash() - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "transfer/c-3", - BaseDenom: "uatom", - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - channel := channeltypes.Channel{ - Counterparty: channeltypes.NewCounterparty("transfer", "channel-292"), - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, "transfer", "c-3", channel) - }, - true, - "", "", - }, - { - "success - ATOM", - ibcAtomDenom, - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "transfer/channel-3", - BaseDenom: "uatom", - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - channel := channeltypes.Channel{ - Counterparty: channeltypes.NewCounterparty("transfer", "channel-292"), - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, "transfer", "channel-3", channel) - }, - false, - "transfer", "channel-3", - }, - { - "success - OSMO", - ibcOsmoDenom, - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "transfer/channel-0", - BaseDenom: "uosmo", - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - channel := channeltypes.Channel{ - Counterparty: channeltypes.NewCounterparty("transfer", "channel-204"), - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, "transfer", "channel-0", channel) - }, - false, - "transfer", "channel-0", - }, - { - "success - ibcATOM (via Osmosis)", - "ibc/6CDD4663F2F09CD62285E2D45891FC149A3568E316CE3EBBE201A71A78A69388", - func() { - denomTrace := transfertypes.DenomTrace{ - Path: "transfer/channel-0/transfer/channel-0", - BaseDenom: "uatom", - } - - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - - channel := channeltypes.Channel{ - Counterparty: channeltypes.NewCounterparty("transfer", "channel-204"), - } - suite.app.IBCKeeper.ChannelKeeper.SetChannel(suite.ctx, "transfer", "channel-0", channel) - }, - false, - "transfer", "channel-0", - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - tc.malleate() - - destinationPort, destinationChannel, err := suite.app.RecoveryKeeper.GetIBCDenomDestinationIdentifiers(suite.ctx, tc.denom, address) - if tc.expError { - suite.Require().Error(err) - } else { - suite.Require().NoError(err) - suite.Require().Equal(tc.expDestinationPort, destinationPort) - suite.Require().Equal(tc.expDestinationChannel, destinationChannel) - } - }) - } -} - -func (suite *KeeperTestSuite) TestOnRecvPacketFailTransfer() { - // secp256k1 account - secpPk := secp256k1.GenPrivKey() - secpAddr := sdk.AccAddress(secpPk.PubKey().Address()) - secpAddrcanto := secpAddr.String() - secpAddrCosmos := sdk.MustBech32ifyAddressBytes(sdk.Bech32MainPrefix, secpAddr) - - // Setup Cosmos <=> canto IBC relayer - denom := "uatom" - sourceChannel := "channel-292" - // cantoChannel := claimstypes.DefaultAuthorizedChannels[1] - - cantoChannel := "channel-3" - path := fmt.Sprintf("%s/%s", transfertypes.PortID, cantoChannel) - - var mockTransferKeeper *MockTransferKeeper - expAck := ibcmock.MockAcknowledgement - testCases := []struct { - name string - malleate func() - }{ - { - "Fail to retrieve ibc denom trace", - func() { - mockTransferKeeper.On("GetDenomTrace", mock.Anything, mock.Anything).Return(transfertypes.DenomTrace{}, false) - mockTransferKeeper.On("SendTransfer", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - }, - }, - { - "invalid ibc denom trace", - func() { - // Set Denom Trace - denomTrace := transfertypes.DenomTrace{ - Path: "badpath", - BaseDenom: denom, - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - mockTransferKeeper.On("GetDenomTrace", mock.Anything, mock.Anything).Return(denomTrace, true) - mockTransferKeeper.On("SendTransfer", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(nil) - }, - }, - - { - "Fail to send transfer", - func() { - // Set Denom Trace - denomTrace := transfertypes.DenomTrace{ - Path: path, - BaseDenom: denom, - } - suite.app.TransferKeeper.SetDenomTrace(suite.ctx, denomTrace) - mockTransferKeeper.On("GetDenomTrace", mock.Anything, mock.Anything).Return(denomTrace, true) - mockTransferKeeper.On("SendTransfer", mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything, mock.Anything).Return(fmt.Errorf("Fail to transfer")) - }, - }, - } - for _, tc := range testCases { - suite.Run(fmt.Sprintf("Case %s", tc.name), func() { - suite.SetupTest() // reset - - // Enable Recovery - params := suite.app.RecoveryKeeper.GetParams(suite.ctx) - params.EnableRecovery = true - suite.app.RecoveryKeeper.SetParams(suite.ctx, params) - - transfer := transfertypes.NewFungibleTokenPacketData(denom, "100", secpAddrCosmos, secpAddrcanto) - packet := channeltypes.NewPacket(transfer.GetBytes(), 100, transfertypes.PortID, sourceChannel, transfertypes.PortID, cantoChannel, timeoutHeight, 0) - - mockTransferKeeper = &MockTransferKeeper{ - Keeper: suite.app.BankKeeper, - } - - tc.malleate() - - sp, found := suite.app.ParamsKeeper.GetSubspace(types.ModuleName) - suite.Require().True(found) - suite.app.RecoveryKeeper = keeper.NewKeeper(sp, suite.app.AccountKeeper, suite.app.BankKeeper, suite.app.IBCKeeper.ChannelKeeper, mockTransferKeeper) - - // Fund receiver account with canto - coins := sdk.NewCoins( - sdk.NewCoin("acanto", sdk.NewInt(1000)), - sdk.NewCoin(ibcAtomDenom, sdk.NewInt(1000)), - ) - testutil.FundAccount(suite.app.BankKeeper, suite.ctx, secpAddr, coins) - - // Perform IBC callback - ack := suite.app.RecoveryKeeper.OnRecvPacket(suite.ctx, packet, expAck) - // Recovery should Fail - suite.Require().False(ack.Success()) - }) - } -} diff --git a/x/recovery/keeper/keeper.go b/x/recovery/keeper/keeper.go deleted file mode 100644 index 628432cd..00000000 --- a/x/recovery/keeper/keeper.go +++ /dev/null @@ -1,84 +0,0 @@ -package keeper - -import ( - "fmt" - - "github.com/tendermint/tendermint/libs/log" - - sdk "github.com/cosmos/cosmos-sdk/types" - capabilitytypes "github.com/cosmos/cosmos-sdk/x/capability/types" - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" - - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - porttypes "github.com/cosmos/ibc-go/v3/modules/core/05-port/types" - "github.com/cosmos/ibc-go/v3/modules/core/exported" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -var _ transfertypes.ICS4Wrapper = Keeper{} - -// Keeper struct -type Keeper struct { - paramstore paramtypes.Subspace - accountKeeper types.AccountKeeper - bankKeeper types.BankKeeper - ics4Wrapper porttypes.ICS4Wrapper - channelKeeper types.ChannelKeeper - transferKeeper types.TransferKeeper -} - -// NewKeeper returns keeper -func NewKeeper( - ps paramtypes.Subspace, - ak types.AccountKeeper, - bk types.BankKeeper, - ck types.ChannelKeeper, - tk types.TransferKeeper, -) *Keeper { - // set KeyTable if it has not already been set - if !ps.HasKeyTable() { - ps = ps.WithKeyTable(types.ParamKeyTable()) - } - - return &Keeper{ - paramstore: ps, - accountKeeper: ak, - bankKeeper: bk, - channelKeeper: ck, - transferKeeper: tk, - } -} - -func (k *Keeper) SetTransferKeeper(tk types.TransferKeeper) { - k.transferKeeper = tk -} - -// SetICS4Wrapper sets the ICS4 wrapper to the keeper. -// It panics if already set -func (k *Keeper) SetICS4Wrapper(ics4Wrapper porttypes.ICS4Wrapper) { - if k.ics4Wrapper != nil { - panic("ICS4 wrapper already set") - } - - k.ics4Wrapper = ics4Wrapper -} - -// Logger returns logger -func (k Keeper) Logger(ctx sdk.Context) log.Logger { - return ctx.Logger().With("module", fmt.Sprintf("x/%s", types.ModuleName)) -} - -// IBC callbacks and transfer handlers - -// SendPacket implements the ICS4Wrapper interface from the transfer module. -// It calls the underlying SendPacket function directly to move down the middleware stack. -func (k Keeper) SendPacket(ctx sdk.Context, channelCap *capabilitytypes.Capability, packet exported.PacketI) error { - return k.ics4Wrapper.SendPacket(ctx, channelCap, packet) -} - -// WriteAcknowledgement implements the ICS4Wrapper interface from the transfer module. -// It calls the underlying WriteAcknowledgement function directly to move down the middleware stack. -func (k Keeper) WriteAcknowledgement(ctx sdk.Context, channelCap *capabilitytypes.Capability, packet exported.PacketI, ack exported.Acknowledgement) error { - return k.ics4Wrapper.WriteAcknowledgement(ctx, channelCap, packet, ack) -} diff --git a/x/recovery/keeper/keeper_test.go b/x/recovery/keeper/keeper_test.go deleted file mode 100644 index 412bf839..00000000 --- a/x/recovery/keeper/keeper_test.go +++ /dev/null @@ -1,84 +0,0 @@ -package keeper_test - -import ( - "testing" - "time" - - "github.com/stretchr/testify/suite" - - "github.com/tendermint/tendermint/crypto/tmhash" - tmproto "github.com/tendermint/tendermint/proto/tendermint/types" - tmversion "github.com/tendermint/tendermint/proto/tendermint/version" - "github.com/tendermint/tendermint/version" - - "github.com/evmos/ethermint/tests" - feemarkettypes "github.com/evmos/ethermint/x/feemarket/types" - - "github.com/cosmos/cosmos-sdk/baseapp" - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/Canto-Network/Canto/v6/app" - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -var ( - ibcAtomDenom = "ibc/A4DB47A9D3CF9A068D454513891B526702455D3EF08FB9EB558C561F9DC2B701" - ibcOsmoDenom = "ibc/ED07A3391A112B175915CD8FAF43A2DA8E4790EDE12566649D0C2F97716B8518" - erc20Denom = "erc20/0xdac17f958d2ee523a2206206994597c13d831ec7" -) - -type KeeperTestSuite struct { - suite.Suite - - ctx sdk.Context - - app *app.Canto - queryClient types.QueryClient -} - -func (suite *KeeperTestSuite) SetupTest() { - // consensus key - consAddress := sdk.ConsAddress(tests.GenerateAddress().Bytes()) - - suite.app = app.Setup(false, feemarkettypes.DefaultGenesisState()) - suite.ctx = suite.app.BaseApp.NewContext(false, tmproto.Header{ - Height: 1, - ChainID: "canto_9000-1", - Time: time.Now().UTC(), - ProposerAddress: consAddress.Bytes(), - - Version: tmversion.Consensus{ - Block: version.BlockProtocol, - }, - LastBlockId: tmproto.BlockID{ - Hash: tmhash.Sum([]byte("block_id")), - PartSetHeader: tmproto.PartSetHeader{ - Total: 11, - Hash: tmhash.Sum([]byte("partset_header")), - }, - }, - AppHash: tmhash.Sum([]byte("app")), - DataHash: tmhash.Sum([]byte("data")), - EvidenceHash: tmhash.Sum([]byte("evidence")), - ValidatorsHash: tmhash.Sum([]byte("validators")), - NextValidatorsHash: tmhash.Sum([]byte("next_validators")), - ConsensusHash: tmhash.Sum([]byte("consensus")), - LastResultsHash: tmhash.Sum([]byte("last_result")), - }) - - queryHelper := baseapp.NewQueryServerTestHelper(suite.ctx, suite.app.InterfaceRegistry()) - types.RegisterQueryServer(queryHelper, suite.app.RecoveryKeeper) - suite.queryClient = types.NewQueryClient(queryHelper) - - // claimsParams := claimstypes.DefaultParams() - // claimsParams.AirdropStartTime = suite.ctx.BlockTime() - // suite.app.ClaimsKeeper.SetParams(suite.ctx, claimsParams) - - stakingParams := suite.app.StakingKeeper.GetParams(suite.ctx) - stakingParams.BondDenom = "acanto" - suite.app.StakingKeeper.SetParams(suite.ctx, stakingParams) -} - -func TestKeeperTestSuite(t *testing.T) { - suite.Run(t, new(KeeperTestSuite)) -} diff --git a/x/recovery/keeper/params.go b/x/recovery/keeper/params.go deleted file mode 100644 index 9d048f65..00000000 --- a/x/recovery/keeper/params.go +++ /dev/null @@ -1,18 +0,0 @@ -package keeper - -import ( - sdk "github.com/cosmos/cosmos-sdk/types" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -// GetParams returns the total set of recovery parameters. -func (k Keeper) GetParams(ctx sdk.Context) (params types.Params) { - k.paramstore.GetParamSet(ctx, ¶ms) - return params -} - -// SetParams sets the recovery parameters to the param space. -func (k Keeper) SetParams(ctx sdk.Context, params types.Params) { - k.paramstore.SetParamSet(ctx, ¶ms) -} diff --git a/x/recovery/keeper/params_test.go b/x/recovery/keeper/params_test.go deleted file mode 100644 index 9cd9e270..00000000 --- a/x/recovery/keeper/params_test.go +++ /dev/null @@ -1,9 +0,0 @@ -package keeper_test - -func (suite *KeeperTestSuite) TestParams() { - params := suite.app.RecoveryKeeper.GetParams(suite.ctx) - params.EnableRecovery = false - suite.app.RecoveryKeeper.SetParams(suite.ctx, params) - newParams := suite.app.RecoveryKeeper.GetParams(suite.ctx) - suite.Require().Equal(newParams, params) -} diff --git a/x/recovery/keeper/utils_test.go b/x/recovery/keeper/utils_test.go deleted file mode 100644 index caef5f1f..00000000 --- a/x/recovery/keeper/utils_test.go +++ /dev/null @@ -1,51 +0,0 @@ -package keeper_test - -import ( - "github.com/stretchr/testify/mock" - - tmbytes "github.com/tendermint/tendermint/libs/bytes" - - sdk "github.com/cosmos/cosmos-sdk/types" - bankkeeper "github.com/cosmos/cosmos-sdk/x/bank/keeper" - - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -var _ types.TransferKeeper = &MockTransferKeeper{} - -// MockTransferKeeper defines a mocked object that implements the TransferKeeper -// interface. It's used on tests to abstract the complexity of IBC transfers. -// NOTE: Bank keeper logic is not mocked since we want to test that balance has -// been updated for sender and recipient. -type MockTransferKeeper struct { - mock.Mock - bankkeeper.Keeper -} - -func (m *MockTransferKeeper) GetDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) (transfertypes.DenomTrace, bool) { - args := m.Called(mock.Anything, denomTraceHash) - return args.Get(0).(transfertypes.DenomTrace), args.Bool(1) -} - -func (m *MockTransferKeeper) SendTransfer( - ctx sdk.Context, - sourcePort, - sourceChannel string, - token sdk.Coin, - sender sdk.AccAddress, - receiver string, - timeoutHeight clienttypes.Height, - timeoutTimestamp uint64, -) error { - args := m.Called(mock.Anything, sourcePort, sourceChannel, token, mock.Anything, mock.Anything, mock.Anything, mock.Anything) - - err := m.SendCoinsFromAccountToModule(ctx, sender, transfertypes.ModuleName, sdk.Coins{token}) - if err != nil { - return err - } - - return args.Error(0) -} diff --git a/x/recovery/module.go b/x/recovery/module.go deleted file mode 100644 index 845e633c..00000000 --- a/x/recovery/module.go +++ /dev/null @@ -1,165 +0,0 @@ -package recovery - -import ( - "context" - "encoding/json" - "fmt" - "math/rand" - - "github.com/gorilla/mux" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/spf13/cobra" - - abci "github.com/tendermint/tendermint/abci/types" - - "github.com/cosmos/cosmos-sdk/client" - "github.com/cosmos/cosmos-sdk/codec" - codectypes "github.com/cosmos/cosmos-sdk/codec/types" - sdk "github.com/cosmos/cosmos-sdk/types" - "github.com/cosmos/cosmos-sdk/types/module" - simtypes "github.com/cosmos/cosmos-sdk/types/simulation" - - "github.com/Canto-Network/Canto/v6/x/recovery/client/cli" - "github.com/Canto-Network/Canto/v6/x/recovery/keeper" - "github.com/Canto-Network/Canto/v6/x/recovery/types" -) - -// type check to ensure the interface is properly implemented -var ( - _ module.AppModule = AppModule{} - _ module.AppModuleBasic = AppModuleBasic{} - _ module.AppModuleSimulation = AppModule{} -) - -// app module Basics object -type AppModuleBasic struct{} - -func (AppModuleBasic) Name() string { - return types.ModuleName -} - -// RegisterLegacyAminoCodec performs a no-op as the recovery doesn't support Amino encoding -func (AppModuleBasic) RegisterLegacyAminoCodec(cdc *codec.LegacyAmino) {} - -// ConsensusVersion returns the consensus state-breaking version for the module. -func (AppModuleBasic) ConsensusVersion() uint64 { - return 1 -} - -// RegisterInterfaces registers interfaces and implementations of the recovery -// module. -func (AppModuleBasic) RegisterInterfaces(interfaceRegistry codectypes.InterfaceRegistry) { -} - -// DefaultGenesis returns default genesis state as raw bytes for the recovery -// module. -func (AppModuleBasic) DefaultGenesis(cdc codec.JSONCodec) json.RawMessage { - return cdc.MustMarshalJSON(types.DefaultGenesisState()) -} - -func (AppModuleBasic) ValidateGenesis(cdc codec.JSONCodec, config client.TxEncodingConfig, bz json.RawMessage) error { - var genesisState types.GenesisState - if err := cdc.UnmarshalJSON(bz, &genesisState); err != nil { - return fmt.Errorf("failed to unmarshal %s genesis state: %w", types.ModuleName, err) - } - - return genesisState.Validate() -} - -// RegisterRESTRoutes performs a no-op as the recovery module doesn't expose REST -// endpoints -func (AppModuleBasic) RegisterRESTRoutes(clientCtx client.Context, rtr *mux.Router) {} - -func (AppModuleBasic) RegisterGRPCGatewayRoutes(c client.Context, serveMux *runtime.ServeMux) { - if err := types.RegisterQueryHandlerClient(context.Background(), serveMux, types.NewQueryClient(c)); err != nil { - panic(err) - } -} - -// GetTxCmd returns the root tx command for the recovery module. -func (AppModuleBasic) GetTxCmd() *cobra.Command { return nil } - -// GetQueryCmd returns no root query command for the recovery module. -func (AppModuleBasic) GetQueryCmd() *cobra.Command { - return cli.GetQueryCmd() -} - -type AppModule struct { - AppModuleBasic - keeper keeper.Keeper -} - -// NewAppModule creates a new AppModule Object -func NewAppModule( - k keeper.Keeper, -) AppModule { - return AppModule{ - AppModuleBasic: AppModuleBasic{}, - keeper: k, - } -} - -func (AppModule) Name() string { - return types.ModuleName -} - -func (AppModule) RegisterInvariants(ir sdk.InvariantRegistry) {} - -// NewHandler returns nil recovery module doesn't expose tx gRPC endpoints -func (AppModule) NewHandler() sdk.Handler { - return nil -} - -func (am AppModule) Route() sdk.Route { - return sdk.NewRoute(types.RouterKey, am.NewHandler()) -} - -func (AppModule) QuerierRoute() string { - return "" -} - -func (AppModule) LegacyQuerierHandler(amino *codec.LegacyAmino) sdk.Querier { - return nil -} - -func (am AppModule) RegisterServices(cfg module.Configurator) { - types.RegisterQueryServer(cfg.QueryServer(), am.keeper) -} - -func (AppModule) BeginBlock(_ sdk.Context, _ abci.RequestBeginBlock) { -} - -func (AppModule) EndBlock(_ sdk.Context, _ abci.RequestEndBlock) []abci.ValidatorUpdate { - return []abci.ValidatorUpdate{} -} - -func (am AppModule) InitGenesis(ctx sdk.Context, cdc codec.JSONCodec, data json.RawMessage) []abci.ValidatorUpdate { - var genesisState types.GenesisState - - cdc.MustUnmarshalJSON(data, &genesisState) - InitGenesis(ctx, am.keeper, genesisState) - return []abci.ValidatorUpdate{} -} - -func (am AppModule) ExportGenesis(ctx sdk.Context, cdc codec.JSONCodec) json.RawMessage { - gs := ExportGenesis(ctx, am.keeper) - return cdc.MustMarshalJSON(gs) -} - -func (AppModule) GenerateGenesisState(_ *module.SimulationState) { -} - -func (AppModule) ProposalContents(_ module.SimulationState) []simtypes.WeightedProposalContent { - return []simtypes.WeightedProposalContent{} -} - -func (AppModule) RandomizedParams(_ *rand.Rand) []simtypes.ParamChange { - return []simtypes.ParamChange{} -} - -func (AppModule) RegisterStoreDecoder(_ sdk.StoreDecoderRegistry) { -} - -func (AppModule) WeightedOperations(_ module.SimulationState) []simtypes.WeightedOperation { - return []simtypes.WeightedOperation{} -} diff --git a/x/recovery/types/errors.go b/x/recovery/types/errors.go deleted file mode 100644 index 1cffdd59..00000000 --- a/x/recovery/types/errors.go +++ /dev/null @@ -1,10 +0,0 @@ -package types - -import ( - sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" -) - -// errors -var ( - ErrBlockedAddress = sdkerrors.Register(ModuleName, 2, "blocked address") -) diff --git a/x/recovery/types/events.go b/x/recovery/types/events.go deleted file mode 100644 index 2ed6524e..00000000 --- a/x/recovery/types/events.go +++ /dev/null @@ -1,6 +0,0 @@ -package types - -// recovery events -const ( - EventTypeRecovery = "recovery" -) diff --git a/x/recovery/types/genesis.go b/x/recovery/types/genesis.go deleted file mode 100644 index 892a0d21..00000000 --- a/x/recovery/types/genesis.go +++ /dev/null @@ -1,21 +0,0 @@ -package types - -// NewGenesisState creates a new genesis state. -func NewGenesisState(params Params) GenesisState { - return GenesisState{ - Params: params, - } -} - -// DefaultGenesisState sets default recovery genesis state with default params -func DefaultGenesisState() *GenesisState { - return &GenesisState{ - Params: DefaultParams(), - } -} - -// Validate performs basic genesis state validation returning an error upon any -// failure. -func (gs GenesisState) Validate() error { - return gs.Params.Validate() -} diff --git a/x/recovery/types/genesis.pb.go b/x/recovery/types/genesis.pb.go deleted file mode 100644 index ab9caa2b..00000000 --- a/x/recovery/types/genesis.pb.go +++ /dev/null @@ -1,546 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: canto/recovery/v1/genesis.proto - -package types - -import ( - fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - proto "github.com/gogo/protobuf/proto" - github_com_gogo_protobuf_types "github.com/gogo/protobuf/types" - _ "google.golang.org/protobuf/types/known/durationpb" - io "io" - math "math" - math_bits "math/bits" - time "time" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf -var _ = time.Kitchen - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// GenesisState defines the recovery module's genesis state. -type GenesisState struct { - // params defines all the paramaters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *GenesisState) Reset() { *m = GenesisState{} } -func (m *GenesisState) String() string { return proto.CompactTextString(m) } -func (*GenesisState) ProtoMessage() {} -func (*GenesisState) Descriptor() ([]byte, []int) { - return fileDescriptor_5b0a30f85f43314c, []int{0} -} -func (m *GenesisState) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *GenesisState) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_GenesisState.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *GenesisState) XXX_Merge(src proto.Message) { - xxx_messageInfo_GenesisState.Merge(m, src) -} -func (m *GenesisState) XXX_Size() int { - return m.Size() -} -func (m *GenesisState) XXX_DiscardUnknown() { - xxx_messageInfo_GenesisState.DiscardUnknown(m) -} - -var xxx_messageInfo_GenesisState proto.InternalMessageInfo - -func (m *GenesisState) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -// Params holds parameters for the recovery module -type Params struct { - // enable recovery IBC middleware - EnableRecovery bool `protobuf:"varint,1,opt,name=enable_recovery,json=enableRecovery,proto3" json:"enable_recovery,omitempty"` - // duration added to timeout timestamp for balances recovered via IBC packets - PacketTimeoutDuration time.Duration `protobuf:"bytes,2,opt,name=packet_timeout_duration,json=packetTimeoutDuration,proto3,stdduration" json:"packet_timeout_duration"` -} - -func (m *Params) Reset() { *m = Params{} } -func (m *Params) String() string { return proto.CompactTextString(m) } -func (*Params) ProtoMessage() {} -func (*Params) Descriptor() ([]byte, []int) { - return fileDescriptor_5b0a30f85f43314c, []int{1} -} -func (m *Params) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *Params) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_Params.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *Params) XXX_Merge(src proto.Message) { - xxx_messageInfo_Params.Merge(m, src) -} -func (m *Params) XXX_Size() int { - return m.Size() -} -func (m *Params) XXX_DiscardUnknown() { - xxx_messageInfo_Params.DiscardUnknown(m) -} - -var xxx_messageInfo_Params proto.InternalMessageInfo - -func (m *Params) GetEnableRecovery() bool { - if m != nil { - return m.EnableRecovery - } - return false -} - -func (m *Params) GetPacketTimeoutDuration() time.Duration { - if m != nil { - return m.PacketTimeoutDuration - } - return 0 -} - -func init() { - proto.RegisterType((*GenesisState)(nil), "canto.recovery.v1.GenesisState") - proto.RegisterType((*Params)(nil), "canto.recovery.v1.Params") -} - -func init() { proto.RegisterFile("canto/recovery/v1/genesis.proto", fileDescriptor_5b0a30f85f43314c) } - -var fileDescriptor_5b0a30f85f43314c = []byte{ - // 301 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x64, 0x90, 0x31, 0x4f, 0xc3, 0x30, - 0x10, 0x85, 0x63, 0x84, 0xaa, 0xca, 0x20, 0x10, 0x11, 0x88, 0xd2, 0xc1, 0x45, 0x5d, 0x60, 0xc1, - 0x56, 0xcb, 0xc0, 0x5e, 0x90, 0xba, 0x20, 0x84, 0x02, 0x13, 0x0c, 0x95, 0x13, 0x0e, 0x13, 0xb5, - 0xcd, 0x45, 0x8e, 0x13, 0xe8, 0x9f, 0x40, 0x8c, 0xfc, 0xa4, 0x8e, 0x1d, 0x99, 0x00, 0xb5, 0x7f, - 0x04, 0xc5, 0x4e, 0x60, 0x60, 0xf3, 0xdd, 0xfb, 0xfc, 0xde, 0xb3, 0x69, 0x27, 0x92, 0x89, 0x41, - 0xa1, 0x21, 0xc2, 0x02, 0xf4, 0x4c, 0x14, 0x3d, 0xa1, 0x20, 0x81, 0x2c, 0xce, 0x78, 0xaa, 0xd1, - 0xa0, 0xbf, 0x63, 0x01, 0x5e, 0x03, 0xbc, 0xe8, 0xb5, 0x77, 0x15, 0x2a, 0xb4, 0xaa, 0x28, 0x4f, - 0x0e, 0x6c, 0x33, 0x85, 0xa8, 0x26, 0x20, 0xec, 0x14, 0xe6, 0x8f, 0xe2, 0x21, 0xd7, 0xd2, 0xc4, - 0x98, 0x38, 0xbd, 0x3b, 0xa4, 0x9b, 0x43, 0xe7, 0x7c, 0x63, 0xa4, 0x01, 0xff, 0x8c, 0x36, 0x52, - 0xa9, 0xe5, 0x34, 0x6b, 0x91, 0x43, 0x72, 0xbc, 0xd1, 0x3f, 0xe0, 0xff, 0x92, 0xf8, 0xb5, 0x05, - 0x06, 0xeb, 0xf3, 0xcf, 0x8e, 0x17, 0x54, 0x78, 0xf7, 0x95, 0xd0, 0x86, 0x13, 0xfc, 0x23, 0xba, - 0x0d, 0x89, 0x0c, 0x27, 0x30, 0xaa, 0x6f, 0x59, 0xb3, 0x66, 0xb0, 0xe5, 0xd6, 0x41, 0xb5, 0xf5, - 0xef, 0xe9, 0x7e, 0x2a, 0xa3, 0x31, 0x98, 0x91, 0x89, 0xa7, 0x80, 0xb9, 0x19, 0xd5, 0xed, 0x5a, - 0x6b, 0x55, 0xba, 0xab, 0xcf, 0xeb, 0xfa, 0xfc, 0xa2, 0x02, 0x06, 0xcd, 0x32, 0xfd, 0xfd, 0xab, - 0x43, 0x82, 0x3d, 0xe7, 0x71, 0xeb, 0x2c, 0x7e, 0x81, 0xcb, 0xf9, 0x92, 0x91, 0xc5, 0x92, 0x91, - 0xef, 0x25, 0x23, 0x6f, 0x2b, 0xe6, 0x2d, 0x56, 0xcc, 0xfb, 0x58, 0x31, 0xef, 0xae, 0xaf, 0x62, - 0xf3, 0x94, 0x87, 0x3c, 0xc2, 0xa9, 0x38, 0x2f, 0x5f, 0x77, 0x72, 0x05, 0xe6, 0x19, 0xf5, 0xd8, - 0x4d, 0xa2, 0xe8, 0x8b, 0x97, 0xbf, 0xbf, 0x37, 0xb3, 0x14, 0xb2, 0xb0, 0x61, 0x1b, 0x9c, 0xfe, - 0x04, 0x00, 0x00, 0xff, 0xff, 0xf8, 0x6e, 0xac, 0x01, 0x9a, 0x01, 0x00, 0x00, -} - -func (m *GenesisState) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *GenesisState) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *GenesisState) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintGenesis(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *Params) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *Params) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *Params) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - n2, err2 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PacketTimeoutDuration, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PacketTimeoutDuration):]) - if err2 != nil { - return 0, err2 - } - i -= n2 - i = encodeVarintGenesis(dAtA, i, uint64(n2)) - i-- - dAtA[i] = 0x12 - if m.EnableRecovery { - i-- - if m.EnableRecovery { - dAtA[i] = 1 - } else { - dAtA[i] = 0 - } - i-- - dAtA[i] = 0x8 - } - return len(dAtA) - i, nil -} - -func encodeVarintGenesis(dAtA []byte, offset int, v uint64) int { - offset -= sovGenesis(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *GenesisState) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func (m *Params) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.EnableRecovery { - n += 2 - } - l = github_com_gogo_protobuf_types.SizeOfStdDuration(m.PacketTimeoutDuration) - n += 1 + l + sovGenesis(uint64(l)) - return n -} - -func sovGenesis(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozGenesis(x uint64) (n int) { - return sovGenesis(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *GenesisState) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: GenesisState: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: GenesisState: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *Params) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: Params: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: Params: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field EnableRecovery", wireType) - } - var v int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - v |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - m.EnableRecovery = bool(v != 0) - case 2: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PacketTimeoutDuration", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowGenesis - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthGenesis - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthGenesis - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := github_com_gogo_protobuf_types.StdDurationUnmarshal(&m.PacketTimeoutDuration, dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipGenesis(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthGenesis - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipGenesis(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowGenesis - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthGenesis - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupGenesis - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthGenesis - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthGenesis = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowGenesis = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupGenesis = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/recovery/types/genesis_test.go b/x/recovery/types/genesis_test.go deleted file mode 100644 index f747eede..00000000 --- a/x/recovery/types/genesis_test.go +++ /dev/null @@ -1,41 +0,0 @@ -package types - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestGenesisValidate(t *testing.T) { - testCases := []struct { - name string - genesis GenesisState - expError bool - }{ - { - "empty genesis", - GenesisState{}, - false, - }, - { - "default genesis", - *DefaultGenesisState(), - false, - }, - { - "custom genesis", - NewGenesisState(NewParams(true, time.Hour)), - false, - }, - } - - for _, tc := range testCases { - err := tc.genesis.Validate() - if tc.expError { - require.Error(t, err, tc.name) - } else { - require.NoError(t, err, tc.name) - } - } -} diff --git a/x/recovery/types/interfaces.go b/x/recovery/types/interfaces.go deleted file mode 100644 index a2aa6f96..00000000 --- a/x/recovery/types/interfaces.go +++ /dev/null @@ -1,41 +0,0 @@ -package types - -import ( - tmbytes "github.com/tendermint/tendermint/libs/bytes" - - sdk "github.com/cosmos/cosmos-sdk/types" - authtypes "github.com/cosmos/cosmos-sdk/x/auth/types" - - transfertypes "github.com/cosmos/ibc-go/v3/modules/apps/transfer/types" - clienttypes "github.com/cosmos/ibc-go/v3/modules/core/02-client/types" - channeltypes "github.com/cosmos/ibc-go/v3/modules/core/04-channel/types" -) - -// BankKeeper defines the banking keeper that must be fulfilled when -// creating a x/recovery keeper. -type BankKeeper interface { - IterateAccountBalances(ctx sdk.Context, addr sdk.AccAddress, cb func(coin sdk.Coin) (stop bool)) - BlockedAddr(addr sdk.AccAddress) bool -} - -// AccountKeeper defines the expected account keeper -type AccountKeeper interface { - GetAccount(sdk.Context, sdk.AccAddress) authtypes.AccountI -} - -// TransferKeeper defines the expected IBC transfer keeper. -type TransferKeeper interface { - GetDenomTrace(ctx sdk.Context, denomTraceHash tmbytes.HexBytes) (transfertypes.DenomTrace, bool) - SendTransfer( - ctx sdk.Context, - sourcePort, sourceChannel string, - token sdk.Coin, - sender sdk.AccAddress, receiver string, - timeoutHeight clienttypes.Height, timeoutTimestamp uint64, - ) error -} - -// ChannelKeeper defines the expected IBC channel keeper. -type ChannelKeeper interface { - GetChannel(ctx sdk.Context, srcPort, srcChan string) (channel channeltypes.Channel, found bool) -} diff --git a/x/recovery/types/keys.go b/x/recovery/types/keys.go deleted file mode 100644 index d90912e9..00000000 --- a/x/recovery/types/keys.go +++ /dev/null @@ -1,13 +0,0 @@ -package types - -// constants -const ( - // ModuleName defines the recovery module name - ModuleName = "recovery" - - // StoreKey to be used when creating the KVStore - StoreKey = ModuleName - - // RouterKey to be used for message routing - RouterKey = ModuleName -) diff --git a/x/recovery/types/params.go b/x/recovery/types/params.go deleted file mode 100644 index 43ca7268..00000000 --- a/x/recovery/types/params.go +++ /dev/null @@ -1,82 +0,0 @@ -package types - -import ( - "fmt" - "time" - - paramtypes "github.com/cosmos/cosmos-sdk/x/params/types" -) - -// Parameter store key -var ( - ParamStoreKeyEnableRecovery = []byte("EnableRecovery") - ParamStoreKeyPacketTimeoutDuration = []byte("PacketTimeoutDuration") -) - -// DefaultPacketTimeoutDuration defines the default packet timeout for outgoing -// IBC transfers -var DefaultPacketTimeoutDuration = 4 * time.Hour - -var _ paramtypes.ParamSet = &Params{} - -// ParamKeyTable returns the parameter key table. -func ParamKeyTable() paramtypes.KeyTable { - return paramtypes.NewKeyTable().RegisterParamSet(&Params{}) -} - -// NewParams creates a new Params instance -func NewParams( - enableRecovery bool, timeoutDuration time.Duration, -) Params { - return Params{ - EnableRecovery: enableRecovery, - PacketTimeoutDuration: timeoutDuration, - } -} - -// DefaultParams defines the default params for the recovery module -func DefaultParams() Params { - return Params{ - EnableRecovery: true, - PacketTimeoutDuration: DefaultPacketTimeoutDuration, - } -} - -// ParamSetPairs returns the parameter set pairs. -func (p *Params) ParamSetPairs() paramtypes.ParamSetPairs { - return paramtypes.ParamSetPairs{ - paramtypes.NewParamSetPair(ParamStoreKeyEnableRecovery, &p.EnableRecovery, validateBool), - paramtypes.NewParamSetPair(ParamStoreKeyPacketTimeoutDuration, &p.PacketTimeoutDuration, validateDuration), - } -} - -func validateBool(i interface{}) error { - _, ok := i.(bool) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - return nil -} - -func validateDuration(i interface{}) error { - duration, ok := i.(time.Duration) - if !ok { - return fmt.Errorf("invalid parameter type: %T", i) - } - - if duration < 0 { - return fmt.Errorf("packet timout duration cannot be negative") - } - - return nil -} - -// Validate checks that the fields have valid values -func (p Params) Validate() error { - if err := validateDuration(p.PacketTimeoutDuration); err != nil { - return err - } - - return validateBool(p.EnableRecovery) -} diff --git a/x/recovery/types/params_test.go b/x/recovery/types/params_test.go deleted file mode 100644 index ef001504..00000000 --- a/x/recovery/types/params_test.go +++ /dev/null @@ -1,61 +0,0 @@ -package types - -import ( - "testing" - "time" - - "github.com/stretchr/testify/require" -) - -func TestParamsMisc(t *testing.T) { - params := DefaultParams() - require.NotEmpty(t, params.ParamSetPairs()) - kt := ParamKeyTable() - require.NotEmpty(t, kt) -} - -func TestParamsValidate(t *testing.T) { - testCases := []struct { - name string - params Params - expError bool - }{ - { - "empty params", - Params{}, - false, - }, - { - "default params", - DefaultParams(), - false, - }, - { - "custom params", - NewParams(true, time.Hour), - false, - }, - { - "invalid duration", - NewParams(true, -1), - true, - }, - } - - for _, tc := range testCases { - err := tc.params.Validate() - if tc.expError { - require.Error(t, err, tc.name) - } else { - require.NoError(t, err, tc.name) - } - } -} - -func TestValidate(t *testing.T) { - require.Error(t, validateBool("")) - require.NoError(t, validateBool(true)) - - require.Error(t, validateDuration(true)) - require.NoError(t, validateDuration(time.Hour)) -} diff --git a/x/recovery/types/query.pb.go b/x/recovery/types/query.pb.go deleted file mode 100644 index 15c23266..00000000 --- a/x/recovery/types/query.pb.go +++ /dev/null @@ -1,536 +0,0 @@ -// Code generated by protoc-gen-gogo. DO NOT EDIT. -// source: canto/recovery/v1/query.proto - -package types - -import ( - context "context" - fmt "fmt" - _ "github.com/gogo/protobuf/gogoproto" - grpc1 "github.com/gogo/protobuf/grpc" - proto "github.com/gogo/protobuf/proto" - _ "google.golang.org/genproto/googleapis/api/annotations" - grpc "google.golang.org/grpc" - codes "google.golang.org/grpc/codes" - status "google.golang.org/grpc/status" - io "io" - math "math" - math_bits "math/bits" -) - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package - -// QueryParamsRequest is the request type for the Query/Params RPC method. -type QueryParamsRequest struct { -} - -func (m *QueryParamsRequest) Reset() { *m = QueryParamsRequest{} } -func (m *QueryParamsRequest) String() string { return proto.CompactTextString(m) } -func (*QueryParamsRequest) ProtoMessage() {} -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_686c02d6a0b1edc8, []int{0} -} -func (m *QueryParamsRequest) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsRequest.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsRequest) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsRequest.Merge(m, src) -} -func (m *QueryParamsRequest) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsRequest) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsRequest.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsRequest proto.InternalMessageInfo - -// QueryParamsResponse is the response type for the Query/Params RPC method. -type QueryParamsResponse struct { - // params defines the parameters of the module. - Params Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params"` -} - -func (m *QueryParamsResponse) Reset() { *m = QueryParamsResponse{} } -func (m *QueryParamsResponse) String() string { return proto.CompactTextString(m) } -func (*QueryParamsResponse) ProtoMessage() {} -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_686c02d6a0b1edc8, []int{1} -} -func (m *QueryParamsResponse) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *QueryParamsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_QueryParamsResponse.Marshal(b, m, deterministic) - } else { - b = b[:cap(b)] - n, err := m.MarshalToSizedBuffer(b) - if err != nil { - return nil, err - } - return b[:n], nil - } -} -func (m *QueryParamsResponse) XXX_Merge(src proto.Message) { - xxx_messageInfo_QueryParamsResponse.Merge(m, src) -} -func (m *QueryParamsResponse) XXX_Size() int { - return m.Size() -} -func (m *QueryParamsResponse) XXX_DiscardUnknown() { - xxx_messageInfo_QueryParamsResponse.DiscardUnknown(m) -} - -var xxx_messageInfo_QueryParamsResponse proto.InternalMessageInfo - -func (m *QueryParamsResponse) GetParams() Params { - if m != nil { - return m.Params - } - return Params{} -} - -func init() { - proto.RegisterType((*QueryParamsRequest)(nil), "canto.recovery.v1.QueryParamsRequest") - proto.RegisterType((*QueryParamsResponse)(nil), "canto.recovery.v1.QueryParamsResponse") -} - -func init() { proto.RegisterFile("canto/recovery/v1/query.proto", fileDescriptor_686c02d6a0b1edc8) } - -var fileDescriptor_686c02d6a0b1edc8 = []byte{ - // 290 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4d, 0x4e, 0xcc, 0x2b, - 0xc9, 0xd7, 0x2f, 0x4a, 0x4d, 0xce, 0x2f, 0x4b, 0x2d, 0xaa, 0xd4, 0x2f, 0x33, 0xd4, 0x2f, 0x2c, - 0x4d, 0x2d, 0xaa, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x04, 0x4b, 0xeb, 0xc1, 0xa4, - 0xf5, 0xca, 0x0c, 0xa5, 0x64, 0xd2, 0xf3, 0xf3, 0xd3, 0x73, 0x52, 0xf5, 0x13, 0x0b, 0x32, 0xf5, - 0x13, 0xf3, 0xf2, 0xf2, 0x4b, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0x8a, 0x21, 0x1a, 0xa4, 0x44, 0xd2, - 0xf3, 0xd3, 0xf3, 0xc1, 0x4c, 0x7d, 0x10, 0x0b, 0x2a, 0x2a, 0x8f, 0x69, 0x4b, 0x7a, 0x6a, 0x5e, - 0x6a, 0x71, 0x26, 0x54, 0x9b, 0x92, 0x08, 0x97, 0x50, 0x20, 0xc8, 0xda, 0x80, 0xc4, 0xa2, 0xc4, - 0xdc, 0xe2, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2, 0x12, 0x25, 0x3f, 0x2e, 0x61, 0x14, 0xd1, 0xe2, - 0x82, 0xfc, 0xbc, 0xe2, 0x54, 0x21, 0x73, 0x2e, 0xb6, 0x02, 0xb0, 0x88, 0x04, 0xa3, 0x02, 0xa3, - 0x06, 0xb7, 0x91, 0xa4, 0x1e, 0x86, 0x2b, 0xf5, 0x20, 0x5a, 0x9c, 0x58, 0x4e, 0xdc, 0x93, 0x67, - 0x08, 0x82, 0x2a, 0x37, 0x6a, 0x66, 0xe4, 0x62, 0x05, 0x1b, 0x28, 0x54, 0xc5, 0xc5, 0x06, 0x51, - 0x21, 0xa4, 0x8a, 0x45, 0x33, 0xa6, 0x53, 0xa4, 0xd4, 0x08, 0x29, 0x83, 0xb8, 0x4d, 0x49, 0xb1, - 0xe9, 0xf2, 0x93, 0xc9, 0x4c, 0xd2, 0x42, 0x92, 0xfa, 0x98, 0x5e, 0x86, 0xb8, 0xc2, 0xc9, 0xe7, - 0xc4, 0x23, 0x39, 0xc6, 0x0b, 0x8f, 0xe4, 0x18, 0x1f, 0x3c, 0x92, 0x63, 0x9c, 0xf0, 0x58, 0x8e, - 0xe1, 0xc2, 0x63, 0x39, 0x86, 0x1b, 0x8f, 0xe5, 0x18, 0xa2, 0x8c, 0xd2, 0x33, 0x4b, 0x32, 0x4a, - 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x9d, 0x41, 0xda, 0x75, 0xfd, 0x52, 0x4b, 0xca, 0xf3, 0x8b, - 0xb2, 0x21, 0x3c, 0xfd, 0x32, 0x23, 0xfd, 0x0a, 0x84, 0x89, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x49, - 0x6c, 0xe0, 0x00, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x11, 0xd2, 0x73, 0x89, 0xc9, 0x01, - 0x00, 0x00, -} - -// Reference imports to suppress errors if they are not otherwise used. -var _ context.Context -var _ grpc.ClientConn - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the grpc package it is being compiled against. -const _ = grpc.SupportPackageIsVersion4 - -// QueryClient is the client API for Query service. -// -// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream. -type QueryClient interface { - // Params retrieves the total set of recovery parameters. - Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) -} - -type queryClient struct { - cc grpc1.ClientConn -} - -func NewQueryClient(cc grpc1.ClientConn) QueryClient { - return &queryClient{cc} -} - -func (c *queryClient) Params(ctx context.Context, in *QueryParamsRequest, opts ...grpc.CallOption) (*QueryParamsResponse, error) { - out := new(QueryParamsResponse) - err := c.cc.Invoke(ctx, "/canto.recovery.v1.Query/Params", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -// QueryServer is the server API for Query service. -type QueryServer interface { - // Params retrieves the total set of recovery parameters. - Params(context.Context, *QueryParamsRequest) (*QueryParamsResponse, error) -} - -// UnimplementedQueryServer can be embedded to have forward compatible implementations. -type UnimplementedQueryServer struct { -} - -func (*UnimplementedQueryServer) Params(ctx context.Context, req *QueryParamsRequest) (*QueryParamsResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method Params not implemented") -} - -func RegisterQueryServer(s grpc1.Server, srv QueryServer) { - s.RegisterService(&_Query_serviceDesc, srv) -} - -func _Query_Params_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(QueryParamsRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(QueryServer).Params(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/canto.recovery.v1.Query/Params", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(QueryServer).Params(ctx, req.(*QueryParamsRequest)) - } - return interceptor(ctx, in, info, handler) -} - -var _Query_serviceDesc = grpc.ServiceDesc{ - ServiceName: "canto.recovery.v1.Query", - HandlerType: (*QueryServer)(nil), - Methods: []grpc.MethodDesc{ - { - MethodName: "Params", - Handler: _Query_Params_Handler, - }, - }, - Streams: []grpc.StreamDesc{}, - Metadata: "canto/recovery/v1/query.proto", -} - -func (m *QueryParamsRequest) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsRequest) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - return len(dAtA) - i, nil -} - -func (m *QueryParamsResponse) Marshal() (dAtA []byte, err error) { - size := m.Size() - dAtA = make([]byte, size) - n, err := m.MarshalToSizedBuffer(dAtA[:size]) - if err != nil { - return nil, err - } - return dAtA[:n], nil -} - -func (m *QueryParamsResponse) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *QueryParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - _ = i - var l int - _ = l - { - size, err := m.Params.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintQuery(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { - offset -= sovQuery(v) - base := offset - for v >= 1<<7 { - dAtA[offset] = uint8(v&0x7f | 0x80) - v >>= 7 - offset++ - } - dAtA[offset] = uint8(v) - return base -} -func (m *QueryParamsRequest) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - return n -} - -func (m *QueryParamsResponse) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Params.Size() - n += 1 + l + sovQuery(uint64(l)) - return n -} - -func sovQuery(x uint64) (n int) { - return (math_bits.Len64(x|1) + 6) / 7 -} -func sozQuery(x uint64) (n int) { - return sovQuery(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} -func (m *QueryParamsRequest) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsRequest: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsRequest: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func (m *QueryParamsResponse) Unmarshal(dAtA []byte) error { - l := len(dAtA) - iNdEx := 0 - for iNdEx < l { - preIndex := iNdEx - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= uint64(b&0x7F) << shift - if b < 0x80 { - break - } - } - fieldNum := int32(wire >> 3) - wireType := int(wire & 0x7) - if wireType == 4 { - return fmt.Errorf("proto: QueryParamsResponse: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: QueryParamsResponse: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Params", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowQuery - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthQuery - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthQuery - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Params.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipQuery(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthQuery - } - if (iNdEx + skippy) > l { - return io.ErrUnexpectedEOF - } - iNdEx += skippy - } - } - - if iNdEx > l { - return io.ErrUnexpectedEOF - } - return nil -} -func skipQuery(dAtA []byte) (n int, err error) { - l := len(dAtA) - iNdEx := 0 - depth := 0 - for iNdEx < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - iNdEx++ - if dAtA[iNdEx-1] < 0x80 { - break - } - } - case 1: - iNdEx += 8 - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return 0, ErrIntOverflowQuery - } - if iNdEx >= l { - return 0, io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - if length < 0 { - return 0, ErrInvalidLengthQuery - } - iNdEx += length - case 3: - depth++ - case 4: - if depth == 0 { - return 0, ErrUnexpectedEndOfGroupQuery - } - depth-- - case 5: - iNdEx += 4 - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - if iNdEx < 0 { - return 0, ErrInvalidLengthQuery - } - if depth == 0 { - return iNdEx, nil - } - } - return 0, io.ErrUnexpectedEOF -} - -var ( - ErrInvalidLengthQuery = fmt.Errorf("proto: negative length found during unmarshaling") - ErrIntOverflowQuery = fmt.Errorf("proto: integer overflow") - ErrUnexpectedEndOfGroupQuery = fmt.Errorf("proto: unexpected end of group") -) diff --git a/x/recovery/types/query.pb.gw.go b/x/recovery/types/query.pb.gw.go deleted file mode 100644 index 87a86a52..00000000 --- a/x/recovery/types/query.pb.gw.go +++ /dev/null @@ -1,153 +0,0 @@ -// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT. -// source: canto/recovery/v1/query.proto - -/* -Package types is a reverse proxy. - -It translates gRPC into RESTful JSON APIs. -*/ -package types - -import ( - "context" - "io" - "net/http" - - "github.com/golang/protobuf/descriptor" - "github.com/golang/protobuf/proto" - "github.com/grpc-ecosystem/grpc-gateway/runtime" - "github.com/grpc-ecosystem/grpc-gateway/utilities" - "google.golang.org/grpc" - "google.golang.org/grpc/codes" - "google.golang.org/grpc/grpclog" - "google.golang.org/grpc/metadata" - "google.golang.org/grpc/status" -) - -// Suppress "imported and not used" errors -var _ codes.Code -var _ io.Reader -var _ status.Status -var _ = runtime.String -var _ = utilities.NewDoubleArray -var _ = descriptor.ForMessage -var _ = metadata.Join - -func request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := client.Params(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_Query_Params_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq QueryParamsRequest - var metadata runtime.ServerMetadata - - msg, err := server.Params(ctx, &protoReq) - return msg, metadata, err - -} - -// RegisterQueryHandlerServer registers the http handlers for service Query to "mux". -// UnaryRPC :call QueryServer directly. -// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. -// Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterQueryHandlerFromEndpoint instead. -func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, server QueryServer) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_Query_Params_0(rctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -// RegisterQueryHandlerFromEndpoint is same as RegisterQueryHandler but -// automatically dials to "endpoint" and closes the connection when "ctx" gets done. -func RegisterQueryHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) { - conn, err := grpc.Dial(endpoint, opts...) - if err != nil { - return err - } - defer func() { - if err != nil { - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - return - } - go func() { - <-ctx.Done() - if cerr := conn.Close(); cerr != nil { - grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr) - } - }() - }() - - return RegisterQueryHandler(ctx, mux, conn) -} - -// RegisterQueryHandler registers the http handlers for service Query to "mux". -// The handlers forward requests to the grpc endpoint over "conn". -func RegisterQueryHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error { - return RegisterQueryHandlerClient(ctx, mux, NewQueryClient(conn)) -} - -// RegisterQueryHandlerClient registers the http handlers for service Query -// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "QueryClient". -// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "QueryClient" -// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in -// "QueryClient" to call the correct interceptors. -func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, client QueryClient) error { - - mux.Handle("GET", pattern_Query_Params_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_Query_Params_0(rctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_Query_Params_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - return nil -} - -var ( - pattern_Query_Params_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"canto", "recovery", "v1", "params"}, "", runtime.AssumeColonVerbOpt(true))) -) - -var ( - forward_Query_Params_0 = runtime.ForwardResponseMessage -) From bc6438953c81f689b1452c5478fa210ff3c27dd3 Mon Sep 17 00:00:00 2001 From: "T.K. Kwon" Date: Fri, 28 Jul 2023 13:55:28 +0700 Subject: [PATCH 2/4] remove recovery proto --- proto/canto/recovery/v1/genesis.proto | 22 ---------------------- proto/canto/recovery/v1/query.proto | 25 ------------------------- 2 files changed, 47 deletions(-) delete mode 100644 proto/canto/recovery/v1/genesis.proto delete mode 100644 proto/canto/recovery/v1/query.proto diff --git a/proto/canto/recovery/v1/genesis.proto b/proto/canto/recovery/v1/genesis.proto deleted file mode 100644 index 280c7e24..00000000 --- a/proto/canto/recovery/v1/genesis.proto +++ /dev/null @@ -1,22 +0,0 @@ -syntax = "proto3"; -package canto.recovery.v1; - -import "gogoproto/gogo.proto"; -import "google/protobuf/duration.proto"; - -option go_package = "github.com/Canto-Network/Canto/v6/x/recovery/types"; - -// GenesisState defines the recovery module's genesis state. -message GenesisState { - // params defines all the paramaters of the module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} - -// Params holds parameters for the recovery module -message Params { - // enable recovery IBC middleware - bool enable_recovery = 1; - // duration added to timeout timestamp for balances recovered via IBC packets - google.protobuf.Duration packet_timeout_duration = 2 - [ (gogoproto.nullable) = false, (gogoproto.stdduration) = true ]; -} diff --git a/proto/canto/recovery/v1/query.proto b/proto/canto/recovery/v1/query.proto deleted file mode 100644 index 315fff10..00000000 --- a/proto/canto/recovery/v1/query.proto +++ /dev/null @@ -1,25 +0,0 @@ -syntax = "proto3"; -package canto.recovery.v1; - -import "google/api/annotations.proto"; -import "gogoproto/gogo.proto"; -import "canto/recovery/v1/genesis.proto"; - -option go_package = "github.com/Canto-Network/Canto/v6/x/recovery/types"; - -// Query defines the gRPC querier service. -service Query { - // Params retrieves the total set of recovery parameters. - rpc Params(QueryParamsRequest) returns (QueryParamsResponse) { - option (google.api.http).get = "/canto/recovery/v1/params"; - } -} - -// QueryParamsRequest is the request type for the Query/Params RPC method. -message QueryParamsRequest {} - -// QueryParamsResponse is the response type for the Query/Params RPC method. -message QueryParamsResponse { - // params defines the parameters of the module. - Params params = 1 [ (gogoproto.nullable) = false ]; -} From 78077e575d647d7fc79984b83918474378e7ce97 Mon Sep 17 00:00:00 2001 From: "T.K. Kwon" Date: Fri, 28 Jul 2023 13:59:26 +0700 Subject: [PATCH 3/4] remove recovery imports in app.go --- app/app.go | 53 +++++------------------------------------------------ 1 file changed, 5 insertions(+), 48 deletions(-) diff --git a/app/app.go b/app/app.go index 891f330a..6bd96933 100644 --- a/app/app.go +++ b/app/app.go @@ -120,9 +120,6 @@ import ( "github.com/Canto-Network/Canto/v6/x/inflation" inflationkeeper "github.com/Canto-Network/Canto/v6/x/inflation/keeper" inflationtypes "github.com/Canto-Network/Canto/v6/x/inflation/types" - "github.com/Canto-Network/Canto/v6/x/recovery" - recoverykeeper "github.com/Canto-Network/Canto/v6/x/recovery/keeper" - recoverytypes "github.com/Canto-Network/Canto/v6/x/recovery/types" //govshuttle imports "github.com/Canto-Network/Canto/v6/x/govshuttle" @@ -197,7 +194,6 @@ var ( govshuttle.AppModuleBasic{}, csr.AppModuleBasic{}, epochs.AppModuleBasic{}, - recovery.AppModuleBasic{}, ) // module account permissions @@ -274,7 +270,6 @@ type Canto struct { InflationKeeper inflationkeeper.Keeper Erc20Keeper erc20keeper.Keeper EpochsKeeper epochskeeper.Keeper - RecoveryKeeper *recoverykeeper.Keeper GovshuttleKeeper govshuttlekeeper.Keeper CSRKeeper csrkeeper.Keeper @@ -332,7 +327,7 @@ func NewCanto( evmtypes.StoreKey, feemarkettypes.StoreKey, // Canto keys inflationtypes.StoreKey, erc20types.StoreKey, - epochstypes.StoreKey, recoverytypes.StoreKey, //recoverytypes.StoreKe + epochstypes.StoreKey, csrtypes.StoreKey, govshuttletypes.StoreKey, ) @@ -488,50 +483,17 @@ func NewCanto( // RecvPacket, message that originates from core IBC and goes down to app, the flow is the otherway // channel.RecvPacket -> recovery.OnRecvPacket -> claim.OnRecvPacket -> transfer.OnRecvPacket - // app.TransferKeeper = ibctransferkeeper.NewKeeper( - // appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.RecoveryKeeper, - // //nil, // ICS4 Wrapper: claims IBC middleware - // app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, - // app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, - // ) - - // set Recovery Module as the ICS4Wrapper - - app.RecoveryKeeper = recoverykeeper.NewKeeper( - app.GetSubspace(recoverytypes.ModuleName), - app.AccountKeeper, - app.BankKeeper, - app.IBCKeeper.ChannelKeeper, - app.TransferKeeper, - ) - app.TransferKeeper = ibctransferkeeper.NewKeeper( - appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.RecoveryKeeper, + appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), //ONBOARDING KEEPER, //nil, // ICS4 Wrapper: claims IBC middleware app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, ) - app.RecoveryKeeper.SetTransferKeeper(app.TransferKeeper) - - // app.TransferKeeper = ibctransferkeeper.NewKeeper( - // appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), - // app.RecoveryKeeper, - // app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, - // app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, - // ) - // Set the ICS4 wrappers for claims and recovery middlewares - app.RecoveryKeeper.SetICS4Wrapper(app.IBCKeeper.ChannelKeeper) + // Set the ICS4 wrappers for onboarding middleware + // SET ONBOARDING MIDDLEWARE ICS4 WRAPPER // NOTE: ICS4 wrapper for Transfer Keeper already set - // set Recovery Module as the ICS4Wrapper - // app.TransferKeeper = ibctransferkeeper.NewKeeper( - // appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), - // app.RecoveryKeeper, - // app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, - // app.AccountKeeper, app.BankKeeper, scopedTransferKeeper, - // ) - transferModule := transfer.NewAppModule(app.TransferKeeper) // transfer stack contains (from top to bottom): @@ -542,7 +504,7 @@ func NewCanto( var transferStack porttypes.IBCModule transferStack = transfer.NewIBCModule(app.TransferKeeper) - transferStack = recovery.NewIBCMiddleware(*app.RecoveryKeeper, transferStack) + // ADD ONBOARDING MIDDLEWARE TO TRANSFER STACK // Create static IBC router, add transfer route, then set and seal it ibcRouter := porttypes.NewRouter() @@ -594,7 +556,6 @@ func NewCanto( inflation.NewAppModule(app.InflationKeeper, app.AccountKeeper, app.StakingKeeper), erc20.NewAppModule(app.Erc20Keeper, app.AccountKeeper), epochs.NewAppModule(appCodec, app.EpochsKeeper), - recovery.NewAppModule(*app.RecoveryKeeper), govshuttle.NewAppModule(app.GovshuttleKeeper, app.AccountKeeper), csr.NewAppModule(app.CSRKeeper, app.AccountKeeper), ) @@ -629,7 +590,6 @@ func NewCanto( paramstypes.ModuleName, inflationtypes.ModuleName, erc20types.ModuleName, - recoverytypes.ModuleName, govshuttletypes.ModuleName, csrtypes.ModuleName, ) @@ -643,7 +603,6 @@ func NewCanto( feemarkettypes.ModuleName, // Note: epochs' endblock should be "real" end of epochs, we keep epochs endblock at the end epochstypes.ModuleName, - recoverytypes.ModuleName, // no-op modules ibchost.ModuleName, ibctransfertypes.ModuleName, @@ -699,7 +658,6 @@ func NewCanto( inflationtypes.ModuleName, erc20types.ModuleName, epochstypes.ModuleName, - recoverytypes.ModuleName, govshuttletypes.ModuleName, csrtypes.ModuleName, // NOTE: crisis module must go at the end to check for invariants on each module @@ -1016,7 +974,6 @@ func initParamsKeeper( // Canto subspaces paramsKeeper.Subspace(inflationtypes.ModuleName) paramsKeeper.Subspace(erc20types.ModuleName) - paramsKeeper.Subspace(recoverytypes.ModuleName) paramsKeeper.Subspace(govshuttletypes.ModuleName) paramsKeeper.Subspace(csrtypes.ModuleName) return paramsKeeper From 11428d8b7b897800257c95326f4b3eaec41bf570 Mon Sep 17 00:00:00 2001 From: "T.K. Kwon" Date: Fri, 28 Jul 2023 14:21:38 +0700 Subject: [PATCH 4/4] add placeholder for ICS4wrapper in transferKeeper init --- app/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/app.go b/app/app.go index 6bd96933..61df5aca 100644 --- a/app/app.go +++ b/app/app.go @@ -484,7 +484,7 @@ func NewCanto( // channel.RecvPacket -> recovery.OnRecvPacket -> claim.OnRecvPacket -> transfer.OnRecvPacket app.TransferKeeper = ibctransferkeeper.NewKeeper( - appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), //ONBOARDING KEEPER, + appCodec, keys[ibctransfertypes.StoreKey], app.GetSubspace(ibctransfertypes.ModuleName), app.IBCKeeper.ChannelKeeper, //nil, // ICS4 Wrapper: claims IBC middleware app.IBCKeeper.ChannelKeeper, &app.IBCKeeper.PortKeeper, app.AccountKeeper, app.BankKeeper, scopedTransferKeeper,