From d272eee7bc98a8a4e75fcb15d385087b95fedb22 Mon Sep 17 00:00:00 2001 From: Chirantan Ekbote Date: Tue, 23 Aug 2022 15:54:47 +0900 Subject: [PATCH] wormchain: tokenbridge: Burn wrapped coins Previously we would just collect all the coins in the module account, which isn't necessary for wrapped coins that we minted. Burn them instead. --- .../tokenbridge/keeper/msg_server_transfer.go | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/wormhole_chain/x/tokenbridge/keeper/msg_server_transfer.go b/wormhole_chain/x/tokenbridge/keeper/msg_server_transfer.go index 092558d60..394df82fb 100644 --- a/wormhole_chain/x/tokenbridge/keeper/msg_server_transfer.go +++ b/wormhole_chain/x/tokenbridge/keeper/msg_server_transfer.go @@ -9,6 +9,7 @@ import ( "github.com/certusone/wormhole-chain/x/tokenbridge/types" whtypes "github.com/certusone/wormhole-chain/x/wormhole/types" sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" "github.com/holiman/uint256" ) @@ -30,11 +31,18 @@ func (k msgServer) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*typ return nil, types.ErrNoDenomMetadata } - // Collect coins in module account - // TODO: why not burn? - err = k.bankKeeper.SendCoins(ctx, userAcc, k.accountKeeper.GetModuleAddress(types.ModuleName), sdk.Coins{msg.Amount}) - if err != nil { - return nil, err + moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) + _, _, wrapped := types.GetWrappedCoinMeta(msg.Amount.Denom) + if wrapped { + // We previously minted these coins so just burn them now. + if err := k.bankKeeper.BurnCoins(ctx, types.ModuleName, sdk.Coins{msg.Amount}); err != nil { + return nil, sdkerrors.Wrap(err, "failed to burn wrapped coins") + } + } else { + // Collect coins in the module account. + if err := k.bankKeeper.SendCoins(ctx, userAcc, moduleAddress, sdk.Coins{msg.Amount}); err != nil { + return nil, sdkerrors.Wrap(err, "failed to send coins to module account") + } } // Parse fees @@ -107,7 +115,6 @@ func (k msgServer) Transfer(goCtx context.Context, msg *types.MsgTransfer) (*typ } // Post message - moduleAddress := k.accountKeeper.GetModuleAddress(types.ModuleName) emitterAddress := whtypes.EmitterAddressFromAccAddress(moduleAddress) err = k.wormholeKeeper.PostMessage(ctx, emitterAddress, 0, buf.Bytes()) if err != nil {