code.vegaprotocol.io/vega@v0.79.0/core/types/amm.go (about)

     1  // Copyright (C) 2023 Gobalsky Labs Limited
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <http://www.gnu.org/licenses/>.
    15  
    16  package types
    17  
    18  import (
    19  	"code.vegaprotocol.io/vega/libs/num"
    20  	"code.vegaprotocol.io/vega/libs/ptr"
    21  	commandspb "code.vegaprotocol.io/vega/protos/vega/commands/v1"
    22  	eventspb "code.vegaprotocol.io/vega/protos/vega/events/v1"
    23  )
    24  
    25  type OrderbookShapeResult struct {
    26  	AmmParty string
    27  	Buys     []*Order
    28  	Sells    []*Order
    29  	Approx   bool
    30  }
    31  
    32  // AMMBaseCommand these 3 parameters should be always specified
    33  // in both the the submit and amend commands.
    34  type AMMBaseCommand struct {
    35  	MarketID                  string
    36  	Party                     string
    37  	SlippageTolerance         num.Decimal
    38  	ProposedFee               num.Decimal
    39  	MinimumPriceChangeTrigger num.Decimal
    40  }
    41  
    42  type ConcentratedLiquidityParameters struct {
    43  	Base                 *num.Uint
    44  	LowerBound           *num.Uint
    45  	UpperBound           *num.Uint
    46  	LeverageAtLowerBound *num.Decimal
    47  	LeverageAtUpperBound *num.Decimal
    48  	DataSourceID         *string
    49  }
    50  
    51  func (p *ConcentratedLiquidityParameters) ToProtoEvent() *eventspb.AMM_ConcentratedLiquidityParameters {
    52  	var upper, lower *string
    53  	if p.UpperBound != nil {
    54  		upper = ptr.From(p.UpperBound.String())
    55  	}
    56  
    57  	if p.LowerBound != nil {
    58  		lower = ptr.From(p.LowerBound.String())
    59  	}
    60  
    61  	var lowerLeverage, upperLeverage *string
    62  	if p.LeverageAtLowerBound != nil {
    63  		lowerLeverage = ptr.From(p.LeverageAtLowerBound.String())
    64  	}
    65  
    66  	if p.LeverageAtUpperBound != nil {
    67  		upperLeverage = ptr.From(p.LeverageAtUpperBound.String())
    68  	}
    69  	return &eventspb.AMM_ConcentratedLiquidityParameters{
    70  		Base:                 p.Base.String(),
    71  		LowerBound:           lower,
    72  		UpperBound:           upper,
    73  		LeverageAtUpperBound: upperLeverage,
    74  		LeverageAtLowerBound: lowerLeverage,
    75  		DataSourceId:         p.DataSourceID,
    76  	}
    77  }
    78  
    79  func (p ConcentratedLiquidityParameters) Clone() *ConcentratedLiquidityParameters {
    80  	ret := &ConcentratedLiquidityParameters{}
    81  	if p.Base != nil {
    82  		ret.Base = p.Base.Clone()
    83  	}
    84  	if p.LowerBound != nil {
    85  		ret.LowerBound = p.LowerBound.Clone()
    86  	}
    87  	if p.UpperBound != nil {
    88  		ret.UpperBound = p.UpperBound.Clone()
    89  	}
    90  	if p.LeverageAtLowerBound != nil {
    91  		cpy := *p.LeverageAtLowerBound
    92  		ret.LeverageAtLowerBound = &cpy
    93  	}
    94  	if p.LeverageAtUpperBound != nil {
    95  		cpy := *p.LeverageAtUpperBound
    96  		ret.LeverageAtUpperBound = &cpy
    97  	}
    98  
    99  	if p.DataSourceID != nil {
   100  		cpy := *p.DataSourceID
   101  		ret.DataSourceID = &cpy
   102  	}
   103  
   104  	if p.DataSourceID != nil {
   105  		cpy := *p.DataSourceID
   106  		ret.DataSourceID = &cpy
   107  	}
   108  	return ret
   109  }
   110  
   111  func (p ConcentratedLiquidityParameters) IntoProto() *commandspb.SubmitAMM_ConcentratedLiquidityParameters {
   112  	ret := &commandspb.SubmitAMM_ConcentratedLiquidityParameters{}
   113  	return ret
   114  }
   115  
   116  type SubmitAMM struct {
   117  	AMMBaseCommand
   118  	CommitmentAmount *num.Uint
   119  	Parameters       *ConcentratedLiquidityParameters
   120  }
   121  
   122  func NewSubmitAMMFromProto(
   123  	submitAMM *commandspb.SubmitAMM,
   124  	party string,
   125  ) *SubmitAMM {
   126  	// all parameters have been validated by the command package here.
   127  	var (
   128  		upperBound, lowerBound       *num.Uint
   129  		upperLeverage, lowerLeverage *num.Decimal
   130  	)
   131  
   132  	commitment, _ := num.UintFromString(submitAMM.CommitmentAmount, 10)
   133  
   134  	params := submitAMM.ConcentratedLiquidityParameters
   135  	base, _ := num.UintFromString(params.Base, 10)
   136  	if params.LowerBound != nil {
   137  		lowerBound, _ = num.UintFromString(*params.LowerBound, 10)
   138  	}
   139  
   140  	if params.LeverageAtLowerBound != nil {
   141  		leverage, _ := num.DecimalFromString(*params.LeverageAtLowerBound)
   142  		lowerLeverage = ptr.From(leverage)
   143  	}
   144  
   145  	if params.UpperBound != nil {
   146  		upperBound, _ = num.UintFromString(*params.UpperBound, 10)
   147  	}
   148  
   149  	if params.LeverageAtUpperBound != nil {
   150  		leverage, _ := num.DecimalFromString(*params.LeverageAtUpperBound)
   151  		upperLeverage = ptr.From(leverage)
   152  	}
   153  
   154  	if params.LeverageAtUpperBound != nil {
   155  		leverage, _ := num.DecimalFromString(*params.LeverageAtUpperBound)
   156  		upperLeverage = ptr.From(leverage)
   157  	}
   158  
   159  	minimumPriceChangeTrigger := num.DecimalZero()
   160  	if submitAMM.MinimumPriceChangeTrigger != nil {
   161  		minimumPriceChangeTrigger, _ = num.DecimalFromString(*submitAMM.MinimumPriceChangeTrigger)
   162  	}
   163  
   164  	slippage, _ := num.DecimalFromString(submitAMM.SlippageTolerance)
   165  	proposedFee, _ := num.DecimalFromString(submitAMM.ProposedFee)
   166  	return &SubmitAMM{
   167  		AMMBaseCommand: AMMBaseCommand{
   168  			Party:                     party,
   169  			MarketID:                  submitAMM.MarketId,
   170  			SlippageTolerance:         slippage,
   171  			ProposedFee:               proposedFee,
   172  			MinimumPriceChangeTrigger: minimumPriceChangeTrigger,
   173  		},
   174  		CommitmentAmount: commitment,
   175  		Parameters: &ConcentratedLiquidityParameters{
   176  			Base:                 base,
   177  			LowerBound:           lowerBound,
   178  			UpperBound:           upperBound,
   179  			LeverageAtLowerBound: lowerLeverage,
   180  			LeverageAtUpperBound: upperLeverage,
   181  			DataSourceID:         submitAMM.ConcentratedLiquidityParameters.DataSourceId,
   182  		},
   183  	}
   184  }
   185  
   186  func (s SubmitAMM) IntoProto() *commandspb.SubmitAMM {
   187  	// set defaults, this is why we don't use a pointer receiver
   188  	zero := num.UintZero() // this call clones, we are just calling String(), so we only need a single 0-value
   189  	if s.CommitmentAmount == nil {
   190  		s.CommitmentAmount = zero
   191  	}
   192  	// create a shallow copy, because this field is a pointer, we mustn't reassign anything
   193  	cpy := *s.Parameters
   194  	s.Parameters = &cpy
   195  	// this should be split to a different function, because this is modifying the
   196  	var lower, upper, leverageLower, leverageUpper *string
   197  	var base string
   198  	if s.Parameters.LowerBound != nil {
   199  		lower = ptr.From(s.Parameters.LowerBound.String())
   200  	}
   201  
   202  	if s.Parameters.LeverageAtLowerBound != nil {
   203  		leverageLower = ptr.From(s.Parameters.LeverageAtLowerBound.String())
   204  	}
   205  
   206  	if s.Parameters.UpperBound != nil {
   207  		upper = ptr.From(s.Parameters.UpperBound.String())
   208  	}
   209  
   210  	if s.Parameters.LeverageAtUpperBound != nil {
   211  		leverageUpper = ptr.From(s.Parameters.LeverageAtUpperBound.String())
   212  	}
   213  
   214  	if s.Parameters.Base != nil {
   215  		base = s.Parameters.Base.String()
   216  	}
   217  
   218  	minimumPriceChangeTrigger := ptr.From(s.MinimumPriceChangeTrigger.String())
   219  	return &commandspb.SubmitAMM{
   220  		MarketId:          s.MarketID,
   221  		CommitmentAmount:  s.CommitmentAmount.String(),
   222  		SlippageTolerance: s.SlippageTolerance.String(),
   223  		ProposedFee:       s.ProposedFee.String(),
   224  		ConcentratedLiquidityParameters: &commandspb.SubmitAMM_ConcentratedLiquidityParameters{
   225  			UpperBound:           upper,
   226  			LowerBound:           lower,
   227  			Base:                 base,
   228  			LeverageAtUpperBound: leverageUpper,
   229  			LeverageAtLowerBound: leverageLower,
   230  		},
   231  		MinimumPriceChangeTrigger: minimumPriceChangeTrigger,
   232  	}
   233  }
   234  
   235  type AmendAMM struct {
   236  	AMMBaseCommand
   237  	CommitmentAmount *num.Uint
   238  	Parameters       *ConcentratedLiquidityParameters
   239  }
   240  
   241  func (a AmendAMM) IntoProto() *commandspb.AmendAMM {
   242  	ret := &commandspb.AmendAMM{
   243  		MarketId:          a.MarketID,
   244  		CommitmentAmount:  nil,
   245  		SlippageTolerance: a.SlippageTolerance.String(),
   246  		ProposedFee:       nil,
   247  	}
   248  	if a.CommitmentAmount != nil {
   249  		ret.CommitmentAmount = ptr.From(a.CommitmentAmount.String())
   250  	}
   251  	if !a.ProposedFee.IsZero() {
   252  		ret.ProposedFee = ptr.From(a.ProposedFee.String())
   253  	}
   254  	if a.Parameters == nil {
   255  		return ret
   256  	}
   257  	ret.ConcentratedLiquidityParameters = &commandspb.AmendAMM_ConcentratedLiquidityParameters{}
   258  	if a.Parameters.Base != nil {
   259  		ret.ConcentratedLiquidityParameters.Base = a.Parameters.Base.String()
   260  	}
   261  	if a.Parameters.LowerBound != nil {
   262  		ret.ConcentratedLiquidityParameters.LowerBound = ptr.From(a.Parameters.LowerBound.String())
   263  	}
   264  	if a.Parameters.UpperBound != nil {
   265  		ret.ConcentratedLiquidityParameters.UpperBound = ptr.From(a.Parameters.UpperBound.String())
   266  	}
   267  	if a.Parameters.LeverageAtLowerBound != nil {
   268  		ret.ConcentratedLiquidityParameters.LeverageAtLowerBound = ptr.From(a.Parameters.LeverageAtLowerBound.String())
   269  	}
   270  	if a.Parameters.LeverageAtUpperBound != nil {
   271  		ret.ConcentratedLiquidityParameters.LeverageAtUpperBound = ptr.From(a.Parameters.LeverageAtUpperBound.String())
   272  	}
   273  	ret.MinimumPriceChangeTrigger = ptr.From(a.MinimumPriceChangeTrigger.String())
   274  	return ret
   275  }
   276  
   277  func NewAmendAMMFromProto(
   278  	amendAMM *commandspb.AmendAMM,
   279  	party string,
   280  ) *AmendAMM {
   281  	// all parameters have been validated by the command package here.
   282  
   283  	var commitment, base, lowerBound, upperBound *num.Uint
   284  	var leverageAtUpperBound, leverageAtLowerBound *num.Decimal
   285  	var dataSourceID *string
   286  
   287  	// this is optional
   288  	if amendAMM.CommitmentAmount != nil {
   289  		commitment, _ = num.UintFromString(*amendAMM.CommitmentAmount, 10)
   290  	}
   291  
   292  	//  this too, and the parameters it contains
   293  	if amendAMM.ConcentratedLiquidityParameters != nil {
   294  		base, _ = num.UintFromString(amendAMM.ConcentratedLiquidityParameters.Base, 10)
   295  		if amendAMM.ConcentratedLiquidityParameters.LowerBound != nil {
   296  			lowerBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.LowerBound, 10)
   297  		}
   298  		if amendAMM.ConcentratedLiquidityParameters.UpperBound != nil {
   299  			upperBound, _ = num.UintFromString(*amendAMM.ConcentratedLiquidityParameters.UpperBound, 10)
   300  		}
   301  		if amendAMM.ConcentratedLiquidityParameters.LeverageAtLowerBound != nil {
   302  			leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtLowerBound)
   303  			leverageAtLowerBound = ptr.From(leverage)
   304  		}
   305  		if amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound != nil {
   306  			leverage, _ := num.DecimalFromString(*amendAMM.ConcentratedLiquidityParameters.LeverageAtUpperBound)
   307  			leverageAtUpperBound = ptr.From(leverage)
   308  		}
   309  
   310  		dataSourceID = amendAMM.ConcentratedLiquidityParameters.DataSourceId
   311  	}
   312  
   313  	slippage, _ := num.DecimalFromString(amendAMM.SlippageTolerance)
   314  
   315  	var proposedFee num.Decimal
   316  	if amendAMM.ProposedFee != nil {
   317  		proposedFee, _ = num.DecimalFromString(*amendAMM.ProposedFee)
   318  	}
   319  
   320  	minimumPriceChangeTrigger := num.DecimalZero()
   321  	if amendAMM.MinimumPriceChangeTrigger != nil {
   322  		minimumPriceChangeTrigger, _ = num.DecimalFromString(*amendAMM.MinimumPriceChangeTrigger)
   323  	}
   324  
   325  	return &AmendAMM{
   326  		AMMBaseCommand: AMMBaseCommand{
   327  			Party:                     party,
   328  			MarketID:                  amendAMM.MarketId,
   329  			SlippageTolerance:         slippage,
   330  			ProposedFee:               proposedFee,
   331  			MinimumPriceChangeTrigger: minimumPriceChangeTrigger,
   332  		},
   333  		CommitmentAmount: commitment,
   334  		Parameters: &ConcentratedLiquidityParameters{
   335  			Base:                 base,
   336  			LowerBound:           lowerBound,
   337  			UpperBound:           upperBound,
   338  			LeverageAtUpperBound: leverageAtUpperBound,
   339  			LeverageAtLowerBound: leverageAtLowerBound,
   340  			DataSourceID:         dataSourceID,
   341  		},
   342  	}
   343  }
   344  
   345  type CancelAMM struct {
   346  	MarketID string
   347  	Party    string
   348  	Method   AMMCancellationMethod
   349  }
   350  
   351  func (c CancelAMM) IntoProto() *commandspb.CancelAMM {
   352  	return &commandspb.CancelAMM{
   353  		MarketId: c.MarketID,
   354  		Method:   c.Method,
   355  	}
   356  }
   357  
   358  func NewCancelAMMFromProto(
   359  	cancelAMM *commandspb.CancelAMM,
   360  	party string,
   361  ) *CancelAMM {
   362  	return &CancelAMM{
   363  		MarketID: cancelAMM.MarketId,
   364  		Party:    party,
   365  		Method:   cancelAMM.Method,
   366  	}
   367  }
   368  
   369  type AMMCancellationMethod = commandspb.CancelAMM_Method
   370  
   371  const (
   372  	AMMCancellationMethodUnspecified AMMCancellationMethod = commandspb.CancelAMM_METHOD_UNSPECIFIED
   373  	AMMCancellationMethodImmediate                         = commandspb.CancelAMM_METHOD_IMMEDIATE
   374  	AMMCancellationMethodReduceOnly                        = commandspb.CancelAMM_METHOD_REDUCE_ONLY
   375  )
   376  
   377  type AMMStatusReason = eventspb.AMM_StatusReason
   378  
   379  const (
   380  	AMMStatusReasonUnspecified           AMMStatusReason = eventspb.AMM_STATUS_REASON_UNSPECIFIED
   381  	AMMStatusReasonCancelledByParty                      = eventspb.AMM_STATUS_REASON_CANCELLED_BY_PARTY
   382  	AMMStatusReasonCannotFillCommitment                  = eventspb.AMM_STATUS_REASON_CANNOT_FILL_COMMITMENT
   383  	AMMStatusReasonPartyAlreadyOwnsAPool                 = eventspb.AMM_STATUS_REASON_PARTY_ALREADY_OWNS_AMM_FOR_MARKET
   384  	AMMStatusReasonPartyClosedOut                        = eventspb.AMM_STATUS_REASON_PARTY_CLOSED_OUT
   385  	AMMStatusReasonMarketClosed                          = eventspb.AMM_STATUS_REASON_MARKET_CLOSED
   386  	AMMStatusReasonCommitmentTooLow                      = eventspb.AMM_STATUS_REASON_COMMITMENT_TOO_LOW
   387  	AMMStatusReasonCannotRebase                          = eventspb.AMM_STATUS_REASON_CANNOT_REBASE
   388  )
   389  
   390  type AMMPoolStatus = eventspb.AMM_Status
   391  
   392  const (
   393  	AMMPoolStatusUnspecified AMMPoolStatus = eventspb.AMM_STATUS_UNSPECIFIED
   394  	AMMPoolStatusActive                    = eventspb.AMM_STATUS_ACTIVE
   395  	AMMPoolStatusRejected                  = eventspb.AMM_STATUS_REJECTED
   396  	AMMPoolStatusCancelled                 = eventspb.AMM_STATUS_CANCELLED
   397  	AMMPoolStatusStopped                   = eventspb.AMM_STATUS_STOPPED
   398  	AMMPoolStatusReduceOnly                = eventspb.AMM_STATUS_REDUCE_ONLY
   399  	AMMPoolStatusPending                   = eventspb.AMM_STATUS_PENDING
   400  )