Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

factory_param.gno

3.45 Kb · 135 lines
  1package pool
  2
  3import (
  4	"strings"
  5
  6	"gno.land/p/gnoswap/consts/v1"
  7	u256 "gno.land/p/gnoswap/uint256/v1"
  8	ufmt "gno.land/p/nt/ufmt/v0"
  9	"gno.land/r/gnoswap/pool"
 10)
 11
 12const (
 13	FeeTier100   uint32 = 100
 14	FeeTier500   uint32 = 500
 15	FeeTier3000  uint32 = 3000
 16	FeeTier10000 uint32 = 10000
 17)
 18
 19const (
 20	MIN_SQRT_RATIO string = "4295128739"
 21	MAX_SQRT_RATIO string = "1461446703485210103287273052203988822378723970342"
 22)
 23
 24// poolCreateConfig holds the essential parameters for creating a new pool.
 25type poolCreateConfig struct {
 26	token0Path       string
 27	token1Path       string
 28	fee              uint32
 29	sqrtPriceX96     *u256.Uint
 30	tickSpacing      int32
 31	slot0FeeProtocol uint8
 32}
 33
 34// newPoolParams defines the essential parameters for creating a new pool.
 35func newPoolParams(
 36	token0Path string,
 37	token1Path string,
 38	fee uint32,
 39	sqrtPriceX96 string,
 40	tickSpacing int32,
 41	slot0FeeProtocol uint8,
 42) *poolCreateConfig {
 43	price := u256.MustFromDecimal(sqrtPriceX96)
 44	return &poolCreateConfig{
 45		token0Path:       token0Path,
 46		token1Path:       token1Path,
 47		fee:              fee,
 48		sqrtPriceX96:     price,
 49		tickSpacing:      tickSpacing,
 50		slot0FeeProtocol: slot0FeeProtocol,
 51	}
 52}
 53
 54// Returns:
 55//   - sqrtPriceX96: configured initial square-root price as a mutable u256
 56//     integer in Q64.96 representation.
 57func (p *poolCreateConfig) SqrtPriceX96() *u256.Uint { return p.sqrtPriceX96 }
 58
 59// Returns:
 60//   - tickSpacing: configured spacing between usable initialized ticks.
 61func (p *poolCreateConfig) TickSpacing() int32 { return p.tickSpacing }
 62
 63// Returns:
 64//   - token0Path: configured token0 contract path.
 65func (p *poolCreateConfig) Token0Path() string { return p.token0Path }
 66
 67// Returns:
 68//   - token1Path: configured token1 contract path.
 69func (p *poolCreateConfig) Token1Path() string { return p.token1Path }
 70
 71// Returns:
 72//   - fee: configured pool fee tier as a uint32 fee-unit value.
 73func (p *poolCreateConfig) Fee() uint32 { return p.fee }
 74
 75func (p *poolCreateConfig) update() error {
 76	token0Path := p.token0Path
 77	token1Path := p.token1Path
 78
 79	// Always validate that the price is within valid range
 80	if err := validateSqrtPriceX96(p.sqrtPriceX96); err != nil {
 81		return err
 82	}
 83
 84	if !p.isInOrder() {
 85		token0Path, token1Path = token1Path, token0Path
 86
 87		// newPrice = 2^192 / oldPrice
 88		newPrice := u256.Zero().Div(consts.Q192(), p.sqrtPriceX96)
 89
 90		// Check if calculated price is within valid range
 91		if err := validateSqrtPriceX96(newPrice); err != nil {
 92			return err
 93		}
 94
 95		p.sqrtPriceX96 = newPrice
 96	}
 97
 98	p.token0Path = token0Path
 99	p.token1Path = token1Path
100
101	return nil
102}
103
104// isInOrder checks if token paths are in lexicographical (or, alphabetical) order
105func (p *poolCreateConfig) isInOrder() bool {
106	if strings.Compare(p.token0Path, p.token1Path) < 0 {
107		return true
108	}
109	return false
110}
111
112func (p *poolCreateConfig) poolPath() string {
113	return pool.GetPoolPath(p.token0Path, p.token1Path, p.fee)
114}
115
116// validateSqrtPriceX96 validates that the given sqrtPriceX96 is within valid range
117func validateSqrtPriceX96(sqrtPriceX96 *u256.Uint) error {
118	// Valid range is [minSqrtRatio, maxSqrtRatio) - same as TickMathGetTickAtSqrtRatio
119	if sqrtPriceX96.Lt(consts.MinSqrtRatio()) || sqrtPriceX96.Gte(consts.MaxSqrtRatio()) {
120		return makeErrorWithDetails(
121			errOutOfRange,
122			ufmt.Sprintf("sqrtPriceX96(%s) is out of range", sqrtPriceX96.ToString()),
123		)
124	}
125	return nil
126}
127
128func isValidFeeTier(feeTier uint32) bool {
129	switch feeTier {
130	case FeeTier100, FeeTier500, FeeTier3000, FeeTier10000:
131		return true
132	}
133
134	return false
135}