MCPcopy Create free account
hub / github.com/Sifchain/sifnode / OpenLong

Method OpenLong

x/margin/keeper/msg_server.go:131–236  ·  view source on GitHub ↗
(ctx sdk.Context, msg *types.MsgOpen)

Source from the content-addressed store, hash-verified

129}
130
131func (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

Callers 1

OpenMethod · 0.95

Calls 14

GetMaxLeverageParamMethod · 0.65
GetPoolMethod · 0.65
ClpKeeperMethod · 0.65
IsPoolEnabledMethod · 0.65
CheckMinLiabilitiesMethod · 0.65
CLPSwapMethod · 0.65
BorrowMethod · 0.65
UpdatePoolHealthMethod · 0.65
TakeInCustodyMethod · 0.65
GetSafetyFactorMethod · 0.65
UpdateMTPHealthMethod · 0.65

Tested by

no test coverage detected