(ctx sdk.Context, msg *types.MsgOpen)
| 129 | } |
| 130 | |
| 131 | func (k msgServer) OpenLong(ctx sdk.Context, msg *types.MsgOpen) (*types.MTP, error) { |
| 132 | maxLeverage := k.GetMaxLeverageParam(ctx) |
| 133 | leverage := sdk.MinDec(msg.Leverage, maxLeverage) |
| 134 | eta := leverage.Sub(sdk.OneDec()) |
| 135 | |
| 136 | collateralAmount := msg.CollateralAmount |
| 137 | |
| 138 | collateralAmountDec := sdk.NewDecFromBigInt(msg.CollateralAmount.BigInt()) |
| 139 | |
| 140 | mtp := types.NewMTP(msg.Signer, msg.CollateralAsset, msg.BorrowAsset, msg.Position, leverage) |
| 141 | |
| 142 | var externalAsset string |
| 143 | nativeAsset := types.GetSettlementAsset() |
| 144 | |
| 145 | if !k.IsRowanCollateralEnabled(ctx) && types.StringCompare(msg.CollateralAsset, nativeAsset) { |
| 146 | return nil, sdkerrors.Wrap(types.ErrRowanAsCollateralNotAllowed, nativeAsset) |
| 147 | } |
| 148 | |
| 149 | if types.StringCompare(msg.CollateralAsset, nativeAsset) { |
| 150 | externalAsset = msg.BorrowAsset |
| 151 | } else { |
| 152 | externalAsset = msg.CollateralAsset |
| 153 | } |
| 154 | |
| 155 | pool, err := k.ClpKeeper().GetPool(ctx, externalAsset) |
| 156 | if err != nil { |
| 157 | return nil, sdkerrors.Wrap(clptypes.ErrPoolDoesNotExist, externalAsset) |
| 158 | } |
| 159 | |
| 160 | if !k.IsPoolEnabled(ctx, externalAsset) { |
| 161 | return nil, sdkerrors.Wrap(types.ErrMTPDisabled, externalAsset) |
| 162 | } |
| 163 | |
| 164 | leveragedAmountDec := collateralAmountDec.Mul(leverage) |
| 165 | |
| 166 | leveragedAmount := sdk.NewUintFromBigInt(leveragedAmountDec.TruncateInt().BigInt()) |
| 167 | |
| 168 | ctx.Logger().Info(fmt.Sprintf("leveragedAmount: %s", leveragedAmount.String())) |
| 169 | |
| 170 | if types.StringCompare(msg.CollateralAsset, nativeAsset) { |
| 171 | if leveragedAmount.GT(pool.NativeAssetBalance) { |
| 172 | return nil, sdkerrors.Wrap(types.ErrBorrowTooHigh, leveragedAmount.String()) |
| 173 | } |
| 174 | } else { |
| 175 | if leveragedAmount.GT(pool.ExternalAssetBalance) { |
| 176 | return nil, sdkerrors.Wrap(types.ErrBorrowTooHigh, leveragedAmount.String()) |
| 177 | } |
| 178 | } |
| 179 | |
| 180 | // check if liabilities large enough for interest payments |
| 181 | err = k.CheckMinLiabilities(ctx, collateralAmount, eta, pool, msg.BorrowAsset) |
| 182 | if err != nil { |
| 183 | return nil, err |
| 184 | } |
| 185 | |
| 186 | custodyAmount, err := k.CLPSwap(ctx, leveragedAmount, msg.BorrowAsset, pool) |
| 187 | if err != nil { |
| 188 | return nil, err |
no test coverage detected