@@ -188,9 +188,6 @@ func (k Keeper) ExecuteDeposit(ctx sdk.Context, msg types.DepositMsgState, batch
188188
189189 params := k .GetParams (ctx )
190190
191- var inputs []banktypes.Input
192- var outputs []banktypes.Output
193-
194191 reserveCoins := k .GetReserveCoins (ctx , pool )
195192
196193 // reinitialize pool if the pool is depleted
@@ -240,77 +237,53 @@ func (k Keeper) ExecuteDeposit(ctx sdk.Context, msg types.DepositMsgState, batch
240237 return nil
241238 }
242239
243- // only two coins are acceptable
244- if reserveCoins .Len () != msg .Msg .DepositCoins .Len () {
245- return types .ErrNumOfReserveCoin
246- }
247-
248240 reserveCoins .Sort ()
249241
250- // Decimal Error, divide the Int coin amount by the Decimal Rate and erase the decimal point to deposit a lower value
251- lastReserveCoinA := reserveCoins [0 ].Amount
252- lastReserveCoinB := reserveCoins [1 ].Amount
253- lastReserveRatio := lastReserveCoinA .ToDec ().QuoTruncate (lastReserveCoinB .ToDec ())
242+ lastReserveCoinA := reserveCoins [0 ]
243+ lastReserveCoinB := reserveCoins [1 ]
254244
255245 depositCoinA := depositCoins [0 ]
256246 depositCoinB := depositCoins [1 ]
257- depositCoinAmountA := depositCoinA .Amount
258- depositCoinAmountB := depositCoinB .Amount
259- depositableCoinAmountA := depositCoinB .Amount .ToDec ().MulTruncate (lastReserveRatio ).TruncateInt ()
260-
261- refundedCoins := sdk .NewCoins ()
262- refundedCoinA := sdk .ZeroInt ()
263- refundedCoinB := sdk .ZeroInt ()
264247
265- var acceptedCoins sdk.Coins
266- // handle when depositing coin A amount is less than, greater than or equal to depositable amount
267- if depositCoinA .Amount .LT (depositableCoinAmountA ) {
268- depositCoinAmountB = depositCoinA .Amount .ToDec ().QuoTruncate (lastReserveRatio ).TruncateInt ()
269- acceptedCoins = sdk .NewCoins (depositCoinA , sdk .NewCoin (depositCoinB .Denom , depositCoinAmountB ))
270-
271- inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , acceptedCoins ))
272- outputs = append (outputs , banktypes .NewOutput (reserveAcc , acceptedCoins ))
273-
274- refundedCoinB = depositCoinB .Amount .Sub (depositCoinAmountB )
275-
276- if refundedCoinB .IsPositive () {
277- refundedCoins = sdk .NewCoins (sdk .NewCoin (depositCoinB .Denom , refundedCoinB ))
278- inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , refundedCoins ))
279- outputs = append (outputs , banktypes .NewOutput (depositor , refundedCoins ))
280- }
281- } else if depositCoinA .Amount .GT (depositableCoinAmountA ) {
282- depositCoinAmountA = depositCoinB .Amount .ToDec ().MulTruncate (lastReserveRatio ).TruncateInt ()
283- acceptedCoins = sdk .NewCoins (depositCoinB , sdk .NewCoin (depositCoinA .Denom , depositCoinAmountA ))
284-
285- inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , acceptedCoins ))
286- outputs = append (outputs , banktypes .NewOutput (reserveAcc , acceptedCoins ))
248+ poolCoinTotalSupply := k .GetPoolCoinTotalSupply (ctx , pool )
249+ poolCoinMintAmt := sdk .MinDec (
250+ poolCoinTotalSupply .ToDec ().MulTruncate (depositCoinA .Amount .ToDec ()).QuoTruncate (lastReserveCoinA .Amount .ToDec ()),
251+ poolCoinTotalSupply .ToDec ().MulTruncate (depositCoinB .Amount .ToDec ()).QuoTruncate (lastReserveCoinB .Amount .ToDec ()),
252+ )
253+ mintRate := poolCoinMintAmt .TruncateDec ().QuoTruncate (poolCoinTotalSupply .ToDec ())
254+ acceptedCoins := sdk .NewCoins (
255+ sdk .NewCoin (depositCoins [0 ].Denom , lastReserveCoinA .Amount .ToDec ().Mul (mintRate ).TruncateInt ()),
256+ sdk .NewCoin (depositCoins [1 ].Denom , lastReserveCoinB .Amount .ToDec ().Mul (mintRate ).TruncateInt ()),
257+ )
258+ refundedCoins := depositCoins .Sub (acceptedCoins )
259+ refundedCoinA := sdk .NewCoin (depositCoinA .Denom , refundedCoins .AmountOf (depositCoinA .Denom ))
260+ refundedCoinB := sdk .NewCoin (depositCoinB .Denom , refundedCoins .AmountOf (depositCoinB .Denom ))
287261
288- refundedCoinA = depositCoinA .Amount .Sub (depositCoinAmountA )
262+ mintPoolCoin := sdk .NewCoin (pool .PoolCoinDenom , poolCoinMintAmt .TruncateInt ())
263+ mintPoolCoins := sdk .NewCoins (mintPoolCoin )
289264
290- if refundedCoinA .IsPositive () {
291- refundedCoins = sdk .NewCoins (sdk .NewCoin (depositCoinA .Denom , refundedCoinA ))
292- inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , refundedCoins ))
293- outputs = append (outputs , banktypes .NewOutput (depositor , refundedCoins ))
294- }
295- } else {
296- acceptedCoins = sdk .NewCoins (depositCoinA , depositCoinB )
297- inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , acceptedCoins ))
298- outputs = append (outputs , banktypes .NewOutput (reserveAcc , acceptedCoins ))
265+ if mintPoolCoins .IsZero () || acceptedCoins .IsZero () {
266+ return fmt .Errorf ("pool coin truncated, no accepted coin, refund" )
299267 }
300268
301- // calculate pool token mint amount
302- poolCoinTotalSupply := k .GetPoolCoinTotalSupply (ctx , pool )
303- poolCoinAmt := sdk .MinInt (
304- poolCoinTotalSupply .ToDec ().MulTruncate (depositCoinAmountA .ToDec ()).QuoTruncate (reserveCoins [0 ].Amount .ToDec ()).TruncateInt (),
305- poolCoinTotalSupply .ToDec ().MulTruncate (depositCoinAmountB .ToDec ()).QuoTruncate (reserveCoins [1 ].Amount .ToDec ()).TruncateInt ())
306- mintPoolCoin := sdk .NewCoin (pool .PoolCoinDenom , poolCoinAmt )
307- mintPoolCoins := sdk .NewCoins (mintPoolCoin )
308-
309- // mint pool token to the depositor
310269 if err := k .bankKeeper .MintCoins (ctx , types .ModuleName , mintPoolCoins ); err != nil {
311270 return err
312271 }
313272
273+ var inputs []banktypes.Input
274+ var outputs []banktypes.Output
275+
276+ if ! refundedCoins .IsZero () {
277+ // refund truncated deposit coins
278+ inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , refundedCoins ))
279+ outputs = append (outputs , banktypes .NewOutput (depositor , refundedCoins ))
280+ }
281+
282+ // send accepted deposit coins
283+ inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , acceptedCoins ))
284+ outputs = append (outputs , banktypes .NewOutput (reserveAcc , acceptedCoins ))
285+
286+ // send minted pool coins
314287 inputs = append (inputs , banktypes .NewInput (batchEscrowAcc , mintPoolCoins ))
315288 outputs = append (outputs , banktypes .NewOutput (depositor , mintPoolCoins ))
316289
@@ -329,9 +302,9 @@ func (k Keeper) ExecuteDeposit(ctx sdk.Context, msg types.DepositMsgState, batch
329302 afterReserveCoinB := afterReserveCoins [1 ].Amount
330303
331304 MintingPoolCoinsInvariant (poolCoinTotalSupply , mintPoolCoin .Amount , depositCoinA .Amount , depositCoinB .Amount ,
332- lastReserveCoinA , lastReserveCoinB , refundedCoinA , refundedCoinB )
333- DepositInvariant (lastReserveCoinA , lastReserveCoinB , depositCoinA .Amount , depositCoinB .Amount ,
334- afterReserveCoinA , afterReserveCoinB , refundedCoinA , refundedCoinB )
305+ lastReserveCoinA . Amount , lastReserveCoinB . Amount , refundedCoinA . Amount , refundedCoinB . Amount )
306+ DepositInvariant (lastReserveCoinA . Amount , lastReserveCoinB . Amount , depositCoinA .Amount , depositCoinB .Amount ,
307+ afterReserveCoinA , afterReserveCoinB , refundedCoinA . Amount , refundedCoinB . Amount )
335308 }
336309
337310 ctx .EventManager ().EmitEvent (
@@ -350,7 +323,7 @@ func (k Keeper) ExecuteDeposit(ctx sdk.Context, msg types.DepositMsgState, batch
350323 )
351324
352325 reserveCoins = k .GetReserveCoins (ctx , pool )
353- lastReserveRatio = sdk .NewDecFromInt (reserveCoins [0 ].Amount ).Quo (sdk .NewDecFromInt (reserveCoins [1 ].Amount ))
326+ lastReserveRatio : = sdk .NewDecFromInt (reserveCoins [0 ].Amount ).Quo (sdk .NewDecFromInt (reserveCoins [1 ].Amount ))
354327
355328 logger := k .Logger (ctx )
356329 logger .Debug (
0 commit comments