diff --git a/x/irs/keeper/grpc_query_estimate_mint_pt_yt_pair.go b/x/irs/keeper/grpc_query_estimate_mint_pt_yt_pair.go index 589993afd..5d8b88b88 100644 --- a/x/irs/keeper/grpc_query_estimate_mint_pt_yt_pair.go +++ b/x/irs/keeper/grpc_query_estimate_mint_pt_yt_pair.go @@ -20,6 +20,10 @@ func (k Keeper) EstimateMintPtYtPair(c context.Context, req *types.QueryEstimate if !found { return nil, types.ErrTrancheNotFound } + depositInfo := k.GetStrategyDepositInfo(ctx, tranche.StrategyContract) + if req.Denom != depositInfo.Denom { + return nil, types.ErrInvalidDepositDenom + } depositAmount, ok := sdk.NewIntFromString(req.Amount) if !ok { return nil, types.ErrInvalidAmount diff --git a/x/irs/keeper/stripping.go b/x/irs/keeper/stripping.go index 3ca3f8e6b..099d2095c 100644 --- a/x/irs/keeper/stripping.go +++ b/x/irs/keeper/stripping.go @@ -27,12 +27,6 @@ func (k Keeper) MintPtYtPair(ctx sdk.Context, sender sdk.AccAddress, pool types. contractAddr := sdk.MustAccAddressFromBech32(pool.StrategyContract) depositInfo := k.GetStrategyDepositInfo(ctx, pool.StrategyContract) - ptAmount, err := k.CalculateMintPtAmount(ctx, pool, underlyingAmount) - if err != nil { - return sdk.ZeroInt(), err - } - ptCoins := sdk.Coins{sdk.NewCoin(ptDenom, ptAmount)} - // Stake to strategy if underlyingAmount.Denom == depositInfo.Denom { wasmMsg := `{"stake":{}}` @@ -41,6 +35,8 @@ func (k Keeper) MintPtYtPair(ctx sdk.Context, sender sdk.AccAddress, pool types. return sdk.ZeroInt(), err } } else { + return sdk.ZeroInt(), types.ErrInvalidDepositDenom + // TODO: bug here, PT is calculated and minted regardless of denom msg, err := k.ExecuteVaultTransfer(ctx, moduleAddr, pool.StrategyContract, underlyingAmount) k.Logger(ctx).Info("transfer_memo " + msg.Memo) if err != nil { @@ -48,6 +44,12 @@ func (k Keeper) MintPtYtPair(ctx sdk.Context, sender sdk.AccAddress, pool types. } } + ptAmount, err := k.CalculateMintPtAmount(ctx, pool, underlyingAmount) + if err != nil { + return sdk.ZeroInt(), err + } + ptCoins := sdk.Coins{sdk.NewCoin(ptDenom, ptAmount)} + // mint PT // PT mint amount = usedUnderlying * (1-(strategyAmount)/interestSupply) err = k.bankKeeper.MintCoins(ctx, types.ModuleName, ptCoins) diff --git a/x/irs/keeper/swap.go b/x/irs/keeper/swap.go index f42c22009..0bb3397f8 100644 --- a/x/irs/keeper/swap.go +++ b/x/irs/keeper/swap.go @@ -11,9 +11,13 @@ import ( // SwapPoolTokens swaps tokens in a pool. UT => PT or PT => UT func (k Keeper) SwapPoolTokens(ctx sdk.Context, sender sdk.AccAddress, pool types.TranchePool, tokenIn sdk.Coin) (sdk.Coin, error) { - tokenOutDenom := pool.PoolAssets[0].Denom - if tokenOutDenom == tokenIn.Denom { + var tokenOutDenom string + if tokenIn.Denom == pool.PoolAssets[0].Denom { tokenOutDenom = pool.PoolAssets[1].Denom + } else if tokenIn.Denom == pool.PoolAssets[1].Denom { + tokenOutDenom = pool.PoolAssets[0].Denom + } else { + return sdk.Coin{}, types.ErrInvalidDepositDenom } tokenOutAmount, err := k.SwapExactAmountIn(ctx, sender, pool, tokenIn, tokenOutDenom, sdk.ZeroInt(), pool.SwapFee) return sdk.NewCoin(tokenOutDenom, tokenOutAmount), err @@ -21,12 +25,13 @@ func (k Keeper) SwapPoolTokens(ctx sdk.Context, sender sdk.AccAddress, pool type // SimulateSwapPoolTokens simulates a swap in a pool & return TokenOut Amount value. UT => PT or PT => UT func (k Keeper) SimulateSwapPoolTokens(ctx sdk.Context, pool types.TranchePool, tokenIn sdk.Coin) (sdk.Coin, error) { - tokenOutDenom := pool.PoolAssets[0].Denom - if tokenOutDenom == tokenIn.Denom { + var tokenOutDenom string + if tokenIn.Denom == pool.PoolAssets[0].Denom { tokenOutDenom = pool.PoolAssets[1].Denom - } - if tokenIn.Denom == tokenOutDenom { - return sdk.Coin{}, errors.New("cannot trade the same denomination in and out") + } else if tokenIn.Denom == pool.PoolAssets[1].Denom { + tokenOutDenom = pool.PoolAssets[0].Denom + } else { + return sdk.Coin{}, types.ErrInvalidDepositDenom } tokenOutAmount, err := k.CalculateSwapExactAmountIn(ctx, pool, tokenIn, tokenOutDenom, sdk.ZeroInt(), pool.SwapFee) if err != nil {