Kind Realm (renderable)
Name pool
Namespace gnoswap
Exported functions 90
Module gno.land/r/gnoswap/pool
gno 0.9 pool.gno gno
⧉
1 package pool 2 3 import ( 4 bptree "gno.land/p/nt/bptree/v0" 5 ufmt "gno.land/p/nt/ufmt/v0" 6 7 u256 "gno.land/p/gnoswap/uint256/v1" 8 Burn (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, tickLower int32, tickUpper int32, liquidityAmount string, positionCaller string) (string, string)
Collect (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, recipient string, tickLower int32, tickUpper int32, amount0Requested string, amount1Requested string) (string, string)
CollectProtocol (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, recipient string, amount0Requested string, amount1Requested string) (string, string)
CollectSwapFee (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, recipient string, tickLower int32, tickUpper int32, amount0Requested string, amount1Requested string) (amount0 string, amount1 string, fee0 string, fee1 string)
CreatePool (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, sqrtPriceX96 string)
DecodeTickKey (key string) int32
DefaultObservation () struct{blockTimestamp int64; tickCumulative int64; secondsPerLiquidityCumulativeX128 string; initialized bool}
DrySwap (token0Path string, token1Path string, fee uint32, zeroForOne bool, amountSpecified string, sqrtPriceLimitX96 string) (string, string, interface {Error func() string})
EncodePositionKey (tickLower int32, tickUpper int32) string
EncodeTickKey (tick int32) string
ExistsPoolPath (poolPath string) bool
GetBalances (poolPath string) (int64, int64, interface {Error func() string})
GetBalanceToken0 (poolPath string) (int64, interface {Error func() string})
GetBalanceToken1 (poolPath string) (int64, interface {Error func() string})
GetFee (poolPath string) (uint32, interface {Error func() string})
GetFeeAmountTickSpacing (fee uint32) (spacing int32, err interface {Error func() string})
GetFeeAmountTickSpacings () map[uint32]int32
GetFeeGrowthGlobal0X128 (poolPath string) (string, interface {Error func() string})
GetFeeGrowthGlobal1X128 (poolPath string) (string, interface {Error func() string})
GetFeeGrowthGlobalX128 (poolPath string) (string, string, interface {Error func() string})
GetImplementationPackagePath () string
GetInitializedTicksInRange (poolPath string, tickLower int32, tickUpper int32) ([]int32, interface {Error func() string})
GetLiquidity (poolPath string) (string, interface {Error func() string})
GetObservationAt (poolPath string, index uint16) (struct{blockTimestamp int64; tickCumulative int64; secondsPerLiquidityCumulativeX128 string; initialized bool}, interface {Error func() string})
GetPendingProtocolFees () map[string]int64
GetPoolCreationFee () int64
GetPoolPath (token0Path string, token1Path string, fee uint32) string
GetPoolPositions (poolPath string) *gno.land/p/nt/bptree/rotree/v0.ReadOnlyTree
GetPools () *gno.land/p/nt/bptree/rotree/v0.ReadOnlyTree
GetPositionFeeGrowthInside0LastX128 (poolPath string, key string) (string, interface {Error func() string})
GetPositionFeeGrowthInside1LastX128 (poolPath string, key string) (string, interface {Error func() string})
GetPositionFeeGrowthInsideLastX128 (poolPath string, key string) (string, string, interface {Error func() string})
GetPositionLiquidity (poolPath string, key string) (string, interface {Error func() string})
GetPositionTokensOwed (poolPath string, key string) (int64, int64, interface {Error func() string})
GetPositionTokensOwed0 (poolPath string, key string) (int64, interface {Error func() string})
GetPositionTokensOwed1 (poolPath string, key string) (int64, interface {Error func() string})
GetProtocolFeesToken0 (poolPath string) (int64, interface {Error func() string})
GetProtocolFeesToken1 (poolPath string) (int64, interface {Error func() string})
GetProtocolFeesTokens (poolPath string) (int64, int64, interface {Error func() string})
GetSlot0 (poolPath string) struct{sqrtPriceX96 *gno.land/p/gnoswap/uint256/v1.Uint; tick int32; feeProtocol uint8; unlocked bool; observationIndex uint16; observationCardinality uint16; observationCardinalityNext uint16}
GetSlot0FeeProtocol (poolPath string) (uint8, interface {Error func() string})
GetSlot0SqrtPriceX96 (poolPath string) (string, interface {Error func() string})
GetSlot0Tick (poolPath string) (int32, interface {Error func() string})
GetSlot0Unlocked (poolPath string) (bool, interface {Error func() string})
GetTickBitmaps (poolPath string, wordPos int16) (string, interface {Error func() string})
GetTickCumulativeOutside (poolPath string, tick int32) (int64, interface {Error func() string})
GetTickFeeGrowthOutside0X128 (poolPath string, tick int32) (string, interface {Error func() string})
GetTickFeeGrowthOutside1X128 (poolPath string, tick int32) (string, interface {Error func() string})
GetTickFeeGrowthOutsideX128 (poolPath string, tick int32) (string, string, interface {Error func() string})
GetTickInfo (poolPath string, tick int32) (struct{liquidityGross string; liquidityNet string; feeGrowthOutside0X128 string; feeGrowthOutside1X128 string; tickCumulativeOutside int64; secondsPerLiquidityOutsideX128 string; secondsOutside uint32; initialized bool}, interface {Error func() string})
GetTickInitialized (poolPath string, tick int32) (bool, interface {Error func() string})
GetTickLiquidityGross (poolPath string, tick int32) (string, interface {Error func() string})
GetTickLiquidityNet (poolPath string, tick int32) (string, interface {Error func() string})
GetTickSecondsOutside (poolPath string, tick int32) (uint32, interface {Error func() string})
GetTickSecondsPerLiquidityOutsideX128 (poolPath string, tick int32) (string, interface {Error func() string})
GetTickSpacing (poolPath string) (int32, interface {Error func() string})
GetToken0Path (poolPath string) (string, interface {Error func() string})
GetToken1Path (poolPath string) (string, interface {Error func() string})
GetWithdrawalFee () uint64
IncreaseObservationCardinalityNext (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, cardinalityNext uint16)
MakeObservation (blockTimestamp int64, tickCumulative int64, secondsPerLiquidityCumulativeX128 string, initialized bool) struct{blockTimestamp int64; tickCumulative int64; secondsPerLiquidityCumulativeX128 string; initialized bool}
Mint (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, tickLower int32, tickUpper int32, liquidityAmount string, positionCaller string) (string, string)
NewCallbackMarker () *gno.land/r/gnoswap/pool.CallbackMarker
NewDefaultFeeAmountTickSpacing () map[uint32]int32
NewDefaultPositionInfo () struct{liquidity string; feeGrowthInside0LastX128 string; feeGrowthInside1LastX128 string; tokensOwed0 int64; tokensOwed1 int64}
NewObservationsTree () *gno.land/p/nt/bptree/v0.BPTree
NewObservationTree () *gno.land/r/gnoswap/pool.ObservationTree
NewPool (token0Path string, token1Path string, fee uint32, sqrtPriceX96 *gno.land/p/gnoswap/uint256/v1.Uint, tickSpacing int32, tick int32, slot0FeeProtocol uint8) *gno.land/r/gnoswap/pool.Pool
NewPoolObservationsTree (currentTime int64) *gno.land/r/gnoswap/pool.ObservationTree
NewPoolPositionsTree () *gno.land/p/nt/bptree/v0.BPTree
NewPoolStore (kvStore interface {AddAuthorizedCaller func(int, .uverse.realm, .uverse.address, gno.land/p/gnoswap/store/v1.Permission) .uverse.error; Delete func(int, .uverse.realm, string) .uverse.error; Get func(string) (interface {}, .uverse.error); GetAddress func(string) (.uverse.address, .uverse.error); GetAllKeys func() ([]string, .uverse.error); GetAuthorizedCallers func() (map[.uverse.address]gno.land/p/gnoswap/store/v1.Permission, .uverse.error); GetBPTree func(string) (*gno.land/p/nt/bptree/v0.BPTree, .uverse.error); GetBool func(string) (bool, .uverse.error); GetDomainAddress func() .uverse.address; GetInt64 func(string) (int64, .uverse.error); GetString func(string) (string, .uverse.error); GetUint64 func(string) (uint64, .uverse.error); Has func(string) bool; IsWriteAuthorized func(.uverse.address) bool; RemoveAuthorizedCaller func(int, .uverse.realm, .uverse.address) .uverse.error; Set func(int, .uverse.realm, string, interface {}) .uverse.error; UpdateAuthorizedCaller func(int, .uverse.realm, .uverse.address, gno.land/p/gnoswap/store/v1.Permission) .uverse.error}) interface {GetFeeAmountTickSpacing func() map[uint32]int32; GetObservations func() *gno.land/p/nt/bptree/v0.BPTree; GetPendingProtocolFee func(string) int64; GetPendingProtocolFees func() map[string]int64; GetPoolCreationFee func() int64; GetPools func() *gno.land/p/nt/bptree/v0.BPTree; GetSlot0FeeProtocol func() uint8; GetSwapEndHook func() func(.uverse.realm, string) .uverse.error; GetSwapStartHook func() func(.uverse.realm, string, int64); GetTickCrossHook func() func(.uverse.realm, string, int32, bool, int64); GetUnlocked func() bool; GetWithdrawalFeeBPS func() uint64; HasFeeAmountTickSpacing func() bool; HasObservations func() bool; HasPendingProtocolFees func() bool; HasPoolCreationFee func() bool; HasPools func() bool; HasSlot0FeeProtocol func() bool; HasSwapEndHook func() bool; HasSwapStartHook func() bool; HasTickCrossHook func() bool; HasUnlocked func() bool; HasWithdrawalFeeBPS func() bool; RemovePendingProtocolFee func(int, .uverse.realm, string) .uverse.error; SetFeeAmountTickSpacing func(int, .uverse.realm, map[uint32]int32) .uverse.error; SetObservations func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetPendingProtocolFee func(int, .uverse.realm, string, int64) .uverse.error; SetPendingProtocolFees func(int, .uverse.realm, map[string]int64) .uverse.error; SetPoolCreationFee func(int, .uverse.realm, int64) .uverse.error; SetPools func(int, .uverse.realm, *gno.land/p/nt/bptree/v0.BPTree) .uverse.error; SetSlot0FeeProtocol func(int, .uverse.realm, uint8) .uverse.error; SetSwapEndHook func(int, .uverse.realm, func(.uverse.realm, string) .uverse.error) .uverse.error; SetSwapStartHook func(int, .uverse.realm, func(.uverse.realm, string, int64)) .uverse.error; SetTickCrossHook func(int, .uverse.realm, func(.uverse.realm, string, int32, bool, int64)) .uverse.error; SetUnlocked func(int, .uverse.realm, bool) .uverse.error; SetWithdrawalFeeBPS func(int, .uverse.realm, uint64) .uverse.error}
NewPoolsTree () *gno.land/p/nt/bptree/v0.BPTree
NewPoolTicksTree () *gno.land/p/nt/bptree/v0.BPTree
NewPositionInfo () struct{liquidity string; feeGrowthInside0LastX128 string; feeGrowthInside1LastX128 string; tokensOwed0 int64; tokensOwed1 int64}
NewSlot0 (sqrtPriceX96 *gno.land/p/gnoswap/uint256/v1.Uint, tick int32, feeProtocol uint8, unlocked bool) struct{sqrtPriceX96 *gno.land/p/gnoswap/uint256/v1.Uint; tick int32; feeProtocol uint8; unlocked bool; observationIndex uint16; observationCardinality uint16; observationCardinalityNext uint16}
NewTickInfo () struct{liquidityGross string; liquidityNet string; feeGrowthOutside0X128 string; feeGrowthOutside1X128 string; tickCumulativeOutside int64; secondsPerLiquidityOutsideX128 string; secondsOutside uint32; initialized bool}
NewTokenPair () struct{token0 int64; token1 int64}
Observe (poolPath string, secondsAgos []uint32) ([]int64, []string, interface {Error func() string})
OracleConsult (poolPath string, secondsAgo uint32) (int32, string, interface {Error func() string})
RegisterInitializer (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, initializer func(int, .uverse.realm, gno.land/r/gnoswap/pool.IPoolStore) gno.land/r/gnoswap/pool.IPool)
Render (path string) string
SetFeeProtocol (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, feeProtocol0 uint8, feeProtocol1 uint8)
SetPoolCreationFee (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, fee int64)
SetSwapEndHook (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, hook func(.uverse.realm, string) .uverse.error)
SetSwapStartHook (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, hook func(.uverse.realm, string, int64))
SetTickCrossHook (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, hook func(.uverse.realm, string, int32, bool, int64))
SetWithdrawalFee (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, fee uint64)
SnapshotCumulativesInside (poolPath string, tickLower int32, tickUpper int32) (int64, string, uint32, interface {Error func() string})
Swap (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, token0Path string, token1Path string, fee uint32, recipient string, zeroForOne bool, amountSpecified string, sqrtPriceLimitX96 string, swapCallback func(.uverse.realm, int64, int64, *gno.land/r/gnoswap/pool.CallbackMarker) .uverse.error) (string, string)
UpgradeImpl (cur interface {.seal func(); Address func() .uverse.address; IsCode func() bool; IsCurrent func() bool; IsEphemeral func() bool; IsUser func() bool; IsUserCall func() bool; IsUserRun func() bool; PkgPath func() string; Previous func() .uverse.realm; String func() string; Sub func(string) .uverse.realm; Subpath func() string}, packagePath string)
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
)
9
10 // Pool describes a single pool's state.
11 // A pool is identified with a unique key (token0, token1, fee), where token0 < token1.
12 type Pool struct {
13 // token0/token1 path of the pool
14 token0Path string
15 token1Path string
16 fee uint32 // fee tier of the pool
17 tickSpacing int32 // spacing between ticks
18 slot0 Slot0
19 balances TokenPair // balances of the pool
20 protocolFees TokenPair
21 feeGrowthGlobal0X128 *u256.Uint // uint256
22 feeGrowthGlobal1X128 *u256.Uint // uint256
23 liquidity *u256.Uint // total amount of active liquidity in the pool (within current tick range)
24 ticks *bptree.BPTree // tick(int32) -> TickInfo
25 tickBitmaps map [ int16 ] string // tick(wordPos)(int16) -> bitMap(tickWord ^ mask)(string)
26 positions *bptree.BPTree // maps encoded lower/upper tick pairs to aggregate pool accounting
27 }
28
29 // Pool Getters methods
30 // PoolPath returns the canonical pool path derived from token0, token1, and the fee tier.
31 //
32 // Returns:
33 // - string: pool identifier assembled from the pool's token paths and fee.
34 func (p *Pool) PoolPath() string { return GetPoolPath(p.token0Path, p.token1Path, p.fee) }
35
36 // Token0Path returns the path of the pool's token0 asset.
37 //
38 // Returns:
39 // - string: token0 path stored in the pool.
40 func (p *Pool) Token0Path() string { return p.token0Path }
41
42 // Token1Path returns the path of the pool's token1 asset.
43 //
44 // Returns:
45 // - string: token1 path stored in the pool.
46 func (p *Pool) Token1Path() string { return p.token1Path }
47
48 // Fee returns the pool's fee tier.
49 //
50 // Returns:
51 // - uint32: fee tier used by swaps in this pool.
52 func (p *Pool) Fee() uint32 { return p.fee }
53
54 // Balances returns the pool's current token balances.
55 //
56 // Returns:
57 // - TokenPair: token0 and token1 balances tracked by the pool.
58 func (p *Pool) Balances() TokenPair { return p.balances }
59
60 // BalanceToken0 returns the pool's current token0 balance.
61 //
62 // Returns:
63 // - int64: token0 balance available in the pool.
64 func (p *Pool) BalanceToken0() int64 { return p.balances.token0 }
65
66 // BalanceToken1 returns the pool's current token1 balance.
67 //
68 // Returns:
69 // - int64: token1 balance available in the pool.
70 func (p *Pool) BalanceToken1() int64 { return p.balances.token1 }
71
72 // TickSpacing returns the permitted spacing between initialized ticks.
73 //
74 // Returns:
75 // - int32: tick spacing configured for the pool.
76 func (p *Pool) TickSpacing() int32 { return p.tickSpacing }
77
78 // Slot0 returns the pool's current price, tick, lock, and oracle cursor state.
79 //
80 // Returns:
81 // - Slot0: current slot0 state, including the price and observation metadata.
82 func (p *Pool) Slot0() Slot0 { return p.slot0 }
83
84 // Slot0SqrtPriceX96 returns the current square-root price in Q96 fixed-point form.
85 //
86 // Returns:
87 // - *u256.Uint: stored sqrt(token1/token0) price scaled by 2^96.
88 func (p *Pool) Slot0SqrtPriceX96() *u256.Uint { return p.slot0.sqrtPriceX96 }
89
90 // Slot0Tick returns the current pool tick.
91 //
92 // Returns:
93 // - int32: tick corresponding to the current pool price.
94 func (p *Pool) Slot0Tick() int32 { return p.slot0.tick }
95
96 // Slot0FeeProtocol returns the packed protocol-fee denominators from slot0.
97 //
98 // Returns:
99 // - uint8: packed token0/token1 protocol-fee denominator configuration.
100 func (p *Pool) Slot0FeeProtocol() uint8 { return p.slot0.feeProtocol }
101
102 // Slot0Unlocked reports whether the pool is currently available for reentrant operations.
103 //
104 // Returns:
105 // - bool: true when the pool is unlocked; false while its swap lock is held.
106 func (p *Pool) Slot0Unlocked() bool { return p.slot0.unlocked }
107
108 // FeeGrowthGlobal0X128 returns cumulative token0 fee growth per unit of liquidity.
109 //
110 // Returns:
111 // - *u256.Uint: token0 fee-growth accumulator scaled by 2^128.
112 func (p *Pool) FeeGrowthGlobal0X128() *u256.Uint { return p.feeGrowthGlobal0X128 }
113
114 // FeeGrowthGlobal1X128 returns cumulative token1 fee growth per unit of liquidity.
115 //
116 // Returns:
117 // - *u256.Uint: token1 fee-growth accumulator scaled by 2^128.
118 func (p *Pool) FeeGrowthGlobal1X128() *u256.Uint { return p.feeGrowthGlobal1X128 }
119
120 // ProtocolFees returns protocol fees accrued in both pool tokens.
121 //
122 // Returns:
123 // - TokenPair: token0 and token1 protocol-fee balances.
124 func (p *Pool) ProtocolFees() TokenPair { return p.protocolFees }
125
126 // ProtocolFeesToken0 returns protocol fees accrued in token0.
127 //
128 // Returns:
129 // - int64: token0 amount reserved as protocol fees.
130 func (p *Pool) ProtocolFeesToken0() int64 { return p.protocolFees.token0 }
131
132 // ProtocolFeesToken1 returns protocol fees accrued in token1.
133 //
134 // Returns:
135 // - int64: token1 amount reserved as protocol fees.
136 func (p *Pool) ProtocolFeesToken1() int64 { return p.protocolFees.token1 }
137
138 // Liquidity returns the pool's active liquidity for the current tick range.
139 //
140 // Returns:
141 // - *u256.Uint: active liquidity amount.
142 func (p *Pool) Liquidity() *u256.Uint { return p.liquidity }
143
144 // Ticks returns the tree containing tick state keyed by encoded tick.
145 //
146 // Returns:
147 // - *bptree.BPTree: pool tick storage tree.
148 func (p *Pool) Ticks() *bptree.BPTree { return p.ticks }
149
150 // TickBitmaps returns the map of initialized-tick bitmap words.
151 //
152 // Returns:
153 // - map[int16]string: bitmap words keyed by signed word position.
154 func (p *Pool) TickBitmaps() map [ int16 ] string { return p.tickBitmaps }
155
156 // Positions returns the tree containing aggregate position state by range key.
157 //
158 // Returns:
159 // - *bptree.BPTree: pool position storage tree.
160 func (p *Pool) Positions() *bptree.BPTree { return p.positions }
161
162 // GetPosition returns the position information for key.
163 //
164 // Parameters:
165 // - key: encoded lower/upper tick-range key to look up.
166 //
167 // Returns:
168 // - PositionInfo: stored aggregate position for the key.
169 // - error: non-nil when the key is absent or contains a value of the wrong type.
170 func (p *Pool) GetPosition(key string ) (PositionInfo, error ) {
171 iPositionInfo := p.positions.Get(key)
172 if iPositionInfo == nil {
173 return PositionInfo{}, ufmt.Errorf( "position %s not found" , key)
174 }
175
176 positionInfo, ok := iPositionInfo.(PositionInfo)
177 if !ok {
178 return PositionInfo{}, ufmt.Errorf( "position %s has invalid type" , key)
179 }
180
181 return positionInfo, nil
182 }
183
184 // Pool Setters methods
185 // SetToken0Path stores the path of the pool's token0 asset.
186 //
187 // Parameters:
188 // - token0Path: token0 asset path to store.
189 func (p *Pool) SetToken0Path(token0Path string ) {
190 p.token0Path = token0Path
191 }
192
193 // SetToken1Path stores the path of the pool's token1 asset.
194 //
195 // Parameters:
196 // - token1Path: token1 asset path to store.
197 func (p *Pool) SetToken1Path(token1Path string ) {
198 p.token1Path = token1Path
199 }
200
201 // SetFee stores the pool's fee tier.
202 //
203 // Parameters:
204 // - fee: fee tier to use for swaps in this pool.
205 func (p *Pool) SetFee(fee uint32 ) {
206 p.fee = fee
207 }
208
209 // SetBalances replaces the pool's tracked balances for both tokens.
210 //
211 // Parameters:
212 // - balances: token0 and token1 balances to store.
213 func (p *Pool) SetBalances(balances TokenPair) {
214 p.balances = balances
215 }
216
217 // SetBalanceToken0 updates the pool's tracked token0 balance.
218 //
219 // Parameters:
220 // - token0: new token0 balance.
221 func (p *Pool) SetBalanceToken0(token0 int64 ) {
222 p.balances.token0 = token0
223 }
224
225 // SetBalanceToken1 updates the pool's tracked token1 balance.
226 //
227 // Parameters:
228 // - token1: new token1 balance.
229 func (p *Pool) SetBalanceToken1(token1 int64 ) {
230 p.balances.token1 = token1
231 }
232
233 // SetTickSpacing stores the permitted spacing between initialized ticks.
234 //
235 // Parameters:
236 // - tickSpacing: tick spacing to configure for the pool.
237 func (p *Pool) SetTickSpacing(tickSpacing int32 ) {
238 p.tickSpacing = tickSpacing
239 }
240
241 // SetSlot0 replaces the pool's current price, tick, lock, and oracle cursor state.
242 //
243 // Parameters:
244 // - slot0: slot0 state to store.
245 func (p *Pool) SetSlot0(slot0 Slot0) {
246 p.slot0 = slot0
247 }
248
249 // SetFeeGrowthGlobal0X128 stores the token0 fee-growth accumulator.
250 //
251 // Parameters:
252 // - feeGrowthGlobal0X128: token0 fee growth per liquidity unit, scaled by 2^128.
253 func (p *Pool) SetFeeGrowthGlobal0X128(feeGrowthGlobal0X128 *u256.Uint) {
254 p.feeGrowthGlobal0X128 = u256.Zero().Set(feeGrowthGlobal0X128)
255 }
256
257 // SetFeeGrowthGlobal1X128 stores the token1 fee-growth accumulator.
258 //
259 // Parameters:
260 // - feeGrowthGlobal1X128: token1 fee growth per liquidity unit, scaled by 2^128.
261 func (p *Pool) SetFeeGrowthGlobal1X128(feeGrowthGlobal1X128 *u256.Uint) {
262 p.feeGrowthGlobal1X128 = u256.Zero().Set(feeGrowthGlobal1X128)
263 }
264
265 // SetProtocolFees replaces the pool's accrued protocol fees for both tokens.
266 //
267 // Parameters:
268 // - protocolFees: token0 and token1 protocol-fee balances to store.
269 func (p *Pool) SetProtocolFees(protocolFees TokenPair) {
270 p.protocolFees = protocolFees
271 }
272
273 // SetProtocolFeesToken0 updates the pool's accrued token0 protocol fees.
274 //
275 // Parameters:
276 // - token0: new token0 protocol-fee balance.
277 func (p *Pool) SetProtocolFeesToken0(token0 int64 ) {
278 p.protocolFees.token0 = token0
279 }
280
281 // SetProtocolFeesToken1 updates the pool's accrued token1 protocol fees.
282 //
283 // Parameters:
284 // - token1: new token1 protocol-fee balance.
285 func (p *Pool) SetProtocolFeesToken1(token1 int64 ) {
286 p.protocolFees.token1 = token1
287 }
288
289 // SetLiquidity stores the pool's active liquidity for the current tick range.
290 //
291 // Parameters:
292 // - liquidity: active liquidity amount to store.
293 func (p *Pool) SetLiquidity(liquidity *u256.Uint) {
294 p.liquidity = u256.Zero().Set(liquidity)
295 }
296
297 // SetTicks replaces the tree containing pool tick state.
298 //
299 // Parameters:
300 // - ticks: tick storage tree to use.
301 func (p *Pool) SetTicks(ticks *bptree.BPTree) {
302 p.ticks = ticks
303 }
304
305 // SetTickBitmap stores one initialized-tick bitmap word.
306 //
307 // Parameters:
308 // - wordPos: signed bitmap word position.
309 // - tickBitmap: encoded bitmap bits for that word.
310 func (p *Pool) SetTickBitmap(wordPos int16 , tickBitmap string ) {
311 p.tickBitmaps[wordPos] = tickBitmap
312 }
313
314 // DeleteTickBitmap deletes the tick bitmap for the given word position.
315 //
316 // Parameters:
317 // - wordPos: signed bitmap word position to remove.
318 func (p *Pool) DeleteTickBitmap(wordPos int16 ) {
319 delete(p.tickBitmaps, wordPos)
320 }
321
322 // SetTickBitmaps replaces the map of initialized-tick bitmap words.
323 //
324 // Parameters:
325 // - tickBitmaps: bitmap words keyed by signed word position.
326 func (p *Pool) SetTickBitmaps(tickBitmaps map [ int16 ] string ) {
327 p.tickBitmaps = tickBitmaps
328 }
329
330 // SetPositions replaces the tree containing aggregate position state.
331 //
332 // Parameters:
333 // - positions: position storage tree to use.
334 func (p *Pool) SetPositions(positions *bptree.BPTree) {
335 p.positions = positions
336 }
337
338 // SetPosition stores position information under an encoded range key.
339 //
340 // Parameters:
341 // - posKey: encoded lower/upper tick-range key.
342 // - positionInfo: aggregate position state to store.
343 func (p *Pool) SetPosition(posKey string , positionInfo PositionInfo) {
344 p.positions.Set(posKey, positionInfo)
345 }
346
347 // HasTick reports whether a tick entry exists in the pool's tick tree.
348 //
349 // Parameters:
350 // - tick: tick index to check.
351 //
352 // Returns:
353 // - bool: true when the encoded tick is present; false otherwise.
354 func (p *Pool) HasTick(tick int32 ) bool {
355 tickKey := EncodeTickKey(tick)
356 return p.ticks.Has(tickKey)
357 }
358
359 // GetTick returns the state stored for a tick.
360 //
361 // Parameters:
362 // - tick: tick index to look up.
363 //
364 // Returns:
365 // - TickInfo: stored tick state.
366 // - error: non-nil when the tick is absent; a present value of the wrong type causes a panic.
367 func (p *Pool) GetTick(tick int32 ) (TickInfo, error ) {
368 tickKey := EncodeTickKey(tick)
369
370 iTickInfo := p.ticks.Get(tickKey)
371 if iTickInfo == nil {
372 return TickInfo{}, ufmt.Errorf( "tick %d not found" , tick)
373 }
374
375 tickInfo, ok := iTickInfo.(TickInfo)
376 if !ok {
377 panic(ufmt.Sprintf( "failed to cast tickInfo to TickInfo: %T" , iTickInfo))
378 }
379
380 return tickInfo, nil
381 }
382
383 // SetTick stores tick state under its encoded tick key.
384 //
385 // Parameters:
386 // - tick: tick index to store.
387 // - tickInfo: tick state associated with the index.
388 func (p *Pool) SetTick(tick int32 , tickInfo TickInfo) {
389 tickKey := EncodeTickKey(tick)
390 p.ticks.Set(tickKey, tickInfo)
391 }
392
393 // DeleteTick removes the tick state for the given tick index.
394 //
395 // Parameters:
396 // - tick: tick index to remove.
397 func (p *Pool) DeleteTick(tick int32 ) {
398 tickKey := EncodeTickKey(tick)
399 p.ticks.Remove(tickKey)
400 }
401
402 // IterateTicks visits pool ticks in the inclusive range [startTick, endTick].
403 // Iteration stops when the callback returns true.
404 //
405 // Parameters:
406 // - startTick: first tick index in the inclusive range.
407 // - endTick: last tick index in the inclusive range.
408 // - fn: callback receiving each decoded tick and its state; return true to stop iteration.
409 func (p *Pool) IterateTicks(startTick int32 , endTick int32 , fn func (tick int32 , tickInfo TickInfo) bool ) {
410 startTickKey := EncodeTickKey(startTick)
411 endTickKey := EncodeTickKey(endTick + 1 ) // endTick inclusive
412
413 p.ticks.Iterate(startTickKey, endTickKey, func (key string , value any ) bool {
414 tick := DecodeTickKey(key)
415
416 tickInfo, ok := value.(TickInfo)
417 if !ok {
418 return false
419 }
420
421 return fn(tick, tickInfo)
422 })
423 }
424
425 // Clone copies a pool's own fields and leaves its collections nil: ticks,
426 // tickBitmaps, and positions are not copied. Oracle observations are stored
427 // separately from Pool.
428 //
429 // The copy is shallow because the read-only pool view clones every entry a
430 // caller reads, so copying the collections would walk the whole tick tree for
431 // each entry on a page. Read them through their own lookups instead:
432 // GetTickInfo / GetInitializedTicksInRange for ticks, GetTickBitmaps for the
433 // bitmaps, GetPoolPositions for positions, and GetSlot0 / GetObservationAt for
434 // oracle metadata and entries. A caller that needs a working copy of a
435 // collection -- DrySwap is the only one -- assembles it from those getters.
436 //
437 // Returns:
438 // - *Pool: shallow pool copy with scalar state and cloned numeric values; nil when the receiver is nil.
439 func (p *Pool) Clone() *Pool {
440 if p == nil {
441 return nil
442 }
443
444 return &Pool{
445 token0Path: p.token0Path,
446 token1Path: p.token1Path,
447 fee: p.fee,
448 tickSpacing: p.tickSpacing,
449 slot0: p.slot0.Clone(),
450 balances: p.balances,
451 protocolFees: p.protocolFees,
452 feeGrowthGlobal0X128: p.feeGrowthGlobal0X128.Clone(),
453 feeGrowthGlobal1X128: p.feeGrowthGlobal1X128.Clone(),
454 liquidity: p.liquidity.Clone(),
455 ticks: nil ,
456 tickBitmaps: nil ,
457 positions: nil ,
458 }
459 }
460
461 // NewPool constructs a pool with the supplied token pair, fee, price, and tick configuration.
462 //
463 // Parameters:
464 // - token0Path: path of the pool's token0 asset.
465 // - token1Path: path of the pool's token1 asset.
466 // - fee: fee tier used by swaps.
467 // - sqrtPriceX96: initial sqrt(token1/token0) price scaled by 2^96.
468 // - tickSpacing: spacing between initialized ticks.
469 // - tick: initial current tick.
470 // - slot0FeeProtocol: packed protocol-fee denominator configuration for slot0.
471 //
472 // Returns:
473 // - *Pool: initialized pool with empty balances, fee growth, ticks, bitmaps, and positions.
474 func NewPool(
475 token0Path string ,
476 token1Path string ,
477 fee uint32 ,
478 sqrtPriceX96 *u256.Uint,
479 tickSpacing int32 ,
480 tick int32 ,
481 slot0FeeProtocol uint8 ,
482 ) *Pool {
483 slot0 := NewSlot0(sqrtPriceX96, tick, slot0FeeProtocol, true )
484
485 return &Pool{
486 token0Path: token0Path,
487 token1Path: token1Path,
488 balances: NewTokenPair(),
489 fee: fee,
490 tickSpacing: tickSpacing,
491 slot0: slot0,
492 feeGrowthGlobal0X128: u256.Zero(),
493 feeGrowthGlobal1X128: u256.Zero(),
494 protocolFees: NewTokenPair(),
495 liquidity: u256.Zero(),
496 ticks: bptree.NewBPTreeN( 32 ),
497 tickBitmaps: make( map [ int16 ] string ),
498 positions: bptree.NewBPTreeN( 16 ),
499 }
500 }
501
502 // NewPoolsTree creates the BPTree used to store pools by pool path.
503 //
504 // Returns:
505 // - *bptree.BPTree: empty pool storage tree with fanout 32.
506 func NewPoolsTree() *bptree.BPTree {
507 return bptree.NewBPTreeN( 32 )
508 }
509
510 // NewPoolTicksTree creates a BPTree for storing pool tick info (fanout 32),
511 // owned by the pool domain realm so leaf-slot writes are not readonly tainted.
512 //
513 // Returns:
514 // - *bptree.BPTree: empty tick storage tree with fanout 32.
515 func NewPoolTicksTree() *bptree.BPTree {
516 return bptree.NewBPTreeN( 32 )
517 }
518
519 // NewPoolPositionsTree creates a BPTree for storing pool position info (fanout 16),
520 // owned by the pool domain realm so leaf-slot writes are not readonly tainted.
521 //
522 // Returns:
523 // - *bptree.BPTree: empty position storage tree with fanout 16.
524 func NewPoolPositionsTree() *bptree.BPTree {
525 return bptree.NewBPTreeN( 16 )
526 }
527
528 type TokenPair struct {
529 token0, token1 int64
530 }
531
532 // NewTokenPair creates a token-pair balance value initialized to zero.
533 //
534 // Returns:
535 // - TokenPair: zero token0 and token1 balances.
536 func NewTokenPair() TokenPair {
537 return TokenPair{
538 token0: 0 ,
539 token1: 0 ,
540 }
541 }
542
543 // Token0 returns the token0 amount in the pair.
544 //
545 // Returns:
546 // - int64: stored token0 amount.
547 func (p *TokenPair) Token0() int64 { return p.token0 }
548
549 // Token1 returns the token1 amount in the pair.
550 //
551 // Returns:
552 // - int64: stored token1 amount.
553 func (p *TokenPair) Token1() int64 { return p.token1 }
554
555 // SetToken0 updates the token0 amount in the pair.
556 //
557 // Parameters:
558 // - token0: token0 amount to store.
559 func (p *TokenPair) SetToken0(token0 int64 ) { p.token0 = token0 }
560
561 // SetToken1 updates the token1 amount in the pair.
562 //
563 // Parameters:
564 // - token1: token1 amount to store.
565 func (p *TokenPair) SetToken1(token1 int64 ) { p.token1 = token1 }
566
567 // Slot0 mirrors Uniswap V3's slot0(): current price/tick/protocol-fee/lock
568 // state and the oracle cursor/capacity metadata.
569 type Slot0 struct {
570 sqrtPriceX96 *u256.Uint // current price of the pool as a sqrt(token1/token0) Q96 value
571 tick int32 // current tick of the pool, i.e according to the last tick transition that was run
572 feeProtocol uint8 // packed protocol-fee denominators: token0 low nibble, token1 high nibble
573 unlocked bool // whether the pool is currently locked to reentrancy
574 observationIndex uint16 // the index of the most-recently written observation
575 observationCardinality uint16 // the current maximum number of observations stored
576 observationCardinalityNext uint16 // the next maximum number of observations to store
577 }
578
579 // SqrtPriceX96 returns a copy of the current sqrt price in Q96 fixed-point form.
580 //
581 // Returns:
582 // - *u256.Uint: cloned sqrt(token1/token0) price scaled by 2^96.
583 func (s *Slot0) SqrtPriceX96() *u256.Uint { return s.sqrtPriceX96.Clone() }
584
585 // Tick returns the current pool tick recorded in slot0.
586 //
587 // Returns:
588 // - int32: current tick.
589 func (s *Slot0) Tick() int32 { return s.tick }
590
591 // FeeProtocol returns the packed protocol-fee denominators in slot0.
592 //
593 // Returns:
594 // - uint8: packed token0/token1 protocol-fee denominator configuration.
595 func (s *Slot0) FeeProtocol() uint8 { return s.feeProtocol }
596
597 // Unlocked reports whether the pool's reentrancy lock is open.
598 //
599 // Returns:
600 // - bool: true when unlocked and false while the pool is locked.
601 func (s *Slot0) Unlocked() bool { return s.unlocked }
602
603 // ObservationIndex returns the index of the most recently written observation.
604 //
605 // Returns:
606 // - uint16: current observation ring-buffer index.
607 func (s *Slot0) ObservationIndex() uint16 { return s.observationIndex }
608
609 // ObservationCardinality returns the number of observation slots currently available.
610 //
611 // Returns:
612 // - uint16: current observation capacity.
613 func (s *Slot0) ObservationCardinality() uint16 { return s.observationCardinality }
614
615 // ObservationCardinalityNext returns the requested future observation capacity.
616 //
617 // Returns:
618 // - uint16: next observation capacity to use when the ring grows.
619 func (s *Slot0) ObservationCardinalityNext() uint16 { return s.observationCardinalityNext }
620
621 // Clone returns a value-type copy of Slot0 that shares no mutable state with
622 // the original, so callers cannot reach back into pool internals through the
623 // returned sqrtPriceX96 pointer.
624 //
625 // Returns:
626 // - Slot0: value copy with a cloned sqrt-price pointer.
627 func (s *Slot0) Clone() Slot0 {
628 return Slot0{
629 sqrtPriceX96: s.sqrtPriceX96.Clone(),
630 tick: s.tick,
631 feeProtocol: s.feeProtocol,
632 unlocked: s.unlocked,
633 observationIndex: s.observationIndex,
634 observationCardinality: s.observationCardinality,
635 observationCardinalityNext: s.observationCardinalityNext,
636 }
637 }
638
639 // SetSqrtPriceX96 updates the slot0 sqrt price.
640 //
641 // Parameters:
642 // - sqrtPriceX96: sqrt(token1/token0) price scaled by 2^96; it is cloned before storage.
643 func (s *Slot0) SetSqrtPriceX96(sqrtPriceX96 *u256.Uint) { s.sqrtPriceX96 = sqrtPriceX96.Clone() }
644
645 // SetTick updates the current slot0 tick.
646 //
647 // Parameters:
648 // - tick: current pool tick to store.
649 func (s *Slot0) SetTick(tick int32 ) { s.tick = tick }
650
651 // SetFeeProtocol updates the packed slot0 protocol-fee denominators.
652 //
653 // Parameters:
654 // - feeProtocol: packed token0/token1 protocol-fee denominator configuration.
655 func (s *Slot0) SetFeeProtocol(feeProtocol uint8 ) { s.feeProtocol = feeProtocol }
656
657 // SetUnlocked updates the slot0 reentrancy-lock state.
658 //
659 // Parameters:
660 // - unlocked: true to mark the pool unlocked, false to mark it locked.
661 func (s *Slot0) SetUnlocked(unlocked bool ) { s.unlocked = unlocked }
662
663 // SetObservationIndex updates the index of the most recently written observation.
664 //
665 // Parameters:
666 // - observationIndex: observation ring-buffer index to store.
667 func (s *Slot0) SetObservationIndex(observationIndex uint16 ) {
668 s.observationIndex = observationIndex
669 }
670
671 // SetObservationCardinality updates the current observation capacity.
672 //
673 // Parameters:
674 // - observationCardinality: current number of observation slots available.
675 func (s *Slot0) SetObservationCardinality(observationCardinality uint16 ) {
676 s.observationCardinality = observationCardinality
677 }
678
679 // SetObservationCardinalityNext updates the requested future observation capacity.
680 //
681 // Parameters:
682 // - observationCardinalityNext: next capacity to use when the ring grows.
683 func (s *Slot0) SetObservationCardinalityNext(observationCardinalityNext uint16 ) {
684 s.observationCardinalityNext = observationCardinalityNext
685 }
686
687 // NewSlot0 constructs slot0 with the supplied price, tick, protocol fee, and lock state.
688 // Observation metadata starts with index zero and cardinality one.
689 //
690 // Parameters:
691 // - sqrtPriceX96: initial sqrt(token1/token0) price scaled by 2^96.
692 // - tick: initial current pool tick.
693 // - feeProtocol: packed token0/token1 protocol-fee denominator configuration.
694 // - unlocked: initial reentrancy-lock state.
695 //
696 // Returns:
697 // - Slot0: initialized slot0 value with one observation slot.
698 func NewSlot0(
699 sqrtPriceX96 *u256.Uint,
700 tick int32 ,
701 feeProtocol uint8 ,
702 unlocked bool ,
703 ) Slot0 {
704 return Slot0{
705 sqrtPriceX96: sqrtPriceX96.Clone(),
706 tick: tick,
707 feeProtocol: feeProtocol,
708 unlocked: unlocked,
709 observationIndex: 0 ,
710 observationCardinality: 1 ,
711 observationCardinalityNext: 1 ,
712 }
713 }
714
715 // TickInfo stores information about a specific tick in the pool.
716 // TIcks represent discrete price points that can be used as boundaries for positions.
717 type TickInfo struct {
718 liquidityGross string // total position liquidity that references this tick
719 liquidityNet string // amount of net liquidity added (subtracted) when tick is crossed from left to right (right to left)
720
721 // fee growth per unit of liquidity on the _other_ side of this tick (relative to the current tick)
722 // only has relative meaning, not absolute — the value depends on when the tick is initialized
723 feeGrowthOutside0X128 string
724 feeGrowthOutside1X128 string
725
726 tickCumulativeOutside int64 // cumulative tick value on the other side of the tick
727
728 // the seconds per unit of liquidity on the _other_ side of this tick (relative to the current tick)
729 // only has relative meaning, not absolute — the value depends on when the tick is initialized
730 secondsPerLiquidityOutsideX128 string
731
732 // the seconds spent on the other side of the tick (relative to the current tick)
733 // only has relative meaning, not absolute — the value depends on when the tick is initialized
734 secondsOutside uint32
735
736 initialized bool // whether the tick is initialized
737 }
738
739 // TickInfo Getters methods
740 // LiquidityGross returns total position liquidity referencing this tick.
741 //
742 // Returns:
743 // - string: gross liquidity encoded as a decimal string.
744 func (t *TickInfo) LiquidityGross() string { return t.liquidityGross }
745
746 // LiquidityNet returns net liquidity applied when this tick is crossed.
747 //
748 // Returns:
749 // - string: signed net liquidity encoded as a decimal string.
750 func (t *TickInfo) LiquidityNet() string { return t.liquidityNet }
751
752 // FeeGrowthOutside0X128 returns token0 fee growth on the side of this tick opposite the current tick.
753 //
754 // Returns:
755 // - string: token0 outside fee-growth accumulator scaled by 2^128.
756 func (t *TickInfo) FeeGrowthOutside0X128() string { return t.feeGrowthOutside0X128 }
757
758 // FeeGrowthOutside1X128 returns token1 fee growth on the side of this tick opposite the current tick.
759 //
760 // Returns:
761 // - string: token1 outside fee-growth accumulator scaled by 2^128.
762 func (t *TickInfo) FeeGrowthOutside1X128() string { return t.feeGrowthOutside1X128 }
763
764 // SecondsPerLiquidityOutsideX128 returns seconds per liquidity outside this tick.
765 //
766 // Returns:
767 // - string: outside seconds-per-liquidity accumulator scaled by 2^128.
768 func (t *TickInfo) SecondsPerLiquidityOutsideX128() string {
769 return t.secondsPerLiquidityOutsideX128
770 }
771
772 // SecondsOutside returns the time spent on the side of this tick opposite the current tick.
773 //
774 // Returns:
775 // - uint32: seconds accumulated outside the tick.
776 func (t *TickInfo) SecondsOutside() uint32 { return t.secondsOutside }
777
778 // Initialized reports whether this tick has active initialized state.
779 //
780 // Returns:
781 // - bool: true when the tick is initialized; false otherwise.
782 func (t *TickInfo) Initialized() bool { return t.initialized }
783
784 // TickCumulativeOutside returns cumulative tick value on the side opposite the current tick.
785 //
786 // Returns:
787 // - int64: outside cumulative tick value.
788 func (t *TickInfo) TickCumulativeOutside() int64 { return t.tickCumulativeOutside }
789
790 // TickInfo Setters methods
791 // SetLiquidityGross stores total position liquidity referencing this tick.
792 //
793 // Parameters:
794 // - liquidityGross: gross liquidity encoded as a decimal string.
795 func (t *TickInfo) SetLiquidityGross(liquidityGross string ) {
796 t.liquidityGross = liquidityGross
797 }
798
799 // SetLiquidityNet stores the net liquidity change applied when crossing this tick.
800 //
801 // Parameters:
802 // - liquidityNet: signed net liquidity encoded as a decimal string.
803 func (t *TickInfo) SetLiquidityNet(liquidityNet string ) {
804 t.liquidityNet = liquidityNet
805 }
806
807 // SetFeeGrowthOutside0X128 stores token0 outside fee growth for this tick.
808 //
809 // Parameters:
810 // - feeGrowthOutside0X128: token0 outside fee growth scaled by 2^128, encoded as a decimal string.
811 func (t *TickInfo) SetFeeGrowthOutside0X128(feeGrowthOutside0X128 string ) {
812 t.feeGrowthOutside0X128 = feeGrowthOutside0X128
813 }
814
815 // SetFeeGrowthOutside1X128 stores token1 outside fee growth for this tick.
816 //
817 // Parameters:
818 // - feeGrowthOutside1X128: token1 outside fee growth scaled by 2^128, encoded as a decimal string.
819 func (t *TickInfo) SetFeeGrowthOutside1X128(feeGrowthOutside1X128 string ) {
820 t.feeGrowthOutside1X128 = feeGrowthOutside1X128
821 }
822
823 // SetSecondsPerLiquidityOutsideX128 stores outside seconds-per-liquidity growth.
824 //
825 // Parameters:
826 // - secondsPerLiquidityOutsideX128: outside seconds per liquidity scaled by 2^128, encoded as a decimal string.
827 func (t *TickInfo) SetSecondsPerLiquidityOutsideX128(secondsPerLiquidityOutsideX128 string ) {
828 t.secondsPerLiquidityOutsideX128 = secondsPerLiquidityOutsideX128
829 }
830
831 // SetSecondsOutside stores the seconds accumulated outside this tick.
832 //
833 // Parameters:
834 // - secondsOutside: elapsed seconds outside the tick.
835 func (t *TickInfo) SetSecondsOutside(secondsOutside uint32 ) {
836 t.secondsOutside = secondsOutside
837 }
838
839 // SetInitialized updates whether this tick is initialized.
840 //
841 // Parameters:
842 // - initialized: true to mark the tick initialized, false otherwise.
843 func (t *TickInfo) SetInitialized(initialized bool ) {
844 t.initialized = initialized
845 }
846
847 // SetTickCumulativeOutside stores cumulative tick value outside this tick.
848 //
849 // Parameters:
850 // - tickCumulativeOutside: cumulative tick value on the opposite side.
851 func (t *TickInfo) SetTickCumulativeOutside(tickCumulativeOutside int64 ) {
852 t.tickCumulativeOutside = tickCumulativeOutside
853 }
854
855 // Clone returns an independent value copy of this tick's stored state.
856 //
857 // Returns:
858 // - TickInfo: copied liquidity, fee-growth, time, and initialization fields.
859 func (t *TickInfo) Clone() TickInfo {
860 return TickInfo{
861 feeGrowthOutside0X128: t.feeGrowthOutside0X128,
862 feeGrowthOutside1X128: t.feeGrowthOutside1X128,
863 liquidityGross: t.liquidityGross,
864 liquidityNet: t.liquidityNet,
865 tickCumulativeOutside: t.tickCumulativeOutside,
866 secondsPerLiquidityOutsideX128: t.secondsPerLiquidityOutsideX128,
867 secondsOutside: t.secondsOutside,
868 initialized: t.initialized,
869 }
870 }
871
872 // NewTickInfo creates an uninitialized tick state with zero accumulators.
873 //
874 // Returns:
875 // - TickInfo: default tick state with all numeric fields zero and Initialized false.
876 func NewTickInfo() TickInfo {
877 return TickInfo{
878 liquidityGross: "0" ,
879 liquidityNet: "0" ,
880 feeGrowthOutside0X128: "0" ,
881 feeGrowthOutside1X128: "0" ,
882 secondsPerLiquidityOutsideX128: "0" ,
883 secondsOutside: 0 ,
884 initialized: false ,
885 tickCumulativeOutside: 0 ,
886 }
887 }
888
889 // PositionInfo stores aggregate liquidity, fee-growth checkpoints, and tokens
890 // owed for one pool-scoped lower/upper tick key.
891 type PositionInfo struct {
892 liquidity string // aggregate liquidity for this tick-range key
893 feeGrowthInside0LastX128 string // fee growth per unit of liquidity for token0 as of last update
894 feeGrowthInside1LastX128 string // fee growth per unit of liquidity for token1 as of last update
895
896 // accumulated token0 amount waiting to be collected (principal or swap fee)
897 tokensOwed0 int64
898
899 // accumulated token1 amount waiting to be collected (principal or swap fee)
900 tokensOwed1 int64
901 }
902
903 // Liquidity returns aggregate liquidity for this position range.
904 //
905 // Returns:
906 // - string: position liquidity encoded as a decimal string.
907 func (p *PositionInfo) Liquidity() string { return p.liquidity }
908
909 // FeeGrowthInside0LastX128 returns the token0 fee-growth checkpoint for this position.
910 //
911 // Returns:
912 // - string: token0 inside fee-growth checkpoint scaled by 2^128.
913 func (p *PositionInfo) FeeGrowthInside0LastX128() string { return p.feeGrowthInside0LastX128 }
914
915 // FeeGrowthInside1LastX128 returns the token1 fee-growth checkpoint for this position.
916 //
917 // Returns:
918 // - string: token1 inside fee-growth checkpoint scaled by 2^128.
919 func (p *PositionInfo) FeeGrowthInside1LastX128() string { return p.feeGrowthInside1LastX128 }
920
921 // TokensOwed0 returns token0 accumulated for this position.
922 //
923 // Returns:
924 // - int64: token0 principal or fee amount awaiting collection.
925 func (p *PositionInfo) TokensOwed0() int64 { return p.tokensOwed0 }
926
927 // TokensOwed1 returns token1 accumulated for this position.
928 //
929 // Returns:
930 // - int64: token1 principal or fee amount awaiting collection.
931 func (p *PositionInfo) TokensOwed1() int64 { return p.tokensOwed1 }
932
933 // SetLiquidity updates aggregate liquidity for this position range.
934 //
935 // Parameters:
936 // - liquidity: position liquidity encoded as a decimal string.
937 func (p *PositionInfo) SetLiquidity(liquidity string ) {
938 p.liquidity = liquidity
939 }
940
941 // SetFeeGrowthInside0LastX128 updates the token0 fee-growth checkpoint.
942 //
943 // Parameters:
944 // - feeGrowthInside0LastX128: token0 inside fee-growth checkpoint scaled by 2^128, encoded as a decimal string.
945 func (p *PositionInfo) SetFeeGrowthInside0LastX128(feeGrowthInside0LastX128 string ) {
946 p.feeGrowthInside0LastX128 = feeGrowthInside0LastX128
947 }
948
949 // SetFeeGrowthInside1LastX128 updates the token1 fee-growth checkpoint.
950 //
951 // Parameters:
952 // - feeGrowthInside1LastX128: token1 inside fee-growth checkpoint scaled by 2^128, encoded as a decimal string.
953 func (p *PositionInfo) SetFeeGrowthInside1LastX128(feeGrowthInside1LastX128 string ) {
954 p.feeGrowthInside1LastX128 = feeGrowthInside1LastX128
955 }
956
957 // SetTokensOwed0 updates token0 accumulated for this position.
958 //
959 // Parameters:
960 // - tokensOwed0: token0 principal or fee amount awaiting collection.
961 func (p *PositionInfo) SetTokensOwed0(tokensOwed0 int64 ) {
962 p.tokensOwed0 = tokensOwed0
963 }
964
965 // SetTokensOwed1 updates token1 accumulated for this position.
966 //
967 // Parameters:
968 // - tokensOwed1: token1 principal or fee amount awaiting collection.
969 func (p *PositionInfo) SetTokensOwed1(tokensOwed1 int64 ) {
970 p.tokensOwed1 = tokensOwed1
971 }
972
973 // NewPositionInfo creates a zeroed position state for a tick range.
974 //
975 // Returns:
976 // - PositionInfo: position with zero liquidity, fee-growth checkpoints, and owed tokens.
977 func NewPositionInfo() PositionInfo {
978 return PositionInfo{
979 liquidity: "0" ,
980 feeGrowthInside0LastX128: "0" ,
981 feeGrowthInside1LastX128: "0" ,
982 tokensOwed0: 0 ,
983 tokensOwed1: 0 ,
984 }
985 }
986
987 // NewDefaultFeeAmountTickSpacing returns the default tick spacing for each supported fee tier.
988 //
989 // Returns:
990 // - map[uint32]int32: fee-tier to tick-spacing mapping for 100, 500, 3000, and 10000 tiers.
991 func NewDefaultFeeAmountTickSpacing() map [ uint32 ] int32 {
992 return map [ uint32 ] int32 {
993 100 : 1 ,
994 500 : 10 ,
995 3000 : 60 ,
996 10000 : 200 ,
997 }
998 }
999
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.