@@ -458,6 +458,97 @@ func (k msgServer) CreatePool(goCtx context.Context, msg *types.MsgCreatePool) (
458458
459459func (k msgServer ) Swap (goCtx context.Context , msg * types.MsgSwap ) (* types.MsgSwapResponse , error ) {
460460 ctx := sdk .UnwrapSDKContext (goCtx )
461+ // Basic validation
462+ if msg .SentAmount .IsZero () || msg .SentAmount .IsNegative () {
463+ return nil , types .ErrSwapAmountTooSmall
464+ }
465+ // TODO: should we check also the min amount?
466+ if msg .MinReceivingAmount .IsZero () || msg .MinReceivingAmount .IsNegative () {
467+ return nil , types .ErrSwapAmountTooSmall
468+ }
469+ // Check assets
470+ registry := k .tokenRegistryKeeper .GetRegistry (ctx )
471+ sAsset , err := k .tokenRegistryKeeper .GetEntry (registry , msg .SentAsset .Symbol )
472+ if err != nil {
473+ return nil , types .ErrTokenNotSupported
474+ }
475+ rAsset , err := k .tokenRegistryKeeper .GetEntry (registry , msg .ReceivedAsset .Symbol )
476+ if err != nil {
477+ return nil , types .ErrTokenNotSupported
478+ }
479+ if ! k .tokenRegistryKeeper .CheckEntryPermissions (sAsset , []tokenregistrytypes.Permission {tokenregistrytypes .Permission_CLP }) {
480+ return nil , tokenregistrytypes .ErrPermissionDenied
481+ }
482+ if ! k .tokenRegistryKeeper .CheckEntryPermissions (rAsset , []tokenregistrytypes.Permission {tokenregistrytypes .Permission_CLP }) {
483+ return nil , tokenregistrytypes .ErrPermissionDenied
484+ }
485+ if k .tokenRegistryKeeper .CheckEntryPermissions (sAsset , []tokenregistrytypes.Permission {tokenregistrytypes .Permission_DISABLE_SELL }) {
486+ return nil , tokenregistrytypes .ErrNotAllowedToSellAsset
487+ }
488+ if k .tokenRegistryKeeper .CheckEntryPermissions (rAsset , []tokenregistrytypes.Permission {tokenregistrytypes .Permission_DISABLE_BUY }) {
489+ return nil , tokenregistrytypes .ErrNotAllowedToBuyAsset
490+ }
491+ // Get pool
492+ var pool types.Pool
493+ if types .StringCompare (msg .SentAsset .Symbol , types .NativeSymbol ) {
494+ pool , err = k .GetPool (ctx , msg .ReceivedAsset .Symbol )
495+ } else {
496+ pool , err = k .GetPool (ctx , msg .SentAsset .Symbol )
497+ }
498+ if err != nil {
499+ return nil , err
500+ }
501+ // Check balances and fees
502+ err = k .CheckPoolHealth (ctx , pool )
503+ if err != nil {
504+ return nil , err
505+ }
506+ expectedSwapFee := k .GetSwapFeeRate (ctx , * msg .SentAsset , false )
507+ err = k .CheckSwapFee (ctx , pool , * msg .ReceivedAsset , false , expectedSwapFee )
508+ if err != nil {
509+ return nil , err
510+ }
511+ // Price impact
512+ err = k .CheckPriceImpact (ctx , pool , * msg .ReceivedAsset , msg .SentAmount )
513+ if err != nil {
514+ return nil , err
515+ }
516+ // Execute swap
517+ swapAmount , err := k .CLPCalcSwap (ctx , msg .SentAmount , * msg .ReceivedAsset , pool , false )
518+ if err != nil {
519+ return nil , err
520+ }
521+ // Final checks
522+ err = k .CheckSentAmount (swapAmount , msg .MinReceivingAmount , * msg .ReceivedAsset )
523+ if err != nil {
524+ return nil , err
525+ }
526+ signer , err := sdk .AccAddressFromBech32 (msg .Signer )
527+ if err != nil {
528+ return nil , err
529+ }
530+ // Finalize swap
531+ err = k .ExecuteSwap (ctx , msg .SentAsset , msg .ReceivedAsset , msg .SentAmount , swapAmount , signer , pool )
532+ if err != nil {
533+ return nil , err
534+ }
535+ // Emit events
536+ ctx .EventManager ().EmitEvents (sdk.Events {
537+ sdk .NewEvent (
538+ types .EventTypeSwap ,
539+ sdk .NewAttribute (types .AttributeKeySentAmount , msg .SentAmount .String ()),
540+ sdk .NewAttribute (types .AttributeKeySentAsset , msg .SentAsset .Symbol ),
541+ sdk .NewAttribute (types .AttributeKeyReceivedAmount , swapAmount .String ()),
542+ sdk .NewAttribute (types .AttributeKeyPool , pool .String ()),
543+ ),
544+ sdk .NewEvent (
545+ sdk .EventTypeMessage ,
546+ sdk .NewAttribute (sdk .AttributeKeyModule , types .AttributeValueCategory ),
547+ sdk .NewAttribute (sdk .AttributeKeySender , msg .Signer ),
548+ ),
549+ })
550+ return & types.MsgSwapResponse {}, nil
551+
461552 var (
462553 priceImpact sdk.Uint
463554 )
0 commit comments