Skip to content

Commit

Permalink
handle recovery of funds that did not originate on the intermediate c…
Browse files Browse the repository at this point in the history
…hain
  • Loading branch information
agouin committed Nov 17, 2023
1 parent ea000ee commit f57df92
Show file tree
Hide file tree
Showing 2 changed files with 18 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -110,24 +110,34 @@ func (k *Keeper) moveFundsToUserRecoverableAccount(
) error {
fullDenomPath := data.Denom

if !transfertypes.SenderChainIsSource(packet.SourcePort, packet.SourceChannel, fullDenomPath) {
return nil
}

amount, ok := sdk.NewIntFromString(data.Amount)
if !ok {
return fmt.Errorf("failed to parse amount from packet data for forward recovery: %s", data.Amount)
}
denomTrace := transfertypes.ParseDenomTrace(fullDenomPath)
token := sdk.NewCoin(denomTrace.IBCDenom(), amount)

escrowAddress := transfertypes.GetEscrowAddress(packet.SourcePort, packet.SourceChannel)

userAccount, err := userRecoverableAccount(inFlightPacket)
if err != nil {
return fmt.Errorf("failed to get user recoverable account: %w", err)
}

if !transfertypes.SenderChainIsSource(packet.SourcePort, packet.SourceChannel, fullDenomPath) {
// mint vouchers back to sender
if err := k.bankKeeper.MintCoins(
ctx, transfertypes.ModuleName, sdk.NewCoins(token),
); err != nil {
return err
}

if err := k.bankKeeper.SendCoinsFromModuleToAccount(ctx, transfertypes.ModuleName, userAccount, sdk.NewCoins(token)); err != nil {
panic(fmt.Sprintf("unable to send coins from module to account despite previously minting coins to module account: %v", err))
}
return nil
}

escrowAddress := transfertypes.GetEscrowAddress(packet.SourcePort, packet.SourceChannel)

if err := k.bankKeeper.SendCoins(
ctx, escrowAddress, userAccount, sdk.NewCoins(token),
); err != nil {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ type DistributionKeeper interface {
// BankKeeper defines the expected bank keeper
type BankKeeper interface {
SendCoins(ctx sdk.Context, fromAddr sdk.AccAddress, toAddr sdk.AccAddress, amt sdk.Coins) error
SendCoinsFromModuleToAccount(ctx sdk.Context, senderModule string, recipientAddr sdk.AccAddress, amt sdk.Coins) error
SendCoinsFromAccountToModule(ctx sdk.Context, senderAddr sdk.AccAddress, recipientModule string, amt sdk.Coins) error
MintCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error
BurnCoins(ctx sdk.Context, moduleName string, amt sdk.Coins) error
}

0 comments on commit f57df92

Please sign in to comment.